Wednesday, November 29, 2006

Python: Yahoo Looking for Aquarium Developers

I saw an email from a recruiter at Yahoo on the BayPiggies list today. He's looking for a Web developer, "We have deployed several applications using Cheetah templates and the Aquarium framework." I wrote Aquarium, so you can imagine how cool this is for me to see!

Blogger: New Template

I just picked a new template for this blog. Reading Ian Bicking's blog, I learned that fixed width columns are like totally uncool. Hence, I picked something that flowed to the page width.

If this new look pisses you off, I can change it back. If there's anything you see missing, please tell me. Otherwise, tell me if you like the new template. It's the one that irritated me the least.

Linux: Internet Explorer on Linux Using a Separate User Account

My library provides free access to Rosetta Stone which I wanted my kids to be able to use to learn Spanish. Rosetta Stone requires Shockwave which doesn't run under Linux like Flash does. The Ubuntu wiki offers some instructions on how to get it to work under Wine using a Windows version of Firefox. Alternatively, CrossOver Linux specifically supports Shockwave.

Unfortunately, neither of these options worked out for me on either of my laptops or in either Ubuntu 6.10 or Ubuntu 6.06. I was having weird X issues with both Wine and CrossOver Linux on my home machine. A bit of Googling suggested that the problem had not been fixed. My work machine wasn't being very cooperative either. In trying all the possible combinations of ways to get this to work, I wasted two days of my Thanksgiving vacation. I was really hoping that patience would lead to victory. Oh well, at least I upgraded my home laptop to Ubuntu 6.10 in the process.

There were some really nice instructions here about how to get IE to run under Linux. Since this would be useful to me as a Web developer, I decided to try it out. It worked really well. I even managed to get the Shockwave plugin working in IE--more on that in a bit.

It was late at night, so I went to bed. Having just installed IE, and since I'm pretty obsessive compulsive, I felt really dirty. In fact, I had nightmares all night. The next morning, I checked, and sure enough, IE had full access to all my files. I was hoping it was in some sort of Wine jail. I decided to wipe my entire home directory and restore it from backup. I felt better already! However, I still wanted access to IE. I decided to dedicate a user account just for IE. In order to access IE, I setup ssh with X11 forwarding so that I could run it while logged in as "jj" even though it's actually running as the "ie" user. Here's how:

First, I created a user using the "Users and Groups" system administration tool. I named it "ie". I saved the password. I used an unprivileged profile, although I did grant the user the "Use audio devices" privilege. I made sure that it had its own group named "ie".

Next, I did:
apt-get install wine
apt-get install cabextract
Then, as "jj", I installed my public ssh key into the "ie" account. If you don't know what I'm talking about, you can skip this step.

Then, per the instructions in the link above, as the "ie" user, I did:
    mkdir Desktop
wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
tar zxvf ies4linux-latest.tar.gz
cd ies4linux-*
./ies4linux
This installs into ~/.ies4linux. To run it, you use "/home/ie/.ies4linux/bin/ie6".

Then, as "jj", I did:
    cp /home/ie/Desktop/IE6.0.desktop ~/Desktop
I modified it so that the Exec line says:
Exec=ssh -Y ie@localhost /home/ie/.ies4linux/bin/ie6
This gave me a nice little icon to click on to launch IE without even thinking about the fact that it's running as a separate user.

Next, in IE, I installed the Shockwave Player. I had to play with the security settings in
IE's "Tools >> Internet Options >> Security" to get permission to do it. Not being a Windows user for almost a decade, this was all new to me.

After all that, it turns out that Rosetta Stone still wouldn't work. Sound didn't work in Shockwave, although it did work for the Flash plugin in IE. How frustrating! However, IE works now, and best of all, I don't feel dirty anymore!

Tuesday, November 21, 2006

Python, Pylons, Genshi, SQLAlchemy, and...Erlang!

Bet you don't think I'm crazy now!

MochiAds - Flash Game Ad Network

(Realistically, you probably still think I'm crazy.)

Wednesday, November 15, 2006

JavaScript: Douglas Crockford Video

Douglas Crockford is Yahoo!’s leading JavaScript Architect. He has written extensively on JavaScript and has been among the protagonists of the JavaScript developer community for more than a decade. Douglas is the discoverer of the JSON data format and a frequent contributor to YUIBlog.
I saw him give a talk at Yahoo's Hack Day, and it was amazing. The video is now available. Douglas provides an amazing historical perspective on JavaScript.

Tuesday, November 14, 2006

MySQL: Deleting Orphans

Referential integrity is a beautiful thing. Foreign key constraints are a godsend. However, sometimes, in certain situations you might have to get dirty and deal with orphans. Orphans are records that contain foreign key references to other records that don't exist anymore.

Suppose we have two tables, tags and article. Now suppose they have a many to many relationship via the tag_article_map table. Now, suppose for some unknown reason that someone deleted some tags from the tags table. We may now have orphans in the tag_article_map table. How do we delete them? Some special MySQL syntax makes it quite easy:
DELETE tag_article_map FROM tag_article_map
LEFT JOIN tags
ON tag_article_map.tag_id = tags.tag_id
WHERE tags.tag_id IS NULL;
References:

Books: Building Scalable Web Sites

Imagine if Forrest Gump developed a famous Web site. Imagine if one day he sat down on a park bench to tell you how he did it. Now, imagine it with a strong English accent ;)

"Building Scalable Web Sites" is a virtual brain dump of everything technical that you need to know in order to build something like Flickr. (The author, Cal Henderson is the engineering manager for Flickr.) If you're a new engineer, it might be a godsend. If you're a more senior engineer with little time and less patience, it can be incredibly frustrating.

I found myself alternating between these two extremes. I was tearing my hair out when Cal spent five pages explaining what source control is and listing its basic features. I questioned relevance when Cal explained how to write an HTTP client from scratch in PHP (p. 143), and I was baffled when the very next section randomly jumped to the topic of "Remote Services Redundancy" (p. 145). On the other hand, I was grateful when Cal showed me how to use Ganglia as a wrapper for RRDTool to collect and graph application-specific metrics.

This book lacked O'Reilly's standard polish. For instance, in one code sample, the indentation didn't match the braces (p. 148). There's a simple typo, "abilityto" (p. 108), that shouldn't have made it past a spell checker, let alone an editor. It makes me wonder if O'Reilly was rushing this book out the door because Flickr is hot right now, or perhaps "translating" Cal's British English was burdensome on the editors.

In summary, about 30% of the material was new to me. I patiently marched through what I already knew, and I managed to learn a few new things, for which I'm thankful.

Wednesday, November 08, 2006

Vim: Email from Bram Moolenaar

Whee! I got email from Bram Moolenaar, the author of Vim, because of a trivial doc bug I submitted last night! I feel famous!

(Gees, I really should help him help AIDS victims like Vim always asks me to do.)

Vim: More Vim Tidbits

I reread "vimtutor" for the first time in years. I learned a few things:
e
"e" is a motion that means "to the end of the word". "ce" is useful.

/searchterm<enter>nN
When searching, "n" to search forward, "N" to go backwards. Start with "?" to aways go backwards. I had forgotten about "N".

:#,#s/old/new/g
Do a search and replace only between two line numbers.

:%s/old/new/gc
Do a search and replace with prompts.

:r !shellcommand
Execute a shell command and insert the results at the cursor.

R
This is over-write mode.

partial-command^D<tab>
Show possible command completions, then tab to complete.

evim
gvim in "easy" mode.
In the Vim tutorial, there's a mention of "$VIMRUNTIME/vimrc_example.vim" which I had never seen before. This helped me to improve my own .vimrc:
" These are general settings.
colorscheme torte
set autoindent
set guifont=Monospace\ 9
set hlsearch
set incsearch
set ruler
set showcmd

" Allow backspacing over everything in insert mode.
set backspace=indent,eol,start

" "T" toggles the taglist for ctags.
map T :TlistToggle<CR>

" Enable file type detection. Use the default filetype settings, so that
" mail gets 'tw' set to 72, 'cindent' is on in C files, etc. Also load
" indent files, to automatically do language-dependent indenting.
syntax on
filetype plugin indent on

" Put these in an autocmd group, so that we can delete them easily.
augroup vimrc
au!
autocmd FileType css setlocal sw=4 sts=4 et
autocmd FileType html setlocal sw=2 sts=2 et
autocmd FileType java setlocal sw=4 sts=4 et
autocmd FileType javascript setlocal sw=4 sts=4 et
autocmd FileType mason setlocal sw=2 sts=2 et
autocmd FileType ocaml setlocal sw=2 sts=2 et
autocmd FileType php setlocal sw=2 sts=2 et
autocmd FileType perl setlocal sw=4 sts=4 et
autocmd FileType python setlocal sw=4 sts=4 et tw=72
autocmd FileType scheme setlocal sw=2 sts=2 et
autocmd FileType sql setlocal et
autocmd FileType htmlcheetah setlocal sw=2 sts=2 et
autocmd FileType text setlocal sw=2 sts=2 et tw=79
augroup END
Now that I know how to turn on intelligent indentation *and* still control it on a per-language basis, I'm even happier :)

Friday, November 03, 2006

Scalability: The Scaling Myth

Scalability is not about using Java...We can create a scalable system in PHP that contains only one tier, no XML, no Java, and isn't even very fast:
<?php
sleep(1);
echo "Hello world!";
?>
...It meets our three scalability criteria nicely. We can accommodate traffic growth by adding more web servers; nothing in the code needs to be changed...Our code is also very maintainable; there's not a trained programmer out there who couldn't figure out how to maintain it--for instance, if we needed to change it to say "Hello there". ["Building Scalable Web Sites" p. 203]