<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Trent Mick</title>
 <link href="http://trentm.com/atom.xml" rel="self"/>
 <link href="http://trentm.com/"/>
 <updated>2012-04-02T20:45:09-07:00</updated>
 <id>http://trentm.com/</id>
 <author>
   <name>Trent Mick</name>
   <email>trentm@gmail.com</email>
 </author>

 
 <entry>
   <title>Thoughts on Google Chrome -> Firefox</title>
   <link href="http://trentm.com/2012/03/thoughts-on-google-chrome-firefox.html"/>
   <updated>2012-03-03T14:16:37-08:00</updated>
   <id>http://trentm.com/2012/03/thoughts-on-google-chrome-firefox</id>
   <content type="html">&lt;p&gt;I recently switched from Google Chrome (back) to Firefox -- currently Aurora
(12.0a2). Some thoughts.&lt;/p&gt;

&lt;p&gt;The main thing that brought me back is the Awesome Bar. Firefox's algorithm for
suggestions/auto-complete in the Awesome Bar is just much better than Google
Chrome's. In Chrome I often found myself frustrated that I wouldn't get, e.g.
&quot;https://dev.example.com/jira/browse/OS-123&quot; suggested when entering &quot;OS&quot; or
&quot;OS-&quot; or &quot;OS-1&quot; when I'd been using that URL frequently and recently.
Yeah for FF's frecency.&lt;/p&gt;

&lt;p&gt;Love FF's Awesome Bar suggesting &quot;switch to tab&quot; if I already have one
of the hits open.&lt;/p&gt;

&lt;h1&gt;Chrome Pros (I.e., please steal these Firefox)&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;search in page:

&lt;ul&gt;
&lt;li&gt;i like it at the top&lt;/li&gt;
&lt;li&gt;it goes away under conditions where FF's sticks around. Not sure
what those conds are yet&lt;/li&gt;
&lt;li&gt;I like that that it shows how many hits on the whole page.&lt;/li&gt;
&lt;li&gt;I like that it highlights &lt;em&gt;all&lt;/em&gt; in one color and the current hit
in another color. Actually Firefox's search in page offers &quot;highlight
all&quot;, but it isn't the default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;showing where the hits are on the scrollbar is huge&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I like that I have a bookmarks bar on the default chrome new tab page
I don't want a permanent bookmarks bar: only when opening a new page.&lt;/li&gt;
&lt;li&gt;Like the &quot;right-click &gt; Close Tabs to the Right&quot; to clean up after a digression.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;Firefox Cons&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Cmd+A in a listbox in Chrome selects all. No so in FF.&lt;/li&gt;
&lt;li&gt;Holy crazy hard to set FF as the default browser. Online instructions
(back around Firefox 8 time) used to say to use &lt;em&gt;Safari&lt;/em&gt;. Lame.
Now in Aurora I find this option buried in the &quot;Advanced&quot; prefs pane.
In Safari this is the first option.&lt;/li&gt;
&lt;li&gt;The url popup at the bottom when hovering over links is on the left by
default (good), but is on the right when the search bar is up!? Why?
Because the search bar is stickier than I think it should be (Esc doesn't
always close it), it is unpredicatable where that URL popup is.&lt;/li&gt;
&lt;li&gt;HTTP basic auth sheet is on the whole window, rather than specific to a
tab. Sometimes I want to click back to another tab to copy/paste the
username/password creds (e.g. to my gmail).&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;Firefox RFEs&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Aurora &quot;Inspect Element&quot;: I want this to remember which panes I had open,
e.g. whether the &quot;HTML&quot; and &quot;Style&quot; buttons were pressed.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Yes, I should open tickets for all these things. I'm hoping this post will
so motivate me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Code -> GitHub</title>
   <link href="http://trentm.com/2012/03/google-code-to-github.html"/>
   <updated>2012-03-03T00:00:00-08:00</updated>
   <id>http://trentm.com/2012/03/google-code-to-github</id>
   <content type="html">&lt;p&gt;Herein a walk-through of moving a project from Google Code to GitHub. The
project is &quot;python-markdown2&quot;:
&lt;a href=&quot;http://code.google.com/p/python-markdown2/&quot;&gt;on Google Code&lt;/a&gt; -&gt;
&lt;a href=&quot;https://github.com/trentm/python-markdown2&quot;&gt;on GitHub&lt;/a&gt;. It was
single-commiter subversion project on Google Code with one tag and no
branches. It had (has) a number of issues in the issue tracker, a few wiki
pages and a few downloads.&lt;/p&gt;

&lt;p&gt;This includes a couple tools I wrote for converting between Google Code
and GitHub project wikis and issue trackers. &lt;em&gt;Note:&lt;/em&gt; I originally did this
migration almost a year ago, so I'm not positive whether recent changes
in the GitHub issues API might break this tool.&lt;/p&gt;

&lt;h1&gt;github project&lt;/h1&gt;

&lt;p&gt;First create the new project on GitHub.&lt;/p&gt;

&lt;h1&gt;source code repo&lt;/h1&gt;

&lt;p&gt;As per &lt;a href=&quot;http://help.github.com/svn-importing/&quot;&gt;http://help.github.com/svn-importing/&lt;/a&gt;,
&lt;a href=&quot;https://github.com/nirvdrum/svn2git&quot;&gt;svn2git&lt;/a&gt; is preferred. At first I hit
an inscrutable error from 'svn2git':&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;error: pathspec 'master' did not match any file(s) known to git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The only reference I could find with a cure was:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://mysz.tumblr.com/post/2515522812/git2svn-no-author-i-bledy-importu
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which indicated that you need an entry in &quot;authors.txt&quot; for &quot;(no author)&quot;,
something like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(no author) = unknown author &amp;lt;unknown@example.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;My first import attempt &lt;em&gt;appeared&lt;/em&gt; to work, but failed to import all commits.
A subsequent attempt (this time with &quot;--verbose&quot; option) worked. Not sure if
&quot;--verbose&quot; makes a difference. I hope not. Here were my steps:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat ~/tm/authors.txt
trentm = Trent Mick &amp;lt;trentm@gmail.com&amp;gt;
(no author) = unknown author &amp;lt;unknown@example.com&amp;gt;
$ mkdir ~/tm/python-markdown2
$ cd ~/tm/python-markdown2
$ svn2git https://python-markdown2.googlecode.com/svn --authors ~/tm/authors.txt
W: -empty_dir: trunk/test/tm-cases/blog.markdown
W: -empty_dir: trunk/test/tm-cases/extintro.markdown
W: -empty_dir: trunk/test/tm-cases/link_defn_alt_title_delims.tags
W: -empty_dir: trunk/test/tm-cases/safe_mode.html
W: -empty_dir: trunk/test/tm-cases/safe_mode.opts
W: -empty_dir: trunk/test/tm-cases/safe_mode.text
W: -empty_dir: trunk/markdown2.py
W: -empty_dir: trunk/bin/markdown2
W: -empty_dir: trunk/test/tm-cases/issue31_gt_escaping.html
W: -empty_dir: trunk/test/tm-cases/issue31_gt_escaping.tags
W: -empty_dir: trunk/test/tm-cases/issue31_gt_escaping.text
Found possible branch point: https://python-markdown2.googlecode.com/svn/trunk =&amp;gt; https://python-markdown2.googlecode.com/svn/tags/v1.0.1.17, 240
Use of uninitialized value $u in substitution (s///) at /usr/local/git/libexec/git-core/git-svn line 1731.
Use of uninitialized value $u in concatenation (.) or string at /usr/local/git/libexec/git-core/git-svn line 1731.
refs/remotes/trunk: 'https://python-markdown2.googlecode.com/svn' not found in ''

Note: checking out 'trunk'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at acb4fca... TODOne a while back
error: branch 'master' not found.
Switched to a new branch 'master'
Counting objects: 1175, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1069/1069), done.
Writing objects: 100% (1175/1175), done.
Total 1175 (delta 611), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.

HEAD is now at cb87cf8... Tweaks to 'header-ids' and 'toc' extras. Also add a &quot;.postprocess(text)&quot; hook for subclasses' convenience.
Running command: git branch -D master
Deleted branch master (was cb87cf8).
Running command: git checkout -f -b master
Switched to a new branch 'master'
Running command: git gc
Counting objects: 1290, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1166/1166), done.
Writing objects: 100% (1290/1290), done.
Total 1290 (delta 681), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then a sanity check diffing the HEAD state in an svn working copy and a git
clone:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ diff -ru -x .svn -x .git python-markdown2.svn python-markdown2 | less
diff -ru -x .svn -x .git python-markdown2.svn/externals/which/which.py python-markdown2/externals/which/which.py
--- python-markdown2.svn/externals/which/which.py       2010-10-14 09:55:52.000000000 -0700
+++ python-markdown2/externals/which/which.py   2011-01-31 21:14:20.000000000 -0800
@@ -65,7 +65,7 @@
     files without executable access.
 &quot;&quot;&quot;

-__revision__ = &quot;$Id: which.py 82 2007-11-06 05:44:22Z trentm $&quot;
+__revision__ = &quot;$Id$&quot;
 __version_info__ = (1, 1, 3)
 __version__ = '.'.join(map(str, __version_info__))
 __all__ = [&quot;which&quot;, &quot;whichall&quot;, &quot;whichgen&quot;, &quot;WhichError&quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's an acceptable diff. I don't care about that &quot;$Id$&quot; expansion facility.&lt;/p&gt;

&lt;p&gt;Now for ignore-patterns:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd python-markdown2
$ svn propget svn:ignore ../python-markdown2.svn &amp;gt; .gitignore
$ git add .gitignore
$ git commit -m &quot;.gitignore from svn:ignore&quot; .gitignore
[master d31e29e] .gitignore from svn:ignore
 1 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In general you'd have to walk the full svn working copy for 'svn:ignore'
properties on any directory. In my case I had a bunch to incorporate (manually)
into my &quot;.gitignore&quot; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ find . -type d | grep -v .svn | xargs svn pl -v .
Properties on '.':
  svn:ignore
    *.pyc
    tmp
    externals
    dist
    MANIFEST
    build
    googlecode_upload.py

Properties on 'externals':
  svn:ignore
    pygments

Properties on 'externals/which':
  svn:ignore
    *.pyc

Properties on 'lib':
  svn:ignore
    *.pyc

Properties on 'perf':
  svn:ignore
    *.pyc
    *.prof
    tmp-*-cases

Properties on 'sandbox':
  svn:ignore
    *.html

Properties on 'test':
  svn:ignore
    *.pyc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Time to push this to github:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd .../python-markdown2
git remote add origin git@github.com:trentm/python-markdown2.git
git push origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Google Code project page -&gt; README.md&lt;/h1&gt;

&lt;p&gt;A Google Code project's front page is the wiki-formatted project page. A
GitHub project's front page (prose) is the README file. You might want to
start with your Google Code project wiki page content (at
&lt;a href=&quot;http://code.google.com/p/PROJNAME/admin&quot;&gt;http://code.google.com/p/PROJNAME/admin&lt;/a&gt;) and use that to create a README.md
(or README.txt or whatever). I already had a README.txt and I'm a Markdown
guy (duh) so I converted it to README.md to have it rendered nicely on my
GitHub project page.&lt;/p&gt;

&lt;h1&gt;wiki pages&lt;/h1&gt;

&lt;p&gt;Google Code for a long time (from the get go?) allowed you to have a wiki for
your project whose content is in Subversion -- nice feature. GitHub more
recently added support for project wiki pages being in a git repo. This will
make moving wiki pages straightforward.&lt;/p&gt;

&lt;p&gt;First, create your wiki on GitHub by clicking &quot;Create Wiki Now&quot; on
&lt;a href=&quot;https://github.com/USERNAME/PROJNAME/wiki&quot;&gt;https://github.com/USERNAME/PROJNAME/wiki&lt;/a&gt;. Then let's get working copies of
the old and the new:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ...
svn co https://python-markdown2.googlecode.com/svn/wiki python-markdown2-wiki.svn
git clone git@github.com:trentm/python-markdown2.wiki.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At this point you could do a whole subversion history conversion to git, but
I don't care about the wiki editing history.&lt;/p&gt;

&lt;p&gt;Let's just copy over and convert the files.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;python googlecode2github/wikiconvert.py \
    trentm/python-markdown2 \
    python-markdown2-wiki.svn \
    python-markdown2.wiki
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&quot;wikiconvert.py&quot; is a tool I wrote to help with this conversion.
It doesn't cover the full Google Code wiki syntax, just enough for what
was my typical usage... so you may want to do some post tweaking. However,
it should be a good start. See &lt;a href=&quot;https://github.com/github/gollum&quot;&gt;https://github.com/github/gollum&lt;/a&gt; for details
on other wiki tweaks you can do on GitHub. &quot;wikiconvert&quot; lives here
&lt;a href=&quot;https://github.com/trentm/googlecode2github&quot;&gt;https://github.com/trentm/googlecode2github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Review, commit and push in 'python-markdown2.wiki':&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd python-markdown2.wiki
git add .
git diff --staged
git commit -m &quot;convert wiki from code.google.com/python-markdown2 with 'googlecode2github/wikiconvert'&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;issues&lt;/h1&gt;

&lt;p&gt;Fully transplanting all issues (along with timing, status, user data, comments,
attachments, etc.) is a fool's errand. Instead we'll just create a shadow
issue for each google code issue so that (a) we have a pointer for all issues
from the new GitHub project and (b) there are no issue number collisions
when new issues are added on GitHub.&lt;/p&gt;

&lt;p&gt;&quot;googlecode2github/shadowissues.py&quot; (see
&lt;a href=&quot;https://github.com/trentm/googlecode2github&quot;&gt;https://github.com/trentm/googlecode2github&lt;/a&gt;) will do this for us. For each
shadow issue it'll try to reproduce the title, original description and the
closed/open state. To make changes you GH issues, the script will need you
github username and API token. The latter is available at
&lt;a href=&quot;https://github.com/account#admin_bucket&quot;&gt;https://github.com/account#admin_bucket&lt;/a&gt;. The script will ask interactively
or you can add them to your &quot;~/.gitconfig&quot; via:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git config --add github.user [github_username]
git config --add github.token [github_api_token]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As a sanity check, &lt;strong&gt;I suggest that you first run this against a test
github project&lt;/strong&gt; (e.g. I used &quot;trentm/ghtest&quot;). This is because
&quot;shadowissues.py&quot; wants the shadow issues to have the issue ids match those
in the Google Code project. You cannot delete issues on a github project (a
good thing) so you only get one chance:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python .../googlecode2github/shadowissues.py python-markdown2 trentm/ghtest
# Gathering code.google.com/p/python-markdown2 issues.
# Gathering any github.com/trentm/ghtest issues.
Migrating issue 1.
 from: http://code.google.com/p/python-markdown2/issues/detail?id=1
   to: https://github.com/trentm/ghtest/issues/1
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Review those created GH-issues, then if things look good, run it for realz:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python .../googlecode2github/shadowissues.py python-markdown2 trentm/python-markdown2
# Gathering code.google.com/p/python-markdown2 issues.
# Gathering any github.com/trentm/python-markdown2 issues.
Migrating issue 1.
 from: http://code.google.com/p/python-markdown2/issues/detail?id=1
   to: https://github.com/trentm/python-markdown2/issues/1
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One last change for issues: Now that you've moved to github, you want new issues
to be added there. You might want to change the Google Code new issue template to
something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NOTICE: This project has moved to &amp;lt;https://github.com/trentm/python-markdown2&amp;gt;.
Please report your issue here:

https://github.com/trentm/python-markdown2/issues
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This can be done on the equivalent of
&lt;a href=&quot;http://code.google.com/p/python-markdown2/adminIssues&quot;&gt;http://code.google.com/p/python-markdown2/adminIssues&lt;/a&gt; for your project.&lt;/p&gt;

&lt;h1&gt;pointer from google code to github&lt;/h1&gt;

&lt;p&gt;A few extra touches for your Google Code project to provide pointers to
the new GitHub location.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary: append &lt;code&gt;(**MOVED TO GITHUB**)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Description: prepend &lt;code&gt;= Note: This project has been moved to [https://github.com/trentm/python-markdown2 trentm/python-markdown2 on GitHub]. =&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wiki pages: prepend &lt;code&gt;= Note: This project has been moved to [https://github.com/trentm/python-markdown2 trentm/python-markdown2 on GitHub]. =&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Car jump</title>
   <link href="http://trentm.com/2011/08/car-jump.html"/>
   <updated>2011-08-10T00:25:53-07:00</updated>
   <id>http://trentm.com/2011/08/car-jump</id>
   <content type="html">&lt;p&gt;I love this photo by my Dad. He caught the car in the air.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/posts/carjump.jpg&quot; alt=&quot;Car jump&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Coding Style: Why to not group variables and align equals</title>
   <link href="http://trentm.com/2011/06/style-group-vars-align-equals.html"/>
   <updated>2011-06-16T21:43:47-07:00</updated>
   <id>http://trentm.com/2011/06/style-group-vars-align-equals</id>
   <content type="html">&lt;p&gt;Here is a diff from a &lt;code&gt;git log -p&lt;/code&gt; stream I was reviewing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-var ZPOOL_PATH = '/sbin/zpool'
-  , ZFS_PATH   = '/sbin/zfs'
-  , PFEXEC_PATH   = '/bin/pfexec';
+var ZPOOL_PATH  = '/sbin/zpool'
+  , ZFS_PATH    = '/sbin/zfs';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If (a) this wasn't using the &quot;group all vars in a single statement&quot; cuteness:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var ZPOOL_PATH = '/sbin/zpool'
var ZFS_PATH   = '/sbin/zfs'
var PFEXEC_PATH   = '/bin/pfexec';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and (b) wasn't using the anti-pattern (IMHO, of course) of aligning '=' in variable declaraction blocks:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var ZPOOL_PATH = '/sbin/zpool'
var ZFS_PATH = '/sbin/zfs'
var PFEXEC_PATH = '/bin/pfexec';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then the diff hunk would have been:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-var PFEXEC_PATH = '/bin/pfexec';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which is what it should have been.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moved blog from Blogger to Github Pages (and trentm.com)</title>
   <link href="http://trentm.com/2011/06/moved-blog-from-blogger-to-github-pages-and-trentmcom.html"/>
   <updated>2011-06-03T23:07:02-07:00</updated>
   <id>http://trentm.com/2011/06/moved-blog-from-blogger-to-github-pages-and-trentmcom</id>
   <content type="html">&lt;p&gt;I'm moving my blog from Blogger &lt;a href=&quot;http://trentmick.blogspot.com&quot;&gt;http://trentmick.blogspot.com&lt;/a&gt; back to
&lt;strong&gt;&lt;a href=&quot;http://trentm.com&quot;&gt;http://trentm.com&lt;/a&gt;&lt;/strong&gt; (hosted on Github Pages). &lt;em&gt;Apologies for all the
&quot;new&quot; posts in your feed reader.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My feed URL is &lt;a href=&quot;http://feeds.feedburner.com/trentmick&quot;&gt;http://feeds.feedburner.com/trentmick&lt;/a&gt;. However, most of you
(all 7 of my readers) shouldn't have to do anything to update.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>who knew path joining differed so between Python, Ruby, Node, Perl</title>
   <link href="http://trentm.com/2010/08/who-knew-path-joining-differed-so.html"/>
   <updated>2010-08-16T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/08/who-knew-path-joining-differed-so</id>
   <content type="html">&lt;p&gt;In Python I do a lot of path manipulations for build systems, various
command-line utilities and Komodo support modules. Typically this is with
Python's &lt;code&gt;os.path&lt;/code&gt; module. One thing I've come to expect of path joining,
&lt;code&gt;os.path.join&lt;/code&gt;, is this (apparently rare) detail:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;If any component is an absolute path, all previous path components
will be discarded.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I say &quot;apparently rare&quot; because, in Python:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python
&amp;gt;&amp;gt;&amp;gt; import os.path
&amp;gt;&amp;gt;&amp;gt; os.path.join(&quot;/Users/trentm&quot;, &quot;/var/log&quot;)
'/var/log'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ irb
&amp;gt;&amp;gt; File.join(&quot;/Users/trentm&quot;, &quot;/var/log&quot;)
=&amp;gt; &quot;/Users/trentm/var/log&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in Node.js:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ node
node&amp;gt; var path = require('path')
node&amp;gt; path.join(&quot;/Users/trentm&quot;, &quot;/var/log&quot;)
'/Users/trentm/var/log'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in Perl:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat pathjoin.pl 
use File::Spec;
print File::Spec-&amp;gt;join('/Users/trentm', '/var/log'), &quot;\n&quot;;
$ perl pathjoin.pl 
/Users/trentm//var/log
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Conclusions? Certainly none of these libraries is going to change their
behaviour here, with the possible exception of Node which is young and
changing very quickly. I'd say the double '/' in Perl's &lt;code&gt;File::Spec&lt;/code&gt; is
poor -- though it doesn't give in invalid path. You could certainly argue
that Ruby's and Node's interpretation is less subtle (often a good thing).
I &lt;strong&gt;like&lt;/strong&gt; Python's interpretation: &lt;code&gt;os.path.join&lt;/code&gt; is kind of like
running &lt;code&gt;cd&lt;/code&gt; for each given path in sequence to get the resultant
directory. It means I don't need a guard against an absolute path input
datum being joined to a current working directory scope.&lt;/p&gt;

&lt;p&gt;I'd be curious to know what is typical in other languages, if there are
any takers reading this post. If blog commenting isn't your thing, you
can tweet &quot;@trentmick&quot;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Komodo 6.0 Beta 2: HTML 5, CSS 3, Python 3, DB Explorer, ...</title>
   <link href="http://trentm.com/2010/07/komodo-60-beta-2-html-5-css-3-python-3.html"/>
   <updated>2010-07-14T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/07/komodo-60-beta-2-html-5-css-3-python-3</id>
   <content type="html">&lt;p&gt;We (&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;) released Komodo 6.0 beta 2 yesterday and we want your feedback.
&lt;strong&gt;HTML 5&lt;/strong&gt; autocomplete. &lt;strong&gt;CSS 3&lt;/strong&gt; autocomplete. Full &lt;strong&gt;Python 3&lt;/strong&gt; support (debugging, syntax checking, autocomplete, code browsing). A new &lt;strong&gt;Database Explorer&lt;/strong&gt; tool for quickly exploring SQL databases (SQLite out of the box and extensions for &lt;a href=&quot;http://community.activestate.com/xpi/mysql-database-explorer&quot;&gt;MySQL&lt;/a&gt; and &lt;a href=&quot;http://community.activestate.com/xpi/oracle-database-explorer&quot;&gt;Oracle&lt;/a&gt;, with plans for Postgres). A &lt;strong&gt;new project system&lt;/strong&gt; called &quot;Places&quot; that adds a file system browser (local and remote). New &lt;strong&gt;publishing&lt;/strong&gt; support for syncing a directory with a remote machine. Additions to Komodo's &lt;a href=&quot;http://docs.activestate.com/komodo/6.0/hyperlinks.html#hyperlinks_top&quot;&gt;Hyperlinks&lt;/a&gt; for quickly navigating to file references. Added support for PHP, Perl, Ruby and JavaScript regular expression debugging with Komodo's excellent &lt;a href=&quot;http://docs.activestate.com/komodo/6.0/regex.html&quot;&gt;Rx&lt;/a&gt; tool. See the &lt;a href=&quot;http://community.activestate.com/komodo-60-features&quot;&gt;Komodo 6.0 Features&lt;/a&gt; post for a full outline.&lt;/p&gt;

&lt;table style=&quot;margin-left: 30px;&quot;&gt;
&lt;tr&gt;&lt;th&gt;Komodo IDE&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://www.activestate.com/komodo-ide/downloads&quot;&gt;http://www.activestate.com/komodo-ide/downloads&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Komodo Edit&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://www.activestate.com/komodo-edit/downloads&quot;&gt;http://www.activestate.com/komodo-edit/downloads&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;&lt;a href=&quot;http://www.activestate.com/blog/2010/07/komodo-6.0-beta-2&quot;&gt;Full post here on the ActiveState blog&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>eol.py 0.7.4 -- Python 3 support</title>
   <link href="http://trentm.com/2010/07/eolpy-074-python-3-support.html"/>
   <updated>2010-07-13T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/07/eolpy-074-python-3-support</id>
   <content type="html">&lt;h3&gt;Where?&lt;/h3&gt;




&lt;ul&gt;
&lt;li&gt;Project Page: &lt;a href=&quot;http://github.com/trentm/eol&quot;&gt;http://github.com/trentm/eol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href=&quot;http://pypi.python.org/pypi/eol/&quot;&gt;http://pypi.python.org/pypi/eol/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;What's new?&lt;/h3&gt;




&lt;ul&gt;
&lt;li&gt;Python 3 support (not heavily tested yet)&lt;/li&gt;
&lt;li&gt;Starter test suite&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full changelog: &lt;a href=&quot;http://github.com/trentm/eol/tree/master/CHANGES.md#files&quot;&gt;http://github.com/trentm/eol/tree/master/CHANGES.md#files&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;What is &amp;#8216;eol&amp;#8217;?&lt;/h3&gt;




&lt;p&gt;&lt;code&gt;eol&lt;/code&gt; is both a command-line script &lt;code&gt;eol&lt;/code&gt; and a Python module &lt;code&gt;eol&lt;/code&gt; for working
with end-of-line chars in text files.&lt;/p&gt;




&lt;h4&gt;Command line usage&lt;/h4&gt;




&lt;pre&gt;&lt;code&gt;# list EOL-style of files
$ eol *
configure: Unix (LF)
build.bat: Windows (CRLF)
snafu.txt: Mixed, predominantly Unix (LF)

# find files with a given EOL-style
$ eol -f CRLF -x .svn -r ~/src/python
/Users/trentm/src/python/Doc/make.bat
/Users/trentm/src/python/Lib/email/test/data/msg_26.txt
/Users/trentm/src/python/Lib/encodings/cp720.py
...

# convert EOL-style of files
$ eol -c LF foo.c 
converted `foo.c' to LF EOLs
&lt;/code&gt;&lt;/pre&gt;




&lt;h4&gt;Module usage&lt;/h4&gt;




&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import eol
&amp;gt;&amp;gt;&amp;gt; eol.eol_info_from_path(&quot;configure&quot;)
('\n', '\n')         # (&amp;lt;detected-eols&amp;gt;, &amp;lt;suggested-eols&amp;gt;)
&amp;gt;&amp;gt;&amp;gt; eol.eol_info_from_path(&quot;build.bat&quot;)
('\r\n', '\r\n')
&amp;gt;&amp;gt;&amp;gt; eol.eol_info_from_path(&quot;snafu.txt&quot;)
(&amp;lt;class 'eol.MIXED'&amp;gt;, '\n')
&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;See the &lt;a href=&quot;http://github.com/trentm/eol#readme&quot;&gt;README&lt;/a&gt; for full usage
information.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>quick hack how to move a part of a Mercurial (hg) repo to git</title>
   <link href="http://trentm.com/2010/07/hg-repo-to-git.html"/>
   <updated>2010-07-10T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/07/hg-repo-to-git</id>
   <content type="html">&lt;p&gt;My quick dirty hack to move a (small) part of a Mercurial (hg) repo to Git.
In my case this was for moving my single file &quot;testlib.py&quot; from
&lt;a href=&quot;http://bitbucket.org/trentm/sandbox/src/tip/testlib/&quot;&gt;here on bitbucket&lt;/a&gt;
to
&lt;a href=&quot;http://github.com/trentm/testlib/tree/master/lib/&quot;&gt;here on github&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Dump the log of that part of the hg repo to a file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; export WORKDIR=$HOME/tmp/migrate
 cd HGREPO/foo
 hg log -pv . &amp;gt; $WORKDIR/full.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the starter git repo&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; cd $WORKDIR
 git init foo
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Break up the log into a number of &quot;changesetNNN.patch&quot; files with this
Python code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; # parse.py
 import codecs
 changeset = []
 i = 0

 def write_changeset():
     global changeset
     if not changeset:
         return
     codecs.open(&quot;changeset%05d.patch&quot; % i, 'w', &quot;utf-8&quot;).write(''.join(changeset))
     i += 1
     changeset = []

 for line in open(&quot;full.patch&quot;):
     if line.startswith(&quot;changeset:&quot;):
         write_changeset()
     changeset.append(line)
 write_changeset()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; and then run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; python parse.py
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply and commit each patch with this Python script&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; # Usage: python apply.py TARGET-REPO-BASE-DIR
 import os
 from os.path import *
 from glob import glob
 import subprocess
 from pprint import pprint

 def apply_patch(target_repo_base_dir, patch_path):
     content = open(patch_path).read()
     header, diff = content.split('\n\n\n', 1)
     assert diff.startswith(&quot;diff --git a&quot;)
     fields = {}
     lines = header.splitlines(False)
     for i, line in enumerate(lines):
         key, value = line.split(':', 1)
         if key == &quot;description&quot;:
             fields[key] = '\n'.join(lines[i+1:])
             break
         value = value.strip()
         fields[key] = value
     # Do any path renamings here. For example, I wanted to move from
     # &quot;testlib/testlib.py&quot; in the old repo to &quot;lib/testlib.py&quot; in the new.
     diff = diff.replace('a/testlib/testlib.py', 'a/lib/testlib.py')
     diff = diff.replace('b/testlib/testlib.py', 'b/lib/testlib.py')
     f = open(patch_path+&quot;.diff&quot;, 'w')
     f.write(diff)
     f.close()
     f = open(patch_path+&quot;.msg&quot;, 'w')
     f.write(fields[&quot;description&quot;])
     f.close()
     cwd = target_repo_base_dir
     subprocess.check_call(['git', 'apply', '--whitespace=nowarn',
         abspath(patch_path+&quot;.diff&quot;)], cwd=cwd)
     subprocess.check_call(['git', 'add', 'lib/testlib.py'], cwd=cwd)
     subprocess.check_call(['git', 'commit', '--date', fields[&quot;date&quot;],
         '-F', abspath(patch_path+&quot;.msg&quot;)], cwd=cwd)

 if __name__ == &quot;__main__&quot;:
     target_repo_base_dir = sys.argv[1]
     patches = list(sorted(glob(&quot;changeset*.patch&quot;)))
     for patch_path in patches:
         print &quot;--&quot;, patch_path
         apply_patch(target_repo_base_dir, patch_path)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; Then run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; python apply.py foo    # apply all changeset*.patch files to &quot;foo&quot; git repo
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Now you can push this Git repo to github or whereever.&lt;/p&gt;

&lt;h1&gt;To improve on&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;You currently need to manually create the dir structure first.&lt;/li&gt;
&lt;li&gt;This doesn't currently used the parse &quot;user&quot; field from the hg commit log
for the &quot;git commit -a AUTHOR&quot; command. Mainly this is because I didn't need
that, but also because the &quot;user&quot; value in the hg log isn't the configured
full user name and email, but just the short username. Maybe that was just me.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>On a bit of confusion</title>
   <link href="http://trentm.com/2010/07/on-a-bit-of-confusion.html"/>
   <updated>2010-07-08T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/07/on-a-bit-of-confusion</id>
   <content type="html">&lt;p&gt;On a bit of confusion in &lt;a href=&quot;http://www.activestate.com/blog/2010/07/activepython-27-released&quot;&gt;ActivePython 2.7 released - and what 2.7 means for Python's future&lt;/a&gt;, in particular the following paragraph. Before:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;While the Python community has declared a moratorium on major 2.x releases in an effort to facilitate other Python implementations to catch up and, thus, accelerate the adoption of Python 3.x, ActiveState will continue supporting 2.7.x and adding new modules and updating revisions to existing ones as they become available.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;While &lt;a href=&quot;http://www.python.org/dev/peps/pep-3003/&quot;&gt;you may have read&lt;/a&gt;, the Python community has declared a temporary moratorium (suspension) on the Python language syntax in an effort to facilitate other Python implementations to catch up to Python 3.x --- the moratorium does not that mean that python core development has stopped or even slowed down.&lt;/p&gt;

&lt;p&gt;On the contrary, new modules continue to be added, bugs fixed, and performance tweeked --- and, as always, ActiveState will continue supporting 2.7.x with builds, extra modules and PyPM as they become available.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/jessenoller&quot;&gt;Jesse Noller&lt;/a&gt; accurately noted that the former paragraph was confusing. In particular, a possible interpretation that the Python community isn't going to be supporting Python 2.7 -- which is just &lt;a href=&quot;http://docs.python.org/dev/whatsnew/2.7.html#the-future-for-python-2-x&quot;&gt;not true&lt;/a&gt;. Python 2.7 will be supported for longer than the typical two years that a Python 2.x release is supported.&lt;/p&gt;

&lt;p&gt;It is easy to convolve the mostly unrelated &lt;em&gt;Python language moratorium&lt;/em&gt; and the plan that &lt;em&gt;Python 2.7 is the last 2.x&lt;/em&gt;. The two are somewhat related in that ultimately the hope is they both lead to smoother adoption of Python 3. The issue (from ActiveState's Product Manager's point of view) is that an enterprise customer can get swayed away from considering Python when reading stuff like the following from &lt;a href=&quot;http://lwn.net/Articles/361266/&quot;&gt;Python moratorium and the future of 2.x&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;On November 9, Python BDFL (&quot;Benevolent Dictator For Life&quot;) Guido van Rossum froze the Python language's syntax and grammar in their current form for at least the upcoming Python 2.7 and 3.2 releases, and possibly for longer still. This move is intended to slow things down, giving the larger Python community a chance to catch up with the latest Python 3.x releases.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;It is &lt;em&gt;very&lt;/em&gt; easy for the less-technical person to interpret &quot;moratorium on Python language syntax&quot; as a stop on &lt;em&gt;all core Python development&lt;/em&gt;. This differentiation was the kernel of a heated debate I just had with our Product Manager recently.&lt;/p&gt;

&lt;p&gt;The intention of the paragraph in the ActiveState blog post is basically to state that the language moratorium isn't something that should dissuade usage businesses from considering Python.&lt;/p&gt;

&lt;p&gt;That said: Mea culpa. I had the chance to catch this the first time and didn't.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Donating blood in downtown Vancouver</title>
   <link href="http://trentm.com/2010/06/donating-blood-in-downtown-vancouver.html"/>
   <updated>2010-06-14T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/06/donating-blood-in-downtown-vancouver</id>
   <content type="html">&lt;p&gt;I like to try to donate blood regularly (you're allow to donate every 56 days).
It is an easy thing to do to help the system. But really I'm just in it for the
&lt;strong&gt;free cookies&lt;/strong&gt; at the end of it. There is no other way I can justify my
having an Oreo at 10am. Here is how in downtown Vancouver (where I work):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;upcoming schedule&lt;/strong&gt;: &lt;a href=&quot;http://bit.ly/vancouverblood&quot;&gt;http://bit.ly/vancouverblood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;map&lt;/strong&gt;: &lt;a href=&quot;http://bit.ly/vancouverbloodmap&quot;&gt;http://bit.ly/vancouverbloodmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>django-markdown-deux Django app</title>
   <link href="http://trentm.com/2010/06/django-markdown-deux-django-app.html"/>
   <updated>2010-06-14T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/06/django-markdown-deux-django-app</id>
   <content type="html">&lt;ul&gt;
&lt;li&gt;Project page: &lt;a href=&quot;http://github.com/trentm/django-markdown-deux&quot;&gt;http://github.com/trentm/django-markdown-deux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;on PyPI: &lt;a href=&quot;http://pypi.python.org/pypi/django-markdown-deux/&quot;&gt;http://pypi.python.org/pypi/django-markdown-deux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;code&gt;django-markdown-deux&lt;/code&gt; is a small Django app that provides template tags for using
&lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt; using the
&lt;a href=&quot;https://github.com/trentm/python-markdown2&quot;&gt;python-markdown2&lt;/a&gt; library. MIT license.&lt;/p&gt;

&lt;h2&gt;What's with the &amp;#8220;deux&amp;#8221; in the name?&lt;/h2&gt;

&lt;p&gt;The obvious name for this project in &lt;code&gt;django-markdown2&lt;/code&gt;. However, there
&lt;a href=&quot;http://github.com/svetlyak40wt/django-markdown2&quot;&gt;already is one!&lt;/a&gt; and name
confusion doesn't help anybody. Plus, I took French immersion in school for 12
years: might as well put it to use.&lt;/p&gt;

&lt;h2&gt;Quick Usage&lt;/h2&gt;

&lt;h3&gt;&lt;code&gt;markdown&lt;/code&gt; template filter&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;{% load markdown_deux_tags %}
...
{{ myvar|markdown:&quot;STYLE&quot; }}     {# convert `myvar` to HTML using the &quot;STYLE&quot; style #}
{{ myvar|markdown }}             {# same as `{{ myvar|markdown:&quot;default&quot; }}` #}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;&lt;code&gt;markdown&lt;/code&gt; template block tag&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;{% load markdown_deux_tags %}
...
{% markdown STYLE %}        {# can omit &quot;STYLE&quot; to use the &quot;default&quot; style #}
This is some **cool**
[Markdown](http://daringfireball.net/projects/markdown/)
text here.
{% endmarkdown %}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See more usage info, available settings, installation notes, etc. at the github
project page. (I mention on Moz planet because Benjamin is, or was, using
python-markdown2 and I've heard Mozilla is using more Django these days.)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>June Vancouver Python User Group (VanPyZ) this Tuesday at ActiveState</title>
   <link href="http://trentm.com/2010/05/june-vancouver-python-user-group.html"/>
   <updated>2010-05-27T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/05/june-vancouver-python-user-group</id>
   <content type="html">&lt;p&gt;We are hosting the &lt;a href=&quot;http://vanpyz.org/#NextEvent&quot;&gt;June VanPyZ meeting&lt;/a&gt; at ActiveState this coming Tuesday evening. Details:&lt;/p&gt;

&lt;h2&gt;What&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/andymckay&quot;&gt;Andy McKay&lt;/a&gt;: &lt;strong&gt;Using SMS in the Developing World&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RapidSMS is an open source project for messaging, data collection and co-ordination over SMS. It’s used throughout the world for a variety of projects, from fighting child malnutrition and malaria to monitoring elections.&lt;/p&gt;

&lt;p&gt;This talk introduces RapidSMS and shows what the library can do. We then cover some of the projects that use it including monitoring children in Malawi and diagnosing children in Kenya. The samples show how the project is used in the real world to make a real difference to people.&lt;/p&gt;

&lt;p&gt;This is a talk Andy's going to be &lt;a href=&quot;http://www.oscon.com/oscon2010/public/schedule/detail/13890&quot;&gt;giving at OSCON&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Where&lt;/h2&gt;

&lt;p&gt;ActiveState&lt;br/&gt;
1700 - 409 Granville Street&lt;br/&gt;
(SW corner of Granville and Hastings, &lt;a href=&quot;http://tinyurl.com/activestatemap&quot;&gt;map&lt;/a&gt;)&lt;br/&gt;
Buzzer# 1700&lt;/p&gt;

&lt;h2&gt;When&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tuesday, June 1st, at 7pm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&quot;VanPyZ&quot; is the Vancouver Python user group.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>python-markdown2 1.0.1.17</title>
   <link href="http://trentm.com/2010/05/python-markdown2-10117.html"/>
   <updated>2010-05-26T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/05/python-markdown2-10117</id>
   <content type="html">&lt;h3&gt;Where?&lt;/h3&gt;




&lt;ul&gt;
&lt;li&gt;Project Page: &lt;a href=&quot;http://code.google.com/p/python-markdown2/&quot;&gt;http://code.google.com/p/python-markdown2/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href=&quot;http://pypi.python.org/pypi/markdown2/&quot;&gt;http://pypi.python.org/pypi/markdown2/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;What's new?&lt;/h3&gt;




&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[Issue 36] Fix &quot;cuddled-lists&quot; extra handling for an
looks-like-a-cuddled-list-but-is-indented block. See the
&quot;test/tm-cases/cuddled&lt;em&gt;list&lt;/em&gt;indented.text&quot; test case.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experimental new &quot;toc&quot; extra. The returned string from conversion will have
a &lt;code&gt;toc_html&lt;/code&gt; attribute.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New &quot;header-ids&quot; extra that will add an &lt;code&gt;id&lt;/code&gt; attribute to headers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# My First Section
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;will become:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;h1 id=&quot;my-first-section&quot;&amp;gt;My First Section&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;An argument can be give for the extra, which will be used as a prefix for
the ids:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat foo.txt 
# hi there
$ python markdown2.py foo.txt 
&amp;lt;h1&amp;gt;hi there&amp;lt;/h1&amp;gt;
$ python markdown2.py foo.txt -x header-ids
&amp;lt;h1 id=&quot;hi-there&quot;&amp;gt;hi there&amp;lt;/h1&amp;gt;
$ python markdown2.py foo.txt -x header-ids=prefix
&amp;lt;h1 id=&quot;prefix-hi-there&quot;&amp;gt;hi there&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preliminary support for &quot;html-classes&quot; extra: takes a dict mapping HTML tag
to the string value to use for a &quot;class&quot; attribute for that emitted tag.
Currently just supports &quot;pre&quot; and &quot;code&quot; for code &lt;em&gt;blocks&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full changelog: &lt;a href=&quot;http://code.google.com/p/python-markdown2/source/browse/trunk/CHANGES.txt&quot;&gt;http://code.google.com/p/python-markdown2/source/browse/trunk/CHANGES.txt&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;What is &amp;#8216;markdown2&amp;#8217;?&lt;/h3&gt;




&lt;p&gt;&lt;code&gt;markdown2.py&lt;/code&gt; is a fast and complete Python implementation of
&lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt; -- a
text-to-HTML markup syntax.&lt;/p&gt;




&lt;h3&gt;Module usage&lt;/h3&gt;




&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import markdown2
&amp;gt;&amp;gt;&amp;gt; markdown2.markdown(&quot;*boo!*&quot;)  # or use `html = markdown_path(PATH)`
u'&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;boo!&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;\n'

&amp;gt;&amp;gt;&amp;gt; markdowner = Markdown()
&amp;gt;&amp;gt;&amp;gt; markdowner.convert(&quot;*boo!*&quot;)
u'&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;boo!&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;\n'
&amp;gt;&amp;gt;&amp;gt; markdowner.convert(&quot;**boom!**&quot;)
u'&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;boom!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;\n'
&lt;/code&gt;&lt;/pre&gt;




&lt;h3&gt;Command line usage&lt;/h3&gt;




&lt;pre&gt;&lt;code&gt;$ cat hi.markdown
# Hello World!
$ markdown2 hi.markdown
&amp;lt;h1&amp;gt;Hello World!&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;This implementation of Markdown implements the full &quot;core&quot; syntax plus a
number of extras (e.g., code syntax coloring, footnotes) as described on
&lt;a href=&quot;http://code.google.com/p/python-markdown2/wiki/Extras&quot;&gt;http://code.google.com/p/python-markdown2/wiki/Extras&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>eol.py -- a tool for working with text file end-of-line characters</title>
   <link href="http://trentm.com/2010/05/eolpy.html"/>
   <updated>2010-05-19T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/05/eolpy</id>
   <content type="html">&lt;p&gt;Just finally released &lt;code&gt;eol.py&lt;/code&gt; (&lt;a href=&quot;http://github.com/trentm/eol&quot;&gt;on github&lt;/a&gt;, &lt;a href=&quot;http://pypi.python.org/pypi/eol&quot;&gt;on pypi&lt;/a&gt;) -- a tool I've been using for a while to help find and convert EOLs in text files. It is a small Python module and command-line script. MIT license. Hopefully useful to others.&lt;/p&gt;

&lt;p&gt;See the notes in either link above for usage details.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>alternative Komodo doc icon for Mac</title>
   <link href="http://trentm.com/2010/03/alternative-komodo-doc-icon-for-mac.html"/>
   <updated>2010-03-24T00:00:00-07:00</updated>
   <id>http://trentm.com/2010/03/alternative-komodo-doc-icon-for-mac</id>
   <content type="html">&lt;p&gt;Sweet! &lt;a href=&quot;http://twitter.com/trishacupra&quot;&gt;Trisha Cupra&lt;/a&gt; &lt;a href=&quot;http://twitter.com/trishacupra/statuses/10972348563&quot;&gt;wasn't
happy&lt;/a&gt; with the current
Komodo Edit doc icon so she &lt;a href=&quot;http://skitch.com/trishacupra/n5tyy/dock&quot;&gt;made a (cool)
replacement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://img.skitch.com/20100324-tgcpb7xbkswjasb7u92sik4t2u.png&quot;&gt;&lt;/p&gt;



</content>
 </entry>
 
 <entry>
   <title>March VanPyZ meeting tomorrow at ActiveState</title>
   <link href="http://trentm.com/2010/03/march-vanpyz-meeting-tomorrow-at-activestate.html"/>
   <updated>2010-03-08T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/03/march-vanpyz-meeting-tomorrow-at-activestate</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://wiki.python.org/moin/VanPyZ#NextEvent&quot;&gt;March VanPyZ meeting&lt;/a&gt; will be hosted at ActiveState this coming Tuesday evening (&lt;em&gt;tomorrow!&lt;/em&gt;). &lt;strong&gt;I posted &lt;a href=&quot;http://blogs.activestate.com/2010/03/march-vancouver-python-user-group-vanpyz-tuesday-at-activestate/&quot;&gt;details on my work blog&lt;/a&gt;.&lt;/strong&gt; We'll be trying out a slightly new thing: Lightning talks, a short 5 minute talk on whatever &lt;a href=&quot;In&quot;&gt;^1&lt;/a&gt;. The Lightning Talk format works so well at PyCon. See my work blog post for more details. See you there.&lt;/p&gt;

&lt;p&gt;&quot;VanPyZ&quot; is the Vancouver Python user group.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PyCon 2010 wrap-ups</title>
   <link href="http://trentm.com/2010/03/pycon-2010-wrap-ups.html"/>
   <updated>2010-03-05T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/03/pycon-2010-wrap-ups</id>
   <content type="html">&lt;!--
&lt;div style=&quot;float: right; margin: 5px;&quot;&gt;
&lt;/div&gt;
  --&gt;


&lt;p&gt;&lt;img src=&quot;https://dl.dropbox.com/u/1301040/blog/2010/03/pycon2010.png&quot; class=&quot;right150&quot;/&gt;
I'm back from &lt;a href=&quot;http://us.pycon.org/2010/about/&quot;&gt;PyCon 2010&lt;/a&gt; in Atlanta
(actually I've been back for almost two weeks now, but I'm a lazy writer).
PyCon, as usual, was a great time. I wrote a long wrap-up on my work blog
here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.activestate.com/2010/03/pycon-2010-wrap-up/&quot;&gt;Trent's work PyCon 2010 wrap-up&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;A couple more personal additions...&lt;/p&gt;

&lt;!-- more --&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I announced &lt;a href=&quot;http://pythontranslationparty.appspot.com&quot;&gt;Python Translation
Party&lt;/a&gt; during PyCon --
&lt;a href=&quot;http://trentmick.blogspot.com/2010/02/python-translation-party.html&quot;&gt;here&lt;/a&gt;,
&lt;a href=&quot;http://trentmick.blogspot.com/2010/02/updated-python-translation-party-fewer.html&quot;&gt;here&lt;/a&gt;,
and in a Lightning Talk (video not up yet) -- to a resounding golf clap. :)
It is a small site devoted to translating Python code between 2 and 3 using
the lib2to3 and lib3to2 libraries until &quot;equilibrium&quot; is found. Mostly it
was a fun little play with AppEngine. However, it has also resulted in a
few bug reports to lib3to2 and lib2to3, which is cool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I had a good chat with &lt;a href=&quot;http://catherinedevlin.blogspot.com/&quot;&gt;Catherine
Devlin&lt;/a&gt; about her
&lt;a href=&quot;http://pypi.python.org/pypi/cmd2&quot;&gt;cmd2&lt;/a&gt; library, because it is so similar
in spirit to my &lt;a href=&quot;http://pypi.python.org/pypi/cmdln&quot;&gt;cmdln&lt;/a&gt; library. We
chatted a bit about whether a merging of the two libs would be reasonable.
No concrete plans: busy busy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It was great to hook up with people that I tend to only see at PyCon.
I look forward to PyCon next year.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>On fighting in hockey</title>
   <link href="http://trentm.com/2010/02/on-fighting-in-hockey.html"/>
   <updated>2010-02-25T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/02/on-fighting-in-hockey</id>
   <content type="html">&lt;p&gt;I love hockey. Obviously, growing up in Canada I'm biased, but: It is an active
and skilled sport which has &lt;em&gt;continuous play&lt;/em&gt; where baseball, curling and
football aren't or don't. A real gem of hockey is a breathtakingly long stretch
of all-out fast back and forth play. The build up to an at-bat in baseball
pales. A full-field punt return in football doesn't come close. Basketball,
soccer and rugby have continuous play, as well. Perhaps I prefer hockey because
of the speed you don't get in the others. Undoubhtedly part of it is the
general love for hockey in Canada. Perhaps part of it is the physicalness. And
here is where there is a problem -- at least in the NHL and the Canadian minor
leagues (WHL, OHL, et al) that I'm exposed to.&lt;/p&gt;

&lt;p&gt;By &quot;physicalness&quot; I mean cleanly knocking a player off the puck, a defenceman
rubbing a charging forward out on the boards, the battle for positioning in
front of the net. To many, including &lt;a href=&quot;http://en.wikipedia.org/wiki/Gary_Bettman&quot;&gt;Gary
Bettman&lt;/a&gt;, the physicalness includes
fighting. To Gary it is &lt;a href=&quot;http://www.usatoday.com/sports/hockey/nhl/2007-04-04-fight-rules_N.htm&quot;&gt;&quot;part of the
game&quot;&lt;/a&gt;.
That's crap. Somehow the Vancouver 2010 Olympic hockey games have provided
great spectacle without punches (in the games I've seen anyway). Somehow
soccer, basketball and football (heated games, all) maintain fan fanaticism
with fighting rules that all but remove it from the game.&lt;/p&gt;

&lt;p&gt;It is also sad. Sad because I have a two year old son. Why do I need to explain
the inconsistency to my son: hockey is a great game, except for the immaturity
of the fighting. An immaturity that is abetted and
&lt;a href=&quot;http://www.hockeyfights.com/&quot;&gt;celebrated&lt;/a&gt; at the top-level. Hockey fighting
isn't even comparable to boxing. It is ultimate fighting. It is something
children should be educated away from, not implicitly taught to emulate.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.cbc.ca/sports/hockey/story/2007/03/26/bettman-figting.html&quot;&gt;Gary on fighting&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;From a player safety standpoint, what happens in fighting is something we
need to look at just as we need to look at hits to the head,&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Certainly player safety is important, but this is a deflection.  Fighting in
hockey isn't about the safety issue, it is about the message to the immature --
from the 2 year-olds to the 30-something neanderthals you sometimes encouter in
recreational hockey. Fighting no more needs to be part of the game, than my son
needs to hit mommy when she takes away his cookie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>updated Python Translation Party: fewer booms</title>
   <link href="http://trentm.com/2010/02/updated-python-translation-party-fewer-booms.html"/>
   <updated>2010-02-22T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/02/updated-python-translation-party-fewer-booms</id>
   <content type="html">&lt;p&gt;I've &lt;strong&gt;updated &lt;a href=&quot;http://pythontranslationparty.appspot.com/&quot;&gt;Python Translation
Party&lt;/a&gt;&lt;/strong&gt; to recent versions of
&lt;a href=&quot;http://svn.python.org/projects/sandbox/trunk/2to3/lib2to3/&quot;&gt;&lt;code&gt;lib2to3&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;http://bitbucket.org/amentajo/lib3to2/&quot;&gt;&lt;code&gt;lib3to2&lt;/code&gt;&lt;/a&gt;. I spoke with Joe Amenta at
the &lt;a href=&quot;http://us.pycon.org/2010/conference/posters/accepted/&quot;&gt;PyCon 2010 poster
session&lt;/a&gt; (he had a
poster on his &lt;code&gt;lib3to2&lt;/code&gt; work) and he mentioned that the best thing I could do
with Python Translation Party for him was to update to the latest. :) Updating
to the latest is a &lt;em&gt;little&lt;/em&gt; difficult because App Engine runs Python 2.5.2 and
&lt;code&gt;lib3to2&lt;/code&gt; targets Python 2.7, so some small backporting was in order.&lt;/p&gt;

&lt;p&gt;At the least, the new update results in fewer &quot;booms&quot; -- i.e. when there is
some sort of unexpected error in translating either way. The &quot;boom&quot; section of
the &lt;a href=&quot;http://pythontranslationparty.appspot.com/crash/&quot;&gt;&quot;Crash other parties&quot;
page&lt;/a&gt; before:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropbox.com/u/1301040/blog/2010/02/party_crash_before.png&quot;/&gt;&lt;/p&gt;


&lt;p&gt;and after:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropbox.com/u/1301040/blog/2010/02/party_crash_after.png&quot;/&gt;&lt;/p&gt;


&lt;p&gt;One boom remains. I'll have to dig in to see if this is a lib3to2 bug, lib2to3
bug, or party bug.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python Translation Party</title>
   <link href="http://trentm.com/2010/02/python-translation-party.html"/>
   <updated>2010-02-18T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/02/python-translation-party</id>
   <content type="html">&lt;p&gt;I've &lt;strong&gt;updated &lt;a href=&quot;http://pythontranslationparty.appspot.com/&quot;&gt;Python Translation
Party&lt;/a&gt;&lt;/strong&gt; to recent versions of
&lt;a href=&quot;http://svn.python.org/projects/sandbox/trunk/2to3/lib2to3/&quot;&gt;&lt;code&gt;lib2to3&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;http://bitbucket.org/amentajo/lib3to2/&quot;&gt;&lt;code&gt;lib3to2&lt;/code&gt;&lt;/a&gt;. I spoke with Joe Amenta at
the &lt;a href=&quot;http://us.pycon.org/2010/conference/posters/accepted/&quot;&gt;PyCon 2010 poster
session&lt;/a&gt; (he had a
poster on his &lt;code&gt;lib3to2&lt;/code&gt; work) and he mentioned that the best thing I could do
with Python Translation Party for him was to update to the latest. :) Updating
to the latest is a &lt;em&gt;little&lt;/em&gt; difficult because App Engine runs Python 2.5.2 and
&lt;code&gt;lib3to2&lt;/code&gt; targets Python 2.7, so some small backporting was in order.&lt;/p&gt;

&lt;p&gt;At the least, the new update results in fewer &quot;booms&quot; -- i.e. when there is
some sort of unexpected error in translating either way. The &quot;boom&quot; section of
the &lt;a href=&quot;http://pythontranslationparty.appspot.com/crash/&quot;&gt;&quot;Crash other parties&quot;
page&lt;/a&gt; before:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropbox.com/u/1301040/blog/2010/02/party_crash_before.png&quot;/&gt;&lt;/p&gt;


&lt;p&gt;and after:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dl.dropbox.com/u/1301040/blog/2010/02/party_crash_after.png&quot;/&gt;&lt;/p&gt;


&lt;p&gt;One boom remains. I'll have to dig in to see if this is a lib3to2 bug, lib2to3
bug, or party bug.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>other Python VM's upcoming Python version plans</title>
   <link href="http://trentm.com/2010/02/other-python-vms-upcoming-python-version-plans.html"/>
   <updated>2010-02-18T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/02/other-python-vms-upcoming-python-version-plans</id>
   <content type="html">&lt;p&gt;Some quick notes about the coming plans by the &quot;other&quot; Python implementations
from today's Python Language Summit at PyCon 2010:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IronPython:

&lt;ul&gt;
&lt;li&gt;plan is to do Python 2.7 first, focus for this year&lt;/li&gt;
&lt;li&gt;python 3.2 for the end of next year hopefully&lt;/li&gt;
&lt;li&gt;other work on IDE stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pynie (i.e. Parrot) -- Allison Randall:

&lt;ul&gt;
&lt;li&gt;about 4 major features away from pure Python syntax (did dicts last
night)&lt;/li&gt;
&lt;li&gt;targetting py3k repo and test suite: should be on track for python 3.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jython:

&lt;ul&gt;
&lt;li&gt;plan to target 2.6 (b/c 2to3 depends on 2.6)&lt;/li&gt;
&lt;li&gt;temporarily skip 2.7 and target 3.x (probably 3.2)&lt;/li&gt;
&lt;li&gt;then if 3.x adoption isn't fully there, then go back and add Python 2.7&lt;/li&gt;
&lt;li&gt;will require JDK 2.7 for Python 3 support (b/c of new support for
dynamic languages)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PyPy (Holger):

&lt;ul&gt;
&lt;li&gt;plan is Benjamin will port to Python 2.7 in the summer&lt;/li&gt;
&lt;li&gt;only have slight deviations from CPython: idea is to merge back with
CPython so don't have deviations. Typcically 1 or 2 line changes in ~25
modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>February VanPyZ meeting at ActiveState on Tuesday</title>
   <link href="http://trentm.com/2010/01/february-vanpyz-meeting-at-activestate-on-tuesday.html"/>
   <updated>2010-01-30T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/01/february-vanpyz-meeting-at-activestate-on-tuesday</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://wiki.python.org/moin/VanPyZ#NextEvent&quot;&gt;February VanPyZ meeting&lt;/a&gt; will be hosted at ActiveState this coming Tuesday evening. &lt;strong&gt;I posted &lt;a href=&quot;http://blogs.activestate.com/2010/01/vanpyz-vancouver-python-user-group-tuesday-at-activestate/&quot;&gt;details on my work blog&lt;/a&gt;.&lt;/strong&gt; Myself and Michael Grünewald will be speaking on &lt;a href=&quot;http://code3.activestate.com&quot;&gt;recent ActiveState Code work&lt;/a&gt; and Brett Cannon will be speaking on his &lt;a href=&quot;http://code.google.com/p/importers/&quot;&gt;importers project&lt;/a&gt;.  See you there.&lt;/p&gt;

&lt;p&gt;&quot;VanPyZ&quot; is the Vancouver Python user group.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>nice I ♥ Komodo blog post</title>
   <link href="http://trentm.com/2010/01/nice-i-heart-komodo-blog-post.html"/>
   <updated>2010-01-14T00:00:00-08:00</updated>
   <id>http://trentm.com/2010/01/nice-i-heart-komodo-blog-post</id>
   <content type="html">&lt;p&gt;Nice post on Komodo (comparing to other editors): &lt;a href=&quot;http://bshensky.livejournal.com/19843.html&quot;&gt;Sayonara TextPad, Hello Komodo Edit&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;br /&gt;


&lt;blockquote&gt;So, who makes an FOSS-friendly editor for Windows with the best UI that leverages Scintilla?&lt;br /&gt;
&lt;br /&gt;
In the end, I settled on Komodo Edit.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
What clinched the deal was (a) the tour of the UI that really appeared to be thoughtfully considered by its designers, and (b) the design team which has its roots in support of Perl and other FOSS initiatives for the Windows platform.  What was clear to me was that the guys at ActiveState punched away in the same languages as I did, and clearly understood what would make a best of breed coding editor, then they just went ahead and built one!&lt;br /&gt;
&lt;/blockquote&gt;

</content>
 </entry>
 
 <entry>
   <title>VanPyZ meeting at ActiveState tomorrow (Tues)</title>
   <link href="http://trentm.com/2009/11/vanpyz-meeting-at-activestate-tomorrow-tues.html"/>
   <updated>2009-11-30T00:00:00-08:00</updated>
   <id>http://trentm.com/2009/11/vanpyz-meeting-at-activestate-tomorrow-tues</id>
   <content type="html">&lt;p&gt;We are hosting the &lt;a href=&quot;http://wiki.python.org/moin/VanPyZ#NextEvent&quot;&gt;December VanPyZ
meeting&lt;/a&gt; at my work
(ActiveState) tomorrow night. Details:&lt;/p&gt;

&lt;h2&gt;What&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Jamu Kakar&lt;/em&gt;: How to use &lt;a href=&quot;https://storm.canonical.com/&quot;&gt;Storm&lt;/a&gt; with a focus
on some common patterns to common problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Doug Latornell&lt;/em&gt;: PyYAML, flickrapi, and TkInter in a Desktop Image Display
App.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Where&lt;/h2&gt;

&lt;p&gt;ActiveState&lt;br/&gt;
1700 - 409 Granville Street
(SW corner of Granville and Hastings, &lt;a href=&quot;http://tinyurl.com/activestatemap&quot;&gt;map&lt;/a&gt;)&lt;br/&gt;
Buzzer# 1700&lt;/p&gt;

&lt;h2&gt;When&lt;/h2&gt;

&lt;p&gt;Tuesday, December 1st, at 7PM&lt;/p&gt;

&lt;p&gt;&quot;VanPyZ&quot; is the Vancouver Python user group.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Small Django patch to add full traceback for wrapper exception during template rendering</title>
   <link href="http://trentm.com/2009/11/small-django-patch-to-add-full-traceback.html"/>
   <updated>2009-11-17T00:00:00-08:00</updated>
   <id>http://trentm.com/2009/11/small-django-patch-to-add-full-traceback</id>
   <content type="html">&lt;p&gt;Here is a patch that I'm tending to apply to my Django (currently v1.1.1)
tree to give me a full traceback on the wrapped exception when getting an
exception during template processing. Without this patch you only get
the string summary of the underlying exception -- often far from enough info
to track down the actual bug. With this patch the result isn't that pretty (a full Python traceback as the string summary of the TemplateSyntaxError), but the info sure is helpful.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Index: debug.py
===================================================================
--- debug.py    (revision 11742)
+++ debug.py    (working copy)
@@ -68,20 +68,23 @@
 class DebugNodeList(NodeList):
     def render_node(self, node, context):
         try:
             result = node.render(context)
         except TemplateSyntaxError, e:
             if not hasattr(e, 'source'):
                 e.source = node.source
             raise
         except Exception, e:
             from sys import exc_info
+            #TODO?: grab the &quot;(at $file:$line)&quot; suffix code, tack that on, propose for Django core
+            import traceback
+            e = traceback.format_exc()
             wrapped = TemplateSyntaxError(u'Caught an exception while rendering: %s' % force_unicode(e, errors='replace'))
             wrapped.source = node.source
             wrapped.exc_info = exc_info()
             raise wrapped
         return result

 class DebugVariableNode(VariableNode):
     def render(self, context):
         try:
             output = force_unicode(self.filter_expression.resolve(context))
&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Using gmail for outbound email on Mac OS X</title>
   <link href="http://trentm.com/2009/11/using-gmail-for-outbound-email-on-mac-os-x.html"/>
   <updated>2009-11-11T00:00:00-08:00</updated>
   <id>http://trentm.com/2009/11/using-gmail-for-outbound-email-on-mac-os-x</id>
   <content type="html">&lt;p&gt;At work I run a number of cron jobs: web log analysis scripts, metrics
gathering, db migration for beta versions of some sites, etc. However, one
thing I've been unable to use effectively on my Mac machines is
the &lt;code&gt;MAILTO&lt;/code&gt; facility of cron. Given a foo.cron script like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
export MAILTO=me@example.com
export SUBJECT=&quot;do some daily stuff&quot;

...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;that is run like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0 0 * * *  $HOME/.../foo.cron &amp;gt; $HOME/var/log/do-some-daily-stuff.log
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;any output to stderr with be mailed to &quot;me@example.com&quot;. That is, it &lt;em&gt;would&lt;/em&gt; if outgoing email was setup for the currently running MTA (mail transfer agent) on that machine.&lt;/p&gt;

&lt;p&gt;On Mac OS X (since Leopard, I think) the default MTA is Postfix, and Postfix's terminology
for &quot;handle outbound email&quot; is to set the &quot;relayhost&quot;. &lt;a href=&quot;http://www.installationexperiences.com/2008/10/using-gmail-for-outbound-smtp-on-mac-os.html&quot;&gt;This
post&lt;/a&gt;
explains how to configure Postfix on Mac OS X 10.5 (Tiger). What follows is my
summary of the commands -- slightly different than the other post for clarity -- plus a
few thoughts.  Please read the other post for extra details.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Create `/etc/postfix/relay_password` with auth information like this:
#   smtp.gmail.com YOURNAME@gmail.com:YOURPASSWORD
$ sudo vi /etc/postfix/relay_password
$ cat /etc/postfix/relay_password
smtp.gmail.com YOURNAME@gmail.com:YOURPASSWORD

# Compile this to a Postfix lookup table...
$ sudo postmap /etc/postfix/relay_password

# ... and test it.
$ sudo postmap -q smtp.gmail.com /etc/postfix/relay_password
YOURNAME@gmail.com:YOURPASSWORD

# Download the Thawte root certificates from
# &amp;lt;https://www.verisign.com/support/roots.html&amp;gt; and setup
# a certificate for Postfix.
$ firefox https://www.verisign.com/support/roots.html
$ cd ~/Downloads
$ unzip -q roots.zip
$ sudo mkdir /etc/postfix/certs
$ sudo cp ~/Downloads/Thawte\ Root\ Certificates/Thawte\ Root\ Certificates/thawte\ Premium\ Server\ CA/Thawte\ Premium\ Server\ CA.pem /etc/postfix/certs
$ sudo c_rehash /etc/postfix/certs/
Doing /etc/postfix/certs/
Thawte Premium Server CA.pem =&amp;gt; d44d72e8.0

# Add the following lines to `/etc/postfix/main.cf`:
    relayhost = smtp.gmail.com:587
    # auth
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/relay_password
    smtp_sasl_security_options = noanonymous
    # tls
    smtp_tls_security_level = may
    smtp_tls_CApath = /etc/postfix/certs
    smtp_tls_session_cache_database = btree:/etc/postfix/smtp_scache
    smtp_tls_session_cache_timeout = 3600s
    smtp_tls_loglevel = 1
    tls_random_source = dev:/dev/urandom

# Re-start the Postfix service. (Note: You can also do the re-starting via
# `launchctl`.)
sudo postfix stop
sudo postfix start

# Now test this by sending email with `mail`:
$ /usr/bin/mail -s &quot;testing 1 2 3&quot; recipient@example.com
Howdy, from Postfix on your Mac!
.
EOT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now &lt;code&gt;recipient@example.com&lt;/code&gt; should have received your test email. If not
check &quot;/var/log/mail.log&quot;. Here is a successful log message:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Nov 10 23:33:26 mower postfix/smtp[56627]: ED1265BBA2A: to=&amp;lt;recipient@example.com&amp;gt;, relay=smtp.gmail.com[74.125.155.109]:587, delay=2.9, delays=0.44/0.94/0.56/0.96, dsn=2.0.0, status=sent (250 2.0.0 OK 1257924806 20sm930503pxi.15)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here is a &lt;strong&gt;failing&lt;/strong&gt; log message (in this case because I'd incorrectly mixed
using &quot;smtp.googlemail.com&quot; instead of &quot;smtp.gmail.com&quot;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Nov 10 21:32:14 mower postfix/smtp[55593]: C028D5BB6F8: to=&amp;lt;recipient@example.com&amp;gt;, relay=smtp.googlemail.com[74.125.155.16]:587, delay=0.33, delays=0.05/0.02/0.24/0.02, dsn=5.5.1, status=bounced (host smtp.googlemail.com[74.125.155.16] said: 530-5.5.1 Authentication Required. Learn more at                               530 5.5.1 http://mail.google.com/support/bin/answer.py?answer=14257 20sm817933pxi.3 (in reply to MAIL FROM command))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This setup requires putting your Gmail password in plaintext in
&lt;code&gt;/etc/postfix/relay_password&lt;/code&gt;, which I'm not too happy about. So I've created a
separate Gmail account with a different password to use for this.&lt;/p&gt;

&lt;p&gt;One of the beauties of this setup is that there is a record of all the emails
that have been sent this way in that Gmail account's &quot;Sent mail&quot;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>moving this blog to blogger</title>
   <link href="http://trentm.com/2009/10/moving-this-blog-to-blogger.html"/>
   <updated>2009-10-22T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/10/moving-this-blog-to-blogger</id>
   <content type="html">&lt;p&gt;Meta note: I'm moving this blog to blogger (&lt;a href=&quot;http://trentmick.blogspot.com/&quot;&gt;http://trentmick.blogspot.com/&lt;/a&gt;). Just test content there now. Hope to have that done in the next few days. If everything goes well, redirects should just make everything work.&lt;/p&gt;


&lt;br /&gt;


&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Mostly moved. Just working on redirects now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hannah Catherine Mick</title>
   <link href="http://trentm.com/2009/07/hannah-catherine-mick.html"/>
   <updated>2009-07-27T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/07/hannah-catherine-mick</id>
   <content type="html">&lt;div style=&quot;padding-bottom: 24px;&quot;&gt;
    &lt;a href=&quot;http://www.flickr.com/photos/trento/3687852294/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2662/3687852294_87913bda0e_m.jpg&quot; alt=&quot;&quot; style=&quot;border: solid 2px #333;&quot; /&gt;&lt;/a&gt;&lt;br&gt;
    &lt;a href=&quot;http://www.flickr.com/photos/trento/3687852294/&quot;&gt;Hannah Catherine Mick&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;I've been remiss in not blogging about my new daughter until now... tada! A lovely little girl. 7lb 4oz. Born on July 4th. All the appropriate bits. Everyone healthy. At times ominous hospital experience, but all good in the end. Ewan's (her almost 2 year old brother) latest thing is to kiss her on the forehead repeatedly. Big wet ones.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Pleasant things work better</title>
   <link href="http://trentm.com/2009/06/pleasant-things-work-better.html"/>
   <updated>2009-06-04T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/06/pleasant-things-work-better</id>
   <content type="html">&lt;p&gt;I watched &lt;a href=&quot;http://www.ted.com/index.php/talks/don_norman_on_design_and_emotion.html&quot;&gt;Don Norman's TED Talk &quot;3 ways good design makes you
happy&quot;&lt;/a&gt;
last night:&lt;/p&gt;

&lt;p&gt;
&lt;object width=&quot;446&quot; height=&quot;326&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;param name=&quot;bgColor&quot; value=&quot;#ffffff&quot;&gt;&lt;/param&gt; &lt;param name=&quot;flashvars&quot; value=&quot;vu=http://video.ted.com/talks/embed/DonNorman_2003-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DonNorman-2003.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=480&quot; /&gt;&lt;embed src=&quot;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&quot; pluginspace=&quot;http://www.macromedia.com/go/getflashplayer&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; bgColor=&quot;#ffffff&quot; width=&quot;446&quot; height=&quot;326&quot; allowFullScreen=&quot;true&quot; flashvars=&quot;vu=http://video.ted.com/talks/embed/DonNorman_2003-embed_high.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DonNorman-2003.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=480&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;


&lt;p&gt;This part of his talk really stuck out for me (transcription errors mine):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I really had the feeling that pleasant things work better and that never made
any sense to me, until I finally figured it out. Look:&lt;/p&gt;

&lt;p&gt;I'm gonna put a plank on the ground. So imagine I have a plank about 2' wide
and 30' long. And I'm going to walk on it. See I can walk on it without
looking, and go back and forth, and I can jump up and down. No problem. Now I'm
going to put the plank 300' feet in the air... and I'm not going to go near it,
thank you. Intense fear paralyzes you. It actually affects the way your brain
works.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;If you're happy, things work better because you're more creative. You get a
little problem, you say &amp;#8220;Ah, I'll figure it out. No big deal.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Don Norman's ideas may be more relevant to industrial design, but I think this
can safely be applied to software design (more my domain). Don points to how
being fun and beautiful can make something better -- not just seem better, but
&lt;em&gt;work&lt;/em&gt; better. That's an important point in the common trade off in software
development between spending more time on features or bugs vs. spending some
time on making a UI &quot;pretty&quot;. Occassionally in work debates -- whether on
&lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;Komodo&lt;/a&gt; or on some of the
&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt; websites I'm involved in -- that
&quot;pretty&quot; is said dismissively. I'm happy to have Don Norman's talk as a debate
point.&lt;/p&gt;

&lt;h1&gt;Miro &lt;img src=&quot;http://dl.getdropbox.com/u/1301040/blog/2009/06/miro2.png&quot; alt=&quot;miro&quot; title=&quot;miro&quot; width=&quot;94&quot; height=&quot;78&quot; class=&quot;right100&quot;&gt;&lt;/h1&gt;

&lt;p&gt;BTW, thanks to
&lt;a href=&quot;http://trentm.com/blog/archives/2009/04/24/re-installing-mac-os-x-software-i-use/#comment-2533&quot;&gt;stephen&lt;/a&gt;.
A few weeks ago I reinstalled my Mac book and
&lt;a href=&quot;http://trentm.com/blog/archives/2009/04/24/re-installing-mac-os-x-software-i-use/&quot;&gt;posted&lt;/a&gt;
a list of the software I use. Stephen suggested I add
&lt;a href=&quot;http://www.getmiro.com/&quot;&gt;Miro&lt;/a&gt; to that list. Cue many evenings of watching TED
talks (including the above talk) and other programs.&lt;/p&gt;

&lt;p&gt;After installing Miro, visit &lt;a href=&quot;https://miroguide.com/feeds/2014&quot;&gt;https://miroguide.com/feeds/2014&lt;/a&gt; to get the latest TED Talks.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to install MySQL-python 1.2.3c1 on Mac OS X</title>
   <link href="http://trentm.com/2009/05/how-to-install-mysql-python-123c1-on-mac-os-x.html"/>
   <updated>2009-05-26T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/05/how-to-install-mysql-python-123c1-on-mac-os-x</id>
   <content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;


&lt;p&gt;Just a quick note on getting MySQL-python (aka &lt;code&gt;import MySQLdb&lt;/code&gt;) 1.2.3c1 (the &lt;a href=&quot;http://pypi.python.org/pypi/MySQL-python/&quot;&gt;current latest version&lt;/a&gt;) to build and install on Mac OS X, because I hit something that I didn't see mentioned in a number of similar posts.&lt;/p&gt;


&lt;p&gt;Here are some links that discuss getting MySQL-python to build on Mac OS X:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.keningle.com/?p=11&quot;&gt;MySQL-Python and Apple OSX 10.5 (Leopard)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://antoniocangiano.com/2007/12/22/how-to-install-django-with-mysql-on-mac-os-x/&quot;&gt;How to install Django with MySQL on Mac OS X&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://friendlybit.com/tutorial/install-mysql-python-on-mac-os-x-leopard/&quot;&gt;Install MySQL-python on Mac OS X (leopard)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What follows are the steps (slightly different) that I needed to get MySQL-python to install.&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;How to install MySQL-python on Mac OS X&lt;/h2&gt;


&lt;ol&gt;&lt;li&gt;&lt;p&gt;My Setup&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Mac OS X 10.5/Intel
Xcode 3.0
ActivePython 2.6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Though I am using ActivePython, the issues should be the same for a Python from python.org.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download and install MySQL 'pkg' format install for Mac OS X. For me this was the &quot;Mac OS X 10.5 x86&quot; package:  &lt;code&gt;mysql-5.1.34-osx10.5-x86.dmg&lt;/code&gt; The following might work:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.34-osx10.5-x86.dmg/from/http://mirror.csclub.uwaterloo.ca/mysql/
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download the &lt;a href=&quot;http://pypi.python.org/pypi/MySQL-python/&quot;&gt;latest MySQL-python package&lt;/a&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;cd /tmp
wget http://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.3c1.tar.gz
tar xzf MySQL-python-1.2.3c1.tar.gz
cd MySQL-python-1.2.3c1
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build it.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# ensure mysql_config is on your PATH
export PATH=$PATH:/usr/local/mysql/bin
python setup.py build
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For me this failed as follows:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;gcc -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -bundle -undefined dynamic_lookup build/temp.macosx-10.3-i386-2.6/_mysql.o -L/usr/local/mysql/lib -lmysqlclient_r -lz -lm -lmygcc -o build/lib.macosx-10.3-i386-2.6/_mysql.so
ld: warning in build/temp.macosx-10.3-i386-2.6/_mysql.o, file is not of required architecture
ld: warning in /usr/local/mysql/lib/libmysqlclient_r.dylib, file is not of required architecture
ld: warning in /usr/local/mysql/lib/libmygcc.a, file is not of required architecture
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I didn't see this mentioned in others' post on this. I suspect they may not have hit this because they were building against the system Python (in /usr/bin/python, /System/Library/Frameworks/Python.framework/Versions/Current) which may have some tweaks to just handle this.&lt;/p&gt;&lt;p&gt;In any case the problem here is that my Python install (ActivePython 2.6) is a universal build (including i386 and ppc). By default distutils (the library behind &lt;code&gt;python setup.py build&lt;/code&gt;) tries to build binary Python extensions for all the same architectures. However, the MySQL you just installed is only for x86 so it borks.&lt;/p&gt;&lt;p&gt;The fix is to use the ARCHFLAGS environment variable that distutils will pick up on to only build for your architecture:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ARCHFLAGS=`arch` python setup.py build
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install it.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sudo python setup.py install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 5.1.3 released</title>
   <link href="http://trentm.com/2009/04/komodo-513-released.html"/>
   <updated>2009-04-29T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/04/komodo-513-released</id>
   <content type="html">&lt;p&gt;We (&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;) released Komodo 5.1.3 today. Get it here:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo IDE: &lt;a href=&quot;http://www.activestate.com/komodo/downloads/&quot;&gt;http://www.activestate.com/komodo/downloads/&lt;/a&gt;&lt;/div&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo Edit: &lt;a href=&quot;http://www.activestate.com/komodo_edit/downloads/&quot;&gt;http://www.activestate.com/komodo_edit/downloads/&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Or, if you are currently running any previous Komodo 5, click &quot;Help &amp;gt; Check for Updates...&quot;. This is a bug fix release and is recommended for all users. See below for details.&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Bug fixes&lt;/h2&gt;


&lt;p&gt;Some bug fix highlights:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;&lt;p&gt;The &lt;strong&gt;fast open&lt;/strong&gt; (aka &quot;Go to File&quot;) dialog had a few improvements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Tab now autocompletes&lt;/strong&gt; instead of moving to the next match. This makes it much more natural (if you're used to the shell) to navigate directories in the dialog. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82677&quot;&gt;Bug 82677&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removed duplicates&lt;/strong&gt; in &quot;Go to File&quot; list. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82705&quot;&gt;Bug 82705&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Current search is aborted when the &quot;Go to File&quot; dialog is closed. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82529&quot;&gt;Bug 82529&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;Ctrl+n&lt;/code&gt; &amp;amp; &lt;code&gt;Ctrl+p&lt;/code&gt; keybindings for down/up navigation for Emacs-heads. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82678&quot;&gt;Bug 82678&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo's &lt;strong&gt;Vi Emulation&lt;/strong&gt; is ever improving:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Comment/uncomment working correctly in visual line mode. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82369&quot;&gt;Bug 82369&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed visual line selection mode indent/dedent problems. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82368&quot;&gt;Bug 82368&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;cc&lt;/code&gt; command now maintains line indentation. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82707&quot;&gt;Bug 82707&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There have been a number of improvements for using Komodo's &lt;strong&gt;color schemes&lt;/strong&gt; and &lt;strong&gt;package (&lt;code&gt;.kpz&lt;/code&gt;) files&lt;/strong&gt;. More on that in a separate post later this week.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One of the side-effects of the work for color schemes is the addition of&lt;/p&gt;&lt;pre&gt;&lt;code&gt; &amp;lt;notificationbox id=&quot;komodo-notificationbox&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;in &lt;code&gt;komodo.xul&lt;/code&gt;. This may be of interest to &lt;strong&gt;Komodo extension authors&lt;/strong&gt; that would like to use a &lt;a href=&quot;https://developer.mozilla.org/En/XUL:notificationbox&quot;&gt;notificationbox&lt;/a&gt; instead of alert dialogs or other mechanisms to give feedback to users.&lt;/p&gt;&lt;p&gt;Eventually I think Komodo's editor tabs should also grow a notification box -- as Firefox has one for each browser tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Again, goofy from &lt;a href=&quot;http://www.babelzilla.org/&quot;&gt;babelzilla&lt;/a&gt; has been diligently providing &lt;strong&gt;localization patches&lt;/strong&gt; for Komodo: &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82580&quot;&gt;bug 82580&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82819&quot;&gt;bug 82819&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82821&quot;&gt;bug 82821&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82822&quot;&gt;bug 82822&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82824&quot;&gt;bug 82824&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82825&quot;&gt;bug 82825&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A bug where &lt;strong&gt;terminating run commands&lt;/strong&gt; on Windows would not always work was fixed. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82655&quot;&gt;Bug 82655&lt;/a&gt;) The right answer for being able to kill a process and its child processes on Windows is to use a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms682409(VS.85).aspx&quot;&gt;Windows Job object&lt;/a&gt;. Answer courtesy of &lt;a href=&quot;http://benjamin.smedbergs.us/blog/2006-12-11/killableprocesspy/&quot;&gt;Benjamin Smedberg's killableprocess.py&lt;/a&gt;. Komodo now uses code based on this. I'd like to find the time to get something based on this into Python's core subprocess module.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;See the &lt;a href=&quot;http://docs.activestate.com/komodo/5.1/releases/ide.html&quot;&gt;Release Notes&lt;/a&gt; for a full list of changes.&lt;/p&gt;


&lt;h2&gt;Komodo extensions&lt;/h2&gt;


&lt;p&gt;For those who haven't noticed, &lt;a href=&quot;http://twitter.com/StanAngeloff&quot;&gt;Stan Angeloff&lt;/a&gt; has been doing some spectacular work in his &lt;a href=&quot;http://community.activestate.com/xpi/html-toolkit&quot;&gt;&lt;strong&gt;HTML Toolkit&lt;/strong&gt;&lt;/a&gt; and &lt;a href=&quot;http://community.activestate.com/xpi/tab-abbreviations&quot;&gt;&lt;strong&gt;Tab Abbreviations&lt;/strong&gt;&lt;/a&gt; Komodo extensions.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://insaned.googlepages.com/htmltoolkit_wrap_block_in_tag.png&quot; alt=&quot;HTML Toolkit screenshot&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://insaned.googlepages.com/htmltoolkit_css_image_preview.png&quot; alt=&quot;HTML Toolkit screenshot&quot; /&gt;&lt;/p&gt;


&lt;h2&gt;What about 5.1.2?&lt;/h2&gt;


&lt;p&gt;There was a &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82953&quot;&gt;bug&lt;/a&gt; in the Komodo 5.1.2 release from yesterday that broke attempts to terminate processes on Windows. This most commonly could affect debugging in Komodo IDE.&lt;/p&gt;


&lt;h2&gt;General information&lt;/h2&gt;


&lt;p&gt;Komodo IDE 5.1 is a free upgrade for Komodo IDE 5.x license holders. Your license entitles you to run Komodo IDE on any of the platforms we support (Windows, Mac OS X and Linux). Komodo Edit 5.1 is, as ever, open-source and free.&lt;/p&gt;


&lt;table class=&quot;attrlist&quot;&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://www.activestate.com/komodo/downloads/&quot;&gt;Komodo IDE&lt;/a&gt; | &lt;a href=&quot;http://www.activestate.com/komodo_edit/downloads/&quot;&gt;Komodo Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-discuss&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>re-installing Mac OS X: software I use</title>
   <link href="http://trentm.com/2009/04/re-installing-mac-os-x-software-i-use.html"/>
   <updated>2009-04-24T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/04/re-installing-mac-os-x-software-i-use</id>
   <content type="html">&lt;p&gt;I recently wiped my Mac laptop to upgrade to 10.5. (Finally! At least I installed Leopard before Snow Leopard comes out.) This post is mainly for me to list all the stuff I install -- a list I generated when scouring my machine before wiping it.&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;~/bin/
    wget
    p4
darwin ports (/opt/local)
ActivePython (all versions)
ActivePerl (/usr/local/ActivePerl-*...)
MySQL (/usr/local/mysql)
XCode (from Leopard CD, dunno if need more recent one)
Growl
/Applications
    Skype
    Google Notifier
    Caffeine
    Firefox
    Adium
    Colloquy
    Transmission
    PDK
    Komodo
    Pixelmator.app
    Snapz Pro X
    Thunderbird
    TweetDeck^H Twitterific
    UnRarX
    VLC
    ffmpegX
    iTerm
    iTunes
    iPhoto
    ImageMixer 3 for Panasonic (for getting video off my video camera)
    CanoScan Toolbox X (for my Canon LiDE 25 scanner,  http://software.canon-europe.com/software/0028265.asp, driver: http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&amp;amp;tabact=DownloadDetailTabAct&amp;amp;fcategoryid=351&amp;amp;modelid=11463)
Subversion (Leopard has 1.4.4, want 1.6?)
Mercurial
Git   [TODO]
System Preferences:
    Growl
    MySQL
    SlimServer (now called SqueezeCenter)  [TODO]
    Perian (http://perian.org/, teaches QuickTime about more formats, TODO)
&lt;/code&gt;&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo: about.com's Webdesign pick of the week</title>
   <link href="http://trentm.com/2009/04/komodo-aboutcoms-webdesign-pick-of-the-week.html"/>
   <updated>2009-04-06T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/04/komodo-aboutcoms-webdesign-pick-of-the-week</id>
   <content type="html">&lt;p&gt;Nice to see &lt;a href=&quot;http://www.activestate.com/komodo_edit/&quot;&gt;Komodo Edit&lt;/a&gt; get &lt;a href=&quot;http://webdesign.about.com/b/2009/04/05/web-design-software-pick-of-the-week-komodo-edit.htm&quot;&gt;about.com's Webdesign/HTML blog's pick of the week&lt;/a&gt;:&lt;/p&gt;




&lt;blockquote&gt;This week I took a look at the latest version of my favorite XML and HTML text editor: Komodo Edit. The new version adds in some nice features like history and search highlighting. I still find this editor to be the &lt;a href=&quot;http://webdesign.about.com/od/htmleditorreviews/gr/komodoedit5-1.htm&quot;&gt;best free XML and text HTML editor&lt;/a&gt; you can get for any operating system. I use it every day.&lt;/blockquote&gt;




&lt;p&gt;Those interested should also look at &lt;a href=&quot;http://www.activestate.com/komodo_edit/comparison/&quot;&gt;Komodo IDE&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 5.1.1: fixes, path mode in Fast Open dialog, Perl::Critic integration</title>
   <link href="http://trentm.com/2009/04/komodo-511-fixes-path-mode-in-fast-open-dialog-perlcritic-integration.html"/>
   <updated>2009-04-02T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/04/komodo-511-fixes-path-mode-in-fast-open-dialog-perlcritic-integration</id>
   <content type="html">&lt;p&gt;We (&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;) released Komodo 5.1.1 today. Get it here:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo IDE: &lt;a href=&quot;http://www.activestate.com/komodo/downloads/&quot;&gt;http://www.activestate.com/komodo/downloads/&lt;/a&gt;&lt;/div&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo Edit: &lt;a href=&quot;http://www.activestate.com/komodo_edit/downloads/&quot;&gt;http://www.activestate.com/komodo_edit/downloads/&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Or, if you are currently running Komodo 5.1.0, click &quot;Help &amp;gt; Check for Updates...&quot;. This is a bug fix release and is recommended for all users. See below for details.&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Bug fixes&lt;/h2&gt;


&lt;p&gt;Two important bug fixes in this release are:&lt;/p&gt;


&lt;ol&gt;&lt;li&gt;&lt;p&gt;Fixed problem in re-generating the variable tabs in the debugger (Komodo IDE) which caused slowdowns and hangs when debugger was run repeatedly. (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82518&quot;&gt;Bug 82518&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82542&quot;&gt;bug 82542&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82426&quot;&gt;bug 82426&lt;/a&gt;, &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82557&quot;&gt;bug 82557&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed a bug where closing a tab would switch to the wrong remaining tab causing potential problems, such as the Komodo window titlebar no longer updating properly (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=82474&quot;&gt;bug 82474&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;See the &lt;a href=&quot;http://docs.activestate.com/komodo/5.1/releases/ide.html&quot;&gt;Release Notes&lt;/a&gt; for a full list of changes.&lt;/p&gt;


&lt;h2&gt;A couple new features&lt;/h2&gt;


&lt;p&gt;This release also include two tweaks to existing features that didn't quite make the final 5.1.0 release.&lt;/p&gt;


&lt;h3&gt;Fast Open dialog&lt;/h3&gt;


&lt;p&gt;The Komodo 5.1.0 release included &lt;a href=&quot;http://trentmick.blogspot.com/2009/03/komodo-51-released-fast-open-history_8617.html&quot;&gt;the new &quot;Fast Open&quot; dialog&lt;/a&gt;. In Komodo 5.1.1 &lt;strong&gt;the fast open dialog now has path mode support&lt;/strong&gt;. This means that you can now use the fast open dialog for opening:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;an absolute path: &lt;strong&gt;&lt;code&gt;/etc/httpd/httpd.conf&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a relative path (where &lt;em&gt;relative&lt;/em&gt; is relative to the directory of &lt;strong&gt;every tab you have open in your Komodo window&lt;/strong&gt;): &lt;strong&gt;&lt;code&gt;../foo.py&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a path under your HOME directory: &lt;strong&gt;&lt;code&gt;~/wrk/coolstuff.rb&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Note that the latter also works on Windows if you manually set a HOME environment variable to whereever you tend to put your files. For example, on Windows XP, I certainly don't use &quot;&lt;code&gt;C:\Documents and Settings\trentm&lt;/code&gt;&quot; as my main working directory.&lt;/p&gt;


&lt;h3&gt;PerlCritic&lt;/h3&gt;


&lt;p&gt;Perl users of Komodo can now easily get &lt;strong&gt;syntax checking results from &lt;a href=&quot;http://perlcritic.tigris.org/&quot;&gt;Perl::Critic&lt;/a&gt;&lt;/strong&gt; -- &quot;a static source code analyzer based (mostly) on Damian Conway's book 'Perl Best Practices.'&quot;. To setup you just need the &quot;Perl-Critic&quot; and &quot;criticism&quot; Perl modules installed. With ActivePerl you can do this:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;ppm install Perl-Critic
ppm install criticism
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Then select the warning level in Komodo's &quot;Perl&quot; preferences panel. This screenshot shows the result of &quot;Brutal&quot; warnings on &lt;a href=&quot;http://search.cpan.org/~gaas/libwww-perl-5.805/lib/LWP/UserAgent.pm&quot;&gt;Gisle Aas's LWP::UserAgent&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3408034818/&quot; title=&quot;Perl::Critic integration in Komodo 5.1.1 by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3630/3408034818_f59a979cdc_o.png&quot; width=&quot;637&quot; height=&quot;440&quot; alt=&quot;Perl::Critic integration in Komodo 5.1.1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Users interested in more in-depth analysis and integration with Perl::Critic should take a look at &lt;a href=&quot;http://www.activestate.com/perl_dev_kit/whats_new/&quot;&gt;ActiveState's Perl Dev Kit 8.0&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;General information&lt;/h2&gt;


&lt;p&gt;Komodo IDE 5.1 is a free upgrade for Komodo IDE 5.x license holders. Your license entitles you to run Komodo IDE on any of the platforms we support (Windows, Mac OS X and Linux). Komodo Edit 5.1 is, as ever, open-source and free.&lt;/p&gt;


&lt;table class=&quot;attrlist&quot;&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://www.activestate.com/komodo/downloads/&quot;&gt;Komodo IDE&lt;/a&gt; | &lt;a href=&quot;http://www.activestate.com/komodo_edit/downloads/&quot;&gt;Komodo Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-discuss&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

</content>
 </entry>
 
 <entry>
   <title>unladden swallow: a (potentially *much*) faster CPython</title>
   <link href="http://trentm.com/2009/03/unladden-swallow-a-potentially-much-faster-cpython.html"/>
   <updated>2009-03-26T00:00:00-07:00</updated>
   <id>http://trentm.com/2009/03/unladden-swallow-a-potentially-much-faster-cpython</id>
   <content type="html">&lt;p&gt;Discussed a bit at the &lt;a href=&quot;http://us.pycon.org/2009/about/summits/language/&quot;&gt;Python Language Summit&lt;/a&gt; at &lt;a href=&quot;http://us.python.org/&quot;&gt;PyCon&lt;/a&gt; this morning: &lt;a href=&quot;http://code.google.com/p/unladen-swallow/&quot;&gt;&lt;strong&gt;unladen-swallow&lt;/strong&gt;&lt;/a&gt; is a Google project to do a lot of performance work on CPython's VM. &lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Currently have about 30% speed up.&lt;/li&gt;
&lt;li&gt;Currently for Python 2 (2.4, I think).&lt;/li&gt;
&lt;li&gt;Currently focused on Linux and Python 3, but committed to get patches back to the core (which implies Python 3 support). &quot;This is a branch, not a fork.&quot;&lt;/li&gt;
&lt;li&gt;Currently in &lt;em&gt;use&lt;/em&gt; on Youtube (where most of the frontend is Python).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;They are shooting for a &lt;strong&gt;5x&lt;/strong&gt; speedup.  From the &lt;a href=&quot;http://code.google.com/p/unladen-swallow/wiki/ProjectPlan&quot;&gt;ProjectPlan&lt;/a&gt;:&lt;/p&gt;




&lt;blockquote&gt;Our long-term proposal is to replace CPython's custom virtual machine with a JIT built on top of LLVM, while leaving the rest of the Python runtime relatively intact. We have observed that Python applications spend a large portion of their time in the main eval loop. In particular, even relatively minor changes to VM components such as opcode dispatch have a significant effect on Python application performance. We believe that compiling Python to machine code via LLVM's JIT engine will deliver large performance benefits.&lt;/blockquote&gt;




&lt;p&gt;Jesse has a &lt;a href=&quot;http://jessenoller.com/2009/03/26/pycon-unladen-swallow/&quot;&gt;good write-up&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 5.1 released (fast open, history, hyperlinks, etc.)</title>
   <link href="http://trentm.com/2009/03/komodo-51-released-fast-open-history-hyperlinks-etc.html"/>
   <updated>2009-03-23T22:41:00-07:00</updated>
   <id>http://trentm.com/2009/03/komodo-51-released-fast-open-history-hyperlinks-etc</id>
   <content type="html">&lt;p&gt;We (&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;) released Komodo 5.1 today! Get it here:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo IDE: &lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;http://www.activestate.com/komodo/&lt;/a&gt;&lt;/div&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;Komodo Edit: &lt;a href=&quot;http://www.activestate.com/komodo_edit/&quot;&gt;http://www.activestate.com/komodo_edit/&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Komodo IDE 5.1 is a free upgrade for Komodo IDE 5.x license holders. Your license entitles you to run Komodo IDE on any of the platforms we support (Windows, Mac OS X and Linux). Komodo Edit 5.1 is, as ever, open-source and free.&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Fast Open dialog&lt;/h2&gt;


&lt;p&gt;On to the features. A goodie in the Komodo 5.1.0 release that wasn't in the previous releases is the new fast-open (a.k.a. &quot;Go to File&quot;) dialog.&lt;/p&gt;


&lt;p&gt;&lt;object width=&quot;800&quot; height=&quot;600&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=3825622&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; /&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=3825622&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;a href=&quot;http://vimeo.com/3825622&quot;&gt;Fast open in Komodo 5.1&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user1355810&quot;&gt;Trent Mick&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;The fast-open dialog is a quicker way to open files for editing. Komodo needed it: the system native File Open dialogs can be a pain (ever try to go up one directory in the Mac OS X File Open dialog?), poking around in a Komodo project tree to find just the file you want is slow. Worse than slow, it is distracting. With the fast-open dialog you typically just need to type a few characters in the base name of the file you want to open and hit &lt;code&gt;&amp;lt;enter&amp;gt;&lt;/code&gt; to open the file.&lt;/p&gt;


&lt;p&gt;The fast-open dialog makes it easy to:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;&lt;strong&gt;switch to open tabs&lt;/strong&gt; (especially useful if you have many many files open in Komodo),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;open recent files&lt;/strong&gt; (tieing in with Komodo 5.1's new &lt;a href=&quot;http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html&quot;&gt;History feature&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;open files in the current directories&lt;/strong&gt; (i.e. the directories of currently open files), and&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;open files in your current project&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The filter textbox supports multiple tokens, so while a search for '&lt;code&gt;mark&lt;/code&gt;' with match:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;Markdown.pl
markdown2.py
markdown.php
markdown.py
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;a search for '&lt;code&gt;mark py&lt;/code&gt;' will match:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;markdown2.py
markdown.py
&lt;/code&gt;&lt;/pre&gt;


&lt;h2&gt;Re-open recently closed tabs&lt;/h2&gt;


&lt;p&gt;A feature I love in Firefox is &lt;code&gt;Ctrl+Shift+T&lt;/code&gt; (&lt;code&gt;Cmd+Shift+T&lt;/code&gt; on the Mac) to re-open the most recently closed tab. Komodo now has that.&lt;/p&gt;


&lt;h2&gt;Hyperlinks, Find highlighting, History&lt;/h2&gt;


&lt;p&gt;On the road to this Komodo 5.1 release we introduced  &lt;a href=&quot;http://trentmick.blogspot.com/2009/03/hyperlinks-in-komodo-510b1_1005.html&quot;&gt;hyperlinks in Komodo 5.1b1&lt;/a&gt;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352004518/&quot; title=&quot;Komodo hyperlink colors by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3468/3352004518_c2eaeacf12_o.png&quot; width=&quot;750&quot; height=&quot;409&quot; alt=&quot;Komodo hyperlink colors&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html&quot;&gt;find highlighting in Komodo 5.1a2&lt;/a&gt;:&lt;/p&gt;


&lt;p&gt;&lt;object width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=3387846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; /&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=3387846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html&quot;&gt;editor history in Komodo 5.1a1&lt;/a&gt;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3253669957/&quot; title=&quot;screenshot of Komodo 5.1's history feature&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3009/3253669957_903874fa5c_o.jpg&quot; width=&quot;570&quot; height=&quot;448&quot; alt=&quot;screenshot of Komodo 5.1's history feature&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;and support for a new platform -- &lt;strong&gt;Linux/x86_64&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Along with &lt;strong&gt;dozens of bug fixes&lt;/strong&gt;, XML/HTML tag highlighting and &lt;strong&gt;jump to matching tag&lt;/strong&gt;, upgrades to our xdebug builds for &lt;strong&gt;PHP 5.3 debugging&lt;/strong&gt;, and regular &lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/&quot;&gt;&lt;strong&gt;nightly builds&lt;/strong&gt; for Komodo IDE and Edit&lt;/a&gt;... this is a good release. Try it out:&lt;/p&gt;


&lt;table class=&quot;attrlist&quot;&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://www.activestate.com/komodo/downloads/&quot;&gt;Komodo IDE&lt;/a&gt; | &lt;a href=&quot;http://www.activestate.com/komodo_edit/downloads/&quot;&gt;Komodo Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-discuss&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;&lt;/enter&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>PyCon 2009</title>
   <link href="http://trentm.com/2009/03/pycon-2009.html"/>
   <updated>2009-03-23T06:55:00-07:00</updated>
   <id>http://trentm.com/2009/03/pycon-2009</id>
   <content type="html">&lt;div class=&quot;left&quot;&gt;
&lt;a href=&quot;http://us.pycon.org/&quot;&gt;&lt;img src=&quot;http://us.pycon.org/media/2009/public/pycon2009-horizontal-large-215x135.png&quot; alt=&quot;PyCon 2009: Chicago&quot;/&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;I'll be attending &lt;a href=&quot;http://us.pycon.org/&quot;&gt;PyCon&lt;/a&gt; this year. It's been a few years since I've attended and &lt;strong&gt;wow&lt;/strong&gt; has it ever grown: &lt;a href=&quot;http://us.pycon.org/2009/conference/keynotes/&quot;&gt;11 keynotes&lt;/a&gt;, &lt;a href=&quot;http://us.pycon.org/2009/conference/talks/&quot;&gt;120 talks&lt;/a&gt;, &lt;a href=&quot;http://us.pycon.org/2009/conference/lightning/&quot;&gt;5 hours of lightning talks&lt;/a&gt;, the &lt;a href=&quot;http://us.pycon.org/2009/about/summits/language/&quot;&gt;Python Language Summit&lt;/a&gt;, preceded by tutorial days and followed by &lt;a href=&quot;http://us.pycon.org/2009/sprints/&quot;&gt;days of sprints&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I'm looking forward to diving back into pure Python for a little while -- something I've had difficulty finding the time for with my work on &lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;Komodo&lt;/a&gt;. I'm especially looking forward to the &quot;Package distribution &amp;amp; installation&quot; session at the Python Language Summit, not the least of which is because &lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt; is starting to devote more resources to this area. My newest co-worker &lt;a href=&quot;http://twitter.com/nearfar&quot;&gt;Sridhar&lt;/a&gt; &lt;a href=&quot;http://srid.nearfar.org/SridharRatnakumar&quot;&gt;Ratnakumar&lt;/a&gt; is currently looking at how ActiveState can help here.&lt;/p&gt;




&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Pixelmator</title>
   <link href="http://trentm.com/2009/03/pixelmator.html"/>
   <updated>2009-03-13T11:53:00-07:00</updated>
   <id>http://trentm.com/2009/03/pixelmator</id>
   <content type="html">&lt;p&gt;In the bright pre-recession days of 2008 I, and a bunch of my co-workers, bought into &lt;a href=&quot;http://www.macheist.com/&quot;&gt;MacHeist&lt;/a&gt;: get a bunch of Mac OS X apps for about $30. One of those apps was &lt;a href=&quot;http://www.pixelmator.com/&quot;&gt;Pixelmator&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352143593/&quot; title=&quot;Pixelmator icon by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3653/3352143593_0a64f552ea_o.png&quot; width=&quot;256&quot; height=&quot;137&quot; alt=&quot;Pixelmator icon&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pixelmator is basically a lite Photoshop-clone for Mac OS X. Some thoughts on it:&lt;/p&gt;


&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;It's sexy.&lt;/strong&gt; Popup-notices when undoing actions. Cute tool pallete (especially like the eye-dropper).&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352968676/&quot; title=&quot;Pixelmator eyedropper tool by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3446/3352968676_cb38b2bcda_o.png&quot; width=&quot;408&quot; height=&quot;502&quot; alt=&quot;Pixelmator eyedropper tool&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It works.&lt;/strong&gt; It is fullfilling my needs for recent work (cutting up screenshots, the odd tweak for images in &lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;Komodo&lt;/a&gt;. I'm not a graphics guy but I've played enough with Photoshop to suspect that the &quot;lite&quot; I mention above is a good thing for me. &lt;sup class=&quot;footnote-ref&quot; id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If it helps others, here is my &lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2009/03/hyperlink_color.pxm&quot;&gt;hyperlink_color.pxm&lt;/a&gt; Pixelmator file for the &quot;Komodo color hyperlinks&quot; screenshot in my &lt;a href=&quot;http://trentmick.blogspot.com/2009/03/hyperlinks-in-komodo-510b1_1005.html&quot;&gt;previous blog post&lt;/a&gt;. &lt;a href=&quot;http://www.designworkplan.com/signage-symbols/free-vector-arrows.htm&quot;&gt;This set of free arrow images&lt;/a&gt; is a great resource for slapping arrows into your screenshots.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The version that was current when I bought it was a little crashy, but at some point between then and now them seemed to have fixed whatever crashes I was hitting. This is the best $30 I've spent on the web.&lt;/p&gt;


&lt;div class=&quot;footnotes&quot;&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt; &lt;p&gt;I'd be interested to hear from anyone who has real experience with Photoshop and Pixelmator if it actually &lt;em&gt;is&lt;/em&gt; &quot;lite Photoshop&quot;. Poking around the menus there doesn't seem to be a whole lot less in Pixelmator. Perhaps the big part of Photoshop is the set of 3rd party extensions and integration with other tools like Illustrator?&amp;nbsp;&lt;a href=&quot;#fnref-1&quot; class=&quot;footnoteBackLink&quot; title=&quot;Jump back to footnote 1 in the text.&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>hyperlinks in Komodo 5.1.0b1</title>
   <link href="http://trentm.com/2009/03/hyperlinks-in-komodo-510b1.html"/>
   <updated>2009-03-13T02:46:00-07:00</updated>
   <id>http://trentm.com/2009/03/hyperlinks-in-komodo-510b1</id>
   <content type="html">&lt;p&gt;We released Komodo 5.1 beta 1 yesterday! Get it here:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;&lt;a href=&quot;http://downloads.activestate.com/Komodo/releases/5.1.0b1/&quot;&gt;http://downloads.activestate.com/Komodo/releases/5.1.0b1/&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Please try it out and give us your feedback:&lt;/p&gt;


&lt;table class=&quot;attrlist&quot;&gt;&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-beta&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;This is the third release of &lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;Komodo&lt;/a&gt; 5.1 on the way to a planned final release very soon (hopefully within a week or two). Here are a few goodies in this release. (See my previous posts about the &lt;a href=&quot;http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html&quot;&gt;Komodo 5.1a1&lt;/a&gt; and &lt;a href=&quot;http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html&quot;&gt;Komodo 5.1a2&lt;/a&gt; releases.)&lt;/p&gt;


&lt;h2&gt;Hyperlinks&lt;/h2&gt;


&lt;p&gt;Many IDEs that have &lt;a href=&quot;http://docs.activestate.com/komodo/5.0/codeintel.html&quot;&gt;code intelligence&lt;/a&gt; support allow you to &lt;code&gt;Ctrl+click&lt;/code&gt; (&lt;code&gt;Cmd+click&lt;/code&gt; on a Mac) on a symbol to &lt;code&gt;Go to Definition&lt;/code&gt;. Here was &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=76721&quot;&gt;Komodo's feature request for that&lt;/a&gt;. This is now implemented in Komodo 5.1b1.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3351188279/&quot; title=&quot;Komodo hyperlink go to definition by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3633/3351188279_2fecb4ab17_o.png&quot; width=&quot;619&quot; height=&quot;221&quot; alt=&quot;Komodo hyperlink go to definition&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;However, we've gone one step further and made a generic system where &lt;code&gt;Ctrl+mouse-hover&lt;/code&gt; will underline &lt;em&gt;interesting&lt;/em&gt; regions (&lt;strong&gt;hyperlinks&lt;/strong&gt;) in your text for clicking on. The most common type of hyperlink is a symbol for &quot;Go to Definition&quot;. However other types of hyperlinks include:&lt;/p&gt;


&lt;ol&gt;&lt;li&gt;&lt;p&gt;Colors in CSS (including CSS in HTML files):&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352004518/&quot; title=&quot;Komodo hyperlink colors by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3468/3352004518_c2eaeacf12_o.png&quot; width=&quot;750&quot; height=&quot;409&quot; alt=&quot;Komodo hyperlink colors&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As in Firebug, you'll get a swatch of the color when hovering over the color. What's more, &lt;code&gt;Ctrl+click&lt;/code&gt; will bring up the system's color picker with which you can change the color.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTTP and FTP URLs:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3351178023/&quot; title=&quot;Komodo hyperlink URL by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3653/3351178023_b5b199f084_o.png&quot; width=&quot;626&quot; height=&quot;406&quot; alt=&quot;Komodo hyperlink URL&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Ctrl+click&lt;/code&gt; will load that URL in your browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Regular expression mapping to an HTTP URL.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352014612/&quot; title=&quot;Komodo hyperlink regex by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3615/3352014612_e32aa7eeed_o.png&quot; width=&quot;576&quot; height=&quot;308&quot; alt=&quot;Komodo hyperlink regex&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Currently 5.1.0b1 includes a regex to map occurrences of &quot;bug \d+&quot; to the appropriate bug in ActiveState's bug database. Eventually we'll have a preferences dialog where adding these mappings will be easier, but for now &lt;a href=&quot;http://community.activestate.com/adding-komodo-hyperlink-handler&quot;&gt;here is how you can add your own&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A generic handler to do whatever you can think of.&lt;/p&gt;&lt;p&gt;The hyperlinks above are all implemented with a simple mechanism in Komodo's &lt;a href=&quot;http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/hyperlinks/hyperlinks.js#37&quot;&gt;&lt;code&gt;ko.hyperlinks&lt;/code&gt; JavaScript namespace&lt;/a&gt;. You can add your own handlers to do other things. Following how &lt;a href=&quot;http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/hyperlinks/regexhandler.js#37&quot;&gt;the regexhandler&lt;/a&gt; works is a good place to start. We'll try to give more examples later.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: The hyperlink types other than &quot;Go to Definition&quot; are only in Komodo &lt;em&gt;IDE&lt;/em&gt; (i.e. not in Komodo Edit) for the 5.1.0b1 release. So, if you want to play you should either use Komodo IDE 5.1.0b1 or use the &lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/&quot;&gt;latest nightlies&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;koext updates&lt;/h2&gt;


&lt;p&gt;&lt;code&gt;koext&lt;/code&gt; is a command-line tool for helping in building Komodo extensions. There are some great &lt;a href=&quot;http://community.activestate.com/addons&quot;&gt;Komodo extensions that users have been building here&lt;/a&gt;. However, it is far from as easy as it should be to dig in and build Komodo extensions. Part of the solution is the &lt;code&gt;koext&lt;/code&gt; tool. (Another part is documentation for extension authors, but that is a story for another time.)&lt;/p&gt;


&lt;p&gt;We've started doing some updates to &lt;code&gt;koext&lt;/code&gt; again (see &lt;a href=&quot;http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/sdk/CHANGELOG.txt&quot;&gt;the change log&lt;/a&gt;). Recent changes are working towards making it easier to have a quick development cycle -- i.e. make it so that to test a change to your extension you just need to:&lt;/p&gt;


&lt;ol&gt;&lt;li&gt;make your edit;&lt;/li&gt;
&lt;li&gt;possibly run &lt;strong&gt;&lt;code&gt;koext build --dev&lt;/code&gt;&lt;/strong&gt;, e.g. if you changed an IDL file; and&lt;/li&gt;
&lt;li&gt;re-start Komodo&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Instead of the more laborious:&lt;/p&gt;


&lt;ol&gt;&lt;li&gt;make your edit;&lt;/li&gt;
&lt;li&gt;run &lt;strong&gt;&lt;code&gt;koext build&lt;/code&gt;&lt;/strong&gt; to build a new &lt;code&gt;.xpi&lt;/code&gt; file;&lt;/li&gt;
&lt;li&gt;re-install that &lt;code&gt;.xpi&lt;/code&gt; in Komodo;&lt;/li&gt;
&lt;li&gt;re-start Komodo&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;In a subsequent post I'll describe how I setup to build a Komodo extension. Here is a &lt;a href=&quot;http://trentmick.blogspot.com/2007/09/intro-to-komodo-extensions_8939.html&quot;&gt;brief intro to koext&lt;/a&gt; from way back&lt;/p&gt;


&lt;h2&gt;Other stuff&lt;/h2&gt;


&lt;p&gt;A quick list of other feature work, notable bug fixes and fixed annoyances in Komodo 5.1.0b1:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;&lt;p&gt;Komodo's new &lt;a href=&quot;http://trentm.com/blog/archives/2009/02/04/history-feature-in-komodo-510-alpha-1/&quot;&gt;&quot;History&quot; feature&lt;/a&gt; now has session support which is currently used to make your history specific to a single Komodo window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Komodo IDE, the History now shows the section title for locations in the History. This can make the &quot;Recent locations&quot; menu a lot more useful:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3352004444/&quot; title=&quot;Komodo section titles in recent history list by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3643/3352004444_fbf864d371.jpg&quot; width=&quot;500&quot; height=&quot;182&quot; alt=&quot;Komodo section titles in recent history list&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In XML (and HTML and PHP, etc.) files, clicking on a tag will briefly flash (highlight) the matching tag (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=81606&quot;&gt;bug 81606&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo's &lt;a href=&quot;http://docs.activestate.com/komodo/5.1/editor.html#matching_brace&quot;&gt;&quot;jump to matching brace&quot;&lt;/a&gt; now works as you'd expect for opening and closing tags in XML/HTML (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=43239&quot;&gt;bug 43239&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We've done some crash fix work so that Komodo 5.1b1 should be more stable that 5.1a2. It is hard to quantify and we continue to look for crash issues in Komodo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Greatly improved the annoyance of it being very hard to grab the bottom-pane and sidebar splitters on Mac OS X (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80756&quot;&gt;bug 80756&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed the annoyance of being unable to resize Name/Type/Value panes in Locals/Globals debugger window (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80566&quot;&gt;bug 80566&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix: codeintel: calltips cannot show unicode doc comments http://bugs.activestate.com/show_bug.cgi?id=70448&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added &lt;a href=&quot;http://trentmick.blogspot.com/2009/02/line-or-selection-in-komodo_2909.html&quot;&gt;a &quot;duplicate line or selection&quot; command&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added Korean and Japanese JIS encodings (&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80890&quot;&gt;bug 80890&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;As well there is more coming. Try out the Komodo nightly builds for the very latest stuff:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;&lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/&quot;&gt;http://downloads.activestate.com/Komodo/nightly/&lt;/a&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Find highlighting and Linux/x86_64 support in Komodo 5.1a2</title>
   <link href="http://trentm.com/2009/02/find-highlighting-and-linuxx86_64-support-in-komodo-51a2.html"/>
   <updated>2009-02-27T02:41:00-08:00</updated>
   <id>http://trentm.com/2009/02/find-highlighting-and-linuxx86_64-support-in-komodo-51a2</id>
   <content type="html">&lt;p&gt;We released Komodo 5.1 alpha 2 a couple of days ago (shame on me for not announcing until now). Get it here:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;&lt;a href=&quot;http://downloads.activestate.com/Komodo/releases/5.1.0a2/&quot;&gt;http://downloads.activestate.com/Komodo/releases/5.1.0a2/&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Please try it out and give us your feedback:&lt;/p&gt;


&lt;table class=&quot;attrlist&quot;&gt;&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-beta&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;This is the second release of &lt;a href=&quot;http://www.activestate.com/komodo/&quot;&gt;Komodo&lt;/a&gt; 5.1 on the way to a planned final release around mid-May. There are a few goodies worth talking about in this release. (See my &lt;a href=&quot;http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html&quot;&gt;post about Komodo 5.1a1 here&lt;/a&gt;.)&lt;/p&gt;


&lt;h2&gt;Find highlighting&lt;/h2&gt;


&lt;p&gt;Komodo now highlights find/search matches in your buffer. Here is a short video showing it off. Sorry, no sound. This is my first screencast. :)&lt;/p&gt;


&lt;p&gt;&lt;object width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=3387846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; /&gt;&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=3387846&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;


&lt;p&gt;Here I'm doing a couple of searches using &lt;a href=&quot;http://docs.activestate.com/komodo/5.1/vikeybind.html&quot;&gt;Komodo's Vi mode&lt;/a&gt;. That highlighting makes a big difference for helping your eyes find where you want to navigate to.&lt;/p&gt;


&lt;p&gt;Find highlighting is one of those &quot;well, duh&quot; features that we are now able to add with &lt;a href=&quot;http://www.scintilla.org/ScintillaDoc.html#Indicators&quot;&gt;indicator support in Komodo's editing component Scintilla&lt;/a&gt;. Indicators in Scintilla allow one to put visual markers on regions of the editor buffer independent of the syntax coloring information. Before indicators, syntax coloring styling and other styling (squiggly underlining for syntax errors/warnings, find highlighting, ...) had to share 8-bits of data for each position (i.e. each character). That was awkward (playing with bit masks) and limiting (ran out of space in, e.g., HTML which uses 7 of those 8 bits for all the different syntax coloring styles). Another example is &lt;a href=&quot;http://docs.activestate.com/komodo/5.1/tabstops.html&quot;&gt;Komodo's Tabstops&lt;/a&gt; -- which were made a lot more usable in 5.0 because of what we could do with indicators.&lt;/p&gt;


&lt;h2&gt;Linux/x86_64 support&lt;/h2&gt;


&lt;p&gt;We've added support for a new platform: Linux/x86_64. This is our first native 64-bit platform build. Linux x86_64 installs are getting to be quite common, and typically the default install of Linux distros on x86_64 don't include the 32-bit compatibility libraries. This means that attempting to use Komodo's 32-bit Linux build wouldn't work out of the box (it tends to work fine once the distro's 32-bit compat libs are installed) -- and hence was a common support issue. Hopefully, no more. As well, Linux/x86_64 users will possibly enjoy a slight performance benefit.&lt;/p&gt;


&lt;h2&gt;Localization patches from Davide Ficano (l10n)&lt;/h2&gt;


&lt;p&gt;Way back in the heady days of 2008 (before Komodo 5.0 was released) Davide Ficano (aka &lt;em&gt;dafi&lt;/em&gt;) made this post on &lt;a href=&quot;http://community.activestate.com/forums/komodo&quot;&gt;Komodo's forums&lt;/a&gt;:&lt;/p&gt;


&lt;blockquote&gt;  &lt;p&gt;&lt;a href=&quot;http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team&quot;&gt;Localizing Komodo using Babelzilla dream team&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;that kicked off some starter work towards localizing Komodo. One of the necessary steps to getting good localizations of Komodo was to update Komodo's chrome to more rigorously use DTDs for XUL (we were using these fairly well) and string bundles for JavaScript code (we weren't doing so well here). Dafi &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80668&quot;&gt;whipped&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=79975&quot;&gt;up&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80670&quot;&gt;a bunch&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=79675&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80667&quot;&gt;patches&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80669&quot;&gt;for&lt;/a&gt; &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=80375&quot;&gt;this&lt;/a&gt;. Todd has finally managed to get those all checked in, so that Komodo is now in a pretty good state to start being localized.&lt;/p&gt;


&lt;h2&gt;Other stuff&lt;/h2&gt;


&lt;p&gt;In addition to the above, Komodo's History feature is coming along:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;The same keybindings as your browser for Back/Forward should be working on all platforms.&lt;/li&gt;
&lt;li&gt;The side mouse buttons on 5-button mice should work for navigating the history.&lt;/li&gt;
&lt;li&gt;This history will now properly handle cleaning out URLs from finished remote debugging sessions.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;As well we've a few more goodies that should be ready to show for a beta 1 release in a week or two. As ever, try out the Komodo nightly builds for the very latest stuff:&lt;/p&gt;


&lt;div style=&quot;margin-left: 30px;&quot;&gt;&lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/&quot;&gt;http://downloads.activestate.com/Komodo/nightly/&lt;/a&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>&#8220;duplicate line or selection&#8221; in Komodo</title>
   <link href="http://trentm.com/2009/02/duplicate-line-or-selection-in-komodo.html"/>
   <updated>2009-02-20T01:46:00-08:00</updated>
   <id>http://trentm.com/2009/02/duplicate-line-or-selection-in-komodo</id>
   <content type="html">&lt;p&gt;I saw &lt;a href=&quot;http://www.botsko.net/blog/2009/02/duplicate-lineselection-in-komodo-5/&quot;&gt;this blog entry&lt;/a&gt; this morning:&lt;/p&gt;




&lt;blockquote&gt;
&lt;h3&gt;Duplicate Line/Selection in Komodo 5&lt;/h3&gt;

&lt;p&gt;Exploring the ability to create macros and bind them to key commands in Komodo IDE. I'm reposting the below macro that duplicates the lines or the current selection. Thus functionality was previously is Zend Studio 5, went missing from 6, and thanks to the macro, is available in Komodo. Enjoy!&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;&lt;/blockquote&gt;




&lt;p&gt;I thought I should mention the Komodo bug -- &lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=78819&quot;&gt;Extend functionality of the &quot;duplicate line&quot; function&lt;/a&gt; -- on which &lt;a href=&quot;http://blogs.activestate.com/ericp/&quot;&gt;Eric&lt;/a&gt; added a new core command to Komodo to do just this... with the added bonus that it also works for block/column selections. This was added just yesterday. Here is the &lt;a href=&quot;http://svn.openkomodo.com/openkomodo/revision?rev=3018&quot;&gt;checkin to Komodo Edit's repository&lt;/a&gt;. The nightly builds of Komodo 5.1.0a2 from last night has this in it:&lt;/p&gt;




&lt;p&gt;Komodo IDE: &lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/komodoide/latest-trunk/&quot;&gt;http://downloads.activestate.com/Komodo/nightly/komodoide/latest-trunk/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Komodo Edit: &lt;a href=&quot;http://downloads.activestate.com/Komodo/nightly/komodoedit/latest-trunk/&quot;&gt;http://downloads.activestate.com/Komodo/nightly/komodoedit/latest-trunk/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You can assign any key to this command in Komodo's &quot;Editor | Key Bindings&quot; preferences panel. The command name is &quot;Editor: Duplicate Line or Selection&quot;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>hard disk warranty</title>
   <link href="http://trentm.com/2009/02/hard-disk-warranty.html"/>
   <updated>2009-02-10T15:07:00-08:00</updated>
   <id>http://trentm.com/2009/02/hard-disk-warranty</id>
   <content type="html">&lt;p&gt;My father-in-law wanted to be careful to ensure personal data wouldn't be lifted from the hard disk of the old computer that he is getting rid of. I love his documentary evidence:&lt;/p&gt;




&lt;div style=&quot;padding-top: 20px;&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/3270736529/&quot; title=&quot;Computer by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3531/3270736529_6c453ab877.jpg&quot; width=&quot;500&quot; height=&quot;494&quot; alt=&quot;Computer&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;div style=&quot;padding-top: 20px;&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/3271556538/&quot; title=&quot;HardDisc by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3395/3271556538_bcbb098ebe.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;HardDisc&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;div style=&quot;padding-top: 20px;&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/3271556608/&quot; title=&quot;warranty by trento, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3401/3271556608_a3ac65f9b0.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;warranty&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>RobH's sketches for the Komodo logo</title>
   <link href="http://trentm.com/2009/02/robhs-sketches-for-the-komodo-logo.html"/>
   <updated>2009-02-04T08:52:00-08:00</updated>
   <id>http://trentm.com/2009/02/robhs-sketches-for-the-komodo-logo</id>
   <content type="html">&lt;p&gt;Rob Hernandez is an ex-&lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt; employee. When he worked here he was responsible for the excellent designs that became the ActiveState critter logos -- since, and still, used on t-shirts and for ActiveState application logos.&lt;/p&gt;




&lt;p&gt;I was happy to see that he recently put up some of his work on Flickr:&lt;/p&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/27560752@N03/3235578946/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3128/3235556420_ac15aafccd_d.jpg&quot; width=&quot;500&quot; height=&quot;162&quot;/&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;including his sketches for the Komodo head logo:&lt;/p&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/27560752@N03/3235578946/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3337/3235578946_3315b42d3f_m_d.jpg&quot; width=&quot;240&quot; height=&quot;162&quot;/&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The latter are the precursor to the current Komodo IDE and Komodo Edit head icons:&lt;/p&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3254601150/&quot; title=&quot;Komodo IDE and Komodo Edit logos&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3115/3254601150_37515ac69b_o.jpg&quot; width=&quot;305&quot; height=&quot;244&quot; alt=&quot;Komodo IDE and Komodo Edit logos&quot; /&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/27560752@N03/sets/72157605557635682/&quot;&gt;Here is the full set&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;And if you are more into the realism thing, &lt;a href=&quot;http://www.flickr.com/photos/upton/434047069/&quot;&gt;check out this Komodo head&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>History feature in Komodo 5.1.0 alpha 1</title>
   <link href="http://trentm.com/2009/02/history-feature-in-komodo-510-alpha-1.html"/>
   <updated>2009-02-04T08:08:00-08:00</updated>
   <id>http://trentm.com/2009/02/history-feature-in-komodo-510-alpha-1</id>
   <content type="html">&lt;p&gt;We released Komodo 5.1.0 alpha 1 today! Get it here:&lt;/p&gt;




&lt;div style=&quot;margin-left: 30px;&quot;&gt;&lt;a href=&quot;http://downloads.activestate.com/Komodo/releases/5.1.0a1/&quot;&gt;http://downloads.activestate.com/Komodo/releases/5.1.0a1/&lt;/a&gt;&lt;/div&gt;




&lt;p&gt;Please try it out and give us your feedback:&lt;/p&gt;




&lt;table class=&quot;attrlist&quot;&gt;
&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://listserv.activestate.com/mailman/listinfo/komodo-beta&quot;&gt;http://listserv.activestate.com/mailman/listinfo/komodo-beta&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;bugs&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&quot;&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;forums&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://community.activestate.com/products/Komodo&quot;&gt;http://community.activestate.com/products/Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;




&lt;p&gt;This is the first release of Komodo 5.1 on the way to a planned final release
around &lt;strike&gt;mid-May&lt;/strike&gt; &lt;em&gt;[&lt;strong&gt;Update:&lt;/strong&gt; mid-March. Subconsciously I keep hoping for more time. :)]&lt;/em&gt;. (I'll write about our Komodo 5.1 plans in a separate post).
Here I want to talk about Komodo's new &quot;History&quot; feature.&lt;/p&gt;




&lt;h2&gt;History overview&lt;/h2&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3253669957/&quot; title=&quot;screenshot of Komodo 5.1's history feature&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3009/3253669957_903874fa5c_o.jpg&quot; width=&quot;570&quot; height=&quot;448&quot; alt=&quot;screenshot of Komodo 5.1's history feature&quot; /&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Komodo's History feature is like your browser's history, but for the editor.
Back and Forward buttons in the toolbar. Same default keybindings as in
Firefox &lt;sup class=&quot;footnote-ref&quot; id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Simple.&lt;/p&gt;




&lt;p&gt;Komodo's history is a bit different than a browser's. In a browser, you have
a separate history session for each tab. This doesn't make as much sense
for an editor. Komodo's history is per-window &lt;sup class=&quot;footnote-ref&quot; id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. That means that the Back
button will move you back to the last place you were, be that in the current
file or in another file in the same window. This means that jumping back:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;after a &lt;a href=&quot;http://docs.activestate.com/komodo/5.0/editor.html#go_to_def&quot;&gt;Go To Definition&lt;/a&gt;, or&lt;/li&gt;
&lt;li&gt;after opening a new file, or&lt;/li&gt;
&lt;li&gt;after jumping to a find result&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;is as easy as clicking &quot;Back&quot;.&lt;/p&gt;




&lt;p&gt;More than any new feature in Komodo, the first time we hooked the feature up
it felt immediately useful. Of course, this is just an alpha release so there
is lots of polishing to do. Read on for some of the other things we hope to do
with this.&lt;/p&gt;




&lt;h2&gt;Future work&lt;/h2&gt;




&lt;p&gt;Some other things Komodo will be able to support with this:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opening recent files quickly.&lt;/strong&gt; Chances are good that a file you want to
open in your editor is a file you've edited before (and recently). The
history database now provides Komodo with the data it needs to support that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find in recent files.&lt;/strong&gt; Often I'll want to look at some snippet of code
that I remember writing in the last few days, but can't remember what
file (or even what project) that was in.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Support &lt;code&gt;''&lt;/code&gt; command in Vi-mode&lt;/strong&gt;. From the Vim help:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;''  ``                  Move to the position before latest jump.
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hooking &lt;code&gt;Back&lt;/code&gt; and &lt;code&gt;Forward&lt;/code&gt; into the MS Intellimouse's (and other mice, I
suspect) side buttons -- as is the default in Firefox.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Backend code&lt;/h2&gt;




&lt;p&gt;For those interested, most of the backend of the history system is &lt;a href=&quot;http://svn.openkomodo.com/openkomodo/view/openkomodo/trunk/src/history/editorhistory.py&quot;&gt;here in
&quot;editorhistory.py&quot;&lt;/a&gt;
in the Open Komodo subversion repository.&lt;/p&gt;




&lt;p&gt;For JavaScript code (most interesting to Komodo extension developers) there is
a new &lt;a href=&quot;http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/library/history.js&quot;&gt;&lt;code&gt;ko.history&lt;/code&gt;
API&lt;/a&gt;
with the most relevant methods being:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ko.history.note_curr_loc(view)&lt;/code&gt;: Tell the history system to note the
current editor location before jumping somewhere.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ko.history.history_back(n)&lt;/code&gt;: Go back &lt;code&gt;n&lt;/code&gt; locations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ko.history.history_forward(n)&lt;/code&gt;: Go forward &lt;code&gt;n&lt;/code&gt; locations.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Komodo's history database shares some ideas with &lt;a href=&quot;https://developer.mozilla.org/en/The_Places_database&quot;&gt;Firefox 3's Places
database&lt;/a&gt;. In particular
the idea of splitting visited locations (URLs in Firefox, editor locations in
Komodo) and &lt;em&gt;visits&lt;/em&gt; into separate database tables was helpful. They are, of
course, both SQLite3 databases.&lt;/p&gt;




&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;The keybindings aren't yet there for Mac OS X in alpha 1. They will be
there for alpha 2.&amp;nbsp;&lt;a href=&quot;#fnref-1&quot; class=&quot;footnoteBackLink&quot; title=&quot;Jump back to footnote 1 in the text.&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;Currently it is shared by multiple Komodo windows, but will be changed to
be per window.&amp;nbsp;&lt;a href=&quot;#fnref-2&quot; class=&quot;footnoteBackLink&quot; title=&quot;Jump back to footnote 2 in the text.&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>recipe for cranberry-pear relish</title>
   <link href="http://trentm.com/2009/02/recipe-for-cranberry-pear-relish.html"/>
   <updated>2009-02-03T15:50:00-08:00</updated>
   <id>http://trentm.com/2009/02/recipe-for-cranberry-pear-relish</id>
   <content type="html">&lt;p&gt;This is recipe that my parents found in, IIRC, a 1980's Gourmet Christmas special magazine. Our family has been making this relish for Thanksgiving and Christmas turkey dinner every since. I generally prepare this one or two days before the big meal, so it doesn't add to the burden of preparing everything else.&lt;/p&gt;




&lt;h1&gt;Cranberry-pear relish&lt;/h1&gt;




&lt;p&gt;In a big soup pot bring &lt;strong&gt;1 1/4 cup sugar&lt;/strong&gt;, &lt;strong&gt;1 cup water&lt;/strong&gt; and &lt;strong&gt;1/4 cup lemon juice&lt;/strong&gt; to boil. Simmer for 5 minutes.&lt;/p&gt;




&lt;p&gt;Add &lt;strong&gt;5 pears&lt;/strong&gt; (peeled, cored and cubed into about 1cm cubes). Simmer for 5 minutes.&lt;/p&gt;




&lt;p&gt;Add &lt;strong&gt;3 cups cranberries&lt;/strong&gt;. Boil at med-high heat, stirring occasionally until most of the cranberries pop -- usually about 5-10 minutes. &quot;Three cups cranberries&quot; is basically just the entire bag of frozen cranberries that are commonly available at supermarkets around Thanksgiving and Christmas time.&lt;/p&gt;




&lt;p&gt;Remove from heat and stir in &lt;strong&gt;1 1/2 tsp lemon rind&lt;/strong&gt; (optional), &lt;strong&gt;1/4 tsp cinnamon&lt;/strong&gt; and &lt;strong&gt;1/4 tsp allspice&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Let cool and store in the fridge.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>mini-mick 2</title>
   <link href="http://trentm.com/2009/02/mini-mick-2.html"/>
   <updated>2009-02-03T15:30:00-08:00</updated>
   <id>http://trentm.com/2009/02/mini-mick-2</id>
   <content type="html">&lt;div class=&quot;left&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3143590128/&quot; title=&quot;mini-mick2 ultrasound (close-up)&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3088/3143590128_88f7c32d10_m.jpg&quot; width=&quot;240&quot; height=&quot;186&quot; alt=&quot;mini-mick2 ultrasound (close-up)&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;div class=&quot;left&quot; style=&quot;clear: both&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/3252025587/&quot; title=&quot;mini-mick 2 ultrasound at 18 weeks&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3053/3252025587_b826a7f9a9_m.jpg&quot; width=&quot;240&quot; height=&quot;128&quot; alt=&quot;mini-mick 2 ultrasound at 18 weeks&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;div style=&quot;clear: both&quot;&gt;
mm2 (code name joaquim) is on his or her way -- due in early July. Above are scans from mm2's ultrasounds at 12 and 18 weeks.
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>ActivePython 2.6.1.1 and 3.0.0.0 released!</title>
   <link href="http://trentm.com/2008/12/activepython-2611-and-3000-released.html"/>
   <updated>2008-12-12T07:07:00-08:00</updated>
   <id>http://trentm.com/2008/12/activepython-2611-and-3000-released</id>
   <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.activestate.com/Products/activepython/feature_list.mhtml&quot;&gt;Details and download links for 2.6 here.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.activestate.com/Products/activepython/python3.mhtml&quot;&gt;Details and download links for 3.0 here.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;All ActivePython downloads are also available &lt;a href=&quot;http://downloads.activestate.com/ActivePython/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Python 3.0 was released last week and we've &lt;sup class=&quot;footnote-ref&quot; id=&quot;fnref-1&quot;&gt; &lt;a href=&quot;#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; managed to get ActivePython builds for all our platforms and give them a smoke test. &lt;/p&gt;




&lt;p&gt;Now that Python 3.0 is final I'm really looking forward to seeing where Python 3 goes. I'm sure it will be (and feel like) a long transition from Python 2, but I think a year or two from now we'll look back at the rare Python 2 usage not miss it. The semantic changes involved in the str/unicode/bytes changes will be a royal pain, but this had to be done and the long term benefits of sane Unicode handling will be huge.&lt;/p&gt;




&lt;div class=&quot;footnotes&quot;&gt; 
&lt;hr /&gt; 
&lt;ol&gt; 
&lt;li id=&quot;fn-1&quot;&gt; &lt;p&gt;For the last few years I've been maintaining ActivePython myself. For these latest releases I'm happy to have Andreas Kupries helping out with ActivePython build engineering.&amp;nbsp;&lt;a href=&quot;#fnref-1&quot; class=&quot;footnoteBackLink&quot; title=&quot;Jump back to footnote 1 in the text.&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;
&lt;/ol&gt; 
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>important Firefox bug</title>
   <link href="http://trentm.com/2008/07/important-firefox-bug.html"/>
   <updated>2008-07-31T03:00:00-07:00</updated>
   <id>http://trentm.com/2008/07/important-firefox-bug</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=448604&quot;&gt;https://bugzilla.mozilla.org/show_bug.cgi?id=448604&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>New Recipes feed improvement</title>
   <link href="http://trentm.com/2008/07/new-recipes-feed-improvement.html"/>
   <updated>2008-07-25T02:08:00-07:00</updated>
   <id>http://trentm.com/2008/07/new-recipes-feed-improvement</id>
   <content type="html">&lt;p&gt;The new ActiveState Code site improves a little bit on the &lt;a href=&quot;http://code.activestate.com/feeds/recipes/&quot;&gt;feeds for new recipes&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;Before&lt;/h3&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/2701029711/&quot; title=&quot;&amp;quot;New Recipes&amp;quot; feed before&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3158/2701029711_8365ebf895_o.png&quot; width=&quot;633&quot; height=&quot;176&quot; alt=&quot;&amp;quot;New Recipes&amp;quot; feed before&quot; /&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;After&lt;/h3&gt;




&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/2701029655/&quot; title=&quot;&amp;quot;New Recipes&amp;quot; feed after&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3154/2701029655_41e960ce7a_o.png&quot; width=&quot;634&quot; height=&quot;251&quot; alt=&quot;&amp;quot;New Recipes&amp;quot; feed after&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActiveState Code: lauched!</title>
   <link href="http://trentm.com/2008/07/activestate-code-lauched.html"/>
   <updated>2008-07-24T12:45:00-07:00</updated>
   <id>http://trentm.com/2008/07/activestate-code-lauched</id>
   <content type="html">&lt;p&gt;We launched &lt;a href=&quot;http://code.activestate.com/&quot;&gt;ActiveState Code&lt;/a&gt; today, &lt;a title=&quot;You have seen Monty Python's Holy Grail, right?&quot; href=&quot;http://www.urbandictionary.com/define.php?term=And+There+was+Much+Rejoicing&quot;&gt;and there was much rejoicing.&lt;/a&gt;  Yaaaah!&lt;/p&gt;




&lt;p&gt;ActiveState Code is a site for sharing code recipes. It is the replacement for the popular ASPN Cookbooks (especially the Python Cookbook, which was a collaboration with O'Reilly and Associates that resulted in two print cookbooks using recipes from the site). The new site adds things like &lt;a href=&quot;http://code.activestate.com/recipes/tags/&quot;&gt;tagging&lt;/a&gt;, the ability to &lt;a href=&quot;http://code.activestate.com/recipes/add/&quot;&gt;add recipes&lt;/a&gt; in a number of other &lt;a href=&quot;http://code.activestate.com/recipes/langs/&quot;&gt;languages&lt;/a&gt;, and a fresher and hopefully more usable site. &lt;/p&gt;




&lt;p&gt;Migration should be easy. All recipes from the Python, Tcl and PHP Cookbooks have been carried over. Redirects maintain all old aspn.activestate.com/ASPN/Cookbooks links. Recipe id and author ids have been maintained. The ASPN Cookbook categories have been translated into tags in the new system -- &lt;a href=&quot;http://code.activestate.com/aspnredir/categories/&quot;&gt;full details here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I welcome any &lt;a href=&quot;http://code.activestate.com/help/feedback/&quot;&gt;feedback&lt;/a&gt; on the site.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Switching from ASPN Cookbooks to ActiveState Code today</title>
   <link href="http://trentm.com/2008/07/switching-from-aspn-cookbooks-to-activestate-code-today.html"/>
   <updated>2008-07-24T01:30:00-07:00</updated>
   <id>http://trentm.com/2008/07/switching-from-aspn-cookbooks-to-activestate-code-today</id>
   <content type="html">&lt;p&gt;We hope to be switching over from the &lt;a href=&quot;http://aspn.activestate.com/ASPN/Cookbook&quot;&gt;ASPN Cookbooks&lt;/a&gt; to the new &lt;a href=&quot;http://code.activestate.com/&quot;&gt;ActiveState Code&lt;/a&gt; site today. Please be patient if the site is down for a short while. We expect the process to take about an hour or two late this afternoon (&lt;a href=&quot;http://www.timeanddate.com/worldclock/fullscreen.html?n=256&quot;&gt;PST&lt;/a&gt;).&lt;/p&gt;




&lt;p&gt;I've had lots of good feedback from the Python community (Apologies if I haven't gotten back to you yet. I will.) and have made a number of changes based on that feedback. I'll post more details once the site has been switched over.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Translating Komodo on babelzilla.org</title>
   <link href="http://trentm.com/2008/07/translating-komodo-on-babelzillaorg.html"/>
   <updated>2008-07-11T07:34:00-07:00</updated>
   <id>http://trentm.com/2008/07/translating-komodo-on-babelzillaorg</id>
   <content type="html">&lt;p&gt;At the &lt;a href=&quot;http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team&quot;&gt;prompting&lt;/a&gt; of &lt;a href=&quot;http://dafizilla.sourceforge.net/&quot;&gt;dafi&lt;/a&gt; (one of Komodo's more active users) and with &lt;em&gt;goofy&lt;/em&gt;'s help I've uploaded a &lt;a href=&quot;http://www.babelzilla.org/index.php?option=com_wts&amp;amp;Itemid=88&amp;amp;type=lang&amp;amp;extension=3868&quot;&gt;Komodo Language Pack&lt;/a&gt; with Komodo's current &lt;code&gt;en-US&lt;/code&gt; localization to &lt;a href=&quot;http://www.babelzilla.org/&quot;&gt;BabelZilla&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;We get requests for localizations of Komodo every so often, but lack the resources to do this ourselves. Given a number of good translations here, I can start providing language pack extensions to &lt;a href=&quot;http://community.activestate.com/addons&quot;&gt;Komodo's add-ons site&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;This is a trial balloon that I really hope turns out well. I remember having a great chat with Michal Berman about Mozilla's l10n infrastructure at FSSOS 2007 waaay back in October last year. I dropped that ball following up after that discussion. I'd also like to take a look at &lt;a href=&quot;https://translations.launchpad.net/&quot;&gt;Launchpad Translations&lt;/a&gt; to see if that would work well.&lt;/p&gt;




&lt;p&gt;If you are interested in helping out with translating Komodo to your language, please take a look at &lt;a href=&quot;http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team&quot;&gt;this forum thread&lt;/a&gt; and/or let me know (trentm at activestate dot com).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActiveState Code: the new ASPN Cookbooks</title>
   <link href="http://trentm.com/2008/07/activestate-code-the-new-aspn-cookbooks.html"/>
   <updated>2008-07-08T07:32:00-07:00</updated>
   <id>http://trentm.com/2008/07/activestate-code-the-new-aspn-cookbooks</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://code.activestate.com/&quot;&gt;ActiveState Code&lt;/a&gt; has been launched (in beta)! ActiveState Code is a new site that will be the eventual replacement of the venerable &lt;a href=&quot;http://aspn.activestate.com/ASPN/Cookbook&quot;&gt;ASPN Cookbooks&lt;/a&gt; -- in particular the popular &lt;a href=&quot;http://aspn.activestate.com/ASPN/Cookbook/Python&quot;&gt;Python Cookbook&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;What this site offers over the ASPN Cookbooks:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;a complete visual refresh (long overdue)&lt;/li&gt;
&lt;li&gt;full tagging support of recipes&lt;/li&gt;
&lt;li&gt;support for many many more languages (the ASPN Cookbooks were restricted to Python, PHP, Tcl and XSLT recipes)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;In addition, the new site provides a sound foundation for other improvements -- so &lt;strong&gt;&lt;a href=&quot;http://code.activestate.com/help/feedback/?type=general&quot;&gt;tell us what you think!&lt;/a&gt;&lt;/strong&gt;. What is missing? What doesn't work? What would make the site more useful for you? for your community?&lt;/p&gt;




&lt;p&gt;While the site is in beta, new recipes, comments and votes are &lt;em&gt;not saved&lt;/em&gt; -- instead the site's data will be sync'd from the ASPN Cookbooks most nights. The plan is to fully move to this new site in two weeks, shutting down the old ASPN Cookbooks (redirects will preserve all old links).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActivePython 2.5.2.2 and 2.4.5.14 released</title>
   <link href="http://trentm.com/2008/04/activepython-2522-and-24514-released.html"/>
   <updated>2008-04-09T06:58:00-07:00</updated>
   <id>http://trentm.com/2008/04/activepython-2522-and-24514-released</id>
   <content type="html">&lt;p&gt;Get it here: &lt;a href=&quot;http://www.activestate.com/products/activepython/&quot;&gt;http://www.activestate.com/products/activepython/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;After a hiatus while I worked hard on the &lt;a href=&quot;http://www.activestate.com/products/komodo/&quot;&gt;Komodo 4.3&lt;/a&gt; release with the Komodo crew here, I've finally had the chance to update ActivePython 2.5 and 2.4 to the latest.&lt;/p&gt;




&lt;p&gt;Full details in the &lt;a href=&quot;http://aspn.activestate.com/ASPN/docs/ActivePython/relnotes.html&quot;&gt;ActivePython release notes&lt;/a&gt;. These releases update the core to Python &lt;a href=&quot;http://www.python.org/download/releases/2.5.2/NEWS.txt&quot;&gt;2.5.2&lt;/a&gt; and &lt;a href=&quot;http://www.python.org/download/releases/2.4.5/NEWS.txt&quot;&gt;2.4.5&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Enjoy.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>nightly updates for Komodo (and the Komodo AUS)</title>
   <link href="http://trentm.com/2008/03/nightly-updates-for-komodo-and-the-komodo-aus.html"/>
   <updated>2008-03-03T05:00:00-08:00</updated>
   <id>http://trentm.com/2008/03/nightly-updates-for-komodo-and-the-komodo-aus</id>
   <content type="html">&lt;p&gt;I and others here have been hard at work on Komodo 4.3 (due to go final this week) so it has been a while since I've posted. One thing I've wanted to post about for quite a while is the Komodo auto-update system. I &lt;a href=&quot;http://trentmick.blogspot.com/2007/05/building-msi-patch-packages-msp-with_695.html&quot;&gt;alluded to it&lt;/a&gt; waaay back when working on adding auto-update support to Komodo 4.2 but haven't written anything about it since.&lt;/p&gt;


&lt;p&gt;Last Friday gives me good reason to post about it: &lt;strong&gt;We now have a &quot;nightly&quot; channel for Komodo Edit!&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Update (4-Nov-2008): Nightly updates should not work for Komodo IDE as well!&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;Komodo Auto-update channels&lt;/h2&gt;


&lt;p&gt;There are three Komodo auto-update &quot;channels&quot;:&lt;/p&gt;


&lt;ol&gt;&lt;li&gt;&lt;p&gt;&quot;release&quot;: This is the typical (and default) channel for installations of a final release of Komodo (e.g. 4.2.0, 4.2.1, 4.3.0). On this channel, Komodo will only update itself to the latest &lt;em&gt;final&lt;/em&gt; Komodo release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;beta&quot;: This is the typical (and default) channel for Komodo alpha/beta builds. On this channel, Komodo will update itself to the final or pre-release (i.e. alphas and betas).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;nightly&quot;: This is a channel that I finally got working on the server-side on Friday. Since the announcement of &lt;a href=&quot;http://www.openkomodo.com/&quot;&gt;OpenKomodo&lt;/a&gt; and open sourcing of Komodo Edit we've been doing &quot;nightly&quot; builds of Komodo Edit (built on &lt;em&gt;most&lt;/em&gt; nights :). These are publicly available here: &lt;a href=&quot;http://downloads.openkomodo.com/komodoedit/nightly/&quot;&gt;http://downloads.openkomodo.com/komodoedit/nightly/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;strong&gt;As of last Friday, if you are on the nightly update channel Komodo Edit will update to the latest nightly build.&lt;/strong&gt; These are quite a bit more burning-edge that the &quot;beta&quot; channel. Often the only criteria for putting up a nightly is that the build worked for all platforms. So, occasionally some features are broken -- though I think we do pretty well.&lt;/p&gt;


&lt;p&gt;This channel is quite new for us though, so there may be some growing pains in the first couple of weeks. Please &lt;a href=&quot;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&amp;amp;component=Update&quot;&gt;let me know&lt;/a&gt; if you have any problems with it. I think it will be pretty cool to easily always be running the very latest Komodo Edit.&lt;/p&gt;


&lt;p&gt;At this time we aren't yet doing public nightlies of Komodo IDE.&lt;/p&gt;


&lt;h2&gt;Setting the update channel for your Komodo installation&lt;/h2&gt;


&lt;p&gt;Currently there isn't a prefs panel in Komodo to tweak auto-update settings -- such as the channel you are one. There should be. I hope to get one in sometime after 4.3.0.&lt;/p&gt;


&lt;p&gt;To set your Komodo channel edit &quot;channel-prefs.js&quot; in your Komodo installation as appropriate. On Windows and Linux this file is here:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;INSTALLDIR/lib/mozilla/defaults/pref/channel-prefs.js
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;and on Mac OS X here:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;INSTALLDIR/Contents/MacOS/defaults/pref/channel-prefs.js
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;It is a very simple file that looks like this:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;// Valid values are &quot;release&quot;, &quot;beta&quot; and &quot;nightly&quot; (internal-only).
pref(&quot;app.update.channel&quot;, &quot;beta&quot;);
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Happily that &quot;internal-only&quot; is no longer correct for Komodo Edit.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Update (4-Nov-2008): Ditto for Komodo IDE now.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;Other Komodo AUS Stuff&lt;/h2&gt;


&lt;p&gt;Komodo's auto-update system, on the client side (i.e. the app), pretty much just uses the excellent Mozilla auto-update system. On the server-side we have our own (very simple) &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;-based update server. On the build-side, we have our own Python scripts (&lt;a href=&quot;http://grok.openkomodo.com/source/xref/openkomodo/trunk/util/mozupdate.py&quot;&gt;mozupdate.py&lt;/a&gt; et al) for building all relevant partial and complete update packages as part of full builds.&lt;/p&gt;


&lt;p&gt;I hope to post more about our AUS server and about our build tools. I think I could fairly easily package up our tools to provide a possible answer to &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=415181&quot;&gt;Mozilla Bug 415181&lt;/a&gt; (Package the MAR generation tools for easy external usage).&lt;/p&gt;


&lt;p&gt;There used to be an open bug (found it: &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=375752&quot;&gt;Mozilla Bug 375752&lt;/a&gt;) to convert some of the Bash shell scripts for Mozilla update package building to Python scripts. I see (by way of &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=410806&quot;&gt;Mozilla Bug 410806&lt;/a&gt;) that that has at least partially happened with &lt;code&gt;make_incremental_updates.py&lt;/code&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>markdown2.py</title>
   <link href="http://trentm.com/2007/11/markdown2py.html"/>
   <updated>2007-11-07T10:15:00-08:00</updated>
   <id>http://trentm.com/2007/11/markdown2py</id>
   <content type="html">&lt;p&gt;I've started a &lt;a href=&quot;http://code.google.com/p/python-markdown2/&quot;&gt;python-markdown2&lt;/a&gt; project: this is another Python implementation of &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt;:&lt;/p&gt;




&lt;blockquote&gt;
  &lt;p&gt;Markdown is a text-to-HTML conversion tool for web writers. Markdown allows 
  you to write using an easy-to-read, easy-to-write plain text format, then 
  convert it to structurally valid XHTML (or HTML).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;No release package yet (setup.py, setuptools, easy_install, ez_setup? -- my head is spinning), but you can get the file directly from SVN: &lt;a href=&quot;http://python-markdown2.googlecode.com/svn/trunk/markdown2.py&quot;&gt;markdown2.py&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;This is the first project for which I am really using &lt;a href=&quot;http://code.google.com/hosting/&quot;&gt;Google Code project hosting&lt;/a&gt;. I'm really digging it. Nice bug tracker, nice enough wiki (&lt;em&gt;all&lt;/em&gt; wikis should use a source control system as their backend), svn. Goodbye sourceforge.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>open komodo is out</title>
   <link href="http://trentm.com/2007/11/open-komodo-is-out.html"/>
   <updated>2007-11-02T08:22:00-07:00</updated>
   <id>http://trentm.com/2007/11/open-komodo-is-out</id>
   <content type="html">&lt;p&gt;The wraps are finally off &lt;a href=&quot;http://www.openkomodo.com/&quot;&gt;Open Komodo&lt;/a&gt;!&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;source: &lt;a href=&quot;http://svn.openkomodo.com/openkomodo/browse/openkomodo/trunk&quot;&gt;http://svn.openkomodo.com/openkomodo/browse/openkomodo/trunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;grok (an alternative to lxr): &lt;a href=&quot;http://grok.openkomodo.com/source/search?q=koDirs&quot;&gt;http://grok.openkomodo.com/source/search?q=koDirs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wiki: &lt;a href=&quot;http://wiki.openkomodo.com/index.php/Main_Page&quot;&gt;http://wiki.openkomodo.com/index.php/Main_Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mailing lists: &lt;a href=&quot;http://lists.openkomodo.com/mailman/listinfo&quot;&gt;http://lists.openkomodo.com/mailman/listinfo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;irc: irc.mozilla.org #komodo&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Check it out.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Quick build notes:&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;# Get the source
svn co http://svn.openkomodo.com/repos/openkomodo/trunk openkomodo
# Build Mozilla
cd openkomodo/mozilla
python build.py configure -k 1.0 --moz-src=cvs:1.8 --release \
    --no-strip --shared --tools
python build.py distclean all
cd ..
# Build Komodo
export PATH=`pwd`/util/black:$PATH   # Komodo's &quot;bk&quot; build tool
bk configure
bk build
# Run Komodo
bk run
&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;If you have the &lt;a href=&quot;http://svn.openkomodo.com/openkomodo/view/openkomodo/trunk/README.txt&quot;&gt;build prerequisites&lt;/a&gt; setup, you should be able to cut 'n paste the above. (Windows users, use the Windows-specific quick build steps in the README.txt.)&lt;/p&gt;




&lt;p&gt;I have some (longer term) &lt;a href=&quot;http://svn.openkomodo.com/openkomodo/browse/mk/trunk&quot;&gt;plans&lt;/a&gt; to reduce those build steps to:&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;./configure.py
mk
&lt;/code&gt;&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>off to FSOSS</title>
   <link href="http://trentm.com/2007/10/off-to-fsoss.html"/>
   <updated>2007-10-24T08:02:00-07:00</updated>
   <id>http://trentm.com/2007/10/off-to-fsoss</id>
   <content type="html">&lt;p&gt;I'm off to &lt;a href=&quot;http://fsoss.senecac.on.ca/2007/&quot;&gt;FSSOS&lt;/a&gt; in a few hours.  &lt;a href=&quot;http://www.activestate.com/&quot;&gt;We'll&lt;/a&gt; be opening up the Komodo sources next Wednesday, so &lt;a href=&quot;http://blogs.activestate.com/shanec/&quot;&gt;Shane&lt;/a&gt; and I will be there to start the discussion about what &lt;a href=&quot;http://www.activestate.com/openkomodo/&quot;&gt;Open Komodo&lt;/a&gt; and &lt;a href=&quot;http://www.activestate.com/openkomodo/details.plex&quot;&gt;Snapdragon&lt;/a&gt; should focus on to best improve the tool story for open web development. (Currently the Open Komodo sources are available to a small group of mozillians. If you have some ideas and would like to take a peek, let me know and I'll hook you up!)&lt;/p&gt;




&lt;p&gt;I'm hoping to meet a few of the Mozilla folks that will be there: &lt;a href=&quot;http://benjamin.smedbergs.us/blog/2007-10-03/fsoss-2007/&quot;&gt;Benjamin&lt;/a&gt; to ask about breakpad (I want to get breakpad running for Open Komodo and &lt;a href=&quot;http://www.activestate.com/komodoide/&quot;&gt;Komodo&lt;/a&gt; builds), looking forward to &lt;a href=&quot;http://fsoss.senecac.on.ca/2007/presentationDetails.php?presentationID=29&quot;&gt;Mike Beltzner's talk on UE design at Mozilla&lt;/a&gt;, &lt;a href=&quot;http://www.bitstampede.com/2007/10/03/dont-forget-to-fsoss/&quot;&gt;Eric Shephed&lt;/a&gt; to ask about how mozilla handles localization of their docs.&lt;/p&gt;




&lt;p&gt;As well, if any of the mozilla folks involved in the &lt;a href=&quot;http://wiki.mozilla.org/AUS&quot;&gt;AUS&lt;/a&gt; will be there, I'd love to talk with you to compare notes with Komodo's auto-update system.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>html5lib rocks (and a patch to preserve attribute order)</title>
   <link href="http://trentm.com/2007/10/html5lib-rocks-and-a-patch-to-preserve-attribute-order.html"/>
   <updated>2007-10-18T08:08:00-07:00</updated>
   <id>http://trentm.com/2007/10/html5lib-rocks-and-a-patch-to-preserve-attribute-order</id>
   <content type="html">&lt;p&gt;I've been playing with the Python &lt;a href=&quot;http://code.google.com/p/html5lib/&quot;&gt;html5lib package&lt;/a&gt; -- having come across it reading &lt;a href=&quot;http://intertwingly.net/blog/&quot;&gt;Sam Ruby's blog&lt;/a&gt;. What a fantastically useful library!&lt;/p&gt;




&lt;p&gt;Originally my interest in it was with the discussion surrounding &lt;a href=&quot;http://wiki.whatwg.org/wiki/Sanitization_rules&quot;&gt;santization&lt;/a&gt;, and I expect to use it for that later, but today I've been playing with some general parse/filter/serialize code to support some preprocessing of HTML documentation for &lt;a href=&quot;http://www.activestate.com/openkomodo/&quot;&gt;Open Komodo&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;My code looks like this:&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;import sys
from html5lib import treebuilders, treewalkers
from html5lib.serializer.xhtmlserializer import XHTMLSerializer

def filter_play(path):
    p = html5lib.XHTMLParser(tree=treebuilders.getTreeBuilder(&quot;simpletree&quot;))
    f = open(path)
    dom = p.parse(f)

    walker = treewalkers.getTreeWalker(&quot;simpletree&quot;)
    stream = walker(dom)
    #stream = MyPreprocessingFilter()

    s = XHTMLSerializer()
    outputter = s.serialize(stream)

    for item in outputter:
        sys.stdout.write(item)

filter_play(sys.argv[1])
&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;One thing that bugged me a little with the output generated with this is that attributes on HTML elements get sorted, i.e. their order is not preserved. While totally cool for correctness, this reduces the utility of using &lt;code&gt;diff&lt;/code&gt; or similar for comparing input with output. As well, I work on the &lt;a href=&quot;http://www.activestate.com/Products/komodo_ide/&quot;&gt;Komodo&lt;/a&gt; IDE/editor and would like to consider using &lt;code&gt;html5lib&lt;/code&gt; for an HTML reflow/beautifier feature at some point. Preserving attribute order for this will be important.&lt;/p&gt;




&lt;p&gt;To that end, here is &lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/10/html5lib_preserve_attr_order.patch&quot;&gt;a small patch that adds the ability to preserve attribute order&lt;/a&gt; in serialized output.  To use it:&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;You need &lt;a href=&quot;http://pypi.python.org/pypi/Ordered%20Dictionary/&quot;&gt;odict.py&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need to change the above code to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
s = XHTMLSerializer(preserve_attr_order=True)
...
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Obviously this isn't something that would be ready to check-in to &lt;code&gt;html5lib&lt;/code&gt;. Reasons why:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;It only works for the &quot;simpletree&quot; treebuilder/treewalker. I'm not sure if it is feasible/practical to get it to work with some of the others (e.g. dom).&lt;/li&gt;
&lt;li&gt;It unconditionally requires an external non-standard module (&lt;code&gt;odict.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;It should be optional on the parser because (a) using &lt;code&gt;OrderedDict&lt;/code&gt; instead of &lt;code&gt;dict&lt;/code&gt; would presumably have an undesired perf impact and (b) the attribute order normalization could be &lt;em&gt;desirable&lt;/em&gt; for many users.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Maybe a better solution would be a custom &quot;roundtriptree&quot; tree type? Anyway, just throwing this up here to perhaps come back to later. I have to dig into the &lt;code&gt;html5lib&lt;/code&gt; discussion list to see if this has come up before.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>CakePHP view codeintel (autocomplete) in komodo</title>
   <link href="http://trentm.com/2007/10/cakephp-view-codeintel-autocomplete-in-komodo.html"/>
   <updated>2007-10-15T01:48:00-07:00</updated>
   <id>http://trentm.com/2007/10/cakephp-view-codeintel-autocomplete-in-komodo</id>
   <content type="html">&lt;p&gt;It is great to see more and more posts these days about adding functionality to Komodo. Only a few month back, daily blog posts about Komodo tended to be of the &quot;Tried Komodo. Like it. Using it for blah.&quot;. Now blog posts about Komodo are often &quot;Tried Komodo. Like it. Using it for blah. Used the macro or extension system to add blah.&quot;&lt;/p&gt;




&lt;p&gt;For example, &lt;a href=&quot;http://traviscline.com/blog/2007/10/12/komodo-cakephp-view-macros/&quot;&gt;this post by Travis Cline&lt;/a&gt; shows a brilliant little hack to get Komodo's PHP codeintel (autocomplete and calltips) to work with the implicit environment for CakePHP views ('.ctp' files). It is a great example of the kinds of things you can do with Komodo macros.&lt;/p&gt;




&lt;p&gt;Note to self: Look into providing this same functionality via a special CakeViewEnvironment class that does a similar thing and that is attached to any buffer for a CakePHP view. Every &quot;buffer&quot; in Komodo's codeintel system (there is one buffer for each open file and each file used for autocomplete info) has an &quot;env&quot; attribute which is a instance of the &quot;Environment&quot; class. This class defines special runtime environment information -- typically just Komodo preferences and environment variables. However, subclasses can provide other info. An example is the &quot;KoJavaScriptMacroEnvironment&quot; that is attached to a buffer for editing a Komodo JavaScript macro in the editor. This environment class hooks up the Komodo JS API catalog so that you get autocomplete for Komodo JS macro API.&lt;/p&gt;




&lt;p&gt;I have to look into (1) documenting this (when we have the &lt;a href=&quot;http://wiki.openkomodo.com/&quot;&gt;Open Komodo wiki&lt;/a&gt; setup, that'll probably be the right place) and (2) ensuring that extensions can provide these environment classes and do interesting things with them. Currently it might require some custom work on the codeintel engine to hook this up. But codeintel Environment classes are the plan.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>installing hg 0.9.4</title>
   <link href="http://trentm.com/2007/10/installing-hg-094.html"/>
   <updated>2007-10-04T03:20:00-07:00</updated>
   <id>http://trentm.com/2007/10/installing-hg-094</id>
   <content type="html">&lt;p&gt;Cleaning out some notes of mine, it seemed a shame to just throw out notes on installing hg. I'm happy to update this with sections for other platforms and other Linux distros if people send them my way.&lt;/p&gt;




&lt;h2&gt;Installation on Ubuntu (&amp;lt; Gutsy)&lt;/h2&gt;




&lt;p&gt;Note: only Ubuntu Gutsy has hg 0.9.4, and my Ubuntu isn't yet Gutsy.&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;sudo apt-get install python2.4 python2.4-dev
wget http://www.selenic.com/mercurial/release/mercurial-0.9.4.tar.gz
tar xzf mercurial-0.9.4.tar.gz
cd mercurial-0.9.4
sudo make install
which hg    # should be /usr/local/bin/hg
hg debuginstall
&lt;/code&gt;&lt;/pre&gt;




&lt;h2&gt;Installation on Linux (with no package mgmt support):&lt;/h2&gt;




&lt;p&gt;Presumably this works just as well on other Unix-y platforms.&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;# You must have a Python &amp;gt;=2.4 installation and first on your PATH.
cd tmp
wget http://www.selenic.com/mercurial/release/mercurial-0.9.4.tar.gz
tar xzf mercurial-0.9.4.tar.gz
cd mercurial-0.9.4
python setup.py install
hg debuginstall
&lt;/code&gt;&lt;/pre&gt;




&lt;h2&gt;Installation on Mac OS X (using MacPorts):&lt;/h2&gt;




&lt;pre&gt;&lt;code&gt;sudo port selfupdate
sudo port search mercurial
# ensure this is version &amp;gt;= 0.9.4
sudo port install mercurial
&lt;/code&gt;&lt;/pre&gt;




&lt;h3&gt;Troubleshooting : install fails with &quot;Another version of this port (mercurial @0.9.1_0) is already active.&quot;&lt;/h3&gt;




&lt;pre&gt;&lt;code&gt;sudo port uninstall mercurial @0.9.1_0   # the old one
sudo port uninstall mercurial @0.9.4_0   # the broken new one
sudo port install mercurial
&lt;/code&gt;&lt;/pre&gt;




&lt;h2&gt;Installation on other platforms (Windows, Solaris, FreeBSD, ...)&lt;/h2&gt;




&lt;p&gt;Look for &lt;a href=&quot;http://www.selenic.com/mercurial/wiki/index.cgi/BinaryPackages&quot;&gt;an available binary package&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>mercurial needs better end-of-line support</title>
   <link href="http://trentm.com/2007/09/mercurial-needs-better-end-of-line-support.html"/>
   <updated>2007-09-13T09:18:00-07:00</updated>
   <id>http://trentm.com/2007/09/mercurial-needs-better-end-of-line-support</id>
   <content type="html">&lt;p&gt;One real world issue with source control systems is the handling of end-of-line characters in text files. Currently Mercurial pretty much punts. The &lt;a href=&quot;http://hgbook.red-bean.com/hgbookch2.html#x6-290002.2&quot;&gt;hg book says&lt;/a&gt;:&lt;/p&gt;




&lt;blockquote&gt;
Note: The Windows version of Mercurial does not automatically convert line endings between Windows and Unix styles. If you want to share work with Unix users, you must do a little additional configuration work. XXX Flesh this out.
&lt;/blockquote&gt;




&lt;p&gt;The &lt;a href=&quot;http://linux.die.net/man/5/hgrc&quot;&gt;hgrc man page suggests&lt;/a&gt;:&lt;/p&gt;




&lt;blockquote&gt;
    NOTE: the tempfile mechanism is recommended for Windows systems,
    where the standard shell I/O redirection operators often have
    strange effects.  In particular, if you are doing line ending
    conversion on Windows using the popular dos2unix and unix2dos
    programs, you *must* use the tempfile mechanism, as using pipes will
    corrupt the contents of your files.


    Tempfile example:

&lt;pre&gt;
    [encode]
    # convert files to unix line ending conventions on checkin
    **.txt = tempfile: dos2unix -n INFILE OUTFILE


    [decode]
    # convert files to windows line ending conventions when writing
    # them to the working dir
    **.txt = tempfile: unix2dos -n INFILE OUTFILE
&lt;/pre&gt;
&lt;/blockquote&gt;




&lt;p&gt;However (1) unix2dos and dos2unix are generally not available on Windows machines and (2) if dos2unix &lt;em&gt;isn't&lt;/em&gt; available the &quot;encoding&quot; here will &lt;strong&gt;silently wipe out your file&lt;/strong&gt; to empty content on checkin.&lt;/p&gt;




&lt;p&gt;How is Mozilla handling this in their hg repository? Is it mandated that new files added on Windows use Unix line endings or is some kind of conversion for Windows attempted?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>patch for &#8220;custom action&#8221; for mozilla updater</title>
   <link href="http://trentm.com/2007/09/patch-for-custom-action-for-mozilla-updater.html"/>
   <updated>2007-09-10T09:07:00-07:00</updated>
   <id>http://trentm.com/2007/09/patch-for-custom-action-for-mozilla-updater</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/09/moz_updater_customaction.patch&quot;&gt;Here is a patch&lt;/a&gt; (against a slightly out of date updater.cpp on the Mozilla 1.8 branch) that would add support for a:&lt;/p&gt;




&lt;pre&gt;customaction &quot;relative-path-to-executable&quot;&lt;/pre&gt;




&lt;p&gt;action in the &quot;update.manifest&quot; for a partial or full update (&lt;code&gt;.mar&lt;/code&gt; file) for the &lt;a href=&quot;http://wiki.mozilla.org/AUS&quot;&gt;Mozilla update system&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I'm just chucking this up here quickly for lack of a better place to put it right now. Komodo uses the Mozilla update system and will possibly need this patch at some point. &lt;/p&gt;




&lt;p&gt;Limitations: &lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;It ignores the return value of the spawned executable.&lt;/li&gt;
&lt;li&gt;It doesn't support arguments to the executable.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>an intro to Komodo extensions</title>
   <link href="http://trentm.com/2007/09/an-intro-to-komodo-extensions.html"/>
   <updated>2007-09-06T07:33:00-07:00</updated>
   <id>http://trentm.com/2007/09/an-intro-to-komodo-extensions</id>
   <content type="html">&lt;p&gt;Komodo uses the Mozilla extension mechanism -- same &lt;code&gt;.xpi&lt;/code&gt; files as Firefox to install an extension, &lt;a href=&quot;http://developer.mozilla.org/en/docs/Bundles&quot;&gt;same kind of bundle content in an extension&lt;/a&gt;. However, Komodo adds a number of &quot;hooks&quot; that can be used to customize Komodo with an extension (see the end of this post).&lt;/p&gt;




&lt;p&gt;In Komodo 4.2 (currently in beta) we've been working at improving the extension story. Part of my work there has been to improve the tools for building them. To that end Komodo 4.2 now includes a sort of &quot;SDK&quot; with a few tools:&lt;/p&gt;




&lt;dl&gt;
&lt;dt&gt;koext&lt;/dt&gt;
&lt;dd&gt;A tool for building and generating stubs for Komodo extensions. A recently added a (very brief) &lt;a href=&quot;http://community.activestate.com/forum/introduction-building-komodo-extension&quot;&gt;intro to using koext&lt;/a&gt; to Komodo's extension forum.&lt;/dd&gt;
&lt;dt&gt;luddite&lt;/dt&gt;
&lt;dd&gt;A tool for working with Komodo's UDL (User-Defined Languages) system. The UDL system (new in Komodo 4.0) provides a way to define lexers for new languages. Lexers are used mainly for syntax coloring, but can also be used by Komodo Code Intelligence system for provide autocomplete and calltips. Eric wrote up &lt;a href=&quot;http://blogs.activestate.com/ericp/2007/01/kid_adding_a_ne.html&quot;&gt;a long intro to UDL&lt;/a&gt; a while back. UDL currently isn't for the faint of heart, but it provides an execellent system for robust lexing of code languages -- in particular it supports *multi-language* code (e.g. JavaScript in HTML, Ruby in RHTML, CSS in Django HTML).&lt;/dd&gt;
&lt;dt&gt;codeintel&lt;/dt&gt;
&lt;dd&gt;A tool to help writing a language support for Komodo's Code Intelligence system. I'll write more on this later.&lt;/dd&gt;
&lt;/dl&gt;




&lt;p&gt;These tools are all works in progress but they are used internally as part of normal Komodo development, so should be usable for Komodo extension authors.&lt;/p&gt;




&lt;p&gt;Komodo's &lt;code&gt;koext&lt;/code&gt; tool briefly describes all the current Komodo extension &quot;hooks&quot;:&lt;/p&gt;




&lt;pre&gt;
$ koext help hooks

  Many parts of Komodo's functionality can be extended with a
  Komodo extension. We call those &quot;hooks&quot; here. The following is
  a list of all extension hooks that Komodo currently supports.

  The &quot;source tree files&quot; sections below are conventions for
  placement of sources files. If you use these conventions, then
  `koext build' will automatically be able to build your extension
  properly.

  chrome
      Chrome is the collective term for XUL (content), JavaScript
      (content), CSS (skin), images (skin) and localized files
      (locale, typically DTDs) that can be used to extend the
      Komodo UI. This works in Komodo extensions in exactly the
      same way as any other Mozilla-base application (such as
      Firefox). See `koext help chrome' for some tips.

      source tree files:
          chrome.manifest
          content/            # XUL overlays, dialogs and JavaScript
          skin/               # CSS
          locale/             # localized files (typically DTDs)

  XPCOM components
      XPCOM components are placed here. These can be written in
      Python or JavaScript. (C++-based components are possible
      as well, but currently the Komodo SDK does not support
      building them.)

      source files:
          components/
              *.idl           # interface definitions
              *.py            # PyXPCOM components
              *.js            # JavaScript XPCOM components

  templates
      A file hierarchy under here maps into Komodo's &quot;New File&quot;
      dialog. For example, &quot;templates/Common/Foo.pl&quot; will result
      in a new Perl file template called &quot;Foo&quot; in the &quot;Common&quot;
      folder of the &quot;New File&quot; dialog.

      source files:
          templates/

  lexers
      Komodo User-Defined Languages (UDL) system provides a
      facility for writing regular expression, state-based lexers
      for new languages (including for multi-lang languages).
      &quot;.lexres&quot; files are built from &quot;.udl&quot; source files with
      the &quot;luddite&quot; tool (in this SDK). See `koext help udl' and
      Komodo's UDL documentation for more details.

      source files:
          udl/
              *-mainlex.udl   # a .lexres will be build for each of these
              *.udl           # support files to be included by
                              #   &quot;*-mainlex.udl&quot; files

  XML catalogs
      An extension can include an XML catalog (and associates
      schemas) defining namespace to schema mappings for XML
      autocomplete.

      source files:
          catalog.xml         # Note: This may move to xmlcatalogs/...

  API catalogs
      An extension can include API catalogs to provide autocomplete
      and calltips for 3rd party libraries. An API catalog is a CIX
      file (an XML dialect) that defines the API of a
      library/project/toolkit.

      source files:
          apicatalogs/        # .cix files here will be included
                              #   in the API catalog list in the
                              #   &quot;Code Intelligence&quot; prefs panel

  Python modules
      An extension can supply Python modules by placing then in
      the &quot;pylib&quot; directory of the extension. This &quot;pylib&quot; directory
      will be appended to Komodo's Python runtime sys.path.

      source files:
          pylib/

  codeintel
      An extension can provide the Code
      Intelligence logic (for autocomplete and calltips, for
      &quot;Jump to Definition&quot; and for the Code Browser in Komodo IDE)
      for new languages.

      source files:
          pylib/              # lang_*.py files here are picked up
                              #   by the codeintel system.
&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>open komodo and the code</title>
   <link href="http://trentm.com/2007/09/open-komodo-and-the-code.html"/>
   <updated>2007-09-06T01:57:00-07:00</updated>
   <id>http://trentm.com/2007/09/open-komodo-and-the-code</id>
   <content type="html">&lt;p&gt;Yesterday we (ActiveState) announced &lt;a href=&quot;http://www.activestate.com/openkomodo/&quot;&gt;Open Komodo&lt;/a&gt;, an open-source project seeded with much of the core of &lt;a href=&quot;http://www.activestate.com/Products/komodo_edit/&quot;&gt;Komodo Edit&lt;/a&gt; and &lt;a href=&quot;http://www.activestate.com/Products/komodo_ide/&quot;&gt;Komodo IDE&lt;/a&gt; with the goals of produce a platform/framework for and (codename Komodo Snapdragon) an IDE for client-side open web development. &lt;/p&gt;




&lt;p&gt;That's a mouthful. &lt;a href=&quot;http://blogs.activestate.com/shanec/2007/09/holy-komodo.html&quot;&gt;Shane&lt;/a&gt; and &lt;a href=&quot;http://ascher.ca/blog/2007/09/05/open-komodo-thoughts/&quot;&gt;David&lt;/a&gt; have done a good job giving some wider perspective on what the Open Komodo project could mean (if all goes well). David went so far as to invent new language to make his points.&lt;/p&gt;




&lt;p&gt;Some quick thoughts from a coder's perspective:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The source will be available in a &lt;a href=&quot;http://www.selenic.com/mercurial/wiki/&quot;&gt;Mercurial&lt;/a&gt; repository in (quoting Shane paraphrasing Mike Shaver) &quot;Two F**king Months!&quot;. Early November -- or earlier if we can.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo is a Mozilla-based application with the added heavy use of &lt;a href=&quot;http://developer.mozilla.org/en/docs/PyXPCOM&quot;&gt;PyXPCOM&lt;/a&gt; for much of the core logic. That means the app comes together like this: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get a slightly tweaked mozilla build (C++, JavaScript, XUL).&lt;/li&gt;
&lt;li&gt;Get a slightly tweaked Python build (C).&lt;/li&gt;
&lt;li&gt;Add a bunch of core logic (Python). For example, the guts of Komodo's Find/Replace system is written in Python -- using Python's unicode-aware regular expression engine.&lt;/li&gt;
&lt;li&gt;Add Komodo chrome (XUL, JavaScript, CSS, DTDs).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this means is that to work on and add significant functionality to Komodo, all you tend to need to know is XUL, JavaScript and Python. From early on in Komodo's development we've felt that this is one of Komodo's aces in the hole: &lt;strong&gt;developing in the dynamic languages is so much faster&lt;/strong&gt;. I remember David Ascher making the comment way back that if Subversion had been written in Python, it would have been ready years sooner. And now two of the primary DVCS, Mercurial and Bazaar, are written in Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo uses the same extension mechanisms as Firefox. It is easy to build a .xpi to add functionality to Komodo. We really hope that a community of Komodo extension authors will develop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo builds and runs on Windows, Linux and Mac OS X. Given some work there is little reason the Open Komodo code base couldn't be made to run well on Solaris, BSD, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If any of this sounds interesting to you as an open-source tinkerer, then give &lt;a href=&quot;http://www.activestate.com/Products/komodo_edit/&quot;&gt;Komodo Edit&lt;/a&gt; or &lt;a href=&quot;http://www.activestate.com/store/evallicense.aspx?PliGuid=8E08763F-FC3D-456F-BE10-F0D725F660F8&amp;&quot;&gt;Komodo IDE a try&lt;/a&gt;. The first app that will come out of the Open Komodo project (Komodo Snapdragon) will look and feel a lot like them.&lt;/p&gt;




&lt;p&gt;In subsequent posts, and especially once the source code repository is up, I plan to blog here about Komodo's internals.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>mini-mick cometh</title>
   <link href="http://trentm.com/2007/09/mini-mick-cometh.html"/>
   <updated>2007-09-05T06:40:00-07:00</updated>
   <id>http://trentm.com/2007/09/mini-mick-cometh</id>
   <content type="html">&lt;div class=&quot;left&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/1258854957/&quot; title=&quot;mini-mick&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1057/1258854957_370f46ceee_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;ewan and dad&quot; /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;div style=&quot;clear: both&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://trentmick.blogspot.com/2007/02/mini-mick_8767.html&quot;&gt;Mini-mick&lt;/a&gt; (a.k.a. Ewan Mick) arrived about three weeks ago. I am so happy to have him and proud of my wife Alli.&lt;/p&gt;&lt;p&gt;In some ways, having a child is like a little boy's dream come true: farts and poos are acceptable entertainment!&lt;/p&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>building MSI patch packages (.msp) with WiX</title>
   <link href="http://trentm.com/2007/05/building-msi-patch-packages-msp-with-wix.html"/>
   <updated>2007-05-29T03:32:00-07:00</updated>
   <id>http://trentm.com/2007/05/building-msi-patch-packages-msp-with-wix</id>
   <content type="html">&lt;p&gt;This post includes a complete and concrete example of building an MSI patch package (a .msp file to upgrade an existing .msi installation) with WiX.&lt;/p&gt;




&lt;h3&gt;Background&lt;/h3&gt;




&lt;p&gt;I'm responsible for building the &lt;a href=&quot;http://www.activestate.com/products/activepython/&quot;&gt;ActivePython&lt;/a&gt; and &lt;a href=&quot;http://www.activestate.com/products/komodo_ide/&quot;&gt;Komodo&lt;/a&gt; installers at &lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;. On Windows we build MSI packages for installation.&lt;/p&gt;




&lt;p&gt;Currently I'm investigating auto-update support for Komodo 4.2. Because Komodo is based on Firefox/Mozilla we can benefit from the excellent &lt;a href=&quot;http://wiki.mozilla.org/Software_Update&quot;&gt;Mozilla update system&lt;/a&gt; (I'll write another post about our experience with it). However, integrating with an MSI-based installation isn't something the Mozilla update system does out of the box: Firefox and Thunderbird don't use MSI for their installers (they use NSIS), hence I suspect working with MSI was never a design consideration.&lt;/p&gt;




&lt;p&gt;While working out how to best marry MSI and Moz update, I investigated producing MSI patch packages (.msp files) for Komodo updates. MSI is a complex and complicated technology (it would be nice if the latter, at least, wasn't the case). Back in the day I used InstallShield for building our MSI packages, but now &lt;a href=&quot;http://wix.sourceforge.net/&quot;&gt;WiX&lt;/a&gt; is the best way to build .msi's -- by far.  WiX helps a lot, but building appropriate MSI packages is still quite difficult. The following two pages helped me get to successfully building .msp's. Hopefully this concrete example will help others too.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wix.sourceforge.net/manual-wix2/patch_building.htm&quot;&gt;Patch Building&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tramontana.co.hu/wix/lesson4.php&quot;&gt;Wix Tutorial - Part 4&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;ActiveFoo 1.0&lt;/h3&gt;




&lt;p&gt;For this example we'll build .msi installers for versions 1.0.0 and 1.0.1 of the the mythical &quot;ActiveFoo&quot; app (&quot;activefoo-1.0.0.msi&quot; and &quot;activefoo-1.0.1.msi&quot;). Then we'll build a '.msp' that will upgrade a 1.0.0 install to 1.0.1. We'll have the following files:&lt;/p&gt;




&lt;pre&gt;
1.0.0/
    activefoo.wxs       # This describes &quot;activefoo-1.0.0.msi&quot;
    config.wxi
    installimage/       # The ActiveFoo install image
        CHANGES.txt
        foo.exe
        README.txt
1.0.1/
    activefoo.wxs       # This describes &quot;activefoo-1.0.1.msi&quot;
    config.wxi
    installimage/       # The install image with changes for 1.0.1
        CHANGES.txt
        README.txt
    upgrade-1.0.0.wxs   # This describes the '.msp'.
make.py                 # 'python make.py' to build everything
README.txt
&lt;/pre&gt;




&lt;p&gt;Here is a &lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/wix_and_msp.zip&quot;&gt;zip of the working files&lt;/a&gt; for this example, if you'd like to play along.&lt;/p&gt;




&lt;p&gt;We have a simple install image with three files (foo.exe, README.txt and CHANGES.txt). The WiX code to build an installer for ActiveFoo 1.0.0 is &lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.0/activefoo.wxs&quot;&gt;1.0.0/activefoo.wxs&lt;/a&gt;:&lt;/p&gt;




&lt;pre&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;

&amp;lt;?include config.wxi ?&amp;gt;

&amp;lt;Wix xmlns=&quot;http://schemas.microsoft.com/wix/2003/01/wi&quot;&amp;gt;
  &amp;lt;Product Name=&quot;$(var.ProductName)&quot; Id=&quot;$(var.ProductCode)&quot;
           Language=&quot;1033&quot; Codepage=&quot;1252&quot; Version=&quot;$(var.ProductVersion)&quot;
           Manufacturer=&quot;Acme&quot; UpgradeCode=&quot;$(var.UpgradeCode)&quot;&amp;gt;

    &amp;lt;Package Id=&quot;????????-????-????-????-????????????&quot; Keywords=&quot;Installer&quot;
      Description=&quot;$(var.ProductName)&quot;
      Comments=&quot;blah blah&quot; Manufacturer=&quot;Acme&quot;
      InstallerVersion=&quot;200&quot; Languages=&quot;1033&quot; Compressed=&quot;yes&quot;
      SummaryCodepage=&quot;1252&quot; /&amp;gt;

    &amp;lt;Media Id=&quot;1&quot; Cabinet=&quot;media.cab&quot; EmbedCab=&quot;yes&quot; /&amp;gt;

    &amp;lt;!-- Define some of the dir-structure. --&amp;gt;
    &amp;lt;Directory Id=&quot;TARGETDIR&quot; Name=&quot;SourceDir&quot;&amp;gt;
      &amp;lt;Directory Id=&quot;ProgramFilesFolder&quot; Name=&quot;PFILES&quot;&amp;gt;
        &amp;lt;Directory Id=&quot;INSTALLDIR&quot; Name=&quot;$(var.InstallId)&quot;
                   LongName=&quot;$(var.InstallName)&quot; /&amp;gt;
      &amp;lt;/Directory&amp;gt;
    &amp;lt;/Directory&amp;gt;

    &amp;lt;!-- Define the feature hierarchy (just one feature in this simple
         example). --&amp;gt;
    &amp;lt;Property Id=&quot;INSTALLLEVEL&quot; Value=&quot;1000&quot; /&amp;gt;
    &amp;lt;Feature Id=&quot;core&quot; Title=&quot;ActiveFoo&quot; Description=&quot;The Foo core&quot;
             Level=&quot;1&quot;&amp;gt;
      &amp;lt;ComponentRef Id=&quot;MainExe&quot; /&amp;gt;
      &amp;lt;ComponentRef Id=&quot;ReadMeFiles&quot; /&amp;gt;
    &amp;lt;/Feature&amp;gt;

    &amp;lt;!-- Define all the components. --&amp;gt;
    &amp;lt;DirectoryRef Id=&quot;INSTALLDIR&quot;&amp;gt;
      &amp;lt;Component Id=&quot;MainExe&quot; Guid=&quot;6ee6fda3-6f50-47bf-99b9-6031c720428e&quot;&amp;gt;
        &amp;lt;File Id=&quot;MainExe&quot; Name=&quot;foo.exe&quot; DiskId=&quot;1&quot;
              src=&quot;installimage\foo.exe&quot; Vital=&quot;yes&quot; /&amp;gt;
      &amp;lt;/Component&amp;gt;
      &amp;lt;Component Id=&quot;ReadMeFiles&quot; DiskId=&quot;1&quot;
                 Guid=&quot;8f2255f3-3eaf-4c82-9688-3545cd9b2018&quot;&amp;gt;
        &amp;lt;File Id=&quot;README.txt&quot; Name=&quot;README.txt&quot;
              src=&quot;installimage\README.txt&quot; /&amp;gt;
        &amp;lt;File Id=&quot;CHANGES.txt&quot; Name=&quot;CHANGES.txt&quot;
              src=&quot;installimage\CHANGES.txt&quot; /&amp;gt;
      &amp;lt;/Component&amp;gt;
    &amp;lt;/DirectoryRef&amp;gt;

  &amp;lt;/Product&amp;gt;
&amp;lt;/Wix&amp;gt;
&lt;/pre&gt;




&lt;p&gt;with some configuration variables included from &lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.0/config.wxi&quot;&gt;1.0.0/config.wxi&lt;/a&gt;:&lt;/p&gt;




&lt;pre&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;Include&amp;gt;
  &amp;lt;?define ProductCode = &quot;cdc5e50f-b490-4a37-8ff6-22e3cb3d690e&quot; ?&amp;gt;
  &amp;lt;?define UpgradeCode = &quot;ed340ed8-aa91-4bf6-9dcf-d7f6f4d43737&quot; ?&amp;gt;

  &amp;lt;?define ProductName = &quot;ActiveFoo&quot; ?&amp;gt;
  &amp;lt;?define InstallName = &quot;ActiveFoo&quot; ?&amp;gt;
  &amp;lt;?define InstallId = &quot;AFoo10&quot; ?&amp;gt;
  &amp;lt;?define ProductVersion = &quot;1.0.0&quot; ?&amp;gt;
  &amp;lt;?define ProductURL = &quot;http://www.example.com/products/activefoo/&quot; ?&amp;gt;
&amp;lt;/Include&amp;gt;
&lt;/pre&gt;




&lt;p&gt;(Note that this WiX project is simplistic. In a real world WiX project you'd
likely have a &lt;em&gt;UI&lt;/em&gt; element for a user UI, define Add/Remove Programs -- ARP
-- properties, etc.)&lt;/p&gt;




&lt;p&gt;Use the provided &quot;make.py&quot; script to build &quot;activefoo-1.0.0.msi&quot;:&lt;/p&gt;




&lt;pre class=&quot;dos&quot;&gt;
C:\tmp\wix_and_msp&amp;gt; python make.py -v 100
INFO:make:build target '100'
DEBUG:make:running 'candle -nologo activefoo.wxs' in '1.0.0'
activefoo.wxs
DEBUG:make:running 'light -nologo -o ../activefoo-1.0.0.msi activefoo.wixobj' in '1.0.0'
INFO:make:'activefoo-1.0.0.msi' created
&lt;/pre&gt;




&lt;p&gt;and install it. You should now have a &quot;ActiveFoo&quot; folder in your &quot;Program Files&quot;.&lt;/p&gt;




&lt;h3&gt;ActiveFoo 1.0.1&lt;/h3&gt;




&lt;p&gt;Version 1.0.1 has the following changes:&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The ProductVersion is incremented to 1.0.1. We aren't change the ProductCode
so this qualifies in MSI parlance as a
&quot;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/aa370579.aspx&quot;&gt;minor
upgrade&lt;/a&gt;&quot;, as opposed to a &quot;small update&quot; or a &quot;major upgrade&quot;).&lt;/li&gt;
&lt;li&gt;We've added a note to &quot;CHANGES.txt&quot; for the new release.&lt;/li&gt;
&lt;li&gt;We've removed the &quot;foo.exe&quot; file from the install image. This is so we can
see how file removal can be accomplished with a &quot;minor upgrade&quot;. There is
a lot of documentation out there than says that file removal can't be done
with an MSI minor upgrade. We'll see that that isn't true. I haven't seen
any justification for why minor upgrades shouldn't remove files.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Normally, for these changes, the only updates to the WiX sources to build
&quot;activefoo-1.0.1.msi&quot; would be to (a) update the &quot;ProductVersion&quot; string and
(b) remove the &lt;em&gt;File&lt;/em&gt; and &lt;em&gt;Component&lt;/em&gt; elements for &quot;foo.exe&quot;. However, working
from this comment in
&lt;a href=&quot;http://www.installsite.org/files/iswi/Upgrading.html&quot;&gt;Minor and
Major Upgrades Using IPWI&lt;/a&gt;:&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;If you need to remove any files or registry data during the upgrade, add
records to the RemoveFile or RemoveRegistry tables of the newer database.
&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;I've found that to get WiX to put a &lt;em&gt;RemoveFile&lt;/em&gt; entry for, in this case,
&quot;foo.exe&quot;, I needed to add an explicit &lt;em&gt;RemoveFile&lt;/em&gt; element:&lt;/p&gt;




&lt;pre&gt;
      ...
      &amp;lt;Component Id=&quot;MainExe&quot; Guid=&quot;6ee6fda3-6f50-47bf-99b9-6031c720428e&quot;&amp;gt;
        &amp;lt;!-- Note: This is how to explicitly remove files in an update. --&amp;gt;
        &amp;lt;RemoveFile Id=&quot;removefile1&quot; On=&quot;install&quot; Name=&quot;foo.exe&quot;/&amp;gt;
      &amp;lt;/Component&amp;gt;
      ...
&lt;/pre&gt;




&lt;p&gt;The ProductVersion we updated in &quot;&lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.1/config.wxi&quot;&gt;1.0.1\config.wxi&lt;/a&gt;&quot;:&lt;/p&gt;




&lt;pre class=&quot;dos&quot;&gt;
C:\tmp\wix_and_msp&amp;gt;diff -u 1.0.0\config.wxi 1.0.1\config.wxi
--- 1.0.0\config.wxi    Mon May 28 17:33:01 2007
+++ 1.0.1\config.wxi    Mon May 28 17:33:03 2007
@@ -6,7 +6,7 @@
   &amp;lt;?define ProductName = &quot;ActiveFoo&quot; ?&amp;gt;
   &amp;lt;?define InstallName = &quot;ActiveFoo&quot; ?&amp;gt;
   &amp;lt;?define InstallId = &quot;AFoo10&quot; ?&amp;gt;
-  &amp;lt;?define ProductVersion = &quot;1.0.0&quot; ?&amp;gt;
+  &amp;lt;?define ProductVersion = &quot;1.0.1&quot; ?&amp;gt;
   &amp;lt;?define ProductURL = &quot;http://www.example.com/products/activefoo/&quot; ?&amp;gt;
 &amp;lt;/Include&amp;gt;
&lt;/pre&gt;




&lt;p&gt;Now we can build &quot;activefoo-1.0.1.msi&quot;:&lt;/p&gt;




&lt;pre class=&quot;dos&quot;&gt;
C:\tmp\wix_and_msp&amp;gt; python make.py -v 101
INFO:make:build target '101'
DEBUG:make:running 'candle -nologo activefoo.wxs' in '1.0.1'
activefoo.wxs
DEBUG:make:running 'light -nologo -o ../activefoo-1.0.1.msi activefoo.wixobj' in '1.0.1'
INFO:make:'activefoo-1.0.1.msi' created
&lt;/pre&gt;




&lt;h3&gt;ActiveFoo 1.0.1 update&lt;/h3&gt;




&lt;p&gt;The basic process for building a '.msp' is:&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Get an administrative install of the old version. I hadn't known this
before: An administrative install effective just extracts the file payload
from an .msi into a given directory leaving a lighter .msi with just the
MSI database tables. AFAIK this is the same thing as if you had built an
&quot;uncompressed MSI&quot; -- i.e. one in which &lt;code&gt;&amp;lt;Package Compressed='no'
.../&amp;gt;&lt;/code&gt;. &lt;em&gt;make.py&lt;/em&gt; will put this in &quot;1.0.1\build\before&quot;.&lt;/li&gt;
&lt;li&gt;Get an administrative install of the new version. &lt;em&gt;make.py&lt;/em&gt; will put this
in &quot;1.0.1\build\after&quot;.&lt;/li&gt;
&lt;li&gt;Write a WiX file that describes the patch.&lt;/li&gt;
&lt;li&gt;Compile to a &lt;em&gt;Patch Creation Properties&lt;/em&gt; (.pcp) file with WiX.&lt;/li&gt;
&lt;li&gt;Compile to a '.msp' file with the &quot;msimsp.exe&quot; utility from the MSI SDK
(Part of the Microsoft Platform SDK).&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Here is a our WiX file describing the patch (&lt;a href=&quot;http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.1/upgrade-1.0.0.wxs&quot;&gt;1.0.1\upgrade-1.0.0.wxs&lt;/a&gt;) with comments inline:&lt;/p&gt;




&lt;pre&gt;
&amp;lt;?xml version='1.0' encoding='windows-1252'?&amp;gt;

&amp;lt;Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'&amp;gt;
  &amp;lt;!-- TODO: Update PatchCreation Id for each new patch.
             Can we just use WiX's '????????-????-????-????-????????????' ? --&amp;gt;
  &amp;lt;PatchCreation Id='e8ee6400-7877-47e4-9519-ce17e3f1d59b'
                 CleanWorkingFolder='yes'
                 WholeFilesOnly='no'
                 AllowMajorVersionMismatches='yes'
                 AllowProductCodeMismatches='no'&amp;gt;

    &amp;lt;PatchInformation Description=&quot;ActiveFoo 1.0.1 Patch&quot;
                      Comments='blah blah'
                      Manufacturer='Acme'
                      Languages='1033'
                      Compressed='yes' /&amp;gt;

    &amp;lt;!-- TODO: Play with other values of 'Classification'. Does msiexec's
         behaviour actually change for different values? --&amp;gt;
    &amp;lt;PatchMetadata Description=&quot;ActiveFoo 1.0.1 Patch&quot;
                   DisplayName=&quot;ActiveFoo 1.0.1 Patch&quot;
                   TargetProductName='ActiveFoo 1.0'
                   ManufacturerName='Acme'
                   MoreInfoURL='http://www.example.com/products/activefoo'
                   Classification='Update'
                   AllowRemoval='yes' /&amp;gt;

    &amp;lt;!-- From &amp;lt;http://wix.sourceforge.net/manual-wix2/patch_building.htm&amp;gt;
         &quot;&quot;&quot;
         The SequenceStart value is influenced by the number of files that
         the previous patch delivered, as well as the number of files that
         this patch will deliver. This tells PatchWiz.dll to start assigning
         File sequence numbers from this number. So if this patch ships 11
         files, and the next patch uses a SequenceStart of 1020, it will step
         on the 11th file's assigned sequence number. In this case the next
         patch would use a SequenceStart of 1030, and 03 as the patch id to
         avoid conflicts with this patch. This scheme helps prevent this by
         coordinating the SequenceStart (file sequence numbers) with the
         patch sequence number. Also, note that the SequenceStart of the
         first patch must be greater than the number of files in the original
         installation. If the original installation contained more than 1000
         files(rare), then the SequenceStart for the first patch must be set
         to a higher value (e.g 2010.)
         &quot;&quot;&quot;
    --&amp;gt;
    &amp;lt;!-- Name is max 8 chars. *How* unique does this have to be? --&amp;gt;
    &amp;lt;Family Name='Fam101' DiskId='2' MediaSrcProp='AFoo10_2_1_01'
            SequenceStart='1010'&amp;gt;
      &amp;lt;UpgradeImage Id='AFoo10Upgrade'
                    SourceFile='after\activefoo-1.0.1.msi'&amp;gt;
        &amp;lt;TargetImage Id='AFoo10Target' Order='1' IgnoreMissingFiles='no'
                     SourceFile='before\activefoo-1.0.0.msi' /&amp;gt;
      &amp;lt;/UpgradeImage&amp;gt;
    &amp;lt;/Family&amp;gt;

    &amp;lt;TargetProductCode Id='cdc5e50f-b490-4a37-8ff6-22e3cb3d690e' /&amp;gt;
  &amp;lt;/PatchCreation&amp;gt;
&amp;lt;/Wix&amp;gt;
&lt;/pre&gt;




&lt;p&gt;Use &lt;em&gt;make.py&lt;/em&gt; to build the patch:&lt;/p&gt;




&lt;pre class=&quot;dos&quot;&gt;
C:\tmp\wix_and_msp&amp;gt; python make.py -v 101_upgrade
INFO:make:build target '101_upgrade'
DEBUG:make:running 'msiexec /a activefoo-1.0.0.msi TARGETDIR=C:\tmp\wix_and_msp\1.0.1\build\before'
DEBUG:make:running 'msiexec /a activefoo-1.0.1.msi TARGETDIR=C:\tmp\wix_and_msp\1.0.1\build\after'
        1 file(s) copied.
DEBUG:make:running 'candle -nologo upgrade.wxs' in 'C:\tmp\wix_and_msp\1.0.1\build'
upgrade.wxs
DEBUG:make:running 'light -nologo upgrade.wixobj' in 'C:\tmp\wix_and_msp\1.0.1\build'
DEBUG:make:running '&quot;C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patching\MsiMsp.Exe&quot; -s upgrade.pcp -p C:\tmp\wix_and_msp\activefoo-1.0.1-upgrade-1.0.0.msp -l upgrade.log' in 'C:\tmp\wix_and_msp\1.0.1\build'
INFO:make:'activefoo-1.0.1-upgrade-1.0.0.msp' created
INFO:make:To install the update, run:
  msiexec /p activefoo-1.0.1-upgrade-1.0.0.msp REINSTALL=ALL REINSTALLMODE=omus
&lt;/pre&gt;




&lt;p&gt;You should now be able to install &quot;activefoo-1.0.1-upgrade-1.0.0.msp&quot; over an
ActiveFoo 1.0.0 installation to upgrade to ActiveFoo 1.0.1. Note that some docs
out there mention an MSI bug preventing installation of a '.msp' by double-clicking
on that. I've found that I &lt;em&gt;am&lt;/em&gt; able to install by double-clicking on my WinXP box
with Windows Installer V 3.01.4000.1823.&lt;/p&gt;




&lt;h3&gt;Notes/Limitations&lt;/h3&gt;




&lt;ol&gt;
&lt;li&gt;Having to explicitly put in &lt;em&gt;RemoveFile&lt;/em&gt; elements to ensure upgrades remove
them is a pain. It would be nice if WiX inferred that automatically. WiX v3 is
&lt;a href=&quot;http://wix.sourceforge.net/faq.html&quot;&gt;slated to include&lt;/a&gt; &quot;Patch
creation support&quot; and &quot;ClickThrough&quot;. Perhaps these will go a long way to
making all of this easier.&lt;/li&gt;
&lt;li&gt;There are many variables to tweak here that I haven't played with. I haven't
deployed any .msp's built as describe here to users on any scale so I
there may be gremlins lurking in this procedure.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;I'd be happy to hear about others' experiences working with WiX and MSI patches.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>logging in to Gov. of Canada's site an exercise in frustration</title>
   <link href="http://trentm.com/2007/02/logging-in-to-gov-of-canadas-site-an-exercise-in-frustration.html"/>
   <updated>2007-02-24T06:17:00-08:00</updated>
   <id>http://trentm.com/2007/02/logging-in-to-gov-of-canadas-site-an-exercise-in-frustration</id>
   <content type="html">&lt;p&gt;I love Canada. Couldn't pick a better place to live. And I suppose if the following exercise is one of the worst annoyances in recent memory when dealing with my federal government, then that is a good thing.&lt;/p&gt;




&lt;p&gt;How:&lt;/p&gt;




&lt;div&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/401178355/&quot; title=&quot;IE7/Win not supported&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/178/401178355_ef58c8b94c_m.jpg&quot; width=&quot;240&quot; height=&quot;197&quot; alt=&quot;Canada Revenue unsupport browser 3: IE7/Win&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;p&gt;pray:&lt;/p&gt;




&lt;div&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/401178352/&quot; title=&quot;Firefox 2/Win not supported&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/142/401178352_199f4cba47_m.jpg&quot; width=&quot;240&quot; height=&quot;204&quot; alt=&quot;Canada Revenue unsupported browser 2: Firefox 2/Win&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;p&gt;tell: &lt;/p&gt;




&lt;div&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/401173412/&quot; title=&quot;Safari 2 not supported&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/185/401173412_66e3a5b7d1_m.jpg&quot; width=&quot;240&quot; height=&quot;189&quot; alt=&quot;Canada Revenue unsupported browser 1: Safari 2&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;p&gt;am I meant to login to the Canada Revenue site to change my address? It is a good thing that &lt;em&gt;&lt;a href=&quot;http://www.cra-arc.gc.ca/agency/menu-e.html&quot;&gt;you&lt;/a&gt;&lt;/em&gt; owe &lt;em&gt;me&lt;/em&gt; money this year, or it would probably be easier for me to setup a website for &lt;em&gt;you&lt;/em&gt; to login and get my tax information.&lt;/p&gt;




&lt;p&gt;Computer programming is my day job and I happen to have access to a lot of machines -- one of which is an &lt;em&gt;old&lt;/em&gt; Windows 2000 machine that still has IE 6 on it.  I was able to login to the epass system in this browser. However, I suspect that a lot of your users will not be able to login the moment they follow Microsoft's Windows Update prompts to upgrade from IE6 to IE7.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>mini-mick</title>
   <link href="http://trentm.com/2007/02/mini-mick.html"/>
   <updated>2007-02-12T05:50:00-08:00</updated>
   <id>http://trentm.com/2007/02/mini-mick</id>
   <content type="html">&lt;div class=&quot;left&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/380239143/&quot; title=&quot;mini-mick&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/129/380239143_b182571cb8_m.jpg&quot; width=&quot;240&quot; height=&quot;162&quot; alt=&quot;ultrasound 1&quot; /&gt;&lt;/a&gt;&lt;/div&gt;




&lt;div style=&quot;clear: both&quot;&gt;
Alli and I are happy to announce the upcoming birth of mini-mick (due
mid-August sometime). Seeing the (6cm) foetus kick during our recent
ultrasound visit was quite an experience. I am scared and excited.
&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo Planet and Yahoo Pipes</title>
   <link href="http://trentm.com/2007/02/komodo-planet-and-yahoo-pipes.html"/>
   <updated>2007-02-08T15:00:00-08:00</updated>
   <id>http://trentm.com/2007/02/komodo-planet-and-yahoo-pipes</id>
   <content type="html">&lt;p&gt;I played a bit with Yahoo's new &lt;a href=&quot;http://pipes.yahoo.com/&quot;&gt;Pipes&lt;/a&gt; web app. At ActiveState we have a &lt;a href=&quot;http://blogs.activestate.com/jeffg/&quot;&gt;number&lt;/a&gt; &lt;a href=&quot;http://blogs.activestate.com/shanec/&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://blogs.activestate.com/ericp/&quot;&gt;blogs&lt;/a&gt; where many of &lt;a href=&quot;http://blogs.activestate.com/trentm/&quot;&gt;us&lt;/a&gt; write about what interesting things we are working on. A number of those posts are about &lt;a href=&quot;http://www.activestate.com/products/komodo_ide/&quot;&gt;Komodo&lt;/a&gt;. As well, with the recent 4.0 release, Komodo has started popping up on blogs more and more -- in particular, the very cool &lt;a href=&quot;http://mysite.verizon.net/bcorfman/index.html&quot;&gt;&quot;Komodo Hacks&quot; series&lt;/a&gt; from Brandon.&lt;/p&gt;




&lt;p&gt;So, without further ado, I give you the &lt;strong&gt;&lt;a href=&quot;http://pipes.yahoo.com/pipes/nqXO3Ae42xGRdNG8qu5lkA/&quot;&gt;Komodo Planet Pipe&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Let me know if there are other blogs I should add to this. Currently it just filters on posting &lt;em&gt;titles&lt;/em&gt; matching &quot;Komodo&quot;. I tried to also include filtering on the posting &lt;em&gt;content&lt;/em&gt; but Yahoo Pipes kept giving me (unhelpful) errors with that. I like the idea of Pipes, but overall I found the current experience to be too unresponsive to be pleasing.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo babies</title>
   <link href="http://trentm.com/2007/01/komodo-babies.html"/>
   <updated>2007-01-24T07:46:00-08:00</updated>
   <id>http://trentm.com/2007/01/komodo-babies</id>
   <content type="html">&lt;div class=&quot;right&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/368444147/&quot; title=&quot;Komodo Babies&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/118/368444147_164373489a_o.gif&quot; width=&quot;431&quot; height=&quot;193&quot; alt=&quot;komodo babies&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;Long time, no post. I've been working on &lt;a href=&quot;http://www.activestate.com/products/komodo_ide/&quot;&gt;Komodo 4.0&lt;/a&gt; -- which we finally released yesterday after over a year of work! Top that off with the &lt;a href=&quot;http://news.yahoo.com/s/ap/20070124/ap_on_sc/britain_virgin_birth&quot;&gt;recent announcement&lt;/a&gt; by the British Zoo of the virgin birth of 5 baby Komodo dragons! Perfect.&lt;/p&gt;




&lt;p&gt;Komodo 4.0 adds JavaScript debugging (amongst a bunch of other features) and&lt;/p&gt;




&lt;blockquote&gt;
the reptiles are in good health and enjoying a diet of crickets and locusts.
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href=&quot;http://blogs.activestate.com/activestate/2007/01/komodo_coincide.html&quot;&gt;Too fun.&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Open letter to EQ3</title>
   <link href="http://trentm.com/2006/09/open-letter-to-eq3.html"/>
   <updated>2006-09-15T06:57:00-07:00</updated>
   <id>http://trentm.com/2006/09/open-letter-to-eq3</id>
   <content type="html">&lt;p&gt;Dear Sir,&lt;/p&gt;




&lt;p&gt;I am writing to inform you that the customer service I
received recently from &lt;a href=&quot;http://www.eq3.com/&quot;&gt;EQ3&lt;/a&gt; in Vancouver was totally
unacceptable. Please forward this message to the
appropriate person.&lt;/p&gt;




&lt;p&gt;I ordered a Connick Pendant Lamp from your Yaletown
Store on 10th June 2006 and was told that it would be
delivered to the store in 2-3 weeks. When I called
after 4 weeks to see if the lamp had arrived, I was
then told that the 2-3 weeks was actually delivery
time to Winnipeg and I would have to wait another week
or so for the lamp to arrive in Vancouver.&lt;/p&gt;




&lt;p&gt;Three &lt;em&gt;months&lt;/em&gt; later in September I received a phone
call from Kevin Smith [not his real name] indicating that the lamp had
arrived in Vancouver. No apology for the delay was
forthcoming. I was also informed that it could not be
delivered to the Yaletown store and I would have to
pick it up from the warehouse in a completely
different area of Vancouver. As the warehouse was only
open 9am to 5pm Monday to Friday, I took 2 hours off
work and drove out of my way to collect the lamp on
September 15th.&lt;/p&gt;




&lt;p&gt;On arrival at the warehouse, I was notified by the
warehouse employee that the truck that was meant to
arrive the previous day had been delayed and that all
customers should have been contacted. I was also
notified that my lamp was destined to be delivered to
the Yaletown store so I wasn't expected to come and
pick it up anyway.&lt;/p&gt;




&lt;p&gt;Customer service up to this point had been substandard
to say the least but degenerated to disgraceful when I
called up Kevin Smith to inform him of the situation.
Without any understanding of my circumstances he
informed me that my drive to the warehouse was hardly
out of my way and really, could eq3 be expected to
call everybody and inform them of the delay? With this
level of customer service, EQ3 cannot expect any of
their current customers to shop in the store again and
I have been left with a very poor opinion of the
company.&lt;/p&gt;




&lt;p&gt;I instructed Kevin Smith to refund my payment for the
lamp and I am waiting to ensure this happens. If EQ3
wishes to be a successful franchise company I would
recommend that it puts some effort into customer
satisfaction.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Firefox and Thunderbird featurelets I want</title>
   <link href="http://trentm.com/2006/05/firefox-and-thunderbird-featurelets-i-want.html"/>
   <updated>2006-05-30T00:30:00-07:00</updated>
   <id>http://trentm.com/2006/05/firefox-and-thunderbird-featurelets-i-want</id>
   <content type="html">&lt;p&gt;I use &lt;a href=&quot;http://www.mozilla.com/firefox/&quot;&gt;Firefox&lt;/a&gt; and &lt;a href=&quot;http://www.mozilla.com/thunderbird/&quot;&gt;Thunderbird&lt;/a&gt;. (For the latter I recently switched from using mutt -- the last luddite at &lt;a href=&quot;http://www.activestate.com/&quot;&gt;work&lt;/a&gt; to finally switch to one of them new fangled GUI things for email.) Here are a couple fixes/featurelets that I want in them.&lt;/p&gt;




&lt;ul&gt;
    &lt;li&gt;I set Firefox to open new URLs in a new tab. This is the behaviour I want &lt;strong&gt;most&lt;/strong&gt; of the time. However, there is the odd time that I want to lock a particular browser window. I.e., I'd like subsequent decisions on where to open a new URL to ignore this window.  For example, while editing this blog posting in my browser, I would like new URLs (ones I'm hunting for to link from this post) to open in another browser window. Ditto when I'm working on my calendar in the browser. Or in gmail. What if Firefox had a &quot;pin&quot; button (as provided in some Linux window managers)? That would be handy.&lt;/li&gt;

    &lt;li&gt;Say you previously sent this email:

&lt;pre&gt;
    To: friend@example.com
    From: me@example.com
    Subject: Here are some pics from my weekend
&lt;/pre&gt;

And, of course, you forgot to attach the pics. So you reply to your own email. In &lt;a href=&quot;http://www.mutt.org/&quot;&gt;mutt&lt;/a&gt; and gmail when you reply to that email you get:

&lt;pre&gt;
    To: friend@example.com
    From: me@example.com
    Subject: Re: Here are some pics from my weekend
&lt;/pre&gt;

In Thunderbird, when you &quot;Reply All&quot; you get these headers:

&lt;pre&gt;
    To: me@example.com
    Cc: friend@example.com
    Subject: Re: Here are some pics from my weekend
&lt;/pre&gt;

That is just wrong. Even worse is when you just hit &quot;Reply&quot;:

&lt;pre&gt;
    To: me@example.com
    Subject: Re: Here are some pics from my weekend
&lt;/pre&gt;

I guess your friend just won't see how your weekend went.


[Update: I couldn't &lt;a href=&quot;http://tinyurl.com/rdh4p&quot;&gt;find&lt;/a&gt; a bug for this so I added &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=339686&quot;&gt;this one&lt;/a&gt;.]


[Update 2: ... and quickly closed: &quot;fixed for 2.0&quot;. Cool.]

&lt;/li&gt;

&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Borgå (Porvoo) church fire</title>
   <link href="http://trentm.com/2006/05/borga-porvoo-church-fire.html"/>
   <updated>2006-05-29T05:06:00-07:00</updated>
   <id>http://trentm.com/2006/05/borga-porvoo-church-fire</id>
   <content type="html">&lt;div class=&quot;left&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/155804565/&quot; title=&quot;photo sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/61/155804565_1b5b053959_m.jpg&quot; alt=&quot;&quot; style=&quot;border: solid 2px #000000;&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;Borgå is a lovely small town outside of Helsinki. My mom grew up on a farm nearby. The town is a popular tourist town -- partly because of its proximity to Helsinki, its lovely waterfront and the gorgeous medieval Porvoo Cathedral pictured above. (Porvoo is the Finnish name, Borgå the Swedish.) My parents were married in this church.&lt;/p&gt;




&lt;p&gt;&lt;br style=&quot;clear: both&quot;/&gt;&lt;/p&gt;




&lt;div class=&quot;right&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/155804574/&quot; title=&quot;Borga Cathedral fire&quot;&gt;&lt;img src=&quot;http://static.flickr.com/77/155804574_0240c37561_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;borga_church_fire&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;Unfortunately most of it burnt down today/yesterday. Arson is suspected. A#@hole.&lt;/p&gt;




&lt;p&gt;&lt;br style=&quot;clear: both&quot;/&gt;&lt;/p&gt;




&lt;p&gt;The photos are from the Helsingin Sanomat &lt;a href=&quot;http://www.hs.fi/kotimaa/artikkeli/Porvoon+tuomiokirkon+palo+varmistumassa+tuhopoltoksi/1135220069144&quot;&gt;coverage&lt;/a&gt; (in &lt;a href=&quot;http://www.hs.fi/english/article/BREAKING+NEWS+Major+fire+severely+damages+Porvoo+Cathedral/1135220074458&quot;&gt;English&lt;/a&gt;) of it.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActivePython 2.4.3.12 is released (Windows-only bugfix)</title>
   <link href="http://trentm.com/2006/04/activepython-24312-is-released-windows-only-bugfix.html"/>
   <updated>2006-04-12T07:51:00-07:00</updated>
   <id>http://trentm.com/2006/04/activepython-24312-is-released-windows-only-bugfix</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.activestate.com/Products/ActivePython/&quot;&gt;ActivePython 2.4.3.12&lt;/a&gt; was just released to fix a problem with how PATHEXT is set on Windows. From the release notes:

&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;[Windows] Fix a bug that results in &amp;quot;.pyo&amp;quot; and &amp;quot;.pyc&amp;quot; being placed on the
PATHEXT environment variable before &amp;quot;.py&amp;quot; for clean installs. &lt;a href=&quot;http://bugs.activestate.com/ActivePython/show_bug.cgi?id=33311&quot;&gt;Bug
33311&lt;/a&gt;. This can cause surprises for command-line usage for Python
scripts when not specifying the &amp;quot;.py&amp;quot; extension. The new installer
will fix PATHEXT on machines that hit this bug.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;

See &lt;a href=&quot;http://groups.google.ca/group/comp.lang.python/browse_thread/thread/90e36791afbb90b8/c0705f28c2b3b2bf?lnk=st&amp;amp;q=can't+pass+command-line+arguments&amp;amp;rnum=1&amp;amp;hl=en#c0705f28c2b3b2bf&quot;&gt;
this python-list thread&lt;/a&gt; for more details.


&lt;/p&gt;




&lt;p&gt;The release notes are &lt;a href=&quot;http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/relnotes.html#release_history&quot;&gt;here&lt;/a&gt; and the announcements should be hitting the lists soon.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo wins a Productivity Award</title>
   <link href="http://trentm.com/2006/04/komodo-wins-a-productivity-award.html"/>
   <updated>2006-04-06T03:11:00-07:00</updated>
   <id>http://trentm.com/2006/04/komodo-wins-a-productivity-award</id>
   <content type="html">&lt;div style=&quot;float: left; margin-right: 10px; margin-bottom: 10px;&quot;&gt; &lt;a href=&quot;http://www.flickr.com/photos/trento/115615668/&quot; title=&quot;komodo and jolt&quot;&gt;&lt;img src=&quot;http://static.flickr.com/55/115615668_3c9e7a0fec_m.jpg&quot; /&gt;&lt;/a&gt; &lt;/div&gt;




&lt;p&gt;Komodo 3.5.2 recently won &lt;a href=&quot;http://www.sdmagazine.com/pressroom/jolt_finalists_2006.html&quot;&gt;a Software Development Productivity Award&lt;/a&gt;. (I've been using too many exclamation marks recently, so I'll refrain here.)&lt;/p&gt;




&lt;p&gt;As &lt;a href=&quot;http://www.joelonsoftware.com/items/2006/03/16.html&quot;&gt;Joel mentions&lt;/a&gt;, the Productivity Awards are basically runners up to the big cahuna Jolt awards. When we win that next year (grin), I'll ask Luke to do a Komodo/Jolt image that uses &lt;a href=&quot;http://flickr.com/photos/tags/jolt&quot;&gt;the retro Jolt cans&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActivePython 2.4.3.11 is released</title>
   <link href="http://trentm.com/2006/04/activepython-24311-is-released.html"/>
   <updated>2006-04-06T02:55:00-07:00</updated>
   <id>http://trentm.com/2006/04/activepython-24311-is-released</id>
   <content type="html">&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/trento/103732013/&quot; title=&quot;flying python&quot;&gt;&lt;img src=&quot;http://static.flickr.com/31/103732013_849d7f3bb9_m.jpg&quot; style=&quot;border: medium none ;&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;&lt;a href=&quot;http://www.activestate.com/Products/ActivePython/&quot;&gt;ActivePython 2.4.3.11&lt;/a&gt; is out!&lt;/p&gt;




&lt;p&gt;Highlights include:

&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;[Windows] Update to recent PyWin32 (build 208.1+)&lt;/li&gt;
&lt;li&gt;Update to bzip2 1.0.3 (from 1.0.2) [bug 45239]&lt;/li&gt;
&lt;li&gt;Update to Python 2.4.3&lt;/li&gt;
&lt;li&gt;[Windows] Fix a bug where the PyWin32 docs Table of Contents did not appear in the ActivePython CHM.&lt;/li&gt;
&lt;li&gt;[Mac OS X] Fix errors in the build number in the Python.framework Info.plist and version.plist.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The release notes are &lt;a href=&quot;http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/relnotes.html#release_history&quot;&gt;here&lt;/a&gt; and the announcements should be hitting the lists soon.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>thirtyboxes.py 0.5.0: a much nicer interface than 0.1.0</title>
   <link href="http://trentm.com/2006/03/thirtyboxespy-050-a-much-nicer-interface-than-010.html"/>
   <updated>2006-03-24T14:49:00-08:00</updated>
   <id>http://trentm.com/2006/03/thirtyboxespy-050-a-much-nicer-interface-than-010</id>
   <content type="html">&lt;p&gt;I've put up a new thirtyboxes.py binding to the &lt;a href=&quot;http://30boxes.com/&quot;&gt;30boxes&lt;/a&gt; &lt;a href=&quot;http://www.30boxes.com/api/&quot;&gt;web API&lt;/a&gt;: &lt;a href=&quot;http://code.google.com/p/python-thirtyboxes/&quot;&gt;http://code.google.com/p/python-thirtyboxes/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;For example:&lt;/p&gt;


&lt;pre&gt;&gt;&gt;&gt; import thirtyboxes
&gt;&gt;&gt; tb = thirtyboxes.ThirtyBoxes()
&gt;&gt;&gt; tb.find_user(1)
{'avatar': 'http://static.flickr.com/25/97988637_27ec96a24f_o.jpg',
'createDate': datetime.date(2005, 9, 10),
'firstName': 'Nick',
'id': 1,
...}

&gt;&gt;&gt; from datetime import date, timedelta
&gt;&gt;&gt; today = date.today()
&gt;&gt;&gt; tomorrow = today + timedelta(1)
&gt;&gt;&gt; tb.events(start=today, end=tomorrow)
{'events': [{'allDayEvent': False,
     'end': datetime.datetime(2006, 3, 25, 22, 0),
     'id': 156569,
     'invitation': {'isInvitation': False},
     'notes': ''
     'privacy': 'shared',
     'repeatEndDate': None,
     'repeatType': 'no',
     'start': datetime.datetime(2006, 3, 25, 19, 0),
     'summary': 'Bagpipe practice',
     'tags': 'pipes'}],
 'listEnd': datetime.date(2006, 3, 26),
 'listStart': datetime.date(2006, 3, 25),
 'userId': 1234}

&gt;&gt;&gt; tb.search('caber toss')
...returns events for caber tossing
&lt;/pre&gt;


&lt;p&gt;Or, from the command line&lt;/p&gt;


&lt;pre&gt;$ alias 30b='python -m thirtyboxes.py'
$ 30b user 1234
--- 30boxes user
name           : Hamish McDonald
id             : 1234
personalSite   : http://hamish.example.com/
avatar         : ...
createDate     : 2006-02-05
startDay       : 0
use24HourClock : False
feeds          :
- hamish's Photos (http://www.flickr.com/services/feeds/pho...
&lt;/pre&gt;


&lt;p&gt;Any feedback is appreciated.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>bought a new house</title>
   <link href="http://trentm.com/2006/03/bought-a-new-house.html"/>
   <updated>2006-03-06T14:17:00-08:00</updated>
   <id>http://trentm.com/2006/03/bought-a-new-house</id>
   <content type="html">&lt;p&gt;My fiancee and I bought a new house today! Phew. Buying a house in Vancouver (North Van in this case), sucks. It is waay too competitive. But we got a little lucky and won among a number of offers. I tend to cringe at blowing $20 gambling of an evening (more recently losing that to friends playing poker). It is definitely more stressful waiting for two hours when real money is on the line.&lt;/p&gt;




&lt;p&gt;I am now poor. :)&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>thirtyboxes.py &#8212; a Python 30boxes.com API</title>
   <link href="http://trentm.com/2006/02/thirtyboxespy-a-python-30boxescom-api.html"/>
   <updated>2006-02-23T16:58:00-08:00</updated>
   <id>http://trentm.com/2006/02/thirtyboxespy-a-python-30boxescom-api</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://30boxes.com/&quot;&gt;30boxes.com&lt;/a&gt; is a nice web calendaring service, &lt;a href=&quot;http://www.joelonsoftware.com/items/2006/02/08.html&quot;&gt;maligned&lt;/a&gt; somewhat by Joel Spolsky. I've been using &lt;a href=&quot;http://www.trumba.com/&quot;&gt;Trumba&lt;/a&gt; for a while, but have now switched to 30boxes. So far I am pretty happy with the change. The &quot;One Box&quot; (any name for it would have been cheesy) is a great answer to the tedium of adding events quickly.&lt;/p&gt;




&lt;p&gt;30boxes.com has started adding a &lt;a href=&quot;http://30boxes.com/api/&quot;&gt;web API&lt;/a&gt; &lt;a href=&quot;http://30boxes.com/blog/index.php/2006/02/10/hacking-30-boxes-already/&quot;&gt;as promised&lt;/a&gt; (it is read-only right now). I've cobbled together &lt;a href=&quot;http://code.google.com/p/python-thirtyboxes/&quot;&gt;a Python binding to this API&lt;/a&gt;. I hope some folks find it useful. Please let me know if you love it, hate it, have problems with it, whatever.&lt;/p&gt;




&lt;pre&gt;$ python
&amp;gt;&amp;gt;&amp;gt; import thirtyboxes
&amp;gt;&amp;gt;&amp;gt; thirtyboxes.events_TagSearch(&quot;work&quot;)
'&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;
&amp;lt;rsp stat=&quot;ok&quot;&amp;gt;
&amp;lt;eventlist&amp;gt;
...'
&lt;/pre&gt;

</content>
 </entry>
 
 <entry>
   <title>work blog and ActiveState Software Inc</title>
   <link href="http://trentm.com/2006/02/work-blog-and-activestate-software-inc.html"/>
   <updated>2006-02-23T16:38:00-08:00</updated>
   <id>http://trentm.com/2006/02/work-blog-and-activestate-software-inc</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/103732013/&quot; title=&quot;flying python&quot; style=&quot;float: right&quot;&gt;&lt;img src=&quot;http://static.flickr.com/31/103732013_849d7f3bb9_m.jpg&quot; alt=&quot;&quot; style=&quot;border: none;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p style=&quot;&quot;&gt;I have &lt;a href=&quot;http://blogs.activestate.com/trentm/&quot;&gt;a work blog&lt;/a&gt; now.  Mostly I'll be talking about &lt;a href=&quot;http://www.activestate.com/Products/ActivePython/&quot;&gt;ActivePython&lt;/a&gt; and &lt;a href=&quot;http://www.activestate.com/Products/Komodo/&quot;&gt;Komodo&lt;/a&gt; there.

Of course the &lt;a href=&quot;http://blogs.activestate.com/activestate/2006/02/free_as_in_will.html&quot;&gt;big news&lt;/a&gt; is that we (ActiveState) are spinning out to be an independent company again. The close happened this week and now we are working on moving into our own space. This should be an exciting ride, er, drive (we are in control of our own destiny now).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Ruby the Komodo</title>
   <link href="http://trentm.com/2006/01/ruby-the-komodo.html"/>
   <updated>2006-01-24T08:03:00-08:00</updated>
   <id>http://trentm.com/2006/01/ruby-the-komodo</id>
   <content type="html">&lt;p&gt;Apparently the San Diego Zoo has &lt;a href=&quot;http://www.sandiegozoo.org/kids/animal_komodo.html&quot;&gt;a Komodo dragon named Ruby&lt;/a&gt;. I declare that girl the mascot of the recent &lt;a href=&quot;http://www.activestate.com/Products/Komodo/&quot;&gt;Komodo&lt;/a&gt; (IDE) release that added &lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; &lt;a href=&quot;http://www.activestate.com/_images/screenshots/ss_Komodo_rails_large.gif&quot;&gt;support&lt;/a&gt;. Brilliant. (Thanks for emailing us, Tony!) Bonus points if you noticed that Ruby's tongue is (atypically) yellow -- similar to our Komodo icon's eye. I wonder if they have a Komodo dragon named pearl.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>ActivePython 2.4.2.10 is released</title>
   <link href="http://trentm.com/2006/01/activepython-24210-is-released.html"/>
   <updated>2006-01-24T06:52:00-08:00</updated>
   <id>http://trentm.com/2006/01/activepython-24210-is-released</id>
   <content type="html">&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt; &lt;a title=&quot;photo sharing&quot; href=&quot;http://www.flickr.com/photos/trento/66727800/&quot;&gt;&lt;img src=&quot;http://static.flickr.com/28/66727800_9692d76006_m.jpg&quot; style=&quot;border: 2px solid rgb(0, 0, 0);&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style=&quot;font-size: 0.9em; margin-top: 0px;&quot;&gt;&amp;nbsp; &lt;a href=&quot;http://www.flickr.com/photos/trento/66727800/&quot;&gt;python skeleton&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Originally uploaded by &lt;a href=&quot;http://www.flickr.com/people/trento/&quot;&gt;trento&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;




&lt;p&gt;&lt;a href=&quot;http://www.activestate.com/Products/ActivePython/&quot;&gt;ActivePython 2.4.2.10&lt;/a&gt; is out!&lt;/p&gt;




&lt;p&gt;Highlights include:
&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Early support for Mac OS X for Intel platform (macosx-x86).&lt;/li&gt;
&lt;li&gt;Upgrade to PyWin32 build 207 on Windows/x86&lt;/li&gt;
&lt;li&gt;Upgrade Tkinter to Tcl/Tk 8.4.12&lt;/li&gt;
&lt;li&gt;Support for Windows/x64 (win64-x64). Note that PyWin32 has not been ported to 64-bit Windows so this build does not include PyWin32.&lt;/li&gt;
&lt;li&gt;Support for Linux/x86_64 (linux-x86_64)&lt;/li&gt;
&lt;li&gt;Fixed a problem on Mac OS X/PowerPC that unintentionally created a dependency on &lt;a href=&quot;fink.sourceforge.com&quot;&gt;Fink&lt;/a&gt; for the &amp;quot;bz2&amp;quot; and &amp;quot;curses&amp;quot; extensions. (Thanks, Bob!)&lt;/li&gt;
&lt;li&gt;The Windows &amp;quot;debug libraries&amp;quot; package now allows installation into non-ActivePython Python installations of the same version. This &lt;a href=&quot;http://mail.python.org/pipermail/python-dev/2005-December/058448.html&quot;&gt;was requested&lt;/a&gt; by Dave Abrahams for the Boost folks.&lt;/li&gt;
&lt;li&gt;Changed Intel 32-bit architecture platform name from &amp;quot;ix86&amp;quot; to &amp;quot;x86&amp;quot;, changing package names for some ActivePython builds.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See &lt;a href=&quot;http://mail.python.org/pipermail/python-list/2006-January/322323.html&quot;&gt;the announcements&lt;/a&gt; for full details.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo and SELinux</title>
   <link href="http://trentm.com/2005/12/komodo-and-selinux.html"/>
   <updated>2005-12-22T01:31:00-08:00</updated>
   <id>http://trentm.com/2005/12/komodo-and-selinux</id>
   <content type="html">&lt;p&gt;Recently we had been noticing some reports of Komodo startup failing on some modern Linux boxes. See &lt;a href=&quot;http://bugs.activestate.com/Komodo/show_bug.cgi?id=43260&quot;&gt;bug 43260&lt;/a&gt;. It was tracked down to SELinux on the particular machine disallowing text-segment relocation in a specific shared object in Komodo.&lt;/p&gt;




&lt;p&gt;The problem became more acute with the recent releases because &lt;a href=&quot;http://fedora.redhat.com/docs/selinux-faq/&quot;&gt;Fedora Core 4 now comes with SELinux&lt;/a&gt; installed, enabled and enforcing (in certain areas of the file system) by default.&lt;/p&gt;




&lt;p&gt;(Gory details: Basically there is a micro chance for a security hole during text-segment relocation when loading a shared object that was not compiled with position-independent code -- i.e. without &amp;quot;-fPIC&amp;quot; with gcc. I need to find the reference -- deep in a PDF a co-worker found -- that described those details again.)&lt;/p&gt;




&lt;p&gt;So either you need to build all your .so's -fPIC or you need to set SELinux attributes appropriately (a.k.a. set the &amp;quot;security context&amp;quot;) on certain files post-install. Komodo 3.5.x did a bit of both. First we made the changes that we could to get all .so's building -fPIC. However, we still have one that could not be, so we need to set its security context on install. One does this &amp;quot;chcon&amp;quot; (change context).&lt;/p&gt;




&lt;pre&gt;chcon -t &lt;strong&gt;security-context-name&lt;/strong&gt; path/to/file.so&lt;/pre&gt;




&lt;p&gt;Easy peasy. Except one thing. What is that &amp;quot;security-context-name&amp;quot;? On FC4 it is &amp;quot;texrel_shlib_t&amp;quot;. (This is what Komodo's Linux installer attempts to do on that one file, &amp;quot;libnpscimoz.so&amp;quot;, if SELinux is detected.) On CentOS (a clone of RHEL) it is apparently something else because:&lt;/p&gt;




&lt;pre&gt;chcon: failed to change context of /home/msoulier/komodo/lib/mozilla/plugins/libnpscimoz.so to user_u:object_r:texrel_shlib_t: Invalid argument&lt;/pre&gt;




&lt;p&gt;On other Linux distros: who knows? I am not currently aware of a way to programmatically figure out what the built-in and user-defined set of valid security context names is for a given SELinux install. Any pointers anyone could provide would be appreciated.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 3.5.2 is out</title>
   <link href="http://trentm.com/2005/12/komodo-352-is-out.html"/>
   <updated>2005-12-09T07:22:00-08:00</updated>
   <id>http://trentm.com/2005/12/komodo-352-is-out</id>
   <content type="html">&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt; &lt;a href=&quot;http://www.flickr.com/photos/trento/66725521/&quot; title=&quot;photo sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/28/66725521_cf17207995_m.jpg&quot; style=&quot;border: 2px solid rgb(0, 0, 0);&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style=&quot;font-size: 0.9em; margin-top: 0px;&quot;&gt;&amp;nbsp; &lt;a href=&quot;http://www.flickr.com/photos/trento/66725521/&quot;&gt;Komodo Dragon&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Originally uploaded by &lt;a href=&quot;http://www.flickr.com/people/trento/&quot;&gt;trento&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;




&lt;p&gt;I am pleased to announce the release of Komodo 3.5.2 for Linux, Mac OS X, and Windows. This is a bug fix release for the Komodo 3.5.x stream. The important fixes include:

&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;[Windows] Fix AltGr+&amp;lt;number&amp;gt; keybindings for international keyboard layouts on Windows (bug 43021)&lt;/li&gt;
&lt;li&gt;[Windows] Fix XSLT autocomplete (bug 41898).&lt;/li&gt;
&lt;li&gt;Perl syntax checking default setting change to not use taint mode.&lt;/li&gt;
&lt;li&gt;[Windows] Fix setting of Windows File associations (bug 42107).&lt;/li&gt;
&lt;li&gt;[Linux] Fix SELinux issues that would prevent Komodo from starting on Linux machines with SELinux kernel extensions installed and enforcing -- the default on Fedora Core 4 (bug 43260).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See the &lt;a href=&quot;http://aspn.activestate.com/ASPN/docs/Komodo/3.5/revisions.html#ko352&quot;&gt;Revision History&lt;/a&gt; for more details.&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Download Komodo and find more information &lt;a href=&quot;http://www.activestate.com/Products/Komodo/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 3.5.1: ruby debugging error</title>
   <link href="http://trentm.com/2005/12/komodo-351-ruby-debugging-error.html"/>
   <updated>2005-12-02T03:53:00-08:00</updated>
   <id>http://trentm.com/2005/12/komodo-351-ruby-debugging-error</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://bugs.activestate.com/show_bug.cgi?id=43011&quot;&gt;Bug 43011&lt;/a&gt;. Most users shouldn't hit this, but if you get an error something like this while debugging Ruby in Komodo:

&lt;/p&gt;




&lt;pre&gt;c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `require__': No such file to load -- no such mod (LoadError)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:in `re quire'&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; from -:1 &lt;/pre&gt;




&lt;p&gt;then (until Komodo 3.5.2 comes out) you may need to applied the workaround described in that bug.&lt;/p&gt;




&lt;p&gt;Komodo's Ruby debugger includes a binary Ruby extension for speeding up some parts of the debugging process. (This was very important for making Rails debugging, for example, performant.) Komodo *also* includes a pure Ruby fallback implementation when the binary extension doesn't work -- for example if a new version of Ruby comes out or for platform compat issues, at least debugging should still work.&lt;/p&gt;




&lt;p&gt;The problem was that some of those fallback files got installed to the wrong dir. Oops. That will be fixed in subsequent builds.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Komodo 3.5.1 nits (with workarounds)</title>
   <link href="http://trentm.com/2005/12/komodo-351-nits-with-workarounds.html"/>
   <updated>2005-12-01T07:15:00-08:00</updated>
   <id>http://trentm.com/2005/12/komodo-351-nits-with-workarounds</id>
   <content type="html">&lt;p&gt;We released Komodo 3.5.1 yesterday. A few issues have come up since then that may be annoying for some Komodo users. Until we can get a new release out fixing these issues, here is what they are and how to work around them (if you happen to hit one):&lt;/p&gt;




&lt;ul&gt;&lt;li&gt;XSLT Autocomplete is busted on Windows. &lt;a href=&quot;http://bugs.activestate.com/Komodo/show_bug.cgi?id=41898&quot;&gt;Bug 41898&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The workaround is Find and edit &amp;quot;koXMLStateMachineReader.py&amp;quot; in your Komodo installation
(&amp;lt;install-dir&amp;gt;/lib/mozilla/python/komodo/). Change the &amp;quot;print&amp;quot;
statement on line 211 (i.e. in the handle__unknown() method) to a
&amp;quot;pass&amp;quot; statement. I.e.:&lt;br /&gt;&lt;pre&gt;&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&amp;nbsp; &amp;nbsp; def handle__unknown(self, node, *args):&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; pass&lt;br /&gt;&amp;nbsp; &amp;nbsp; ...&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;span&gt;Perl syntax checking might give syntax errors on &amp;quot;use&amp;quot; statements not being able to find a module in the same directory as a script that you are editing. I wrote &lt;a href=&quot;http://aspn.activestate.com/ASPN/Mail/Message/komodo-discuss/2920833&quot;&gt;a tale of 3 (or 4?) Dave's&lt;/a&gt; describing the background, but the main issue is that Komodo by default syntax checks your Perl code with Perl taint mode even though you probably don't &lt;em&gt;run &lt;/em&gt;your code with taint mode.&lt;br /&gt;&lt;br /&gt;The workaround, if you hit this, is simply to change the default Perl syntax checking mode to not use taint mode (i.e. &amp;quot;-cw&amp;quot; instead of &amp;quot;-cwT&amp;quot;). This will be the new default in future Komodo versions.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li&gt;&lt;span&gt;On Windows Tablet PCs (Do you think &lt;a href=&quot;http://scobleizer.wordpress.com/&quot;&gt;Scoble&lt;/a&gt; scripts?), opening the find/replace dialog would not put keyboard focus into the find pattern textbox. &lt;a href=&quot;http://bugs.activestate.com/Komodo/show_bug.cgi?id=42441&quot;&gt;Bug 42441&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The workaround is to apply this patch to &amp;quot;&amp;lt;installdir&amp;gt;/lib/mozilla/chrome/jaguar/content/find/find.js&amp;quot;:
&lt;pre&gt;@@ -278,6 +278,7 @@&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; getService(Components.interfaces.koIFindService);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;_Initialize();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;window.focus();&lt;br /&gt;+&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; widgets.panel.pattern.focus(); // Bug 42441&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; } catch (ex) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;log.exception(ex);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li&gt;&lt;span&gt;Changing Windows file associations in the &amp;quot;Windows Integration&amp;quot; preferences panel would fail with &amp;quot;[Errno 9] Bad file descriptor&amp;quot;. &lt;a href=&quot;http://bugs.activestate.com/Komodo/show_bug.cgi?id=42957&quot;&gt;Bug 42957&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The workaround is to apply &lt;a href=&quot;http://bugs.activestate.com/Komodo/showattachment.cgi?attach_id=3284&quot;&gt;this patch&lt;/a&gt; (attached to the bug report) to &amp;quot;koInitService.py&amp;quot; in your Komodo installation.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;




&lt;p&gt;I'll try to post workarounds for any more issues that we find before we are able to put up a new release. Thanks to all of you that posted bug reports.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>mighty mouse</title>
   <link href="http://trentm.com/2005/09/mighty-mouse.html"/>
   <updated>2005-09-11T17:03:00-07:00</updated>
   <id>http://trentm.com/2005/09/mighty-mouse</id>
   <content type="html">&lt;p&gt;Why doesn't the &lt;a href=&quot;http://www.apple.com/mightymouse/&quot;&gt;mighty mouse&lt;/a&gt; have a &lt;a href=&quot;http://www.apple.com/ipodnano/features.html&quot;&gt;click wheel&lt;/a&gt;?&lt;/p&gt;




&lt;p&gt;[Update] Okay, dumb question. A thumb goes in a circle more easily than an index finger. We got a new iMac/Intel box in the office recently -- which shipped with a mighty mouse. I haven't played with it that much, but the buttons-that-aren't-really-buttons would take some getting used to.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>beautiful tutorials</title>
   <link href="http://trentm.com/2005/05/beautiful-tutorials.html"/>
   <updated>2005-05-04T09:07:00-07:00</updated>
   <id>http://trentm.com/2005/05/beautiful-tutorials</id>
   <content type="html">&lt;p&gt;Wow, are these ever beautifully written tutorials:&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://cocoadevcentral.com/articles/000085.php&quot;&gt;Build a Core Data Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cocoadevcentral.com/articles/000086.php&quot;&gt;Core Data Class Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;by &lt;a href=&quot;http://cocoadevcentral.com/&quot;&gt;Scott Stevenson&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>goodbye ugly</title>
   <link href="http://trentm.com/2005/03/goodbye-ugly.html"/>
   <updated>2005-03-25T09:22:00-08:00</updated>
   <id>http://trentm.com/2005/03/goodbye-ugly</id>
   <content type="html">&lt;p&gt;A week or two ago I noticed that the theme I was using with my WordPress blog (the default one in WP 1.5, based on &lt;a href=&quot;http://binarybonsai.com/kubrick/&quot;&gt;Kubrik&lt;/a&gt;) was pretty broken when viewed in IE6. I thought that &lt;a href=&quot;http://ascher.ca/blog/&quot;&gt;David's blog&lt;/a&gt; was also using the default WP 1.5 theme, but his didn't seem as broken.&lt;/p&gt;




&lt;p&gt;In any case, I wanted to fix that and also make the other bits of my website (such as it is) relatively not unpleasant to look at. I've finally &lt;a href=&quot;http://trentm.com/&quot;&gt;done&lt;/a&gt; &lt;a href=&quot;http://trentm.com/blog/&quot;&gt;that&lt;/a&gt;. Tada. :)  The general styling borrows somewhat from &lt;a href=&quot;http://mozilla.org/&quot;&gt;mozilla.org&lt;/a&gt; (which is one of the cleaner sites around, IMO) and, of course, my WP theme is heavily based on the default Kubrik.&lt;/p&gt;




&lt;p&gt;I've also setup my site build system so that I can write a simple little &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;markdown&lt;/a&gt; file, prefixed with a little XML metadate snippet, to get relatively good looking HTML page.  For example: &lt;a href=&quot;http://trentm.com/software/index.markdown.txt&quot;&gt;source&lt;/a&gt; and &lt;a href=&quot;http://trentm.com/software/&quot;&gt;result&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>I want a Dave's Quick Search Deskbar equivalent for my Mac</title>
   <link href="http://trentm.com/2005/03/i-want-a-daves-quick-search-deskbar-equivalent-for-my-mac.html"/>
   <updated>2005-03-10T15:35:00-08:00</updated>
   <id>http://trentm.com/2005/03/i-want-a-daves-quick-search-deskbar-equivalent-for-my-mac</id>
   <content type="html">&lt;p&gt;The greatest thing on my Windows dev box at work is &lt;a href=&quot;http://www.dqsd.net/&quot;&gt;Dave's Quick Search Deskbar&lt;/a&gt;. This is probably the number one reason why I feel I am more productive on Windows than on my OS X box at home. I want something like this for my Mac. &lt;a href=&quot;http://www.ambrosiasw.com/utilities/iseek/&quot;&gt;iSeek&lt;/a&gt; is close, but not quite there. &lt;/p&gt;




&lt;p&gt;The brilliance of DQSD is (1) the use of simple short keyword conventions to indicate what type of search you want and (2) the level of control (effectively JavaScript) that you have in defining new searches.&lt;/p&gt;




&lt;ol&gt;&lt;li&gt;
Using short keyword conventions to denote the type of search is &lt;strong&gt;so much faster&lt;/strong&gt; than fumbling through a menu list of search types such as you see with iSeek, with the search textboxes in Safari and Firefox, etc.
&lt;ul&gt;
&lt;li&gt;By default, of course, you get a Google search of your term.&lt;/li&gt;
&lt;li&gt;Add an exclamation point and you get a Google &quot;I'm feeling lucky&quot; search. The ability to open, say, &lt;a href=&quot;http://www.python.org/&quot;&gt;python.org&lt;/a&gt; in your browser by typing '&lt;code&gt;&amp;lt;Windows+S&amp;gt;python!&amp;lt;Enter&amp;gt;&lt;/code&gt;' is invaluable. (&lt;code&gt;&amp;lt;Windows+S&amp;gt;&lt;/code&gt; is the hotkey to jump to the DQSD textbox.)&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;amaz Unicode&lt;/code&gt;' to look for Unicode books on Amazon&lt;/li&gt;
&lt;li&gt;'&lt;code&gt;wiki foo&lt;/code&gt;' to lookup something in Wikipedia&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;An an indicator of the level of control that I want for custom searches I'll describe the custom &quot;&lt;code&gt;ko&lt;/code&gt;&quot; search that I've defined to work with the bug database for &lt;a href=&quot;http://www.activestate.com/Products/Komodo/&quot;&gt;Komodo&lt;/a&gt;, an product that I work on.
&lt;ul&gt;
&lt;li&gt;'&lt;code&gt;ko&lt;/code&gt;' just opens the &lt;a href=&quot;http://bugs.activestate.com/Komodo/query.cgi&quot;&gt;Komodo bug database main page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;'&lt;code&gt;ko perl autocomplete&lt;/code&gt;' searches for &lt;a href=&quot;http://bugs.activestate.com/Komodo/buglist.cgi?querytype=simple&amp;type%3Ashort_desc%3Along_desc%3Abug_file_loc%3Astatus_whiteboard%3Akeywords=substring&amp;OR%3Ashort_desc%3Along_desc%3Abug_file_loc%3Astatus_whiteboard%3Akeywords=perl+autocomplete&amp;submit=Search&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&quot;&gt;bugs in Komodo Perl AutoComplete&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;'&lt;code&gt;ko 35787&lt;/code&gt;' opens &lt;a href=&quot;http://bugs.activestate.com/Komodo/show_bug.cgi?id=35787&quot;&gt;Komodo bug 35787&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;'&lt;code&gt;ko +&lt;/code&gt;' opens the &lt;a href=&quot;http://bugs.activestate.com/Komodo/enter_bug.cgi&quot;&gt;form for adding a new bug&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Does anybody know of a Mac OS X app that can do this?&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>cygwin + NTFS permissions = badness</title>
   <link href="http://trentm.com/2005/03/cygwin-ntfs-permissions-badness.html"/>
   <updated>2005-03-09T03:03:00-08:00</updated>
   <id>http://trentm.com/2005/03/cygwin-ntfs-permissions-badness</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.cygwin.com/&quot;&gt;Cygwin&lt;/a&gt; is &quot;a Linux-like environment for Windows.&quot; Basically it provides all (or at least a large set) of the standard Linux command line tools for Windows. A lot of open source projects (e.g. Mozilla, for a big one) have based their Windows build systems on Cygwin because it simplifies the problems with trying to get a &lt;code&gt;make&lt;/code&gt;-based build system to work on Windows.&lt;/p&gt;




&lt;p&gt;NTFS (the file system for WinNT, Win2k, WinXP, Win2k3) uses Access Control Lists (ACLs) for managing file permissions. If you have ever been frustrated by not being able delete a file on Windows: &lt;a href=&quot;http://support.microsoft.com/default.aspx?scid=kb;en-us;320081&quot;&gt;your NTFS ACLs might be the culprit&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I don't pretend to fully understand NTFS ACLs, but follow along with this little experiment and decide if you think there is a problem waiting to happen here. For this experiment you'll need &lt;a href=&quot;http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp&quot;&gt;&lt;code&gt;xcacls.exe&lt;/code&gt; from the Windows Resource Kit&lt;/a&gt;. This is a little command-line tool for dumping NTFS ACL information. You can also view ACL information by opening the &quot;Propeties&quot; dialog for a file in Explorer and selecting the &quot;Security&quot; tab.&lt;/p&gt;




&lt;p&gt;First let's create a small test file in the regular Windows command shell (&lt;code&gt;cmd.exe&lt;/code&gt;) and list the NTFS ACL information:&lt;/p&gt;




&lt;pre&gt;
C:\temp&gt;echo this is foo.txt &gt; foo.txt

C:\temp&gt;xcacls foo.txt
C:\temp\foo.txt BUILTIN\Administrators:F
                ACTIVE\trentm:F
                NT AUTHORITY\SYSTEM:F
                BUILTIN\Users:R
&lt;/pre&gt;




&lt;p&gt;This seems reasonable: the &quot;Administrators&quot;, &quot;trentm&quot; (that's me), and &quot;SYSTEM&quot; users have full (F) permissions on that file and the &quot;Users&quot; account has read (R) access.&lt;/p&gt;




&lt;p&gt;Now let's create a file using one of the cygwin utilities and dump the NTFS ACL information. I'll use &lt;code&gt;tee&lt;/code&gt; here, but other tools that create files (like &lt;code&gt;tar&lt;/code&gt;, &lt;code&gt;gzip&lt;/code&gt;, etc.) will have the same result.&lt;/p&gt;




&lt;pre&gt;
C:\temp&gt;echo this is bar.txt | tee bar.txt
this is bar.txt

C:\temp&gt;xcacls bar.txt
C:\temp\bar.txt ACTIVE\trentm:(special access:)
                              STANDARD_RIGHTS_ALL
                              DELETE
                              READ_CONTROL
                              WRITE_DAC
                              WRITE_OWNER
                              SYNCHRONIZE
                              STANDARD_RIGHTS_REQUIRED
                              FILE_GENERIC_READ
                              FILE_GENERIC_WRITE
                              FILE_READ_DATA
                              FILE_WRITE_DATA
                              FILE_APPEND_DATA
                              FILE_READ_EA
                              FILE_WRITE_EA
                              FILE_READ_ATTRIBUTES
                              FILE_WRITE_ATTRIBUTES

                BUILTIN\Users:(special access:)
                              READ_CONTROL
                              SYNCHRONIZE
                              FILE_GENERIC_READ
                              FILE_GENERIC_WRITE
                              FILE_READ_DATA
                              FILE_WRITE_DATA
                              FILE_APPEND_DATA
                              FILE_READ_EA
                              FILE_WRITE_EA
                              FILE_READ_ATTRIBUTES
                              FILE_WRITE_ATTRIBUTES

                Everyone:(special access:)
                         READ_CONTROL
                         SYNCHRONIZE
                         FILE_GENERIC_READ
                         FILE_GENERIC_WRITE
                         FILE_READ_DATA
                         FILE_WRITE_DATA
                         FILE_APPEND_DATA
                         FILE_READ_EA
                         FILE_WRITE_EA
                         FILE_READ_ATTRIBUTES
                         FILE_WRITE_ATTRIBUTES
&lt;/pre&gt;




&lt;p&gt;I don't want to unnecessarily ring alarm bells because my experience has shown that this usually doesn't cause problems in normal usage of the cygwin tools (we use them heavily here at ActiveState). However, yesterday &lt;strong&gt;something&lt;/strong&gt; happened with respect to NTFS ACLs on my Windows developement machine yesterday such that I no longer have write permissions for files created by the Cygwin tools. I can't help but think that the difference in ACL information for &lt;code&gt;foo.txt&lt;/code&gt; and &lt;code&gt;bar.txt&lt;/code&gt; in this experiment is part of the problem.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>original uninstall instructions from Google Desktop Search</title>
   <link href="http://trentm.com/2005/03/original-uninstall-instructions-from-google-desktop-search.html"/>
   <updated>2005-03-08T03:07:00-08:00</updated>
   <id>http://trentm.com/2005/03/original-uninstall-instructions-from-google-desktop-search</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/trento/6137337/&quot; title=&quot;photo sharing&quot;&gt;&lt;img src=&quot;http://photos3.flickr.com/6137337_453344f32c_m.jpg&quot; alt=&quot;&quot; style=&quot;border: solid 2px #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;/p&gt;




&lt;p style=&quot;&quot;&gt;Checkout this amazing bit of paranoia, er, defensive programming used by &lt;a href=&quot;http://desktop.google.com/&quot;&gt;Google Desktop Search&lt;/a&gt;. GDS installs a bunch of specifically named files to give a warning and uninstall instructions to errand Windows users.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>tip: perforce + vi configuration</title>
   <link href="http://trentm.com/2005/02/tip-perforce-vi-configuration.html"/>
   <updated>2005-02-18T06:10:00-08:00</updated>
   <id>http://trentm.com/2005/02/tip-perforce-vi-configuration</id>
   <content type="html">&lt;p&gt;If you use &lt;a href=&quot;http://www.perforce.com&quot;&gt;Perforce&lt;/a&gt; (i.e. the 'p4' command line app) and you use &lt;a href=&quot;http://www.vim.org&quot;&gt;Vim&lt;/a&gt; as your &lt;a href=&quot;http://www.perforce.com/perforce/doc.042/manuals/cmdref/env.P4EDITOR.html&quot;&gt;P4EDITOR&lt;/a&gt; then try this (on Windows):&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;p4 set &quot;P4EDITOR=C:&amp;#92;PROGRA~1&amp;#92;Vim&amp;#92;vim63&amp;#92;gvim.exe +0 +/&amp;lt;enter&amp;#92;|^&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;#92;|^====&amp;#92;|^&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;#92;|^&amp;#92;t +nohlsearch&quot;&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;(presuming that you have installed Vim 6.3 to the default location) and/or this (for Bash shell users on Linux/Un*x):&lt;/p&gt;




&lt;pre&gt;&lt;code&gt;export P4EDITOR='vim +0 &quot;+/&amp;lt;enter&amp;#92;|^&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;#92;|^====&amp;#92;|^&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;#92;|^&amp;#92;t&quot; +nohlsearch'&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;This has Vim jump to the &lt;code&gt;&amp;lt;enter description here&amp;gt;&lt;/code&gt; position in a &lt;code&gt;p4 submit&lt;/code&gt; form or, if this isn't a submission form (perhaps you are editing a user or client spec) then to the first multi-line form field.&lt;/p&gt;




&lt;p&gt;&lt;span style=&quot;text-decoration:line-through&quot;&gt;Unfortunately this still leaves the search highlighting in place. Anybody know how to dismiss that in Vim without hackily just searching for something for which there won't be a hit? Doing the latter results in a warning message.&lt;/span&gt; [Update Tue, Feb 22: found out how to clear the current search highlighting.]&lt;/p&gt;




&lt;p&gt;[Update Thu, Dec 8: added search for conflict markers during a &lt;code&gt;p4 resolve&lt;/code&gt; session.]&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Strongbad!</title>
   <link href="http://trentm.com/2005/02/strongbad.html"/>
   <updated>2005-02-02T15:29:00-08:00</updated>
   <id>http://trentm.com/2005/02/strongbad</id>
   <content type="html">&lt;p&gt;These are too good of a distraction not to share -- with my two listeners :). Rebecca says:&lt;/p&gt;




&lt;blockquote&gt;
  &lt;p&gt;This one for example is a classic:
  &lt;a href=&quot;http://www.homestarrunner.com/sbemail94.html&quot;&gt;http://www.homestarrunner.com/sbemail94.html&lt;/a&gt;
  (plus, you can play each game at the end of the episode)&lt;/p&gt;
  
  &lt;p&gt;More classics, reminds me of astroboy and/or megaman...
  &lt;a href=&quot;http://www.homestarrunner.com/sbemail57.html&quot;&gt;http://www.homestarrunner.com/sbemail57.html&lt;/a&gt;&lt;/p&gt;
  
  &lt;p&gt;And of course....the unforgettable Trogdor:
  &lt;a href=&quot;http://www.homestarrunner.com/sbemail58.html&quot;&gt;http://www.homestarrunner.com/sbemail58.html&lt;/a&gt;&lt;/p&gt;
  
  &lt;p&gt;This one is just silly, but so funny
  &lt;a href=&quot;http://www.homestarrunner.com/sbemail36.html&quot;&gt;http://www.homestarrunner.com/sbemail36.html&lt;/a&gt;&lt;/p&gt;
  
  &lt;p&gt;In the music genre - this one is great:
  http://www.homestarrunner.com/sbemail45.html&lt;/p&gt;
  
  &lt;p&gt;And of course, my favorite main page:
  &lt;a href=&quot;http://www.homestarrunner.com/main13.html&quot;&gt;http://www.homestarrunner.com/main13.html&lt;/a&gt;
  (I love the Adventure reference)&lt;/p&gt;
  
  &lt;p&gt;Otherwise, gotta love peasant's quest - which you can actually play if you
  go to the games page:
  &lt;a href=&quot;http://www.homestarrunner.com/pqtrailer.html&quot;&gt;http://www.homestarrunner.com/pqtrailer.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;And my current design document for this site:
&lt;a href=&quot;http://www.homestarrunner.com/sbemail51.html&quot;&gt;http://www.homestarrunner.com/sbemail51.html&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Introduction</title>
   <link href="http://trentm.com/2004/12/introduction.html"/>
   <updated>2004-12-01T15:57:00-08:00</updated>
   <id>http://trentm.com/2004/12/introduction</id>
   <content type="html">&lt;p&gt;I suppose an intro is in order for starters. My name is Trent Mick. I live in Vancouver and work for &lt;a href=&quot;http://www.activestate.com/&quot;&gt;ActiveState&lt;/a&gt;. My primary work is with &lt;a href=&quot;http://www.activestate.com/Products/Komodo/&quot;&gt;Komodo&lt;/a&gt; and &lt;a href=&quot;http://www.activestate.com/Products/ActivePython/&quot;&gt;ActivePython&lt;/a&gt;. I mainly intend to talk here about my experiences with programming.&lt;/p&gt;

</content>
 </entry>
 
 
</feed>

