I started developing Google Gadgets for LabPixies, so one of the first things I looked for was syntax highlighting. Vim recognized the gadgets’ code as an XML file (which is correct), but I also wanted HTML syntax highlighting for the HTML part. So, after searching a bit for an existing solution, I found one, but I didn’t like it, as it required me to wrap the HTML code with a specific comment. As I don’t like this kind of solution, I’ve decided to create my own syntax highlighting file for Vim.
Continue reading Vim Syntax Highlighting for Google Gadgets
Month: March 2008
Scanning Documents Written in Blue Ink – biscan
After writing the post on converting PNMs to DjVu, I’ve run into some trouble scanning documents written in blue ink. The problem: XSane didn’t allow me to set the threshold for converting the scanned image to line-art (B&W). So, I tried scanning the document in grayscale and in color and converting it afterward to bitonal using ImageMagick. This ended up with two results. When I used the -monochrome command-line switch, the conversion looked good, but it used halftones (dithering). When I tried to convert it to DjVu, it resulted in a document size twice as large as normal B&W would. The other thing that I tried was using the -threshold switch. The DjVu-compressed document size was much better now, but the document was awful-looking; either it was too dark, or some of the text disappeared. After giving it some thought, I knew I could find a better solution.
Continue reading Scanning Documents Written in Blue Ink – biscan
Convert PNMs to DjVu
I’ve decided to scan some notebooks. After researching a bit, I’ve decided to use DjVu instead of PDF, which I normally use. I’ve chosen to use DjVu because it offered great quality with a very good compression rate (~26KB per page) in lineart (black and white).
While XSane can natively save a multipage project into PDF, it can’t do so for DjVu. So the solution is to use the PNMs generated by XSane and convert them using the command line tools offered by DjVuLibre to bundle them together into a DjVu file. As you can guess, doing this manually is pretty hard work. To make this task easier, I’ve written a small bash script to automate the process.
Continue reading Convert PNMs to DjVu
Trailing Whitespace Causes a Session to Be Destroyed in CakePHP
While working on a new project using CakePHP, I’ve come across a weird problem. In one of the controllers, the session always came out as invalid, as
$this->Session->valid()
always returned false. I tried debugging this weird stuff, and it looked like all the session variables were unset. Using
$this->Session->error()
to get the last error returned “Config doesn’t exist”. After further debugging, “Config” turned out to be an internal array that is saved by CakePHP to the session and holds various internal data (some of it is used for validation, like a user-agent hash). I kept printing more and more debugging data, as well as looking at CakePHP’s trac system.
I found an interesting bug (ticket #4217), and it looked very promising, as it almost fully described my problem. Unfortunately, the solution offered didn’t seem to work for me. But it inspired me to try starting the session manually using session_start() instead of using Cake’s startup and activate methods of the Session Component.
I found out that session_id() returned an empty string. Luckily, calling session_start() directly from the controller gave me a lead. The session seemed to work well, but a nasty error about headers already being sent showed up.
A little more investigation led me to realize that I had a trailing newline after my closing PHP tag in that controller file. Deleting this trailing whitespace completely solved the problem. There was no need anymore to manually start the session. It’s pretty annoying that such a small thing as a trailing newline can cause such seemingly unrelated problems in CakePHP’s session handling.
Maybe CakePHP should add a little debug notice when the session doesn’t start because headers were already sent. This can be done by modifying the else statement in the __startSession() method in cake/lib/session.php (line 557 in version 1.2.0.6311). I wonder what the reason was for not informing the developer when such an event happens, as I don’t see why someone would deliberately try to start the session after sending the headers. I think it only happens by mistake, at least most of the time.
Backup Directories to Amazon S3 Script
This is a small script I wrote today to automate my backups, which I do on Amazon S3. This is a fairly short, yet useful, bash script that utilizes s3cmd to do the actual sending of the files.
Continue reading Backup Directories to Amazon S3 Script