12 December 2005

DarwinPorts libiconv Upgrade


DarwinPortsport upgrade libiconv


ld: warning suggest use of -bind_at_load, as lazy binding may result in errors
or different symbols being used
symbol _locale_charset used from dynamic library
/usr/pkg/lib/libiconv.dylib(localcharset.o) not from earlier dynamic library
/usr/pkg/lib/libintl.3.dylib(localcharset.o)
this bug

sudo port -f uninstall libiconv
sudo port clean --build libiconv
sudo port -f install libiconv

And everyone lived happily ever after…


21 November 2005

Rails with Apache MPM worker


The existing instructions for Typo on FreeBSD presume that you’re running lighttpd and Apache httpd with mod_proxy. This is unnecessary and, generally speaking, more complicated than what most people need. It turns out you can serve your Rails app, legacy PHP pages and static content just fine with just one webserver installed. This can also help save memory (my own motivation), by running PHP as a FastCGI process rather than embedding it in every Apache MPM prefork process.

It seems like many users aren’t aware that there is any option beside MPM prefork for Apache httpd. Starting with Apache httpd 2 you can choose different multi-processing models. One of these is MPM worker, which keeps not only multiple processes, but also uses several threads to handle requests.

Threads complicate matters with things that are not typically thread-safe like mod_php, mod_perl, and many other programming language Apache modules. Luckily FastCGI can move this work outside of the httpd process where it can be handled outside of these threading concerns.

Before I wander into the exact details of configuring this setup, a word about performance: Super. MPM worker does a fabulous job serving static and dynamic content quickly. In addition, memory consumption is much easier to control since the FastCGI processes associated with each language or Rails application can be independently controlled and tuned to the traffic they’re seeing.

Installing the Pieces

I put the following into my /etc/make.conf to make sure the components are built correctly:


WITH_APACHE2=YES
WITH_MPM=worker
WITH_KQUEUE_SUPPORT=YES
WITH_FASTCGI=YES

Next, the correct ports have to be built. The packages are listed below along with their origin (that is, where to find them in the FreeBSD ports collection). Building the things below with the options above will be different on other systems.


































Package Origin
apache-worker-2.0.54_4 www/apache2
rubygem-rails-0.13.1 www/rubygems-rails
mod_fastcgi-2.4.2 www/mod_fastcgi
ruby18-fcgi-0.8.6 www/ruby-fcgi
ruby18-sqlite-2.2.3 databases/ruby-sqlite
ruby18-postgres-0.7.1_2 databases/ruby-postgres
ruby18-mysql-2.6 databases/ruby-mysql

You only need the database package relevant to the database you want to be using; which one you should not use is a rant for another day, today I’m going to use sqlite. There may be newer versions of these packages available by the time you read this.

For this example, we’ll unzip/untar the latest typo release into /usr/local/www/data.

Configuring the components

First, I’m going to get the Typo install configured. This is simply building the database with sudo -u www sqlite db/typo.sqlite.db < db/schema.sqlite.sql and then changing my config/database.yml to contain:


login: &login
adapter: sqlite
dbfile: db/typo.sqlite.db

development:
<<: *login

test:
<<: *login

production:
<<: *login

A quick run with script/server will indicate if things are working correctly with the Rails application. I had to comment out a line in config/environment.rb to get it to run (and have filed a bug about it).

I also check at this point if public/dispatch.fcgi will run correctly from within Apache httpd. Generally the PATH used by Apache httpd will not include the ruby executable, so I change the /usr/bin/env ruby at the top of public/dispatch.fcgi to /usr/local/bin/ruby.

Now I’ll configure Apache httpd. The default values for MPM worker are quite reasonable, so I’ll leave them alone. You’ll find them near the text <IfModule worker.c> along with a comment about what the settings do.

Setting ServerName is usually a good idea right about now. Remember that this needs to be a real name that points at this server.

In order for Apache to use the FastCGI module, it’ll need to know that I want it to be loaded. At the end of all the lines that start with LoadModule we’ll want to add the FastCGI module with:

LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so

Next, move the DocumentRoot into Rails application by changing it to "/usr/local/www/data/typo/public"

Lastly, after the line with DocumentRoot I add lines specific to the FastCGI configuration and the permissions we want:


<IfModule mod_fastcgi.c>
FastCgiIpcDir /tmp/fcgi_ipc/
FastCgiServer /usr/local/www/data/typo/public/dispatch.fcgi -idle-timeout 120 -initial-env RAILS_ENV=production -processes 2
FastCgiConfig -idle-timeout 120 -initial-env RAILS_ENV=production -restart
AddHandler fastcgi-script fcgi fcgi fpl
</IfModule>

<Directory "/usr/local/www/data/typo/public">
AllowOverride All
Options ExecCGI
</Directory>

The critical line in there is the FastCgiServer line that Scott Laird has written about in some detail on his blog.

And we’re off…

Now I just run apachectl start as root and I’m up and running.


16 November 2005

GPGMail Patch


Just a quick follow up with the patch to the source to produce the mailbundle in the last entry.

The patch is here.

The detached signature is here.

This software is subject to the following license.


13 November 2005

GPGMail.mailbundle With SHA{256,384,512}


By adding 6 lines to the code of GPGMail, I’ve allowed it to send messages with some (perhaps) less compromised hashing algorithms. Generally an algorithm called SHA-1 is used to generate a condensed representation or “hash” of the text PGP/GPG messages for signing purposes. The SHA-1 algorithm is subject to an attack described by Chinese researchers that allows another text that generates the same hash (called a “collision”) to be found in 269 steps rather than the 280 steps that the original design specified. This attack makes finding a collision several orders of magnitude faster.

Collisions are hazardous in that a powerful adversary (usually named Mallory) could take a note you signed that said “I like cashews” and generate a new note with some variation of “I agree to sell my home to Mallory for $15.–” With plaintext messages this is a lot harder because generally one must add random garbage to the end of the message, but with files that do (or could) have a lot of unused junk data in them such as Microsoft Word this is a lot easier. Many prominent figures in the cryptographic community have weighed in on the need to move away from SHA-1.

GPGMail.mailbundle right now only allows SHA-1, MD5 (subject to its own collision attacks), and RIPEMD-160. Adding a few lines of code allows users like me to send messages also with SHA-256, SHA-384, and SHA-512. A zip of this updated mailbundle is attached for existing GPGMail users. It depends on all the same sorts of things that the usual GPGMail depends on, check the GPGMail web page for details. You also have to make a configuration change and generate an RSA signing key in order to use the newer algorithms:


  • Add the line digest-algo sha512 to .gnupg/gpg.conf (or sha256 or sha384 if you prefer)

  • Generate an RSA signing subkey by running gpg --edit-key your@email.addr

    • addkey

    • Enter your password at the prompt

    • Pick the number for RSA (sign only) and finish the configuration of your key


It’s not time to panic and run away from SHA-1, but now is the time to migrate away from it if possible. People who are picky about standards will note that using these new algorithms is not strictly allowed by the OpenPGP RFC. There are revisions floating within the IETF to fix this, but standards processes move a lot like glaciers.

The patched mail bundle is downloadable here along with a signature.


09 October 2005

Article on Rails with MPM worker


I’m in the process of writing a small document on using Typo with MPM worker and FastCGI. The Rails community is fixated on lighttpd for “performance” reasons. Apache httpd 2 is pretty easy to configure to get significant additional speed, but few people seem to bother.

No need for a proxy, or yet another web server soaking up all the memory on your system, you can do it all with 5 or 10 total processes. (Besides, soaking up memory is what amavisd is for.) And if you’re doing interactive things like serving web pages, you certainly do not want to be anywhere near swap anyway unless you hate the people viewing your page and want them to hate you. That people have swap 2-3x RAM size on systems with 2GB of RAM is insane. Almost as insane as letting an interactive operating system continue to create more and more page files over time as it vastly oversubscribes available memory, that would be absolutely crazy, as well as stupid and worth it’s own rant on another occasion.

In any case, I’ll have the MPM worker detail posted in the next few days. This configuration has saved me at least 100MB of allocated memory space, mostly due to 100% less mod_php. Turns out PHP as a FastCGI is smaller anyway, a nice bonus.


07 September 2005

iTunes 5 and mt-daapd Incompatible


It doesn’t come as a huge surprise that Apple broke compatibility with mt-daapd as part of their release of iTunes 5 today. Complaints are already starting to appear from users.

Packet dumps are easy enough to generate that folks will work around this soon. It’s hard to say why Apple even bothers breaking compatibility like this since it is so trivial to work around. These sorts of intervention efforts will continue to be futile, much like the purported protection of things like the so-called broadcast flag that consumer products can ignore (or be rigged to do so). You can’t give media to an end-user and think you’ll stop them from extracting it into whatever they want to use it for. You can only make it into an attractive challenge for intelligent people who need something interesting to kill time with.


23 August 2005

More Typo Patches


I’ve got a couple new Typo patches that I’ve made in the last week to add features that I wanted. They’re both working here on this site right now. One makes a toggle so people can limit the Atom and RSS feeds to show the top of the article, but not the extended content. The other breaks the sidebar off into its own cached element so it can be updated more frequently but independent of the article it is appearing beside.

#316 Add toggle for extended article text in RSS feeds

The default behavior of Typo is display the whole article in the RSS feed. This is nice for people who want to read all the content in their RSS reader. However, certain tricks with CSS may not render well and users of Safari’s RSS reader will have to scroll a long ways if articles are lengthy.

This patch adds a toggle to Typo’s admin interface that limits the RSS feed to showing only the top article text and not the “extended content” (if there is any). Reloading my RSS feed will result in not seeing the article full of the repairs I made to the Audi, but only the first part that provided an overview.

Some people use similar features in other blog software to drive traffic to their sites by providing only a teaser in the RSS feed. I like to think of it in an overview sense rather than trying to get more advertising traffic, but to each their own.

#345 Separating sidebar into its own cache

Typo’s current behavior is to render the the sidebar at the same time of the article and leave it in the static page cache. This is problematic for people who have things like RSS feeds or Flickr feeds in their sidebar. The only workaround so far was to sweep the whole cache regularly, forcing every page to get rebuilt.

This patch uses some JavaScript to pull a fresh copy of the sidebar as the page is loading. The cache file for the sidebar URL can be swept separately from the rest of the cache so the sidebar can be updated without forcing rebuilds of all the other pages. It also helps to guarantee consistency of the sidebar across all the pages for the site.

One of the downsides of this patch in its current state is that Google AdSense ads in the sidebar won’t load. Generally Privoxy and PithHelmet keep me from ever see these ads anyway, but I’ll have to dig deeper to figure out what is going on. Right now, it appears this is an issue with getting JavaScript within the updated content to run. I may also just contact AdSense support and see what they suggest.

There also seems to be an issue with UTF-8 not getting properly decoded in the sidebar snippet that is being downloaded. This may just be a web server configuration hangup.


17 August 2005

Ruby-doc.org Not Working


I’ve had some frustration in the last day or two trying to access ruby-doc.org. As it turns out ruby-doc.org’s name servers don’t actually exist. But a play-by-play will make this easier to explain.

The nameservers for .org say that ruby-doc.org is served by ns1.tagbomb.com and ns2.tagbomb.com. So now we need to find ns1.tagbomb.com.

The nameservers for .com say that tagbomb.com is served by ns1.ev1servers.net and ns2.ev1servers.net. Alright, off to .net land…

The nameservers for .net say ev1servers.net is served by ns1.ev1servers.net and we can find it at 207.218.245.135. Ah ha!

When we talk to 207.218.245.135 it says that ns1.ev1servers.net is indeed at 207.218.245.135 and you’re talking to it. When we ask it about ns1.tagbomb.com (which we were told it should have an answer for) it says it does not exist.

So there we are. ns1.tagbomb.com and ns2.tagbomb.com don’t exist but are the authoritative name servers for ruby-doc.org. No authoritative name servers means no access to the domains. (Although you are okay with certain name servers that allow their idea of where ns1.tagbomb.com is to be poisoned by the .org nameservers)

I hope they fix this soon, not having access to documentation is annoying and doesn’t reflect well on the language.

Update…

It’s fixed
now. James Britt was quick about it after it was brought to his attention.


13 August 2005

Replacing Audi TT Coolant Temperature Sensor


As I wrote a couple days ago, the Audi TT had evidence of a bad coolant temperature sensor. Today I made the repair and took some pictures along the way. The rest of this post details the steps involved in this fix. Because being litigious is still the new hotness, the following disclaimer applies:


If you follow the instructions you see here for this repair, you could seriously damage or destroy your car, the building it is in, and/or yourself. If you are not comfortable with these possibilities take your car to an authorized, certified, notarized, and super-sized mechanic to get this repair done.



  • Audi TT with bad/flakey coolant temperature sensor

  • New green coolant temperature sensor (part 059-919-501-A)

  • New o-ring seal for above (part N-903-168-02)

  • New plastic retaining clip (part 032-121-142)

  • Flat-bladed screwdriver

  • Phillips-head screwdriver

  • Your own fingers

Audi TT Engine Audi TT Engine

First off, this shouldn’t be attempted if the car has been run at all in the last several hours. Completing this work without getting injured requires opening up the coolant system (which is under pressure and extremely hot if the engine has run recently) and bumping around other dangerously hot parts. For my repair I let the car sit overnight and worked on about noon the next day, more than needed, but I’d just as soon not get burned.

In order, to get to the parts we want to work on we’ll first have to remove the plastic engine cover and the plastic battery cover. There are two Phillips-head screwclips that hold the engine cover in place. They unhook with a half turn counterclockwise. Pull the front of the cover up and forward and set it aside somewhere. The three screws that hold the battery cover on are normal screws. After unscrewing them (and putting them somewhere you won’t lose them), push the cover back and left a little and pull up from the back edge and it should come out easily.

View of the coolant temp. sensor Another view of the part Views of the coolant

temperature sensor still plugged

in and lit with a flashlight

At this point you should be able to see and get to the coolant temperature sensor. It’s a little dark, so for my work I slid a large flashlight into place to illuminate the part and to be able to see what I was doing. The sensor is on the right hand side of the engine block down beneath a few other hoses and an electrical bundle. The pictures should give you a good idea what you’re looking for.

Open and close the radiator reservoir to the left of the engine just to make sure there is no pressure in the system. Better safe than sorry.

The retaining clip The retaining clip (right)

that holds the temperature sensor

in (not the metal hose clamp left)

Now that we can see the part that needs replacing we need to get it out of the engine. To remove the part first we must remove the small plastic clip that holds it in. Take note at this point of the angle at which the sensor sits in place, this’ll be important when we place the new one in. Using a flat-bladed screwdriver it should be straight forward to lever the clip out. Don’t be brokenhearted if the clip snaps in half like mine did, it’s old brittle plastic and that’s why you got a new one. The screwdriver or some needlenose pliers can roust out any leftover bits if yours does snap. Just make sure those bits are out of the way, you don’t want them inside your cars coolant system.

A view with the sensor pulled out The port for the sensor

with the sensor pulled out

Once the clip is off the sensor should pull right out easily. Some coolant will spill out, but not too much. The old O-ring may stay down in the port, you can use your fingers to fish the O-ring out. As with the plastic clip, it’s best to dispose of the O-ring rather than try to reuse it. Not having coolant spewing out of the engine on the road somewhere is worth the $1 part cost.

The sensor connector The sensor connector with

it’s release tab visible

There is enough slack in the cable bundle that you can pull it up to a more reasonable location to work with it. Use a flat-bladed screwdriver to push on the release tab while pulling out the old sensor. It should come out pretty easily.

Now to install the sensor the process just moves in reverse. The new green sensor will only fit into the connector one way and you should be able to feel and hear the snap when it is together.

The new sensor in the connector The new sensor in the connector

Take the new O-ring seal and get it a little wet in the port and then push it down into place with your fingers. It may take a little bit of work getting it pressed all the way down in all the way around. After the O-ring seal is seated you can push the coolant temperature sensor back down into place. Remembering the angle it fit in at is key here.

While holding the sensor down in the right spot at the right angle, the new plastic retaining clip can be snapped back into place to hold the sensor in. The metal end of the sensor should be all the way underneath the clip. It is very important to make sure that this is right. If it isn’t the sensor will blow out of the port (along with a lot of coolant) when the system gets up to temperature. Pull and push on the green plastic (not the cables) to make sure there isn’t any sloppiness in how it is fitting into place.

Now that the sensor is plugged in, pushed in, clipped in and everything looks okay, it’s time to close up the hood and go for a test drive. Don’t stray too far from home in case the sensor didn’t seat correctly. The main goal is to get the engine up to temperature and make sure the coolant system can get up to pressure without blowing the sensor out and spilling coolant all over the road. This appears to be easy as long as the O-ring sealed and the clip is in the right place. Keep an eye out for coolant on the road behind you. If you do have a spectacular coolant blowout, don’t try to drive the car with no coolant, it makes the engine sad. And be mindful of the high temperatures, the normal coolant running temperature is between 80°C and 90°C, that’s 175°F and 195°F. To reiterate, doing anything around the coolant after the engine has been running for a while is ill-advised unless hot liquid burns with ethylene glycol is your idea of a good time.

So there we are, all done. Our TT made a successful 70 mile drive today with it’s new temperature sensor and all is clear and well. Safe travels.


11 August 2005

17704 - Error in Mapped Cooling System


It’s not a month out of warranty and the TT has had it’s first ever “check engine” light incident. Using a handy tool I ordered, I was able to discover the fault for about the cost of having the dealership diagnose the problem. The message is a little cryptic, but provides a good hint as to what is awry.


17704 - Error in Mapped Cooling System (usually temp Sensor or Thermostat)
P1296 - 35-10 - - - Intermittent


Googling the error code provides a plethora of results discussing what causes this error. The first step in confirming the problem was to figure out if the coolant temperature sensor was actually misbehaving. I cleared the code out and then had Eileen keep an eye on the laptop’s graph for the coolant temperature sensor as we drove to some errands.

Sure enough, as the engine coolant slowly rose to operating temperature, for a couple seconds at a time the sensor would send an absurdly low reading and then return to showing the correct value. While the problem didn’t look like it was happening that often and may not be enough to trigger another fault, it’s obvious the sensor is not feeling quite right (that is unless there are chunks of ice flowing around in the coolant system).

On the way back home we stopped by Chaplin’s VW and visited their parts desk. I had the part numbers, but the parts guy knew exactly what I was after when he read the description I had on the Post-It next to the part numbers. Apparently this isn’t too uncommon a fault for the 1.8T motor that the TT shares with some A4s and a variety of VW models.

Evidently the accounting for warranty repairs between Volkswagen AG and the dealerships encourages them to make the parts for frequently needed warranty repairs cheaper. In this particular case, the parts were $9.10. There was some suggestion that the mass airflow sensor was cheaper nowadays ($60 rather than $300) for similar reasons.

It turns out there are some nice articles online at AudiWorld about replacing the flakey coolant temperature sensor that causes this. I think I may try to document the repair process myself with some more pictures. We’ll see how that goes.


30 July 2005

Calling Features With Asterisk


In the past couple of days I’ve added a few useful calling features to the Asterisk installation we use for handling the calls to our household. These calling features would cost another $10-15 per month from the local RBOC if we wanted them normally. We’d just as soon not get nickeled and dimed for these though since they can be done for free.

There are snippets below to help the aspiring Asterisk user add these call features to their own system.

Caller-ID based Blacklisting

This feature takes incoming calls from specific folks that call a little too much and sends them somewhere that won’t make our phone ring. If the friendly, well-meaning vampires at the local blood bank are calling you twice every day, this is for you.

macro-stdexten

[incoming]
exten => s,1,Macro(stdexten,1234,SIP/MyInternalLine)


Now, in the macro-stdexten we tell it to check the blacklist. Key lines for this function are s,1 and s,102. The other lines are relevant to things I’ll cover later.


[macro-stdexten]
exten=s,1,LookupBlacklist ; If CID blacklisted, goto 102
exten=s,2,DBget(temp=CFIM/${ARG1}) ; Get CFIM (Call Forward IMmediate) key, if there isn't one, goto 103
exten=s,3,Dial(Local/${temp}@local/n) ; Unconditional forward
exten=s,4,DBput(lastcaller/${ARG1}=${CALLERIDNUM}) ; Note the last caller
exten=s,5,Dial(${ARG2},20) ; Call the extension with a 20 sec timeout
exten=s,6,DBget(temp=CFBS/${ARG1}) ; Get CFBS (Call Forward BuSy) key, if there isn't one, goto 107
exten=s,7,Dial(Local/${temp}@local/n) ; Forward on busy or unavailable
; Blacklisted CallerID
exten=s,102,Goto(blacklisted,s,1)
; No CFIM key
exten=s,103,Goto(s,4)
; No CFBS key = goto voicemail
exten=s,107,Answer
exten=s,108,Wait(1)
exten=s,109,Voicemail(u${ARG1})


So now people that have their phone numbers in the blacklist will get sent to blacklist s,1. We’d best define that…


[blacklisted]
exten=s,1,Answer
exten=s,2,Wait(1)
exten=s,3,Playback(nbdy-avail-to-take-call)
exten=s,4,Playback(carried-away-by-monkeys)
exten=s,5,Playback(lots-o-monkeys)
exten=s,6,Hangup


Now, I think the monkeys make the whole calling experience a lot more fun for the caller. If you want them to hear something more dignified you could always go for Playback(not-taking-your-call).

You can add and remove numbers from the blacklist by using the Asterisk console and database put blacklist 2025551212 1 and database del blacklist 2025551212. But it would probably be better if you could configure this from your phone so…


[blacklist-add]
exten=s,1,Playback(enter-num-blacklist)
exten=s,2,DigitTimeout(5)
exten=s,3,ResponseTimeout(30)
exten=_X.,1,DBput(blacklist/${EXTEN}=1)
exten=_X.,2,SayDigits(${EXTEN})
exten=_X.,3,Playback(num-was-successfully)
exten=_X.,4,Playback(added)
exten=_X.,5,Hangup

[blacklist-remove]
exten=s,1,Playback(enter-num-rmv-blklist)
exten=s,2,DigitTimeout(5)
exten=s,3,ResponseTimeout(30)
exten=_X.,1,DBput(blacklist/${EXTEN}=1)
exten=_X.,2,SayDigits(${EXTEN})
exten=_X.,3,Playback(num-was-successfully)
exten=_X.,4,Playback(removed)
exten=_X.,5,Hangup


If you are following the calling feature codes that are used in the United States, users should be able to do blacklist-add with *60 and blacklist-remove with *80.

Call Forwarding

Most of the logic for call forwarding is in the macro-stdexten above. If the call forwarding is configured, we send the call to that number. If you just have one PSTN line like we do, you’ll have to be able to route those forward calls over a VoIP provider, since the PSTN line may already be used up by the incoming call.

The main thing is simply to let people configure the call forwarding using a prompt system similar to the one we just used for the blacklist configuration. There are again standard calling feature codes for unconditional call forwarding in the United States. Activating call forwarding is *72 and deactivating is *73.


[callfwd-add]
exten=s,1,Playback(please-enter-the)
exten=s,2,Playback(call-forwarding)
exten=s,3,Playback(telephone-number)
exten=s,4,DigitTimeout(5)
exten=s,5,ResponseTimeout(30)
exten=_X.,1,DBput(CFIM/${CALLERID}=${EXTEN})
exten=_X.,2,Playback(call-forwarding)
exten=_X.,3,Playback(has-been-set-to)
exten=_X.,4,SayDigits(${EXTEN})
exten=_X.,5,Hangup

[callfwd-remove]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,DBdel(CFIM/${CALLERIDNUM})
exten => s,4,Playback(call-fwd-cancelled)
exten => s,5,Hangup


Last Call Return

So again, part of what lets this work is in macro-stdexten s,4 above where the last call to each extension is recorded into the database for posterity. Then we can offer last call return when people dial *69 with the following snippet:


[app-lastcallreturn]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Playback(last-num-to-call)
exten => s,4,DBget(number=lastcaller/${CALLERIDNUM}) ; goto 105 if no lastcaller
exten => s,5,GotoIf($"${number}" = ""?105,1) ; also if it's blank (caller id blocked)
exten => s,6,SayDigits(${number})
exten => s,7,Wait,1
exten => s,8,Playback(to-call-num-press)
exten => s,9,Playback(digits/1)
exten => 1,1,Goto(longdistance,1${number},1)
exten => s,105,Playback(unidentified-no-callback)
exten => s,106,Hangup


Summary

Most of this was adapted from examples at www.voip-info.org where there is a nice wiki with Asterisk information. I made an effort to clean up some of the examples they had and try to use the more standard vertical service codes. Hopefully this is useful to folks.


25 July 2005

Trēo 650 Overview


After 2 years of service, Verizon was kind enough to give me $100 off a new phone which I used to get a Trēo 650. It is a lot like the old Palm III I used to use back in the day to stay organized in school.

The Bluetooth syncing was a bit of a hassle to get set up. The “Transport Monitor” application on my Mac kept throwing up a dialog that said “Your request could not be completed. (16)” As it turns out you have to go into Bluetooth in the System Preferences and turn on “Bluetooth-PDA-Sync” in the “Sharing” tab. It ships turned off generally.

The free GraffitiAnywhere program let’s me get back to using Graffiti on screen for some of my writing which can sometimes be easier than thumbing the tiny keyboard on the device.

I’ve hidden away the “WirelessSync” tool that Verizon bundles, since some people suggest that it breaks the ability to sync normally. The Versamail install that comes on the CD-ROM but not on the device is vastly superior to the Mail program that is on the device. I have to guess that Verizon hides it on the CD to try and keep users from sending pictures via email rather than paying 25¢ an image to send them via SMS/MMS.

Working with some of the other contributors to Typo the free and open-source Vagablog Palm/Treo program. Just set it for “Blogger.com” mode and the Title and Category fields will do the right things.

I did manage to lock my Trēo up while playing around with the Adobe PDF for Palm translator. Somehow it managed to make an input PDF file double the size of the original and it filled up the device memory. This led to endless rebooting sadness. A hard reset of the device resolved matters after I got it limped far enough to delete the offending file.


21 July 2005

Switched to Typo


I’ve switched from using the PostgreSQL port of WordPress to using Typo for managing the weblog part of the site. This also means that I won’t be working on WordPress-pg any more since there isn’t a lot of motivation for me without having my own site on it.

Switching to Typo represents a number of changes:


  • it natively supports more than one database

  • it is written in Ruby rather than PHP

  • it has code that is much better organized

  • it has neat AJAX features and is much easier to add those features to

  • it has unit tests

  • the contributing community seems to better understand best practices

I’ve already made some small contributions (#151, #174, #178) to Typo that have been well received and are working on this site right now. Using Ruby on Rails together with svk makes it much easier to do development for this project and testing on any workstation I’m at. Futzing around with the settings for PHP and Apache was always a big hassle for doing simple development testing.

The direction I wanted WordPress to go was to be fully database-agnostic for the article, comment and other data. This is not achievable given the direction the project is heading. Database interoperability was simply not of any interest to the maintainers and the growing plugin community just increased it’s dependence on a particular database. The project lead’s ethical lapse and the fanboy-style responses by the user community to it reinforced my doubts about my involvement when the work on the code was getting more awkward because of the changes being made.

At the end of the day, working on WordPress was slow, awkward and unrewarding. There was no hope whatsoever that the work would ever be merged. Inferior tools were viewed as vastly superior and the usage and misusage of those tools was beyond question to key members of that community. I care about the quality of the tools I use and so I’ve moved on.

Development on Typo is moving along at quite a clip right now. New features are ridiculously easy to add, even if you care enough to do it The Right Way. I’ll need to get more up to speed with Ruby at some point. But some friends have been pestering me about that for a while now.

I’m not totally sold on Ruby and Rails yet, but they are certainly cleaner to work on than PHP. Some parts of the site may look a little different than they did before and the URLs may be a little different, but nothing is too broken now except the CSS for the Gallery. Let me know if something else is amiss.


01 July 2005

Coast Pictures Online


Our pictures from the Oregon Coast are now in the photo gallery. There are lots of pictures of the beach at Pacific City where we stayed and the view from our patio where I did a good bit of reading.

Picture of waves

It was another great time at the shore. A much needed break to relax and stop by our favorite haunts on the coast. The Grateful Bread Bakery provided tasty breakfast and lunch. The Pelican Pub & Brewery has a good red ale as a spring (and apparently early-summer) seasonal, the Doryman’s Dark is good too. I will admit however to not being too picky a beer snob, so no comments about bouquet and finish.

Further south we stopped by Ainslee’s Salt Water Taffy store in Depoe Bay and Mo’s. Later in the trip, caught by a desire for some italian food we set out for a restaurant Lincoln City which frustratingly closed at 7 or 8pm. After asking some locals for advice on what to do next, we made it down to the Italian Riviera Restaurant and Piano Bar in between Lincoln City and Depoe Bay for some wonderful pasta and good live jazz to boot, definitely a great find.

Getting out to relax is wonderful, and we were treated to some nice sunsets (see the new title graphic above) to boot. Overall, we highly recommend the experience provided you remember to put on your sunblock.


Finished Reading


Cryptonomicon was an interesting read. It is quite a long read, but a couple of recent trips I took gave me an opportunity to finish it off. Stephenson’s style of weaving 2, sometimes 3, fairly orthogonal storylines with shared character names took some bit of adjustment to get used to reading. It also meant that I couldn’t really read it late in the evening when I was feeling tired, as my brain just couldn’t follow along any more. The story itself was good and reasonably topical for those that fiddle with things like Tor and PGP/GPG. I’m a bit skeptical of the kid gloves that the governments in the story seem to have toward what the end of the story, but that’s why it’s fiction.

It would be hard to call the story science fiction, given that the technology described was well-established when the book was written.

This last week I picked up a copy of the decidedly-nonfiction Beyond Fear by Bruce Schneier. I’ve made some progress on it and will write more when I finish it. My impression at the moment, about half way through, is that it is a bit ponderous and self-contradictory in places. But then when it comes to describing a need for a more realistic evaluation of threats, I’m the choir and don’t need much preaching to agree.


05 June 2005

Zen and the Art of Laundry Folding


I spent a few hours this morning sorting and folding laundry in between trips to our fancy new washing machine and old but still running fine dryer. As it turns out, folding laundry gives my mind lots of time to wander and think about all sorts of interesting curiosities that are floating around in the back of it. I’m going to let some of this out of my head right now so I don’t lose it before more things come up. I’ll also round up some recent events that happened to have crossed my mind…

Back in the Saddle

I’ve started jumping again, or more specifically I’ve ridden horses that have jumped over small fences again. I’ve been out riding three times now in the past two weeks at the stable where Eileen has been taking her lessons. This marks the first time I’ve been out riding since I wrecked my knee and had surgery on it a year ago February. The knee joint was a little sore the first ride where there was still some left over scar tissue from the surgery, but is doing a lot better since then. The muscles used for riding and holding two point are definitely atrophied though. After 20 or 30 minutes of riding, my legs turn to jello and holding my heels down and legs in position becomes a real challenge. But I am out there again, and it feels good to get back. I need the exercise anyway.

New Washing Machine

We picked up a new washing machine in the past month. The old top-loading Maytag that we had previously had started leaking water on the floor a bit more often than it used to. It didn’t help its case that it had the energy efficiency of a Cadillac Escalade. We picked up a new Whirlpool washing machine from Sears while they were having an appliance sale in May. While the economics of a high-efficiency washer don’t always pan out for folks on municipal water, being on a well means that the more water used, the bigger the power bill at the end of the month. And well pumps can be pretty thirsty with the power, so it made a bit more sense for us. Front-loading washers are claimed to be a little easier on fabrics too, which would be a bonus as some of my shirts were left fairly thread-bare by the last washer.

Metawiki

There is a lot of useful information out in the wikis and blogs that populate the Internet nowadays. There is a lot of unuseful information as well. I find myself having to spend a lot of time sifting through links to find things that matter and have some value among the chaff. A lot of search engine searches nowadays (even on Google) for reviews or interoperability instructions for some item returns results consisting of 231 fly-by-night vendors offering the item or something related to it for sale.

I’ve recently found myself referring back to the c2.com software development pattern wiki or Wikipedia on a regular basis. In addition, I often wind up browsing other wikis associated with open-source projects I’m following or involved in. This of course doesn’t include the pages from WikityWidget or private wikis for employers and elsewhere.

Altogether it’s quite a fiasco trying to keep track of all these wikis and items that I’m interested in. What I need is a metawiki. I need my own personal copy of all these sources that can be updated on the fly, but still perfectly accessible when the internet is not available. I need to be able to make notes on the pages about things that I think warrant more research or investigation. I need to be able to make my own pages indepedent of these sources. I need to be able to share how I feel about the veracity of parts of wiki pages or whole wiki pages in a simple way (that would probably involve keypair cryptography).

Onion network for some information

While thinking more about the metawiki it became pretty clear that useful things from outside the “wikiverse” would want to be accessible as well. There are plenty of RSS feeds for news sources and blogs out there so those would be a pretty obvious source to start with. There are also those who clutter their feed with advertisements. And then there are organizations who think that they can successfully trade content for people’s demographic information. A lot of these entities get pretty angry when someone extracts just the useful information (like an article and its graphics, without 7 “click here to view the next page” pages) and throws away their advertising.

It would be pretty straightforward to import this information into the metawiki under a variety of headings and keep it in an onion network or similar device so that the providers of the information and the recipients don’t need to know who each other are. Without knowing who each other are this avoids unnecessary litigious issues with large less enlightened organizations. Being able to distribute this information across of a lot of potential sources would also have a lot of value.

High latency links for email

There are a lot of places (link syncing wikis) where the link latency is not a big deal. Present IP networks can generally get even the lowliest consumers to the far side of Earth in a few hundred milliseconds. In very many cases, that number could be 5 or 6 seconds and not really be a big problem for the communication involved. This is true of bulk communications like email or file downloads, that are time-sensitive only in the minutes sense. Since it’s going to take a while to get there anyway, there’s no expectation of immediacy and a longer, larger pipe would work just as well as a smaller one. There are now colocation facilities and network providers that will charge you more to have even less latency than normal. It remains to be seen if there will be a market for more latency for those that are willing to cope with it. Launching satellites is kind of expensive so the market would have to be built using cheap point-to-point links that use some wireless technology.

Futility of trying to control consumable information

All this noise being made over people illegally copying information is actually people waving their hands at a barndoor while the horse has made it into the next county. As soon as you let people see/hear/read the information your control over it is lost. At best the information sales companies could use key-pair cryptography to make sure that only your device at your home with your key can render the information. But once it has done so you can talk to your friends about it. You can wrestle the information out into a more portable form. You can invite your friends over to see the information. They can use a video camera, still camera, CD burner, etc. to copy the information and take it home for them. They could have a clone of your information viewer so it looked like it was you.

No, it’s a lost cause trying to get all those cows back in the barn. All these “media” outlets had better figure out a model that’s going to work for them. Hardback books and movies in the theaters do add some value that isn’t there when it’s just text or a movie on a computer screen. Many of us will pay extra for the value-add. On the other hand when that value add isn’t necessary or desirable, many people won’t pay extra and find that the inconvenience of waiting a few hours for a download is more rewarding than dealing with the restrictions of the information company and working through their convoluted access control schemes.

Waterfall Projects Considered Harmful

The “waterfall” development model is bad for software development. It may be good for making cars or TV sets or ceiling fans, but it is not good for making software, writing a book or painting a picture. It results in huge projects that wind up over-budget, ridiculously late, and largely unsuccessful in delivering what the customer needs. The more layers of indirection between the people making something and the people consuming it, the less likely that you’re going to get what the consumer wants. Being in constant communication about the work in progress and being able to show it, helps immensely.

Arly comes to visit

Arly, the cute little calico from across the street, has been visiting us the past few days. She still can’t operate the muscles to move the last 2 or 3 inches of her tail which affects her ability to keep her balance. I tried to help her off our deck railing before she wobbled and fell to the concrete below. I got bitten in the hand for my trouble.

Onboard computer for the TT

I thought some about the application of a mini-ITX or smaller custom computer system in the trunk of the Audi. It has pins that link to the stereo system, the power supply of the car, a small cellular band antenna on the roof and a RJ-45 jack in the passenger compartment. Using the cellular antenna as an antenna for 802.11a/b/g for data access on free wi-fi points driving around might work out if information could be bursted to it fast enough from a server somewhere and then trickled in as long as the connection lasts. It would be a similar set of protocol rules as used in deep space probes where critical information is sent early to make sure it gets there, and everything else is slowly streamed in while there’s a chance it can be received. There are a lot of ways it could be used, including access to the metawiki out in the field.

Reserved Parking for Verizon Cell Phones

It turns out my Verizon contract doesn’t run out until September. This is a little frustrating given a desire for a new Trēo 650 on a competing network. (Yet another tool to integrate into the metawiki somehow.) On the other hand, people have figured out how to workaround some of the ways that Verizon has gimped the Bluetooth features on that phone. As it comes from them, you can’t sync via Bluetooth, use your phones data connection to check mail on your laptop or send pictures via Bluetooth, because then you might be tempted to not pay Verizon Wireless 25¢ and 1 minute of airtime to move each image somewhere else.


16 May 2005

GPGMail and Mac OS X 10.4.1


A software update for Mac OS X 10.4 just arrived bringing us to 10.4.1. Among the various things this update does is breaking all “bundles” for OS X’s Mail.app. There is a version of GPGMail.mailbundle that works fine with 10.4. That is until the first time you start up mail after the upgrade and it breaks it.


defaults write com.apple.mail EnableBundles YES
mv Library/Mail/Bundles (Disabled) Library/Mail/Bundles

Note: Do not change the BundleCompatibilityVersion as is typically done with a new install of GPGMail. Setting that value to “1” triggers the irritating behavior that many have noticed where Mail.app moves Bundles to Bundles (Diabled) and sets EnableBundles to NO and sets BundleCompatibilityVersion back to “2”.

Then you’ll be back in business. It sure would be nice if Apple would let people make a better integrated PGP experience without hacking around with silliness like this.


Reading List


A trip to a transnational bookseller yielded a variety of books for us today. I’ve been working through Collapse after having finished Guns, Germs and Steel. They both aren’t exactly light-reading, and at least so far have left me somewhat depressed for the future of humanity. But then so does watching the news segment of The Daily Show most days.


  • A Brief History of Time
    Somehow we didn’t have a copy of this on the shelf anymore. This is the layman’s guide to 20th century astrophysics. Apparently Eileen’s knowledge of physics is underappreciated by her coworkers and this book may help alleviate some of that.

  • The Universe in a Nutshell
    A plain-spoken review of the big questions (circa 2001) about how the universe is put together. I think it may be worth looking for an equally plain-spoken guide to what’s changed in physics since the publication of the book somewhere on the internet.

  • Marooned in Realtime
    The sequel to ”The Peace War” which I read and enjoyed in the last several months.

  • Cryptonomicon
    The premise seems interesting and apparently I’m going to finally get around to reading this. This author (and this book in particular) is widely read among computer-oriented folks, so I should probably read it too. Baaa!

  • The Statistical Analysis of Experimental Data
    This book has seemed to have a good review of statistical math with some example applications. My day-to-day work is starting to demand that I remember things that I haven’t used since the two weeks of the college course that covered it. The goal here is to help jog those 8 year old memories.

  • Death March
    I saw this while browsing and it seemed applicable to every technology job I’ve held at one point or another and every software development group on one project or another. Having some understanding about how a locomotive works will instruct you on how best to keep from getting crushed by one, and if you’re smart (and lucky) how to make it a little bit better.


Polarization Politics in BSDs


In a scene all to reminiscent of what passes for “rational” political discourse in governance today, Poul-Henning Kamp, ex-core of FreeBSD (1992-2000), and Theo deRaadt, founder of OpenBSD, are involved in a scuffle about Reyk Floeter’s presentation at a recent BSD-related conference. Apparently things got underway when Poul asked some pointed questions at the conference and then posted a review of the day’s events to the (private) FreeBSD developers mailing list. The review of Reyk’s OpenBSD Wireless presentation included Poul making a comparison to Red Army Faction, a terrorist group that killed at least nine and injured dozens more in the 1970s and later.

Now Poul-Henning Kamp does have some valid criticism and concerns about how well the OpenBSD Atheros HAL will hold up as being legally reverse engineered. The original BSD project had a whole barrel of intellectual property law fun with a small upstart named AT&T that took several years to settle. Being that as it may, it is very hard to take Poul seriously when he compares possible violations of intellectual property rules for interoperability to murderous terrorism. Of course Theo is never one to leave an itch of potential conflict unscratched and promptly fired a tirade right back and isn’t exactly being receptive to attempts to defuse the situation.

And now we have a public brouhaha over what most likely started out as a off-the-cuff answer as part of a developer’s presentation. It stands to reason that comparison to a terrorist group is just one short step short of falling victim to Godwin’s Rule. For my own purposes, it’s close enough. I think Theo should just stop talking, because he’s already won the debate.


10 May 2005

Helpful SUV Driving Tips


We are always looking to contribute to the greater good. We also happen to commute into Seattle on I-90 everyday, and as it turns out there are a lot of people with large trucks and SUVs that commute into Seattle from the Eastside every day. All the large vehicle traffic makes me hopeful for the construction, pediatric medicine and farming industries, but I digress.

To help give back to society, here are some important safety tips for completing your commute on the freeway without injuring yourself and others in your large SUV or truck:


  • The stripes on the road are not art
    While it might be easy to fall into the trap of thinking that the dashed white lines on the freeway are a form of abstract art, they are there for a reason. They, in fact, indicate the general direction you should be going. But wait, there’s more! As an added feature the space between the dashed lines is moderately larger than most vehicles, even your F-150, Suburban and Escalade. If we all stay between the lines we can fit more cars on the road and all get where we’re going faster and more safely. The spaces between the dashed lines are called “lanes”.

On many sections of freeway there are even helpful bumps on these stripes so you can feel when you are drifting into a lane other than your own. (More on changing lanes properly in the next bullet point.) When you feel these bumps you should direct your large truck or SUV back into your own lane; that way other people don’t have to swerve to avoid you. I realize that these sets of bumps can help you track each dollar of gasoline or diesel you burn on your way to wherever you’re going, but please use your gas gauge for this instead, for the children’s sake.


  • That stick hanging out the left side of your steering column is useful
    As it turns out, that stick that is protruding from your steering column isn’t a practical joke on behalf of some GM autoworker in Mexico that constructed your “I only buy American” vehicle. When you move this stick up or down it will cause lights on the right or left side, respectively, of your vehicle to blink, alerting everyone else on the road that you intend to change from one “lane” into another. You’ll find that it’s a lot easier and safer to participate in freeway driving if we don’t all have to second guess where each other are going next.

While it is true that the likelihood of the State Patrol bothering to write a ticket for failing to signal while changing lanes is zero unless you manage to hit someone else doing it, it is still illegal and impolite. You wouldn’t want undue scratching and damage to the fancy paint your offroading truck/SUV when you hit someone who was unable to read your mind and tell you were going to drift over into their lane without signalling. So it’s for the safety of your SUV/truck and your children who want the vehicle not to be scratched as well. Think of the children!


  • Keep right except to pass
    There are signs on this particular stretch of freeway that remind us all that the laws of Washington state say that if you’re not passing someone you need to keep in the rightmost lane. It happens that if everyone followed this simple rule, we all wouldn’t have to change lanes quite as much to make our way to our destination. All that lane changing and vehicles going different speeds in the same lane leads to accidents. And even in an SUV your 8 children that are along for the ride might get injured in an accident. Think of the children!

Now again, I’m fairly certain no one is actually ever ticketed for this bad behavior, despite the fact that it results in a large number of speed differential-related accidents. This doesn’t mean it isn’t illegal, impolite and dangerous to your children, you know, the ones you’re supposed to be thinking of all the time when those bad, evil terrorists are making our threat condition burnt sienna.


  • Summary

Maybe some day in the enlightened future the various law enforcement agencies out there will actually bother to enforce traffic laws in addition to those related to speeding and the number of passengers in vehicles in the carpool lane. That way they could help encourage polite and safe driving behavior and reduce the number of accidents. Until that day comes, please follow these tips and stay safe, do it for the children!


09 May 2005

XEmacs 21.5.20-b2 for OS X


I’ve made a build of XEmacs 21.5.20 with the Carbon patches from Andrew Choi. You can download my build of the XEmacs.app right now. However, using it is up to you. I just thought I’d save some folks the trouble of doing the build until Andrew has one ready.

This is compiled on Mac OS X 10.4.0 and XTools 2, and may or may not work on earlier or later versions. You’ll probably have better luck if you unpack xemacs-sumo-date.tar.bz2 into ~/.xemacs or XEmacs.app/Contents/Resources/lib/ since a lot of the basic functionality depends on these packages.

For the paranoid in the crowd, there is a PGP/GPG signature file for the tarball above. If you have any reason to trust my PGP signature you’ll find that useful.


08 May 2005

Pool Disassembly


We’re part way through the long task of disassembling the above-ground pool and surrounding deck in our backyard. While it proved fun the few times we got a chance to use it, the cost of the chemicals to keep it going as well as a continuing parade of expensive failing equipment just doesn’t add up. When you wonder whether the green is the algae or the money spent on upkeep, it’s time to try something different.

At the moment the deck is 1/4 taken apart and the long since de-chlorinated water has been slowly siphoned out with hose over the last week. The treated lumber used to build the deck can probably be reused in other applications around the property. And the space left behind, well that’s still open to some discussion. I’d like to see a nice water garden with a pond of koi, but then that would require more upkeep than the pool did. I’m sure we’ll think of something…


04 April 2005

Going for a Walk


We are participating in the 2005 MS Walk to benefit the National MS Society, Greater Washington Chapter in Bellingham this upcoming weekend. If you’d like to make a donation, sponsor our walk and help those with multiple sclerosis, you can click this link to make a pledge.

For those who like to know about how efficiently the donated money is used, Charity Navigator has some details on this chapter of the National MS Society. The chapter’s website has more information about the programs and services they offer.


Twilight Zone Pinball in Issaquah


There is a Twilight Zone pinball game at the Red Robin restaurant in Issaquah. It looks fully functional aside from the clock being broken, although I didn’t manage to test the gumball machine or the “Powerball.”

I did get a replay on it though despite the touchy zero warnings tilt sensor.


02 April 2005

MySQL 5.0 “Triggers”


Just a quick note here after looking over this article about MySQL 5’s triggers while I was trying to find their “download the source” page. Apparently from inside a MySQL 5 trigger you can’t access information from any table. This basically reduces these “triggers” to being a local constraint; local because trying to do things with foreign keys would require a SELECT which is, of course, forbidden.

And there’s one more thing, don’t alter a table with triggers. It will crash your database. And triggers won’t be fired if there is a NOT NULL column. And a handful of other problems that they are working on right now. I’m sure they’ll get the hang of it eventually.

Yes, I usually use something else and it has a few of its own obscure problems with triggers.


31 March 2005

mod_dav Quota Patch Redux


I haven’t written about my patch to Apache httpd’s mod_dav module to show free disk space lately, and it apparently fell off the website when I moved things to the new server with built-in UPS. Thanks to the Internet Wayback Machine and TNPI, I’ve recovered the text and patch on the new server.

Anyone who has used Mac OS X’s iDisk tool may have noticed that the window shows how much space is available for writing unlike most WebDAV servers. I noticed this and wanted this feature on my own WebDAV server and created a patch to mod_dav that adds the needed properties. The specification for sending this information to clients is not finalized so this patch may stop working for some clients some day when the specification changes and clients change with it.

The patch is available here and should apply cleanly to the source for recent versions of Apache 2.0 (it was originally written for 2.0.47). This patch shows disk free, not quotas if you happen to have them enabled. And even then, the only the quota that applies to Apache is the quota for the user it runs as.

If you notice in the patch there are a couple places where real big numbers get divided by 512. This is because for some strange reason, when MacOSX’s mount_webdav bits calculate disk free they want to be getting the stats in 512-byte blocks. All the documentation I’ve found about <d:quota> and <d:quotaused> seems suggest that this number should be in bytes. But then again in those specs it was <d:quota-bytes>. /sbin/mount_webdav also does some really funny stuff when these numbers get large, I wonder in my mind if there is a buffer overflow or something lurking under the surface in mount_webdav’s quota handling.

The patch is much nicer now than it was when I first tried it in the handles the quota property. It handles this property through the avenues it is supposed to rather than pasting a quota onto every single PROPFIND that comes along. Whether that PROPFIND is looking for DAV:quota or not.

Further down the correct path than I am right now is implementing something along the lines of statfs(2) or statvfs(2) in the Apache Portable Runtime. Arguably it might be a better idea to just have functions that return the total disk space and available disk space. Especially since Windows may or may not support statfs() in its POSIX API. But in any case, the raw system calls in repos.c right now in this patch aren’t really appropriate.

It would be nice if this patch could be integrated into the Apache httpd project. That however will depend on the statfs calls being integrated into the APR.


Unethical Funding at WordPress


Apparently the people behind the WordPress project’s website, which includes the project’s founder, have decided that a good way to fund the project would be to use their Google PageRank to link to a lot of canned articles on topics that generate more advertising revenue than others. Some more details on this matter are available from Andy Baio’s blog and Ars Technica

It is deeply troubling that people associated with open source projects use resources that only have value because of unpaid community contribution and cash in on them. Unless that conversion is of impeccable ethics and completely transparent you’re bound to have a problem on your hands. In the case of the “Open Projects” (now Freenode) IRC network, there was a lack of transparency that led to the conclusion that Rob Levin was in fact using the donations that were advertised to “help the network” to pay his rent and feed his family. Certainly noble purposes, except that every other IRC network is run by volunteers who do the work mainly for free and when money is going to them to pay their living expenses that much is made more clear. This made some members of the user community upset.

In the case of WordPress, there is both the lack of transparency as to where the funds were used and the fact that the funds are being raised in a way that is certainly unethical. The link and page hiding method used is a violation of the contract between WordPress.org and Google for the AdWords program which opens the site maintainer and the project itself to lawsuits from Google, should they be feeling particularly nasty. As it is, Google has reset the pagerank for WordPress.org to zero and WordPress.org links are slowly disappearing from its search results. It doesn’t help matters that the project founder who is ostensibly responsible for this decision was on an extended vacation to various countries in Europe when this story broke. The particularly cynical might wonder how the vacation was funded.

At best, this was a tragic mistake on the part of the people responsible. The offending links and articles have now been removed, but it looks as if the damage is done and it may be too late for forgiveness from Google and many users.

I’m going to have to think long and hard about how much I can contribute to the WordPress parent project without getting myself tangled up in their apparently shaky ethics. I already had misgivings about the way they used the default links in the application to promote their personal blogs rather than useful community resources. (The lead developer brags about being Google’s “#1 most important Matt in the world” on his personal page, a direct result of his link being in the default install.) I had been planning to embark on a project to make WordPress database agnostic and did not want to deal with having to be a fork from the parent project. Perhaps a fork from the parent project would be better for the community though. The coming days and how this is all handled will shine a better light on which way is best to go.

For what it’s worth, I should point out that at no time have I been paid for my work on WordPress-pg and if I do receive such payment in the future I’ll be transparent about where the money is going and what I’m doing to repay the community for any such kindness.


30 March 2005

Can You Hear Me Now?


We’ve had one more hiccup in VoIP land. At first, we had only one provider for connecting long distance calls, SimpleTelecom. I’m not really sure what is wrong for them right now, but they aren’t completing calls. The IAX2 connector says “circuit-busy” and their call detail record says “Forbidden”. In any case, my call is not being connected and I want to talk to people. Good thing there are plenty choices and I’m not tied down.

In 15 minutes I setup an account with a competing long-distance provider, Teliax. Then with a small amount of change on the machine here, I was able to setup this new provider to be used in the event the first provider failed to complete my call. Voices didn’t transmit correctly when G729 compression was used, but forcing the call to G711-u seemed to fix things.

It was nice that adding new providers went relatively easily. On the other hand, people who get the “ready for your mother to use” services like Vonage, Packet8, and AT&T’s CallVantage are locked out of ever using another provider the same way people are traditionally used to with their normal plain old telephone service. When they have problems, there is no shopping for someone else that is working in the meantime. Vendor lock-in can be a bummer.


28 March 2005

Population: Tire


The bicycle riding experiment came to an abrupt stop Wednesday night as my front tube popped rather loudly just before 5th & Mercer and my wheel rim sliced the tire up on the pavement as I came to a stop. I’ve got replacement tubes and tires in place now and should be ready to go for tomorrow, which will, according to forecasts, be a jaunt in the rain.


27 March 2005

It Came From Progress Report on WordPress-Pg 1.5


I just checked in a little more progress on making things work. Lots of stuff to report and more general thoughts here as well…


  • Fix the Category List order strangeness in wp-admin/categories.php

  • Change the default links in the install to not include every person who ever wrote a line of WordPress code and instead point to the project pages and useful resources like the WordPress Codex.

    • I do realize this is a little on the gratuitous side, but I think it’ll provide helpful resources to new users. I don’t think new users want to see my blog.



  • Page Parent in wp-admin/page-new.php fixed to work properly

  • Pages list on visitor facing pages working

  • Viewing of static pages working

  • Fixed various uses of SQL year() to use extract(year from col) instead

    • It’s worth noting that this isn’t necessary if the ODBC functions are installed in PostgreSQL. There is probably some room for argument that we should just require that instead.


I think Keenan has been working on the upgrade scripts as well. Certainly a braver man than I, the way the parent project handles upgrading the schema scares me a fair bit. Before I saw today’s changes I almost wanted to suggest putting the kibosh on the whole “upgrade” script thing and just having an import script that takes care of it instead. In any case I think an “import from WordPress-MySQL 1.5” script probably has enough utility that it should be added to the to do list.


  • Install from scratch

  • Upgrade from 1.2 (?)

  • New blog entries work

  • New comments work

  • New static pages work

  • New categories work

  • New links work

The redirect stuff doesn’t work for some pages due to more year() issues. It throws a database error that details the problem, so that should be easy enough to fix. The XMLRPC code still needs to be examined and from a mile high view it looks like a hornet’s nest or a hive of villany or something like that.

There is, of course, plenty left to be addressed, but once the WP-Pg 1.5 work is done, hopefully work can begin towards a happier database agnostic future. And even more hopefully, the developers of the WordPress parent project would embrace those sorts of changes. Right now I get the impression there is ambivalence about the kinds of changes that would be required. It may turn out that, like so many technical hurdles, the hardest work required is in soothing the feathers of the people involved.


22 March 2005

Preparing to Bicycle to Work


With some motivation from listening to a coworker in Las Vegas, I’ve decided to start bicycling the last few miles to work instead of catching a bus or the monorail. Apparently some parts of the government are getting worked up about the general lack of exercise people get nowadays. The exercise will supposedly help with midday fatigue, as well as the obvious weight benefits from burning the calories.

Taking your bicycle into the city is a different sort of adventure than my usual mountain biking back in the sticks or on country roads within reach of our home. Getting the bicycle into the city has to be dealt with, that old U-lock just can’t be trusted to keep a bike in one place in the city nowadays, and having knobby tires isn’t a lot of use on city streets. So here’s a quick run through things I’ve had to find to make this all happen…

Roof Rack

A trip to the Seattle REI took care of the bicycle rack part. My old Cannondale mountain bike frame has a pretty hefty center tube that normal wheels-on claw type bike racks just can’t seem to cope with. I can recall more than one occasion driving down the freeway with the bike up top and hearing a loud clunk as the old claw rack lost its grip and the bike fell sideways hanging over the side of the car. That didn’t exactly do wonders for the wheels it was hanging from at that point either. Wheels-off racks won’t work either, the hydraulic caliper brakes make wheel changes a real fiasco. They do however make braking on muddy, wet, or otherwise slippery rims real easy.

Street Tires

I have a pair of slick street tires that I had purchased for the purpose of riding around town when I was in college. There are some bicycle messengers on the web that recommend mountain bikes with click tires to people getting started doing that work. So hopefully I’ll be set along those lines.

Bike Lock

The trip to REI also included getting a more serious way to attach the bike to fixed objects so it doesn’t just wander away when I’m not around to pay attention. Luckily Seattle isn’t quite New York in terms of bicycle theft, but I’m still not going to trust the old Kryptonite U-lock I have which is vulnerable to the cold spray trick, the Bic pen trick, the crowbar trick, and heaven only knows what else. To solve this problem, I’ve got a new Kryptonite chain which is made with squarish links that apparently are not friendly to bolt-cutters and a padlock with a guard around the shackle to keep it from getting cut. They have some product information about it online.

Helmet

I already had this, but it probably bears mentioning. Bicycling around downtown Seattle without a helmet would be insane, not to mention illegal. I can’t count the number of times I’ve had some idiot in a car or truck nearly run me down when I was walking across a crosswalk or even just walking on the sidewalk. Being attentive while driving apparently isn’t a requirement nowadays, so it’s best to have some protection for my valuable intellectual property.

We’ll see how this adventure goes and I’ll probably say more about it at some point in the future.


21 March 2005

The Return of Progress Report on WordPress-pg 1.5


I spent some quality time in a local coffee shop this evening pounding out more work on the port. Without further rambling here is the good and bad side of where we’re at now:


  • Installs from scratch works in my test environment

    • The logo image on the install page depends on a remote image, probably should get fixed to be local

    • The table creation statements in step 2 interleave wrong in my browser

    • There are some errors thrown by the index manipulation code in step 2

    • Haven’t tested an upgrade scenario of any sort (this probably won’t work)

    • Haven’t tested an import scenario of any sort (this certainly won’t work)



  • Creating new posts works

  • Creating new comments works

    • Comment status code is probably broken (badness related to comment_approved growing a new “SPAM” status which I’ve wound up implementing using NULL since this was made a boolean in the 1.2.x ports)



  • Creating new categories works

  • Creating new links works

  • The front page as well as individual post pages display correctly

  • The admin pages display mostly correct

    • There is some weirdness with the categories list in Manage Categories where root items are displayed twice except for the id 0 “Uncategorized” entries.



  • I’m seeing some database error messages on creating a post but can’t determine where they are coming from due to wp-db being obtuse and various bits of WordPress code turning error reporting off for no good reason

  • Haven’t even begun to look at xmlrpc.php yet. Making that go seems like it is going to be a bit of an adventure


  • Got the posts and categories displaying correctly on the end user parts

  • Fixed places where LIMIT M,N needed to become LIMIT N OFFSET M for PostgreSQL

  • Fixed more badness where “SHOW TABLE STATUS” was used to get the auto_increment counter for new categories, which resulted in new category creation working properly.

  • Default post category is now the special “Uncategorized” category. Some weird stuff was happening where the post_category would be 0 but wp_post2cat would have 1 in it for some reason


  • Cleanup database error messages to be able to know when things go wrong without tailing PostgreSQL’s logs

  • Make install.php use local images only

  • Fix install.php step 2 to use reindex rather than dropping and recreating indexes (which may be necessary for MySQL but not us)

  • Figure out and fix what is throwing the SQL syntax errors in post.php on “save as draft”

  • Fix the Category List order strangeness in wp-admin/categories.php

  • Change the default links in the install to not include every person who ever wrote a line of WordPress code and instead point to the project pages and useful resources like the WordPress Codex.

  • Change the default hello world comment and text to have some “Lorem Ipsum” copy in them to fill out space better.

So I’m going to be checking this all into CVS in a few minutes. I also took the time to add my thoughts about database abstraction approaches on the Using Alternative Databases page over on the WordPress Codex wiki. The WordPress-specific abstraction layer is going to work out best in the long haul. Highly generic abstraction layers for database access generally do poorly from optimization, performance and ease of coding points of view. And as the time spent on the 1.5 port demonstrates, the existing database code is a total fiasco for trying to add new databases to.