BlogMatrix
 

Websphincter the gift that keeps on giving!

edit Tim Desjardins 2008-05-29 05:18 UTC add comment

Honestly, could IBM make a product any more complicated? To download websphincter for linux and windows requires 9GB of disk space, thats Gigabyte with a capital G. Core blind me, I'm 17% through the down load and just 139 hours left to go. I'm not joking, I wish I were, and IBM chooses such clever and meaningful names for the downloads like C18BRML.zip, WTF, I'm sorry I left my rosetta stone up your asshole. Needless to say, I'm sure more fun will ensue.

Fedora Core 9, Dead on arival

edit Tim Desjardins 2008-05-29 05:11 UTC 1  comment  ·  ·

I like Fedora/Red Hat it's the only linux distro I've used in the last 5 years, but Core 9 is DOA. Any OS that doesn't properly start its networking (and I'm not the only one to experience this) doesn't make the grade. I've now down graded to Core 8 which seems much more stable (is Fedora turning into the Star Trek franchise?) Core 9 looks nice, but I'm going to wait for 10 after this experience, namely "no networking", start the network via /etc/init.d/network and then login, guess what the UI doesn't recognize the active network, and I say piss of.

Your first clue that Microsoft's TCO is more expensive than Linux

edit Tim Desjardins 2008-03-13 04:54 UTC add comment  ·  ·  ·

This poor guy is complaining about how hosting sites that offer Microsoft based hosting are more expensive than LAMP, no really, and herein lies that real proof that MS claims about Windows TCO being lower than Linux are exposted for the marketing lies that  they are.

The killing rates of " Windows Web Hosting " and additional charges for " SQL Server " with many unexplained cache in calculations, were the main reasons to add frustration in proceeding further with the Microsoft Career.

Via:  http://ironruby.blogspot.com/2008/03/windows-hosting-rates-are-killing.html

Bigger is Better when it comes to displays

edit Tim Desjardins 2008-03-12 15:50 UTC add comment  ·

This isn't the first study I've seen on this topic of productivity is proportional to your screen real estate, but it dows put a price on this productivity.

Can you see your way to wasting less time? One new study says yes: Organizations that upgrade their employees' standard-format monitors to widescreen displays can realize productivity gains equivalent to 76 extra work days a year per worker, as well as annual cost savings of more than $8,600 per staff member, according to a recent survey. (That math assumes a staffer who makes $32,500 annually.) 

CIO: http://www.cio.com/article/194501 

MAC Address Java Applet

edit Tim Desjardins 2008-02-11 17:36 UTC 1  comment  ·  ·  ·  ·

See the link below for source and what is more or less a toy applet to demonstrate sniffing the MAC Address(es) of a machine from the browser. The HTML illustrates the simplest (albeit hackish) approach for cross browser support. I've tested this with FF 2.x, IE 5-7 and Safari 3.x on Windows, unfortunately Leopard doesn't support Java 6 yet. This solution will only work with Java 6, I do no checking in the code for this fact, it's a demonstration after all.

One thing is for sure, IE treats Java as a third class citizen, I've done some timings: FireFox averages  10.5 seconds to start the Java plugin (which is barely acceptable), but IE is terrible with an average startup time of 31.8 seconds this is after clicking through the two levels of dialog about how this applet is insecure and may destroy your system, "oh the humanity" of course this can be turned off, but the default for most folks is to try and scare the pants of you.

You can find the package and source here:

http://www.softwaresamurai.com/Agwego/mac/macaddressapplet-1.0.tar.gz 

Toronto DemoCamp 17

edit Tim Desjardins 2008-02-07 23:17 UTC add comment
February 25, 2008 at 06:00 PM (2 hours)
The board of Trade
Locations Related by Tags
 1.   Democamp 13
Democamp 13
No Regrets, 42 mowat ave
toronto, on
 2.   Mesh Meet-up
Mesh Meet-up
The Charlotte Room, 19 Charlotte Street
Toronto, Ontario
Canada M5V 2H5
 3.   Toronto Demo Camp
Toronto Demo Camp
No Regrets, 42 Mowat Ave
Toronto, Ontario
Canada
 4.   Toronto Demo Camp 16
 5.   Toronto DemoCamp 17
 6.   Upcoming: Mashup Camp 3

Versioning SQL and database scripts.

edit Tim Desjardins 2008-02-06 17:34 UTC add comment  ·

I generally agree with this article, except for the fact that developers should be applying schema patches in the course of regular development.

Managing change with your database yields a great many benefits. Since the schema change scripts are in source control, you can recreate your database as it looked at any point in time. Is a customer reporting a bug on build 3.1.5.6723? Pull the source code tagged or labeled with that version number and run the baseline, then all schema change scripts included in the tag. You now have the same database and have a much better chance to recreate the bug. Also, changes move from development to test, and ultimately into production in a consistent, orderly, and reproducible manner.

This is a bad precedent and if you get lazy and don't apply the schema changes to the original schema you're soon going to run into problems where the only source for table definition will be the database itself, a very bad situation for developers (that's why you have version control in the first place, tag your schema changes) Yes you need these schema migration files for production systems and they of course need to be tested, but developers should always be building their development database from source and never applying schema updates unless they are testing them.

I recently finished working at a place where the DBA had set up such a scheme when I left there were 22 schema updates (that spanned 7 years) that had to be applied, in some cases the original table definition barely resembled the updated version and the updates were scattered through 22 different files truly brain damaging.

So in conclusion keep all your DB artifacts in separate files, for me that includes tables, triggers(rarely use them), indexes, stored procs, ... I would go as far as keeping the schema changes in separate files based on the artifact they are responsible for updating, all relatively easy to script. ALWAYS UPDATE YOUR BASELINE with the schema changes.

Java Applets: Web 2.0's retarted step-child

edit Tim Desjardins 2008-02-06 17:07 UTC add comment  ·  ·

They are still supported but Sun's documentation has gone to pot. There's almost nothing out there describing implementing applets with Java SE 6. Sure there are a lot of examples with 1.4, but the world has changed modern browsers and W3C have deprecated the applet tag, and if you're trying to do something like interact with your applet via javascript there's almost nothing discussing this and of course the old Applet tag is broken in "Modern" browsers, and although there are 20 examples they all seem to be toys with respect to Web 2.0, namely they are still using the applet tag, thanks for coming out.

Here's what I've come up with for embedding applets and interacting with them via javascript, it's a bit hackish but it has the cleanest/simplest code I could come up with.

    <!--[if !IE]> Firefox and others will use outer object -->
    <embed type="application/x-java-applet"
           name="mac_address_applet"
           width="0"
           height="0"
           code="com.yourco.MacAddressApplet"
           archive="macaddress.jar"
           pluginspage="http://java.sun.com/javase/downloads/index.jsp"
           style="position:absolute; top:-1000px; left:-1000px;">
        <noembed>
        <!--<![endif]-->
            <!---->
            <object classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"
type="application/x-java-applet"
name="mac_address_applet"
style="position:absolute; top:-1000px; left:-1000px;"
                    >
                <param name="code" value="com.yourco.MacAddressApplet">
                <param name="archive" value="macaddress.jar" >
                <param name="mayscript" value="true">
                <param name="scriptable" value="true">
                <param name="width" value="0">
                <param name="height" value="0">
              </object>
        <!--[if !IE]> Firefox and others will use outer object -->
        </noembed>
    </embed>
    <!--<![endif]-->

Once I've repackaged the applet which "sniffs" the first MAC Address of any interface on your machine, which I guess could come in handy from time to time.

Installing Java - what a pain

edit Tim Desjardins 2008-01-31 17:12 UTC add comment  ·

If you ask me the Java installer is broken, at least from a usability perspective.

Here's a breif list:

  • You have to install demos and samples (I don't want them installed)
  • The installer spawns at least one other installer (this installer doesn't pick up the path from the previous install, very dum)
  • Even though you want to install things in some place other than  "Program Files" the  JavaDB is  installed there (idiots)
  • If you grab the Java EE + SD, it doesn't install the JRE, WTF, so I'm not going the other route install the JRE/JDK and then install Java EE
  • I'm probably going to uninstall JavaDB and download the standalone installer to install it again (sheesh)
  • The JavaDB (any platform) installer isn't one, just a zip, somehow I find this more comforting (but the download page lists Windows 2000 as one of the options, what is this 1999?)
  • Too many options on their download page Java EE/JDK Update 3/Net Beans blah blah blah http://developers.sun.com/downloads/

Sun, do yourself a favour (and everyone else at the same time) and get your act together.

Expanding A VMWare Client Disk

edit Tim Desjardins 2008-01-20 16:51 UTC 3 comments  ·  ·  ·  ·  ·  ·

I've become a big fan of vmware, but if you undersize a virtual disk and need to expand it on Linux, brace yourself for about an hours worth of work (at minimum.)

Here's the process I eventually followed (this seems way too hard/complicated)

  • BACKUP up your virtual machine!!!
  • expand the virtual disk:
    vmware-vdiskmanager -x 16GB myDisk.vmdk
    
for instance this will size myDisk to 16GB (this size isn't additive it's an absolute size)
  • Now you must boot your virtual machine into DOS or some OS that will recognize your disk, I went the BartPE route and added the vmware scsi driver so it would recognize the scsi disk. I couldn't find the actual scsi driver on the web fotunately I had a copy of the VMWare Converter which contains a copy of the drivers. You can follow the instructions at this site but the driver that is offered is incomplete.
  • Once you've booted BartPE start diskpart and issue the following commands:
    • diskpart> list disk
    • diskpart> list volume
    • diskpart> select volumen=n
    • diskpart> extend
    • diskpart> exit
  • Reboot the virtual machine, restarting Fedora (or your brand of Linux)
  • Start the Linux Volume Manager (lvm)
    • Find the physical volume with lvm> pvscan
    • Resize the physical volume lvm> pvresize /dev/sda?
    • Resize the logical volume lvm>  lvresize -L 14G /dev/VolGroup01/LogVol00
    • lvm> exit
  • Finally resize your filesystem with (on Fedora, other brands of linux may have a different command):
root# resize2fs /dev/mapper/VolGroup00-LogVol00
  • Sheesh, that was a lot of work, the procedure for windows seems slightly easier, but I couldn't find all this information easily in one place for Fedora/Linux, good luck.

Converting epoch to date and vice versa

edit Tim Desjardins 2007-12-06 17:21 UTC add comment  ·  ·

I've been doing a lot of date related things in Java recently, and having an independent tool to generate sane test data is very handy.

Try it here: http://www.esqsoft.com/javascript_examples/date-to-epoch.htm 

Also includes free Javascript, nice.

Also check out thisother java script date library.

http://www.ajaxian.com/archives/mad-cool-date-library 

The original reference is good for near dates but seems to drift quite a bit for dates way in the future. The following link seems to do a very good job of date caclulations, plus it includes a number of rather unusual calendars and things like MS-Excel date serial numbers, very handy.

http://www.fourmilab.ch/documents/calendar/

Toronto Demo Camp 16

edit Tim Desjardins 2007-12-03 20:34 UTC 1  comment  ·
December 03, 2007 at 06:00 PM (1 hour)
Toronto Board of Trade, 1 First Canadian Place, Toronto, Ontario M5X 1C1

Tonight is Toronto Demo Camp 16, there are still free seats available:

http://democamp.eventbrite.com/ 

Location
Toronto Board of Trade
1 First Canadian Place
Toronto, Ontario M5X 1C1
Canada

Locations Related by Tags
 1.   Democamp 13
Democamp 13
No Regrets, 42 mowat ave
toronto, on
 2.   Toronto Demo Camp 16

An awesome customer service experience!

edit Tim Desjardins 2007-11-22 01:39 UTC add comment

It is so rare to have an awesome customer service experience; I have to share this one.

I came home Friday night to find my computers in my office all shut off and the damn replace battery alarm beeping every five seconds on my UPS (highly annoying.) So it was time to order some new batteries, I went to APC(Canada) and ordered the replacement batteries via CDW, and then tried to figure out how to stop the infernal beeping (which took nearly 3 hours and 2 bourbons.) On Monday morning I got a call from a very nice person Natashe informing me that I had placed my order with the CDW US and not CDW Canada, but that she had canceled my order in the US and placed a new order here in Canada and that my batteries would arrive tomorrow. This is jaw dropping amazing service as far as I'm concerned, and my batteries arrived around 10am on Tuesday.

Three cheers for CDW the left hand really knows what the right hand is doing and thanks again.

Esoteric Ant Hacks

edit Tim Desjardins 2007-11-13 20:12 UTC add comment  ·  ·

When debugging ant build scripts (fun wow,) sometimes you want to view the contents of a path reference, this handy hack does just the trick:

<echo message="${toString:pathref}"/>

It probably also works for other "classes" as well.

After a little more digging around (my ant is a little rusty) the proper way to do this is to convert your path reference to a property:

<property name="class.path" refid="class.path.ref"/>  

Finally a little sugar to print out your classpath in a human readble form:

<!-- pretty print the class path so it is human readable -->
<macrodef name=\"print_classpath\">
 <attribute name=\"path\"></attribute>
 <attribute name=\"description\" default=\"=== CLASSPATH ===\"></attribute>
 <sequential>
    <echo>@{description}</echo>
    <for list=\"@{path}\" param=\"pathitem\" delimiter=\";\">
       <sequential>
          <echo>pathitem == @{pathitem}${line.separator}</echo>
       </sequential>
    </for>
    </sequential>
</macrodef>

Note you will need the for loop from ant contrib to use this macro/task

<<taskdef resource=\"net/sf/antcontrib/antlib.xml\" classpathref=\"ant.classpath.tools.lib\">

Coding Horror

edit Tim Desjardins 2007-11-12 04:58 UTC 4 comments  ·

Given the rate that I'm running accross these little horrors, this may become a regular post.

public static String trimLeadingZeros( String trimString )
{
         String retVal = trimString;
         boolean nonZeroFound = false;
         StringBuffer rtnString = new StringBuffer();
         if ( trimString != null ) {
                  for ( int index = 0; index < trimString.length(); index++ ) {
                                char c = trimString.charAt( index );
                                if ( c == '0' && nonZeroFound == false ) {
                                         // skip all leading zeros
                                } else {
                                         nonZeroFound = true;
                                         rtnString.append( c );
                                }
                  }
         }
         if ( rtnString.length() > 0 ) {
                  retVal = rtnString.toString();
         }

         return retVal;
}

Obviously this person doesn't have a degree in computer science or they failed out.

  • The have an empty if statement, what you're not capable of doing the necessary boolean algebra in your head to invert the conditional, give me a break
  • Hey lets scan every character whether you need to or not, making this O(n) where n is the total number of charaters in all strings being scanned (sheesh)
  • How many damn variables do you need to do this 5! Could we make this any more complex
  • The real shame is that the JDK doesn't have a general strip/trim function, they have a trim whitespace, so why not generalize it.

So in about 5 minutes I put a more general  version together which O(f(x)) << O(n), in the general case my version is 2.5 times faster than the horror. For the pathalogical case my versio is only.8 time faster, and for the ideal case we're 3 times faster. This was all done over 1 million iterations using the same string that was 20 characters long.

public static String trimLeadingChar( String trimString, char trimChar )
{
        try {
                String tempString = trimString;
                int offset = 0;
                while( tempString.indexOf( trimChar, offset ) == offset )
                        offset++;

                tempString = tempString.substring( offset );

                if( tempString.length() == offset )
                        return trimString;

                return tempString;
        } catch( NullPointerException ex ) {
                return trimString;
        }
}

I'm using a very Pythonic idom here, which is to not care about the NullPointerException, so instead of explicitly checking for trimString == null, we just catch the excetption and do no harm. I could have made the while loop empty, but frakly I find that a little bit vulgar.

Coding Horror

edit Tim Desjardins 2007-11-03 04:45 UTC add comment  ·

I ran across this gem today...

static public Date getYesturdaysDate() {
        Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24);
        return yesterday;
}

All I can say is WTF? How does something like this get through and then hang around without being cleaned up.

WebSiteGrader is pretty handy

edit Tim Desjardins 2007-10-07 18:23 UTC add comment  ·  ·  ·  ·  ·  ·

This is a great site for getting the measure of your site via a series of very common metrics all in one place. What I really like, is that WebSiteGrader red flags omissions in your page content and design.

If covers:  google, alexa, technorati, yahoo, delicious

See it here: http://www.websitegrader.com/ 

Seen via Social Media Today

YUI why do you tempt me so?

edit Tim Desjardins 2007-10-02 02:30 UTC add comment  ·  ·  ·  ·  ·

I've been trying to use the YUI web tools and I have to say it isn't easy. So far I haven't been able to get one of their menu examples to work inside my web app. They work fine in their simple example files, but I haven't been able to incorporate one of the examples so far. Deeply frustrating, anyways I'll poke around to see if I can find a simpler toolkit or perhaps role my own if I get desperate enough.

One thing that would be nice, is to have an integration guide for YUI, with emphasis on CSS and Javascript gotcha's. Also almost every example I look at has a different group of CSS/JS files, and I know that YUI is a quickly evolving toolkit and that segmenting CSS and JS files makes for better download performance, but both of these factors really steepen the learning curve.