First time here? Check out the site's "greatest hits" or read a post from the archives. Feel free to leave a comment or ask a question, and consider subscribing to the latest posts via RSS or e-mail. Thanks for visiting!

I get a few emails a day of folks asking what Syntax Highlighter I use in my blog for my code samples. Specifically, the newer code samples, as some of the old ones sucked as I was experimenting, trying to find the best one to settle on.

The tool I use is actually called SyntaxHighlighter and it's from Alex Gorbatchev. The trick is that the syntax highlighter is all javascript on the client side.

I was having all sorts of troubles with other code highlighters. First, there were ones that put css classes and stuff all through your code, trying to decorate each keyword. This just bloated my feed and site and made the code look weird in some Feed Readers. Then I tried using images for code, like ScottGu does, but that is just wrong. You can't copy paste the code, you can't search it, it's disrespectful for the blind, etc. Meh.

How I post code to my blog

I use Windows Live Writer to post all my blog posts, and it has a great plugin model. I've actually written a WLW plugin for the CueCat...it's really easy. I use a plugin from DasBlog contributor Anthony Bouch called PreCode that directly targets/supports SyntaxHighlighter from within WLW.

Screenshot of my plugins in Windows Live WriterThat means I see this from inside Live Writer. I slick Insert PreCode Snippet, and paste in my code.

If you're reading this blog post from inside an aggregator or feed reader, the next two code snippets look identical to you. However, if you visit my blog, you'll see that one is different.

// Hello3.cs
using System;

public class Hello3
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.WriteLine("You entered the following {0} command line arguments:",
args.Length );
for (int i=0; i < args.Length; i++)
{
Console.WriteLine("{0}", args[i]);
}
}
}
// Hello3.cs
using System;

public class Hello3
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.WriteLine("You entered the following {0} command line arguments:",
args.Length );
for (int i=0; i < args.Length; i++)
{
Console.WriteLine("{0}", args[i]);
}
}
}

One looks like this, as HTML:

<pre class="c#" name="code">// Hello3.cs<br />using System;<br /><br />public class Hello3<br />{
<br />   public static void Main(string[] args)<br />   {<br />     
Console.WriteLine(&quot;Hello, World!&quot;);<br />      Console.WriteLine(&quot;You entered
the following {0} command line arguments:&quot;,<br />         args.Length );<br />     
for (int i=0; i &lt; args.Length; i++)<br />      {<br />        
Console.WriteLine(&quot;{0}&quot;, args[i]); <br />      }<br />   }<br />}</pre>

See the 'class="c#" name="code"' part? Alex's Javascript SyntaxHighlighter is looking for those and parsing them on the client side. I choose to add <br/> breaks, but that's an optionin PreCode. Other options for SyntaxHighlighter include line numbering, gutters, copy/paste support, a toolbar and more.

P.S. If you don't use Windows Live Writer (and seriously, stop and ask yourself, WHY NOT?) and use instead a web interface, you can integrate SyntaxHighlighter into your web-based rich text editor. For example, Darren made a SyntaxHighlighter Plugin for the popular FCKeditor. Perhaps we'll put that in DasBlog.

Installing SyntaxHighlighter to Your Blog

You install the SyntaxHighlighter by adding it to your blog's template. It doesn't care what blog engine you run, as it doesn't need anything on the server:

<script class="javascript" src="/blog/scripts/shCore.js"></script>
<script class="javascript" src="/blog/scripts/shBrushCSharp.js"></script>
<script class="javascript" src="/blog/scripts/shBrushCpp.js"></script>
<script class="javascript" src="/blog/scripts/shBrushCss.js"></script>
<script class="javascript" src="/blog/scripts/shBrushJScript.js"></script>
<script class="javascript" src="/blog/scripts/shBrushRuby.js"></script>
<script class="javascript" src="/blog/scripts/shBrushVb.js"></script>
<script class="javascript" src="/blog/scripts/shBrushPython.js"></script>
<script class="javascript" src="/blog/scripts/shBrushXml.js"></script>

Just add the shCore library and just the languages you require. If you want you blog to feel snappy and you have some control over your server, don't forget to set the files/directories to cache on the client by making them expire far in the future. You don't want your user's browsers to keep asking for these scripts each page view.

Even better, you can create your own plugins for SyntaxHighlighter if you use a language Alex hasn't supported officially. This guy threw together a Scala SyntaxHighlighter file by editing the Java one and adding a regex.

There are a few bugs but I think folks forget that Alex is doing this all alone, so I have to give him mad props for the effort. It can be lonely and unforgiving when you do something awesome and either no one cares, or folks only care to complain.



imageThe Wife was stressing out because the sheer number of people we were sending Christmahanakwanzika cards to this year. She usually handwrites out the envelopes, but there's just too many now. I suggested cutting back, or using email, and was prompted put in my place.

I suggested a Mail Merge, and while The Wife is a competent Microsoft Office user, the Mythical Mail Merge is still out of reach. I don't think I've met a non-programmer who has pulled it off. It's a shame really, especially when it comes to envelopes.

The goal was to get 100s of cards out in about an hour, with a small 3-day pause in the middle as we waited for the cards to show up from Shutterfly.

Step 0 - Get a Card

This was easy. We had a 4x8 card made at http://www.shutterfly.com, which I've been using happily since Day 1, by the way. They are cheap and fast and reliable.

Step 1 - Get the Names and Addresses

imageWe used to have everything in Outlook, but you know, things get messy. We ended up making an Excel Spreadsheet that ended up on the web as a Google Spreadsheet. We pulled addresses in from all over, Evites, emails, old envelopes, whatever. The goal was/is to collect all the times. We used the really simple format Name, Street, and one single CityStateZip field, rather than splitting things up with the whole City, State, Zip. We have a lot of international people, so it was easier.

We saved the spreadsheet as a CSV, but Word doesn't really care...it can read most any kind of data. We could have just saved it as a XLS file.

Step 2 - Start the Merge in Word

You may hate Word 2007 and the new Ribbon, but it's REALLY growing on us. Click Mailings, then Start Mail Merge. Select Envelopes...Pick your envelope size. Select the file with your recipients/relatives in it. I selected our CSV.

If you like, you can click Edit Recipient List and tidy up your data, maybe remove a cousin or two.

Step 3 - Lay out your Envelope

Next, click "Address Block" to put the address in your envelope.

This next part is the MOST important. Click "Match Fields" and make sure that Word figured out where you want things to go:

image

Here I had to tell Word about my funky mapping (that we had only one field for City, State, Zip).

Step 4 - Print and Chill

Click OK, and preview your document. If you like it, stack your envelopes up in your printer and print your holiday troubles away.

This might seem like a trivial or silly post to you, but The Wife thought it was about the greatest thing she's ever seen. It's funny how I've got the whole house networked, we've got video streaming from the Xboxes in two rooms, but The Wife is impressed with a mail merge. Anyway, it took about an hour and saved her at least a weekend. I say +2 Charisma for me this week. :)



I've got an old Compaq Ipaq that I gave my then 10 year old niece to play with. I put Ubuntu 5.10 "Breezy Badger" on it. Fast forward to today, and she wants it refreshed. It hasn't been on the Internet for 3 years so it doesn't have any updates. I remember years ago that Ubuntu had an update manager so I figured it'd be pretty straight forward. It wasn't really, but it was manageable.

It took a minute to remember that Ubuntu has LTS (Long Term Support) versions, and then it has intermediate versions. I could have just paved her machine, but she'd customized a lot of it, and I didn't feel like the hassle of starting from scratch.

You can upgrade from any version to the next LTS easily, then hop between LTS major versions. That means I needed to run three upgrades:

  • 5.1 -> 6.06.2 LTS
  • 6.06.2 LTS->8.04.1
  • 8.04.1->8.10

First I updated her /etc/apt/sources.list file and changed every "breezy" to "dapper." 

An hour later, I was on 6.06. Reboot. Then I used the Update Manager to get me to 8.04…churn churn churn. Then Reboot. Then Update Manager to 8.10, hour later, and she was fully up to date.

I then added all the Edubuntu educational applications from a downloaded and burned CD. Now, to figure out why the sound no longer works. ;)



First, let me remind you that in my new ongoing quest to read source code to be a better developer, Dear Reader, I present to you thirty-seventh in a infinite number of posts of "The Weekly Source Code."

I'm working on a side-project with Rob Conery, Dave Ward and others and I want to be able to do a search immediately as the user arrives on the site, using their location derived from their IP Address. I want to use "Geolocation" or Reverse IP Address Lookup, and take an IP like 127.0.0.1 and turn it into "New York, NY."

There are lots of services and databases that you can buy that will let you make a web service call and get back a location. Some will include latitude and longitude, some include the city name. Some are REALLY expensive, like $500 or more.

I found two solutions, one server-side that's a community project and one client-side from Google!

Community-based Geotargeting from hostip.info

If you hit http://www.hostip.info/ with your browser, it'll guess where you are and show a map with your estimated location, usually within 50-100 miles. It's a community-based project with a freely available database. They've got over 8.6 million entries in their database!

More interestingly, they have a nice clean API for Geotargeted IP Address Lookup.

For example:

http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true
  Country: UNITED STATES (US)
  City: Sugar Grove, IL
  Latitude: 41.7696
  Longitude: -88.4588

if you add just call:

http://api.hostip.info/?ip=12.215.42.19

You'll get an XML document back with lots of good information.

So, I wrote a quick .NET wrapper for this service. Note the sample XML file in the comment in the middle there. I also put in a default location for debugging. It's not the cleanest code in the world, but LINQ to XML made it easy and it either works or it doesn't.

public class LocationInfo
{
public float Latitude { get; set; }
public float Longitude { get; set; }
public string CountryName { get; set; }
public string CountryCode { get; set; }
public string Name { get; set; }
}

public class GeoLocationService
{
public static LocationInfo GetLocationInfo()
{
//TODO: How/where do we refactor this and tidy up the use of Context? This isn't testable.
string ipaddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
LocationInfo v = new LocationInfo();

if (ipaddress != "127.0.0.1")
v = GeoLocationService.GetLocationInfo(ipaddress);
else //debug locally
v = new LocationInfo()
{
Name = "Sugar Grove, IL",
CountryCode = "US",
CountryName = "UNITED STATES",
Latitude = 41.7696F,
Longitude = -88.4588F
};
return v;
}

private static Dictionary<string, LocationInfo> cachedIps = new Dictionary<string, LocationInfo>();

public static LocationInfo GetLocationInfo(string ipParam)
{
LocationInfo result = null;
IPAddress i = System.Net.IPAddress.Parse(ipParam);
string ip = i.ToString();
if (!cachedIps.ContainsKey(ip))
{
string r;
using (var w = new WebClient())
{
r = w.DownloadString(String.Format("http://api.hostip.info/?ip={0}&position=true", ip));
}

/*
string r =
@"<?xml version=""1.0"" encoding=""ISO-8859-1"" ?>
<HostipLookupResultSet version=""1.0.0"" xmlns=""http://www.hostip.info/api"" xmlns:gml=""http://www.opengis.net/gml"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.hostip.info/api/hostip-1.0.0.xsd"">
<gml:description>This is the Hostip Lookup Service</gml:description>
<gml:name>hostip</gml:name>
<gml:boundedBy>
<gml:Null>inapplicable</gml:Null>
</gml:boundedBy>
<gml:featureMember>
<Hostip>
<gml:name>Sugar Grove, IL</gml:name>
<countryName>UNITED STATES</countryName>
<countryAbbrev>US</countryAbbrev>
<!-- Co-ordinates are available as lng,lat -->
<ipLocation>
<gml:PointProperty>
<gml:Point srsName=""http://www.opengis.net/gml/srs/epsg.xml#4326"">
<gml:coordinates>-88.4588,41.7696</gml:coordinates>
</gml:Point>
</gml:PointProperty>
</ipLocation>
</Hostip>
</gml:featureMember>
</HostipLookupResultSet>";
*/

var xmlResponse = XDocument.Parse(r);
var gml = (XNamespace)"http://www.opengis.net/gml";
var ns = (XNamespace)"http://www.hostip.info/api";

try
{
result = (from x in xmlResponse.Descendants(ns + "Hostip")
select new LocationInfo
{
CountryCode = x.Element(ns + "countryAbbrev").Value,
CountryName = x.Element(ns + "countryName").Value,
Latitude = float.Parse(x.Descendants(gml + "coordinates").Single().Value.Split(',')[0]),
Longitude = float.Parse(x.Descendants(gml + "coordinates").Single().Value.Split(',')[1]),
Name = x.Element(gml + "name").Value
}).SingleOrDefault();
}
catch (NullReferenceException)
{
//Looks like we didn't get what we expected.
}
if (result != null)
{
cachedIps.Add(ip, result);
}
}
else
{
result = cachedIps[ip];
}
return result;
}
}

I did put some naive caching in here. I would probably put in some cleanup so the cache could only get so big, maybe a few thousand IPs. Perhaps a FIFO queue, where I start yanking the old stuff after it gets full. Or, use the ASP.NET Cache and just let it manage memory and eject stuff that hasn't been touched in awhile.

This worked great for a while, but at some point, if my site became successful I'd want to send these guys money, or regularly download their free Geolocation database and run the whole thing locally.

Then, while looking at Google's Ajax Libraries API site as a place for my site to download the jQuery libraries rather than me hosting them, I noticed…

Free Geotargeting is built into Google's AJAX Libraries API

Google offers a free service called google.load that lets you load your favorite Javascript APIs using Google's Javascript Loader API, rather than hosting them locally. This means that you and your site get a few excellent benefits:

    • The files are loaded fast because they are on Google's CDN (Content Distribution Network)
    • The files are loaded asynchronously by newer browsers because they aren't stored on your site (most browsers open up to 6 HTTP connections per DNS/site, but older ones do 2.
      • This is why back in the 90's we had www.800.com and images.800.com in order to get some parallelizm. It's also recommended by YSlow, although you should balance this knowledge remembering that there's a cost for a DNS lookup. That said, newer browsers like Chrome include their own local DNS cache which mitigates that issue. Moral of the story? Know all this stuff, but know that it'll all be obsolete and moot soon. ;)
    • They offer a versioning API, so you can say, "get me version 2 of something" you'll get 2.24 if it's the latest.

What does this have to do with Geotargeting? Well, you know when you get Google.com they know where you are. They'll offer Spanish if you're in Spain. Since they ALREADY know this stuff, they are making in available to your script via google.loader.ClientLocation for free. They announced this in August and I missed it until today!

I'm doing this:

<script src="http://www.google.com/jsapi?key=YOURAPIKEY" type="text/javascript"></script>
<script>
google.load("jquery", "1.2.6");
google.load("jqueryui", "1.5.2");
var yourLocation = google.loader.ClientLocation.address.city + ", "
+ google.loader.ClientLocation.address.region;
</script>

Note that you need to sign up for a free API KEY for your domain so they can contact you if there's a problem with the script.

Later on, I use the yourLocation JavaScript variable and put it in a Search Box for my app and go searching based on your location. If your location is wrong, I remember if you typed in a different city in the Search Box and I'll use that again, so I only annoy you once.

If that's not enough information, you can use the proper Geolocation API, which is much more sophisticated but requires Google Gears.

Enjoy!



PAINT.NET Logo My one-hundred-and-thirty-eighth podcast is up.

Well, actually a few weeks ago, but I totally forgot to update my website with the details. You'd think somewhere around 100 shows I'd had automated this somehow. Hm. If I only I know a programmer and the data was available in some kind of universal structure syndication format…;)

Scott talks with Paint.NET author Rick Brewster about some of the internals of his popular freeware application. They focus on deployment and setup, how Rick does it and what we can learn from him.

Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show!

Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for ASP.NET and Windows Forms. Enjoy the versatility of our new-generation Reporting Tool. Dive into our online community. Visit www.telerik.com.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

Enjoy. Who knows what'll happen in the next show?



richard_headshot_web My one-hundred-and-thirty-seventh podcast is up.

Well, actually a few weeks ago, but I totally forgot to update my website with the details. You'd think somewhere around 100 shows I'd had automated this somehow. Hm. If I only I know a programmer and the data was available in some kind of universal structure syndication format…;)

Scott catches up with Richard Campbell at DevConnections in Las Vegas and they chat about the announcements at the 2008 Microsoft PDC and how/if the new stuff will affect our lives.

Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show!

Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for ASP.NET and Windows Forms. Enjoy the versatility of our new-generation Reporting Tool. Dive into our online community. Visit www.telerik.com.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

Enjoy. Who knows what'll happen in the next show?



My one-hundred-and-thirty-sixth podcast is up.

Well, actually a few weeks ago, but I totally forgot to update my website with the details. You'd think somewhere around 100 shows I'd had automated this somehow. Hm. If I only I know a programmer and the data was available in some kind of universal structure syndication format…;)

One of the hidden gems this year at the PDC conference was the Microsoft Research section. It was buried in the back of the convention center, unfortunately, so a lot of people didn't know it was there. Scott talks to each team at length and gets the scoop on what project are coming to an IDE near you sometime soon.

Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show!

Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for ASP.NET and Windows Forms. Enjoy the versatility of our new-generation Reporting Tool. Dive into our online community. Visit www.telerik.com.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

Enjoy. Who knows what'll happen in the next show?



My one-hundred-and-thirty-fifth podcast is up.

Well, actually a few weeks ago, but I totally forgot to update my website with the details. You'd think somewhere around 100 shows I'd had automated this somehow. Hm. If I only I know a programmer and the data was available in some kind of universal structure syndication format…;)

Here's some raw audio from the last show. We left the recorder on after the show was over, and the discussion continued for another 30 minutes! It's a different conversation in a raw style, but we hope you enjoy it.

Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

Telerik is our sponsor for this show!

Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for ASP.NET and Windows Forms. Enjoy the versatility of our new-generation Reporting Tool. Dive into our online community. Visit www.telerik.com.

As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes from Travis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

Enjoy. Who knows what'll happen in the next show?



Remind me to tell you some time why the IIS team is so evil clever. It' cool to see the first steps of a master plan to make things awesome start to come to fruition. 

I've said over and over that IIS7 is rocking sweet and once you start using it, you'll never want to go back. It's all part of the whole /web platform and it's always been ridiculously tedious to install. It's getting WAY easier, all as part of a super-secret master plan I can't tell you about or I'd have to kill you.

Seriously, the Web Platform Installer, or Web-PI, hit Release Candidate last night. The #1 complaint on my last post about this was that it didn't support XP. Bam:

Supported Operating Systems are: Windows Vista RTM, Windows Vista SP1, Windows XP, Windows Server 2003, Windows Server 2008

How ya like me now, son? ;) Also works for Server 2003, so that's cool.

Screenshot of Web Platform Installer

Web-PI's got a number of cool things, but one subtle one you might take note of is the Web Deployment Tool Beta (MSDeploy) that I mentioned before. This tool makes it very easy to package up all the configuration schmutz of your application and (re)deploy it elsewhere. As such, it supports synchronizing your sites and applications across server farms, which was a huge problem for me when I was in banking. It integrates nicely with IIS Manager too.

Also of note is the inclusion of ASP.NET MVC Beta as an option, as well as URL Scan 3.1 and IIS 7.0 manager which lets you manage IIS7 from non-IIS7 machines like, ahem, XP machines. Basically all the things that were hard to find, now, less so.

Now, my first worry when I saw this was, "well, some small team is doing this applet and it's neat and all but soon it will fall into disrepair and fade away, like calc.exe." Well, I just got a personal call from Bill Staples who manages all this stuff and he told me

"oh no, we've got a master plan."

He then proceeded to tell me the master plan and it was good™. I can't tell you, but I'm working on ways to tell you without Bill firing me. Regardless, there's some cool stuff coming in the /web space. It's very tidy, very open, very clean, very sourcey, very appy, very nice.

So, go get the Web Platform Installer and the Web Application Installer and ponder on why there's a "A - F |  G - L | M - R | S - T | U - Z" navigation thing on a page that only has 7 products for download.

Discuss!

Related Posts



An interesting comment thread broke out in a recent post on Using Crowdsourcing for Expanding Localization of Products. Someone linked to a post and used the phrase:

"If you don't know English, you're not a programmer."

The post linked to didn't make the statement so boldly, but it's an interesting "link bait" phrase, isn't it? It's defintely phrased to get your attention and evoke opinions. I don't agree with it, but I wanted to dig more into the concept.

This whole conversation caught the eye of Fabrice Fonck, General Manager (GM) of Developer Content & Internationalization for DevDiv. He wrote this email to me and I wanted to share it with you. He's was a programmer before he became a manager, and English is not his first language, so I thought it fitting. I also added emphasis in spots. Fabrice believes very strongly in the usefulness of translation and translated content and has an entire organization dedicated to it, so you can understand why he'd feel strongly about this.

I began studying computer science and programming in 1985 as a freshman in a business school in France, my native country. At the time , localized versions of programming tools were not available and I will always remember when I picked up that version of GW-Basic only to realize that it was all in English. Learning programming seemed already daunting, but doing it in a foreign language only increased my level of fear. Over 20 years have gone by and English does not feel quite as foreign to me anymore, but I cannot help but think that for billions of people around the world, taking on such a double challenge may not necessarily lead to the same outcome.

Over the past 17 years in the Developer Division at Microsoft, I have devoted a large portion of my time and energy making sure our products and technologies are available in as many languages as possible because I believe it is important to make them accessible to as many people as possible around the world. During all these years, I have had the privilege of traveling to many countries around the world and I have talked to many of our customers, a number of which through interpreters. I have met many brilliant developers out there whose English language skills were limited if not practically non-existent. This anecdotal evidence is supported by our sales figures. In Japan for instance, where we have one of our largest developer population in the world, over 99% of our product sales are in Japanese. Entering that market with an English-only product is a recipe for failure. That same is true in counties such as France, Germany, Spain, Russia or China where our localized products represent over 80% of our sales. The list of countries goes on and on.

While it is true that a number of people overseas for whom English is not their native tongue will eventually learn and benefit from the vast amounts of technical content available in English, a greater number will not. That is why we continue to expand the number of languages in which Developer Division products and technologies are localized into. Cost is obviously an important factor here, especially for smaller geographies. That is why we continue to invest in technologies such as machine translation, translation wikis and CLIP, and concepts such as crowdsourcing and community engagement to drive down costs and make these languages a reality for the millions of developers out there (and aspiring developers) that do not speak English. By making our products available in all these languages, we also foster more community engagement in these languages, through blogs, forums, chat rooms, etc.

Here's some choice comments from the previous post:

Erling Paulsen: "Most articles, knowledge bases, books and so on are in English, so if you want to read up on something in depth, you need to have at least basic reading skills in English. Translating tooltips inside Visual Studio could end up causing confusion for at least new developers, as what they would see on-screen potentially did not match up with what the tutorial/book they were following." and "...I truly do appreciate that Microsoft is trying to make an effort, and I believe that MSDN has had a vast improvement in usability the past year or so. And the fact that MSFT are allowing community contribution is absolutely fantastic, but at least to me, the translation effort just seems a bit unnecessary." and "I never said, or meant to say that you need to be fluent in english to be a good programmer. And as Scott points out, the side-by-side translation feature would actually be a great way for learning english."

Paul van de Loo: "Developers might as well get used to learning new languages (even if they aren't programming languages)."

Spence: ""A programmer who doesn't at least understand English is not a programmer" that's an outrageous statement. That's like saying "a musician who is deaf is not a musician" patently untrue and ridiculous. plus pretty offensive to millions of programmers."

Ramiro: "I believe that in an ideal world every programmer should speak and read enough English to be able to work, learn and interact. However (and specially in Latin America) this is still a long term goal. I really applaud the effort being put in by Microsoft and other companies to make resources more available for everyone."

Robert Höglund: "I do think we developers need a common language. When you have a problem, get a strange exception, 9/10 just googling the error message will get you the answer. I have tried developing on a Swedish version of XP but trying to search for those error messages doesn't work. Can't say i agree with the statement "If you don't know English, you're not a programmer" but it does make life easier."

Farhaneh: "I can not speak and write english very well , but i'm taking classes and reading english books in my major to make it better. because i want to be a good programmer."

Filini: "The english syntax that has been used in programming languages for the last 50 years."

John Peek: "To say that if you don't know English, you're not a programmer is a perfect example of ethnocentrism in this country."

What do YOU think? Is learning English the #1 thing a Programmer should do (after learning to type)? Can you be an awesome programmer and speak little or NO English?

The comment that *I* personally agree with the most is from Ryan:

"It would *seem* (totally non-scientific sampling) that the non-english speakers (as a first language anyway) tend to agree with the statement "If you don't know English, you're not a programmer" more than native english speakers."

What do YOU think, Dear Reader?



Contact

Sponsors

Hosting By

On this page...

Tags

Calendar

<December 2008>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Archives

Google Ads