this.Blog.Find(entry => entry.IsHelpful);
 Monday, May 05, 2008
Reason #134 as to why you need to be reading Wil Wheaton's blog

Wil Wheaton is fantastic.  This quote is from one of his recent posts questioning his own thoughts on JJ Abrams' promise to "re-invent" the Star Trek series with the new movie:

"Speaking as a lifelong geek, my knee-jerk reaction when I hear someone talking about 'reinventing' something like Trek is that it will be a tower of suck, built out of an endless supply of Jar-Jars and midichlorians."


Kick it on DotNetKicks.com
Monday, May 05, 2008 9:45:29 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  Humor

 Saturday, May 03, 2008
Sort and Remove Unused Usings in Visual Studio 2008

When I first starting developing in .Net, I had been a Java programmer for many years.  I remember when I first started the transition, a long-time VB developer told me how much I was going to *love* Visual Studio.  It was as if programming Java in Eclipse was akin to living in the stone age and he had suddenly granted me the programming gift equivalent to fire.  "Here you go ... but use this power wisely.  With great power, comes great responsibility."  Hey, it's not like I was using vi on an terminal emulator!  (by the way, have you seen any old school guys program in vi (and still choose to do it)?  It's *scary* how fast they are.)

Anyway, it's 2004 and I start my era as a .Net developer using Visual Studio.  Dare I say, I actually begin to *miss* some things that were in Eclipse.

Example - In Java, you have "import" statements at the top of every class you write.  They are very similar to "using" declarations at the top of a C# class.  They basically tell the compiler what packages (i.e. namespaces in .Net) you need to compile the class.  Whereas in .Net you only can include an entire namespace, in Java you have the ability to import an entire package:

import java.util.*;

or individual classes within a package without having to import the entire package:

import java.util.Calendar;
import java.util.Date;
import java.util.List;

Flash back to circa 2002 or so.  I was working on a J2EE project with a team of developers.  Another developer and I were working on a couple of the same files.  After he checked a file in and I was going to work on it, I would do a diff on the file to see what he had changed.  I noticed every time he checked a file in, along with the changes he had made, he would rearrange the import statements.  Now, the usual ordering of imports in a java class are that all the java.* classes go first, then the javax.*, followed by any org.*, and finally your application classes last.  The project we were working on was for the state of Georgia, so some of our application packages started with gov.*.  Well, he would always move those imports above the java.* packages.  I would move them back to the bottom (where they actually belonged).  When he checked it back in, they would be right back at the top.  I thought to myself, "Man, this guy must be really anal to go through the effort of expanding out and ordering all the imports statements that way.  I wonder why."

One day I finally asked him about it.  "Why do you re-order the imports statements every time you check a file in and put the gov ones first?"  He looked at me with a puzzled look.  "Huh?"  Then he realized what was happening.  "Oh, I just hit Ctrl-Shift-O every time before I save a file to organize the imports."  And he showed it to me.  In Eclipse, you could use that keyboard shortcut (or access it through the menu) to automatically figure out your individual class imports and arrange them via a configuration of your choice (since he hadn't set up the gov ones in any order, it defaulted them to be first alphabetically).

Wow!  Pretty cool!  This was 6 years ago mind you.  So I got in the habit every time I saved a file: Ctrl-Shift-O, Ctrl-S ... Ctrl-Shift-O, Ctrl-S ... Ctrl-Shift-O, Ctrl-S.  I quickly became a "creature of habit".

Back to starting out in Visual Studio in 2004 ...  Let's see, I'd like to organize my using declarations.  Ok, Ctrl-Shift-O doesn't do that.  Hmm ... I wonder where that setting *is* in Visual Studio ...  Looks of looking, lots of googling ... Nothing.  Well, damn.  That kinda sucks.  You mean I actually have to manage this myself?!?!?  I think to myself, "Am I the only one out there who is wanting this sort of thing???"

Time passes, I am surviving by organizing my usings by hand (barely).  The more and more .Net blogs I read, I start hearing about people using and loving ReSharper.  Last year, after going solo and starting my own company, I finally decided to pull the trigger and buy myself a copy.  And boy, was I glad I did!  Along with a bunch of other great things, I notice that it let's you sort and remove unused usings.  "There it is, there it is!!!"  Ctrl-Alt-O!  Organize and remove usings!

Last year, Visual Studio 2008 comes out, but damn - ReSharper is not quite ready for it.  Well, work still needs to get done so I need to carry on, albeit without ReSharper for the time being.  I am playing around with Visual Studio 2008, and I notice a new menu option under Edit->Intellisense.  Whoa, what's this?  "Organize Usings".  I click on it, and lo and behold, there it is - three options: 1) Remove Unused Usings; 2) Sort Usings; 3) Remove and Sort.  Finally!!!

There is no native keyboard shortcut mapped to the "Remove and Sort".  Well, we can change that easily enough:

 

There, I've mapped Ctrl-Alt-O to Remove and Sort.  I'm back baby!  Ctrl-Alt-O, Ctrl-S!  Let's see it in action ...

Before:

And after:

The bottom line is - yes, Visual Studio is a great IDE.  But don't fool yourselves .Net developers.  Eclipse, IntelliJ, and even NetBeans (my preferred IDE for working in Ruby) are all very strong IDEs that in reality actually do some things (gasp!) *better* than Visual Studio.


Kick it on DotNetKicks.com
Saturday, May 03, 2008 2:52:09 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  .Net | Eclipse | Java | ReSharper | Visual Studio

 Wednesday, April 30, 2008
Using Miado with Powershell

One of the nice things about Miado is that it wraps a lot of tedious, repetitive ADO.Net code and therefore greatly reduces the amount of code you actually do need to write. 

Here's a quick example.  One of the tasks I had to do at my last last gig was upload a set of prices from a CSV file every month.  I wrote a PowerShell script to use Miado to do the DB inserts:

  1. function BuildSql()   
  2. {   
  3.   # build the SQL   
  4.   $sb = New-Object System.Text.StringBuilder   
  5.   $sb.Append("insert into VendorPrice(VendorID, FixedPrice, VariablePrice, ");   
  6.   $sb.Append("CreationDate, LastUpdatedDate) ");   
  7.   $sb.Append("values(@VendorID, @FixedPrice, @VariablePrice, ");   
  8.   $sb.Append("current_timestamp, current_timestamp)");   
  9.     
  10.   return $sb.ToString();   
  11. }   
  12.   
  13. [Reflection.Assembly]::LoadFile("C:\dev\VS2008\Miado\src\Miado\bin\Release\Miado.dll")   
  14.   
  15. # setup the configuration   
  16. $connString = "Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;User Id=user;Password=passw0rd"  
  17. $dbProvider = System.Data.SqlClient.SqlClientFactory::Instance;
  18. $repository = Miado.MiadoRepositoryFactory::CreateMiadoRepository($dbProvider, $connString);
  19.   
  20. $sql = BuildSql;   
  21.   
  22. foreach ( $row in Import-Csv prices.csv | Select VendorID, FixedPrice, VariablePrice )    
  23. {  
  24.   $repository.ExecuteNonQuery($sql.ToString(), $row.VendorID, $row.FixedPrice, $row.VariablePrice);     
  25. }  

As you can see, the script iterates over each row in the CSV file and inserts a record for each row.  There's no need to write all the code necessary to create the DbConnection and DbCommand objects, nor do you have to dynamically create DbParameter objects for each row.  Just pass the SQL and the variables (in order of replacement) into the IMiadoRepository.ExecuteNonQuery() call and Miado takes care of all the ugly details.  One line for each insert - that's it!

Edit: This post was updated to reflect the changes in the 0.7.10530.1


Kick it on DotNetKicks.com
Wednesday, April 30, 2008 11:38:38 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  .Net | Miado | Powershell

 Tuesday, April 29, 2008
Apple to cut iPhone cost to under $200?

http://techland.blogs.fortune.cnn.com/2008/04/29/att-to-cut-the-price-of-apples-new-iphone/

Crazy if true.  Hell, it just might make it worthwhile to break a contract with Verizon ... 

And while we're on the subject - no wonder Motorola is going into the toilet - my effing 8 month old Razor can't hold a full charge for more than 12 hours with about 10 minutes of talk time.  wtf?!?!?!

Getting back to the iPhone.  Steve Jobs is sticking to his guns about Apple's goal of selling 10 million iPhones in its first year.  Well, this just might be the way to do it.  I think I hear the sound of a million first gen iPhones crying out in terror as the fanboys begin to line up for v2. 

The 2.0 upgrade due in June supposedly is also targeting corporate customers.  Hmm... I'm not convinced it will catch on in the enterprise space until they remove the requirement of using iTunes to provision it.  This just seems like a deal breaker to me.


Kick it on DotNetKicks.com
Tuesday, April 29, 2008 8:10:56 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  Apple | iPhone

Grrr!!!

I spent hours today trying to figure out why the hell my site was rendering all funky in IE while it looked just fine in Firefox.  In the end, it was merely a poorly placed embedded style="display: inline;" attribute on an element (well, two actually) in one blog post that was messing everything up in IE.


Kick it on DotNetKicks.com
Tuesday, April 29, 2008 5:39:55 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  Blog

 Tuesday, April 22, 2008
Getting the SysInternals Suite, Ruby style

John Robbins at Wintellect put out a nice blog post about using a PowerShell script to download and install the excellent suite of tools provided by Sysinternals.  I absolutely love the *concept* of PowerShell and the ability to harness the power of .Net at the command prompt.  The one downside to it is that I find the syntax to be a bit too verbose than what I normally expect out of a scripting language.  YMMV.

Anyway, in an effort to stay on top of my (limited) Ruby skills, I have ported his implementation to Ruby:

#!/usr/bin/env ruby

require 'net/http'
require 'zip/zip'

def usage
puts ""
puts "Downloads and extracts all the tools from Sysinternals"
puts ""
puts "Usage: ruby download_sysinternals.rb <extract-directory> [<save-directory>]"
puts "Required Parameter :"
puts " <extract-directory> : The directory where the SysinternalsSuite.zip"
puts " tools are extracted."
puts "Optional Parameters :"
puts " <save-directory> : Saves SysinternalsSuite.zip to the specified"
puts " directory. If not specified, the .ZIP file "
puts " is not saved."
puts " -? : Display this usage information"
puts ""
puts ""
Kernel#exit
end

def create_directory_if_needed(dir)
File.makedirs(dir) unless File.exist?(dir)
end

def download_sysinternals_zip_file(download_dir)
puts "Downloading SysinternalsSuite.zip file"
url = URI.parse('http://download.sysinternals.com/Files/SysinternalsSuite.zip')
req = Net::HTTP::Get.new(url.path)
resp = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }
puts "Saving SysinternalsSuite.zip to: #{download_dir}"

file_name = "#{download_dir}/SysinternalsSuite.zip"
delete_file_if_exists(file_name)
open(file_name, "wb") { |file| file.write(resp.body) }

puts "Finished downloading"
end

def extract_zip_file(zip_file, extract_dir)
puts "Extracting zip file to: #{extract_dir}"
Zip::ZipFile.open(zip_file) do |zip|
zip.each do |entry|
file_name = "#{extract_dir}/#{entry.to_s}"
puts "Extracting #{file_name}"
# you will need to run this as an admin if
# you have sysinternals stuff in "Program Files"
delete_file_if_exists(file_name)
entry.extract(file_name)
end
end

puts "Finished extracting zip file"
end

def delete_file_if_exists(file_name)
File.delete(file_name) if File.exist?(file_name)
end

# here we go!!!
usage if ( ARGV.empty? || ARGV[0] == "-?" )

extract_dir = ARGV[0]
save_dir = ARGV.length > 1 ? ARGV[1] : ENV["TEMP"]

# download the file
create_directory_if_needed(save_dir)
download_sysinternals_zip_file(save_dir)

# extract the zip file
create_directory_if_needed(extract_dir)
zip_file = "#{save_dir}/SysinternalsSuite.zip"
extract_zip_file(zip_file, extract_dir)

# clean up after ourselves
delete_file_if_exists(zip_file) if ARGV.length < 1

Kick it on DotNetKicks.com
Tuesday, April 22, 2008 6:59:08 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  Powershell | Ruby | Sysinternals