Skip to main content


Showing posts from October, 2006

Python: Myghty vs. Django templates

It came out today on the Genshi mailing list that Myghty performs far better than Django templates. I personally think that the productivity improvements afforded by Genshi by things such as its match mechanism and the fact that you don't have to worry about XSS attacks fully compensate for any loss in performance. However, I'd like to say something specifically about Myghty vs. Django templates. Both are good software. Both have friendly authors. I personally think in this case the performance issue is a red herring. If you can't trust your template authors to run with scissors, you should not use Myghty. If your template authors know the difference between a function and a dict, you shouldn't use Django templates. I think that what the Django guys did makes a lot of sense for their situation, but using Django templates drives someone like me crazy. I like to create functions (containing re-useable bits of HTML) within my templates. I don't like repe

Web Design: Faking Alpha Blending with gifs

pngs are nicer than gifs because they have true alpha blending, not just transparency. However, they don't work in IE. I'm using the "pngfix.js" script to make alpha blending work in IE, but it's just not perfect. The divs that the script adds mess up my CSS. True alpha blending becomes important if you're rendering your image on a complex background such as a gradient. I found a suitable workaround. If I start with a png and get it to look right in the browser, I can grab a screen shot. Then I trim the outside of the image to make it transparent. Hence, the actual background is "hard coded" into the gif along the edges of where it becomes transparent so that true alpha blending is not necessary, but most of the image is still transparent so that the complex background shows through. Best of all, the gifs are a lot smaller than the original pngs. I'm sure this trick is well known, but it was new to me. Oh the depths I go through to mak

Vim: Getting Started With Vim

A couple of readers asked me to do an overview of how to get started with Vim. I'm sure there are far better overviews than mine, but here are some personal notes: Be sure you take the Vim tutorial. You can use "vimtutor" from the shell command line. When you're taking the tutorial, learn how to use "hjkl" instead of the arrow keys. Not having to use the mouse or the arrow keys and rarely needing to use the control key is one of the great benefits of being a Vim power user. It's best to get Vim out of compatibility mode. You can do this by creating a .vimrc file (even an empty one) in your $HOME directory. Next, I personally prefer to use gvim. Using the gvim command starts Vim in GUI mode. I like the GUI menus, etc. Of course, you'll need a version of Vim with GUI support. There are GUI versions of Vim for Windows, Linux, Mac, etc. Next, if you can get Vim 7, do that. It has nice, native tabs and a bunch of other useful features. In r

Foxmarks: We Just Launched!

We just launched the new version of Foxmarks ! Foxmarks keeps your bookmarks automatically synchronized between two or more computers. A simple wizard guides you through the startup process. Foxmarks works silently in the background. As a bonus feature, you can access your bookmarks from anywhere via It's simple and solid. We had to hustle in order to get it out the door before Firefox 2 comes out. The dust hasn't yet settled, but at least I got some sleep last night ;) Word to the wise--vainly attempting an all-nighter every night for a week just doesn't work. No, it doesn't matter how much coffee you drink! Anyway, I'm pretty excited. Despite the short timeline, our team was amazingly well organized, and the code is really clean. My co-worker wrote the synchronization server using Twisted , and it's performing amazingly well. My boss is still primarily responsible for the extension itself, although he was very helpful with all the other

Vim 7: Lovin' It

I finally installed Vim 7 . I also took the time to install various plugins. Here are some things that are making me happy: Honest to goodness, real tabs. Auto-completion and built-in documentation lookup for many different programming languages. Editing files and browsing directories remotely over scp works. Subversion integration via the vcscommand plugin is helpful. Vim is still charityware which makes me proud to use it. Vim is still my favorite editor because I truly believe that its style of keybindings is faster for experts. Furthermore, it has one of the strongest and most flexible syntax highlighting systems: It supports a ton of languages by default. It does well with files that mix languages like HTML, CSS, and JavaScript. It doesn't get confused by Python strings such as """He said, "hi"!""" ;) I code in a lot of languages, and I love that Vim is consistent and helpful.

Books: Thank God for Editors!

Thank God for editors in general, and O'Reilly editors especially! As I was reading an O'Reilly book on the train today, I realized how grateful I am for all of the hard work editors put into improving the quality of technical books. Let's face it, technical topics are tough, and programmers aren't always the best writers. As programmers, there's a monumental amount of learning we need to do in very little time using books written by other programmers who also have very little time. Editors help by making the text more uniform. Uniform text can be ingested more quickly. Without the painstaking effort that editors put in, I would have a much harder time reading what I need to read. In fact, every time I come across glaring typos or grammar mistakes, it distracts me from the technical material I'm trying to learn. Editors enable me to focus on the topic at hand. I know that authors always thank their editors, and that this post might seem a little silly

Python: Modifying a Counter in a Closure

I helped a fellow Pythonista with a problem today, and it reminded me that a lot of people might not know about the trick of using a list to box variables within a closure. If that doesn't make sense, read the code below: def counter(start): """Create a counter starting at ``start``.""" # The value "curr" needs to be wrapped in a list. Otherwise, when # "+=" is used in "inc", Python binds the variable at that scope # instead of at this scope. We don't want to redefine a variable at # the inner scope. We want to modify the variable at this outer # scope. Java programmers would call this "boxing", but they would # use an Integer instance instead of a list. curr = [start] def inc(): """Increment the counter and return the new value.""" curr[0] += 1 return curr[0] return inc if __name__ == '__main__':

Python: Greenlets

Someone pointed me at Greenlets the other day, and I'm really quite excited about them. This fully addresses the Limitations of Coroutines via Enhanced Generators I spoke of earlier. I see that "some very smart people" have gone down the path of tying it together with kqueue and select.poll along with an IO-based scheduler. Greenlets look polished enough, but I sure wish the other stuff was polished and documented so that I could use it in production. The pragmatist in me (which doesn't come out very often) is still insisting that Twisted is still the safer route in the near term even if it is more irritating to code because of its asynchronous nature.

Hacking: Yahoo Hack Day

I attended Yahoo Hack Day . It was a lot of fun. They put on a concert by Beck , which I unfortunately didn't get to see. They also loaded us up with plenty of swag, including a T-shirt, a copy of Yahoo Hacks , and a 256 mb non-branded USB flash drive, which was one of the weirdest but most useful bits of swag ever. I attended talks all day long. Here are some of the takeaways: Yahoo! UI Library: Fonts CSS is a CSS library that completely levels the playing field concerning fonts across all of the browsers. I'm not that great a CSS developer, so I wasn't all that excited about this, but my friends explained to me how hard cross-browser uniformity is to achieve. Yahoo! UI Library: Grids CSS is a CSS library that lets you do standardized layout in a cross-browser way that works now . I wasn't so thrilled about this either since I knew that even though CSS layout isn't ready for prime time, tables still do the trick. However, once again, my friends set me st