<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8106392</id><updated>2012-01-22T11:41:40.540-08:00</updated><category term='lisp'/><category term='webdev'/><category term='javascript'/><category term='c++'/><category term='mac'/><title type='text'>majuscule</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8106392.post-6758893556290850610</id><published>2008-09-02T19:44:00.001-07:00</published><updated>2008-09-02T19:44:41.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='webdev'/><title type='text'>Mac OS X Web Programmers Toolkit</title><content type='html'>&lt;h2&gt;Free (gratis)&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rsug.itd.umich.edu/software/fugu/" 
	       title="Research Systems Unix Group: Fugu"&gt;Fugu&lt;/a&gt; -
	       Secure FTP. SCP etc. Hasn't really been updated in a while
	       but it works pretty well. Allows you to edit remote files
	       with your favorite local text editor. 
    &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.barebones.com/products/textwrangler/" 
	       title="Bare Bones Software | TextWrangler"&gt;TextWrangler&lt;/a&gt; -
	    Decent text editor from the makers of BBEdit. Major deficiency is
	    that it doesn't support nested languages (e.g. Javascript within HTML,
	    HTML within PHP, etc.).
    &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://homepage.mac.com/roger_jolly/software/" 
	       title="OS X Software"&gt;RegExhibit&lt;/a&gt; - 
	       Interactively test regular expressions
    &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://sourceforge.net/projects/locomotive" 
	       title="SourceForge.net: Locomotive"&gt;Locomotive&lt;/a&gt; -
	    Ruby on Rails in a box. A single standalone application that
	    includes Ruby, MySQL, a web server, and an application to manage
	    them all.
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg" 
	       title="MySQL ::  MySQL 5.0 Downloads"&gt;MySQL 5.0&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.postgresql.org/download/macosx" 
	    title="PostgreSQL: Mac OS X packages"&gt;PostgreSQL&lt;/a&gt;
    &lt;/li&gt;
	&lt;li&gt;
	    &lt;a 
	        href="http://cocoamysql.sourceforge.net/" 
	        title="CocoaMySQL - A MySQL GUI for Mac OS X"&gt;CocoaMySQL&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;
	   &lt;a href="http://aquamacs.org/" 
	      title="Aquamacs: Emacs for Mac OS X"&gt;Aquamacs Emacs&lt;/a&gt; -
	   Holy union of emacs and Aqua. Normal emacs key bindings work (e.g.
	   C-e end of line). Normal Aqua keybindings work (e.g. Cmd-a select all).
	   Includes various elisp functions to bring emacs closer to the 21st
	   century. All in a nice OS X native application with lots of polish.
	&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Not Free&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://macromates.com/" 
	       title="TextMate — The Missing Editor for Mac OS X"&gt;TextMate&lt;/a&gt; -
	    Best text editor ever. (Sorry emacs).
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href="http://www.panic.com/transmit/" 
           title="Panic - Transmit 3 - The next-generation Mac OS X FTP client!"&gt;
           Transmit&lt;/a&gt; - Best FTP/SFTP/SCP client ever. Allows me to edit
           remote filew seemlessly with TextMate. These days I'm often
           connected to the internet intermittently or with high latency.
           Editing files in this idiom (which seems to be almost unique to
           the Mac) is the best way around that.
    &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/8106392-6758893556290850610?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/6758893556290850610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=6758893556290850610' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6758893556290850610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6758893556290850610'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/09/mac-os-x-web-programmers-toolkit.html' title='Mac OS X Web Programmers Toolkit'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-207169408450081565</id><published>2008-08-26T18:47:00.001-07:00</published><updated>2008-09-09T11:44:51.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>emacs deficiencies</title><content type='html'>&lt;p&gt;I want to like emacs more than I do. But it's hard. It's missing all kinds of features that I've gotten used to from more modern text editors. There are many basic operations that, although common in other editing programs and easy enough to implement in emacs-lisp, have never found their way into standard emacs. For instance, why aren't there built-in functions for:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;count-words-[buffer|region]&lt;/li&gt;
 &lt;li&gt;unfill-paragraph&lt;/li&gt;
 &lt;li&gt;kill-entire-line (this function is standard in xemacs)&lt;/li&gt;
 &lt;li&gt;kill-to-beginning-of-line (equivalent to M-0 C-k)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I mean honestly, it's the feakin' 21st century here. It's not like counting the number of words in your buffer is a fringe use-case.&lt;/p&gt;

&lt;p&gt; &lt;span style="text-decoration:line-through;"&gt;Also, how hard would it be to support soft-wrapped text? And why can't I bind commands to the capital letter key combos (e.g. C-N in addition to C-n)?&lt;/span&gt; longlines-mode will get you a close-enough approximation of soft-wrapped text and it should be possible to bind commands with the shift modifier. I just can't get it working on my Mac but I think it's a Terminal.app configuration issue.&lt;/p&gt;

&lt;p&gt;The biggest issue I have with emacs however is that it doesn't support multiple major modes at once. This is a big problem for anyone programming with embedded languages&amp;nbsp;&amp;ndash; particularly web programmers &amp;ndash; as it means that when you're editing HTML with Javascript or CSS, emacs can only be in one (major) mode at a time. So even if it has support for all the different languages in a given buffer, emacs can't switch modes as you move around in the buffer from one language section to another.
&lt;/p&gt;

&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a project called &lt;a href="http://mmm-mode.sourceforge.net/"&gt;MMM&lt;/a&gt; (Multiple Major Modes) that's trying (or tried, it hasn't been updated since 2004) to remedy that problem but it's an add-on, has limited language support, and requires customization for every language combination that you want to use.
&lt;/p&gt;

&lt;p&gt;Okay, enough with the complaining. Let's try something a little more constructive. Here are some useful bits of emacs-lisp to rectify some of my complaints. I found all of them with Google so I can't take credit for anything below. Apologies for the line truncation that's happening in the &amp;lt;pre&amp;gt; tags. Something lame with blogspot templates going on there.&lt;/p&gt;

&lt;h2&gt;Kill Away&lt;/h2&gt;
&lt;pre&gt;
(defun unfill-paragraph ()
  (interactive)
  (let ((fill-column (point-max)))
  (fill-paragraph nil)))
&lt;/pre&gt;
&lt;pre&gt;
&lt;span style="color:#aaa;"&gt;
;; No longer neccessary. See &lt;a href="#update"&gt;update&lt;/a&gt; below
(defun kill-entire-line ()
  "Kill this entire line (including newline), 
regardless of where point is within the line."
  (setq kill-whole-line t)
  (interactive)
  (beginning-of-line)
  (kill-line)
  (setq kill-whole-line nil))

;; If you care to bind it
(global-set-key [(control ,)] 'kill-entire-line)
&lt;/span&gt;
&lt;/pre&gt;
&lt;h2&gt;Counting words&lt;/h2&gt;
&lt;pre&gt;
;; This one is nice and simple but has a 
;; slightly awkward output. E.g.
;; Word count: 325 occurances.
(defun wc ()
  (interactive)
  (message "Word count: %s" 
           (how-many "\\w+" 
                     (point-min) (point-max))))

;; Nice version from Robert J. Chassell's 
;; /Programming in Emacs Lisp/
;; Available at http://www.gnu.org/software/emacs/emacs-lisp-intro/
(defun count-words-region (beginning end)
  "Print number of words in the region."
  (interactive "r")
  (message "Counting words in region ... ")

;;; 1. Set up appropriate conditions.
  (save-excursion
    (let ((count 0))
      (goto-char beginning)

;;; 2. Run the while loop.
      (while (and (&lt; (point) end)
                  (re-search-forward "\\w+\\W*" end t))
        (setq count (1+ count)))

;;; 3. Send a message to the user.
      (cond ((zerop count)
             (message
              "The region does NOT have any words."))
            ((= 1 count)
             (message
              "The region has 1 word."))
            (t
             (message
              "The region has %d words." count))))))

;; Count the words in the entire document
(defun count-words-buffer ()
  "Count all the words in the buffer"
  (interactive)
  (count-words-region (point-min) (point-max) )
)
&lt;/pre&gt;

&lt;h2&gt;Longlines.el (aka soft-wrap)&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.emacswiki.org/cgi-bin/wiki/longlines.el"&gt;Most excellent elisp code&lt;/a&gt; to simulate soft-wrapping in emacs. Basically, hard-returns are inserted when text is loaded or typed into a buffer but all such returns are removed when the buffer is saved to disk.&lt;/p&gt;


&lt;h2&gt;Shell Mode Improvements&lt;/h2&gt;
&lt;p&gt;I have my shell set to use a colorized prompt. With default setting, emacs shell mode renders a colorized prompt pretty poorly. &lt;a href="http://amitp.blogspot.com/2007/04/emacs-color-in-shell-buffers.html" title="Amit's Thoughts: Emacs: color in shell buffers"&gt;Amit Patel's blog&lt;/a&gt;I has some useful settings&lt;/p&gt;

&lt;pre&gt;
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
(setq comint-prompt-read-only t)
&lt;/pre&gt;

&lt;h2&gt;&lt;a name="update"&gt;Update: (2008-09-09)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Well eat me and get big: emacs22 addresses some of my complaints. First, kill-entire-line is a standard command. It's supposed to be bound to C-S-&amp;lt;backspace&amp;gt; but I can't get it to work on my Mac in Terminal.app. I suspect Terminal.app is doing something non-kosher to the shift-ctrl combo but I'm not sure. In any case, it should be possible to bind commands to capital letters.&lt;/p&gt;

&lt;p&gt;Second, longlines support is standard. M-x longlines-mode and you're set. &lt;/p&gt;

&lt;p&gt;Haven't checked it out yet but Flymake seems like it should be awfully cool. It's supposed to do on the fly compile/syntax checking.&lt;/p&gt;

&lt;p&gt;You can cycle through open buffers with C-x left and C-x right.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-207169408450081565?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/207169408450081565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=207169408450081565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/207169408450081565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/207169408450081565'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/08/emacs-deficiencies.html' title='emacs deficiencies'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-5154370149831192643</id><published>2008-07-23T16:51:00.001-07:00</published><updated>2009-05-15T17:13:42.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Where art thou iTerm?</title><content type='html'>&lt;p&gt;UPDATE(2009-05-16): I found a fix for the broken meta-key problem on the iTerm bug tracker. Check out: http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1294192&amp;group_id=67789&amp;atid=518973&lt;/p&gt;

&lt;p&gt;UPDATE(2008-09-26): iTerm released an update on Sept 24th. It seems to fix the mouse selection problem mentioned below but I still can't get the alt key to act as a Meta key in either local or remote connections. Key combos using alt just print out non-ASCII characters.&lt;/p&gt;

&lt;p&gt;Leopard has a pretty decent terminal emulator in Terminal.app and I use it all the time. But before Leopard, Terminal.app left much to be desired and so I used a third party freebie called &lt;a href="http://iterm.sourceforge.net/index.shtml"&gt;iTerm&lt;/a&gt;. The biggest advantage over Terminal.app was that you could open a bunch of terms in tabs instead of needing a separate window for each. Now Terminal.app has tabs and that seems to have killed interest in iTerm. As of this writing, the "News" section on the iTerm webpage hasn't had any postings in a year and a half.&lt;/p&gt;

&lt;p&gt;I find this a little sad. iTerm still has some things going for it that haven't found their way into Terminal.app (and may never). I miss Full screen mode. I miss iTerm's ability to override the color values for ANSI colors. The default blue color (used for directories) is essentially unreadable on a black background so with iTerm I lightened up the blue. I can't do this in Terminal.app so I'm back to squinting at directory names. I also think iTerms handling of bookmarks and tabs was more intelligent than Terminal but that's almost a quibbling issue.&lt;/p&gt;

&lt;p&gt;So why don't I still use iTerm? Three reasons. First, iTerm has weird mouse selection behavior. When you select a line of text with the mouse moving from left to right, you have to be sure to position the cursor all the way to the left of the first character you want to select. I used to end up missing the first character all the time until I managed to override my habits. Right to left selection works fine. Second, I could never get the meta/alt/option key to work correctly in remote terms. I use Meta-d and Meta-backspace in bash quite often and I could never get it to work on remote connections to my Linux machines. It's easy to get working on Terminal.app. Lastly, iTerm has never supported .term files. These are a little known secret of Terminal.app that have been around since at least 10.3 (though they may go all the way back to 10.0). They allowed me to create files that would initiate ssh connections to particular machines. I used to keep a directory in my dock with a bunch of .term files in it so that I could right-click and jump to any machine that I needed to work on. Then I started using Quicksilver and dispensed with the Dock folder altogether. I could open a new Terminal.app window with an ssh connection to my workstation just as quickly as I could type Cmd-Space ws [enter]. &lt;/p&gt;

&lt;p&gt;So iTerms's source is freely available on sourceforge. Maybe when I get several months of free time I can hack in those features. Go open source. When you find yourself frustrated with a product, all it takes is a degree in Computer Science, years of professional experience, and several months to get up to speed on a codebase.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-5154370149831192643?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/5154370149831192643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=5154370149831192643' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5154370149831192643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5154370149831192643'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/07/where-art-thou-iterm.html' title='Where art thou iTerm?'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-7600460023994593493</id><published>2008-07-16T12:47:00.001-07:00</published><updated>2008-07-23T16:51:48.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>ANSI Color Codes in C++</title><content type='html'>&lt;p&gt;I finally got around to figuring out how to get C++ to output text in
different colors (assuming your output system (terminal) supports it). It's &lt;a
href="http://deathray.us/code/color_output.html" title="color-output.cc"&gt;not at
all difficult &lt;/a&gt;, it just requires knowing the string representations of the
ANSI color codes. I haven't tried it with C/printf but I can't see why it
wouldn't work the same way.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-7600460023994593493?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/7600460023994593493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=7600460023994593493' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/7600460023994593493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/7600460023994593493'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/07/ansi-color-codes-in-c.html' title='ANSI Color Codes in C++'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-2066970551521196059</id><published>2008-06-18T16:05:00.001-07:00</published><updated>2008-07-16T12:42:14.185-07:00</updated><title type='text'>HP 35s</title><content type='html'>&lt;p&gt;I've been wanting another RPN calculator to use at work so after months of
ignoring the HP35s that was sitting in my Amazon wish list, I finally ponied up
and bought one.&lt;/p&gt;

&lt;p&gt;It arrived today and boy is it disappointing. I don't know if it's supposed
to harken back to HP's glory days but its RPN mode is pretty hobbled. The stack
is only 4 levels deep(!) and the top and bottom positions clone when the stack
is shifted up and down. Very annoying and quite different from the HP that I
bought about 15 years ago (and still use at home).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-2066970551521196059?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/2066970551521196059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=2066970551521196059' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/2066970551521196059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/2066970551521196059'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/06/hp-35s.html' title='HP 35s'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-6010932110785154710</id><published>2008-01-29T16:19:00.001-08:00</published><updated>2008-07-16T12:28:06.812-07:00</updated><title type='text'>Old issues of Wired</title><content type='html'>&lt;p&gt;Fuck. A bad day.&lt;/p&gt;

&lt;p&gt;One positive thing: I drew up a list of old issues of Wired that I’d like to
have because they featured articles by Bruce Sterling or Neal Stephenson. Then,
I ransacked the library of back issues that someone has discarded here at the
office. I found most of the isses I was looking for. The articles themselves
I’ve mostly already read on-line but this way I get the photos and layout.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-6010932110785154710?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/6010932110785154710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=6010932110785154710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6010932110785154710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6010932110785154710'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/01/old-issues-of-wired.html' title='Old issues of Wired'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-8121093477023244185</id><published>2008-01-25T15:30:00.001-08:00</published><updated>2008-01-25T15:30:49.656-08:00</updated><title type='text'>David Foster Wallace article on talk radio</title><content type='html'>&lt;a href="http://www.theatlantic.com/doc/200504/wallace"&gt;Brilliant.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-8121093477023244185?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/8121093477023244185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=8121093477023244185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8121093477023244185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8121093477023244185'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/01/david-foster-wallace-article-on-talk.html' title='David Foster Wallace article on talk radio'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-8294005510548480643</id><published>2008-01-17T15:01:00.001-08:00</published><updated>2008-07-16T12:30:21.654-07:00</updated><title type='text'>Desk</title><content type='html'>The desk I’m stitting at is a featureless white rectangle with rounded corners.
It supports a pair of giant flat-panel monitors, taller than they are wide and
with edges flush, so the pair looks like a giant, luminous book, opened before
me. The rest of the surface looks like a battle ground between the Rectangles
and the Cylinders. The Rectangles have piles of paper, a notebook, the monitors,
a clipboard and no fewer than three sizes of sticky paper pads. The Cylinders
count among their members: a cup, a tin of tea leaves, a medicine bottle (with
one tiny cyindrical pill inside), a can of compressed air and a handful of pens.
I seem to be in league with the Rectangles. Every day I produce more of them and
drain the contents of the Cylinders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-8294005510548480643?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/8294005510548480643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=8294005510548480643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8294005510548480643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8294005510548480643'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2008/01/desk.html' title='Desk'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-5671524082163042095</id><published>2007-11-13T17:36:00.001-08:00</published><updated>2007-11-13T17:36:35.376-08:00</updated><title type='text'>On the prospects of creating a headless Firefox</title><content type='html'>&lt;p&gt;I've often wondered how hard it would be to make a headless version of Firefox. HTTPUnit is nice and all but if you want to ensure that everything is behaving as it does in a real browser there's nothing better than using a real browser.&lt;/p&gt;

&lt;p&gt;So setting aside all questions as to difficulty does the idea of a headless Firefox even make conceptual sense? You'd at least need some way to script or control the behavior externally. But let's imagine you designed a feature where by hovering over an event you triggered an Ajax request or caused some DOM fragment to be constructed on the fly. In order to get the headless browser to do that you'd need to either have to tell it to simulate the mouse movement or tell it to artificially fire the hover event for the element in question.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-5671524082163042095?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/5671524082163042095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=5671524082163042095' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5671524082163042095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5671524082163042095'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/11/on-prospects-of-creating-headless.html' title='On the prospects of creating a headless Firefox'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-2338715033504047141</id><published>2007-10-30T19:19:00.000-07:00</published><updated>2007-12-20T21:45:50.982-08:00</updated><title type='text'>(Lesser known) things I like about Leopard</title><content type='html'>&lt;ol&gt;
  &lt;li&gt;
  	Calculator.app sports a fully functional RPN mode. It's had RPN mode 
  	since Panther but it always seemed like a shoehorned afterthought. 
  	Switching to RPN never produced any change in the UI and RPN really 
  	demands a multi-line display. Now it has one. There's one quirk I've
  	noticed: when you type a number and press enter, the number gets pushed
  	up the stack (as it should) and then gets duplicated on the line below
  	(not as it should). As soon as you begin to type a new number, the
  	doubled entry disappears but it should never have appeared in the first
  	place.
  &lt;/li&gt;
  &lt;li&gt;Calculator.app can now also display digit seperators.&lt;/li&gt;
  &lt;li&gt;
    The Airport menu (from the drop-down in the menu bar) now shows lock 
    icons next to those networks which are protected. You can see at a 
    glance if there are any available networks that are open.
    &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" 
       href="http://bp3.blogger.com/_evHShtm_GMA/Ryfmiwgjh-I/AAAAAAAAAsY/bn4t36K6cwY/s1600-h/wireless.png"&gt;
    &lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" 
         src="http://bp3.blogger.com/_evHShtm_GMA/Ryfmiwgjh-I/AAAAAAAAAsY/bn4t36K6cwY/s320/wireless.png" 
         border="0" alt=""id="BLOGGER_PHOTO_ID_5127320185595987938" /&gt;&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;Hitting command-backspace from any NSTextEdit field will delete
    from the cursor to the beginning of the line. This means TextEdit gets
    the "feature" I most miss when I'm away from TextMate.&lt;/li&gt;
  &lt;li&gt;iCal.app no longer changes the size of your window when you switch
    from (say) month view to week view.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-2338715033504047141?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/2338715033504047141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=2338715033504047141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/2338715033504047141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/2338715033504047141'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/10/lesser-known-things-i-like-about.html' title='(Lesser known) things I like about Leopard'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_evHShtm_GMA/Ryfmiwgjh-I/AAAAAAAAAsY/bn4t36K6cwY/s72-c/wireless.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-1588825909209648461</id><published>2007-10-24T12:20:00.001-07:00</published><updated>2008-07-16T12:34:34.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>ECMAScript 4 Overview (final draft)</title><content type='html'>&lt;p&gt;The final draft of the Overview that describes what's going to be in Javascript 4 (E4) is &lt;a href="http://www.ecmascript.org/es4/spec/overview.pdf" title=""&gt;online as a pdf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Interestingly, this represents a point of departure from previous Javascript updates in that the group will provide a "reference implementation" in ML! And I though all that time I spent working in ML back in college would surely go to waste.&lt;/p&gt;

&lt;p&gt;You can grab the standard SML release for Mac (as a DMG even) from &lt;a href="http://smlnj.cs.uchicago.edu/dist/working/110.60/smlnj-for-intel-mac-110.60.dmg" title=""&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-1588825909209648461?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/1588825909209648461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=1588825909209648461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/1588825909209648461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/1588825909209648461'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/10/ecmascript-4-overview-final-draft.html' title='ECMAScript 4 Overview (final draft)'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-5936850409005187620</id><published>2007-09-13T16:08:00.001-07:00</published><updated>2008-07-16T12:33:33.449-07:00</updated><title type='text'>Bike to Work</title><content type='html'>&lt;p&gt;I biked to work last Friday. No different from any other Firday at previous 
  jobs except that I now work 42 miles from home. So &lt;a 
  href="http://deathray.us/geodata/rides/sf2g.html"&gt;my 
  commute&lt;/a&gt; took 3 hours.
&lt;/p&gt;

&lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=http:%2F%2Fdeathray.us%2Fkml%2Fsf2g-bayway.kml&amp;amp;ie=UTF8&amp;amp;ll=37.586965,-122.251407&amp;amp;spn=0.330365,0.334495&amp;amp;t=h&amp;amp;output=embed&amp;amp;s=AARTsJpmUKqO98MpkHkzywYA4PVlDCkp3A"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=http:%2F%2Fdeathray.us%2Fkml%2Fsf2g-bayway.kml&amp;amp;ie=UTF8&amp;amp;ll=37.586965,-122.251407&amp;amp;spn=0.330365,0.334495&amp;amp;t=h&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;
&lt;p&gt;&lt;a href="http://deathray.us/kml/sf2g-bayway.kml"&gt;Download the KML file.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-5936850409005187620?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/5936850409005187620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=5936850409005187620' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5936850409005187620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/5936850409005187620'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/09/bike-to-work.html' title='Bike to Work'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-6850288796752542637</id><published>2007-07-09T09:48:00.000-07:00</published><updated>2007-10-25T09:48:54.999-07:00</updated><title type='text'>New Job (@ Google!)</title><content type='html'>I've started a new job at Google!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-6850288796752542637?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/6850288796752542637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=6850288796752542637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6850288796752542637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/6850288796752542637'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/07/new-job-google.html' title='New Job (@ Google!)'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-4683031468826595822</id><published>2007-03-14T23:33:00.001-07:00</published><updated>2007-11-28T23:03:05.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>BBEdit Comes Around</title><content type='html'>&lt;p&gt;We programmers spend a &lt;em&gt;lot&lt;/em&gt; of time editing text and tend to feel pretty strongly about the relative merits of various text editors. For the better part of two jobs - spanning nearly four years - I lived and breathed in &lt;a href="http://www.barebones.com/products/bbedit/"&gt;BBEdit&lt;/a&gt;, &amp;#8220;the programmer&amp;#8217;s text editor&amp;#8221;. It&amp;#8217;s always seemed like a good product but even then it was already quite old and it seemed like its designers were resting on their laurels somewhat. The interface looked about the same as it had when my friend was using it in college on OS 9 back in 1998. There didn&amp;#8217;t seem to be much work going on to create innovative features or even to copy ones that had started to crop up in other editing programs. But it still had an impressive feature list and at the time was by far the best tool for creating HTML/XML/CSS on Mac OS X.&lt;/p&gt;

&lt;p&gt;But somewhere along the way I noticed &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;. I saw a screencast for some Ruby on Rails demo and they were using snippets - type a keyword, hit some expansion key, get a whole bunch of templated text for free. I didn&amp;#8217;t know the TextMate name for it but I knew the feature: it was the thing I most missed from a Java editing program that was a one time favorite on Windows. I decided to give TextMate a try even though it wasn&amp;#8217;t free and even though I&amp;#8217;d already shelled out big bucks for BBEdit (well, truth be told, the Reagents of the University of California shelled out the big bucks for BBEdit).&lt;/p&gt;

&lt;p&gt;Over the years I&amp;#8217;ve probably married about a dozen different text editors so it&amp;#8217;s not a tremendously big deal for me to switch to something new. The muscle memory takes a little overcoming but it&amp;#8217;s nothing horrific, especially if you&amp;#8217;re not also switching platforms to something where the modifier keys are totally different.&lt;/p&gt;

&lt;p&gt;It didn&amp;#8217;t take long before I was hitched to TextMate. With the exception of occasional forays into emacs I&amp;#8217;ve been using it exclusively for about 2 years. I switched and never looked back. Until today.&lt;/p&gt;

&lt;p&gt;I was reading a blog which suggested that BBEdit had finally updated their interface so that it looked less out of place on OSX than does a disco ball at a funeral. So I downloaded the trial version (8.6) and gave it a spin.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s plenty to like&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The icon looks less like ass. I was using BBEdit when they switched from their chestnut of an icon to something that looked like a beta placeholder for the image it was replacing.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://designweenie.com/images/2004/bbedit-icons.png" alt="classic" title="" /&gt;&lt;/p&gt;

&lt;p&gt;Either the whole thing was a play from the people that brought us New Coke and Coke Classic or they&amp;#8217;ve seen the light: the newest version looks like the old except rotated a few degrees.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rumors of interface polishing are true. The changes are rather minor but still welcome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They&amp;#8217;ve revamped their Glossary tool. Now it&amp;#8217;s called Clippings and it works much like snippets in TextMate. The expansion key (F5) is a little awkward, especially on laptops. And where TextMate allows you to cycle through various pre-defined locations in the expansion text by repeatedly pressing the the same key (tab) that expanded the text in the first place, BBEdit uses Ctrl-` to cycle through positions. F5 still seems like a bad choice but having a different key command to cycle through the positions actually seems like a good idea. One annoying thing about TextMate&amp;#8217;s snippet system is that you can&amp;#8217;t expand a snippet if you&amp;#8217;re still tabbing through the positions of a snippet you just expanded. It will interpret &amp;#8220;tab&amp;#8221; as a request to move to the next position instead of searching for an expansion. The BBEdit team seems to have made a better choice in this matter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They&amp;#8217;ve added support for a few more languages including Markdown and, get this, SQL. Yeah, it&amp;#8217;s 2007 and they&amp;#8217;re just getting around to adding SQL. Still they did it well and have support for multiple SQL variants like PL/SQL and MySQL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They&amp;#8217;ve added a preview window just like TextMate and SubEthaEdit. If you keep it open while you type it will refresh the preview automatically whenever you stop typing for a second or two. You don&amp;#8217;t need to save the document to use it. Yeah, it&amp;#8217;s just like TextMate and yes, it feels like they&amp;#8217;re copying but it&amp;#8217;s still a worthwhile addition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code folding. I make very little use of this feature but I&amp;#8217;m sure it has its fans.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As long as they were out copying features I wish they&amp;#8217;d copied a little more. There is still no equivalent to TextMate&amp;#8217;s themes. The syntax highlighting engine still doesn&amp;#8217;t support things like making keywords boldface. It still has pretty poor support for editing files with mixed languages (like PHP inside HTML). It still needs an organizational concept as functional and powerful as TextMate&amp;#8217;s bundle system.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not going to move back to BBEdit any time soon but these recent changes are enough to entice me into checking back on it in a few months. If nothing else, BareBones seems to have recognized that they&amp;#8217;ve been squandering their name recognition and an enormous lead and that if they want to remain competitive they&amp;#8217;ll need to start making radical changes. I think they made a couple of large mistakes when they moved to OS X. They ported the code but didn&amp;#8217;t seem to do much to avail themselves of all that Objective C and Cocoa would provide. Even if they wanted to exploit the undeniable advantage of their extensively optimized and highly debugged text engine, they should have recognized that the arrival of OS X meant that others less encumbered than they would be able to make full use of everything from XCode to Cocoa to Objective C to the UNIX shell, and that this might allow a hypothetical upstart to move so quickly that any initial lead could evaporate before you could say &amp;#8220;reality distortion field.&amp;#8221;&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-4683031468826595822?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/4683031468826595822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=4683031468826595822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/4683031468826595822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/4683031468826595822'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/03/bbedit-comes-around.html' title='BBEdit Comes Around'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-1172904182832317231</id><published>2007-03-13T22:50:00.001-07:00</published><updated>2008-08-27T09:30:07.234-07:00</updated><title type='text'>Pardon the interruption</title><content type='html'>&lt;p&gt;I am typing this entry using &lt;a href="http://www.red-sweater.com/marsedit/"&gt;MarsEdit&lt;/a&gt; 1.1.5(207), of which I just downloaded a trial version. It seems you can edit your posts in whatever text editor you choose but I need to see if I can specify that markdown formatting is to be applied as part of the post procedure or if that&amp;#8217;s something that&amp;#8217;s only available while you&amp;#8217;re previewing your post in MarsEdit.&lt;/p&gt;

&lt;p&gt;This sentence should begin a new paragraph and &lt;em&gt;this&lt;/em&gt; word should be italicized. &lt;/p&gt;

&lt;p&gt;Update: it turns out markdown syntax is recognized by MarsEdit&amp;#8217;s built-in preview window but there doesn&amp;#8217;t seem to be any way to configure it to run your post through markdown prior to submitting it to your blog. Even more mysterious, there doesn&amp;#8217;t seem to be any way to &lt;em&gt;manually&lt;/em&gt; convert your markdown-formatted post into HTML suitable for posting. It&amp;#8217;s lucky that I have a licensed copy of TextMate and that MarsEdit will allow me to edit my post there.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-1172904182832317231?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/1172904182832317231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=1172904182832317231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/1172904182832317231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/1172904182832317231'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/03/pardon-interruption.html' title='Pardon the interruption'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-3105579185156179916</id><published>2007-03-01T21:48:00.000-08:00</published><updated>2007-03-15T20:45:51.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>iTerm goes full screen</title><content type='html'>&lt;p&gt;I started using iTerm pretty regularly at work a few months ago because it supported multiple tabs. I flirted with the program long before that but it seemed too unstable back then so I gave it up and went back to Terminal.app. The stability has improved a lot since then but there has always been one feature I found missing: full screen support.&lt;/p&gt; 

&lt;p&gt;Until now.&lt;/p&gt;

&lt;p&gt;I didn't even notice when it happened but the most recent versions of &lt;a href="http://iterm.sourceforge.net/"&gt;iTerm&lt;/a&gt; now sport a great full screen mode.&lt;/p&gt;

&lt;p&gt;Like a lot of programmers (and sysadmins) I spend a good deal of time working in a terminal. At work, a lot of us do. The crowd seems to be split between:&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;those who think full-screen mode is the coolest thing since screensavers&lt;/li&gt; 
 &lt;li&gt;those who make fun of the first group&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm such a fan of full-screen mode that I've long kept GLTerminal on my machine just for those instances where I want to work in a terminal without any distractions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-3105579185156179916?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/3105579185156179916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=3105579185156179916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/3105579185156179916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/3105579185156179916'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/03/iterm-goes-full-screen.html' title='iTerm goes full screen'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-8811257362124841207</id><published>2007-01-31T22:25:00.000-08:00</published><updated>2007-01-31T23:09:09.554-08:00</updated><title type='text'>XSL[T|-FO]</title><content type='html'>&lt;p&gt;My friend (and co-worker, and constant source of distraction) Kirt was poking around the company intranet today and came across a document detailing interview questions for &amp;#8220;XSLT Developers&amp;#8221;. When I was doing Java for a living I used XSLT quite a lot and eventually became quite good at using it effectively. Naturally, I was curious to see what we had to say about the qualifications of a good XSLT developer, especially since as far as I know, we don&amp;#8217;t now, nor have we ever, used the slightest bit of XSLT for any part of our entire system.&lt;/p&gt;

&lt;p&gt;Using the document to conduct an actual interview would have made for a pretty miserable experience which - since we&amp;#8217;ve never used it and are unlikely to ever use it - I&amp;#8217;m okay with. But it reminded me that there is a lot of confusion about what XSLT is and isn&amp;#8217;t. XSLT and XSL are not synonymous. XSLT is a language for transforming XML documents. XSLT is but one of two components of the larger XSL, the other being XSL-FO: which is a language for specifying visual display. XSL is just a unifying term, a shorthard for saying &amp;#8220;XSLT plus XSL-FO.&amp;#8221; &lt;a href="http://en.wikipedia.org/wiki/Xsl"&gt;Wikipedia&amp;#8217;s&lt;/a&gt; article on XSL disagrees with at least two points here but I won&amp;#8217;t go into it other than to say that Wikipedia (though I love it so) is wrong.&lt;/p&gt;

&lt;p&gt;I think that part of the reason why XSL and XSLT are used interchangeably is that in the beginning, XSLT pretty much &lt;em&gt;was&lt;/em&gt; all of XSL. Sure, XSL-FO was envisioned early on but it took a long time to get a standard and it took a &lt;em&gt;really&lt;/em&gt; long time to get an implementation. XSLT had a standard and multiple implementations while XSL-FO was nothing more than a dim idea. If you started using XSLT back then, you could be forgiven for thinking that was all there was to XSL.&lt;/p&gt;

&lt;p&gt;The other point of confusion about XSLT is that it&amp;#8217;s nothing more than a glorified variable substitution engine with horrid syntax. It&amp;#8217;s syntax is retched and you certainly &lt;em&gt;can&lt;/em&gt; use it to simply plug variables into an output template but XSLT is a lot more capable than that. It took me a long time to see and even longer to really understand that XSLT is basically a functional programming language. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-8811257362124841207?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/8811257362124841207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=8811257362124841207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8811257362124841207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/8811257362124841207'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/01/xslt-fo.html' title='XSL[T|-FO]'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-634828474705675338</id><published>2007-01-22T21:30:00.000-08:00</published><updated>2008-08-27T08:36:36.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>lisp on OS X</title><content type='html'>&lt;p&gt;I’ve decided (finally) to learn lisp. I don’t know if it will 
&lt;a href="http://www.catb.org/~esr/faqs/hacker-howto.html#skills1"&gt;make me 
a better programmer&lt;/a&gt; but if even half of what 
&lt;a href="http://www.paulgraham.com/avg.html"&gt;Paul Graham says 
about it&lt;/a&gt; is true, it has to be the best programming language ever written. =)
&lt;/p&gt;

&lt;p&gt;Mac OS X doesn’t ship with a lisp interpreter but there are several 
free implementations out there. After ruling out the ones that cost 
money and the ones that have icky IDEs that run in X11 and the ones that 
depend on things like Fink, you’re really only left with two options.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://trac.clozure.com/openmcl"&gt;Clozure CL&lt;/a&gt; (formerly known as OpenMCL)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sbcl.org/"&gt;SBCL&lt;/a&gt; (Steele Bank Common Lisp)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I went with SBCL because it works on both PowerPC and intel. Installing it 
is pretty easy. You do need to have the Developer Tools installed on your computer as the install process makes use of gcc.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://sbcl.sourceforge.net/platform-table.html"&gt;Download 
    the “binary” for the platform of your choice&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Uncompress/untar the bz2 file&lt;/li&gt;
&lt;li&gt;Fire up Terminal.app&lt;/li&gt;
&lt;li&gt;cd to the directory that you extracted from the tar file&lt;/li&gt;
&lt;li&gt;Run the following commands:
&lt;pre&gt;INSTALL_ROOT=/usr/local
sudo sh install.sh&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s all there is to it. At this point you can run the lisp interpreter
(sbcl) or bring up the man page for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; (27 August 2008): &lt;a href="http://trac.clozure.com/openmcl"&gt;Clozure CL&lt;/a&gt; now supports both PPC and x86-64. CCL has always had better integration support for Mac OS X so it may now be a better choice for Mac users than SBCL. I haven't used it much but I plan to put it through it's paces.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-634828474705675338?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/634828474705675338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=634828474705675338' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/634828474705675338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/634828474705675338'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/01/lisp-on-os-x.html' title='lisp on OS X'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-861783060214556404</id><published>2007-01-17T21:59:00.000-08:00</published><updated>2007-01-22T21:27:33.313-08:00</updated><title type='text'>Sunnis and Shiites</title><content type='html'>&lt;p&gt;If you pay attention to the news, it&amp;#8217;s nearly impossible to go a day without hearing about Sunnis and Shiites. Assuming you start out knowing nothing about them, it only takes a few news stories to figure out the most pertinent facts: they&amp;#8217;re Islamic groups that seem to hate each other. But the news outlets never tell you anything about &lt;em&gt;why&lt;/em&gt; Sunnis and Shiites don&amp;#8217;t get along. If you want to understand that, you have to do a little research of your own.&lt;/p&gt;

&lt;p&gt;The best and most succinct description I&amp;#8217;ve read comes from Thomas L. Friedman&amp;#8217;s &lt;a href="http://www.amazon.com/Beirut-Jerusalem-Revised-Thomas-Friedman/dp/0374158959/sr=8-2/qid=1169099766/ref=pd_bbs_2/002-4243179-6280818?ie=UTF8&amp;amp;s=books"&gt;&lt;em&gt;From Beirut to Jerusalem&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Muslims of the world have long been divided between Sunnis, who
  are the majority, and Shiites. In the seventh century, shortly after
  the death of Islam&amp;#8217;s founder, the prophet Muhammad a dispute arose
  over who should be his successor as spiritual and political leader,
  known as caliph. One group, the majority, argued that Muhammad&amp;#8217;s
  successor should be appointed through the process of election and
  consensus by the elders of the community, as was the tradition of the
  desert. &lt;em&gt;Sunna&lt;/em&gt; in Arabic means tradition, and those who held this view
  became known as the Sunnis.&lt;/p&gt;
  
  &lt;p&gt;A minority faction, however, argued that Muhammad&amp;#8217;s successors should
  come exclusively from his own family and their descendants. They
  insisted, therefore, that his first cousin and son-in-law&amp;#8212;Ali&amp;#8212;be
  appointed as leader of the community. Those who held this view became
  known in Arabic as the Shia or &amp;#8220;partisans,&amp;#8221; of Ali. The Shiites were
  clearly influenced by the notion of divine-right monarchy of
  pre-Islamic Persia (Iran). The Sunnis eventually defeated the
  supporters of Ali and installed their own chosen caliphs.
  Nevertheless, the Sunni-Shiite split has continued down through the
  ages of Islam, and a whole body of theological and even cultural
  differences developed, distinguishing Shiites from Sunnis. Summarizing
  these differences, Islam expert Edward Mortimer observed in his book
  &lt;em&gt;Faith &amp;amp; Power&lt;/em&gt;: &amp;#8220;Sunni Islam is the doctrine of power and achievement.
  Shi&amp;#8217;ism is the doctrine of opposition. The starting point of Shi&amp;#8217;ism is
  defeat: the defeat of Ali and his house&amp;#8230;. Its primary appeal is
  therefore to the defeated and oppressed. That is why it has so often
  been the rallying cry for the underdogs in the Muslim world &amp;#8230;
  especially for the poor and dispossessed.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Iraq happens to be one of only two Islamic countries (Iran is the other) where the Shia constitute a majority of the population (about 60 percent). This does nothing to help explain the Iran-Iraq war but does help illuminate why many other Islamic states seem supportive of the Sunni insurgency.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-861783060214556404?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/861783060214556404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=861783060214556404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/861783060214556404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/861783060214556404'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2007/01/if-you-pay-attention-to-news-it-nearly.html' title='Sunnis and Shiites'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-116545831898955479</id><published>2006-12-06T18:19:00.000-08:00</published><updated>2007-09-19T11:28:03.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Pro Optical Drive Door Problem</title><content type='html'>&lt;p&gt;I recently became the proud new father of a Mac Pro 2xDual Core Xeon. It basically rocks the pants off the machine that it replaced - a poky 533Mgz G4.&lt;/p&gt;

&lt;p&gt;But it has developed a slight problem with the little sliding door that protects the optical drive innards. It normally slides down when the tray slides out and then back up again after the tray goes back in. But mine now gets stuck when it's down. Like a depressive alcoholic, it just sits down there and sulks long after the tray has gone back home.&lt;/p&gt;

&lt;p&gt;I can trick it back up again by raking my finger over the left side of the door a few times. I can't be the only one having this problem so I thought I'd pass it along.&lt;/p&gt;

&lt;h2&gt;Update 2007-09-19&lt;/h2&gt;
&lt;p&gt;I have not had a problem with the door for several months. Not sure what caused the problem to go away.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-116545831898955479?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/116545831898955479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=116545831898955479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/116545831898955479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/116545831898955479'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2006/12/mac-pro-optical-drive-door-problem.html' title='Mac Pro Optical Drive Door Problem'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-115406518493785986</id><published>2006-07-27T22:10:00.000-07:00</published><updated>2006-07-27T22:39:44.993-07:00</updated><title type='text'>New Job</title><content type='html'>&lt;p&gt;I&amp;#8217;ve changed jobs. Actually, I changed jobs some time back (April to be specific) but I have more or less forgotten about this blog in the interim.&lt;/p&gt;

&lt;p&gt;So I&amp;#8217;m no longer with Tagged.com. I don&amp;#8217;t want to even get into the reasons why I left. It would just remind me how unhappy I was there.&lt;/p&gt;

&lt;p&gt;For the time being, I&amp;#8217;m contracting for a company called PodShow. It was co-founded by &lt;a href="http://curry.com/"&gt;Adam Curry&lt;/a&gt;, who was one of the early VJs at MTV. He&amp;#8217;s an interesting guy but he lives with his family in London most of the time so he&amp;#8217;s not often in the office. The other co-counder - Ron Bloom - basically runs the company. The two of them got very rich with their first start-up, Think New Ideas, which I believe they sold for $400 million.&lt;/p&gt;

&lt;p&gt;Marc Frochtzweig and Stephen Rodriguez were two excellent product designers that I worked with at Tagged and they both moved to PodShow. They in turn brought me in. Ostensibly, I was going to be working on creating some address book importers for the big webmail providers (e.g. gmail, hotmail). I had just spent a lot of time doing similar work for Tagged so I was pretty versed in the way the webmail providers worked.&lt;/p&gt;

&lt;p&gt;Before starting however, I took a vacation to Amsterdam and when I came back, they were more interested in having me design an email &lt;em&gt;sending&lt;/em&gt; system. From there, I moved on to other administration tools and that&amp;#8217;s basically become my domain.&lt;/p&gt;

&lt;p&gt;Apparently, PodShow is interested in making me a full-time engineer but so far, they&amp;#8217;ve failed to make it happen. They pay me awfully damn well as a contractor though so I&amp;#8217;m not really complaining. But I bet I&amp;#8217;ll change my tune come April 15th.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-115406518493785986?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/115406518493785986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=115406518493785986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/115406518493785986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/115406518493785986'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2006/07/new-job.html' title='New Job'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-114007354806017354</id><published>2006-02-15T23:05:00.000-08:00</published><updated>2006-02-15T23:05:48.073-08:00</updated><title type='text'>Hell is upgrading Oracle versions</title><content type='html'>&lt;p&gt;We're migrating from Oracle 9i running on a single box (in MTS mode) to an
Oracle 10g RAC cluster. For those that don't know, RAC is Real Application
Server and it's (supposed to be) one of the ways that you create a highly
scaleable Oracle system. Before we began I naively thought the migration
would... a) cost a fortune, b) be a pain in the ass for the DBAs and IT folks
but c) be relatively painless for us software engineers. To make a long story
short, I was right about the first two points.&lt;/p&gt;

&lt;p&gt;The problems for us stem from the sequence generation facilities. In Oracle
you can configure the sequence generator to work in different ways but the way
we've had it working for over two years is to generate numbers one right after
the other. The numbers that come out of our sequences are in order and there
are essentially no gaps between successive items.&lt;/p&gt;

&lt;p&gt;One of the side-effects of this approach is that you can treat any such
sequence-backed column as a kind of time-stamp; you can order records by their
effective creation date just by sorting on the sequence-backed field.&lt;/p&gt;

&lt;p&gt;When you move your database to a system that runs on multiple machines (i.e.
RAC) you basically lose the ability to have your sequences work this way. More
precisely, you &lt;em&gt;can&lt;/em&gt; configure them to work that way but doing so means that
the nodes in your cluster will need to constantly coordinate with one another
and the ensuing chatter will take a big bite out of your performance.&lt;/p&gt;

&lt;p&gt;So in switching to RAC we lost the comfort of being able to assume that
successive sequence values would go in increasing order. Calling
sequence_name.NEXTVAL three times in a row might get you: 47, 38, 52.&lt;/p&gt;

&lt;p&gt;We had to hunt down every query in our application that ordered by a sequence-
backed field. That in itself is no easy task when you have thousands of
queries scattered across hundreds of files, some written in PHP, some in Java
and some in PL/SQL. The most sophisticated tool available was grep and we had
to manually inspect dozens of candidate queries to figure out which ones to go
after.&lt;/p&gt;

&lt;p&gt;Then began the hard work of actually fixing the queries. We had to change all the "ORDER BY" clauses to use a different field (or set of fields), specifically a DATE field. Unfortunately, a lot of the underlying tables didn't have any appropriate field so in those cases we needed to modify the schema. The problem then arises of what do with the millions of existing rows that were created before we needed to record the date. We ended up giving them an arbitrary date in the past but that just meant that the "ORDER BY" clause now needed to act on &lt;em&gt;two&lt;/em&gt; columns instead of one.&lt;/p&gt;

&lt;p&gt;All in all, it took three developers about two weeks.&lt;/p&gt;

&lt;p&gt;* &lt;em&gt;I started writing this post months ago but it got waylaid and forgotten.
In finishing up I've tried to write in a manner consistent with my
thoughts and experiences at the time of inception. I'd like the post to approximate my thoughts at the time&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-114007354806017354?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/114007354806017354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=114007354806017354' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/114007354806017354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/114007354806017354'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2006/02/hell-is-upgrading-oracle-versions.html' title='Hell is upgrading Oracle versions'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-114006984195155856</id><published>2006-02-15T21:58:00.000-08:00</published><updated>2006-02-15T22:04:01.953-08:00</updated><title type='text'>Been a long time</title><content type='html'>&lt;p&gt;So let's see how long it's been since my last post...&lt;em&gt;three months&lt;/em&gt;? Yikes.
I'd appologize but then I don't seem to have any readers. I'm writing here to
a future version of myself.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-114006984195155856?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/114006984195155856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=114006984195155856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/114006984195155856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/114006984195155856'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2006/02/been-long-time.html' title='Been a long time'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-113212119625730615</id><published>2005-11-15T22:03:00.000-08:00</published><updated>2007-09-19T11:23:34.289-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='webdev'/><title type='text'>Compilling Spidermonkey on OS X</title><content type='html'>&lt;p&gt;
    For the foreseeable future my professional life will involve a lot of 
    messing around with &lt;a href="http://greasemonkey.mozdev.org/"&gt;browser 
    scripting&lt;/a&gt; and &lt;a href="http://httpunit.sourceforge.net/"&gt;browser 
    simulators&lt;/a&gt;. Recently, I got interested in the javascript engines 
    created by the folks at Mozilla. Turns out there is not one but 
    &lt;em&gt;two&lt;/em&gt; seperate engines: one called SpiderMonkey that's written in 
    C (and used in the actual Mozilla-based browsers) and one written in 
    Java called Rhino (used by HttpUnit among other projects).
&lt;/p&gt;
&lt;p&gt;
    Building SpiderMonkey on my Mac turned out to be very easy but since I 
    couldn't find any up-to-date instructions (the README says to use 
    CodeWarrior) I figured I'd write up a simple walkthrough.
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;
        First, &lt;a href="http://ftp.mozilla.org/pub/mozilla.org/js/"&gt;download 
        the source&lt;/a&gt; files. I grabbed the only non-Rhino file I could 
        find which happened to be &lt;code&gt;js-1.5.tar.gz&lt;/code&gt;
    &lt;/li&gt;
    &lt;li&gt;Unzip/untar the file you just downloaded&lt;/li&gt;
    &lt;li&gt;
        Fire up Terminal.app and cd your way into the &lt;code&gt;/src&lt;/code&gt;
        directory within the directory you just un-tarred.&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;make -f Makefile.ref&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;
        In a few minutes you should have a sub-directory called 
        &lt;code&gt;Darwin_DBG.OBJ&lt;/code&gt;
    &lt;/li&gt;
    &lt;li&gt;
        Within that there's an executable called &lt;code&gt;js&lt;/code&gt; which is
        the standalone javascript interpreter.
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    That's pretty much it. I moved the executable to &lt;code&gt;/usr/local/bin&lt;/code&gt;
    but of course that's optional. You can create javascript files and run them
    using the js command and they just work. The one issue I haven't been
    able to figure out is why I can't create XmlHttpRequest objects like so
    &lt;code&gt;var ro = new XMLHttpRequest();&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
    If anyone can figure that out I'd love to know what else I need to be
    doing.
&lt;/p&gt;

&lt;h2&gt;update&lt;/h2&gt;
&lt;p&gt;
    I feel stupid. Of &lt;em&gt;course&lt;/em&gt; the javascript interpreter won&amp;#8217;t
    have any way to make XMLHttpRequests. All sorts of browser magic is going
    on in the background to make that shit happen. The network connection is
    the least of it. When you make an Ajax request it looks to the server just
    like a normal page request, complete with cookies and everything.
&lt;/p&gt;
&lt;h2&gt;update 2 Feb 2007&lt;/h2&gt;
&lt;p&gt;
    You might want to check out &lt;a href="http://developer.mozilla.org/en/docs/Introduction_to_the_JavaScript_shell"&gt;this page&lt;/a&gt; to get a feel for what you can do in
    the js interpreter.
&lt;/p&gt;
&lt;p&gt;
    Also looks like they updated the spidermonkey tar-ball to 1.6. &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.6"&gt;Here&amp;#8217;s a page&lt;/a&gt; that includes the new features in 1.6. I&amp;#8217;m a fan of the new functional constructs like &lt;code&gt;map() filter()&lt;/code&gt; and &lt;code&gt;reduce()&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
    Once you have the interpreter up and running, try this...&lt;code&gt;[1,2,3].map(function (a) { return a*2; });&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/8106392-113212119625730615?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/113212119625730615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=113212119625730615' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/113212119625730615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/113212119625730615'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/11/compilling-spidermonkey-on-os-x.html' title='Compilling Spidermonkey on OS X'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-112943975630299774</id><published>2005-10-15T22:11:00.000-07:00</published><updated>2005-11-15T22:13:17.716-08:00</updated><title type='text'>answer to linked list problem</title><content type='html'>The answer is that you start both pointers at the head of the list and you move them both down it but you move the second pointer (call it B) twice as fast as you move pointer A. If there is a cycle, you'll eventually detect it.

Set A to head if list.
Set B to A-&gt;next. If B-&gt;next = A, you have already detected a cycle.
Otherwise, advance B one node and compare to A again.
Now advance A one node.
Advance B two nodes, comparing to A each time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-112943975630299774?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/112943975630299774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=112943975630299774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112943975630299774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112943975630299774'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/10/answer-to-linked-list-problem.html' title='answer to linked list problem'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-112943937088436141</id><published>2005-10-15T21:55:00.000-07:00</published><updated>2005-10-15T22:09:30.896-07:00</updated><title type='text'>programming problem for interviews</title><content type='html'>This one is old school: we're dealing with pointers and very limited memory. Here's the set up:

You are given a pointer to the head of a linked list. Your job is to figure out if the linked list has a cycle (i.e. one of the nodes has a next pointer that points back to some earlier node in the list). The trick is that you only have enough memory on the stack for two node pointers. How do you do it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-112943937088436141?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/112943937088436141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=112943937088436141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112943937088436141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112943937088436141'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/10/programming-problem-for-interviews.html' title='programming problem for interviews'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-112936734780285852</id><published>2005-10-15T02:06:00.000-07:00</published><updated>2006-02-15T21:58:15.006-08:00</updated><title type='text'>public speaking == bad</title><content type='html'>&lt;p&gt;I'm delivering a talk next week on &lt;a href="http://zend.kbconferences.com/speakerbios.php#session308"&gt;"Object Caching for High-Performance Web Sites"&lt;/a&gt; at the &lt;a href="http://zend.kbconferences.com/index.php"&gt;Zend/PHP Conference &amp; Expo&lt;/a&gt;. As d-day approaches I grow ever more incredulous that I actually volunteered for this torture: public speaking is not my cup of tea. Worse than that (or so it seems now) is the prep work. Then again the prep work isn't really necessary; it just makes me a tiny bit less likely to make a total idiot of myself in front of a couple hundred peers.&lt;/p&gt;

&lt;p&gt;Actually, I resolved to get myself into this mess several months ago while attending a similar conference. The presenters were smart and they knew their stuff but the presentations themselves were about as interesting as doing laundry. I vainly figured I could do better. I suppose this is my punishment.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-112936734780285852?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/112936734780285852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=112936734780285852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112936734780285852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112936734780285852'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/10/public-speaking-bad.html' title='public speaking == bad'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-112796945965039836</id><published>2005-09-28T21:41:00.000-07:00</published><updated>2006-02-15T21:26:33.823-08:00</updated><title type='text'>Why Firefox Matters</title><content type='html'>&lt;p&gt;I don't know if you've been following all the bruhaha surrounding the beta
release of IE7 but it's done something that I would have scarcely thought
possible a couple years ago: revived shrillness in the pointless debate over
which &lt;em&gt;web browser&lt;/em&gt; will save humanity from itself. I admit to caring about
web browsers but then I'm a web developer: the capabilities and bugs of the
browser du jour have an impact on the quality of my waking hours.&lt;/p&gt;

&lt;p&gt;I used to like IE but that's only because it's competition at the time was
Netscape 4. I realize now that's like being into Britney Spears because you've
only every heard elevator music your whole life. But now there's Firefox and
it's like I've just discovered Tom Waits.&lt;/p&gt;

&lt;p&gt;For a while I wanted Firefox to be successful if for no other reason than that
it would make my life as a developer easier. I wondered what kind of
market-share it would have to garner in order for websites to take notice and
start designing, if not explicitly for Firefox than at least not implicitly
for IE.&lt;/p&gt;

&lt;p&gt;Now, I don't care.&lt;/p&gt;

&lt;p&gt;I no longer care because Firefox has &lt;em&gt;already&lt;/em&gt; succeeded. It succeeded the
moment IE7 was conceived. Because what I really care about is not what browser
people use but whether I can use transparent PNGs or CSS 3, and the fact of
the matter is that most of the world uses IE and IE will soon support those
things. But, and this is the important part, &lt;em&gt;it took Firefox to bring IE to
that point&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most of the foregoing doesn't exactly constitute a sharp observation. But when
you start to view Firefox not as the carrot that leads us to a better web, but
as the stick that drives IE, that's where things start to get interesting.&lt;/p&gt;

&lt;p&gt;Take Google for instance. They designed the first web apps that weren't
painfully clunky. Gmail compares well to my desktop mail client and Google
Maps is the best mapping software I've ever used. And the minute browsers
start supporting things like SVG and XForms I'm sure Google will come out with
something else that amazes everyone. But Google, like everyone else on the web
that cares about staying in business, can only do cool things in so far as
those cool things work in IE.&lt;/p&gt;

&lt;p&gt;And Google can't exactly force Microsoft to upgrade its browser.&lt;/p&gt;

&lt;p&gt;Or can it?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-112796945965039836?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/112796945965039836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=112796945965039836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112796945965039836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/112796945965039836'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/09/why-firefox-matters.html' title='Why Firefox Matters'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-111216361368280778</id><published>2005-03-29T22:18:00.000-08:00</published><updated>2006-02-20T23:22:20.486-08:00</updated><title type='text'>Biking + rain</title><content type='html'>
&lt;p&gt;I bike to work every day. I live in San Francisco so I don't have to contend
with ice or snow (or even serious cold). But we do have rain and I bike
through that.&lt;/p&gt;

&lt;p&gt;My friends and coworkers know that I commute on a bike but when they find out
that I go through the rain they're usually surprised. They probably imagine it
to be a miserable experience but the truth is that it's not bad at all. You
just have to approach it differently.&lt;/p&gt;

&lt;p&gt;You have to change your riding style. This is pretty obvious on one level but
it's not until you're actually out there that you realize just how much you
have to adjust. My braking distance goes way up, much more than I would have
guessed. It's not linear either: at low speeds there's little difference but
at high speeds it's more than double. The breaking distance on cars goes up
too of course. Worse, everyone's vision degrades. In California we get rain
from around November to March. That means that for many months the roads build
up a patina of oil from exhaust condensation. The result: the first rain of
the season makes everything slide around like pads of butter in a Teflon pan.
It sucks.&lt;/p&gt;

&lt;p&gt;The difference between rain gear and &lt;em&gt;good&lt;/em&gt; rain gear is the difference
between a tolerable ride and an enjoyable ride. I have as much GoreTex as I
can afford (jacket and over-socks). I also have a pair of
waterproof-breathable cycling pants and I keep a showercap handy to slip over
the seat. Once, I'm suited up, I'm protected from neck to toe (minus hands; I
don't have any waterproof gloves). I also wear glasses (to keep rain out of my
eyes) with yellow lenses (to increase contrast). The best part is that I'm
basically impervious to amphibian assault. It can be pouring rain and I simply
won't get wet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-111216361368280778?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/111216361368280778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=111216361368280778' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/111216361368280778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/111216361368280778'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/03/biking-in-rain.html' title='Biking + rain'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-110991571445144186</id><published>2005-03-03T21:55:00.000-08:00</published><updated>2006-02-15T21:57:38.343-08:00</updated><title type='text'>Dogfood</title><content type='html'>&lt;p&gt;I feel mildly guilty about using this website to blog. I mean, I'm a web
developer for chrisakes; writing this kind of shit is what I do. In fact, I
basically wrote a stripped-down blogging system for &lt;a href="http://www.tagged.com/"&gt;Tagged.com&lt;/a&gt;
(of course, I'm not allowed to actually &lt;em&gt;use&lt;/em&gt; it). I'm like a fashion
designer who buys his clothes at Target. A furniture designer who shops at
Ikea. A micro-brew Brewmaster who drinks fucking &lt;em&gt;Coor's&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then again, writing your own blogging software requires a Server of One's Own.
And I haveth not. Nor do I have the inclination to design a DB schema and
write a bunch of back-end code that will basically duplicate what's already
been done about three thousand times.&lt;/p&gt;

&lt;p&gt;So yeah, I think I'll stick with this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-110991571445144186?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/110991571445144186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=110991571445144186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/110991571445144186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/110991571445144186'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/03/dogfood.html' title='Dogfood'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-110965229552502424</id><published>2005-02-28T20:44:00.000-08:00</published><updated>2006-02-15T21:46:53.113-08:00</updated><title type='text'>Ride into the sunset</title><content type='html'>&lt;p&gt;So I finally got around to writing a program that calculates sunrise and
sunset. What a pain in the ass that turned out to be.&lt;/p&gt;

&lt;p&gt;There are dozens of websites that will do the calculations for you but I
wanted a pseudo-code algorithm. Eventually, I found &lt;a href="http://williams.best.vwh.net/sunrise_sunset_example.htm"&gt;one&lt;/a&gt;
from the US Naval Observatory but my trials were far from over.&lt;/p&gt;

&lt;p&gt;I learned that there is no single algorithm that will produce acceptable
results for all places and for all time. I guess that certain parameters need
to be tweaked as you extend your calculations towards dates more than a couple
of decades away from some reference point.&lt;/p&gt;

&lt;p&gt;Also, I discovered that there is a lot of disagreement between the results of
various calculators. This may have something to do with the different
definitions of sunrise and sunset. To me, sunset is the moment at which the
last visible sliver of the sun slips beneath the horizon but this is actually
only one of &lt;em&gt;three&lt;/em&gt; possible definitions. What's more, the observed
time of sunset/sunrise is effected by atmospheric conditions which can
only be tackled probabilistically.&lt;/p&gt;

&lt;p&gt;So after a lot of trial and error I managed to get my program to produce
results that matched up with the worked example that accompanied the pseudo
code. However, the algorithm doesn't really have any explanatory material so I
don't really understand the terms (what the hell is "sun's mean anomaly" for
instance) and I don't know whether it's trying to account for any atmospheric
conditions or for how many years this algorithm will product good results. 
Lame.&lt;/p&gt;

&lt;p&gt;Theoretically, I should be able to bike the few miles to the ocean and check
my results against reality but I never seem to have the time and really, I
just wrote the thing to know how late I can leave work and still have sunlight
enough to get me home so as long as it's correct to within 5 minutes I'm
pretty happy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-110965229552502424?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/110965229552502424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=110965229552502424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/110965229552502424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/110965229552502424'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2005/02/ride-into-sunset.html' title='Ride into the sunset'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-109410544058385515</id><published>2004-09-01T22:35:00.000-07:00</published><updated>2005-11-15T22:15:23.546-08:00</updated><title type='text'>CAT scan followup</title><content type='html'>The whole thing took about 10 minutes. Including paperwork. The moral of the story is: if at all possible, schedule your hospital visit for a Saturday morning because &lt;em&gt;nobody else wants to be there&lt;/em&gt;.

I didn't see a single other patient the whole time I was there (which, given the previous paragraph maybe isn't all that remarkable).

I actually sort of enjoyed the experience. I didn't have to wait at all. The paperwork consisted of signing a single piece of paper. The CAT scan tech was cool; she punched up the scans on the computer and gave me a tour, pointing out features and problems. It was like a very short field trip.

The bad part is that my sinuses are all manner of fucked up. And yet I find this vindicating. Allergies seem to be a kind of medical brick wall. "Oh, you have allergies" my doctors told me. "There's not much to be done about that." No one (except myself) even wanted to figure out what it was that I was allergic to. "Your knowing won't really make much of a difference."

So this seems bad enough that they can't just totally ignore it. It's ridiculous that in order to get better I have to get bad enough to warrant real attention. Is this just a guise of the squeaky wheel getting the oil or does it illustrate some deeper problem with the state of medicine?

Who knows. I just want to be able to breathe again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-109410544058385515?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/109410544058385515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=109410544058385515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109410544058385515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109410544058385515'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2004/09/cat-scan-followup.html' title='CAT scan followup'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-109366767216668351</id><published>2004-08-27T21:27:00.000-07:00</published><updated>2005-11-15T22:15:40.790-08:00</updated><title type='text'>CAT Scan</title><content type='html'>Tomorrow morning I'm having a CAT scan. From the wikipedia entry on CAT scans...

&lt;blockquote&gt;Sometimes contrast materials such as barium (administered orally or rectally) or intravenous iodinated contrast are used. This is useful to highlight structures such as vessels or intestines that otherwise would be difficult to delineate from their surroundings.&lt;/blockquote&gt;

All I can say is &lt;em&gt;thank god there's nothing wrong with my intestines&lt;/em&gt;. There are probably worse ways to start your weekend morning than with a barium enema but I'd still rather not.

I'm such a nerd: yesterday I pulled one of my computer science books off the shelf and read about the algorithms that are used to convert the raw CAT scan data into the cross sectional view of the anotomy. I don't have any idea why I thought that was a good idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-109366767216668351?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/109366767216668351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=109366767216668351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109366767216668351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109366767216668351'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2004/08/cat-scan.html' title='CAT Scan'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8106392.post-109366723302593178</id><published>2004-08-26T21:03:00.000-07:00</published><updated>2004-08-27T21:27:13.026-07:00</updated><title type='text'>Is this thing on?</title><content type='html'>I have DSL.

I have a blog.

I have this third paragraph here. Just sort of hangin' out at the end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8106392-109366723302593178?l=majuscule.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://majuscule.blogspot.com/feeds/109366723302593178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8106392&amp;postID=109366723302593178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109366723302593178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8106392/posts/default/109366723302593178'/><link rel='alternate' type='text/html' href='http://majuscule.blogspot.com/2004/08/is-this-thing-on.html' title='Is this thing on?'/><author><name>gavin hurley</name><uri>http://www.blogger.com/profile/17010494394838796820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
