Computer books going for free

Here's a list of the computer books that I've collected over the years. Of varying quality publishers (O'Reilly and Apress on down) and some annotated (from courses). But all going for free or donation, you just have to come to North Vancouver to my house to get them. Please email beforehand to check we'll be there.

Linux in a Nutshell, Siever et al Berkeley DB, Sleepcat Software Java in a nutshell, Flanagan Programming Python, Lutz Python Pocket Reference, Lutz Perl Cookbook, Christiansen, Torkington Progamming Perl, Wall, Christiansen, Orwant Programming the Perl DBI, Descartes, Bunce MySQL, Dubois Dive into Python, Pilgrim Programming Windows 5th Edition, Petzold How to program C, Deitel/Deitel Client/Server Programming in PC LANs, Barfield & Walters A Programmer's Introduction to PHP 4.0, Gilmore Extreme Programming Refactored: The Case Against XP, Stephens & Rosenberg Programming Visual C++ 5th Edition, Kruglinksi, Sheperd, Wingo Usability: The Site Speaks for Itself, Insite Programming Web Services with SOAP, Snell, Tidwell, Kulchenko Sendmail, Costales, Allman, Rickert Tomcat Kick Start, Bond Late Night Active X, Tall, Ginsberg The Dictionary of Standard C, Jaeschke The Book of Zope, Beehive Practical Programming in Tcl and Tk 3rd Edition, Welch The Zope Boook, Lattier, Pelletier (2 copies) Windows NT TCP/IP, Siyan Definitive Guide to Plone (Japanese Edition), McKay (2 copies) Definitive Guide to Plone (German Edition), McKay Definitive Guide to Plone (English Edition), McKay Zope Bible, Bernstein, Robertson Core Java, Volume 1, Horstmann, Cornell The XML Handbook 3rd Edition, Prescod, Goldfarb Web Programming Unleashed, Sams Visual Basic 6.0, Schneider Modern Systems Analysis & Design, Hoffer et al VBScript & Active X Wizardry, Palmer

ClearSpell for Plone 1.0 Released

ClearSpell for Plone 1.0 is a prototype for providing spell checking in Plone using Ajax and the AjaxProxy. This provides spell checking with almost zero server or client side set up or configuration. More information at: ClearSpell

Ajax Proxy for Plone 1.0 Released

Ajax Proxy for Plone 1.0 is a tool for proxying requests from a browser using Ajax on to a remote server. This allows you to proxy local requests to Plone on to a remote server. On the way requests can have:

  • Zope security applied to the requests
  • Caching applied to the requests to improve performance
More information at: AjaxProxy

Ajax services

A while back I posted on the end of web services. In this post I was proposing that Web Services as traditionally represented are dead and a new batch of Ajax based web services will arise. The thing is most people don't actually do "Web services". Most of the time it's used to improve the UI experience locally for users and the idea of consuming remote data doesn't happen. This is because of a technical problem. A client can't make a request to a remote server in Ajax. There are many ways around this on the client, including using form posts and some toolkits Dojo abstract that out. There is a way to do this at the server as well, using say Apache's Proxy pass. That allows the request to still appear in the local domain, but behind the scenes Apache is doing the forwarding for you. Once you've got this done you are opened up to the world of web services. Any server that provides a datasource or interaction via Ajax or XML is open to be used on your client. For example:

  • Want to show an RSS feed in your site? Well if you don't want to actually parse the data on the server, why not parse it on the client, using an Ajax RSS reader (example)
  • Want to show the weather on your site? You don't want to store that on the server, you just want a pretty graphic, pull it using one of these (example 1, example 2)
  • Want a spell checker in Plone, but don't want to install the spell checking libraries on your server because its a pain? Then get the spell checker from ClearWind.
This approach is more akin to the Web services of old, it abstracts away services into other servers and allows you to re-use both ends of the equation. Clients for displaying widgets can be used in multiple places and the servers can be re-used in a service model. That's why I'm calling it Ajax Services. An Ajax Service is a:
  • An Ajax based client that can be re-used in multiple different sites.
  • A server side service that can be consumed by an web site using the client, not just the local site the site was intended for. The service uses REST for incoming requests and XML for responses, allowing easy Ajax integration in a client.
One example is the Ajax Proxy for Plone. This is a server side proxy that lives inside Plone. It takes incoming requests from the client and proxies them on. There are a few nice things this gives you: caching, security, transformations and load balancing to name a few. Once you've got a generic proxy for your server you can load up your client with services pointing to multiple places and get true web services back to your client. Here's an example:
  • The browser fires off the Ajax request, normally a GET or other HTTP verb.
  • The request comes into your local server (for example Plone) on the same domain.
  • The local server does some processing of the payload (for example caching) and figure's out where to send it on to.
  • The local server forwards the request on to the remote server and waits for a response.
  • The response is received and processed.
  • The response is then passed back upstream to the browser and the user gets the data.
Apologies for the ramble, I'll try to be more coherent and release more code soon. For the moment here's two releases: AjaxProxy is a tool for Plone that acts as a generic Ajax proxy allowing you to proxy any request on through Plone. ClearSpell is a spelling tool for Plone that provides spell checking on any input or textarea. Unlike previous spell checking, there is no dependencies other than AjaxProxy, the ClearWind spell checking service provides the spell checking libraries. More to come...

Clouseau testers?

Any chance I could get some testers for Clouseau? I think I'm ready for a first release and want to check it works. During the sprint we had IE, FF on Linux and Safari testing it... I made a few changes and heard rumours that "it didn't work" without anyone providing any feedback on what that meant. Recent builds are only tested on OS X though. So if you've got 5 minutes and can throw it in your test environment that would be great. (And if that instance is publicly accessible, great, then I can test too). Zip file: http://www.agmweb.ca/files/Clouseau.0.1.zip (or from the collective) Update: requires Zope 2.9+. Tested on Plone 2.5. Update: what's Clouseau?.

Random photos

Flower on the sunshine coast. Flower View from our rental suite on the sunshine coast. View with ferry Update: yes the lens needs cleaning, darn.

Vancouver Python Workshop (Day three)

And so the last day of the conference arrived. For me the last day just meant the drudergy of accounting and getting all the expenses through. This only took about 30 minutes, but still 30 minutes of accounting is less fun than almost anything else. The last day had another good set of talks in the web track. Unfortunately most of the talks I wanted to hear were in the other room, I did sneak out to hear Brian Dorsey's talk on distributing web applications on Windows. Something we did a occassionally at Enfold. There was more of a Plone theme in the web track and we had a panel discussion on Plone past, present and future. Since I know nothing about Plone's future anymore I let Calvin take up the future part, but I can't remember what he said or what was said in most of the panel actually. I spent quite a bit of time worrying about my Clouseau talk which I added to the lightning talks. The lightning talks went well, there were some that were even funny like the South Park web proxy. I've always been a fan of lightning talks as long as they stay to 5 minutes, anything else is unstructured rambling. Mind you as one person pointed out, remember when filling 5 minutes of a talk (say at school) would be a nightmare. Then it was Ian's final talk about movie restoration, which he did well. It's a great talk combining technical bits with interesting bits. I missed bits of it due to running around. That evening was a collapse in front of the TV and watch 24, turning my brain off. For next morning we were off to Long Beach.... All in all the conference went well. There was more pressure this year because our costs were increased. For those of you who don't know, all the profits go to the PSF. If there is a loss, it hits me and the organisers personally. Not a great deal for us, but taking risks is needed to get things done. As it turned out by increasing prices (and still being probably the cheapest conference out there) we paid all our bills and will still make a donation to the PSF. Next time I think we'll concentrate on getting a better hotel to address some of the complaints about that. We'd like more lead time to get some speakers in too. And I think the idea of becoming PyCon West is all the more realistic as well. Just got the final accounts to do and then the conference is done and dusted. Thank you to everyone who attended, spoke and helped out.

Vertical orchestra

Stopped by the Vancouver Public Library today for a friends concert. Friend of the family Jordan Noble is an organiser and one of the composers of the Vertical Orchestra. A series of peices played in the libraries atrium where the drum section plays in the moat and the brass on the 4th story. I'm not a expert on these things, but I do know it was a very cool and interesting sound and worth listening too. The kids loved it, Samantha at 4 months was kicking her legs like crazy every time the drums kicked in.

When a user interface costs lives

Found this interesting story about the USS Vincennes, which in 1998 shot down an Iranian commercial airliner, killing 290 people. Relevance? One of the contributing factors was a bad user interface to the Aegis system:

Iran Air Flight 655 was shot down by the USS Vincennes' Aegis system in 1988, killing 290 people. The error was initially attributed to operator error, but later some experts attributed the incident to the poor design of the Aegis user interface.
That quote is of Steve McConnell, again from Wikipedia. Other references:

Vancouver Python Workshop (Day two)

For me the second day started with a nice hang over. It quickly subsided but, ouch. One nice thing about having the Friday night key note is that we can use that to give out over 80% of the badges, making the next day an easy run for registration. Any payment problems, or new registrations just shove off till the Saturday morning. It gave me a chance to chase down paypal questions, re-print badges and so on. 


The morning started off with Guido's keynote and a preview. Again I missed it all for 2 reasons, 1) Paul left the projector at his house, so I went to get it and 2) the great mini-DVI saga. The great mini-DVI saga involved me bitching about Apple a heck of a lot. Briefly: Macbook comes with a mini-DVI port and no connector (btw, the MacBook Pro comes with one). I figured I'd pop in and get one prior to the conference. But wait, my local Mac store didn't have any for the 1.5 weeks prior to the conference. They did have a mini-DVI to DVI cable, so I thought I'd grab the DVI to VGA connector off my Mac Mini. But wait the DVI pins on the mini-DVI to DVI are different, they don't fit. What! I found one cable in all of Vancouver, it was being used in a demo in London Drugs and I begged the guy to sell it to me. 

Why do you do try and screw us like this Apple?

 I mostly got to look after the web track of course. This track was actually not as well as attended as I'd hoped. I think a few things worked against us here. The proximity of the Plone conference didn't help, along with Andrew Burkhalter's wedding. Andrew is one of the main movers and shakers in the Seattle user group and had his wedding the same weekend. Congratulations to Andrew by the way. The talks were good focusing on what people did, not theoretical bits. One peice of advice to a few talkers though, we are at a Python conference, we all know Python kicks ass so don't repeat that. Bashing other languages is fine and good source of amusement though :) 

Hearing that Python is winning over departments in major companies like Ford is good. Another real highlight was Ian Bicking's talk on WSGI. Unfortunately I had to do deposits of all the money collected at the conference and such so missed quite a bit of it. Ian prepared his own hand outs and gave a great talk with lots of detail. 

Next up I gave my talk to the beginner track. Really it was a talk from Joel Burton and his excellent bootcamp series. There were lots of questions that were fantastic and let me go off the beaten path. As is ever the case with good slides, they seemed to predict many people's questions. Then it was off to the barbeque once again at Locarno Beach, an absolutely beautiful location. 

A few people still complained that the price was steep, my only complaint is the theoretical cost for the kids, having 2 kids who came, it would seem absurd to charge them $10 each when all they ate were about 5 chips and small bit of burger. Next time we'll chat about that one before hand. Given the cost of food, renting the location, the bbq's and the other amenities, I think its a fair price. Either way the food (wild salmon) was excellent. Once again thank you to Brian Quinlan's family that gave up many hours to help make the BBQ happen and cooked the food. 

The 6 people staying at my house, then dragged me off for drinks in my neck of the woods. We got to see the fireworks in English Bay from the deck of the Rusty Gull in North Van. After that there were more drinks and good night was had by all. I think it was about 3 am when I hit the bed. Ugh.

Vancouver Python Workshop (Day one)

So after the sprint and after my anniversary (see previous posts), next day was the start of the Vancouver Python Workshop. As with last time, the organisers were Paul Prescod, Brian Quinlan, myself and we added Jean-Luc Peyret. I handled all money and registration again. As with last time it was held on a bank holiday in the summer. I still argued that it's a bad time to have it, I'm much rather not be in Vancouver. However for many people travelling here, I know it's the best time to see Vancouver and take a holiday.


For the organisers there were a few key differences this time. The first and seemingly stupid one was that this was the second time we had done this, so we knew what everyone was actually doing, which was nice. The second was that the space at ActiveState was no longer available so we had to get a hotel and hence pony up more money. In the end this turned out to be fine but at one point there was that real stress for about 1 week when we didn't have enough numbers. 

As the organisers (and mostly ClearWind) was bank rolling the conference (that's a great deal, if there's a loss we swallow it, if there's a profit it goes to the PSF) we were stressed. Of course that didn't happen and just before the early bird ended tons of registrations rolled in. That's one to remember for all you organiser's out there, the distribution of registration is not even. A huge amount roll in before early bird ends about 1 month before the end of early bird. You then get another peak the week before the conference. 

Being organised I closed off registration and did all the badges on the Wednesday, two days before the conference. Of course as I predicted the simple mail merge to produce badges took 3 hours as we fought again and again with printers that didn't want to work with computers. Always something. Once they were all organised alphabetically (yes I've seen several conferences with badges not done that way, was able to sit back and do all the last minute panic Friday things. There weren't any fortunately. Friday came and went smoothly, giving out the badges and t-shirts at the beginning worked well. 

As ever the bbq tickets pose a logisitical pain as people alter and change, but I can cope with that. Of course I didn't actually get to hear the keynotes, since I was outside doing the registration for the half a dozen people that showed up late. I hear they went well with Guido van Rossum talking about Python's future and Jim Hugunin talking about Python.NET. A thanks to Toby Donaldson of SFU for organising space for us at the downtown campus as part of the computing science departments commitment to Python. Next it was the Steamworks for a beer and some food. I never made Steamworks last time and it's a nice venue.

All in all the Friday night went well. I had a gaggle of people crashing on my floor and so there was the occasional beer in the back garden until past 2 in the morning. Ugh, didn't everyone know I had to be in Burnaby at 8 the next day?

Learning how to sing

Last Thursday, between the sprint and the conference - it was a hectic week - was our tenth wedding anniversary. Ten years, yikes. So let's step back ten years to my wedding. Danae's sister Kelly Crook is an opera singer, music teacher and all round wonderful person. For our wedding she put one of Danae's favourite poems to music - "How do I love thee" by Elizabeth Barret Browning. She sang this song and made most of the audience cry with it's beauty. Here is the incomparable Kelly Crook. Fast forward ten years and I thought as a nice romantic gesture, that I would learn how to sing so I could sing this song to Danae. I'm not one of natures singers, tonelessly droning along to Bohemian Rhapsody is about as good as it gets. For me this was a big thing. So for the last 3 months I've been taking singing lessons to sing this song in front of Danae. If you think speaking at a computer conference is stressfull, that's nothing compared to this. Learning to sing has actually been quite a lot of fun, especially when I could forget about all the things I was doing wrong and just belt out the music. What I didn't realise was the sheer amount of training and skill that goes into singing as well as Kelly does. The pronounciation of words and letters was hard work for me, I've got an English accent so I'm at a disadvantage from the start. But the use of breath the placing of the tongue and the shape of the mouth and so on. There's an amazing amount to know and learn. Somehow in all this time I managed to keep it secret from Danae and secretly practiced singing Baby Beluga to Emily. The day came last week when I stood up in front of Danae and sang the song. She broke down in tears and said later it "was the most romantic thing I've ever done". Of course, all I could hear was my voice that was off key, the breathing I missed, the legato I didn't get right due to stress. It didn't matter at all to Danae who loved it completely. I think I've got a few brownie points for the future stored now. Thank you Kelly.

Browser based Python prompt for Plone (almost)

We've almost got Clouseau's first release out. This is the product of the Vancouver Tool Sprint, which we held just before the Vancouver Python Workshop. Yes, I'm pretty far behind on my blog postings. Unfortunately for this blog I'm off to Vancouver Island and Long Beach for a few days of surfing and relaxation. It's been a hectic week and time for some down time. Anyway at the tools sprint we wanted to improve the state of tools in Plone for developers and focused in on my favourite, PloneShell. The sprint consisted of Richard Amerman , Leonardo Almeida Rochael and yours truly. However PloneShell has a few problems:

  1. It uses wxPython
  2. It takes 10 minutes (seems like it anyway) every time you want to start it up
  3. I couldn't get wxPython installed on my Mac because the new Plone installer now doesn't seem to include it
  4. It needs ZEO
  5. The code goes into many wxPython layers and gets pretty convoluted
So we got sidetracked and wrote a new tool for inspecting your Plone site. Inspecting > Clouseau - got it? So its a browser based, Ajax powered, Python prompt. Inside your Plone site. Install as a product, run Plone in debug-mode and go to site setup > Zope inspector and then you get a Python prompt in your browser. You can inspect, alter, commit changes and do everything you'd do in zopectl on an platform. So before you get too upset yes it is a security hole, we know that, it's a development tool.
  1. It will only run in debug mode (unless you change a file system config variable), so by default it will only work on your development site.
  2. It requires Zope Manager access to use it.
  3. There is a config variable on the file system to disable it.
So you've got past that? Good. What are some of the advantages of this?
  • Collaborative debugging. Wait oh my golly. Two or more people can now share the same session. I opened Safari and Firefox at the conference and had two people working on the same Python prompt, that went down well. Imagine debugging those #plone questions now!
  • No dependencies. None, zero, zippo. Easy install.
  • No platform problems. Tested on Linux, Windows, OS X and Safari, Firefox and IE.
  • No ZEO. Will work out of the box in any install.
  • (Not implemented yet) A prompt in the context of objects.... looking at an object in Plone and want to see methods on it?
  • (Not implemented yet) Namespace variables browsable in a portlet....
  • And so on....
Clouseau is currently in the collective and we'd like any feedback on this. You can get it here: http://svn.plone.org/svn/collective/Clouseau. Product page has been made and when that release is ready it will go there. What needs to be fixed for a full release, so don't mail us yet: multi-line support and return values (noticed a few Nones can appear in the UI). What we need to do for the next release: auto-complete, tool tips, easy multi-line entry. This is not a sprint to write something then forget about it. All of the sprint members were excited to be working on this tool, it is pretty damn cool and we were all pumped to be working on it. For one I will definitely be working on this tool. Next week - after the surfing. Many thanks to Leonardo who did the server side magic and Richard who did a lot of the UI and product boiler plate. And I think Alan Runyan does get some credit because I do remember a conversation over a beer or 6 about 5 years ago that included this topic. It might have been him once again who sowed the seed.

The end of Web Services?

So in the Plone, Zope and Python communities, there are a large number of people putting together web sites. In a total of 6 years I've done one Web Service and that was for a company trying to be an expert in Web Services. So lets just clarify term's here... I've always been annoyed by the term web services because I often get into my rant that a web service is something on the web that returns a service. Be it via XML-RPC, REST or any other thing you can mention. In this case I'm referring to that bundle of technology that is (usually) SOAP, over HTTP with WSDL and all that jazz behind it. There are a few modules for web services for Python and Ben Saller even worked one for Plone. From what I can see they aren't used that much and from where I sit the whole thing has slipped into obscurity? Why?

  • It's pretty darn complicated. Getting into the WSDL specification is not for the faint of heart.
  • SOAP will if I can paraphrase a talk Paul gave... "SOAP is a terrible acronym. It's not simple, it's sort of about objects, it has no access control and its not a protocol."
  • There are a few high level tools.
Perhaps things are changing slowly, but from where I sit for the last 5 years it's dying. Look at these Google trends ("web services, ajax", and just to be sure "apples, oranges"). Where's the future here? Well I'm betting that Ajax will provide a huge boost to the Web Services model of having remote services handling transactions and outputting XML. Not some big fancy model, but just some XML. Once people start to pull these things in through Ajax, you can pull them in anything. Ajax will be the driving force and it will start to pull services up out of the dust. And it will be spotty, unspecified, quick hacks that just work ignoring all the formalisation of what was Web Services. Perhaps I've listened to Paul Prescod a little to much.