<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss"><id>tag:blogger.com,1999:blog-1552913144533093368</id><updated>2010-02-02T17:42:38.510-08:00</updated><title type="text">Trent Mick</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/search/label/mozilla" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/trentmick/mozilla" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="trentmick/mozilla" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-7949454095652406525</id><published>2009-06-04T13:57:00.009-07:00</published><updated>2009-11-03T22:36:12.264-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="ui" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">pleasant things work better</title><content type="html">&lt;p&gt;I watched &lt;a href="http://www.jnd.org/"&gt;Don Norman&lt;/a&gt;'s &lt;a href="http://www.ted.com/index.php/talks/don_norman_on_design_and_emotion.html"&gt;TED Talk "3 ways good design makes you happy"&lt;/a&gt; last night:&lt;/p&gt;&lt;p&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/embed/DonNorman_2003-embed_high.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DonNorman-2003.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=480" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/DonNorman_2003-embed_high.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DonNorman-2003.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=480"&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 "Ah, I'll figure it out. No big deal."&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&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 "pretty". Occassionally in work debates -- whether on &lt;a href="http://www.activestate.com/komodo/"&gt;Komodo&lt;/a&gt; or on some of the &lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt; websites I'm involved in -- that "pretty" is said dismissively. I'm happy to have Don Norman's talk as a debate point.&lt;/p&gt;&lt;h2&gt;Miro&lt;/h2&gt;&lt;p&gt;&lt;img src="http://dl.getdropbox.com/u/1301040/blog/2009/06/miro2.png" alt="miro" title="miro" width="94" height="78" class="alignleft size-full wp-image-115" /&gt;&lt;/p&gt;&lt;p&gt;BTW, thanks to &lt;a href="http://trentmick.blogspot.com/2009/04/re-installing-mac-os-x-software-i-use_6252.html#c2"&gt;stephen&lt;/a&gt;. A few weeks ago I reinstalled my Mac book and &lt;a href="http://trentmick.blogspot.com/2009/04/re-installing-mac-os-x-software-i-use_6252.html"&gt;posted&lt;/a&gt; a list of the software I use. Stephen suggested I add &lt;a href="http://www.getmiro.com/"&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="https://miroguide.com/feeds/2014"&gt;https://miroguide.com/feeds/2014&lt;/a&gt; to get the latest TED Talks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-7949454095652406525?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/7949454095652406525/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/06/pleasant-things-work-better_9069.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7949454095652406525" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7949454095652406525" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/06/pleasant-things-work-better_9069.html" title="pleasant things work better" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3414577885133881821</id><published>2009-04-29T07:29:00.009-07:00</published><updated>2009-11-03T22:16:52.096-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="l10n" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">Komodo 5.1.3 released</title><content type="html">&lt;p&gt;We (&lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt;) released Komodo 5.1.3 today. Get it here:&lt;/p&gt;&lt;div style="margin-left: 30px;"&gt;Komodo IDE: &lt;a href="http://www.activestate.com/komodo/downloads/"&gt;http://www.activestate.com/komodo/downloads/&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left: 30px;"&gt;Komodo Edit: &lt;a href="http://www.activestate.com/komodo_edit/downloads/"&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 "Help &amp;gt; Check for Updates...". This is a bug fix release and is recommended for all users. See below for details.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&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 "Go to File") 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="http://bugs.activestate.com/show_bug.cgi?id=82677"&gt;Bug 82677&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removed duplicates&lt;/strong&gt; in "Go to File" list. (&lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82705"&gt;Bug 82705&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Current search is aborted when the "Go to File" dialog is closed. (&lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82529"&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="http://bugs.activestate.com/show_bug.cgi?id=82678"&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="http://bugs.activestate.com/show_bug.cgi?id=82369"&gt;Bug 82369&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fixed visual line selection mode indent/dedent problems. (&lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82368"&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="http://bugs.activestate.com/show_bug.cgi?id=82707"&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="komodo-notificationbox"/&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="https://developer.mozilla.org/En/XUL:notificationbox"&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="http://www.babelzilla.org/"&gt;babelzilla&lt;/a&gt; has been diligently providing &lt;strong&gt;localization patches&lt;/strong&gt; for Komodo: &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82580"&gt;bug 82580&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82819"&gt;bug 82819&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82821"&gt;bug 82821&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82822"&gt;bug 82822&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82824"&gt;bug 82824&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82825"&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="http://bugs.activestate.com/show_bug.cgi?id=82655"&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="http://msdn.microsoft.com/en-us/library/ms682409(VS.85).aspx"&gt;Windows Job object&lt;/a&gt;. Answer courtesy of &lt;a href="http://benjamin.smedbergs.us/blog/2006-12-11/killableprocesspy/"&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="http://docs.activestate.com/komodo/5.1/releases/ide.html"&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="http://twitter.com/StanAngeloff"&gt;Stan Angeloff&lt;/a&gt; has been doing some spectacular work in his &lt;a href="http://community.activestate.com/xpi/html-toolkit"&gt;&lt;strong&gt;HTML Toolkit&lt;/strong&gt;&lt;/a&gt; and &lt;a href="http://community.activestate.com/xpi/tab-abbreviations"&gt;&lt;strong&gt;Tab Abbreviations&lt;/strong&gt;&lt;/a&gt; Komodo extensions.&lt;/p&gt;&lt;p&gt;&lt;img src="http://insaned.googlepages.com/htmltoolkit_wrap_block_in_tag.png" alt="HTML Toolkit screenshot" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://insaned.googlepages.com/htmltoolkit_css_image_preview.png" alt="HTML Toolkit screenshot" /&gt;&lt;/p&gt;&lt;h2&gt;What about 5.1.2?&lt;/h2&gt;&lt;p&gt;There was a &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82953"&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="attrlist"&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href="http://www.activestate.com/komodo/downloads/"&gt;Komodo IDE&lt;/a&gt; | &lt;a href="http://www.activestate.com/komodo_edit/downloads/"&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="http://community.activestate.com/products/Komodo"&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="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3414577885133881821?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3414577885133881821/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/04/komodo-513-released_1995.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3414577885133881821" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3414577885133881821" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/04/komodo-513-released_1995.html" title="Komodo 5.1.3 released" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-7089061623469928696</id><published>2009-04-02T06:50:00.009-07:00</published><updated>2009-11-03T22:33:36.800-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code.activestate.com" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">Komodo 5.1.1: fixes, path mode in Fast Open dialog, Perl::Critic integration</title><content type="html">&lt;p&gt;We (&lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt;) released Komodo 5.1.1 today. Get it here:&lt;/p&gt;&lt;div style="margin-left: 30px;"&gt;Komodo IDE: &lt;a href="http://www.activestate.com/komodo/downloads/"&gt;http://www.activestate.com/komodo/downloads/&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left: 30px;"&gt;Komodo Edit: &lt;a href="http://www.activestate.com/komodo_edit/downloads/"&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 "Help &amp;gt; Check for Updates...". This is a bug fix release and is recommended for all users. See below for details.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&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="http://bugs.activestate.com/show_bug.cgi?id=82518"&gt;Bug 82518&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82542"&gt;bug 82542&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82426"&gt;bug 82426&lt;/a&gt;, &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=82557"&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="http://bugs.activestate.com/show_bug.cgi?id=82474"&gt;bug 82474&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;See the &lt;a href="http://docs.activestate.com/komodo/5.1/releases/ide.html"&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="http://trentmick.blogspot.com/2009/03/komodo-51-released-fast-open-history_8617.html"&gt;the new "Fast Open" 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 "&lt;code&gt;C:\Documents and Settings\trentm&lt;/code&gt;" 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="http://perlcritic.tigris.org/"&gt;Perl::Critic&lt;/a&gt;&lt;/strong&gt; -- "a static source code analyzer based (mostly) on Damian Conway's book 'Perl Best Practices.'". To setup you just need the "Perl-Critic" and "criticism" 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 "Perl" preferences panel. This screenshot shows the result of "Brutal" warnings on &lt;a href="http://search.cpan.org/~gaas/libwww-perl-5.805/lib/LWP/UserAgent.pm"&gt;Gisle Aas's LWP::UserAgent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/trento/3408034818/" title="Perl::Critic integration in Komodo 5.1.1 by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3630/3408034818_f59a979cdc_o.png" width="637" height="440" alt="Perl::Critic integration in Komodo 5.1.1" /&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="http://www.activestate.com/perl_dev_kit/whats_new/"&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="attrlist"&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href="http://www.activestate.com/komodo/downloads/"&gt;Komodo IDE&lt;/a&gt; | &lt;a href="http://www.activestate.com/komodo_edit/downloads/"&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="http://community.activestate.com/products/Komodo"&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="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&gt;http://bugs.activestate.com/enter_bug.cgi?product=Komodo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-7089061623469928696?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/7089061623469928696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/04/komodo-511-fixes-path-mode-in-fast-open_4614.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7089061623469928696" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7089061623469928696" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/04/komodo-511-fixes-path-mode-in-fast-open_4614.html" title="Komodo 5.1.1: fixes, path mode in Fast Open dialog, Perl::Critic integration" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3017447117010737975</id><published>2009-03-23T22:41:00.009-07:00</published><updated>2009-11-03T22:32:07.425-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="codeintel" /><category scheme="http://www.blogger.com/atom/ns#" term="markdown" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">Komodo 5.1 released (fast open, history, hyperlinks, etc.)</title><content type="html">&lt;p&gt;We (&lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt;) released Komodo 5.1 today! Get it here:&lt;/p&gt;&lt;div style="margin-left: 30px;"&gt;Komodo IDE: &lt;a href="http://www.activestate.com/komodo/"&gt;http://www.activestate.com/komodo/&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-left: 30px;"&gt;Komodo Edit: &lt;a href="http://www.activestate.com/komodo_edit/"&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;a name='more'&gt;&lt;/a&gt;&lt;br /&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. "Go to File") dialog.&lt;/p&gt;&lt;p&gt;&lt;object width="800" height="600"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="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" /&gt;&lt;embed src="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" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="800" height="600"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/3825622"&gt;Fast open in Komodo 5.1&lt;/a&gt; from &lt;a href="http://vimeo.com/user1355810"&gt;Trent Mick&lt;/a&gt; on &lt;a href="http://vimeo.com"&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="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html"&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="http://trentmick.blogspot.com/2009/03/hyperlinks-in-komodo-510b1_1005.html"&gt;hyperlinks in Komodo 5.1b1&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/trento/3352004518/" title="Komodo hyperlink colors by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3468/3352004518_c2eaeacf12_o.png" width="750" height="409" alt="Komodo hyperlink colors" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html"&gt;find highlighting in Komodo 5.1a2&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="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" /&gt;&lt;embed src="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" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html"&gt;editor history in Komodo 5.1a1&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/trento/3253669957/" title="screenshot of Komodo 5.1's history feature"&gt;&lt;img src="http://farm4.static.flickr.com/3009/3253669957_903874fa5c_o.jpg" width="570" height="448" alt="screenshot of Komodo 5.1's history feature" /&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="http://downloads.activestate.com/Komodo/nightly/"&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="attrlist"&gt;&lt;tr&gt;&lt;th&gt;downloads&lt;/th&gt;&lt;td&gt;&lt;a href="http://www.activestate.com/komodo/downloads/"&gt;Komodo IDE&lt;/a&gt; | &lt;a href="http://www.activestate.com/komodo_edit/downloads/"&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="http://community.activestate.com/products/Komodo"&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="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3017447117010737975?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3017447117010737975/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/03/komodo-51-released-fast-open-history_8617.html#comment-form" title="26 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3017447117010737975" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3017447117010737975" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/03/komodo-51-released-fast-open-history_8617.html" title="Komodo 5.1 released (fast open, history, hyperlinks, etc.)" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-80461642555097073</id><published>2009-03-13T02:46:00.009-07:00</published><updated>2009-11-03T22:29:30.091-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="General" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">hyperlinks in Komodo 5.1.0b1</title><content type="html">&lt;p&gt;We released Komodo 5.1 beta 1 yesterday! Get it here:&lt;/p&gt;&lt;div style="margin-left: 30px;"&gt;&lt;a href="http://downloads.activestate.com/Komodo/releases/5.1.0b1/"&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="attrlist"&gt;&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&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="http://community.activestate.com/products/Komodo"&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="http://www.activestate.com/komodo/"&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="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html"&gt;Komodo 5.1a1&lt;/a&gt; and &lt;a href="http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html"&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="http://docs.activestate.com/komodo/5.0/codeintel.html"&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="http://bugs.activestate.com/show_bug.cgi?id=76721"&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="http://www.flickr.com/photos/trento/3351188279/" title="Komodo hyperlink go to definition by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3633/3351188279_2fecb4ab17_o.png" width="619" height="221" alt="Komodo hyperlink go to definition" /&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 "Go to Definition". 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="http://www.flickr.com/photos/trento/3352004518/" title="Komodo hyperlink colors by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3468/3352004518_c2eaeacf12_o.png" width="750" height="409" alt="Komodo hyperlink colors" /&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="http://www.flickr.com/photos/trento/3351178023/" title="Komodo hyperlink URL by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3653/3351178023_b5b199f084_o.png" width="626" height="406" alt="Komodo hyperlink URL" /&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="http://www.flickr.com/photos/trento/3352014612/" title="Komodo hyperlink regex by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3615/3352014612_e32aa7eeed_o.png" width="576" height="308" alt="Komodo hyperlink regex" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Currently 5.1.0b1 includes a regex to map occurrences of "bug \d+" 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="http://community.activestate.com/adding-komodo-hyperlink-handler"&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="http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/hyperlinks/hyperlinks.js#37"&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="http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/hyperlinks/regexhandler.js#37"&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 "Go to Definition" 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="http://downloads.activestate.com/Komodo/nightly/"&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="http://community.activestate.com/addons"&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="http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/sdk/CHANGELOG.txt"&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="http://trentmick.blogspot.com/2007/09/intro-to-komodo-extensions_8939.html"&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="http://trentm.com/blog/archives/2009/02/04/history-feature-in-komodo-510-alpha-1/"&gt;"History" 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 "Recent locations" menu a lot more useful:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/trento/3352004444/" title="Komodo section titles in recent history list by trento, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3643/3352004444_fbf864d371.jpg" width="500" height="182" alt="Komodo section titles in recent history list" /&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="http://bugs.activestate.com/show_bug.cgi?id=81606"&gt;bug 81606&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komodo's &lt;a href="http://docs.activestate.com/komodo/5.1/editor.html#matching_brace"&gt;"jump to matching brace"&lt;/a&gt; now works as you'd expect for opening and closing tags in XML/HTML (&lt;a href="http://bugs.activestate.com/show_bug.cgi?id=43239"&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="http://bugs.activestate.com/show_bug.cgi?id=80756"&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="http://bugs.activestate.com/show_bug.cgi?id=80566"&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="http://trentmick.blogspot.com/2009/02/line-or-selection-in-komodo_2909.html"&gt;a "duplicate line or selection" 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="http://bugs.activestate.com/show_bug.cgi?id=80890"&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="margin-left: 30px;"&gt;&lt;a href="http://downloads.activestate.com/Komodo/nightly/"&gt;http://downloads.activestate.com/Komodo/nightly/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-80461642555097073?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/80461642555097073/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/03/hyperlinks-in-komodo-510b1_1005.html#comment-form" title="22 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/80461642555097073" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/80461642555097073" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/03/hyperlinks-in-komodo-510b1_1005.html" title="hyperlinks in Komodo 5.1.0b1" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-7263285379066712357</id><published>2009-02-27T02:41:00.009-08:00</published><updated>2009-11-03T22:27:00.420-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="l10n" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">Find highlighting and Linux/x86_64 support in Komodo 5.1a2</title><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="margin-left: 30px;"&gt;&lt;a href="http://downloads.activestate.com/Komodo/releases/5.1.0a2/"&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="attrlist"&gt;&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&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="http://community.activestate.com/products/Komodo"&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="http://www.activestate.com/komodo/"&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="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html"&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="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="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" /&gt;&lt;embed src="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" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&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="http://docs.activestate.com/komodo/5.1/vikeybind.html"&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 "well, duh" features that we are now able to add with &lt;a href="http://www.scintilla.org/ScintillaDoc.html#Indicators"&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="http://docs.activestate.com/komodo/5.1/tabstops.html"&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="http://community.activestate.com/forums/komodo"&gt;Komodo's forums&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;a href="http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team"&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="http://bugs.activestate.com/show_bug.cgi?id=80668"&gt;whipped&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=79975"&gt;up&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=80670"&gt;a bunch&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=79675"&gt;of&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=80667"&gt;patches&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=80669"&gt;for&lt;/a&gt; &lt;a href="http://bugs.activestate.com/show_bug.cgi?id=80375"&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="margin-left: 30px;"&gt;&lt;a href="http://downloads.activestate.com/Komodo/nightly/"&gt;http://downloads.activestate.com/Komodo/nightly/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-7263285379066712357?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/7263285379066712357/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7263285379066712357" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/7263285379066712357" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/02/find-highlighting-and-linuxx8664_5771.html" title="Find highlighting and Linux/x86_64 support in Komodo 5.1a2" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-2188897047709271737</id><published>2009-02-04T08:08:00.009-08:00</published><updated>2009-10-22T22:08:44.046-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">History feature in Komodo 5.1.0 alpha 1</title><content type="html">&lt;p&gt;We released Komodo 5.1.0 alpha 1 today! Get it here:&lt;/p&gt;

&lt;div style="margin-left: 30px;"&gt;&lt;a href="http://downloads.activestate.com/Komodo/releases/5.1.0a1/"&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="attrlist"&gt;
&lt;tr&gt;&lt;th&gt;email&lt;/th&gt;&lt;td&gt;&lt;a href="http://listserv.activestate.com/mailman/listinfo/komodo-beta"&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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo"&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="http://community.activestate.com/products/Komodo"&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 "History" feature.&lt;/p&gt;

&lt;h2&gt;History overview&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/trento/3253669957/" title="screenshot of Komodo 5.1's history feature"&gt;&lt;img src="http://farm4.static.flickr.com/3009/3253669957_903874fa5c_o.jpg" width="570" height="448" alt="screenshot of Komodo 5.1's history feature" /&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="footnote-ref" id="fnref-1"&gt;&lt;a href="#fn-1"&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="footnote-ref" id="fnref-2"&gt;&lt;a href="#fn-2"&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="http://docs.activestate.com/komodo/5.0/editor.html#go_to_def"&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 "Back".&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="http://svn.openkomodo.com/openkomodo/view/openkomodo/trunk/src/history/editorhistory.py"&gt;here in
"editorhistory.py"&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="http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/chrome/komodo/content/library/history.js"&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="https://developer.mozilla.org/en/The_Places_database"&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="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn-1"&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="#fnref-1" class="footnoteBackLink" title="Jump back to footnote 1 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn-2"&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="#fnref-2" class="footnoteBackLink" title="Jump back to footnote 2 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-2188897047709271737?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/2188897047709271737/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html#comment-form" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/2188897047709271737" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/2188897047709271737" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2009/02/history-feature-in-komodo-510-alpha-1_7169.html" title="History feature in Komodo 5.1.0 alpha 1" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-5049750288652354423</id><published>2008-07-24T12:45:00.009-07:00</published><updated>2009-10-22T22:08:43.844-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="code.activestate.com" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">ActiveState Code: lauched!</title><content type="html">&lt;p&gt;We launched &lt;a href="http://code.activestate.com/"&gt;ActiveState Code&lt;/a&gt; today, &lt;a title="You have seen Monty Python's Holy Grail, right?" href="http://www.urbandictionary.com/define.php?term=And+There+was+Much+Rejoicing"&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="http://code.activestate.com/recipes/tags/"&gt;tagging&lt;/a&gt;, the ability to &lt;a href="http://code.activestate.com/recipes/add/"&gt;add recipes&lt;/a&gt; in a number of other &lt;a href="http://code.activestate.com/recipes/langs/"&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="http://code.activestate.com/aspnredir/categories/"&gt;full details here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I welcome any &lt;a href="http://code.activestate.com/help/feedback/"&gt;feedback&lt;/a&gt; on the site.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-5049750288652354423?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/5049750288652354423/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2008/07/activestate-code-lauched_8936.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/5049750288652354423" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/5049750288652354423" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2008/07/activestate-code-lauched_8936.html" title="ActiveState Code: lauched!" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3106184433350467271</id><published>2008-07-11T07:34:00.009-07:00</published><updated>2009-10-22T22:08:43.753-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="l10n" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">Translating Komodo on babelzilla.org</title><content type="html">&lt;p&gt;At the &lt;a href="http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team"&gt;prompting&lt;/a&gt; of &lt;a href="http://dafizilla.sourceforge.net/"&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="http://www.babelzilla.org/index.php?option=com_wts&amp;amp;Itemid=88&amp;amp;type=lang&amp;amp;extension=3868"&gt;Komodo Language Pack&lt;/a&gt; with Komodo's current &lt;code&gt;en-US&lt;/code&gt; localization to &lt;a href="http://www.babelzilla.org/"&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="http://community.activestate.com/addons"&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="https://translations.launchpad.net/"&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="http://community.activestate.com/forum-topic/localizing-komodo-using-babelzilla-dream-team"&gt;this forum thread&lt;/a&gt; and/or let me know (trentm at activestate dot com).&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3106184433350467271?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3106184433350467271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2008/07/translating-komodo-on-babelzillaorg_8312.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3106184433350467271" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3106184433350467271" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2008/07/translating-komodo-on-babelzillaorg_8312.html" title="Translating Komodo on babelzilla.org" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3458316589919118921</id><published>2008-03-03T05:00:00.009-08:00</published><updated>2009-11-03T22:26:00.612-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="install" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="activestate" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">nightly updates for Komodo (and the Komodo AUS)</title><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="http://trentmick.blogspot.com/2007/05/building-msi-patch-packages-msp-with_695.html"&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 "nightly" 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 "channels":&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;"release": 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;"beta": 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;"nightly": This is a channel that I finally got working on the server-side on Friday. Since the announcement of &lt;a href="http://www.openkomodo.com/"&gt;OpenKomodo&lt;/a&gt; and open sourcing of Komodo Edit we've been doing "nightly" builds of Komodo Edit (built on &lt;em&gt;most&lt;/em&gt; nights :). These are publicly available here: &lt;a href="http://downloads.openkomodo.com/komodoedit/nightly/"&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 "beta" 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="http://bugs.activestate.com/enter_bug.cgi?product=Komodo&amp;amp;component=Update"&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 "channel-prefs.js" 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 "release", "beta" and "nightly" (internal-only).
pref("app.update.channel", "beta");
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Happily that "internal-only" 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="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;-based update server. On the build-side, we have our own Python scripts (&lt;a href="http://grok.openkomodo.com/source/xref/openkomodo/trunk/util/mozupdate.py"&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="https://bugzilla.mozilla.org/show_bug.cgi?id=415181"&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="https://bugzilla.mozilla.org/show_bug.cgi?id=375752"&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="https://bugzilla.mozilla.org/show_bug.cgi?id=410806"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3458316589919118921?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3458316589919118921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2008/03/nightly-updates-for-komodo-and-komodo_5271.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3458316589919118921" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3458316589919118921" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2008/03/nightly-updates-for-komodo-and-komodo_5271.html" title="nightly updates for Komodo (and the Komodo AUS)" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-1305400159227768021</id><published>2007-11-02T08:22:00.009-07:00</published><updated>2009-10-22T22:08:43.442-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">open komodo is out</title><content type="html">&lt;p&gt;The wraps are finally off &lt;a href="http://www.openkomodo.com/"&gt;Open Komodo&lt;/a&gt;!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source: &lt;a href="http://svn.openkomodo.com/openkomodo/browse/openkomodo/trunk"&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="http://grok.openkomodo.com/source/search?q=koDirs"&gt;http://grok.openkomodo.com/source/search?q=koDirs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wiki: &lt;a href="http://wiki.openkomodo.com/index.php/Main_Page"&gt;http://wiki.openkomodo.com/index.php/Main_Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mailing lists: &lt;a href="http://lists.openkomodo.com/mailman/listinfo"&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 "bk" 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="http://svn.openkomodo.com/openkomodo/view/openkomodo/trunk/README.txt"&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="http://svn.openkomodo.com/openkomodo/browse/mk/trunk"&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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-1305400159227768021?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/1305400159227768021/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/11/open-komodo-is-out_2939.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/1305400159227768021" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/1305400159227768021" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/11/open-komodo-is-out_2939.html" title="open komodo is out" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-1613212717365252837</id><published>2007-10-24T08:02:00.009-07:00</published><updated>2009-10-22T22:08:43.404-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">off to FSOSS</title><content type="html">&lt;p&gt;I'm off to &lt;a href="http://fsoss.senecac.on.ca/2007/"&gt;FSSOS&lt;/a&gt; in a few hours.  &lt;a href="http://www.activestate.com/"&gt;We'll&lt;/a&gt; be opening up the Komodo sources next Wednesday, so &lt;a href="http://blogs.activestate.com/shanec/"&gt;Shane&lt;/a&gt; and I will be there to start the discussion about what &lt;a href="http://www.activestate.com/openkomodo/"&gt;Open Komodo&lt;/a&gt; and &lt;a href="http://www.activestate.com/openkomodo/details.plex"&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="http://benjamin.smedbergs.us/blog/2007-10-03/fsoss-2007/"&gt;Benjamin&lt;/a&gt; to ask about breakpad (I want to get breakpad running for Open Komodo and &lt;a href="http://www.activestate.com/komodoide/"&gt;Komodo&lt;/a&gt; builds), looking forward to &lt;a href="http://fsoss.senecac.on.ca/2007/presentationDetails.php?presentationID=29"&gt;Mike Beltzner's talk on UE design at Mozilla&lt;/a&gt;, &lt;a href="http://www.bitstampede.com/2007/10/03/dont-forget-to-fsoss/"&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="http://wiki.mozilla.org/AUS"&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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-1613212717365252837?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/1613212717365252837/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/10/off-to-fsoss_1128.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/1613212717365252837" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/1613212717365252837" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/10/off-to-fsoss_1128.html" title="off to FSOSS" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-877366914933898954</id><published>2007-09-13T09:18:00.009-07:00</published><updated>2009-10-22T22:08:43.285-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mercurial" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">mercurial needs better end-of-line support</title><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="http://hgbook.red-bean.com/hgbookch2.html#x6-290002.2"&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="http://linux.die.net/man/5/hgrc"&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 "encoding" 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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-877366914933898954?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/877366914933898954/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/09/mercurial-needs-better-end-of-line_2291.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/877366914933898954" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/877366914933898954" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/09/mercurial-needs-better-end-of-line_2291.html" title="mercurial needs better end-of-line support" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3695381422084364004</id><published>2007-09-10T09:07:00.009-07:00</published><updated>2009-10-22T22:08:43.260-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">patch for "custom action" for mozilla updater</title><content type="html">&lt;p&gt;&lt;a href="http://dl.getdropbox.com/u/1301040/blog/2007/09/moz_updater_customaction.patch"&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 "relative-path-to-executable"&lt;/pre&gt;

&lt;p&gt;action in the "update.manifest" for a partial or full update (&lt;code&gt;.mar&lt;/code&gt; file) for the &lt;a href="http://wiki.mozilla.org/AUS"&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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3695381422084364004?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3695381422084364004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/09/patch-for-action-for-mozilla-updater_1087.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3695381422084364004" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3695381422084364004" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/09/patch-for-action-for-mozilla-updater_1087.html" title="patch for &amp;quot;custom action&amp;quot; for mozilla updater" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-4023108218193072292</id><published>2007-09-06T07:33:00.009-07:00</published><updated>2009-10-22T22:08:43.159-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">an intro to Komodo extensions</title><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="http://developer.mozilla.org/en/docs/Bundles"&gt;same kind of bundle content in an extension&lt;/a&gt;. However, Komodo adds a number of "hooks" 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 "SDK" 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="http://community.activestate.com/forum/introduction-building-komodo-extension"&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="http://blogs.activestate.com/ericp/2007/01/kid_adding_a_ne.html"&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 "hooks":&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 "hooks" here. The following is
  a list of all extension hooks that Komodo currently supports.

  The "source tree files" 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 "New File"
      dialog. For example, "templates/Common/Foo.pl" will result
      in a new Perl file template called "Foo" in the "Common"
      folder of the "New File" 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).
      ".lexres" files are built from ".udl" source files with
      the "luddite" 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
                              #   "*-mainlex.udl" 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
                              #   "Code Intelligence" prefs panel

  Python modules
      An extension can supply Python modules by placing then in
      the "pylib" directory of the extension. This "pylib" 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
      "Jump to Definition" 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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-4023108218193072292?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/4023108218193072292/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/09/intro-to-komodo-extensions_8939.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/4023108218193072292" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/4023108218193072292" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/09/intro-to-komodo-extensions_8939.html" title="an intro to Komodo extensions" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-6810591020087216774</id><published>2007-09-06T01:57:00.009-07:00</published><updated>2009-10-22T22:08:43.097-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">open komodo and the code</title><content type="html">&lt;p&gt;Yesterday we (ActiveState) announced &lt;a href="http://www.activestate.com/openkomodo/"&gt;Open Komodo&lt;/a&gt;, an open-source project seeded with much of the core of &lt;a href="http://www.activestate.com/Products/komodo_edit/"&gt;Komodo Edit&lt;/a&gt; and &lt;a href="http://www.activestate.com/Products/komodo_ide/"&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="http://blogs.activestate.com/shanec/2007/09/holy-komodo.html"&gt;Shane&lt;/a&gt; and &lt;a href="http://ascher.ca/blog/2007/09/05/open-komodo-thoughts/"&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="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; repository in (quoting Shane paraphrasing Mike Shaver) "Two F**king Months!". 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="http://developer.mozilla.org/en/docs/PyXPCOM"&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="http://www.activestate.com/Products/komodo_edit/"&gt;Komodo Edit&lt;/a&gt; or &lt;a href="http://www.activestate.com/store/evallicense.aspx?PliGuid=8E08763F-FC3D-456F-BE10-F0D725F660F8&amp;"&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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-6810591020087216774?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/6810591020087216774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/09/open-komodo-and-code_847.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/6810591020087216774" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/6810591020087216774" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/09/open-komodo-and-code_847.html" title="open komodo and the code" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1552913144533093368.post-3034738203471484337</id><published>2007-05-29T03:32:00.009-07:00</published><updated>2009-10-22T22:08:43.026-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="wix" /><category scheme="http://www.blogger.com/atom/ns#" term="install" /><category scheme="http://www.blogger.com/atom/ns#" term="komodo" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="mozilla" /><title type="text">building MSI patch packages (.msp) with WiX</title><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="http://www.activestate.com/products/activepython/"&gt;ActivePython&lt;/a&gt; and &lt;a href="http://www.activestate.com/products/komodo_ide/"&gt;Komodo&lt;/a&gt; installers at &lt;a href="http://www.activestate.com/"&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="http://wiki.mozilla.org/Software_Update"&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="http://wix.sourceforge.net/"&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="http://wix.sourceforge.net/manual-wix2/patch_building.htm"&gt;Patch Building&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tramontana.co.hu/wix/lesson4.php"&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 "ActiveFoo" app ("activefoo-1.0.0.msi" and "activefoo-1.0.1.msi"). 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 "activefoo-1.0.0.msi"
    config.wxi
    installimage/       # The ActiveFoo install image
        CHANGES.txt
        foo.exe
        README.txt
1.0.1/
    activefoo.wxs       # This describes "activefoo-1.0.1.msi"
    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="http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/wix_and_msp.zip"&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="http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.0/activefoo.wxs"&gt;1.0.0/activefoo.wxs&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;

&amp;lt;?include config.wxi ?&amp;gt;

&amp;lt;Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"&amp;gt;
  &amp;lt;Product Name="$(var.ProductName)" Id="$(var.ProductCode)"
           Language="1033" Codepage="1252" Version="$(var.ProductVersion)"
           Manufacturer="Acme" UpgradeCode="$(var.UpgradeCode)"&amp;gt;

    &amp;lt;Package Id="????????-????-????-????-????????????" Keywords="Installer"
      Description="$(var.ProductName)"
      Comments="blah blah" Manufacturer="Acme"
      InstallerVersion="200" Languages="1033" Compressed="yes"
      SummaryCodepage="1252" /&amp;gt;

    &amp;lt;Media Id="1" Cabinet="media.cab" EmbedCab="yes" /&amp;gt;

    &amp;lt;!-- Define some of the dir-structure. --&amp;gt;
    &amp;lt;Directory Id="TARGETDIR" Name="SourceDir"&amp;gt;
      &amp;lt;Directory Id="ProgramFilesFolder" Name="PFILES"&amp;gt;
        &amp;lt;Directory Id="INSTALLDIR" Name="$(var.InstallId)"
                   LongName="$(var.InstallName)" /&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="INSTALLLEVEL" Value="1000" /&amp;gt;
    &amp;lt;Feature Id="core" Title="ActiveFoo" Description="The Foo core"
             Level="1"&amp;gt;
      &amp;lt;ComponentRef Id="MainExe" /&amp;gt;
      &amp;lt;ComponentRef Id="ReadMeFiles" /&amp;gt;
    &amp;lt;/Feature&amp;gt;

    &amp;lt;!-- Define all the components. --&amp;gt;
    &amp;lt;DirectoryRef Id="INSTALLDIR"&amp;gt;
      &amp;lt;Component Id="MainExe" Guid="6ee6fda3-6f50-47bf-99b9-6031c720428e"&amp;gt;
        &amp;lt;File Id="MainExe" Name="foo.exe" DiskId="1"
              src="installimage\foo.exe" Vital="yes" /&amp;gt;
      &amp;lt;/Component&amp;gt;
      &amp;lt;Component Id="ReadMeFiles" DiskId="1"
                 Guid="8f2255f3-3eaf-4c82-9688-3545cd9b2018"&amp;gt;
        &amp;lt;File Id="README.txt" Name="README.txt"
              src="installimage\README.txt" /&amp;gt;
        &amp;lt;File Id="CHANGES.txt" Name="CHANGES.txt"
              src="installimage\CHANGES.txt" /&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="http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.0/config.wxi"&gt;1.0.0/config.wxi&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;Include&amp;gt;
  &amp;lt;?define ProductCode = "cdc5e50f-b490-4a37-8ff6-22e3cb3d690e" ?&amp;gt;
  &amp;lt;?define UpgradeCode = "ed340ed8-aa91-4bf6-9dcf-d7f6f4d43737" ?&amp;gt;

  &amp;lt;?define ProductName = "ActiveFoo" ?&amp;gt;
  &amp;lt;?define InstallName = "ActiveFoo" ?&amp;gt;
  &amp;lt;?define InstallId = "AFoo10" ?&amp;gt;
  &amp;lt;?define ProductVersion = "1.0.0" ?&amp;gt;
  &amp;lt;?define ProductURL = "http://www.example.com/products/activefoo/" ?&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 "make.py" script to build "activefoo-1.0.0.msi":&lt;/p&gt;

&lt;pre class="dos"&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 "ActiveFoo" folder in your "Program Files".&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
"&lt;a href="http://msdn2.microsoft.com/en-us/library/aa370579.aspx"&gt;minor
upgrade&lt;/a&gt;", as opposed to a "small update" or a "major upgrade").&lt;/li&gt;
&lt;li&gt;We've added a note to "CHANGES.txt" for the new release.&lt;/li&gt;
&lt;li&gt;We've removed the "foo.exe" file from the install image. This is so we can
see how file removal can be accomplished with a "minor upgrade". 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
"activefoo-1.0.1.msi" would be to (a) update the "ProductVersion" string and
(b) remove the &lt;em&gt;File&lt;/em&gt; and &lt;em&gt;Component&lt;/em&gt; elements for "foo.exe". However, working
from this comment in
&lt;a href="http://www.installsite.org/files/iswi/Upgrading.html"&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,
"foo.exe", I needed to add an explicit &lt;em&gt;RemoveFile&lt;/em&gt; element:&lt;/p&gt;

&lt;pre&gt;
      ...
      &amp;lt;Component Id="MainExe" Guid="6ee6fda3-6f50-47bf-99b9-6031c720428e"&amp;gt;
        &amp;lt;!-- Note: This is how to explicitly remove files in an update. --&amp;gt;
        &amp;lt;RemoveFile Id="removefile1" On="install" Name="foo.exe"/&amp;gt;
      &amp;lt;/Component&amp;gt;
      ...
&lt;/pre&gt;

&lt;p&gt;The ProductVersion we updated in "&lt;a href="http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.1/config.wxi"&gt;1.0.1\config.wxi&lt;/a&gt;":&lt;/p&gt;

&lt;pre class="dos"&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 = "ActiveFoo" ?&amp;gt;
   &amp;lt;?define InstallName = "ActiveFoo" ?&amp;gt;
   &amp;lt;?define InstallId = "AFoo10" ?&amp;gt;
-  &amp;lt;?define ProductVersion = "1.0.0" ?&amp;gt;
+  &amp;lt;?define ProductVersion = "1.0.1" ?&amp;gt;
   &amp;lt;?define ProductURL = "http://www.example.com/products/activefoo/" ?&amp;gt;
 &amp;lt;/Include&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Now we can build "activefoo-1.0.1.msi":&lt;/p&gt;

&lt;pre class="dos"&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
"uncompressed MSI" -- 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 "1.0.1\build\before".&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 "1.0.1\build\after".&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 "msimsp.exe" 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="http://dl.getdropbox.com/u/1301040/blog/2007/05/wix_and_msp/1.0.1/upgrade-1.0.0.wxs"&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="ActiveFoo 1.0.1 Patch"
                      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="ActiveFoo 1.0.1 Patch"
                   DisplayName="ActiveFoo 1.0.1 Patch"
                   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;
         """
         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.)
         """
    --&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="dos"&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 '"C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patching\MsiMsp.Exe" -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 "activefoo-1.0.1-upgrade-1.0.0.msp" 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="http://wix.sourceforge.net/faq.html"&gt;slated to include&lt;/a&gt; "Patch
creation support" and "ClickThrough". 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;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1552913144533093368-3034738203471484337?l=trentmick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://trentmick.blogspot.com/feeds/3034738203471484337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://trentmick.blogspot.com/2007/05/building-msi-patch-packages-msp-with_695.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3034738203471484337" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1552913144533093368/posts/default/3034738203471484337" /><link rel="alternate" type="text/html" href="http://trentmick.blogspot.com/2007/05/building-msi-patch-packages-msp-with_695.html" title="building MSI patch packages (.msp) with WiX" /><author><name>trentm</name><uri>http://www.blogger.com/profile/12705610824898039421</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="13433886039961820785" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry></feed>
