Python and libyahoo2, take 2

June 1st, 2009

Last October I worked on a libyahoo2 binding using Pyrex and got it far enough along to discover the version of libyahoo2 I was using couldn’t log into YIM.

Several Ubuntu updates later I noticed libyahoo2 had been upgraded and, sure enough, this version worked.

I updated the Git repository mentioned in that post but it is likely if I continue to work on it it will go to python-yahoo2 on GitHub.

Pyrex’s blindness where “const” is concerned is pretty annoying.

Ubuntu 9.04 and python-virtualenv

May 31st, 2009

I recently upgraded a bunch of physical and virtual machines from various Ubuntu v.older version to Ubuntu 9.04. Naturally, this broke my Python development environment since Python was upgraded from 2.5 to 2.6. I had instructed easy_install to put things into /usr/local.

The upgrades from Ubuntu v.older to 9.04 went quite smoothly on every machine including the ones where I had to do several stepped upgrades since on various machines I skipped one or more upgrades prior to 9.04.

Rather than return to my old ways of just hosing packages (and, worse, “setup.py develop” symlinks) into /usr/local I’ve decided to use python-virtualenv to create some non-root-owned Python environments to work on my various Python-y apps. The main difference to me is being able to keep things I’m working on separate from one another.

We’ll see how it goes.

I’m afraid all these years of using package-managed software has made me soft — now a piece of software not having a nice package means I need to think a bit harder about if it’s worth dealing with the hassle of having that software outside of the package manager. (That applies to when I’d like to be using a more recent version of the package, too, though generally on Ubuntu I run into that a lot less frequently than I did on Debian.) I have mixed feelings about setuptools and easy_install.

I am pleased that now mod_wsgi is in a package so I can switch to that version rather than the one I installed by hand. mod_wsgi was worth it to install by hand to use until there was a nice package available. It’s Just Better than my previous mechanisms for running WSGI apps in, under, or behind Apache.

Singleshot and Git and first steps

March 4th, 2009

Singleshot is the photo album software I use to host photos.xythian.com. The last release was .. rather a while ago though I have been making minor enhancements and bug fixes since then for my own use (including flash video support which extracts thumbnails using mplayer and embeds flowplayer to play) though there’s no video on my public photo site).

Prior to today every time I took the time to try and update the source tree on Sourceforge I ran into a snag such as “Sourceforge CVS is unavailable.” Months ago, when I tried to migrate from CVS to SVN on Sourceforge I ran into errors. I didn’t even try to investigate what went awry as I was low on patience and time.

As a result, my own tree (first in Perforce and now in Subversion) has gotten pretty out of sync from that tree. I decided to try GitHub and try using Git for something “real” — so I’m going to move Singleshot’s source to GitHub and then push all my changes to there.

I followed (mostly) the steps from How to export revision history from mercurial or git to cvs which describes how to use the git cvsimport command to pull Singleshot’s revision history from its Sourceforge CVS repository, testing making a tiny change to a README, and pushing that change back to the Sourceforge CVS tree.

(After backing up the source tree on Sourceforge using rsync.)

% export CVS_RSH=ssh
% git cvsimport -d :ext:xythian@singleshot.cvs.sourceforge.net:/cvsroot/singleshot -C test1 \
    -r cvs -k -A /home/fox/src/singleshot-import/authors.txt  singleshot
Initialized empty Git repository in /home/fox/src/singleshot-import/test1/.git/
[longish pause]
Counting objects: 561, done.
Compressing objects: 100% (502/502), done.
Writing objects: 100% (561/561), done.
Total 561 (delta 317), reused 0 (delta 0)

(Some poking around to see if things look reasonable, making a small change to the README, commiting it first to the git repository and then back to Sourceforge using git cvsexportcommit.)

Then I pushed the whole thing to a GitHub tree:
http://github.com/xythian/singleshot/tree/master

% git remote add origin git@github.com:xythian/singleshot.git
% git push origin master

That was pretty straightforward and appears to have worked.

My plan is to merge my changes into the out of date tree and then push the new code to GitHub. If it all works out I’ll probably indicate that the Sourceforge project is defunct there and host the code on GitHub henceforth.

Pyrex and libyahoo2 (or not)

October 27th, 2008

I had something I wanted to try in Python running against Yahoo! Messenger. The obvious choice of library for talking to Yahoo! Messenger was libyahoo2.   I could not find a Python binding for it, so I started sketching one together with SWIG.  The first step is creating a bunch of empty callbacks. The libyahoo2 in Ubuntu’s package is compiled without USE_CALLBACK_STRUCT, so libyahoo2 expects to find a bunch of extern functions defined to interact with the host. I made empty callbacks in a C file and started reading more about the API.

It rapidly became clear that I was going to want a layer on top of the library to make interacting with it from Python more palatable.   I switched to Pyrex, since I wanted to write that wrapper in Python (or something Python-like) rather than building a straight-C wrapper so using SWIG would continue to make sense.   SWIG’s big benefit in my mind over Pyrex is easy support for more languages and better tools for defining straight wrappers.  I wasn’t going to get "free" use in other languages and it wasn’t going to be a straight wrapper now but rather a module that exposed the functionality of libyahoo2 to Python.

I kept the callbacks.c I had defined but started migrating the definitions to the Pyrex file as I implemented.  This way my library would continue to link without complaint about functions I didn’t have yet.

Following the usual pattern for Python bindings to libraries that need wrappers to be more Pythonic, I planned to have a ‘yahoo2′ module in Python and a ‘_yahoo2.so’ extension module.  The _yahoo2 module is written in Pyrex.

libyahoo2 appears not to adhere to the documentation it defines.  It’ll call ext_yahoo_remove_handler with a tag that was never returned by ext_yahoo_add_handler… (0).  It looks like an undocumented (that I found) part of the charter of ext_yahoo_add_handler is not to add a given handler more than once.

This also made defining the callbacks the way libyahoo2 expected easier.

D’oh, I got it far enough along to get this:

libyahoo2.c:620: debug: Key: 4 Value: Yahoo_Messenger
libyahoo2.c:620: debug: Key: 5 Value: hodorbot
libyahoo2.c:620: debug: Key: 14 Value: This version of Messenger expired on April 2, 2008. Please upgrade now to the latest supported version: http://messenger.yahoo.com Learn more: http://messenger.yahoo.com/eol
libyahoo2.c:620: debug: Key: 15 Value: 1225167367
libyahoo2.c:620: debug: Key: 97 Value: 1

I’ve learned what I wanted to, so instead of seeing if a more recent libyahoo2 than what’s in Ubuntu works (> 0.7.5+dfsg-3), I’m just going to call it here.  I’ll post it in case someone can learn something useful from it.

You can pull a working repository with a command like:

git clone http://notes.xythian.net/media/2008/10/pythonlibyahoo2.git/ mydirectory

There’s three files that do anything:

  • yahoo2.py - wraps some of the lower level details from the Pyrex layer, including exposing the IO bits as an asyncore dispatcher
  • _yahoo2.pyx - is the binding
  • callbacks.c - exists to have empty functions defined to satisfy the linker until those have implementations in the Python binding

Not much works, really; there’s implementations of connect and async_connect, but only async_connect is called by libyahoo2 before it gets far enough along to not log in with the error message above. There’s a wrapper for setting the log level (which was key to discovering the above fact…).

This is a typical definition of one of the library callbacks:

cdef public int ext_yahoo_connect_async(int id, char *host, int port, \
  yahoo_connect_callback callback, void *callback_data):
   cdef ConnectionHandle handle
   handle = ConnectionHandle(id, host, port)
   handle.connect_callback = callback
   handle.connect_data = callback_data
   handle.async_connect(callback, callback_data)
   HANDLER_MAP[id].connections.append(handle)
   MANAGER.add(handle)
   return handle.fileno()

ConnectionHandle is an extension class which wraps a Python socket object and can make the callbacks the libyahoo2 IO layer expect.   MANAGER is the connection manager, which is implemented in the higher level layer (yahoo2.py) so it could be replaced with something that interacted with a GUI event loop.

I’m probably done with this for the forseeable future and hope publishing it along with a git repoistory may allow someone to build on or learn from what I’ve done.   I stumbled upon Cython while working on this, but didn’t want to derail any progress to something working by playing with it.

So what did I learn?

  • Write toy bots against open protocols with existing libraries in your language of choice, such as XMPP, lest your project get hijacked working on a binding rather than the toy.
  • Pyrex is pretty nice for building wrappers that have more meat than a typical SWIG binding.
  • Cython is probably worth checking out.
  • git is worth playing with more

VirtualBox 2.0.0

September 4th, 2008

Virtualization is still shiny. I’ve been playing with VirtualBox 2.0.0 tonight. I’ m writing this from an Ubuntu 8.04 VM running on my Windows XP desktop machine in “seamless windows” mode. It’s not quite as “seamless” as VMWare Fusion’s Unity mode on the Mac, but it’s still pretty neat.

VirtualBox 2.0.0 is as smooth to install on WIndows as the 1.x build I tried on the Mac was (I’ll try 2.0.0 on the Mac soon) and either adds a bunch of cool features or I noticed some features that were in 1.0 the first time with 2.0. I know seamless mode is new in 2.0, but I don’t know if the “headless mode” (= run as a daemon and display only as an RDP server; not interesting on my Windows box but quite interesting for Linux) is new or not.

“Seamless mode” is not as seamless as Unity mode: the tab order (and task bar) do not show the virtual machine’s apps as first class windows. Instead, the entire VM appears to be a single app to Windows not unlike running in full screen mode. It’s essentially as if the desktop background of the VM was replaced with an transparent texture, so I can see all the windows apps wherever the desktop would been visible. It’s handy but a little confusing. Also the system menu bar is considered a window and thus shows up at the top of the Windows desktop machine (compared to Unity mode, where it can be turned off entirely and replaced with Fusion-provided navigation functions). It’s not quite fair to compare Fusion running Windows to VirtualBox on Windows running Linux since it may be that “seamless mode” is more seamless with Windows guests (and, of course, VirtualBox is free for personal use and Fusion isn’t, but Fusion is cheap enough to be essentially free for the sake of a tool I use as much as virtualization).

It looks like Fusion 2.0 is nearing release (as well as VMWare Workstation 6.5, which finally adds support for Ubuntu 8.04 guests — this lack in Workstation 6.0.4 is how I ended up playing with VirtualBox in the first place).

I suspect VMWare is going to remain the virtualization tool I reach for “in anger” (especially once Fusion 2.0 and Workstation 6.5 and Server 2.0 finally all ship, which will give me good solutions for running the same virtual machine images on any machine I might desire).

Saving power on Intel/Linux

September 4th, 2008

lesswatts.org has some interesting reading and references an interesting utility called powertop (which is available as a package in Ubuntu). It turns out there are some easy things to reduce the power used by a Linux server (or desktop or laptop, but I cared about the server) by a few watts here and there (or more, but I didn’t do before/after measurements). Even just upgrading to Ubuntu v.latest (8.04) probably saved me some power because the tickless kernel became standard.

Idea: Visualize wikipedia trails

August 26th, 2008

A browser extension that watches you surf through Wikipedia, and then generates a pretty graph with some kind of representation for how long you spent on each page.

On the other hand, maybe not, because I’m not sure I really want to know where that time just went. It would be a pretty branching tree, though. I should know better than to click through links to Wikipedia — it really doesn’t matter where the link goes. They’re all dangerous. Howstuffworks, too. And if any of the Wikipedia articles link TO Howstuffworks (or visa versa) then it really is hopeless.

And THEN, you get a LOT of people to install it (or Wikipedia to run it on their access logs) and let people surf through the trees starting from some arbitrary page. That would be cool.

Soft word wrap in Emacs

August 17th, 2008

I was editing some text with emacs and finally got fed up with the choice between “auto-fill-mode” (spray hard newlines into my file to word-wrap) and “suck” (no word-wrap, long lines). Fortunately for me, not only is there a minor mode to implement this feature, but GNU Emacs 22 (the version I was using) bundles it.

It’s called “longlines-mode”, and I am grateful for Soft word wrap for long lines because it was the search hit that explained to me the existence of the mode, its name, and how to get it (in my case, “it’s included”). Finally Emacs has something every single other text editor I’ve used since QEdit has had.

Lightroom 2

August 13th, 2008

It’s a significant upgrade from Lightroom 1. Lightroom 1 didn’t make it past “fool around with it a bit” for me because it fell over when I fed it my entire photo tree.

The 30 day trial is key — there’s almost no chance I would have picked LR v2 up without being able to try it “for real” for a while.

I’ve been feeling the pain of inadequate management tools for my slowly but inexorably increasing photos directory tree. My workflow prior to Lightroom was (is, since I haven’t really committed to LR yet):

  1. Shoot lots of photos.
  2. [Download all the pictures using Downloader Pro onto the laptop; manually copy them to an external disk.]
  3. [Look through them with Breezebrowser Pro.]
  4. At home, copy all the photos from the external disk to the desktop (or download them using Downloader Pro if the photo shooting if I was home the same day as I shot the photos, as in when I am not traveling)
  5. Sort through them in Breezebrowser Pro tagging the ones I like, using Photoshop and Camera Raw to prepare any I like to post or use for something. If they’re to post, ruthlessly edit down to very few with multiple passes in Breezebrowser untagging photos that do not make the cut. If they’re for family, the bar is a bit lower since I get flack when I shoot hundreds of shots and share .. four with them.
  6. Use CR/PS to open, crop, jigger exposure, sometimes edit; post and/or write to DVD-R appropriately.
  7. When I post, I add metadata (title, keywords) to the file using PS and carefully use the export path that preserves that and the EXIF metadata (not Save For Web…, but Save As…JPEG). This metadata can be consumed by both Flickr and my own photo album software. Lots of other things too.
  8. Once and a while I’d use Bridge to tag the entire shoot’s worth of photos with something to identify them later, but not usually because Bridge is just too slow even when fed only one directory/shoot’s worth of photos.

I didn’t have any good way to store or search on metadata across the whole tree. And the PS/BR/DL workflow is kind of clunky.

With Lightroom, once it’s all configured, it’s more like:

  1. Download using LR, having LR copy to the backup drive when applicable (*) According to forums, I have not set this up yet, but will certainly do so before the trial runs out..
  2. Sort, choose, tag photos in LR.
  3. Jigger exposure, crop all in LR for shots that make the cut.
  4. Export from LR with metadata intact. The only bummer about this bit is that when I used to do bulk exports, BreezeBrowser made it easy to just extract the embedded “thumbnail” in the raw file, which was much faster than converting the raw file and the “thumbnail” with my current cameras is 3MP or more, plenty for web.
  5. Metadata remains searchable and browsable far more easily than the huge tree of directories I have.

LR is not as fast as I’d like (BR is just crazy fast at display even when fed hundreds of shots in a directory) but it’s fast enough for its other wins to be very enticing. I need to put it on the laptop and see how it works as if I was traveling and then came home. Some forum surfing indicates this flow can be very nice.

Also the fact that it’s easy to Stack the original with any edited versions (in the rare cases I need more than LR’s built-in nondestructive edits like cropping or exposure/curves/etc) is very nice.

I’ve already unearthed some shots I liked but missed using my old workflow. One thing I really, really like about LR: it’s easy to configure it (with a performance cost) to always keep metadata with the actual photos (embedded in JPEGs, sidecar .XMP files for raw files). Some things don’t get represented this way (e.g. Stacks).

A big reason I’ve avoided tools like this for so long is I got thoroughly burned once by Thumbs+ when I spent an afternoon carefully adding metadata to all my photos which got stashed away in Thumbs+’s db .. and then it blew up and lost the db somehow. Not even my normally relatively diligent backup procedures saved me there (nightly).

It seems like a win. It’s big enough that I may need to pick up a book on it to really leverage it well, but even without anything other than a cursory surfing through some forums and its own help it’s looking like a big improvement to my workflow.

Virtual Box

July 12th, 2008

I’m fooling around with Sun’s VirtualBox — virtualization software that comes in both an open source GPL version and a “free for personal use” closed source version with some more features.

It seems pretty nice so far. It compares favorably with VMWare given the price. I haven’t done much with it yet, though, so it may turn out to have rough edges.

I’m running an Ubuntu 8.04 LTS box on my Mac. The Mac version looks to be the least polished, since it’s the newest. VMWare Fusion has a lot more hardware support (e.g. sound). I need to take another shot at VMWare/Ubuntu v.latest to see if the guest additions are now supported.

TiVo is fired

July 7th, 2008

I haven’t really been using my TiVo since I got the HD cable box. The HD cable box is not great but it supports HD and my old TiVo doesn’t.

I like the TiVo UI — my series 1 TiVo served me well for nearly 8 years and it still works fine. I only stopped using it because it didn’t do HD and I’ve been waiting for a good HD-TiVo solution that I was sure would fully work with my cable. Since I haven’t used the old TiVo in months I want to stop paying for it. (Yeah, the breakeven point for the “lifetime” subscription was years ago — oops, I never expected to keep this first-generation TiVo for so long. I was sure that something more compelling would come up from TiVo or someone else within 3 years…)

I’ve heard some horror stories about getting the CableCard TiVo to work with Comcast — getting it to work seems to hinge on how well the Comcast guys you happened to get were trained. Comcast is going to be fired too. This is too bad, since otherwise I would have picked up the CableCard-OK HD TiVo when the price dropped.

So I’d like to suspend service on the old TiVo. TiVo would lose me as a monthly customer, but I’d still be willing to pick up a new TiVo in the future. No problem, since TiVo has a pretty nice account management web interface. Except…

I can do everything except cancel or suspend service on the TiVo web site. I have to talk to someone on the phone to cancel — so far I’ve been on hold for 15 minutes once and then the support line hung up on me. Now I have called again and am waiting on hold again.

Making me call to cancel or suspend service is why I am unlikely to ever buy any more TiVo products in the future. It’s too bad, too, because without that I would still like TiVo despite the fact that they have no products that can help me right now. Perhaps they do not care about alienating customers that want to suspend or cancel service but it does seem to preclude the chance of any customers that leave ever coming back. I am sure to tell my friends about this experience, too, changing my recommendation that folks pick up a TiVo despite being offered a cheap but lame DVR from the cable company to just use the cable-provided DVR. The monthly fee is cheaper and there’s no up-front equipment cost.

I’m up to 15 minutes on the second attempt at getting a person to talk to. This seems designed to ensure I’m in a particularly bad mood by the time anyone ever answers. I suppose if they never answer the phone then they think I can’t ever cancel.

Update: At around 22 minutes, somebody answered. She was very polite, tried to get me to stay, pointed out that they had CableCard-enabled HD TiVos when I explained why my TiVo was no longer adequate, and apologized about the wait and the hang-up. I have no complaints about the experience once I finally got to talk to someone.

However, since the only reason TiVo forces a call for cancellation is to benefit itself with a “saves” mechanism then putting people on hold for a long time and having a buggy IVR that hangs up on them seems pretty counterproductive.

Upgrade

June 19th, 2008

Upgraded to WordPress 2.5.1 (finally). Maybe it all still works, too.

Product upgrades

March 29th, 2008

Adobe products are rare in that I’ve never regretted upgrading — each upgrade has brought changes I’ve liked enough to think the upgrade was worthwhile. Contrast this with Quicken, where I’ve regretted every upgrade as it made the product slower and less reliable (until finally I’ve said “no more” and will not upgrade any further).

The only thing I don’t like about newer Adobe products is the activation stuff. I don’t pirate software and I don’t appreciate things that are there to ensure that I don’t, thus taking valuable time and energy (both mine and my computer’s) for something that benefits me not one bit. Adobe’s form of this seems to be much less intrusive and inconvenient than most companies’ implementations that I have experienced.

Microsoft product upgrades are usually a mixed bag — some real benefits and some negative changes (the exceptions usually being 1.0 -> 2.0 and possibly 2.0 -> 3.0 where they figure out what the product really is and thus those upgrades are usually clearly worth it).

I wonder how much of this problem where upgrades aren’t really *upgrades* comes from areas where the products are basically “done” yet the company has built a significant source of revenue model from upgrades and thus needs to push out a release every x months no matter what. It may be that switching to a “monthly fee” for software that one uses might actually be preferable to an upgrade treadmill where the changes don’t improve things and companies are motivated to try and force upgrades.

Photo and video processing are still “new” enough that significant upgrades are still possible in both user interface streamlining and just new features (including more speed).

Breaking links and feeds

December 10th, 2007

I just spent a bit reviewing a list of the feeds that hadn’t had any new posts for a while and finding a bunch that had moved. Instead of serving up a nice HTTP 301 with the new feed they instead had a post saying “Here’s my new blog, come check it out!”. That makes me crazy. It makes me even more crazy when the “new” blog is also out of date.

Of course, very few blogging tools make it easy to serve a redirect in place of the feed. Technical people still have no excuse.

It also makes me crazy when people just break all their old post references instead of serving a redirect to the new site.

It’s so much nicer when someone moving to a new site makes the effort to ensure no feed readers watching the old site get broken and nobody coming across links into the old site get disappointed by a 404.

It’s All Text, Firefox extension

December 9th, 2007

It’s All Text! is a pretty handy Firefox extension. It lets you set up an external editor and puts a little ‘edit’ button in the corner of every textarea that pops open an external editor of your choosing. Then it watches the file the external editor is editing and refreshes the textarea whenever it changes.
Particularly handy given all the things nowadays that encourage editing of document-type text in a browser.

python-cdb 0.32 (-5.2ubuntu2) with Python 2.5 causes double-free corruption crash on dealloc

October 24th, 2007

I’ve recently started moving my linux box to a new x86_64 machine running Ubuntu 7.10. I searched for references to this bug but didn’t find anything with Google or launchpad, so I wanted to make a note of it so future victims can see what is going on and to remind me to report it.

The symptom is a crash when your cdb object is deallocated usually with a “double-free” memory corruption error message. Assuming a .cdb file named “foo.cdb”, the following script will repro the bug:

#!/usr/bin/python
import cdb
c = cdb.init(’foo.cdb’)
del c

with the following message:

fox@hercules:~$ python cdbrepro.py
*** glibc detected *** python: free(): invalid pointer: 0×00002b56c25bd750 ***
======= Backtrace: =========
/lib/libc.so.6[0x2b56c300ab0a]
/lib/libc.so.6(cfree+0×8c)[0x2b56c300e6fc]
python(PyDict_DelItem+0xfa)[0x44370a]
python(PyEval_EvalFrameEx+0×2e40)[0x485140]
python(PyEval_EvalCodeEx+0×830)[0x489d60]
python(PyEval_EvalCode+0×32)[0x489da2]
python(PyRun_FileExFlags+0×10e)[0x4ab4fe]
[...]
Aborted (core dumped)

Some other searching suggests that python-cdb’s use of PyMem_DEL is no longer recommended. I haven’t verified that this doesn’t cause other problems, but replacing cdbmodule.c’s use of PyMem_DEL with PyObject_Del (and the PyObject_NEW with _New, to use consistent naming).

As soon as Ubuntu’s bug tracker (launchpad) works again for me I’ll report the bug. Launchpad is timing out with an error message for me now.

Microsoft Photo Info

September 24th, 2007

I’ve previous posted about using PixVue to edit image metadata directly from Windows Explorer.   I just stumbled across Microsoft Photo Info while going to download Microsoft RAW Image Viewer so I could see thumbnails for CR2 files (Canon RAW images) in Explorer.

Microsoft Photo Info enables easy editing of “metadata” for digital photographs from inside Windows Explorer.

  Photo Info is not quite as snappy as PixVue used to be, but has the bonus of the company that created it still being in business. I can no longer find any download sites for PixVue that I trust.

Photo Info seems be to nice enough and gets the job done.

 

Flex, [Java|Action]Script

September 17th, 2007

I’ve been playing with Adobe Flex which I’ll probably have something to say about soon.

Flex uses ActionScript which bears a remarkable similarity to JavaScript. It’s not quite the same but it’s close enough that I haven’t stumbled too badly with it working from JavaScript knowledge.  As with any "new" language the learning curve isn’t the language but the environment and libraries.

The experience with Flex and also the Greasemonkey hacking I’ve been doing lately has made me rather fonder of JavaScript than I’ve been in the past.  JavaScript is particularly nice when used in an environment that is safe from worrying about cross-browser API woes — such as a Firefox-only Greasemonkey user script or an environment like Flex. It’s not ideal but it has a lot of what I like in a language, including garbage collection, closures, reasonable typing and widespread deployment.

Adobe Contribute

September 17th, 2007

I’m playing with Adobe Contribute CS3.   I haven’t had much to say here lately, but maybe a clever client will remind me to post more.  I’ve been posting the occasional photo. I figure at this point that folks interested in my photos have probably subscribed to the feed there so I don’t usually cross-post them to here.

So far Contribute seems to be nice enough.  I haven’t tried to use it to edit anything other than WordPress blog entries so I don’t know how well it works with websites via FTP, WebDAV, SFTP, or local filesystem.  I was pleased to note that it supported SFTP — seeing folks use FTP with cleartext passwords makes me unhappy.

I miss the real-time spellchecking I get in Firefox textareas (or in Word, but I use Firefox more than Word). Seeing the little red squiggle is a lot less intrusive than remembering to run a modal spell-checking UI. Right-clicking on red-squiggled words and picking “Ignore”, “Add”, or correcting the spelling is nicer than using the modal spell-checking UI. I’ve also noticed that the real-time feedback is more likely to make me remember the correct spelling of a word in the future.

Well, enough of this post now that I’ve thought of something to talk about which isn’t related to Contribute…

Hm, I can’t tell if the “Allow Comments” button is on or off by default.  I guess I’ll find out.

Update: Seeing if editing an entry works… That’s kind of random, editing the entry apparently made it disappear. I had to edit it again to make it come back. Also it’s kind of slow, but that may be Dreamhost’s hosting of my WordPress install rather than Contribute.

Logitech MX Revolution

July 16th, 2007

I picked up a Logitech MX Revolution wireless laser mouse a week or so ago. It replaced my 3 year old Logitech wireless laser mouse. Who doesn’t like wireless lasers?

The new mouse is shaped a little differently than the old mouse and has a couple more buttons and one new wheel on the side. The new buttons are moderately useful but the key new feature over my old mouse is that the mouse wheel will spin like a flywheel if it’s pushed with enough force.

I hadn’t noticed how much I liked that for zooming around in a document until I had to use my wired, non-laser, flywheelless mouse at work.