I Need to Try Firefox
I was looking over the traffic profile for the last week on this site and was surprised at the share of traffic that Firefox had.
- Firefox - 55.4%
- Mozilla Compatible Agent - 10.99%
- IE (what I have been using) - 8.7%
- Safari - 7.18%
- Opera - 3.18%
- Mozilla - 3.16%
- Everything else was bots and various rss readers
I had tried Firefox a few years ago and I didn’t really see any benefit but it clearly has the dominant market share of people who went to the effort of at least visiting my blog so it must be worth looking at again. Within the Firefox category: 3.0 had about 30% share, 1.5.x had ~1%, and 2.0.0.x had the rest of the share.
Do you really need to know C? I think so.
I’ve been following the podcasts that Jeff Atwood and Joel Spolsky have been doing for StackOverflow. The podcasts are not really technical in nature, in fact they really do not have anything to do with what will ultimately be the purpose of the site they are building. They are more documenting the discussions and decisions they are making while creating the site.
I’ve only been through the first few so far, but an interesting discussion has come up in both podcasts about whether or not programmers should know the C programming language. Jeff does not know C and seems to come down on the side of the argument that this knowledge is not necessary. Jeff hasn’t specifically said this out loud, that I’ve heard, but I gather this is his opinion based on how the conversation seems to flow. Joel, on the other hand, is of the opinion that programmers should have knowledge of the lower levels of programming even though it is not part of their daily job. His thinking on this is that the lower level knowledge gives programmers an edge even when programming with the higher level popular programming languages of today.
I have to agree with Joel on this. In my experience working with programmers in both categories, those who have a background of knowledge of the lower level programming languages always seem to be quicker at solving more complicated problems. Of course, there are exceptions to this rule but I would say 98% of the time this is true.
It is interesting also that when this topic comes up with colleagues, it is almost split right down the line in opinion with those who do not know C believing it is not necessary and those who do have experience with C believing this sort of experience and knowledge makes them a much better developer.
One good example supporting my argument (actually Joel’s argument) is garbage collection related issues. I’ve seen programmers spend a huge amount of time attempting to understand why the runtime memory size of their program is continuing to grow when, in their minds, the garbage collector should be coming to the rescue. Of course, the problem is usually that they somehow have a reachable reference to a huge collection of objects or something of this nature (usually several in fact). Programmers with the lower level knowledge seem to pick up on these sorts of problems much quicker.
Another area I have seen many issues with is threading. Languages like C# and Java make threading a reachable concept for the programming masses. This is a good thing unless you do not understand the underlying concepts of threading. I cannot begin to calculate how many conversations I have had with programmers concerning the thread safety of their methods. I also cannot count the number of blank stares I have received when I ask about the concept of thread safety in interviews.
I know that most will say that I am bringing up edge case problems that are not normal in business programming. I am willing to concede that. However, I also agree with Joel’s approach in that I tend not to hire programmers that do not have this knowledge because it happens often enough to be a problem. There are exceptions, but those programmers are "exceptional".
Tags: softwarebusiness, stackoverflow
Heading to VSLive
Next week, I’ll be heading to VSLive. The pre-conference workshops actually begin Sunday, March 30, but I will be arriving a few days early for a short vacation with the family for Spring Break.
If you are going to be there and want to meet up, reply to this post or send me an email.
Also, if you are interested, I can give you a demo of the product I have been working on. It is called Reference Assistant and is a Visual Studio Add-In that helps resolve issues around project references and type information expressed in configuration files. Reference Assistant allows you to specify multiple sets of reference directories and dynamically switch between them, make sure that particular reference directories are always present for certain projects, add a reference directory to multiple projects at the same time, and helps resolve conflicts with different versions of assembly references. It also parses app.config section handler types and configuration files for the major Dependency Injection containers and helps to resolve those references. Reference Assistant supports its own method of extensibility allowing developers to add functionality that is not supported out of box. For instance, developers could add parsing for their own custom configuration file formats or support for a custom written plug-in discovery framework.
This is a brief description of the major features but there are many other smaller nice things as well. Reference Assistant is in closed beta currently but the public beta is coming very soon along with the launch of the website and much more information.
Even if you aren’t interested in a demo, we can get together and talk about .Net, Visual Studio, the sinking value of the US dollar, or whatever.
Hope to see you there!
Tags: visualstudio, vslive
Reasons to like NHibernate and ORM
Ayende Rahien, a contributor to NHibernate along with many other open source projects, has written up a post listing the features he likes about the ORM tool.
I am a fan of ORM and have used NHibernate extensively on a large project over the last few years. Prior to that, I had used TopLink and Hibernate on java projects.
Ayende’s listing pretty much summarizes why I like NHibernate and also has points that apply to many other ORM products as well:
- Caching. NHibernate is specifically flexible in this area but many ORM products excel in this area over sql based DAL implementations.
- Multi-database support. Using an ORM insulates your code from the differences in database dialects. This might sound insignificant, but if you have ever had to migrate any application from Oracle to SQLServer, for instance, you will know what a chore it can be.
- A dramatic reduction in plumbing code for your application. Although he does not directly say this in his list, he does mention writing applications with no sql in them. What I’ve noticed is that there is a ton of code that gets written in your application just to put data in your domain model and pull it back out. Using an ORM removes this code from your application and puts in the domain of the ORM, which is code someone else writes and tests.
Using an ORM seems to encounter a great deal of resistance from some enterprise developers. Below are a few of the reasons that are usually given against using an ORM product on a project:
- Even though you are not writing sql, you still have to perform the mapping.
- The sql generated by the ORM cannot be optimized for specific cases and will be slower.
- Using reflection is slow.
- Using an ORM makes the data access problems more difficult to debug.
- Everyone knows sql and nobody knows <ORM product>.
Even though are not writing sql, you still have to perform the mapping
This is a good point. It is true that the work of mapping data to columns in a database is moved from sql to the mapping layer of the ORM. In the case of NHibernate, this would be XML files. So in that instance, no work or time is saved. Where the time savings comes in to the picture is when the actual mappings are used. NHibernate takes those mapping files and performs the domain object instantiation and population for you.
Detractors of the ORM approach might counter with the argument that the usage of the ADO.net data constructs, for instance the typed dataset, also removes the need to write object population code. Although this might be true, I believe that passing ADO.net data types around your application leads to poor application architecture, not to mention performance problems. Typed datasets are notoriously slow when it comes to serialization.
The sql generated by the ORM cannot be optimized for specific cases and will be slower
This might be true for certain ORM products, but has not been my experience with NHibernate. The generated sql is quite good. However, I have encountered situations where the sql has been unacceptably slow and in those cases I can almost always place the blame on a poorly designed database model.
NHibernate has the ability to pass sql to the database, if needed. SQL optimizations can also be placed in the mapping files to help in situations where NHibernate could not generate the optimal queries. Named Query support, added to NHibernate 1.2, has helped as well for specific query situations that might not be the normal path for searching for a given object type.
Using reflection is slow
This is always an interesting discussion to have with a stubborn developer. Yes, it is true that a method invocation via reflection would be slower than a method invocation compiled into the IL directly. The tradeoff you are making is flexibility for a little speed. The reality of the situation is that the slowdown for reflection will be dwarfed by the IO wait for the database and you will not notice it.
NHibernate also has functionality called the reflection optimizer which will dynamically generate classes for populating your domain objects at startup time. This a tradeoff in startup time to remove the cost of reflection for each domain object population. Early versions of the reflection optimizer were noticeably slower at startup for larger numbers of mapped classes, but this has been corrected in the newer versions of NHibernate.
Performance problems in enterprise applications are caused by poor database design or poor approaches to data retrieval in 99% of cases. I should also lump screens that have too much data on them in with this category as well. The other 1% of the time the performance problems are caused by poorly written threaded code, poor algorithms, and poor integration choices with 3rd party applications. I have never encountered an enterprise application that was too slow because of reflection usage.
Using an ORM makes the data access problems more difficult to debug
I hear this complaint a lot at the beginning of projects specifically from developers that have never used ORM before. I would say that the real statement that should be made about the subject is:
Using an ORM makes the data access problems different to debug.
Most of time, a developer simply needs to familiarize themselves with the debugging facilities available in the ORM tool they are using. There is cost to learning what is available, just as there is a cost up front for learning any new tool or concept, but the productivity that ORM gives a project overall will make up for the learning curve.
Everyone knows sql and nobody knows <ORM product>
I also hear this complaint a lot at the beginning of project where I propose using ORM. It is difficult to convince someone that ORM will payoff after the learning curve is overcome when they have never used an ORM product. There are many blog posts on the web complaining that ORM does not pay off in the long run but this simply has not been my experience.
The response I usually give is to try the product for a pilot or proof of concept to test the pluses and minuses. Most clients are won over when they see the benefits of caching in the ORM and the ability to migrate databases with just minor mapping file changes (or maybe none). Also, when they actually try using NHibernate or another ORM product, they find that the product is not quite as unapproachable from a technical standpoint as they thought when they first heard of the concept.
Tags: nhibernate, orm, dotnet
Beautiful T1ness
This is my first post utilizing my freshly installed T1 line. It is everything I thought it could be.
The image above is from SpeakEasy. I also tried another site that uses a java applet and it reported upload speed about the same.
The whole process worked like this:
- I search google for T1 and my hometown, which got me a list of brokers. I filled out the online forms for a few and received pricing via email. I only looked at firms that would give me the pricing without speaking to me first.
- You can get service either with or without a router included. I wanted a router included because I know next to nothing about networking hardware, and they configure the whole thing for you if you get one through the provider. You can also get voice service included in the quote or data only. I went with data only and also with a full T1. I saw quotes for 1/2 and 1/3 T1 service.
- I chose Access2Go as my provider.
- They fax you paperwork to sign and fax back and then the scheduling process begins. It took about 1 month from when I signed the paperwork until I had a working line. I assume it took this long because I live in the middle of nowhere but maybe it always takes this long even if you are in the city.
- About once every week, Access2Go emailed me some configuration information and a status of what was going on. In the end, they give you the external ip address for the router, called the serial address, and a block of ip addresses that the router is pre-configured to route inside your network. The rest is information about the line itself and is only useful to you if something goes wrong. When you activate, they give you the addresses of the DNS servers and other information like that.
- The line is actually through Quest, although AT&T is responsible for putting the line in. Two days ago, the installer showed up and told me that I already had adequate lines run up to my house, which was nice because we have received quite a bit of rain so I was concerned about giant trench marks across my property. Normally, AT&T only runs the wire to the outside of the building and it is your responsibility to run it to where you need it. In my case, that was the closet in my office. Since I also no nothing about pulling wire, I was going to pay them to run wire to my closet but was pleasantly surprised when the installer told me the wire I need was already run to the closet. He put in a jack, did a bunch of testing and left. He also told me that some rather well off folks down the road have 2 T1 lines running to their house. One for data, and one for monitoring their wine cellar. Not sure why a high speed line is needed to monitor wine but I thought that was interesting.
- Later the same day that the installer was here, I received the T1 router which is a Cisco 1721 with WAN card, via UPS. I received no documentation with it so I registered with the Cisco website and downloaded everything. I read it all and it did help me to understand all of the configuration information that Access2Go had emailed to me. In reality, you don’t need the documentation except to know what cables plug-in where. I also tried out the serial port interface to the router just because I thought it was cool.
- This morning I called Access2Go to hook up everything. A patch cable (regular ethernet cable) goes from the jack to the WAN port on the T1 router. A crossover cable goes from the ethernet port on the T1 router out to my network. In my case, this is a business class router from linksys that supports secure vpn and has a good firewall. The router on your network gets assigned one of the lan ip addresses from the block they give you. Access2Go got a Quest rep on the line and we tested everything and I was up and running. The call lasted less than 10 minutes and was painless.
This is a good option for telecommuters that live somewhat out in the country like I do. It is much more expensive than DSL or cable that you can get in the city and the download speed is not as good as the higher end of these services. Upload speed is outstanding, however. Also, a T1 is dedicated and has an SLA of 4 hours for someone to arrive on the scene if it quits working. You won’t get that with DSL or cable, at least not at the consumer rate.
Having trouble getting out of bed in the morning?
For those having trouble getting out of bed in the morning, when you really should, maybe could give this a try.
You have to solve a math problem correctly to get the alarm to shutoff.
Kevin Kelly on Better Than Free
I ran across this article a few days ago and I saw that it was also referenced on Slashdot this morning. The article is titled Better Than Free and is written by Kevin Kelly. The article is not about software specifically as much as any object that could have a free alternative like a bootlegged copy of a movie or a copied version of a book, etc..
Kelly outlines 8 attributes of a transaction which he believes will raise the value above the free alternative. In other words, these 8 attributes are the values which people are willing to pay for. I very good article and worth the time to read because I think it also applies to not only free alternatives but also to lower cost alternatives. For instance, I believe the Immediacy attribute he describes can apply to having on-shore developers versus having off-shore developers. On-shore developers have the advantage in Immediacy because they are in the same office or at least in the same time zone.
I am not sure I am completely sold on Immediacy for all transactions since I have seen developers in the past spend many hours or even days or weeks attempting to configure a free software alternative when easier to configure commercial alternatives were available. Most commercial software excels in the Interpretation category, described by Kelly, where more comprehensive documentation is available and more time is often spent on usability. Of coarse, this is not always the case either.
Anyway, the article is worth reading because I think it gives everyone something to think about in terms of what service you are providing, either as an employee, consultant, ISV, or OEM. For all of these services, there are free or at least lower cost alternatives.
Tags: softwarebusiness, betterthanfree
.CHM Content Blocking
They say you learn something new every day and that is certainly the case today. It started with this post where I incorrectly stated that documentation for Unity was lacking. After Grigori corrected me on that, I attempted to read the documentation and was presented with this error from HTMLHelp:
Whenever I nagivated to other topics, I received a similar but not identical message:
Since others were describing material that had been read from the Unity documentation, I assumed that the problem was most likely a setting on my local machine. After a little searching on google, I didn’t really find anything.
I looked at the properties of the CHM in windows explorer and found the problem:
I was unaware that this functionality existed. It could be that it has been there for quite some time since it seems less common that help is shipped in this format than it used to be. Anyway, just pressing Unblock and applying the changes is not enough. You must also make the file writeable. If the file is Read-only, you will find that the Unblock button is still there along with the security message when you bring up the properties dialog again. After unchecking Read-only, pressing Unblock, and accepting the changes, I was able to view the documentation.
Tags: chm, chmsecurity, security, contentblocking
T1, You’re the One for Me
Lately I have been suffering from a severe lack of internet connectivity.
I live in a fairly rural area outside of Houston on some property (not in a neighborhood). Living on property has many advantages like neighbors are not right on top you, plenty of room for the kids to play without worrying about them wandering in to the street, peace and quiet, and so on. Internet service is not one of those advantages.
Until a few years ago, I was still in dial-up internet service land. In 2005, a wireless provider arrived in town. The way this service works is a square transmitter that looks about the size of a medium pizza delivery box is installed on the outside of the house and is pointed to the tower. In my case, the tower is a cellular tower that has the wireless transmitters mounted on them. This technology is line of site which means things like thick fog can effect quality of service. When everything is perfect, I get around 450-500k down and 350-400k up. Not fast compared to the alternatives available in Houston, but blazing fast compared to dial-up.
This service has mostly worked. I say mostly because I have had 4-5 outages of at least 4 days in duration. Several more outages of a day or two have occurred as well but I don’t even count those anymore. The last outage started 2 weeks ago and ended yesterday, which also explains the lack of new posts during that period. The day the outage began I called tech support and the call went something like this:
Me: Hello, I am one of your customers and my service quit working this morning.
Support Minion: Have you rebooted your computer?
Me: Yes, and my router and your router as well. None of that helps. I believe there is a problem with your tower.
Minion: I don’t think there is anything wrong with the tower, sir. No one else has reported problems.
Me: Most people are at work right now. Doesn’t there have to be someone who reports the problem first? That could be me, in this case.
Minion: Can you press the start menu, open control panel, double-click on network connections and tell me how many connections you see?
Me: The problem is not with my computer. I haven’t changed any settings. The service was working an hour ago and now I can’t even get an address from dhcp.
Minion: Sir, sometimes settings change all on their own.
Me: No they don’t.
Minion: Sir, if you do not allow us to check your settings now and the problem turns out to be your equipment, we will charge you $75 for our service call.
Me: If you waste my time going through this again, and the problem is not my equipment, can I bill you $75?
Minion: Sir, it will be better if you would refrain from being difficult.
Me: Fine, what would you like me to look at.
Three service calls, 5 irate phone calls, one guy climbing the tower and fixing the problem, and two weeks later my service is restored.
Since I am now working with multiple clients and working on the company’s first product, I really need reliable service. My only option from here is a T1. The line is scheduled to be installed at the end of this month. Download speed still won’t match commercial DSL that is available in town, but upload speed will be very respectable.
BarCamp Texas Day 1 Sessions
The sessions were quite diverse and interesting on the first day of BarCamp. Since most sessions were only 30 minutes, it was difficult for the presenters to go in to much depth. However, 30 minutes is good enough to give a good introduction to a topic you might not know very well and give direction as to where more information can be obtained. Here is a brief description of the sessions I attended.
Startup Methodology
I am not sure that this was the exact title, but James Lancaster of Research Valley Innovation Center gave an excellent overview of his methodology for working with startup companies. The methodology, INNOVATEnRV, describes the stages of company startup and James explained the types of issues that startups would and should be concerned with at each stage. This presentation was the most polished of the day, at least of the sessions that I watched.
Drupal in 30 Minutes
Chip Rosenthal, from Unicom Systems Development, presented an overview of Drupal. For the uninitiated, Drupal is a content management system written in php. I felt is was a good introduction since I had never taken the time to look over Drupal. The one interesting nugget in this presentation was that Chip recommended looking at the Zen Drupal theme, that is not one of the stock themes in the installation, because it is very configurable and can give your site a look that is less like every other site running Drupal.
Social Media Marketing
Nikhil Nilakantan, from Social Span Media, gave a session on marketing on social networking sites. I have to admit that this is not a segment of the internet that I have paid much attention to. I am fascinated that these sites are as popular as they are with people over 22 years old. I understand LinkedIn, but I do not understand why I would want to really participate in the others. Nonetheless, Nikhil presented statistics on social networking site traffic that did make me take notice. He stated that the top 10 sites attracted 131.5 million unique visitors during December 2007 alone. The more interesting statistic was that the average visit on MySpace lasted 30 minutes (20 minutes for Facebook). Nikhil estimates that $1.8 billion were spent on social network related advertising last year. I have no doubt that someone will find out how to make advertising work properly with this type of market and usage pattern. The market is simply too juicy to pass up.
GWT and Gears
Tom Peck, from AppEngines, presented a session on both GWT and Google Gears. This was one of the sessions that really could have been an hour long or maybe even longer. GWT is a framework that allows developers to code web application GUI layers in java while using an api that is quite similar to swing. I have seen demos of this technology before and it is quite impressive. Google Gears is in beta and allows the development of applications that run in a browser and allow offline data storage on the local machine. Gears accomplishes this via a browser plug-in that utilizes the embedded SQLite database engine for the storage. There is an api available from both GWT and javascript. Whoever figures out offline storage in browsers can potentially make a gazillion dollars so it is weird to me why Google is giving this away. Since there are many people working at Google that are much smarter than me, I am sure they have a strategy. Here is my prediction for a competitor to Gears: When Silverlight 2.0 is released, someone will provide this capability via the .Net Isolated Storage api (and no I haven’t spoken with anyone already working on this).
Introducing AlphaBetaFinder.com
Anita DuBose presented the freshly launched AlphaBetaFinder.com from AppEngines. The site is a matching service for software and hardware vendors looking for alpha and beta testers for their products. The idea is that potential testers can register and provide information about what they are willing to test and what equipment they have available. Vendors can then search the database for matches and send invitations for testers. The site will inform the vendor when testers are interested and they can purchase the contact information for the testers. For now, everything on the site is free because AlphaBetaFinder is currently undergoing its own beta testing.
Tips on Podcasting
Jonny Dover presented some tips on Podcasting and Brad Dressler joined him to demo Audacity, an open source audio editing tool. I was quite interested in this session because podcasting is something I would like to try. Good tips were given such as eliminating pauses, working from a prompter or script (CuePrompter.com was recommended), and finding a way to include more than one voice on the podcast were given. I spoke with a few guys in the audience (sorry guys, I forgot to get your names) that mentioned GarageBand was great to replace using Audacity if you are using a Mac. They also pointed me to PumpAudio if you need low cost music to mix in to a podcast or the Creative Commons Audio section if you need low cost podcasting solutions.
GeoDjango
Justin Bronn and Travis Pinney presented GeoDjango, which is the GIS branch of the Django project. Django is a rapid web application development framework for python, similar to what Ruby on Rails does for the Ruby developers. I felt is was a good presentation but really was limited in depth due to the 30 minute length.
LINQ
I missed some of this presentation and I did not get the names of the guys presenting. The session introduced LINQ and the new C# 3.0 language features that make LINQ possible. They also gave a brief introduction to LINQ to SQL. This was one of the more interactive sessions that I attended. The audience was clearly interested.
Dinner
Several of us adjourned to a local pizza place, which claimed to have the world’s greatest pizza. It was good but a claim like world’s greatest is difficult to verify. I sat across the table from Eric Fortenberry, Cayce Stone, and Jeff Jurica from OrgSync. These guys have a website product that is targeted mostly at universities to give their organizations (fraternities, student congress, etc.) a way to manage their membership and calendars and such. I did catch a portion of their demo earlier in the day and site was quite nice.
After dinner, I retired to my hotel room but activities continued late in to the night. A party went until 2am and folks continued to talk until around 4am. Scott Riggins, a good friend of mine from Social Mobility, filled me in. I wished I had kept going but a late night working for a client the night before kept me from pressing on.
Tags: barcamptexas