Planet Bozo

February 22, 2012

Worse Than FailureCodeSOD: The Phony

"My first impression of my predecessor was a positive one," writes Michal Ochman, "he was well-spoken, sharply dressed, and seemed to be an all-around nice guy."

"My first impression of my predecessor's code was also positive — it was sanely structured, well-commented, and all-around seemed pretty clean. And then I started actually looking through it. It was filled with a lot of... well... this."

<?php

/* Base 64 Encoding function **
** PHP does it natively but just for consistency and 
** ease of maintenance, let's declare our own function **/
function base64Encode($plain) {

  // Initialise output variable
  $output = "";

  // Do encoding
  $output = base64_encode($plain);

  // Return the result
  return $output;
}

/* Base 64 decoding function **
** PHP does it natively but just for consistency and 
** ease of maintenance, let's declare our own function **/
function base64Decode($scrambled) {

  // Initialise output variable
  $output = "";

  // Do encoding
  $output = base64_decode($scrambled);
 
  // Return the result
  return $output;
}

?>

Michal continued, "after getting to know some of my new coworkers, they described my predecessor as 'seemingly a nice guy at first, but really just a phony'. I guess I could see that."


XKCDOrion Nebula

February 21, 2012

Worse Than FailureSteve's Email

For a ramen-fueled college student, a job offer that actually involves doing the work you're in school to learn and has a paycheck that can't be beat flipping burgers is a wonderful score. For Ted, that score came from a company run by alumni from his school that gave out pretty plum gigs to top students.

They were a support company, that contracted out to run the IT infrastructure for other companies. While the support company actually cut Ted's check, they were a small company. 90% of their business came from a single customer, the PubCong publishing conglomerate. It was for PubCong that Ted would be actually working.

"It's a little bit of a mess," Chris, Ted's boss, explained as he showed Ted around the server room. It didn't look like a mess- to the contrary, it looked like a top-flight server room all the way from beneath the raised floors to the million dollar cooling system over their heads. "It's so clean in here because we're the first people in here in six months that weren't here to dust. They paid a lot of money to have this installed, but they didn't actually hire anyone to maintain it until we came along."

Chris broke down some lowlights of the Mad Maxian <script src="http://www.cornify.com/js/cornify.js" type="text/javascript"></script> wasteland of administration-by-user, but it boiled down to, "the hardware's in great shape, but everything else has been installed, configured, and maintained by secretaries, janitors, and a creepy Austrialian kid with a razor boomerang." They didn't know what was installed or where it might be deployed, or who was responsible for it. For the time being, Ted was given an SSH shell account, some instructions to help run an inventory, and the command to "poke around, but don't break anything, try not to get killed."

Chris ran off to do whatever it is bosses do, and Ted did exactly as ordered until 6PM. The service-desk phone started ringing. Ted eyed it for a ring or two. He wasn't really sure if he should take the call- he was new, hadn't really been trained, and didn't know the procedures. Still, he had done campus helldesk. It was probably just a printer jam. Ted could handle that. Before the fifth ring, he answered.

"…you useless idiotic foolish- hello? Finally. The phone's been ringing for ages. It's Steve. You need to fix mi email."

Ted's helldesk instincts kicked in. "Okay, Steve. This is Ted. What kind of trouble are you having?"

Steve spoke in slow, even tones, as if he were explaining the complexities of quantum mechanics to a hungry, brain-damaged shark. "I. Can't. Read. My. Email."

Ted forced himself to smile at the handset, and asked, "Are you seeing some kind of error?"

"'Authorization failed.' Look, can you actually fix this or not?"

Ted went down the basic email-problem checklist, but just getting Steve's username was a challenge. "What do you mean you don't know my username? Are you slow, or something? I'm Steve!" Eventually, Ted confirmed that stevem had been hammering the POP3 server for most of the day, and the password had failed until the account was locked. Ted also noticed that the user data for stevem indicated that he was a C-level executive for the company.

"Well, it does look like your password is incorrect," Ted said.

"I'm sure you think so Tim, but I have it written down right here in front of me. I know what my password is."

"Well, perhaps you mispelled something," Ted offered helpfully.

"Then tell me what my password is and I'll check."

"I can't tell you your password," Ted said.

"Excuse me, Todd? Do you know who I am? If you value your job, you're going to tell me my password right now!"

Ted wasn't going to fiddle with an account password just because someone was screaming at him, even if he could have checked what it was. These mail accounts were also shell accounts, and he wasn't going to grant some hacker access to the system just because they screamed loudly on the phone. "I can't do this over the phone," Ted said, "but if you're in your office, I can come down and reset your password."

"In the office? Are you insane? It's 6:15. Some of us are busy people, Tad. Now tell me what my password is. Now are you going to do what I tell you or…"

"Let me get Chris on the line," Ted said. Chris knew Steve, and after only a few seconds of listening to Steve screaming about the coming lawsuit, Chris confirmed that Steve was in fact, Steve M, the CIO of PubCong. Chris gave Ted permission to do anything Steve asked.

"Okay," Ted said, "I'll just reset your password…"

"I don't want it reset. Just tell me what it is you moron!"

Ted set Steve's password to "stevie123" and said, "Oh, it's 'stevie123', all lower-case."

"Hmm… that's not what's on my post-it. Mine doesn't have any numbers in it. No, it doesn't work. You've given me someone else's password."

Ted checked the logs, and saw no attempt had been made to log in. "No, that really is your password. You're trying to log in as stevem@pubcong.com, right?"

"What? No. Stevem@aol.com. Y'know, the email service. How can you work in IT and not know that!"


February 20, 2012

Worse Than FailureCodeSOD: The Sentimental Query

After weeks, months, or even years of setting up and preparing to sell, it’s always exciting to get those few customers. Depending on the venture, it may not be worth popping open a bottle of Champagne, but no matter how small the sale, one can’t help but take a few moments to pause and smile before struggling to get that next batch of sales.

By the time the 13,853rd customer rolls around, no one blinks an eye. It’s just business as usual. That is, unless you work at Ruben’s company. When a new customer record is created, their server not only takes a moment to celebrate, but it nearly brings down the entire server with this unique way of finding the next available customer number:

SELECT * FROM customer
WHERE id_customer  != '4' AND id_customer !='10' AND id_customer !='11'
  AND id_customer !='13' AND id_customer !='14' AND id_customer !='15' 
  AND id_customer !='16' AND id_customer !='17' AND id_customer !='18' 
  AND id_customer !='19' AND id_customer !='20' AND id_customer !='21' 
  AND id_customer !='22' AND id_customer !='23' AND id_customer !='24' 
  AND id_customer !='25' AND id_customer !='26' AND id_customer !='27' 
  AND id_customer !='28' AND id_customer !='29' AND id_customer !='30' 
  AND id_customer !='31' AND id_customer !='32' AND id_customer !='33' 
  AND id_customer !='34' AND id_customer !='35' AND id_customer !='36' 
  AND id_customer !='37' AND id_customer !='38' AND id_customer !='39' 
  AND id_customer !='40' AND id_customer !='41' AND id_customer !='42' 
  AND id_customer !='43' AND id_customer !='44' AND id_customer !='45' 
  AND id_customer !='46' AND id_customer !='47' AND id_customer !='48' 
  AND id_customer !='49' AND id_customer !='50' AND id_customer !='51' 
  AND id_customer !='52' AND id_customer !='53' AND id_customer !='54' 
  AND id_customer !='55' AND id_customer !='56' AND id_customer !='57' 
  AND id_customer !='58' AND id_customer !='59' AND id_customer !='60' 
  AND id_customer !='61' AND id_customer !='62' AND id_customer !='63' 

  ... snip several thousand lines ...

  AND id_customer !='13789' AND id_customer !='13790' AND id_customer !='13792' 
  AND id_customer !='13793' AND id_customer !='13794' AND id_customer !='13795' 
  AND id_customer !='13796' AND id_customer !='13797' AND id_customer !='13798' 
  AND id_customer !='13799' AND id_customer !='13800' AND id_customer !='13801' 
  AND id_customer !='13802' AND id_customer !='13803' AND id_customer !='13804' 
  AND id_customer !='13805' AND id_customer !='13806' AND id_customer !='13807' 
  AND id_customer !='13808' AND id_customer !='13809' AND id_customer !='13810' 
  AND id_customer !='13811' AND id_customer !='13812' AND id_customer !='13813' 
  AND id_customer !='13814' AND id_customer !='13815' AND id_customer !='13816' 
  AND id_customer !='13817' AND id_customer !='13818' AND id_customer !='13819' 
  AND id_customer !='13820' AND id_customer !='13821' AND id_customer !='13822' 
  AND id_customer !='13823' AND id_customer !='13824' AND id_customer !='13825' 
  AND id_customer !='13826' AND id_customer !='13827' AND id_customer !='13828' 
  AND id_customer !='13829' AND id_customer !='13830' AND id_customer !='13831' 
  AND id_customer !='13832' AND id_customer !='13833' AND id_customer !='13834' 
  AND id_customer !='13835' AND id_customer !='13836' AND id_customer !='13837' 
  AND id_customer !='13838' AND id_customer !='13839' AND id_customer !='13840' 
  AND id_customer !='13841' AND id_customer !='13842' AND id_customer !='13843' 
  AND id_customer !='13844' AND id_customer !='13845' AND id_customer !='13846' 
  AND id_customer !='13847' AND id_customer !='13848' AND id_customer !='13849' 
  AND id_customer !='13850' AND id_customer !='13851' AND id_customer !='13852' 
;


XKCDFirst Post

February 17, 2012

Worse Than FailureError'd: Departing in 9999 Minutes

XKCDGood Cop, Dadaist Cop

February 15, 2012

etbeLinks February 2012

Sociological Images has an interesting article about the attempts to apply the word “Camping” to OWS and framing the issues [1].

Lester Macgurdy wrote an insightful article about “the snake”, a new technique for OWS protesters to beat riot police [2].

Ron Barassi suggests that “Australia Day” be celebrated on the 27th of May to commemorate the day in 1967 when the Australian constitution was amended to not be racist [3]. The current “Australia Day” is often referred to as “Invasion Day”. IMHO Ron deserves another “Best and Fairest” award.

Stefon Harris gave an entertaining TED talk about improv Jazz music titled “There Are No Mistakes on the Bandstand” [4]. It seems that his concepts can apply to some extent to many collaborative projects.

John Robb wrote an interesting article about the future of drone (UAV) warfare [5]. He suggests that having one person control each drone is a temporary thing and that the future is to have a cloud of cheap autonomous drones taking strategic control from one person. His comparison of Starcraft players to future drone fighters is interesting.

The OWS movement is branching out into other related areas, OccupyYourHomes.org is one of the latest ones [6]. When banks try to forclose on homes without good cause the OWS people are protesting.

Cory Doctorow wrote an important article for The Guardian about corporations using the Youtube ContentID system to pirate works that other people have uploaded [7].

Matt Taibbi’s description of Goldman Sachs as “a great vampire squid wrapped around the face of humanity, relentlessly jamming its blood funnel into anything that smells like money” will never die [8]. It has spawned many other creative descriptions of the evil and greed of Goldman Sachs and even Lloyd Blankfein of Goldman Sachs describes his company as having “burned down the Reichstag, shot the Archduke Ferdinand and fired on Fort Sumter” – he was trying to use satire, but I don’t think that Goldman Sachs people would act differently to Fritz Thyssen.

Keith Packard wrote an interesting article about the Calypso CalDAV system which he uses with Android [9]. He makes lots of good points about how to improve calendaring and contacts on Android, unfortunately I lack time to fiddle with such things at the moment so I’ll stick with Google in spite of the risks.

Asheesh Laroia wrote a great article about the problems with short (32bit) GPG keys [10]. It seems that creating keys with matching ID numbers isn’t particularly difficult and that GPG doesn’t handle them as well as we would like giving the possibility of at best annoying DoS attacks and at worse security problems due to using the wrong key.

Sociological Images has an interesting article about when game show audiences are trustworthy [11]. It seems that French people don’t want an undeserving person to win so they will intentionally advocate the wrong answer if the contestant should know it.

Paul Wayper gave a great lecture titled “SE Linux for Everyone” [12]. He covers the basics of SE Linux in a user-friendly way and explains some simple solutions to common problems which don’t involve compromising system security.

Paul Tassi wrote an insightful article for Forbes about piracy [13]. His conclusion is that the media companies should make it cheaper and easier to be a customer and not spend insane amounts of money on low quality products.

The Reid Report has an interesting article about Ron Paul’s racism [14]. Ron Paul is generally well regarded outside the US because he wants the US government to stop meddling in the affairs of other countries, but while he’s less bad than other US politicians in terms of foreign policy that doesn’t make him a good person.

Anonymous hacked some mailboxes belonging to a neo-Nazi group and found links to Ron Paul [15]. I’ve always been suspicious of the way Ron Paul wanted to avoid anti-racism legislation on supposed Libertarian principles.

The Reid Report has an interesting summary of Ron Paul news plus some criticism of Glenn Greenwald and others who associate with him [16].

Related posts:

  1. Links February 2011 Australia’s Department of Finance has mandated that the MS-Office document...
  2. Links January 2012 Cops in Tennessee routinely steal cash from citizens [1]. They...
  3. Links February 2009 Michael Anissimov writes about the theft of computers from the...

February 14, 2012

XKCDBackward in Time

February 13, 2012

etbeCooling a Thinkpad

Late last year I wrote about the way that modern laptops suck [1]. One of the problems that inspired that post was the excessive heat generated by my Thinkpad T61.

There is a partial solution to this, Fool Control explains how the kernel option pcie_aspm=force can be used on kernels from 2.6.38 onwards to solve a heat regression problem [2]. I applied this to my Thinkpad T61 and the result was that on a cool evening (ambient temperature about 24C) the temperature changed from 85C to 66C on the NVidia video card, and for the “virtual devices” it changed from 80C and 78C to 60C and 61C. I’m not sure exactly what each of those measurements refers to, but it seems that the change was somewhere between 17C and 20C.

This changes the system from being almost unbearable to use to being merely annoyingly warm.

I’m not going to make my laptop be my primary computing device again though, the combination of a desktop system with a 27″ monitor and an Android phone is working quite well for me [3]. But I haven’t yet got version control systems working for all my software. Also Wouter suggested using NBD which is something I haven’t got working yet and probably won’t until I can swap on it and therefore have a diskless workstation. Finally I still haven’t got the “Chrome to Phone” browser extension working such that a page I’m viewing at home can be loaded on my phone.

Related posts:

  1. Taking my Thinkpad Apart and Cooling Problems I’ve been having some cooling problems with my Thinkpad recently....
  2. thinkpad back from repair On Tuesday my Thinkpad was taken for service to fix...
  3. I Just Bought a new Thinkpad and the Lenovo Web Site Sucks I’ve just bought a Thinkpad T61 at auction for $AU796....

February 11, 2012

etbeMagic entries for BTRFS and Software RAID

I’ve just discovered that the magic database for the file(1) command in Debian/Unstable has no support for Linux Software RAID and that it’s support for BTRFS is lacking (no reporting of space used, number of devices, or the UUID). Below is my first draft of a change to fix these problems. I would appreciate it if someone with a big-endian system could test these out and let me know how they go, I suspect that I will have to change the “lelong” types to “long” but I’m not sure.

4096 lelong 0xa92b4efc Linux Software RAID
>4100 lelong x version 1.2 (%d)
>4112 belong x UUID=%8x:
>4116 belong x \b%8x:
>4120 belong x \b%8x:
>4124 belong x \b%8x
>4128 string x name=%s
>4168 lelong x level=%d
>4188 lelong x disks=%d

0 lelong 0xa92b4efc Linux Software RAID
>4 lelong x version 1.1 (%d)
>16 belong x UUID=%8x:
>20 belong x \b%8x:
>24 belong x \b%8x:
>28 belong x \b%8x
>32 string x name=%s
>72 lelong x level=%d
>92 lelong x disks=%d

# BTRFS
0×10040 string _BHRfS_M BTRFS Filesystem
>0x1012b string >\0 label "%s",
>0×10090 lelong x sectorsize %d,
>0×10094 lelong x nodesize %d,
>0×10098 lelong x leafsize %d,
>0×10020 belong x UUID=%8x-
>0×10024 beshort x \b%4x-
>0×10026 beshort x \b%4x-
>0×10028 beshort x \b%4x-
>0x1002a beshort x \b%4x
>0x1002c belong x \b%8x,
>0×10078 lequad x %lld/
>0×10070 lequad x \b%lld bytes used,
>0×10088 lequad x %lld devices

Related posts:

  1. Label vs UUID vs Device Someone asked on a mailing list about the issues related...
  2. Starting with BTRFS Based on my investigation of RAID reliability [1] I have...
  3. Software vs Hardware RAID Should you use software or hardware RAID? Many people claim...

February 10, 2012

etbeStarting with BTRFS

Based on my investigation of RAID reliability [1] I have determined that BTRFS [2] is the Linux storage technology that has the best potential to increase data integrity without costing a lot of money. Basically a BTRFS internal RAID-1 should offer equal or greater data protection than RAID-6.

As BTRFS is so important and so very different to any prior technology for Linux it’s not something that can be easily deployed in the same way as other filesystems. It is possible to easily switch between filesystems such as Ext4 and XFS because they work in much the same way, you have a single block device which the filesystem uses to create a single mount-point. While BTRFS supports internal RAID so it may have multiple block devices and it may offer multiple mountable filesystems and snapshots. Much of the functionality of Linux Software RAID and LVM is covered by BTRFS. So the sensible way to deploy BTRFS is to give it all your storage and not make use of any other RAID or LVM.

So I decided to do a test installation. I started with a Debian install CD that was made shortly before the release of Squeeze (it was first to hand) and installed with BTRFS for the root filesystem, I then upgraded to Debian/Unstable to get the latest kernel as BTRFS is developing rapidly. The system failed on the first boot after upgrading to Unstable because the /etc/fstab entry for the root filesystem had the FSCK pass number set to 1 – which wasn’t going to work as no FSCK program has been written. I changed that number to 0 and it then worked.

The initial install was on a desktop system that had a single IDE drive and a CD-ROM drive. For /boot I used a degraded RAID-1 and then after completing the installation I removed the CD-ROM drive and installed a second hard drive, after that it was easy to add the other device to the RAID-1. Then I tried to add a new device to the BTRFS group with the command “btrfs device add /dev/sdb2 /dev/sda2” and was informed that it can’t do that to a mounted filesystem! That will decrease the possibilities for using BTRFS on systems with hot-swap drives, I hope that the developers regard it as a bug.

Then I booted with an ext3 filesystem for root and tried the “btrfs device add /dev/sdb2 /dev/sda2” again but got the error message “btrfs: sending ioctl 5000940a to a partition!” which is not even found by Google.

The next thing that I wanted to do was to put a swap file on BTRFS, the benefits for having redundancy and checksums on swap space seem obvious – and other BTRFS features such as compression might give a benefit too. So I created a file by using dd to take take from /dev/zero, ran mkswap on it and then tried to run swapon. But I was told that the file has holes and can’t be used. Automatically making zero blocks into holes is a useful feature in many situations, but not in this case.

So far my experience with BTRFS is that all the basic things work (IE storing files, directories, etc). But the advanced functions I wanted from BTRFS (mirroring and making a reliable swap space) failed. This is a bit disappointing, but BTRFS isn’t described as being ready for production yet.

Related posts:

  1. Discovering OS Bugs and Using Snapshots I’m running Debian/Unstable on an EeePC 701, I’ve got an...
  2. Reliability of RAID ZDNet has an insightful article by Robin Harris predicting the...
  3. How I Partition Disks Having had a number of hard drives fail over the...

November 11, 2011

Dave HallDrupal in the Enterprise (aka Vote for my DrupalCon Session)

TL; DR: [spam]Please vote for my DrupalCon Denver proposal on Drupal workflows in the enterprise.[/spam]

For the last few months I've been working for Technocrat on a new Drupal based site for the Insurance Australia Group's Direct Insurance brands. The current sites are using Autonomy Teamsite.

The basics of the build are relatively straight forward, around 1000 nodes, a bunch of views and a bit of glue to hold it all together. Where things get complicated is the workflow. The Financial services sector in Australia is subject to strict control of representations being made about products. The workflow system needs to ensure IAG complies with these requirements.

During the evaluation we found that generally Drupal workflows are based around publishing a single piece of content on the production site. In the IAG case a collection of nodes need to be published as a piece of work, along with a new block. These changes need to be reviewed by stakeholders and then deployed. This led us to build a job based workflow system.

We are using the Features module to handle all configuration, deploy for entities and some additional tools, including Symfony, Jenkins and drush to hold it all together.

I've proposed the session for Drupal Downunder in January and will refine the session based on feedback from there in preparation for Denver. If you want to learn more about Drupal Workflows in the Enterprise, please vote for my session.

May 16, 2011

Dave HallDrush Make and Module Dependencies

Drush make is a wonderful tool for constructing Drupal platforms. A lot of Drupal developers are used to adding a list of modules, a few libraries and theme or 2 then running drush make to build their platform. It all seems pretty easy. What if I told you module developers could make things even easier for site builders?

Some contrib modules depend on third party libraries, and due to various reasons they can't always be stored in git repositories on drupal.org and included in the module release. To solve this problem module developers can include a .make file for their module. Drush recursively processes make files, so the module make file would be processed once found by drush make.

A good example of where this could be useful is the SMTP module, which depends on the LGPL licensed PHPMailer library. The module also requires a patch to be applied to the library, which drush make can apply for us. The following .make file could be included in the SMTP module as smtp.make:

core = 6.x
api = 2

libraries[phpmailer][download][type] = "get"
libraries[phpmailer][download][url] = "http://downloads.sourceforge.net/project/phpmailer/phpmailer%20for%20php5_6/Previous%20Versions/2.2.1/phpMailer_v2.2.1_.tar.gz"
libraries[phpmailer][download][md5] = "0bf75c1bcef8bde6adbebcdc69f1a02d"
libraries[phpmailer][directory_name] = "phpmailer"
libraries[phpmailer][destination] = "modules/contrib/smtp"

libraries[phpmailer][patch][drupal-compatibility][url] = "http://drupalcode.org/project/smtp.git/blob_plain/2acaba97adcad7304c22624ceeb009d358b596e3:/class.phpmailer.php.2.2.1.patch"
libraries[phpmailer][patch][drupal-compatibility][md5] = "2d82de03b1a4b60f3b69cc20fae61b76"

Now when the SMTP module is included a normal drush make file it will be downloaded, the PHPMailer library will be downloaded and patched ready for use.

Unfortunately there are some limitations to this approach. Firstly it assumes that the SMTP module will be installed under the modules/contrib directory, which is accepted best practice, but may not suit everyone's needs. When I tested this with the current stable version of drush make (6.x-2.2) it failed, and drush make 6.x-3.x from git needed to be patched. Hopefully a fix for this can be backported to the 6.x-2.x branch and included in a future release.

Update: I have posted the make file for the SMTP module as patch in issue #1159080.

April 02, 2011

Dave HallFixing Zimbra's Broken debs

As much as I love Zimbra, I find their Debian packaging frustrating. Why do they insist on shipping half broken debs? I can excuse vmware for being too lazy to provide proper descriptions for their packages, although the generic "Best email money can buy" text seems a little lame. Failing to populate the "Provides" field is brain dead. This makes it possible to install mailx on a server running Zimbra without installing another MTA.

I've created a simple workaround deb which provides mail-transport-agent and depends on zimbra-mta. The deb also symlinks the zimbra sendmail binary to /usr/sbin/sendmail - where it belongs. Now mailx and other tools which depend on mail-transport-agent can be installed. The package should work with both Debian and Ubuntu.

The source available on github, or you can download a prebuilt platform independent deb from github's download manager. The package is released under the terms of the WTFPLv2.

I hope that Zimbra builds better debs and makes this package obsolete.

February 05, 2011

Dave HallHelp a Drupal Geek Earn his Way to DrupalCon Chicago

I really want to attend DrupalCon Chicago, which kicks off in just over 4 weeks. The problem is that since DrupalCon Copenhagen business has been pretty quiet and so I find that I can't really afford to fund it myself. After deciding I had to be in Chicago I got creative about how to make it happen. The buy a line project was born.

Instead of just asking people to kick in some cash to get me to Chicago, I felt it was only right to earn my keep. People can buy a line of code, or sentence of documentation for Drupal. All code and docs created will be contributed to drupal.org. Buyers are free to specify where the lines are to be contributed, or leave me to decide. I'm looking forward to writing some of the lines on the Drupal Bus.

Recently I have been working on porting the UUID module to Drupal 7. I hope to get this module into Drupal 8 core. To make this happen I have to be in Chicago! Improvements to UUID will mean that content can be packaged up and moved around like configuration can be using the Features module.

All buy a line issues will be tagged so people can watch my progress. The first lines of code have been contributed to the getID3() module, so Drupal Commons can be installed by Aegir.

Thanks to everyone who has contributed so far. I have almost covered the DrupalCon ticket I bought from the Gizra team.

Please consider buying a line (or more) to help get this Drupal geek to Chicago. This is a great way of getting a module ported to Drupal 7, better documentation or even just a bug fixed. I have a decent track record of contributing to the project.

When deciding how many lines to buy, think about this - if I don't make it to Chicago, who will lock themselves out of their hotel room at 4am - naked!

October 24, 2007

mahafuz