Just added a meebome widget to my blog sidebar.

I’ve been using meebo for a while, now, as my primary IM “unifier”. ICQ, Y!IM, AIM, MSN… all on the same page.

I used to use gaim, and was mostly satisfied with it, but meebo allows me to forget about proxy and network settings regardless of where I’m using it.

Purchase Zovirax
Cheap Cymbalta
Order Augmentin
Buying Tenuate
Buy Micardis
Order Ashwagandha
Purchase Viramune
Purchase Ophthacare
Purchase Himplasia
Order Tenuate
Cheap Loxitane
Purchase Purinethol
Purchase Cheap
Purchase Coreg
Buy Vytorin
Order Bactroban
Cheap Meridia
Buy Zyprexa
Female Sexual
Buy Bonnisan
Buy Effects
Purchase Zebeta
Cheap Ophthacare
Order Retin-A
Cheap Trimox
Cheap Evecare
Order Requip
Purchase Bactroban
Order Cipro
Cheap Prilosec
Order Watson
Cheap Zetia
Cheap Carisoprodol
Order Dilantin
Buy Flomax
Buy Exelon
Order Acyclovir
Male Enhancement
Buy Xenacore
Purchase Tenuate
Order Neurontin
Cheap Diazepam
Purchase Diflucan
Order Lamisil
Buy Loprox
Buy Cialis
Cheap Diarex
Order Trimox
Cheap Koflet
Buy Reosto
Purchase Vicodin
Cheap Arava
Buy Nolvadex
Buy Celebrex
Buy Aceon
Buy Aricept
Purchase Avandamet
Buy Premarin
Cheap Purinethol
Buy Lincocin
Cheap Micardis
Cheap Himcospaz
Cheap Brahmi
Order Calan
Purchase Prometrium
Purchase Phentrimine
Penis Growth
Buy Feldene
Order Chitosan
Buy Prometrium
Order Seroquel
Purchase Cipro
Buy Isoptin
Cheap Pilex
Buy Prograf
Order Triphala
Purchase Leukeran
Purchase StretchNil
Purchase Casodex
Cheap Penisole
Buy Rumalaya
Cheap Mycelex-G
Order Aceon
Purchase Plavix
Purchase Inderal
Purchase Glucophage
Purchase Altace
Buy Urispas
Cheap Mentat
Purchase Tulasi
Buy Emsam
Cheap Aristocort
Cheap Atacand
Buy Trazodone
Buy Maxaquin
Buy Requip
Purchase Xeloda
Purchase Norco
Buy Aleve
Purchase Sildenafil
Order Azulfidine
Purchase Aceon
Cheap Xanax
Cheap Lukol
Order Ophthacare
Cheap Zelnorm
Order Ansaid
Cheap Pletal
Buy Shallaki
Order Lasix
Purchase Brafix
Purchase Didronel
Buy Tenuate
Cheap Retin-A
Buy Leukeran
Cheap Acyclovir
Glucotrol XL
Buy Prinivil
Buy Trimox
Cheap Cystone
Order Lanoxin
Order Serevent
Purchase Cyklokapron
Buy Diakof
Buy Evecare
Purchase Avapro
Cheap Trandate
Purchase Vantin
Buy Coumadin
Buy Menosan
Order Shallaki
Purchase Clarina
Buy Vasotec
Buy Singulair
Cheap Levaquin
Order Exelon
Order Paxil
Cheap Soma
Cheap Famvir
Cheap Avandamet
Herbal Phentermine
Purchase High
Buy Starlix
Order Amaryl
Purchase Rocaltrol
Purchase Adderall
Purchase Premarin
Purchase Lasix
Cheap Zocor
Cheap Nexium
Purchase Lisinopril
Cheap Glucophage
Purchase Ventolin
Purchase Lexapro
Cheap Prandin
Order Adalat
Buy Ismo
Buy Arava
Purchase Zantac
Purchase Femara
Cheap Shoot
Purchase Elavil
Purchase Levitra
Order Diazepam
Buy Femara
Buy Himcospaz
Order Zelnorm
Cheap Geodon
Cheap Tenuates
Purchase Clonazepam
Order Hyzaar
Cheap Geriforte
Purchase Sorbitrate
Buy Atrovent
Order Soma
Buy Prednisone
Order Ionamin
Cheapest Generic
Cheap Maxaquin
Order Xenacore
Buy Ultram
Cheap Lozol
Purchase Prilosec
Cheap Sumycin
Buy Zithromax
Buy Online
Purchase Tricor
Cheap Rimonabant
Purchase Soma
Cheap Ashwagandha
Cheap Diakof
Order Rimonabant
Buy Acticin
Buy Carisoprodol
Cheap Loprox
Buy Accutane
Buy Triphala
Cheap Brafix
Cheap Oxycontin
Purchase Prinivil
Purchase Serophene
Buy Dosages
Cheap Allegra
Buy Nonoxinol
Women Attracting
Buy Endep
Purchase Sarafem
Order Rogaine
Buy Propecia
Cheap Prinivil
Buy Flovent
Order Valium
Order Rhinocort
Buy Nicotinell
Buy Himplasia
Buy Relafen
Buy Sumycin
Buy Oxycontin
Purchase Requip
Order Ephedrine
Buy Percocet
Order Zyprexa
Cheap Flexeril
Buy Bupropion
Buy Aristocort
Cheap Biaxin
Cheap Arimidex
Cheap Himplasia
Order Penisole
Acne-n-Pimple Cream
Purchase Revia
Purchase Lotrisone
Purchase Lamictal
Order Nicotinell
Order Flomax
Order Leukeran
Order Accutane
Buy Avapro
Purchase Naprosyn
Purchase Nizoral

Google-Ranking the 50 States

I was thinking this morning about a statistic that I once heard. It stated that the probability of Texas coming up in any given conversation was above 50%. I don’t know if this is actually true, but I think it has some truthiness to it.
This made me wonder about the popularity of the individual 50 states in Google’s index, so I did some quick checking. Here are the top 5 states, with their result count:

California 2,750,000,000
New York 2,450,000,000
Texas 1,340,000,000
Massachusetts 1,170,000,000
Washington 1,030,000,000

Nothing too astonishing there. Texas is a distant 3rd, after New York. Washington made the top 5. I excluded results with “D.C.” and “DC” , but it may be that Washington is still benefitting significantly from our first President and the many things honoring his name.

Here are the bottom 5:

Wyoming 316,000,000
Vermont 294,000,000
West Virginia 286,000,000
North Dakota 278,000,000
South Dakota 254,000,000

Sorry, South Dakota. You got your hide tanned by states with much smaller populations.

I was a little surprised that Virginia ranks 29th (several steps behind even Hawaii and Alaska), given that it’s the “.com capital of the world”, right? ;-)

Diff Classes in 2 Jar Files

I had the need to get an overview of the differences between 2 jar files, so I created a simple Ruby script that simply wraps the output of jar, javap, and diff (I’m using Cygwin diff on WinXP).

Here’s jardiff.rb:

#! /usr/bin/ruby

if ARGV.size !=2
  puts “USAGE: ruby jardiff.rb “
  puts “\nNOTE: ‘diff’ command must be on the path and JAVA_HOME environment variable must point to a valid JDK install”

# —————————————————————————–

# check arguments
if (!File.exists? jar1)
 print “#{jar1} can’t be found”

if (!File.exists? jar2)
 print “#{jar2} can’t be found”

# —————————————————————————–

# constants, exec commands : customize, if you wish

JAR_CMD=“#{JAVA_HOME}/bin/jar tf”
JAVAP_CMD=“#{JAVA_HOME}/bin/javap -public”
# diff currently assumed to be on the path
DIFF_CMD=“diff -wBW #{WIDTH}”

# —————————————————————————–

require “Tempfile”

# Utility functions

# wrapper around diff
def filediff(f1, f2)
  #print “filediff #{f1} #{f2}\n”
  `#{DIFF_CMD} #{f1} #{f2}`

# wrapper around jar tf
def get_jar_classes (jar_file)
  `#{JAR_CMD} #{jar_file}`.reject { |v| !v.match(/\.class$/) }.collect { |v|“/”,“.”).sub(“.class”, “”) }.sort

# wrapper around javap
def javap(jar_file,class_name)
  `#{JAVAP_CMD} -classpath #{jar_file} #{class_name}`

# wrapper around Tempfile : returns tempfile or block value
# ? don’t know why doesn’t return the block value
def tmpfile()
  result = tf =“jardiff”)
  if block_given?
      result = yield tf
      tf.close unless tf.nil?

# —————————————————————————–

print “Comparing classes in #{jar1} with those in #{jar2}\n”

# examine the jar files, pull out a list of class names from each
classes1 = get_jar_classes jar1
classes2 = get_jar_classes jar2

f1 = tmpfile() { |f| f.puts(classes1.join(“\n”)); f.path }
f2 = tmpfile() { |f| f.puts(classes2.join(“\n”)); f.path }

diff = filediff(f1, f2)
if (diff.strip.length > 0)
  print “#{HR}\n#{“*** Differences ***“.center(WIDTH)}\n#{diff}#{HR}\n”

# —————————————————————————–

same_list = (classes1&classes2).sort

print “Comparing method signatures for #{same_list.size} classes\n”

# diff each class that occurs in both jars

same_list.each do |cn|
  f1 = tmpfile() { |f| f.puts javap(jar1, cn); f.path }
  f2 = tmpfile() { |f| f.puts javap(jar2, cn); f.path }
  diff = filediff(f1, f2)
  if (diff.strip.length > 0)
    print “#{HR}\n#{“*** Differences in #{cn} ***”.center(WIDTH)}\n#{diff}#{HR}\n”

# —————————————————————————–

Oracle SQL Developer 1.0 Released

It looks like Oracle’s Project Raptor has graduated and become SQL Developer 1.0.
I really don’t know what took Oracle so long to come up with their own tools. I’m somewhat surprised that they didn’t just purchase Quest Software (given their recent buying spree) and package TOAD with the database.

Regardless, Raptor SQL Developer is quite nice for my needs and a bargain to boot!

BTW: You can import your connections from an older Raptor install if you right-click the Connections tree item, select “Import Connections…”, and select [Raptor-Install]/jdev/system/oracle.onlinedb.

Migrated from Blogger to WordPress

So, along with changing web hosts, I have moved from Blogger to WordPress. Dreamhost had a simple 1-click installer for WP 2.0, plus WP 2.0 has an amazingly simple Blogger importer. It logs into Blogger, tweaks your template, republishes, parses the newly-generated pages, and imports them into WP posts.


The only thing I’ve noticed so far that the importer missed was my site subtitle (“Ridiculous ideas. Insightful comments. Blank verse.”), so I changed via the WP admin screens.

Of course, now I have to go through my old posts, which are all “Uncategorized”. Plus, I’ve [temporarily] lost my Google Adsense, my link roll, and of course my hideousbeautiful old template. Still, the ability to have more control over the site is worth it. And WordPress r0X0rs!

Moved to Dreamhost

I have changed hosts from to Dreamhost. I was using the free professional preview package from 1and1, but I think it was going to expire soon. Plus, there was a pretty good Dreamhost code: ‘DREAM77’ to save $77 off a yearly plan.

I had to change my nameservers with my domain registrar (GoDaddy). Took a while for updated NS and MX records to propagate, but they seem OK now.
Dreamhost has some nice 1 click installs. One of which is the WordPress 2.0 install. More on that later…

Full disclosure: Yes, my links to Dreamhost are referral links. Dreamhost Dreamhost Dreamhost ;-P

Ruby on an iPAQ Pocket PC

  1. Download SymbolicTools PocketConsole here.
  2. Download SymbolicTools PocketCMD here.
  3. Install PocketConsole and PocketCMD. Cradle the iPAQ. When install is complete, reboot/reset the device.
  4. Confirm that you have an operational command prompt by clicking the PocketCMD program icon:

  5. Download Ruby for wince binary here.
  6. Extract the ruby-mswince archive to a directory on your desktop PC.
  7. Create a root-level directory named ‘\ruby’ on the iPAQ.
  8. Copy the contents of the arm-ppc-wince directory (from the extracted archive) to the \ruby directory on the iPAQ.
  9. in PocketCMD, set the PATH environment variable to include \ruby\bin:

  10. Verify that Ruby works:

  11. Try to take over the world!

Ruby, Java, Monkeys, and Bananas

This whole Ruby v. Java, humane v. minimalist monkey knife fight reminds me of the debate over the correct way to peel a banana.

For the uninitiated: you can peel from the end with the stem (this is the traditional way to do it), or you can peel from the end without the stem (this is the way most monkeys do it).

The stem end is appealing (pun not intended, but I’ll take it anyway), because there is a convenient handle/lever to use. Just bend it down to break the “seal” and peel away. This works pretty well for a ripe banana, but not so well for a green one (you end up with banana mash).

Peeling from the non-stem end is probably the faster way to do it, on average (in case you’re ever in a banana-peeling contest). I haven’t tested it, but I’m more inclined to think that monkeys have come up with the more efficient approach.

There are problems with peeling from the non-stem end: that’s the end that typically gets “bruised”. So what do you do with the yucky brown part of the banana? If you had only peeled from the other end, you could have just aborted consumption and disposed of the unappetizing remnant with the peel.

So… what is the correct way to peel a banana? Maybe it depends on the individual banana. Maybe green bananas should be peeled from the non-stem end (do green bananas have fewer bruises?) and ripe bananas using the stem.

I’m accustomed to using the stem, but I’m not opposed to experimenting with new technologies :-).

I don’t want to draw too many parallels between banana peeling methods and humane v. minimalist programming languages. I will say that knowing that there is more than one way to peel a banana and that each method can provide a useful banana experience has enriched my life immensely.

I wonder if there is yet another undiscovered banana-peeling method…

UPDATE 29-Dec-2005: and once you’ve decided how to peel your banana look here.