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)