11 August, 2007

I Knew It!

God currently only works on Linux, BSD, and Darwin systems. No support for Windows is planned.

As documented here.

12 April, 2007

My Firefox Add-ons

I hate having to find all these again every time I move to a new machine. So here they are. Have any favorites of your own to share?

05 February, 2007

Don't Over-Work Your Swing Thread

I know at least three different teams that I've worked with in the past that screw up Swing thread handling. Frankly, they should all know better. People, there is no such thing as a single-threaded Java Swing application. Fortunately, the Java 6 standard library is getting an addition that should help developers with this problem: the SwingWorker API.

One common mistake of desktop application programmers is misusing the Swing event dispatch thread (EDT). They either unknowingly access user interface (UI) components from non-UI threads or simply disregard the consequences. The result is that applications become unresponsive or sluggish because they perform long-running tasks on the EDT instead of on separate worker threads. Long-running computations or input/output (I/O) bound tasks should never run on the Swing EDT. Finding problematic code may not always be simple, but the Java Platform, Standard Edition 6 (Java SE 6) makes it easier to fix such code by providing the javax.swing.SwingWorker class.

One of the reasons I tend to prefer SWT over Swing is that it seems to be better about throwing nasty exceptions when you try and step over the UI thread. Neither is perfect, but I tend to get more exceptions when I do stupid stuff in SWT. If I do something stupid in Swing, I get a grey box and a frozen UI.

22 January, 2007

Are Soldiers not Human?

From this article on a special RFID tattoo ink:

The ink also could be used to track and rescue soldiers, Pydynowski said.

"It could help identify friends or foes, prevent friendly fire, and help save soldiers' lives," he said. "It's a very scary proposition when you're dealing with humans, but with military personnel, we're talking about saving soldiers' lives and it may be something worthwhile."

Excuse me? Did that person just imply that soldiers aren't human? I can't believe someone is considering tagging soldiers like livestock.

Via Bruce Schneier.

Elsewhere, apparently I'm not grateful enough. I suppose that's true; I'll have to work on that.

12 January, 2007

You're Right, Pachelbel Should Sue

When I read about this video over on the always entertaining Wondermark, I thought it was in reference to the cellular ring-tone. It turns out that cell phones are not the only place where Pachelbel's Canon in D has infected our lives.

This Rob Paravonian fellow reminds me of Wally Pleasant. I like him.

11 January, 2007

Fun with HTTP

The HTTP protocol specification can be a bit daunting and I was curious what the data in a POST request looks like. So, just for fun, I dumped out a little Ruby WEBrick servlet program that returns the contents of any HTTP GET or POST requests it receives. It looks like this:

#!/usr/bin/env ruby
#
#  Created by Toby Tripp on 2007-01-11.

require 'webrick'

class PostDumper <
  WEBrick::HTTPServlet::AbstractServlet
  
  # Reload file for each request, instantly
  # updating the server with code changes 
  # without needing a restart.
  #
  def PostDumper.get_instance( config, *options )
    load __FILE__
    PostDumper.new config, *options
  end
  
  def do_GET( request, response )
    response.status = 200
    response['Content-Type'] = "text/plain"
    response.body = dump_request( request )
  end
  
  def do_POST( request, response )
    response.status = 200
    response['Content-Type'] = "text/plain"
    response.body = dump_request( request )
    response.body << request.body
  end
  
  def dump_request( request )
    request.request_line << "\r\n" <<
      request.raw_header.join( "" ) << "\r\n"
  end
end

if __FILE__ == $0
  port = (ARGV[0] || 2000)
  server = WEBrick::HTTPServer.new(
     :Port => port,
     :DocumentRoot => File.join( Dir.pwd, "/html" )
   )
  server.mount "/dump", PostDumper
  trap( "INT" ) { server.shutdown }
  server.start
end

If I run the above and point my browser at http://localhost:2000/dump I get:

GET /dump HTTP/1.1

Host: localhost:2000
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

I've also got a little html form that points to the same URL for its action. Submitting that form gives me:

POST /dump HTTP/1.1

Host: localhost:2000
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:2000/form.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 85

submit=Submit&text_input=Single+line+text&file_input=&textarea=Multi-line+text+input.

There! It turns out that POST data is just key/value pairs that are url-encoded. Each pair is separated by an ampersand.

The response from the server can also be instructive. If I use telnet to generate a GET request:

~$ telnet localhost 2000
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK 
Last-Modified: Thu, 11 Jan 2007 16:36:39 GMT
Connection: Keep-Alive
Date: Thu, 11 Jan 2007 20:09:56 GMT
Content-Type: text/html
Etag: 2a8766-169-45a66797
Server: WEBrick/1.3.1 (Ruby/1.8.2/2004-12-25)
Content-Length: 361

[...]

There's the response from the server. One thing that this program can't show you concerning the HTTP protocol: lines are terminated with the '\r\n' character sequence. This includes the blank lines, which are important to the protocol. A blank line separates the header (including the request line) from the content.

There you have it: a WEBrick servlet in less than 50 lines of code. Did I miss anything?

The Power of Editing

I found this entertaining:

Someone should market these as a way to avoid having to go see certain movies. ... but Honey, Mary Poppins is a horror film. Have you seen this trailer?

09 January, 2007

Wow, It Started Early

So, we're comparing apples to oranges already?

So, I've been passing the time at a local XP shop recently. Finally, a group that does TDD, Continuous Integration, and the like without me having to evangelize it constantly. It hasn't all been roses and fluffy unicorns, though. I'll comment further on another day.

Update: iPhone's downfall (bummer it's only Cingular now, too)