<?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-21430394</id><updated>2011-12-14T05:26:35.628-08:00</updated><category term='hw'/><category term='javascript'/><category term='client'/><category term='admin'/><category term='octave'/><category term='php'/><category term='io2009'/><category term='lang'/><category term='map'/><category term='music'/><category term='IO2008'/><category term='chemistry'/><category term='django'/><category term='wordpress'/><category term='gps'/><category term='matlab'/><category term='audio'/><category term='android'/><category term='iphone'/><category term='appengine'/><category term='python'/><category term='sw'/><category term='mac'/><category term='video'/><category term='lamp'/><category term='crypto'/><title type='text'>l8rz</title><subtitle type='html'>... Letters written later ...&lt;br&gt;
... Random ramblings meant to be ignored ...&lt;br&gt;
... Electronics labs in disarray ...&lt;br&gt;
... Don't forget to leave ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default?start-index=101&amp;max-results=100'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>106</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21430394.post-4954306137001626773</id><published>2011-11-16T23:58:00.000-08:00</published><updated>2011-11-18T16:51:17.742-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='octave'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>Audio fx in MatLab</title><content type='html'>First of all, MatLab is quite expensive ($3500/seat), so use &lt;a href="http://www.gnu.org/software/octave/"&gt;GNU Octave&lt;/a&gt; instead!  It seems to be functionally equivalent as far as I can tell.&lt;br /&gt;&lt;br /&gt;Here are some quick neat tricks for messing with &lt;a href="http://octave.sourceforge.net/audio/overview.html"&gt;Audio&lt;/a&gt; in MatLab/Octave:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Loading Audio&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;[song,fs,bits] = wavread("~/Music/Test/03_Just_Ride_It.wav")&lt;/pre&gt;Where:&lt;br /&gt;&lt;style type="text/css"&gt;.nobrtable br { display: none }&lt;/style&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table border=2&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;song&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Is two column vectors for the left and right channels, or an Nx2 matrix, where the N samples range from -1.0 to 1.0&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;fs&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Is the sampling frequency in [hz] (typically 44000.0)&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;bits&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Is the sample resolution in bits (typically 16)&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Playing Audio&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;setenv("DISPLAY",":0.0")&lt;br /&gt;sound(song,fs)&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Displaying Audio&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;auplot(song)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-jYr1F14ZnEk/Tsb3yyrEgfI/AAAAAAAAAOk/4TJvycacFXk/s1600/Screen%2Bshot%2B2011-11-18%2Bat%2B4.25.46%2BPM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 323px;" src="http://4.bp.blogspot.com/-jYr1F14ZnEk/Tsb3yyrEgfI/AAAAAAAAAOk/4TJvycacFXk/s400/Screen%2Bshot%2B2011-11-18%2Bat%2B4.25.46%2BPM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5676496832315032050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Mono Convert (naive channel average)&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;mono = (song(:,1)+song(:,2))/2&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Remove Vox (naive center cut)&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;sides = song(:,1)-song(:,2)&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;IIR (Infinite Impulse Response) Butterworth EQ&lt;/h3&gt;&lt;br /&gt;Infinite Impulse Response filters have very nice, smooth frequency characteristics, and can sound great for most applications, but drum sounds tend to bleed through at all levels due to their wide frequency characteristic.&lt;br /&gt;&lt;pre&gt;[b_lo,a_lo] = butter(3,[40,400]/(fs/2))&lt;br /&gt;[b_md,a_md] = butter(3,[400,1400]/(fs/2))&lt;br /&gt;[b_hi,a_hi] = butter(3,1400/(fs/2),'high')&lt;br /&gt;song_lo = filter(b_lo,a_lo,song)&lt;br /&gt;song_md = filter(b_md,a_md,song)&lt;br /&gt;song_hi = filter(b_hi,a_hi,song)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;FIR (Finite Impulse Response) Blackman EQ&lt;/h3&gt;&lt;br /&gt;Finite Impulse Response filters should in theory be better at filtering out &lt;a href="http://en.wikipedia.org/wiki/Dirac_delta_function"&gt;unit impulse&lt;/a&gt; type functions, such as snare hits.&lt;br /&gt;&lt;pre&gt;N=128&lt;br /&gt;win_black = blackman(N+1)&lt;br /&gt;b_lo = fir1(N,[40,400]/(fs/2),'bandpass',win_black,'noscale')&lt;br /&gt;b_md = fir1(N,[400,1400]/(fs/2),'bandpass',win_black,'noscale')&lt;br /&gt;b_hi = fir1(N,1400/(fs/2),'high',win_black,'noscale')&lt;br /&gt;song_lo = filter(b_lo,1,song)&lt;br /&gt;song_md = filter(b_md,1,song)&lt;br /&gt;song_hi = filter(b_hi,1,song)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Display Filter Frequency Response&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;freqz(b_md,a_md)&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-8rAXwJNt0qM/Tsb5DVx0EXI/AAAAAAAAAOw/FP0QFs5ZNGY/s1600/Screen%2Bshot%2B2011-11-18%2Bat%2B4.31.11%2BPM.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 323px;" src="http://2.bp.blogspot.com/-8rAXwJNt0qM/Tsb5DVx0EXI/AAAAAAAAAOw/FP0QFs5ZNGY/s400/Screen%2Bshot%2B2011-11-18%2Bat%2B4.31.11%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5676498216128090482" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4954306137001626773?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4954306137001626773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4954306137001626773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4954306137001626773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4954306137001626773'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2011/11/audio-fx-in-matlab.html' title='Audio fx in MatLab'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-jYr1F14ZnEk/Tsb3yyrEgfI/AAAAAAAAAOk/4TJvycacFXk/s72-c/Screen%2Bshot%2B2011-11-18%2Bat%2B4.25.46%2BPM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-391581308309588610</id><published>2011-04-19T12:36:00.000-07:00</published><updated>2011-04-19T13:49:04.538-07:00</updated><title type='text'>Crosstool-ng on cygwin to build an arm-davinci-linux-gnueabi toolchain</title><content type='html'>Oh man, why is building gcc so hard???  Well, here are some tips for building an ARM926 toolchain for cross-compiling embedded linux on a cygwin host:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Get &lt;a href="http://crosstool-ng.org/"&gt;crosstool-ng&lt;/a&gt; from the hg repo (not github -- that one is outdated!)&lt;pre&gt;hg clone http://crosstool-ng.org/hg/crosstool-ng&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Grab the &lt;span style="font-weight:bold;"&gt;gcc-tools-epoch2-automake&lt;/span&gt; package to provide fix .configure &amp;gt;automake-1.10 required errors. &lt;pre&gt;export PATH=/opt/gcc-tools/bin:$PATH&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open Start --&gt; Run Command... --&gt; regedit.exe and enable case sensitive file system:&lt;pre&gt;HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive = 0&lt;/pre&gt;REBOOT to have this take effect!  Also, be sure to delete and recreate any ct-ng work directories.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ok, now build crosstool-ng the standard way:&lt;pre&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And build a davinci (&lt;a href="http://focus.ti.com/docs/prod/folders/print/omap-l138.html"&gt;OMAP-L138&lt;/a&gt; / ARM926ej-s / C6748) optimized gcc for the &lt;a href="http://www.hawkboard.org/"&gt;hawkboard&lt;/a&gt;:&lt;pre&gt;export PATH="${PATH}:/some/place/bin"&lt;br /&gt;cd /opt/&lt;br /&gt;# --help shows make help, as ct-ng is really a make script&lt;br /&gt;ct-ng help&lt;br /&gt;# show config presets for davinci gcc &lt;br /&gt;ct-ng show-arm-davinci-linux-gnueabi&lt;br /&gt;# choose presets for davinci gcc&lt;br /&gt;ct-ng arm-davinci-linux-gnueabi&lt;br /&gt;# customize gcc config&lt;br /&gt;ct-ng menuconfig&lt;br /&gt;# build the cross-compiler!!&lt;br /&gt;ct-ng build&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-391581308309588610?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/391581308309588610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=391581308309588610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/391581308309588610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/391581308309588610'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2011/04/using-crosstool-ng-on-cygwin-to-build.html' title='Crosstool-ng on cygwin to build an arm-davinci-linux-gnueabi toolchain'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6694528047135665692</id><published>2011-03-11T10:08:00.000-08:00</published><updated>2011-03-11T10:14:55.437-08:00</updated><title type='text'>Ubuntu Firewall Newbie Guide</title><content type='html'>All new slices need a firewall, and though the process isn't hard, it's nice to have the howto consolidated into one place.  Here is a basic firewall setup for Ubuntu 10.10 -- the image I choose for all my new slices now.  Ubuntu typically uses iptables underneath, but manages the setup with a cool little tool called ufw.  Here is the full setup for a new box.  The default box has firewall disabled. Run this once during bring up, and your newly configured firewall will persist over future reboots:&lt;pre&gt;sudo ufw allow echo      # ping&lt;br /&gt;sudo ufw allow ssh&lt;br /&gt;sudo ufw allow domain    # dns / bind / named&lt;br /&gt;sudo ufw allow http      # www / apache / nginx&lt;br /&gt;sudo ufw allow https&lt;br /&gt;sudo ufw enable&lt;/pre&gt;&lt;br /&gt;And here is what the output looks like when you run these:&lt;pre&gt;l8rs@l8rs:/opt$ sudo ufw reset  # clear all rules&lt;br /&gt;Resetting all rules to installed defaults. Proceed with operation (y|n)? y&lt;br /&gt;Backing up 'user.rules' to '/lib/ufw/user.rules.20110311_100541'&lt;br /&gt;Backing up 'after6.rules' to '/etc/ufw/after6.rules.20110311_100541'&lt;br /&gt;Backing up 'user6.rules' to '/lib/ufw/user6.rules.20110311_100541'&lt;br /&gt;Backing up 'before6.rules' to '/etc/ufw/before6.rules.20110311_100541'&lt;br /&gt;Backing up 'after.rules' to '/etc/ufw/after.rules.20110311_100541'&lt;br /&gt;Backing up 'before.rules' to '/etc/ufw/before.rules.20110311_100541'&lt;br /&gt;&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw status&lt;br /&gt;Status: inactive&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw allow echo&lt;br /&gt;Rules updated&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw allow ssh&lt;br /&gt;Rules updated&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw allow domain&lt;br /&gt;Rules updated&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw allow http&lt;br /&gt;Rules updated&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw allow https&lt;br /&gt;Rules updated&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw enable&lt;br /&gt;Firewall is active and enabled on system startup&lt;br /&gt;l8rs@l8rs:/opt$ sudo ufw status&lt;br /&gt;Status: active&lt;br /&gt;&lt;br /&gt;To                         Action      From&lt;br /&gt;--                         ------      ----&lt;br /&gt;7                          ALLOW       Anywhere&lt;br /&gt;22                         ALLOW       Anywhere&lt;br /&gt;53                         ALLOW       Anywhere&lt;br /&gt;80/tcp                     ALLOW       Anywhere&lt;br /&gt;443                        ALLOW       Anywhere&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6694528047135665692?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6694528047135665692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6694528047135665692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6694528047135665692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6694528047135665692'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2011/03/ubuntu-firewall-newbie-guide.html' title='Ubuntu Firewall Newbie Guide'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3506841455924819602</id><published>2011-03-09T16:32:00.001-08:00</published><updated>2011-03-21T22:01:02.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><title type='text'>Building node.js on cygwin</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://nodejs.org/logo.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 420px; height: 111px;" src="http://nodejs.org/logo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;object width="576" height="324"&gt;&lt;param name="movie" value="http://d.yimg.com/nl/ydn/default/player.swf"&gt;&lt;param name="flashVars" value="vid=19897538&amp;amp;"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed width="576" height="324" allowfullscreen="true" src="http://d.yimg.com/nl/ydn/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=19897538&amp;amp;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/p/v8/logo?cct=1298970660"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 68px; height: 55px;" src="http://code.google.com/p/v8/logo?cct=1298970660" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I still trying to brainstorm the best way to make use of &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt;, but it has some cool traits that make it intriguing enough for me to want to find a way to use it:&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Incorporates the full &lt;a href="http://code.google.com/p/v8/"&gt;v8 JavaScript engine&lt;/a&gt;, which proves to be &lt;a href="http://shootout.alioth.debian.org/u32/benchmark.php?test=all&amp;amp;lang=python&amp;amp;lang2=v8"&gt;blazingly fast&lt;/a&gt;, outperforming CPython among others.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/joyent/node"&gt;Node.js source&lt;/a&gt; is open at github, written by the folks at &lt;a href="http://www.joyent.com/"&gt;Joyent&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Provides a perfect example of integrating C++ with JavaScript to do cool things&lt;/li&gt;&lt;li&gt;Provides an &lt;a href="http://nodejs.org/docs/v0.4.2/api/all.html"&gt;incredibly rich API &lt;/a&gt;for accessing core sys services in JavaScript.  Streams, sockets, files, process, HTTP/SSL server/client, the list goes on...&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;So the brain-dead install is of course:&lt;pre&gt;git clone https://github.com/joyent/node.git&lt;br /&gt;cd node&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Official instructions are here: &lt;a href="https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)"&gt;NODE.JS CYGWIN INSTALL&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that failed on cygwin in a variety of ways.  First problem was:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which can be fixed by compiling with gcc 4.x. So prepend the following to the procedure above:&lt;pre&gt;export CC=gcc-4&lt;br /&gt;export CXX=g++-4&lt;br /&gt;make clean&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Finally, the node.js build system adds library paths in the final linker step which try and tie sdtc++ from gcc-3 to the other obj files built with gcc-4.  This is the classic cause for errors such as the following:&lt;pre&gt;g++-4 default/src/node_main_4.o default/src/node_4.o default/src/node_buffer_4.o&lt;br /&gt;default/src/node_javascript_4.o default/src/node_extensions_4.o default/src/nod&lt;br /&gt;e_http_parser_4.o default/src/node_net_4.o default/src/node_io_watcher_4.o defau&lt;br /&gt;lt/src/node_constants_4.o default/src/node_cares_4.o default/src/node_events_4.o&lt;br /&gt;default/src/node_file_4.o default/src/node_signal_watcher_4.o default/src/node_&lt;br /&gt;stat_watcher_4.o default/src/node_timer_4.o default/src/node_script_4.o default/&lt;br /&gt;src/node_os_4.o default/src/node_dtrace_4.o default/src/node_stdio_4.o default/s&lt;br /&gt;rc/node_child_process_4.o default/src/platform_cygwin_4.o default/src/node_crypt&lt;br /&gt;o_4.o default/deps/libeio/eio_1.o default/deps/http_parser/http_parser_2.o defau&lt;br /&gt;lt/deps/libev/ev_1.o default/deps/c-ares/ares_strcasecmp_1.o default/deps/c-ares&lt;br /&gt;/ares_free_string_1.o default/deps/c-ares/ares_options_1.o default/deps/c-ares/a&lt;br /&gt;res_send_1.o default/deps/c-ares/ares_parse_txt_reply_1.o default/deps/c-ares/ar&lt;br /&gt;es_parse_ptr_reply_1.o default/deps/c-ares/ares_nowarn_1.o default/deps/c-ares/a&lt;br /&gt;res_search_1.o default/deps/c-ares/ares_gethostbyname_1.o default/deps/c-ares/ar&lt;br /&gt;es_getsock_1.o default/deps/c-ares/ares__timeval_1.o default/deps/c-ares/inet_nt&lt;br /&gt;op_1.o default/deps/c-ares/ares_parse_a_reply_1.o default/deps/c-ares/ares_getop&lt;br /&gt;t_1.o default/deps/c-ares/ares__close_sockets_1.o default/deps/c-ares/ares_expan&lt;br /&gt;d_string_1.o default/deps/c-ares/ares_destroy_1.o default/deps/c-ares/ares_cance&lt;br /&gt;l_1.o default/deps/c-ares/ares_parse_aaaa_reply_1.o default/deps/c-ares/ares_par&lt;br /&gt;se_ns_reply_1.o default/deps/c-ares/ares_version_1.o default/deps/c-ares/ares__g&lt;br /&gt;et_hostent_1.o default/deps/c-ares/ares_writev_1.o default/deps/c-ares/ares_expa&lt;br /&gt;nd_name_1.o default/deps/c-ares/ares_free_hostent_1.o default/deps/c-ares/ares_p&lt;br /&gt;arse_mx_reply_1.o default/deps/c-ares/ares_gethostbyaddr_1.o default/deps/c-ares&lt;br /&gt;/ares_query_1.o default/deps/c-ares/ares_data_1.o default/deps/c-ares/ares_init_&lt;br /&gt;1.o default/deps/c-ares/ares_fds_1.o default/deps/c-ares/inet_net_pton_1.o defau&lt;br /&gt;lt/deps/c-ares/ares_strerror_1.o default/deps/c-ares/bitncmp_1.o default/deps/c-&lt;br /&gt;ares/ares_getnameinfo_1.o default/deps/c-ares/ares_library_init_1.o default/deps&lt;br /&gt;/c-ares/ares_mkquery_1.o default/deps/c-ares/ares_process_1.o default/deps/c-are&lt;br /&gt;s/windows_port_1.o default/deps/c-ares/ares_parse_srv_reply_1.o default/deps/c-a&lt;br /&gt;res/ares_llist_1.o default/deps/c-ares/ares_timeout_1.o default/deps/c-ares/ares&lt;br /&gt;__read_line_1.o default/deps/c-ares/ares_strdup_1.o -o /cygdrive/c/sdk/net/node-&lt;br /&gt;git/node/build/default/node.exe -Wl,--enable-auto-import -Wl,--enable-auto-impor&lt;br /&gt;t -m32 -Wl,--export-all-symbols -Wl,--out-implib,default/libnode.dll.a -Wl,--out&lt;br /&gt;put-def,default/libnode.def /cygdrive/c/sdk/net/node-git/node/build/default/libv&lt;br /&gt;8.a -L/usr/lib -L/usr/local/lib -Wl,-Bdynamic -lrt -lssl -lcrypto -lz -ldl -luti&lt;br /&gt;l&lt;br /&gt;Creating library file: default/libnode.dll.a&lt;br /&gt;default/src/node_main_4.o:node_main.cc:(.eh_frame+0x11): undefined reference to&lt;br /&gt;`___gxx_personality_v0'&lt;br /&gt;default/src/node_4.o:node.cc:(.eh_frame+0x12): undefined reference to `___gxx_pe&lt;br /&gt;rsonality_v0'&lt;br /&gt;default/src/node_buffer_4.o:node_buffer.cc:(.eh_frame+0x12): undefined reference&lt;br /&gt;to `___gxx_personality_v0'&lt;br /&gt;default/src/node_javascript_4.o:node_javascript.cc:(.eh_frame+0x12): undefined r&lt;br /&gt;eference to `___gxx_personality_v0'&lt;br /&gt;default/src/node_extensions_4.o:node_extensions.cc:(.eh_frame+0x11): undefined r&lt;br /&gt;eference to `___gxx_personality_v0'&lt;br /&gt;default/src/node_http_parser_4.o:node_http_parser.cc:(.eh_frame+0x12): more unde&lt;br /&gt;fined references to `___gxx_personality_v0' follow&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x2f): undefined ref&lt;br /&gt;erence to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x9f): undefined ref&lt;br /&gt;erence to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xa8): undefined ref&lt;br /&gt;erence to `___w32_sharedptr_terminate'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x10f): undefined re&lt;br /&gt;ference to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x122): undefined re&lt;br /&gt;ference to `___w32_sharedptr_terminate'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x18f): undefined re&lt;br /&gt;ference to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x198): undefined re&lt;br /&gt;ference to `___w32_sharedptr_unexpected'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x1a9): undefined re&lt;br /&gt;ference to `___w32_sharedptr_terminate'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x1e5): undefined re&lt;br /&gt;ference to `___w32_sharedptr_terminate'&lt;br /&gt;/usr/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x205): undefined re&lt;br /&gt;ference to `___w32_sharedptr_unexpected'&lt;br /&gt;/usr/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x44): undefined&lt;br /&gt;reference to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x3c6): undefine&lt;br /&gt;d reference to `__Unwind_SjLj_Unregister'&lt;br /&gt;/usr/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x930): undefine&lt;br /&gt;d reference to `__Unwind_SjLj_Resume'&lt;br /&gt;/usr/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x992): undefine&lt;br /&gt;d reference to `__Unwind_SjLj_Register'&lt;br /&gt;/usr/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0xd70): undefine&lt;br /&gt;d reference to `__Unwind_SjLj_Resume'&lt;br /&gt;/usr/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x18): undefined reference t&lt;br /&gt;o `___w32_sharedptr_unexpected'&lt;br /&gt;/usr/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x22): undefined reference t&lt;br /&gt;o `___w32_sharedptr_terminate'&lt;br /&gt;/usr/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x50): undefined reference t&lt;br /&gt;o `__Unwind_SjLj_RaiseException'&lt;br /&gt;/usr/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0xa7): undefined reference t&lt;br /&gt;o `__Unwind_SjLj_Resume_or_Rethrow'&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;Waf: Leaving directory `/cygdrive/c/sdk/net/node-git/node/build'&lt;br /&gt;Build failed:  -&gt; task failed (err #1):&lt;br /&gt;{task: cxx_link node_main_4.o,node_4.o,node_buffer_4.o,node_javascript_4&lt;br /&gt;.o,node_extensions_4.o,node_http_parser_4.o,node_net_4.o,node_io_watcher_4.o,nod&lt;br /&gt;e_constants_4.o,node_cares_4.o,node_events_4.o,node_file_4.o,node_signal_watcher&lt;br /&gt;_4.o,node_stat_watcher_4.o,node_timer_4.o,node_script_4.o,node_os_4.o,node_dtrac&lt;br /&gt;e_4.o,node_stdio_4.o,node_child_process_4.o,platform_cygwin_4.o,node_crypto_4.o,&lt;br /&gt;eio_1.o,http_parser_2.o,ev_1.o,ares_strcasecmp_1.o,ares_free_string_1.o,ares_opt&lt;br /&gt;ions_1.o,ares_send_1.o,ares_parse_txt_reply_1.o,ares_parse_ptr_reply_1.o,ares_no&lt;br /&gt;warn_1.o,ares_search_1.o,ares_gethostbyname_1.o,ares_getsock_1.o,ares__timeval_1&lt;br /&gt;.o,inet_ntop_1.o,ares_parse_a_reply_1.o,ares_getopt_1.o,ares__close_sockets_1.o,&lt;br /&gt;ares_expand_string_1.o,ares_destroy_1.o,ares_cancel_1.o,ares_parse_aaaa_reply_1.&lt;br /&gt;o,ares_parse_ns_reply_1.o,ares_version_1.o,ares__get_hostent_1.o,ares_writev_1.o&lt;br /&gt;,ares_expand_name_1.o,ares_free_hostent_1.o,ares_parse_mx_reply_1.o,ares_gethost&lt;br /&gt;byaddr_1.o,ares_query_1.o,ares_data_1.o,ares_init_1.o,ares_fds_1.o,inet_net_pton&lt;br /&gt;_1.o,ares_strerror_1.o,bitncmp_1.o,ares_getnameinfo_1.o,ares_library_init_1.o,ar&lt;br /&gt;es_mkquery_1.o,ares_process_1.o,windows_port_1.o,ares_parse_srv_reply_1.o,ares_l&lt;br /&gt;list_1.o,ares_timeout_1.o,ares__read_line_1.o,ares_strdup_1.o -&gt; node.exe}&lt;br /&gt;make: *** [program] Error 1&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The solution is to remove the -L/usr/lib and -L/usr/local/lib lines from the final build step.&lt;br /&gt;&lt;br /&gt;After that, lo and behold, it builds!  You may need to manually do the make install part by copying build/default/node.exe to /usr/local/bin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wow, playing with it a bit, node.js is pretty deep.  It has a slew of &lt;a href="https://github.com/joyent/node/wiki/modules"&gt;modules&lt;/a&gt;, and even a &lt;a href="http://npmjs.org/"&gt;package manager&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt; looks interesting as well, and integrates perfectly with node.js.  There are a few template library options, including &lt;a href="https://github.com/mauricemach/coffeekup"&gt;coffeekup&lt;/a&gt; and a number of django template clones (&lt;a href="https://github.com/simonw/djangode"&gt;djangode&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Lo, it won't compile for an iPhone easily however, as the JIT aspects of its design are not permitted by the iOS kernel...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3506841455924819602?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3506841455924819602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3506841455924819602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3506841455924819602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3506841455924819602'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2011/03/building-nodejs-on-cygwin.html' title='Building node.js on cygwin'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2087532969422670826</id><published>2011-03-02T01:11:00.000-08:00</published><updated>2011-03-02T01:31:37.351-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordpress'/><category scheme='http://www.blogger.com/atom/ns#' term='lamp'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Rockin local LAMP development with MAMP</title><content type='html'>You have a Mac, your wife needs help tweaking her Wordpress blog, and you need to get a LAMP stack kickin' ASAP.  Here is what you do:&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Install &lt;a href="http://mamp.info/"&gt;MAMP&lt;/a&gt; to get Apache, MySQL, and PHP all configured nicely for localhost:8888&lt;/li&gt;&lt;li&gt;Boot it up and click Preferences...&lt;/li&gt;&lt;li&gt;Under the Apache tab, select your desired html root: /Users/l8rs/www&lt;/li&gt;&lt;li&gt;Hit OK button and Start Servers&lt;/li&gt;&lt;li&gt;Point browser to http://localhost:8888&lt;/li&gt;&lt;li&gt;Open Terminal and setup Wordpress db:&lt;pre&gt;/Applications/MAMP/Library/bin/mysql -uroot -p&lt;br /&gt;Enter password: root&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 7&lt;br /&gt;Server version: 5.1.44 Source distribution&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.&lt;br /&gt;&lt;br /&gt;mysql&gt;CREATE DATABASE wordpress_db;&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON wordpress_db.* TO "root"@"localhost"&lt;br /&gt; -&gt; IDENTIFIED BY "root";&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; FLUSH PRIVILEGES;&lt;br /&gt;Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; EXIT&lt;br /&gt;Bye&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Copy over the blog from the hosting provider using ssh, `tar czf`, and scp.&lt;/li&gt;&lt;li&gt;Or use &lt;a href="http://cyberduck.ch/"&gt;Cyberduck&lt;/a&gt; if you want an awesome SFTP GUI client!&lt;/li&gt;&lt;li&gt;Tweak the wp-config.php to use your MAMP settings:&lt;pre&gt;// ** MySQL settings - You can get this info from your web host ** //&lt;br /&gt;/** The name of the database for WordPress */&lt;br /&gt;define('DB_NAME', 'wordpress_db');&lt;br /&gt;&lt;br /&gt;/** MySQL database username */&lt;br /&gt;define('DB_USER', 'root');&lt;br /&gt;&lt;br /&gt;/** MySQL database password */&lt;br /&gt;define('DB_PASSWORD', 'root');&lt;br /&gt;&lt;br /&gt;/** MySQL hostname */&lt;br /&gt;define('DB_HOST', 'localhost:8889');&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;Sweet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2087532969422670826?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2087532969422670826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2087532969422670826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2087532969422670826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2087532969422670826'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2011/03/rockin-local-lamp-development-with-mamp.html' title='Rockin local LAMP development with MAMP'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7288087058697732027</id><published>2010-07-26T03:06:00.001-07:00</published><updated>2010-07-30T11:43:12.867-07:00</updated><title type='text'>Setting up named DNS server on Mac OSX</title><content type='html'>Snow Leopard ships with BIND 9.6.0-APPLE-P2, but it doesn't run seamlessly out-of-the-box.  Here are the steps to fire it up:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Build the missing, required rndc key &lt;br /&gt;sudo /usr/sbin/rndc-confgen -a&lt;br /&gt;# Edit the /etc/named.conf&lt;br /&gt;sudo emacs /etc/named.conf&lt;br /&gt;# Add zone files in /var/named/mydomain.zone&lt;br /&gt;sudo emacs /var/named/mydomain.zone&lt;br /&gt;# Restart the named service using launchd&lt;br /&gt;sudo launchctl unload /System/Library/LaunchDaemons/org.isc.named.plist&lt;br /&gt;sudo launchctl load /System/Library/LaunchDaemons/org.isc.named.plist&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;That's it!  At this point, check firewall settings: on the Mac, and through *all* routers or modems it is going through.  Open up port 53 both udp (for basic DNS service) and tcp (for zone transfers to slaves).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7288087058697732027?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7288087058697732027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7288087058697732027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7288087058697732027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7288087058697732027'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/07/setting-up-named-on-mac-osx.html' title='Setting up named DNS server on Mac OSX'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3090263545754648722</id><published>2010-04-13T03:05:00.000-07:00</published><updated>2010-04-13T03:18:13.692-07:00</updated><title type='text'>Replica Island Released</title><content type='html'>After being hyped up at &lt;a href="http://code.google.com/events/io/2009/sessions/WritingRealTimeGamesAndroid.html"&gt;Google IO 2009&lt;/a&gt; nearly a year ago, &lt;a href="http://www.replicaisland.net/"&gt;Replica Island&lt;/a&gt;, a 2D parallax side-scroller game for Android has been finally released.  &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Google I/O Game Development Talk&lt;/h3&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/U4Bk5rmIpic&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/U4Bk5rmIpic&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Replica Island Trailer&lt;/h3&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Gzvndy9MXUw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Gzvndy9MXUw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Now with the new &lt;a href=http://daringfireball.net/2010/04/why_apple_changed_section_331"&gt;Apple 3.3.1 Developer clause&lt;/a&gt; that disallows any iphone app development in languages other than C,C++, or Obj-C, it seems that all the hoops this engine jumped through to be efficient in Java would have to be ported *back* into C++ if one aspired to have a single codebase that worked across both major smart phone platforms.  C++ is the natural language for game development anyway!  I would think developers would naturally choose to use the &lt;a href="http://developer.android.com/sdk/ndk/index.html"&gt;Android NDK&lt;/a&gt; to write serious games now that it is out. Though Apple's move to mandate a development language is pretty bold and egregious.  Let apps compete in the market based on quality - don't presuppose that the environment a developer chooses will ultimately result in inferior results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3090263545754648722?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3090263545754648722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3090263545754648722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3090263545754648722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3090263545754648722'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/04/replica-island-released.html' title='Replica Island Released'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6406641363870015061</id><published>2010-02-12T19:54:00.000-08:00</published><updated>2010-02-12T21:27:30.471-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sw'/><title type='text'>Social Network Blog Integration</title><content type='html'>Are you wondering how you could easily and quickly add those cool links that allow people to quickly retweet your page, and show how many times people have shared your post on various social networking services?&lt;br /&gt;&lt;br /&gt;Well here's the scoop:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Twitter&lt;/h3&gt;&lt;br /&gt;&lt;!-- TweetMeme Counter --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- TweetMeme Counter --&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Facebook&lt;/h3&gt;&lt;br /&gt;&lt;!-- Facebook Counter --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://widgets.fbshare.me/files/fbshare.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- Facebook Counter --&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="http://widgets.fbshare.me/files/fbshare.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Buzz&lt;/h3&gt;&lt;br /&gt;Unlike the above two, where you just copy/paste and go, this one requires you use server-side scripting to insert the URL and Title fields (set below as localhost and my_blog respectively.&lt;br /&gt;&lt;!-- Buzz Counter --&gt;&lt;br /&gt;&lt;a href="http://www.google.com/reader/link?url=http://localhost&amp;title=my_blog&amp;srcURL=http://localhost" target="_blank" rel="nofollow external"&gt;&lt;img src="http://farm5.static.flickr.com/4064/4353090426_261890c1eb_o.png" width="50" height="58" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- Buzz Counter --&amp;gt;&lt;br /&gt;&amp;lt;a href="http://www.google.com/reader/link?url=http://localhost&amp;title=my_blog&amp;srcURL=http://localhost" target="_blank" rel="nofollow external"&amp;gt;&amp;lt;img src="http://farm5.static.flickr.com/4064/4353090426_261890c1eb_o.png" width="50" height="58" alt="" /&amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Digg&lt;/h3&gt;&lt;br /&gt;This one is drop-and-go as well; no server-side scripting required.&lt;br /&gt;&lt;!-- Digg Counter --&gt;&lt;br /&gt;&lt;a class="DiggThisButton"&gt;&lt;img src="http://digg.com/img/diggThis.png" height="80" width="52" alt="DiggThis"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- Digg Counter --&amp;gt;&lt;br /&gt;&amp;lt;a class="DiggThisButton"&amp;gt;&amp;lt;img src="http://digg.com/img/diggThis.png" height="80" width="52" alt="DiggThis"/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6406641363870015061?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6406641363870015061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6406641363870015061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6406641363870015061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6406641363870015061'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/02/social-network-blog-integration.html' title='Social Network Blog Integration'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7745996222425985932</id><published>2010-01-30T15:08:00.000-08:00</published><updated>2010-01-30T15:30:38.537-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sw'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPad simulator in effect</title><content type='html'>True to their promise, Apple released Xcode 3.2 the day of the iPad announcement, and the simulator looks pretty cool.  To use it, you seem to have to compile you project for iPhone OS version 3.2.  In horizontal mode, the view is at 50%, and in landscape mode the view looks to be the full 1024x768.  Note that the sample app aurioTouch seems to do something weird, and goes full screen without showing the 2x pixel doubling button.  Most apps will do the right thing and show up in 1x centered with a reasonably sized 2x button in the lower right.  Note you can also switch between iPhone and iPad views dynamically in the simulator: Hardware -&gt; Device -&gt; iPad.  It's the same simulator: "iPhone Simulator", just now has another hardware option.  Here are some pix with project Metronome!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mb5txD4vOHA/S2S9UGR5ViI/AAAAAAAAAIY/O8Lm8I86ArY/s1600-h/Screen+shot+2010-01-30+at+3.08.32+PM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_mb5txD4vOHA/S2S9UGR5ViI/AAAAAAAAAIY/O8Lm8I86ArY/s400/Screen+shot+2010-01-30+at+3.08.32+PM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5432675203496367650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mb5txD4vOHA/S2S9UfUfkuI/AAAAAAAAAIg/gfdxEn68744/s1600-h/Screen+shot+2010-01-30+at+3.09.01+PM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 309px; height: 400px;" src="http://3.bp.blogspot.com/_mb5txD4vOHA/S2S9UfUfkuI/AAAAAAAAAIg/gfdxEn68744/s400/Screen+shot+2010-01-30+at+3.09.01+PM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5432675210218148578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mb5txD4vOHA/S2S9U9TwN_I/AAAAAAAAAIo/Q0NY_907Eok/s1600-h/Screen+shot+2010-01-30+at+3.10.06+PM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="http://2.bp.blogspot.com/_mb5txD4vOHA/S2S9U9TwN_I/AAAAAAAAAIo/Q0NY_907Eok/s400/Screen+shot+2010-01-30+at+3.10.06+PM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5432675218268108786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Note too that space for the cellular carrier, time, and battery level that shows up at the top sliver of most iPhone apps gets stripped.  This will likely inspire more developers to go full screen and also to ditch the navigation bar I think as they contemplate cross-platform iPad/iPhone development.&lt;br /&gt;&lt;br /&gt;Also, if you notice, the text in pixel doubled mode is *very* pixelated...  I was hoping they would intercept uses of postscript fonts and automatically increase the size to leverage smoothing and antialiasing.  Nope, pixel doubling is literally pixel doubling -- building my hopes that they were "oversimplifying" some super-rad technology only to be let down...  Let down by the iPad?!  That's got to be the first time that's happened to anyone. :D  Well, another reason for devs to update their apps I suppose.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7745996222425985932?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7745996222425985932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7745996222425985932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7745996222425985932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7745996222425985932'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/01/ipad-simulator-in-effect.html' title='iPad simulator in effect'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mb5txD4vOHA/S2S9UGR5ViI/AAAAAAAAAIY/O8Lm8I86ArY/s72-c/Screen+shot+2010-01-30+at+3.08.32+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8489794110317009060</id><published>2010-01-28T12:37:00.000-08:00</published><updated>2010-02-12T21:47:41.871-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>10 commandments etched in iPad design</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.apple.com/ipad/home/images/best_experience_20100127.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 326px; height: 202px;" src="http://images.apple.com/ipad/home/images/best_experience_20100127.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I am the Lord your God.&lt;br /&gt;&lt;br /&gt;In terms of leveraging social media hype, ramping up a long period of speculation and anticipation, and focusing in the attention of the world into a single hour long product launch event, no company comes even close to Apple.  They have established themselves as the singular GOD OF MARKETING in a monotheistic sense.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall have no other gods before me. You shall not make for yourself an idol.&lt;br /&gt;&lt;br /&gt;No Adobe Flash: after 3 years, clearly a conscious decision by Apple.  They want to control the means of content distribution and are threatened by proprietary web platforms that do not follow W3C standards.  Though it must have been embarrassing for Steve during the keynote to stumble across the "not supported building block" icon during his "watch me browse for awhile" demo that some thought was creepy.&lt;br /&gt;&lt;br /&gt;No USB port:  Apple has pushed it's 30-pin connector up from music players and phones into an entirely new device category.  Grabbing data from cameras, hard drives, and USB sticks has given way to wireless networking and synching via the proprietary 30-pin dealio.&lt;br /&gt;&lt;br /&gt;No CD/DVD player: Well that would not only ruin the slim design, but it would make it too easy to avoid using the iTunes store to buy all your video and music (see tho shalt not steal).&lt;br /&gt;&lt;br /&gt;Ebook Reader to end all readers: Amazon's monopoly on e-reader hardware is now over, and the nook had barely anytime to make a dent.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not make wrongful use of the name of your God.&lt;br /&gt;&lt;br /&gt;You make iTampon jokes now, but once you "feel how phenomenal it is to hold the internet in your hands" you will soon come into line.&lt;br /&gt;&lt;br /&gt;Oh, and that minor fact that Fujitsu applied for a US trademark for iPad in 2002, don't worry, they accidentally let that expire in 2009, and  we have an insane legal team.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Remember the Sabbath and keep it holy.&lt;br /&gt;&lt;br /&gt;Our stores rock the world, and you *will* be lining up around them for both the WiFi and 3G launches of these things.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Honor your father and mother.&lt;br /&gt;&lt;br /&gt;The Mac Book and iPhone will continue to dominate sales and support this company.  As such, you will need them for creating content because the iPad has no camera and is specifically optimized for content consumption.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not murder.&lt;br /&gt;&lt;br /&gt;That's right, you can't murder, but by worshiping Apple and buying their products, the following mobile companies *will* be murdered: Sony, Samsung, Nokia, ...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not commit adultery.&lt;br /&gt;&lt;br /&gt;Now that you're happily married to OSX for Mac and iPhone, running on i86 and ARM, don't even *think* about going back to Windows or Linux.  Your EX, Bill Gates, announced in 2001 that the tablet would the dominant computing platform by 2006 and that didn't work out so well did it?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not steal.&lt;br /&gt;&lt;br /&gt;The iPad is optimized to be a media consumption device.  It has no camera because of this focus.  To create media, use a MacBook or even an iPhone.  As such, the iTunes and iBooks store will be integrated more and more deeply into the viewer software for easier, legal purchase during consumption.  This starts with the "secret passage" from the iBooks reader into the store.&lt;br /&gt;&lt;br /&gt;Speaking of the store, I very much agree with Apple's SVP of SW that the iPad will be another "gold mine for developers".  Apple has built the first and most successful marketplace for software in the cloud creating a legal retail channel that is dirt cheap and simple for the consumer, and allows the content creators to be rewarded handsomely.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not bear false witness against your neighbor.&lt;br /&gt;&lt;br /&gt;No, just say it like it is:  NetBooks aren't better at anything!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You shall not covet your neighbor's wife. You shall not covet anything that belongs to your neighbor.&lt;br /&gt;&lt;br /&gt;Sharing these devices is just not as good as having your own:  every person in the world must buy a Mac, iPad, iPhone, and iPod for themselves.  24 billion sold!&lt;br /&gt;&lt;br /&gt;Also, Apple has been taking control more and more of the pieces required to manufacture such technologies.  The 1GHz A4 chip designed in house by their PA Semi team allows them to depend less on Intel, nVidia, Samsung and other chip vendors over time.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.cultofmac.com/wordpress/wp-content/uploads/2010/02/jobs_economist_cover.jpg"&gt;&lt;img src="http://www.cultofmac.com/wordpress/wp-content/uploads/2010/02/jobs_economist_cover.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8489794110317009060?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8489794110317009060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8489794110317009060' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8489794110317009060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8489794110317009060'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/01/10-commandments-etched-in-ipad-design.html' title='10 commandments etched in iPad design'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4905393988985720245</id><published>2010-01-25T12:59:00.000-08:00</published><updated>2010-01-25T13:01:21.051-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='sw'/><title type='text'>ssh key management under cygwin</title><content type='html'>This script automates the procedure of generating an ssh key and uploading it to the remote machine.  It isn't cross-platform however, as it has been muddied up to handle cygwin path and home directory madness.&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;# Generate an rsa key pair on Cygwin and upload to a unix workstation&lt;br /&gt;# to allow for subsequent ssh into that machine without the needing to &lt;br /&gt;# type in a password each time.&lt;br /&gt;# &lt;br /&gt;# Usage: pushkey user@host&lt;br /&gt;&lt;br /&gt;$user_host = shift(); &lt;br /&gt;$ssh_path = `cygpath -H`;&lt;br /&gt;$ssh_path =~ chomp($ssh_path);&lt;br /&gt;$ssh_path = "\"".$ssh_path."/".$ENV{'USERNAME'}.'/.ssh'."\"";&lt;br /&gt;print "Generating key in $ssh_path\n";&lt;br /&gt;system "ssh-keygen -t rsa";&lt;br /&gt;print "Connecting to $user_host...\n";&lt;br /&gt;system "ssh $user_host 'mkdir -p .ssh'";&lt;br /&gt;print "Uploading key to $user_host...\n";&lt;br /&gt;system "cat $ssh_path/id_rsa.pub | ssh $user_host 'cat &gt;&gt; .ssh/authorized_keys'";&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4905393988985720245?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4905393988985720245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4905393988985720245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4905393988985720245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4905393988985720245'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2010/01/ssh-key-management-under-cygwin.html' title='ssh key management under cygwin'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-290762951358945680</id><published>2009-12-10T10:36:00.000-08:00</published><updated>2009-12-10T14:36:59.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>HD Video and MTS Issues</title><content type='html'>You payed hundreds of dollars, possibly thousands, for your 1080p HD video camera and now want to share your videos.  Well you're in for some real pain most likely.  Here are the issues:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;MTS format widely unexcepted by operating systems (&lt;a href="http://www.apple.com/downloads/macosx/video/hdquicklook.html"&gt;OSX patch&lt;/a&gt;), video software (iMovie), or share sites (&lt;/span&gt;&lt;a href="http://www.google.com/support/youtube/bin/answer.py?answer=132460&amp;amp;topic=16612&amp;amp;hl=en-US"&gt;YouTube&lt;/a&gt;&lt;span class="Apple-style-span"&gt;, &lt;/span&gt;&lt;a href="http://vimeo.com/help/compression"&gt;Vimeo&lt;/a&gt;&lt;span class="Apple-style-span"&gt;, &lt;/span&gt;&lt;a href="http://wiki.smugmug.net/display/SmugMug/Video+Formats"&gt;SmugMug&lt;/a&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Hopefully iMovie 2010 will make importing and sharing of these at full resolution easy...  Perhaps Adobe products like Premier or After Effects can handle this.  When working with a 8 second clip takes 30-60 minutes to re-encode and upload only to be rejected, it quickly becomes not worth the effort.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a positive note YouTube recently introduced support for 1080p.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyone know a process for easily importing and sharing HD video in MTS format?  #lazytweet&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Okay, enough griping.  Here are the tips:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;If you really need to import raw MTS, you'll need to pay ~$50 for a 3rd party tool like &lt;a href="http://www.xilisoft.com/hd-video-converter-mac.html"&gt;Xilisoft HD Converter&lt;/a&gt;.  Beware, there are a bunch of "spam" video converters that take over google searches for "MTS Mac Convert".  Also try before you buy.  In the case of Xilisoft, the quality is horrible and the video did not appear full frame (1920x1080).  Instead it is squished to the middle with black on the sides...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use iMovie, but with these caveats:&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Upgrade to iLife 2008 or later.  You are simply out of luck with iMovie 6.x&lt;/li&gt;&lt;li&gt;Connect the camera and wait.  There is a little camera button in the middle left.  You can only import straight from the camera -- not the raw MTS.&lt;/li&gt;&lt;li&gt;Once imported, export as follows: Share --&gt; Export Using QuickTime...&lt;/li&gt;&lt;li&gt;Confirm Movie to Quicktime Movie Options... are H.264 and 1920x1080&lt;/li&gt;&lt;li&gt;You should be able to upload the result to vimeo or youtube!&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-290762951358945680?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/290762951358945680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=290762951358945680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/290762951358945680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/290762951358945680'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/12/hd-video-and-mts-issue.html' title='HD Video and MTS Issues'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8709423024334644777</id><published>2009-12-09T15:45:00.000-08:00</published><updated>2009-12-09T16:10:44.997-08:00</updated><title type='text'>Chromium extensions still tough to install</title><content type='html'>&lt;div&gt;Here are some extensions worth evaluating on Chromium:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cezarsa.github.com/chromed_bird/"&gt;ChromedBird&lt;/a&gt; - Twitter Client&lt;/li&gt;&lt;li&gt;Google &lt;a href="http://dev.jeremyselier.com/wave-extension/wave-extension.crx"&gt;Wave Checker&lt;/a&gt; - Unread message status indicator&lt;/li&gt;&lt;li&gt;&lt;a href="https://chrome.google.com/extensions/detail/aapbdbdomjkkjkaonfhkkikfgjllcleb"&gt;Translate&lt;/a&gt; is especially cool&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Note that you need the &lt;a href="http://www.blogger.com/Check%20http://dev.chromium.org/getting-involved/dev-channel"&gt;dev channel version&lt;/a&gt; of Chromium to run extensions...  Your version displayed in "Wrench -&gt; About Google Chrome" should be 4.0.x or above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you have some extensions installed, you can see what you have with this url:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="chrome://extensions/"&gt;chrome://extensions/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="about:memory"&gt;about:memory&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The best repository for extensions is here:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://chrome.google.com/extensions"&gt;https://chrome.google.com/extensions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8709423024334644777?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8709423024334644777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8709423024334644777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8709423024334644777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8709423024334644777'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/12/chromium-extensions-tough-to-install.html' title='Chromium extensions still tough to install'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5029512218445292044</id><published>2009-11-30T11:00:00.000-08:00</published><updated>2009-11-30T11:07:27.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sw'/><title type='text'>Chromium Early Access</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.chromium.org/_/rsrc/1220198801738/config/app/images/customLogo/customLogo.gif?revision=2"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.chromium.org/_/rsrc/1220198801738/config/app/images/customLogo/customLogo.gif?revision=2" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;The Chromium browser is already way faster than any of the others.  While there are some quirks with certain pages and forms you can't complete without switching browsers, for your average day-to-day browser usage using Chromium will save you tons of time.  Get your early access developer build for Windows, Mac osx, or Linux here: &lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;http://www.chromium.org/getting-involved/dev-channel&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What is Chromium?  It is the open-source community based code that powers Google's branded &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; browser.  I've had good experiences so far sticking with the cutting edge developer versions, but once Chrome 1.0 is actually released for all platforms, it may pay to stick with the release versions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5029512218445292044?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5029512218445292044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5029512218445292044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5029512218445292044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5029512218445292044'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/11/chromium-early-access.html' title='Chromium Early Access'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-591742475710328355</id><published>2009-11-18T15:27:00.000-08:00</published><updated>2009-11-18T16:55:08.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Solving Django "ImportError: No module named" issues</title><content type='html'>So you whipped up an awesome &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; (&lt;a href="http://code.djangoproject.com/browser/django/trunk"&gt;src&lt;/a&gt;) project following the instructions on the &lt;a href="http://docs.djangoproject.com/en/dev/"&gt;documentation&lt;/a&gt; site, and now you want to deploy it on a production slice.  Inspired by RoR mongrels deployments, you setup an &lt;a href="http://wiki.nginx.org/Main"&gt;nginx&lt;/a&gt; (&lt;a href="http://lxr.evanmiller.org/http/source/"&gt;src&lt;/a&gt;) load-balancer that will &lt;a href="http://wiki.nginx.org/NginxLoadBalanceExample"&gt;proxy_pass&lt;/a&gt; requests to a cluster of Django instances, each inside an ultra-fast &lt;a href="http://www.cherrypy.org/"&gt;CherryPy&lt;/a&gt; (&lt;a href="http://www.cherrypy.org/browser/trunk"&gt;src&lt;/a&gt;) http server wrapper.  Perhaps you chose to use &lt;a href="http://lincolnloop.com/blog/2008/mar/25/serving-django-cherrypy/"&gt;django_cpserver&lt;/a&gt; (&lt;a href="http://github.com/lincolnloop/django-cpserver"&gt;src&lt;/a&gt;) to extend the standard &lt;a href="http://docs.djangoproject.com/en/dev/ref/django-admin/"&gt;manage.py&lt;/a&gt; with a slick runcpserver command to fire up your django web app instances.  Maybe you even write a quick utility script to fire up your django cluster all in one go:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/env python&lt;br /&gt;#&lt;br /&gt;# Utility script for firing up the django cluster.&lt;br /&gt;#&lt;br /&gt;# To use this library on python 2.5:&lt;br /&gt;#   http://code.google.com/p/python-multiprocessing/&lt;br /&gt;#&lt;br /&gt;# $Id: cluster.py,v 1.2 2009/11/17 19:44:25 l8rs Exp $&lt;br /&gt;&lt;br /&gt;import multiprocessing&lt;br /&gt;import subprocess&lt;br /&gt;&lt;br /&gt;#from config.cluster import DJANGO_WORKERS&lt;br /&gt;DJANGO_WORKERS = [&lt;br /&gt;'./manage.py runcpserver host=127.0.0.1 port=8000 daemonize',&lt;br /&gt;'./manage.py runcpserver host=127.0.0.1 port=8001 daemonize',&lt;br /&gt;'./manage.py runcpserver host=127.0.0.1 port=8002 daemonize',&lt;br /&gt;'./manage.py runcpserver host=127.0.0.1 port=8003 daemonize',&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;def work(cmd):&lt;br /&gt;return subprocess.call(cmd, shell=True)&lt;br /&gt;&lt;br /&gt;def start():&lt;br /&gt;count = len(DJANGO_WORKERS)&lt;br /&gt;pool = multiprocessing.Pool(count)&lt;br /&gt;print pool.map(work, DJANGO_WORKERS)&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;start()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ok, but when you finally start hitting the server with requests, to your shock and horror, the app that ran fine when started with `manage.py runserver` or even `manage.py runcpserver` without daemonize now can't find any of the local modules in your application?!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Traceback (most recent call last):&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/cherrypy/wsgiserver/__init__.py", line 1210, in communicate&lt;br /&gt; req.respond()&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/cherrypy/wsgiserver/__init__.py", line 729, in respond&lt;br /&gt; self.server.gateway(self).respond()&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/cherrypy/wsgiserver/__init__.py", line 1889, in respond&lt;br /&gt; response = self.req.server.wsgi_app(self.env, self.start_response)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 241, in __call__&lt;br /&gt; response = self.get_response(request)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 76, in get_response&lt;br /&gt; response = middleware_method(request)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/middleware/common.py", line 56, in process_request&lt;br /&gt; if (not _is_valid_path(request.path_info) and&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/middleware/common.py", line 142, in _is_valid_path&lt;br /&gt; urlresolvers.resolve(path)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 309, in resolve&lt;br /&gt; return get_resolver(urlconf).resolve(path)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 220, in resolve&lt;br /&gt; for pattern in self.url_patterns:&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 249, in _get_url_patterns&lt;br /&gt; patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 244, in _get_urlconf_module&lt;br /&gt; self._urlconf_module = import_module(self.urlconf_name)&lt;br /&gt;File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module&lt;br /&gt; __import__(name)&lt;br /&gt;File "/home/user/src/django/myproj/../myproj/urls.py", line 7, in &lt;module&gt;&lt;br /&gt; from myapp.module import views&lt;br /&gt;ImportError: No module named myapp.module&lt;/module&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Well, silly goose, the answer is simple (and nowhere to be found on all the internet)!  You need to make sure the daemon user has permission to access the source of your web app!  The default user for this setup is www-data.  And when you're testing out the app, you may have put it in ~/src or something owned by your dev user.  Also, when you run with daemonize on, you may have been tempted to prepend a sudo to allow the runcpserver code to generate it's default /var/run/cpserver_port.pid file...  The simple fix is to pass server_user= and server_group= to the `manage.py runcpserver` command (though passing in root to these is clearly not advised from a security stand-point).  The proper fix is to put your django code in a place it will live in production (/var/www/...), and to stamp it with all the right user and group permissions.&lt;br /&gt;&lt;br /&gt;Hopefully this post saves you some heart-ache!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-591742475710328355?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/591742475710328355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=591742475710328355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/591742475710328355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/591742475710328355'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/11/solving-django-importerror-no-module.html' title='Solving Django &quot;ImportError: No module named&quot; issues'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8785744677242454797</id><published>2009-10-23T16:10:00.000-07:00</published><updated>2009-10-23T17:16:50.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>How to display NSData contents in XCode debugger</title><content type='html'>Actually, this is more of a gdb language tip.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Set and hit some breakpoint&lt;/li&gt;&lt;li&gt;Click SHIFT+CMD+R or Run --&gt; Console&lt;/li&gt;&lt;li&gt;Type the following into the gdb window that comes up:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;(gdb) p (char *)[self._xmlData bytes]&lt;br /&gt;$11 = 0x2058200 "&amp;lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&amp;gt;\n&amp;lt;html xmlns=\""...&lt;/pre&gt;Obviously substitute self._xmlData with the expression that accesses your own NSData * object.&lt;br /&gt;&lt;br /&gt;Okay, but how do you display more lines of the output you ask?  Try this:&lt;pre&gt;x/10s (char*)[self._xmlData bytes]&lt;/pre&gt;This will display the first 10 chunks of the data as strings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8785744677242454797?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8785744677242454797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8785744677242454797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8785744677242454797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8785744677242454797'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/10/displaying-nsdata-contents-in-xcode.html' title='How to display NSData contents in XCode debugger'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7941634031317726639</id><published>2009-10-01T11:01:00.000-07:00</published><updated>2009-10-01T11:13:03.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iphone simulator screen capture made easy</title><content type='html'>There are various ways to take a clean screenshot of an iphone application.  Perhaps the easiest and most reliable using the standard tools is the following process:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Open XCode&lt;/li&gt;&lt;li&gt;Flash app to real device&lt;/li&gt;&lt;li&gt;In XCode, Windows -&gt; Organizer&lt;/li&gt;&lt;li&gt;In Organizer navigate to Screenshots&lt;/li&gt;&lt;li&gt;On device navigate to desired screen&lt;/li&gt;&lt;li&gt;In Organizer click take screenshot&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This process is somewhat painful however when many screens are needed for two reasons:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Requires a real device in the loop (doesn't work for simulator)&lt;/li&gt;&lt;li&gt;Screenshot includes information bar with carrier and time&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Enter the &lt;a href="http://www.curioustimes.de/iphonesimulatorcropper/index.html"&gt;iPhone-Simulator Cropper&lt;/a&gt; tool!  This handy program out of Germany provides simple single-click screenshot capability straight out of the simulator, sizes everything perfectly, automatically names the images exactly how you want, and even strips the carrier information bar if you choose.  Indispensable.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7941634031317726639?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7941634031317726639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7941634031317726639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7941634031317726639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7941634031317726639'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/10/iphone-developer-tools.html' title='iphone simulator screen capture made easy'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3214856736133836267</id><published>2009-08-23T03:44:00.000-07:00</published><updated>2009-08-23T04:04:22.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Apple AppStore silently adjusting behind the scenes</title><content type='html'>The Apple AppStore provides a nice feature of letting the developer adjust meta-data about an application in the store in near real-time via &lt;a href="http://itunesconnect.apple.com"&gt;itunesconnect&lt;/a&gt;.  The 4000 word product description that shows up in the app store, specifically, is quite malleable and can be used for late breaking clarifications and communicating directly to customers.   Other attributes that are adjustable are the price, icon, category, and application long name.  &lt;a href="http://www.marco.org/151619068"&gt;Recently, Apple added a keywords field too&lt;/a&gt;.  Then all of a sudden (perhaps a few days ago), the application long name field and keywords where locked out -- &lt;a href="http://forums.macrumors.com/showthread.php?t=755497"&gt;you can't change these anymore&lt;/a&gt;...  It's strange really, as the &lt;a href="http://www.iphonedevsdk.com/forum/business-legal-app-store/24505-changes-itunes-connect-introduction-keywords-no-name-changes-allowed.html"&gt;motivation for this isn't clear&lt;/a&gt;.   Why wouldn't Apple want application developers dynamically optimizing their marketing message to be more relevant to customers?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3214856736133836267?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3214856736133836267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3214856736133836267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3214856736133836267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3214856736133836267'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/08/apple-appstore-silently-adjusting.html' title='Apple AppStore silently adjusting behind the scenes'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5039663094628459459</id><published>2009-08-15T16:46:00.000-07:00</published><updated>2009-08-19T00:08:51.992-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><title type='text'>Throwing your junk into the Cloud</title><content type='html'>Sometime soon, everyone will join an online remote backup service en mass.  Hard drives just aren't reliable, and with all the digital music and video folks are generating, this data will need a home.  Enter the 15 cent/month cloud GB, and the internet version of the pay-monthly self-storage depot.  So with such a compelling market need defined, who are the players and what are their offerings?&lt;br /&gt;&lt;br /&gt;Here's the breakdown:&lt;table border=1&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Service&lt;/th&gt;&lt;th&gt;Promo&lt;/th&gt;&lt;th&gt;Basic&lt;/th&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Location / Review&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://livedrive.com/"&gt;LiveDrive&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1 month free&lt;/td&gt;&lt;td&gt;100GB&lt;br&gt;1PC&lt;br&gt;$5/month&lt;/td&gt;&lt;td&gt;unlimited GB&lt;br&gt;unlimited PC&lt;br&gt;$13/month&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.allyourspace.com/livedrive/"&gt;UK&lt;/a&gt; Win only...&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://spideroak.com/"&gt;SpiderOak&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2GB free&lt;/td&gt;&lt;td&gt;$10 / 100GB&lt;br&gt;unlimited PC&lt;/td&gt;&lt;td&gt;$10 / 100GB&lt;br&gt;unlimited PC&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.onlinebackupdeals.com/spideroak/"&gt;Illinois&lt;/a&gt; &lt;a href="http://www.retailmenot.com/view/spideroak.com"&gt;Promo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://mozy.com/"&gt;Mozy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2GB free&lt;br /&gt;&lt;/td&gt;&lt;td&gt;unlimited GB&lt;br&gt;1 PC&lt;br&gt;$5/month&lt;br /&gt;&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.onlinebackupdeals.com/mozy/"&gt;Utah&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.idrive.com/pricing.htm"&gt;iDrive&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2GB free&lt;br /&gt;&lt;/td&gt;&lt;td&gt;150 GB&lt;br&gt;$5/month&lt;br /&gt;&lt;/td&gt;&lt;td&gt;500GB&lt;br&gt;$50/month&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.onlinebackupdeals.com/idrive/"&gt;California&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5039663094628459459?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5039663094628459459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5039663094628459459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5039663094628459459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5039663094628459459'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/08/throwing-your-junk-into-cloud.html' title='Throwing your junk into the Cloud'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4871925869588149224</id><published>2009-08-14T09:52:00.000-07:00</published><updated>2009-08-14T09:58:14.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>What happened to Memidex?</title><content type='html'>&lt;a href="http://www.memidex.com/"&gt;Memidex&lt;/a&gt;, one of the better online dictionaries with superior mobile formatting, has been down for the last few days.   All &lt;a href="http://memidex.com/word"&gt;word &lt;/a&gt;lookups result in "Access  Denied".   I sometimes wonder what people would do if all websites suddenly did that, for example, say the internet "went cognizant" and just decided to keep everything to itself.  :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4871925869588149224?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4871925869588149224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4871925869588149224' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4871925869588149224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4871925869588149224'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/08/what-happened-to-memidex.html' title='What happened to Memidex?'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6806064629080192812</id><published>2009-08-09T02:06:00.000-07:00</published><updated>2009-08-09T10:24:26.065-07:00</updated><title type='text'>Cappuccino newbie guide</title><content type='html'>Smallest &lt;a href="http://cappuccino.org"&gt;Cappuccino&lt;/a&gt; &lt;a href="http://wiki.github.com/280north/cappuccino/getting-and-building-the-source"&gt;getting started guide&lt;/a&gt; ever.&lt;br /&gt;Required: minimal ruby environment with rake command&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mkdir ~/src/cappuccino&lt;br /&gt;cd ~/src/cappuccino&lt;br /&gt;git clone git://github.com/280north/cappuccino.git &lt;br /&gt;mkdir ~/bin/cappuccino&lt;br /&gt;export CAPP_BUILD=~/bin/cappuccino&lt;br /&gt;rake install&lt;br /&gt;rake install&lt;br /&gt;capp gen TestProject -l&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;"Hello World" will display upon opening ~/TestProject/index.html&lt;br /&gt;&lt;br /&gt;Now, download and try some more advanced Demos:&lt;br /&gt;&lt;br /&gt;Requires: wget&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mkdir -p Projects&lt;br /&gt;cd Projects&lt;br /&gt;wget http://cappuccino.org/learn/demos/LightsOff.zip&lt;br /&gt;wget http://cappuccino.org/learn/demos/FlickrPhotoDemo.zip&lt;br /&gt;wget http://cappuccino.org/learn/demos/FloorPlan.zip&lt;br /&gt;wget http://cappuccino.org/learn/demos/Puzzle.zip&lt;br /&gt;unzip LightsOff.zip&lt;br /&gt;unzip FlickrPhotoDemo.zip&lt;br /&gt;unzip FloorPlan.zip&lt;br /&gt;unzip Puzzle.zip&lt;br /&gt;&lt;br /&gt;# Build and try one&lt;br /&gt;cd LightsOff&lt;br /&gt;rake debug&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Just click on the index.html in the directory of each project to see the result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6806064629080192812?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6806064629080192812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6806064629080192812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6806064629080192812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6806064629080192812'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/08/cappuccino-newbie-guide.html' title='Cappuccino newbie guide'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3614116499623379771</id><published>2009-08-07T02:44:00.000-07:00</published><updated>2009-08-07T03:16:27.524-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>AppEngine Expando Essentials</title><content type='html'>Google AppEngine has this awesome and flexible datastore model call the &lt;a href="http://code.google.com/appengine/docs/python/datastore/expandoclass.html"&gt;db.Expando&lt;/a&gt;.  It lets you dynamically add parameters to a data record, sort of like adding new columns to your schema on a row-by-row basis.  Here is how you could write a RESTFUL API that takes all the parameters in your GET or POST request and just dumps them into the datastore:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class ExpandoSetRequestHandler(webapp.RequestHandler):&lt;br /&gt;  def post(self): &lt;br /&gt;    return self.get()&lt;br /&gt;&lt;br /&gt;  def get(self): &lt;br /&gt;    record = db.Expando()    # Really, use a subclass of Expando&lt;br /&gt;&lt;br /&gt;    # Iterate through http params&lt;br /&gt;    for arg in self.request.arguments(): &lt;br /&gt;      # Set as dynamic property in Expando - the real magic&lt;br /&gt;      record.__setattr__(arg, self.request.get(arg))&lt;br /&gt; &lt;br /&gt;    # Store the record&lt;br /&gt;    record.put()                                     &lt;br /&gt;&lt;br /&gt;    #... Render template, return (left as exercise)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So if you map some URL to the above, all the parameters passed will get pushed into the datastore as fields:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;http://example.appspot.com/api/expando/set?field=1&amp;foo=2&amp;bar=3&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Such an API call would result in a record which you can subsequently .get() and then access the values passed via .field, .foo, and .bar fields.&lt;br /&gt;&lt;br /&gt;Pretty cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3614116499623379771?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3614116499623379771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3614116499623379771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3614116499623379771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3614116499623379771'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/08/appengine-expando-essentials.html' title='AppEngine Expando Essentials'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7646318590167493268</id><published>2009-05-29T02:23:00.000-07:00</published><updated>2009-08-15T17:09:20.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='io2009'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Kernel Sources</title><content type='html'>Because it wasn't obvious before, the Android kernel sources are here:&lt;br /&gt;   &lt;a href="http://android.git.kernel.org/"&gt;http://android.git.kernel.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: the io2009 G2 device is a production build:&lt;br /&gt;&lt;pre&gt;l8rs@host [Fri May 29 04:15:07] ~/src/android/core&lt;br /&gt;$  adb devices&lt;br /&gt;List of devices attached &lt;br /&gt;emulator-5554 device&lt;br /&gt;HT95BLV00297 device&lt;br /&gt;&lt;br /&gt;l8rs@host [Fri May 29 04:17:16] ~/src/android/core&lt;br /&gt;$  adb -d shell&lt;br /&gt;$ ls -l&lt;br /&gt;drwxrwxrwt root     root              2009-05-29 04:16 sqlite_stmt_journals&lt;br /&gt;drwxrwx--- system   cache             2009-04-16 07:00 cache&lt;br /&gt;d---rwxrwx system   system            1969-12-31 16:00 sdcard&lt;br /&gt;lrwxrwxrwx root     root              2009-05-29 04:15 etc -&gt; /system/etc&lt;br /&gt;drwxr-xr-x root     root              2009-04-28 17:52 system&lt;br /&gt;drwxr-xr-x root     root              1969-12-31 16:00 sys&lt;br /&gt;drwxr-x--- root     root              1969-12-31 16:00 sbin&lt;br /&gt;dr-xr-xr-x root     root              1969-12-31 16:00 proc&lt;br /&gt;-rw-r--r-- root     root        11336 1969-12-31 16:00 logo.rle&lt;br /&gt;-rwxr-x--- root     root         1703 1969-12-31 16:00 init.sapphire.rc&lt;br /&gt;-rwxr-x--- root     root         9075 1969-12-31 16:00 init.rc&lt;br /&gt;-rwxr-x--- root     root         1677 1969-12-31 16:00 init.goldfish.rc&lt;br /&gt;-rwxr-x--- root     root       106568 1969-12-31 16:00 init&lt;br /&gt;-rw-r--r-- root     root          118 1969-12-31 16:00 default.prop&lt;br /&gt;drwxrwx--x system   system            2009-04-28 19:36 data&lt;br /&gt;drwx------ root     root              1969-12-31 16:00 root&lt;br /&gt;drwxr-xr-x root     root              2009-05-29 04:15 dev&lt;br /&gt;$ cd data&lt;br /&gt;$ ls &lt;br /&gt;opendir failed, Permission denied&lt;br /&gt;$ exit&lt;br /&gt;&lt;br /&gt;l8rs@host [Fri May 29 04:17:36] ~/src/android/core&lt;br /&gt;$  adb -d root&lt;br /&gt;adbd cannot run as root in production builds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To get root access to your io2009 G2 device, follow these directions:&lt;br /&gt;   &lt;a href="http://android-dls.com/wiki/index.php?title=Magic_Rooting"&gt;http://android-dls.com/wiki/index.php?title=Magic_Rooting&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;WARNING: following these directions exactly will brick the phone!  The *process* is sound, but use the &lt;a href="http://andblogs.net/2009/05/ion-update-available/"&gt;ion rooted recovery images from here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To get the fastboot tool (not included in the SDK unlike adb) compile it from source by running these commands:&lt;br /&gt;&lt;pre&gt;git clone git://android.git.kernel.org/platform/system/core.git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Still need to figure out the Android.mk build system ...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.htc.com/www/support/android/adp.html"&gt;Precompiled fastboot&lt;/a&gt; is available at the HTC site.&lt;br /&gt;&lt;br /&gt;Original Google Ion recovery images are &lt;a href="http://andblogs.net/2009/05/ion-update-available/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a great link on &lt;a href="http://wiki.xda-developers.com/index.php?pagename=HTC_Sapphire_Hacking#sec03"&gt;rooting the Android image for HTC Magic/Google Ion&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7646318590167493268?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7646318590167493268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7646318590167493268' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7646318590167493268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7646318590167493268'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/05/android-kernel-sources.html' title='Android Kernel Sources'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2327888202173714393</id><published>2009-05-28T21:38:00.000-07:00</published><updated>2009-05-30T11:54:41.695-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='io2009'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Google IO 2009 recap</title><content type='html'>&lt;h2&gt;Keynote and Stuff&lt;/h2&gt;&lt;br /&gt;Google I/O was much better this year than last - partly because the various platforms are more mature, partly because there was simply more free stuff.  The T-Shirt is much cooler -- legos instead of dots.  The only problem was men's large sizes were completely gone within the first hour.&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;img width=150 height=150 src="http://farm4.static.flickr.com/3593/3570943838_0d1cfdf14b.jpg?v=0"&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;img width=150 height=150 src="http://cache0.techcrunch.com/wp-content/googletshirt.jpg"&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2009 Design&lt;/td&gt;&lt;td&gt;2008 Design&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;They organized the keynotes this year to have a big announcement each day.  Day 1 the "Oprah Moment" for &lt;a href="http://www.google.com/corporate/execs.html#gundotra"&gt;VP Engineering, Vic Gundotra&lt;/a&gt; was the give-away of the as-of-yet unreleased Android phones to every single conference attendee.  This really got the crowd pumped.  The phone has  three names: &lt;a href="http://www.htc.com/www/product/magic/specification.html"&gt;G2, HTC Magic, or Google Ion&lt;/a&gt;.  It includes touchscreen, wifi, 3g, bluetooth, trackball, accel, magnetometer, gps, 3 megapixel camera, and more.  The OS is Android 1.5 or the "Cupcake" build.&lt;br /&gt;&lt;br&gt;&lt;img src="http://tbn1.google.com/images?q=tbn:0nT5fdGEfhiFlM:http://www.geeky-gadgets.com/wp-content/uploads/2009/02/htc-magic_3.jpg"&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;One early observation was that the phone did not handle graceful switching between WiFi and 3G as well as the iphone, and that the radio sensitivity isn't as good for WiFi as the iphone.  Also, the UI isn't as intuative and uniform, but having a real device to develop on is great, and the fact that Android is open source down to the kernel level makes the platform especially exciting from a long term perspective.&lt;br /&gt;&lt;br /&gt;The "Big Reveal" of day 2 was &lt;a href="http://wave.google.com"&gt;Wave&lt;/a&gt; - an online collaboration tool.  Apparently, Sergey Brin made Wave one of his pet projects.  The lead engineers are the same team of brothers that designed google maps.  Initially I thought this would be hosted &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;, but it appears to be more than that.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Sessions&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;AppEngine&lt;/h3&gt;&lt;br /&gt;The news with AppEngine is clearly the new &lt;a href="http://code.google.com/appengine/docs/roadmap.html"&gt;Task Queue&lt;/a&gt; that is coming that will allow fanning out of requests into multiple pieces providing for much heavier CPU load beyond the original limits.  This is great, because it was actually a piece we had speced out and were going to develop and run on slicehost.  Good thing we didn't start the development yet!  &lt;br /&gt;&lt;br /&gt;There were many sessions as well on the release of Java as a language on the appengine platform.  The Java implementation seems a bit more nerd heavy than the python one.  There were a few interesting sessions on running JVM languages such as Groovy or JRuby on appengine which seems pretty cool.  No Scala session though..&lt;br /&gt;&lt;br /&gt;Finally, examples of highly successful apps running on AppEngine today are: &lt;a href="http://buddypoke.com"&gt;BuddyPoke&lt;/a&gt; (&lt;a href="http://code.google.com/apis/opensocial/casestudies/BuddyPoke.html"&gt;case study&lt;/a&gt; and &lt;a href="http://www.youtube.com/watch?v=0zz-oSrWfj0"&gt;video&lt;/a&gt;) and WalkScore.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;Android&lt;/h3&gt;&lt;br /&gt;Lots of sessions promised open source code to be released soon.  One memorable session along these lines was the real-time game session for Android.  A fully optimized parallax side-scrolling engine sample will be released within a month by the author of &lt;a href="http://code.google.com/p/apps-for-android/"&gt;SpriteMethodTest&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One question I had was how do I flash a new kernel to this slick new G2 phone?  It looks like there is a bootloader on all devices that supports &lt;a href="http://developer.android.com/guide/developing/tools/adb.html"&gt;adb&lt;/a&gt;, so it can all be done via USB with no JTAG required.  You can use this tool to backup the image you have on there, and flash in a whole new build.  Haven't tried it yet, but I think I'll take a stab at it soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2327888202173714393?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2327888202173714393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2327888202173714393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2327888202173714393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2327888202173714393'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/05/google-io-2009-recap.html' title='Google IO 2009 recap'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-476923820198187234</id><published>2009-05-12T21:11:00.000-07:00</published><updated>2009-05-12T21:24:21.559-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>Bye bye PC - Hello Embedded!   LIBC loses to slimmer cousin.</title><content type='html'>The Debian team decided this week to &lt;a href="http://www.tuxradar.com/content/debian-ditches-glibc-eglibc"&gt;move away from GLIBC&lt;/a&gt; and over to &lt;a href="http://www.eglibc.org/home"&gt;EGLIBC&lt;/a&gt;!  This is pretty significant as glibc has been the core implementation of all the standard C libraries in Linux since the 80s.  The move was prompted by perceived code bloat and a testy development community.&lt;br /&gt;&lt;br /&gt;Considering how hard it is to simply &lt;a href="http://www.eecs.harvard.edu/~konrad/projects/imote2Camera/IMote2-Installation-Instructions.html#Installing_the_GCC_Toolchain_for_xscale-elf"&gt;compile gcc&lt;/a&gt; (which is usually tightly linked to a particular version of glibc), let alone make a &lt;a href="http://www.kegel.com/crosstool/"&gt;cross-compiler&lt;/a&gt;, this move should have interesting implications on the tools community for some time.  Looks like &lt;a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool"&gt;crosstool-ng&lt;/a&gt; will ease the pain for building gcc with eglibc support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-476923820198187234?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/476923820198187234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=476923820198187234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/476923820198187234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/476923820198187234'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/05/bye-bye-pc-hello-embedded.html' title='Bye bye PC - Hello Embedded!   LIBC loses to slimmer cousin.'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2576250403709597506</id><published>2009-03-28T03:19:00.000-07:00</published><updated>2011-03-09T21:45:12.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Javascript design patterns</title><content type='html'>JavaScript is the "squishiest" language I know.  It sort of forces the developer to think about circular allocation patterns in a way that is error prone and unnerving.  Regardless, it is one of the most portable and pervasive languages now, so it's quirks need to be dealt with.  Here are two fancy/handy design patterns:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Include another local javascript file from javascript&lt;/h3&gt;&lt;pre&gt;/**&lt;br /&gt;* Adds include statement to javascript!  Only works for Mozilla,&lt;br /&gt;* but should work for either web pages or firefox extensions.&lt;br /&gt;*&lt;br /&gt;* @param  url   The URL pointing to the script to load.&lt;br /&gt;*               It must be a local chrome:, resource: or file: URL&lt;br /&gt;*&lt;br /&gt;* @see    https://developer.mozilla.org/En/MozIJSSubScriptLoader&lt;br /&gt;*/&lt;br /&gt;function include(filename)&lt;br /&gt;{&lt;br /&gt;  const jsLoader = Components.classes[&lt;br /&gt;"@mozilla.org/moz/jssubscript-loader;1"&lt;br /&gt;  ].getService(Components.interfaces.mozIJSSubScriptLoader);&lt;br /&gt;  var url = 'chrome://myextension/content/'+filename;&lt;br /&gt;  jsLoader.loadSubScript(url);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;include('prototype-1.6.0.3.js');&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Allow a callback to reference this of the caller&lt;/h3&gt;&lt;pre&gt;function myClass() {}&lt;br /&gt;&lt;br /&gt;myClass.prototype = {&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Encapsulate reference to caller into event functions.&lt;br /&gt; * Usage:   var  apiEvents = new this.apiEvents(this);&lt;br /&gt; *   { onEvent: apiEvents.onApiNoticesDone }&lt;br /&gt; */&lt;br /&gt;apiEvents: function(caller) {&lt;br /&gt;    var my = this;&lt;br /&gt;    this._caller = caller;&lt;br /&gt;&lt;br /&gt;    this.onApiCallDone = function(response)&lt;br /&gt;    {&lt;br /&gt;       var status = response.status;&lt;br /&gt;       my._caller.setButtonState("active");&lt;br /&gt;    };&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;apiCall: function(user, pass, cookie) {&lt;br /&gt;    var apiEvents = new this.apiEvents(this);&lt;br /&gt;    new Ajax.Request(API_HOST+'/api/do/something', {&lt;br /&gt;        method: 'get',&lt;br /&gt;        parameters: { id: 0, time:'2009-03-03T03:03:03Z'},&lt;br /&gt;        requestHeaders: {&lt;br /&gt;            'Accept': 'application/xml',&lt;br /&gt;            'Set-Cookie': cookie,&lt;br /&gt;            'Authorization': "Basic " + Base64.encode(user+":"+pass))&lt;br /&gt;        },&lt;br /&gt;        onComplete: apiEvents.onApiCallDone&lt;br /&gt;    });&lt;br /&gt;},&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hey this last example even shows how to set Cookies on API requests using the ever popular Ajax.Request from the &lt;a href="http://www.prototypejs.org/api/ajax/request"&gt;Prototype.js&lt;/a&gt; package!  Suprisingly, this isn't documented clearly anywhere.  How to use Basic Authorization is left in as well, though you'll need a redundantly copy along a &lt;a href="http://www.webtoolkit.info/javascript-base64.html"&gt;Base64 implementation&lt;/a&gt; as is the strangely the habit with Javascript.  Hope this is all helpful. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2576250403709597506?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2576250403709597506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2576250403709597506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2576250403709597506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2576250403709597506'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/03/javascript-design-patterns.html' title='Javascript design patterns'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7767822357088604183</id><published>2009-03-25T10:12:00.000-07:00</published><updated>2009-08-15T17:08:54.910-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><title type='text'>How to make a Joyent Solaris VM - aka Nexenta is rad</title><content type='html'>I never posted the solution to the problems outlined in &lt;a href="http://l8rs.blogspot.com/2009/01/solaris-vmware-console-image-or.html"&gt;my previous article&lt;/a&gt; about setting up a Solaris VM image.  The solution is &lt;a href="http://www.nexenta.org/os"&gt;Nexenta&lt;/a&gt;!  Nexenta is an awesome distribution that combines the OpenSolaris kernel with the Debian package system for stellar results.  Their install CD image is rock solid and can create command-line only minimal servers in a snap.  All the drive partitioning is done for you too, so you don't have to feel like an oily engine mechanic to get something working that is high performance and reliable.  The installer also auto-detects whether you are running in a 64-bit or 32-bit VM and optimizes accordingly which is just too sweet.&lt;br /&gt;&lt;br /&gt;Once you've installed a clean Nexenta image, save it out and perform the following commands to overlay you Joyent "frosting".&lt;pre&gt;# Rsync joyent environment -- takes a long time.&lt;br /&gt;apt-get install rsync&lt;br /&gt;stty -echo; ssh myuser@my-accelerator.joyent.com sudo -v; stty echo&lt;br /&gt;rsync -r -a -e "ssh" --rsync-path="sudo rsync" myuser@my-accelerator.joyent.com:/opt/local /opt&lt;br /&gt;export PATH="/opt/local/bin:/opt/local/sbin:$PATH"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Similarly, you may want to rsync portions of /var as well for completeness.&lt;br /&gt;&lt;br /&gt;Notice how /opt/local/bin needs to be at the beginning of the PATH.  That is all the magic that is needed as the x86 solaris binaries just seem to work together.  Note that this VM is not *exactly* like a Joyent accelerator, but I feel that it is in fact better as some really annoying Joyent quirks aren't in it.  Specifically the fact that Joyent doesn't support scripts that begin with #!/usr/bin/perl (or #!/usr/bin anything) is just totally mind-boggling.  This VM will support such paths.  So make sure you retest thoroughly once your code is in the cloud, because unexpected path problems may crop up on the real thing.&lt;br /&gt;&lt;br /&gt;Another great aspect of this is that if something is missing that didn't come in the /opt/local/bin, you can always install it underneath in the Debian layer using the standard deselect or apt-get tools for that package system:&lt;pre&gt;sudo apt-get bind&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7767822357088604183?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7767822357088604183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7767822357088604183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7767822357088604183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7767822357088604183'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/03/how-to-make-joyent-solaris-vm-aka.html' title='How to make a Joyent Solaris VM - aka Nexenta is rad'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3683707527064362317</id><published>2009-03-11T17:34:00.000-07:00</published><updated>2011-03-09T21:45:46.926-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Computer vision in JavaScript?!</title><content type='html'>&lt;a href="http://createdigitalmotion.com/2009/02/23/in-browser-all-javascript-motion-tracking-believe-it-says-firefox-31/"&gt;JavaScript motion tracking demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/W0Hl0tLs7XA&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/W0Hl0tLs7XA&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3683707527064362317?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3683707527064362317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3683707527064362317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3683707527064362317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3683707527064362317'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/03/computer-vision-in-javascript.html' title='Computer vision in JavaScript?!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6386213010029836840</id><published>2009-03-10T02:45:00.000-07:00</published><updated>2009-03-10T03:19:13.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android sample - list contact book and dial phone</title><content type='html'>This developer video was the most helpful with regard to getting started with Android development:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I6ObTqIiYfE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/I6ObTqIiYfE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The only problem is some of the code has been deprecated in the 1.1 SDK!  Here is the code from the sample with updates to work in the latest SDK:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;HelloAndroid.java&lt;/h2&gt;&lt;br /&gt;&lt;pre&gt;/**&lt;br /&gt; * Sample mobile client for Android platform.&lt;br /&gt; */&lt;br /&gt;package com.google.android.hellodialer;&lt;br /&gt;&lt;br /&gt;import android.app.ListActivity;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.database.Cursor;&lt;br /&gt;import android.net.Uri;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.provider.Contacts.People;&lt;br /&gt;import android.provider.Contacts.Phones;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.widget.ListAdapter;&lt;br /&gt;import android.widget.ListView;&lt;br /&gt;import android.widget.SimpleCursorAdapter;&lt;br /&gt;&lt;br /&gt;public class HelloAndroidDialer extends ListActivity {&lt;br /&gt;    private ListAdapter mAdapter;&lt;br /&gt;&lt;br /&gt; /** Called when the activity is first created. */&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        Cursor c = getContentResolver().query(&lt;br /&gt;           People.CONTENT_URI, null, null, null, null);&lt;br /&gt;        startManagingCursor(c);&lt;br /&gt;        &lt;br /&gt;        String[] columns = new String[] {People.NAME};&lt;br /&gt;        int[] names = new int[] {R.id.row_entry};&lt;br /&gt;        &lt;br /&gt;        mAdapter = new SimpleCursorAdapter(this, &lt;br /&gt;          R.layout.main, c, columns, names);&lt;br /&gt;        setListAdapter(mAdapter);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void onListItemClick(ListView l, View v, int position, long id) {&lt;br /&gt;  super.onListItemClick(l, v, position, id);&lt;br /&gt;  Intent i = new Intent(Intent.ACTION_CALL);&lt;br /&gt;  &lt;br /&gt;  Cursor c = (Cursor)mAdapter.getItem(position);&lt;br /&gt;  String phoneId = c.getString(c.getColumnIndex(People.PRIMARY_PHONE_ID));&lt;br /&gt;  i.setData(Uri.withAppendedPath(Phones.CONTENT_URI, phoneId));  &lt;br /&gt;  startActivity(i);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The main fix here was to change &lt;br /&gt;&lt;pre&gt;long phoneId = C.getLong(C.getColumnIndex(People.PREFERRED_PHONE_ID));&lt;br /&gt;i.setData(Phones.CONTENT_URI.addId(phoneId));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre&gt;String phoneId = c.getString(c.getColumnIndex(People.PRIMARY_PHONE_ID));&lt;br /&gt;i.setData(Uri.withAppendedPath(Phones.CONTENT_URI, phoneId));&lt;br /&gt;&lt;/pre&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;main.xml&lt;/h2&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:orientation="horizontal"&lt;br /&gt;    android:layout_width="fill_parent"&lt;br /&gt;    android:layout_height="wrap_content"&lt;br /&gt;    &amp;gt;&lt;br /&gt;&amp;lt;TextView&lt;br /&gt; android:layout_width="wrap_content"&lt;br /&gt; android:layout_height="wrap_content"&lt;br /&gt; android:text="Name :"&lt;br /&gt; /&amp;gt;&lt;br /&gt;&amp;lt;TextView android:id="@+id/row_entry"&lt;br /&gt; android:layout_width="wrap_content"&lt;br /&gt; android:layout_height="wrap_content"&lt;br /&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The manifest had a slight change as well:&lt;br /&gt;&lt;pre&gt;    &amp;lt;uses-permission id="android.permission.READ_CONTACTS" /&amp;gt;&lt;br /&gt;    &amp;lt;uses-permission id="android.permission.CALL_PHONE" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;is now:&lt;br /&gt;&lt;pre&gt;    &amp;lt;uses-permission android:name="android.permission.READ_CONTACTS"/&amp;gt;&lt;br /&gt;    &amp;lt;uses-permission android:name="android.permission.CALL_PHONE"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note the main.xml layout also uses &lt;i&gt;android:id&lt;/i&gt; rather than just plain &lt;i&gt;id&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AndroidManifest.xml&lt;/h2&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;      package="com.google.android.hellodialer"&lt;br /&gt;      android:versionCode="1"&lt;br /&gt;      android:versionName="1.0.0"&amp;gt;&lt;br /&gt;    &amp;lt;uses-permission android:name="android.permission.READ_CONTACTS"/&amp;gt;&lt;br /&gt;    &amp;lt;uses-permission android:name="android.permission.CALL_PHONE"/&amp;gt;&lt;br /&gt;    &amp;lt;application android:icon="@drawable/icon" android:label="@string/app_name"&amp;gt;&lt;br /&gt;        &amp;lt;activity android:name=".HelloAndroidDialer"&lt;br /&gt;                  android:label="@string/app_name"&amp;gt;&lt;br /&gt;            &amp;lt;intent-filter&amp;gt;&lt;br /&gt;                &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;                &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;            &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;        &amp;lt;/activity&amp;gt;&lt;br /&gt;    &amp;lt;/application&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Also good is this site for &lt;a href="http://developerlife.com/tutorials/?p=300"&gt;Android tutorials&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6386213010029836840?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6386213010029836840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6386213010029836840' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6386213010029836840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6386213010029836840'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/03/android-sample-list-contact-book-and.html' title='Android sample - list contact book and dial phone'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6207502288522103903</id><published>2009-03-04T02:16:00.000-08:00</published><updated>2009-03-04T02:26:58.813-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Jonathon Mann's Song-a-day a Secret Hit</title><content type='html'>I stumbled upon &lt;a href="http://www.rockcookiebottom.com"&gt;Jonathon Mann's song-a-day project&lt;/a&gt;, and it's awesome.  Here are some of my favorites:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LbVGpwg6ins&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LbVGpwg6ins&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FmxAGQ1ioyc&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FmxAGQ1ioyc&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kfVH3veC7-s&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/kfVH3veC7-s&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6207502288522103903?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6207502288522103903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6207502288522103903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6207502288522103903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6207502288522103903'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/03/jonathon-manns-song-day-secret-hit.html' title='Jonathon Mann&apos;s Song-a-day a Secret Hit'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6963645272806670676</id><published>2009-02-06T21:39:00.001-08:00</published><updated>2009-02-06T22:04:32.354-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Borange is Awesome</title><content type='html'>&lt;div&gt;This iphone app is just beautiful.  I can't believe it is only 99¢.  It's funny how pretty much games and gags are the only apps that make it into the top 100.  How do you put a price on a real 21st century phone enhancement like being able to hook up with friends quickly, like right now?  Borange does it for you.  &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;You're at this bar and can think of exactly the five people you'd like to call and tell to meet you if they have time.   Borange them!  You just select them from your phone contact book, click the meet me here button, and send.  They all get a text and email with a map to where you are.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.borange.com"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 371px;" src="http://www.borange.com/images/screenshots.jpg?1233634421" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Your previous commitment fell through and you want to play board games with your crew tonight instead.  Borange them!  Rather than calling all 10 people who love board games last minute, and talking to them about why they can't do it and how they need more notice, just send them a Borange.  Click on the group you made.  Click on the board game activity button you added.  Click on "tonight" as the time.  Then send and the perfect set of people will instantly have your idea "Board games tonight at my house? " pop in their heads -- or rather on the smart communication device buzzing on their hips.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The best part is you don't even need to exhaustively "add all your friends", or even tell them about it to use it.  It just uses the address book that is already in your phone, and sends messages to them using the contact details that are already there: text, email, whatever.  They reply, it gets back to you, and you can coordinate details with the folks interested.  Using your time wisely with just the right people.  It's a beautiful thing.&lt;br /&gt;&lt;br /&gt;Apple should do a commercial about it.&lt;br /&gt;&lt;br /&gt;Check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6963645272806670676?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6963645272806670676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6963645272806670676' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6963645272806670676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6963645272806670676'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/02/borange-is-awesome.html' title='Borange is Awesome'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7586358500915927298</id><published>2009-02-06T21:01:00.000-08:00</published><updated>2009-02-06T21:25:51.945-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Learnings from Apple pricing experts</title><content type='html'>Ok, so here is the list of stuff the aluminum has that is better for the extra $300:&lt;br /&gt;&lt;br /&gt;13" MacBook 2.0GHz aluminium&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mb5txD4vOHA/SY0YpWdAlXI/AAAAAAAAAH4/qRKhjMUul1o/s1600-h/overview-hero20081014-sm.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 155px;" src="http://1.bp.blogspot.com/_mb5txD4vOHA/SY0YpWdAlXI/AAAAAAAAAH4/qRKhjMUul1o/s320/overview-hero20081014-sm.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5299919435165898098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) 50% faster RAM&lt;br /&gt;2) 0.5 lb lighter&lt;br /&gt;3) 30 minutes more battery life&lt;br /&gt;4) 40GB more disk&lt;br /&gt;5) aluminum case with hatch for access to harddrive&lt;br /&gt;6) backlit LED instead of old glossy style&lt;br /&gt;&lt;br /&gt;How does apple provide the minimum set of pseudo-features that collectively culminate in perfection in the mind of the consumer to justify paying one third more?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, what's the next $300 step?&lt;br /&gt;&lt;br /&gt;13" MacBook 2.4GHz aluminium&lt;br /&gt;&lt;br /&gt;1) 400MHz more CPU &lt;br /&gt;2) 90GB more disk&lt;br /&gt;3) backlit keyboard&lt;br /&gt;4) firewire port?&lt;br /&gt;&lt;br /&gt;Wild!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7586358500915927298?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7586358500915927298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7586358500915927298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7586358500915927298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7586358500915927298'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/02/learnings-from-apple-pricing-experts.html' title='Learnings from Apple pricing experts'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mb5txD4vOHA/SY0YpWdAlXI/AAAAAAAAAH4/qRKhjMUul1o/s72-c/overview-hero20081014-sm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5182303826236092955</id><published>2009-01-27T01:39:00.000-08:00</published><updated>2009-02-05T20:41:24.312-08:00</updated><title type='text'>Solaris VMWare Console Image -- or exercises in pain</title><content type='html'>One would think creating a small and simple console-only VMWare image of OpenSolaris would be a snap.  The OS has "geeks only" written all over the entrance, and is generally touted by die-hard admins and old-school retro-geeks who pine over their Sun workstations of yesteryear.  Well if you thought it would be easy -- think again.  The OpenSolaris LiveCD has no such option, and the &lt;a href="http://alexeremin.blogspot.com/2008/12/minimum-opensolaris-200811-install.html"&gt;various blogs&lt;/a&gt; on the matter provide scattered and incomplete information riddled with typos, time sinks, and traps or various sorts (not that the information they provide isn't useful!)&lt;br /&gt;&lt;h4&gt; Why do it? &lt;/h4&gt;&lt;br /&gt;So this begs the question: why even try in the first place?  There are plenty of Linux distributions that make for simple minimal installs: Debian/Ubuntu with its best-of-breed apt-get package system, or Fedora/RedHat with yum to power you up.  Well, the answer is "because I have to".  You may want to use a free FaceBook or OpenSocial accelerator from &lt;a href="http://joyent.com/"&gt;Joyent&lt;/a&gt;.  Or you may have been won over by some diehard pitching the awesomeness of &lt;a href="http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?dtrace+7"&gt;dtrace&lt;/a&gt;, svcs / svadm / svccfg, or &lt;a href="http://www.lildude.co.uk/zfs-cheatsheet/"&gt;zfs&lt;/a&gt; / &lt;a href="http://docs.sun.com/app/docs/doc/819-2240/zpool-1m"&gt;zpool&lt;/a&gt;.  Either way, you're stuck (or stoked) and you want a small, simple VM to test stuff out on.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;Well how then?&lt;/h4&gt;&lt;br /&gt;First word of advice: don't use the OpenSolaris distribution -- use &lt;a href="http://www.milax.org/?page_id=9"&gt;Milax&lt;/a&gt;.  At the time of this tutorial, Milax 0.3.1 server LiveCD was the way to go.  The reason to use some seemingly off-brand low-version number distribution is that all the state-of-the-art scripts for doing a &lt;a href="http://www.milax.org/?p=17"&gt;ZFS install&lt;/a&gt; were written by the creator of this distribution.  The script works beautifully, and can be used as a reference for performing such an install manually, the main problem is there is little or no documentation on what to do before and after running the script and specifically how to do it on a VM.&lt;br /&gt;&lt;h4&gt;Ok, well let's get to it&lt;/h4&gt;&lt;br /&gt;First off, fire up VMware and create a new Virtual Machine.  In this example, VMware Fussion on a MacBook Pro:&lt;br /&gt;&lt;pre&gt;VMWare: New ...&lt;br /&gt;Continue&lt;br /&gt;&lt;br /&gt;OS: Solaris&lt;br /&gt;Version: Solaris 10&lt;br /&gt;Continue&lt;br /&gt;&lt;br /&gt;Name / Where / Continue&lt;br /&gt;&lt;br /&gt;Disk Size = 10GB&lt;br /&gt;Advanced: &lt;br /&gt;   - Split disk into 2GB files&lt;br /&gt;   - Use an existing virtual disk: milax031s.iso&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt; How do I get in? &lt;/h4&gt;&lt;br /&gt;So you booted up the LiveCD no problem.  Selected the first boot type in the grub menu and now have a lovely prompt.  How do you access the Milax goodness?  Well of course it isn't the cryptic albiet standard jack/jack user/pass pair that OpenSolaris uses:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;user: alex&lt;br /&gt;password: alex&lt;br /&gt;su&lt;br /&gt;password: root&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Disk drive madness&lt;/h4&gt;&lt;br /&gt;Oh man, this is the crazy part.  Before you can really install any zfs anything, you need to partition your drive and get a feel for how raw device naming conventions used in Solaris.&lt;br /&gt;&lt;pre&gt;format&lt;br /&gt;0&lt;br /&gt;fdisk&lt;br /&gt;y&lt;br /&gt;partition&lt;br /&gt;0&lt;br /&gt;root&lt;br /&gt;wm&lt;br /&gt;3&lt;br /&gt;1170e&lt;br /&gt;1&lt;br /&gt;swap&lt;br /&gt;wm&lt;br /&gt;1171&lt;br /&gt;1301e&lt;br /&gt;p&lt;br /&gt;label&lt;br /&gt;q&lt;br /&gt;q&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is what the output will look like when running these format commands:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(root@milax)# format&lt;br /&gt;Searching for disks...done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AVAILABLE DISK SELECTIONS:&lt;br /&gt;       0. c3d0 &lt;DEFAULT cyl 1303 alt 2 hd 255 sec 63&gt;&lt;br /&gt;          /pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0&lt;br /&gt;Specify disk (enter its number): 0&lt;br /&gt;selecting c3d0&lt;br /&gt;Controller working list found&lt;br /&gt;[disk formatted, defect list found]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FORMAT MENU:&lt;br /&gt;        disk       - select a disk&lt;br /&gt;        type       - select (define) a disk type&lt;br /&gt;        partition  - select (define) a partition table&lt;br /&gt;        current    - describe the current disk&lt;br /&gt;        format     - format and analyze the disk&lt;br /&gt;        fdisk      - run the fdisk program&lt;br /&gt;        repair     - repair a defective sector&lt;br /&gt;        show       - translate a disk address&lt;br /&gt;        label      - write label to the disk&lt;br /&gt;        analyze    - surface analysis&lt;br /&gt;        defect     - defect list management&lt;br /&gt;        backup     - search for backup labels&lt;br /&gt;        verify     - read and display labels&lt;br /&gt;        save       - save new disk/partition definitions&lt;br /&gt;        volname    - set 8-character volume name&lt;br /&gt;        !&lt;cmd&gt;     - execute &lt;cmd&gt;, then return&lt;br /&gt;        quit&lt;br /&gt;format&gt; fdisk&lt;br /&gt;No fdisk table exists. The default partition for the disk is:&lt;br /&gt;&lt;br /&gt;  a 100% "SOLARIS System" partition&lt;br /&gt;&lt;br /&gt;Type "y" to accept the default partition,  otherwise type "n" to edit the&lt;br /&gt; partition table.&lt;br /&gt;y&lt;br /&gt;format&gt; partition&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PARTITION MENU:&lt;br /&gt;        0      - change `0' partition&lt;br /&gt;        1      - change `1' partition&lt;br /&gt;        2      - change `2' partition&lt;br /&gt;        3      - change `3' partition&lt;br /&gt;        4      - change `4' partition&lt;br /&gt;        5      - change `5' partition&lt;br /&gt;        6      - change `6' partition&lt;br /&gt;        7      - change `7' partition&lt;br /&gt;        select - select a predefined table&lt;br /&gt;        modify - modify a predefined partition table&lt;br /&gt;        name   - name the current table&lt;br /&gt;        print  - display the current table&lt;br /&gt;        label  - write partition map and label to the disk&lt;br /&gt;        !&lt;cmd&gt; - execute &lt;cmd&gt;, then return&lt;br /&gt;        quit&lt;br /&gt;partition&gt; 0&lt;br /&gt;Part      Tag    Flag     Cylinders        Size            Blocks&lt;br /&gt;  0 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;&lt;br /&gt;Enter partition id tag[unassigned]: root&lt;br /&gt;Enter partition permission flags[wm]: wm&lt;br /&gt;Enter new starting cyl[3]: &lt;br /&gt;Enter partition size[0b, 0c, 3e, 0.00mb, 0.00gb]: 1170e&lt;br /&gt;partition&gt; 1&lt;br /&gt;Part      Tag    Flag     Cylinders        Size            Blocks&lt;br /&gt;  1 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;&lt;br /&gt;Enter partition id tag[unassigned]: swap&lt;br /&gt;Enter partition permission flags[wm]: &lt;br /&gt;Enter new starting cyl[3]: 1171&lt;br /&gt;Enter partition size[0b, 0c, 1171e, 0.00mb, 0.00gb]: 1301e&lt;br /&gt;partition&gt; p&lt;br /&gt;Current partition table (unnamed):&lt;br /&gt;Total disk cylinders available: 1302 + 2 (reserved cylinders)&lt;br /&gt;&lt;br /&gt;Part      Tag    Flag     Cylinders        Size            Blocks&lt;br /&gt;  0       root    wm       3 - 1170        8.95GB    (1168/0/0) 18763920&lt;br /&gt;  1       swap    wm    1171 - 1301        1.00GB    (131/0/0)   2104515&lt;br /&gt;  2     backup    wu       0 - 1301        9.97GB    (1302/0/0) 20916630&lt;br /&gt;  3 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;  4 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;  5 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;  6 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;  7 unassigned    wm       0               0         (0/0/0)           0&lt;br /&gt;  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065&lt;br /&gt;  9 alternates    wm       1 -    2       15.69MB    (2/0/0)       32130&lt;br /&gt;&lt;br /&gt;partition&gt; label&lt;br /&gt;Ready to label disk, continue? y&lt;br /&gt;&lt;br /&gt;partition&gt; q&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FORMAT MENU:&lt;br /&gt;        disk       - select a disk&lt;br /&gt;        type       - select (define) a disk type&lt;br /&gt;        partition  - select (define) a partition table&lt;br /&gt;        current    - describe the current disk&lt;br /&gt;        format     - format and analyze the disk&lt;br /&gt;        fdisk      - run the fdisk program&lt;br /&gt;        repair     - repair a defective sector&lt;br /&gt;        show       - translate a disk address&lt;br /&gt;        label      - write label to the disk&lt;br /&gt;        analyze    - surface analysis&lt;br /&gt;        defect     - defect list management&lt;br /&gt;        backup     - search for backup labels&lt;br /&gt;        verify     - read and display labels&lt;br /&gt;        save       - save new disk/partition definitions&lt;br /&gt;        volname    - set 8-character volume name&lt;br /&gt;        !&lt;cmd&gt;     - execute &lt;cmd&gt;, then return&lt;br /&gt;        quit&lt;br /&gt;format&gt; q&lt;br /&gt;(root@milax)# &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Where the heck is this script anyway?&lt;/h4&gt;&lt;br /&gt;The zfsinstall script is not part of the standard path for the Milax root user...  One thing though, even if the resulting hd image doesn't behave the way you want to, do not be tempted to "improve" the script -- you can get into some very strange situations where part of the boot is from read-only cdrom and the rest is from hard drive.  &lt;br /&gt;&lt;pre&gt;/usr/dss/bin/zfsinstall c3d0s0&lt;br /&gt;reboot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Dude where's my network&lt;/h4&gt;&lt;br /&gt;Having just gotten a super-rad ZFS install from a one-liner nicely named script like zfsinstall, it is fairly underwhelming to get a bunch of boot up errors and have a command like `ping google.com` return "unknown host".  Here are the fixes:&lt;br /&gt;&lt;pre&gt;# Get network operational!&lt;br /&gt;# Discover and activate our network card.&lt;br /&gt;ifconfig pcn0 plumb&lt;br /&gt;ifconfig pcn0 dhcp&lt;br /&gt;# Make these settings stick across reboot&lt;br /&gt;touch /etc/hostname.pcn0&lt;br /&gt;touch /etc/dhcp.pcn0&lt;br /&gt;&lt;br /&gt;svcadm disable sendmail   # gives warnings and not used...  you decide.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One problem with this method is it doesn't stick across reboots...  Touching the secret /etc files solves that.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Packages please&lt;/h4&gt;&lt;br /&gt;The Solaris package manager is not the best, but workable:&lt;br /&gt;&lt;pre&gt;mkdir /opt/local&lt;br /&gt;cd /opt/local&lt;br /&gt;pkg image-create -F -a opensolaris.org=http://pkg.opensolaris.org /opt/local&lt;br /&gt;pkg refresh&lt;br /&gt;# install C headers (stdio.h) and architecture (crt1.o) - minimum to compile hello world. &lt;br /&gt;pkg install SUNWhea&lt;br /&gt;pkg install SUNWarc&lt;br /&gt;# install man&lt;br /&gt;pkg install SUNWman&lt;br /&gt;# stop here, the do pkg breaks some /usr/lib dependencies later ...&lt;br /&gt;#pkg install SUNWdoc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For as painful as the SUNW packages are to use, the CSW (blastwave.org) ones are pure joy -- too bad they don't go as low-level...&lt;br /&gt;&lt;pre&gt;# Get basic package tools&lt;br /&gt;cd&lt;br /&gt;mkdir pkg&lt;br /&gt;cd pkg&lt;br /&gt;/usr/sfw/bin/wget http://blastwave.network.com/csw/pkgutil_i386.pkg&lt;br /&gt;pkgadd -d pkgutil_i386.pkg&lt;br /&gt;# List available&lt;br /&gt;/opt/csw/bin/pkgutil -a&lt;br /&gt;&lt;br /&gt;# Add /opt/csw/bin to PATH, or call explicitly&lt;br /&gt;export PATH=$PATH:/opt/csw/bin&lt;br /&gt;pkgutil -i subversion&lt;br /&gt;pkgutil -i ruby&lt;br /&gt;pkgutil -i rubygems&lt;br /&gt;pkgutil -i emacs_nox&lt;br /&gt;pkgutil -i curl&lt;br /&gt;pkgutil -i postfix&lt;br /&gt;pkgutil -i mysql5&lt;br /&gt;&lt;br /&gt;# Setup and start Mysql service&lt;br /&gt;/opt/csw/mysql5/share/mysql/quick-start-csw&lt;br /&gt;svcadm enable cswmysql5&lt;br /&gt;svcs&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5182303826236092955?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5182303826236092955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5182303826236092955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5182303826236092955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5182303826236092955'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2009/01/solaris-vmware-console-image-or.html' title='Solaris VMWare Console Image -- or exercises in pain'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8283138763559155646</id><published>2008-12-31T11:46:00.000-08:00</published><updated>2008-12-31T11:57:09.387-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>ASCII font fun</title><content type='html'>A new/old command line discovery: &lt;a href="http://linux.die.net/man/6/figlet"&gt;figlet&lt;/a&gt;.  This tool lets you create those puffy ASCII fonts easily:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ figlet Happy 2009&lt;br /&gt; _   _                           ____   ___   ___   ___  &lt;br /&gt;| | | | __ _ _ __  _ __  _   _  |___ \ / _ \ / _ \ / _ \ &lt;br /&gt;| |_| |/ _` | '_ \| '_ \| | | |   __) | | | | | | | (_) |&lt;br /&gt;|  _  | (_| | |_) | |_) | |_| |  / __/| |_| | |_| |\__, |&lt;br /&gt;|_| |_|\__,_| .__/| .__/ \__, | |_____|\___/ \___/   /_/ &lt;br /&gt;            |_|   |_|    |___/                           &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;$ figlet -c -f smslant "* l 8 r z *"&lt;br /&gt;                               __  ___                  &lt;br /&gt;                         _/|  / / ( _ )  ____  ___   _/|&lt;br /&gt;                        &gt; _&lt; / / / _  | / __/ /_ /  &gt; _&lt;&lt;br /&gt;                        |/  /_/  \___/ /_/    /__/  |/  &lt;br /&gt;                                                                                                             &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8283138763559155646?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8283138763559155646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8283138763559155646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8283138763559155646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8283138763559155646'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/12/ascii-art-fun.html' title='ASCII font fun'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5366647105000897088</id><published>2008-12-30T20:32:00.000-08:00</published><updated>2008-12-30T20:55:23.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Indie Rock Matrimony</title><content type='html'>I don't know when this blog became the E! magazine of Indie Rock, but it is true: &lt;a href="http://www.pitchforkmedia.com/article/news/148227-zooey-deschanel-and-ben-gibbard-engaged"&gt;Zooey Deschanel and Ben Gibbard are engaged&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Death Cab for Cutie Video&lt;/h3&gt;&lt;br /&gt;You know your favorite band of 10 years has "made it big" when your Brother in Law has their latest album before you do.&lt;br /&gt;&lt;br /&gt;"I Will Possess Your Heart"&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PsCV61zsdtA&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/PsCV61zsdtA&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;She &amp;amp; Him Video&lt;/h3&gt;&lt;br /&gt;Zooey Deschanel and the M.Ward dude are She &amp;amp; Him:&lt;br&gt;&lt;br /&gt;"Why Do You Let Me Stay Here?"&lt;br /&gt;&lt;object height="425" width="540"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="movie" value="http://video.pitchfork.tv/mediaplayer.swf"&gt;&lt;param name="flashvars" value="file=http://pitchfork.tv/node/1412/embed.xml"&gt;&lt;embed src="http://video.pitchfork.tv/mediaplayer.swf" type="application/x-shockwave-flash" flashvars="file=http://pitchfork.tv/node/1412/embed.xml" allowfullscreen="true" height="425" width="540"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Postal Service Unofficial Video&lt;/h3&gt;&lt;br /&gt;"National Anthem" from Ben Gibbard's epic side project:&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/c60AQISyvyk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/c60AQISyvyk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5366647105000897088?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5366647105000897088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5366647105000897088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5366647105000897088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5366647105000897088'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/12/indie-rock-matrimony.html' title='Indie Rock Matrimony'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-37809438819627760</id><published>2008-12-30T18:45:00.001-08:00</published><updated>2008-12-30T19:21:34.958-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>City in Fog + Half a Million Nerds</title><content type='html'>Latest submissions to &lt;a href="http://songfight.org/"&gt;SongFight&lt;/a&gt; by &lt;a href="http://songfight.org/artistpage.php?key=berkeley_social_scene"&gt;Berkeley Social Scene&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 150px;" src="http://www.songfight.org/covers/city_in_fog_johnny150.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;a href="http://www.songfight.org/music/half_a_million_nerds/berkeleysocialscene_hamn.mp3"&gt;Half a Million Nerds&lt;/a&gt; (mp3)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.songfight.org/music/city_in_fog/berkeleysocialscene_cif.mp3"&gt;City in Fog&lt;/a&gt; (mp3)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-37809438819627760?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/37809438819627760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=37809438819627760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/37809438819627760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/37809438819627760'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/12/city-in-fog-half-million-nerds.html' title='City in Fog + Half a Million Nerds'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4075261856557632337</id><published>2008-12-05T04:39:00.000-08:00</published><updated>2008-12-30T19:22:43.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><title type='text'>The Website Is Down; All your base are belong to us</title><content type='html'>This video, "Sales Guy vs. Web Dude" is an internet classic:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BcQ7RkyBoBc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/BcQ7RkyBoBc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The source is &lt;a href="http://thewebsiteisdown.com"&gt;thewebsiteisdown.com&lt;/a&gt;, which is a worthwhile place to check out simply for their UNIX and SalesGuy simulators.  If you try the UNIX simulator, run the following commands:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;What's your freakin' username?&lt;br /&gt;Username: hi&lt;br /&gt;Enter password for hi: ****&lt;br /&gt;Logged in.&lt;br /&gt;/home/hi&gt; ls&lt;br /&gt;apple/ fark* theme*&lt;br /&gt;/home/hi&gt; cd apple&lt;br /&gt;/home/hi/apple&gt; ls&lt;br /&gt;karataka*&lt;br /&gt;/home/hi/apple&gt; karataka&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;These website is down guys remind me of this other year 2000 dot-com bubble video nerd-core sensation, "All your bomb are belong to us":&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qItugh-fFgg&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qItugh-fFgg&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;CLASSIC&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4075261856557632337?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4075261856557632337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4075261856557632337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4075261856557632337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4075261856557632337'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/12/website-is-down-all-your-base-are.html' title='The Website Is Down; All your base are belong to us'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6417541615969698685</id><published>2008-11-22T12:18:00.000-08:00</published><updated>2008-11-22T12:41:13.537-08:00</updated><title type='text'>SSH your database away</title><content type='html'>Looking for some nice horizontal scaling options in a pinch?  SSH tunnels are your ultimate friend.  Here is how to use ssh tunnels to pry away a master mysql database onto its own machine.  This leaves your fleet of Ruby on Rails mongrels or the web application environment of your choice to run on its own and slurp up all the memory and resources of the slice in question?  So this is basically answering: how do I split mongrel_cluster and mysql on my one big vertical slice into separate boxes.  You can do this through binding on a private network, but I have found the ssh tunnel technique to be much simpler and general purpose.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So on to the steps: &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;add autossh on mongrel_cluster machine to keep your tunnel alive&lt;/li&gt;&lt;br /&gt;&lt;a href="http://www.harding.motd.ca/autossh/"&gt;autossh&lt;/a&gt; is an awesome way to keep your tunnel alive even if the remote machine goes down for a few hours.  This smf system only has to make sure the autossh process is alive on the local machine, and your ssh tunnel will have maximum reliability.&lt;br /&gt;&lt;pre&gt;# Add ssh tunnel monitors&lt;br /&gt;cd&lt;br /&gt;mkdir src&lt;br /&gt;cd src&lt;br /&gt;wget http://www.harding.motd.ca/autossh/autossh-1.4b.tgz&lt;br /&gt;tar xzf autossh-1.4b.tgz&lt;br /&gt;cd autossh-1.4b&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;turn off mysql daemon on the mongrel machine (solaris/joyent way)&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;sudo svcadm disable mysql&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;add boot script to start autossh and tunnel&lt;/li&gt;&lt;br /&gt;&lt;b&gt;ssh_tunnel_mysql.smf&lt;/b&gt;&lt;br /&gt;&lt;br&gt;(all the magic happens here, including the binding of remote mysql_hostname:3306 to local mongrel_cluster:3306 so all access to the local mysql port gets forwarded to the remote box.)&lt;br /&gt;&lt;pre&gt;   . . .&lt;br /&gt;    &amp;lt;exec_method name='start' type='method' exec='/opt/local/bin/autossh -M 0 -f -L3306:127.0.0.1:&lt;br /&gt;3306 -p 22 -N -t -x mysql_hostname' timeout_seconds='60'&amp;gt;&lt;br /&gt;   . . . &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add boot script and fire it up!&lt;br /&gt;&lt;pre&gt;sudo svccfg import ssh_tunnel_mysql.smf&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;configure rails database.yml to access ssh tunnel via 127.0.0.1:3306 rather than local socket file&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;production:&lt;br /&gt;  adapter: mysql&lt;br /&gt;  database: my_production_db&lt;br /&gt;  username: root&lt;br /&gt;  password: &lt;br /&gt;  host: 127.0.0.1&lt;br /&gt;  port: 3306&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6417541615969698685?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6417541615969698685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6417541615969698685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6417541615969698685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6417541615969698685'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/11/ssh-your-database-away.html' title='SSH your database away'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4146367581870504614</id><published>2008-11-17T17:06:00.000-08:00</published><updated>2008-12-30T19:04:43.855-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Scary meals from Berkeley</title><content type='html'>Here are the most recent SongFight entries by Berkeley Social Scene:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.songfight.org/covers/stomach_for_it_rabid400.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 197px; height: 197px;" src="http://www.songfight.org/covers/stomach_for_it_rabid400.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.songfight.org/music/hollywood_wax/berkeleysocialscene_hw.mp3"&gt;Hollywood Wax&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.songfight.org/music/stomach_for_it/berkeleysocialscene_sfi.mp3"&gt;Stomach for it&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.songfight.org/music/a_scary_thing/berkeleysocialscene_ast.mp3"&gt;Scary Thing&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.songfight.org/music/shoelace_soup/jonathanmann_ss.mp3"&gt;Shoelace Soup&lt;/a&gt; (with Jonathon Mann)&lt;/li&gt;&lt;/ul&gt;In other news, I had the "24-hour" stomach flu this weekend.  It started when I almost collapsed getting out of bed Friday night, and then got to experience my last two meals in reverse as I puked them out in two large belch sessions -- one at midnight over the toilet and another in the morning over the kitchen sink.  Saw all the wine, from dinner, and even some of the basil pieces from thai lunch.  Do I drink that much wine, or does it just not digest as fast as food?  After sleeping 36 hours straight, I feel fine!  Just wish the bug hadn't made me miss my son's group birthday party...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4146367581870504614?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4146367581870504614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4146367581870504614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4146367581870504614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4146367581870504614'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/11/scary-meals-from-berkeley.html' title='Scary meals from Berkeley'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5495877509781346062</id><published>2008-11-17T16:48:00.000-08:00</published><updated>2008-11-22T12:45:56.979-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Google Appengine has HTTPS now - YAY!</title><content type='html'>Slightly old news, but &lt;a href="http://googleappengine.blogspot.com/2008/10/announcing-https-support-for-appspotcom.html"&gt;Google Appengine released full support for secure requests&lt;/a&gt;.  Adding this to your site is as simple as picking one of the following for each url in your app.yaml:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- url: /secure&lt;br /&gt;  secure: always&lt;br /&gt;&lt;br /&gt;- url: /to_secure_or_not_too_secure&lt;br /&gt;  secure: optional&lt;br /&gt;&lt;br /&gt;- url: /not_secure&lt;br /&gt;  secure: never&lt;br /&gt;&lt;/pre&gt;secure:never is the default.  I would think secure:optional would be the best default, but hey, I'm not complaining.  Google gives a separate up/down quota of 2MB/day to all the HTTPS requests, equal to the previous HTTP quota, so you can balance your traffic across secured and unsecured channels to maximize allotment utilization.  And remember that HTTPS encrypts your headers, so even HTTPS GET parameters are fully encoded and trustworthy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5495877509781346062?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5495877509781346062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5495877509781346062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5495877509781346062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5495877509781346062'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/11/google-appengine-has-https-now-yay.html' title='Google Appengine has HTTPS now - YAY!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2546843011723791745</id><published>2008-10-10T16:42:00.000-07:00</published><updated>2008-10-10T17:05:48.365-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Everybody Calm Down</title><content type='html'>The &lt;a href="http://www.songfight.org/artistpage.php?key=berkeley_social_scene&amp;amp;sortkey=date"&gt;Berkeley Social Scene&lt;/a&gt; went live as a SongFight collaborative project recently.  With our new practice space in Oakland replacing the basement jam space right under baby Shea's bedroom, we now get to jam until ... well ... 11pm when the neighbors come down and complain.  Here are the initial results of the group though:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.songfight.org/pix/everybody_calm_down/cover150.jpg" /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: left;"&gt;&lt;a href="http://www.songfight.org/music/everybody_calm_down/jonathanmann+berkeleysocialscene_ecd.mp3"&gt;Everybody Calm Down&lt;/a&gt; - Johnathon Mann + BSS - &lt;a href="http://songfight.org/"&gt;vote now&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="text-align: left;"&gt;&lt;a href="http://www.songfight.org/music/mediocre_savior/berkeleysocialscene_ms.mp3"&gt;Mediocre Savior&lt;/a&gt; - Erin + BSS - winner - &lt;a href="http://www.songfight.org/songpage.php?key=mediocre_savior"&gt;08/08/08&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="text-align: left;"&gt;&lt;a href="http://www.songfight.org/music/calico_alley/berkeleysocialscene_ca.mp3"&gt;Calico Alley&lt;/a&gt; - Erin + BSS - winner - &lt;a href="http://www.songfight.org/songpage.php?key=calico_alley"&gt;08/20/08&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://www.songfight.org/music/interesting_times/berkeleysocialscene_it.mp3"&gt;Interesting Times&lt;/a&gt; - &lt;a href="http://www.songfight.org/songpage.php?key=interesting_times"&gt;09/03/08&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&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/21430394-2546843011723791745?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2546843011723791745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2546843011723791745' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2546843011723791745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2546843011723791745'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/10/everybody-calm-down.html' title='Everybody Calm Down'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5268756992526397809</id><published>2008-09-02T20:16:00.000-07:00</published><updated>2008-11-22T12:46:39.515-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Google Chrome plates the web</title><content type='html'>Google ends the madness and takes matters into their own hands with the release of Google Chrome.  A &lt;a href="http://www.google.com/googlebooks/chrome/"&gt;comic book&lt;/a&gt; describing the tale is here.  Basically, this is the ultimate browser: each tab is a process, a new JavaScript VM called V8 that does just-in-time compilation to machine code, high speed and near-perfect memory efficiency, WebKit rendering, and highly secure sandboxing.  It sounds sooo awesome.  Windows only beta for now.  &lt;a href="http://www.google.com/chrome"&gt;Download&lt;/a&gt;.  Chrome is taking the browser 20 steps closer to be an operating system, and ominously gives Microsoft a competitive run for its money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5268756992526397809?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5268756992526397809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5268756992526397809' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5268756992526397809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5268756992526397809'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/09/google-chrome-plates-web.html' title='Google Chrome plates the web'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8264200920608962953</id><published>2008-07-21T15:02:00.000-07:00</published><updated>2008-07-21T15:05:43.521-07:00</updated><title type='text'>Google Location API Reveled</title><content type='html'>The Google Location API for converting cell tower information into a latitude/longitude is really cool, but not officially released to the public.  The following links show how you can use this to provide iphone like features of calculating location without a GPS chipset:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;a href="http://maps.alphadex.de/datafiles/fct0e1b117823ccc1a.txt"&gt;HTTP REQUEST  DETAILS&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;a title="blocked::http://maps.alphadex.de/datafiles/fct0e1b117823ccc1a.txt" href="http://maps.alphadex.de/datafiles/fct0e1b117823ccc1a.txt"&gt;&lt;br /&gt;http://maps.alphadex.de/datafiles/fct0e1b117823ccc1a.txt&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;a href="http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs"&gt;C# code to send  request&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;a title="blocked::http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs" href="http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs"&gt;&lt;br /&gt;http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs&lt;/a&gt;  &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;a href="http://foreverneilyoung.blogspot.com/search/label/Google%20Maps%20For%20Mobile"&gt;Blog on the  topic&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;br /&gt;&lt;a title="blocked::http://foreverneilyoung.blogspot.com/search/label/Google Maps For Mobile" href="http://foreverneilyoung.blogspot.com/search/label/Google%20Maps%20For%20Mobile"&gt;http://foreverneilyoung.blogspot.com/search/label/Google%20Maps%20For%20Mobile&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://maps.alphadex.de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Original blog  location&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a title="blocked::http://maps.alphadex.de/" href="http://maps.alphadex.de/"&gt;&lt;br /&gt;http://maps.alphadex.de&lt;/a&gt;   &lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;br /&gt;(Why the guy  moved from a personal blog to blogger.com after being !censored! from google  groups isn’t really clear to me…)&lt;/span&gt;&lt;/span&gt;&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/21430394-8264200920608962953?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8264200920608962953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8264200920608962953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8264200920608962953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8264200920608962953'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/07/google-location-api-reveled.html' title='Google Location API Reveled'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2293231303617481834</id><published>2008-07-11T14:43:00.000-07:00</published><updated>2008-11-22T12:46:26.243-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Firefox 3.0 Released</title><content type='html'>Mozilla Firefox 3.0 is out!  It is much nicer -- download today.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mozilla.com/en-US/"&gt;http://www.mozilla.com/en-US/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2293231303617481834?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2293231303617481834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2293231303617481834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2293231303617481834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2293231303617481834'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/07/firefox-30-reeased.html' title='Firefox 3.0 Released'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7496039939645845337</id><published>2008-06-03T21:59:00.001-07:00</published><updated>2011-03-09T21:48:56.661-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>SquirrelFish to double the speed of JavaScript in the browser</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://webkit.org/blog-files/squirrelfish.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://webkit.org/blog-files/squirrelfish.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have you seen this?   SquirrelFish !!&lt;br /&gt;&lt;a href="http://webkit.org/blog/189/announcing-squirrelfish/"&gt;http://webkit.org/blog/189/announcing-squirrelfish/&lt;/a&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://ajaxian.com/archives/squirrelfish-details-on-the-new/"&gt;http://ajaxian.com/archives/squirrelfish-details-on-the-new/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The WebKit browser just released a super-powered JavaScript engine that has a VM underneath rather than a slow text parser / tree interpreter.  The underlying technology is very exciting, and this should roll into Safari very soon.  The web will just rock so much harder once this is in release browsers and on ! iphone ! ... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The previous post links to three competing JavaScript engines: Mozilla, Safari, and Java.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7496039939645845337?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7496039939645845337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7496039939645845337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7496039939645845337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7496039939645845337'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/06/squirrelfish-to-double-speed-of.html' title='SquirrelFish to double the speed of JavaScript in the browser'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3313907375451300822</id><published>2008-06-03T17:16:00.000-07:00</published><updated>2011-03-09T21:48:40.168-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>JavaScript -- the last computer language</title><content type='html'>What is your perception of JavaScript?  Is it that squishy language that allows cobbling together hacked up and unreadable web pages that should be avoided like the plaque?  Well, now that it has established itself firmly as the most pervasive de facto client-side language, it could very well become the next C.  Here are some recent trends:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JUST ANNOUNCED -&lt;a href="http://webkit.org/blog/189/announcing-squirrelfish/"&gt;SquirrelFish&lt;/a&gt; -&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;WebKit optimized JavaScript Engine (&lt;a href="http://webkit.org/specs/squirrelfish-bytecode.html"&gt;VM opcodes&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://developer.mozilla.org/en/docs/SpiderMonkey"&gt;SpiderMonkey&lt;/a&gt; - Mozilla JavaScript Engine (&lt;a href="http://developer.mozilla.org/en/docs/JSAPI_Reference"&gt;JSAPI&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Stevey's post on &lt;a href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html"&gt;why dynamic languages will rule&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google I/O presentation by Steve Yegge on &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt; (server-side JavaScript running on JVM) and RnR (&lt;a href="http://google-code-updates.blogspot.com/2008/01/interview-with-steve-yegge-on-rhino-on.html"&gt;Rhino is not Rails&lt;/a&gt; web framework.)&lt;/li&gt;&lt;li&gt;A &lt;a href="http://www.squarefree.com/shell/shell.html"&gt;JavaScript shell&lt;/a&gt; to try things out in.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Here is my preferred design pattern for defining a class in JavaScript 1.x:&lt;pre&gt;function MyClass() {};&lt;br /&gt;MyClass.prototype = {&lt;br /&gt;  foo: function() { return 1; },&lt;br /&gt;  bar: function() { return 2; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;myObj = new MyClass();&lt;/pre&gt;&lt;br /&gt;Here is another cool way to build an object (the JSON way):&lt;pre&gt;var d = {&lt;br /&gt;  moo: 'moo',&lt;br /&gt;  foo: function() { return 3; },&lt;br /&gt;  bar: function() { return 4; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3313907375451300822?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3313907375451300822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3313907375451300822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3313907375451300822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3313907375451300822'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/06/javascript-last-computer-language.html' title='JavaScript -- the last computer language'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6404196352518692133</id><published>2008-05-28T16:15:00.000-07:00</published><updated>2008-11-22T13:01:02.250-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IO2008'/><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Live from Google I/O</title><content type='html'>Google certainly has released a slew of fantastic web APIs which is great.  The initial sessions were a bit hit-or-miss, but there were some gems.  I was most impressed with the Google Earth Plugin.  This talk was given by the author of &lt;a href="http://housingmaps.com/index.html"&gt;HousingMaps&lt;/a&gt; and allows up-converting Google Maps applications to add an extra "view" that is ... Earth!  All that is required is that you add the following line of JavaScript:&lt;br /&gt;&lt;pre&gt;var map = new GMap2(document.getElementById("map"));&lt;br /&gt;map.addMapType(G_SATELLITE_3D_MAP);  // Add this one line&lt;br /&gt;&lt;/pre&gt;A sample of the result is at this alternate version of &lt;a href="http://housingmaps.com/index-3d.html"&gt;HousingMaps 3d&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mb5txD4vOHA/SD3pZH8QzTI/AAAAAAAAAF8/ipzUAYZchT4/s1600-h/google-earth-plugin-40.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_mb5txD4vOHA/SD3pZH8QzTI/AAAAAAAAAF8/ipzUAYZchT4/s400/google-earth-plugin-40.JPG" alt="" id="BLOGGER_PHOTO_ID_5205573362147970354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some other samples of the &lt;a href="http://code.google.com/apis/earth/documentation/examples.html"&gt;Earth Plugin API are here&lt;/a&gt;, including &lt;a href="http://www.google.com/earth/plugin/examples/milktruck/"&gt;monster milktruck&lt;/a&gt; madness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6404196352518692133?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6404196352518692133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6404196352518692133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6404196352518692133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6404196352518692133'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/live-from-google-io.html' title='Live from Google I/O'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mb5txD4vOHA/SD3pZH8QzTI/AAAAAAAAAF8/ipzUAYZchT4/s72-c/google-earth-plugin-40.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5841947600873317351</id><published>2008-05-23T01:44:00.000-07:00</published><updated>2008-05-23T02:19:28.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iphone 2.0 sdk limitations</title><content type='html'>Posts similar to &lt;a href="http://mooseyard.com/Jens/2008/03/the-iphone-has-blinders-on/"&gt;this one&lt;/a&gt; have been popping up all over the blogosphere over the past day or two.  That the initial apple iphone sdk won't allow background processes or IM type applications is somehow surprising folks.  Well, it is true it is a major bummer, but the reasons behind it are a combination of political/economically motivated and technical.&lt;br /&gt;&lt;br /&gt;1) Cell providers generally do not allow internet servers to initiate a request to a cell phone server socket.  This is mostly a security and privacy concern.&lt;br /&gt;&lt;br /&gt;2) Keeping a continuous GPRS data connection open and alive drains about 200mA continuous compared to 30mA for just staying "connected" to the network by GSM polling for incoming calls and SMS messages.&lt;br /&gt;&lt;br /&gt;3) The best way to push a request to a mobile device is via SMS (i.e. WAP push), but that is limited to 200 messages a month in the default plan.&lt;br /&gt;&lt;br /&gt;4) High-speed, regular polling for status is evil.  If every app on my phone "called home" every few minutes and talked some complex protocol random vendors made up, that could get out of control very quickly.   Any such polling would have to be optimized which would require consolidating status messages from disparate vendors.  &lt;br /&gt;&lt;br /&gt;5) Sparse asynchronous updates can be okay if they happen rarely.  The perfect compromise is to only do updates when you first pull your phone out of sleep.  If you think about it, all you really want is for all your app badges to update with the number of new things available (RSS messages, IM, whatever).  Apple should provide a way for 3rd party apps to strap into the "wake up phone" event and register a small URL to  hit for updating an app badge with the number of new things available.  They could even control this on their own servers if need be to insure it is always a single integer per app.  This would be an easy way to solve most issues with "background processes" without actually needing them.  &lt;br /&gt;&lt;br /&gt;6) Apple likely has some secret WAP-like push protocols to handle at least their voicemail service.  The mail app might poll, maybe it leverages the same push that drives the voicemail.  The new exchange capability probably uses the same push protocol as voicemail.   &lt;br /&gt;&lt;br /&gt;So a proposed architecture for 3rd party "always connected" iphone mobile services:&lt;br /&gt;- create an iphone API service that emulates server sockets - you open a port and listen for "clients" (really web app servers)&lt;br /&gt;   the implementation of this would be as follows:&lt;br /&gt;&lt;br /&gt;- the phone registers its phone number with web app servers it is interested in&lt;br /&gt;- when a web app server has an update for your phone, it sends an SMS push to your phone number with a port and GET request encoded into it.&lt;br /&gt;- the iphone routes this SMS push using the port (3rdparty app reference) and GET message to initiate some action on your phone.&lt;br /&gt;- the launchme sample app is close to this, if it could only be initiated automatically via SMS by a "trusted service".&lt;br /&gt;- once the app is up, it can make a persistent Comet HTTP connection back to the web app server for live updates during the session.&lt;br /&gt;&lt;br /&gt;The SMS plan would have to be made unlimited for this to work so users that want their phone buzzed each IM could enable that.  &lt;br /&gt;&lt;br /&gt;Why do SMS msgs cost so much anyway?   And ring tones?  Its almost as if these basic facilities aren't available *because* people are willing to pay $2 for a 10 second watered down version of their favorite songs...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5841947600873317351?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5841947600873317351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5841947600873317351' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5841947600873317351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5841947600873317351'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/iphone-20-sdk-limitations.html' title='iphone 2.0 sdk limitations'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-9151814433645229626</id><published>2008-05-20T13:04:00.001-07:00</published><updated>2008-11-22T12:45:21.508-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>AppEngine BulkLoader</title><content type='html'>Good sample code for Google AppEngine is still hard to come by.  So here is my initial contribution: the ultimate example for writing your own custom bulkload handler.  This will parse date, float, integer, and string fields from a csv and cast them to fields in your db.Model.  This also shows how to override HandleEntity, cast that Entity into a Model, and manipulate the db object as a model.  Ultimately, the model is put into the database right here and an empty entity set is returned to the tool because the data has already been loaded.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/env python&lt;br /&gt;#&lt;br /&gt;# Bulk uploader to Google AppEngine.&lt;br /&gt;#&lt;br /&gt;# @author http://l8rs.blogspot.com&lt;br /&gt;# @date   2008/5/20&lt;br /&gt;#&lt;br /&gt;# Based on article at: &lt;br /&gt;#    http://code.google.com/appengine/articles/bulkload.html&lt;br /&gt;#&lt;br /&gt;# Usage:&lt;br /&gt;#    ./tools/bulkload_client.py --filename locations.csv \&lt;br /&gt;#                     --kind MyModel \&lt;br /&gt;#                     --url http://localhost:8080/load&lt;br /&gt;#&lt;br /&gt;# Csv must be formatted properly:&lt;br /&gt;#     [date time],float,int,string,[float or 'ERROR']&lt;br /&gt;#     2008/04/09 16:22:58,37.4,0,string,29.3&lt;br /&gt;&lt;br /&gt;from datetime import *&lt;br /&gt;from types import *&lt;br /&gt;&lt;br /&gt;from google.appengine.ext import bulkload&lt;br /&gt;from google.appengine.api import datastore&lt;br /&gt;from google.appengine.api import datastore_types&lt;br /&gt;from google.appengine.ext import search&lt;br /&gt;&lt;br /&gt;from MyModels import MyModel&lt;br /&gt;&lt;br /&gt;class MyModelLoader(bulkload.Loader):&lt;br /&gt;  def __init__(self):&lt;br /&gt;    bulkload.Loader.__init__(self, 'MyModel',[&lt;br /&gt;        ('when', lambda x: datetime.strptime(x,"%Y/%m/%d %H:%M:%S")),&lt;br /&gt;        ('float', lambda x: float(x)),&lt;br /&gt;        ('int', int),&lt;br /&gt;        ('string', str),&lt;br /&gt;        ('float_or_string', lambda x: float(x) if not x == 'ERROR' else None),&lt;br /&gt;        ])&lt;br /&gt;&lt;br /&gt;  # Called for each MyModel that is created. Post processing happens here.&lt;br /&gt;  def HandleEntity(self, entity):&lt;br /&gt;    dbobj = MyModel.from_entity(entity)     # Convert entity to model&lt;br /&gt;    #dbobj.myCustomMethod()                 # Call model methods&lt;br /&gt;    dbobj.put()                             # Store to db as model&lt;br /&gt;    return []                               # return nothing -- already handled&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;  bulkload.main(MyModelLoader())&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-9151814433645229626?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/9151814433645229626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=9151814433645229626' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9151814433645229626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9151814433645229626'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/appengine-bulkloader.html' title='AppEngine BulkLoader'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7412641172692464785</id><published>2008-05-14T22:24:00.000-07:00</published><updated>2008-11-22T12:47:15.116-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Wire up your own Ethernet Crossover</title><content type='html'>Don't be afraid to get a &lt;a href="http://www.outletpc.com/c0279.html"&gt;crimping&lt;/a&gt; tool and some &lt;a href="http://www.nullmodem.com/RJ-45.htm"&gt;RJ-45 connectors&lt;/a&gt;, and wire up your own ethernet crossover cable.  I had to do this today to start moving servers from one DSL connection to another.  Take care to write down the 8 wire colors before you cut off the old connector.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mb5txD4vOHA/SCvLSg1JrUI/AAAAAAAAAF0/ulPnEkzRTUA/s1600-h/Crossover.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_mb5txD4vOHA/SCvLSg1JrUI/AAAAAAAAAF0/ulPnEkzRTUA/s400/Crossover.gif" alt="" id="BLOGGER_PHOTO_ID_5200473713640320322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The last time I had to wire one of these was 2000.  Why do I need to get so old school in 2008?  Faster internet.  I needed to move all my machines to the new high-speed line, but had to leave one critical server on the old IP addresses until configurations are sorted out and tested.  All the original routers and equipment were now on the new line, and I needed to recycle up a hub of some sort.  So pulled an old 10MBit router out of the basement, and wired up this thing.  Saved a trip to the computer junk store!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[BEFORE]&lt;/span&gt;&lt;br /&gt;old DSL&lt;br /&gt;&lt;--&gt; hub [crossover port]&lt;br /&gt;- server 1 on open internet&lt;br /&gt;- server 2 on open internet&lt;br /&gt;&lt;--&gt; WiFi [crossover port]&lt;br /&gt;- firewalled pc&lt;br /&gt;- firewalled pc&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[AFTER]&lt;/span&gt;&lt;br /&gt;new DSL (new IP address range)&lt;br /&gt;&lt;--&gt; hub [crossover port]&lt;br /&gt;- server 2 on open internet&lt;br /&gt;&lt;--&gt; WiFi [crossover port]&lt;br /&gt;- firewalled pc&lt;br /&gt;- firewalled pc&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;old DSL (old IP address range)&lt;br /&gt;&lt;--&gt; crossover cable&lt;br /&gt;recycled 10MBit hub [no crossover port]&lt;br /&gt;- server 1 on open internet&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7412641172692464785?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7412641172692464785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7412641172692464785' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7412641172692464785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7412641172692464785'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/wire-up-your-own-ethernet-crossover.html' title='Wire up your own Ethernet Crossover'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mb5txD4vOHA/SCvLSg1JrUI/AAAAAAAAAF0/ulPnEkzRTUA/s72-c/Crossover.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-9043864094059237542</id><published>2008-05-14T20:25:00.000-07:00</published><updated>2008-05-14T20:52:20.668-07:00</updated><title type='text'>Google Map API Links</title><content type='html'>Here are some api links for Google Map Mashup development:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://themechanism.com/blog/2008/03/30/thematic-mapping-with-the-google-charts-api-a-brief-tutorial/"&gt;Map Coloring for States&lt;/a&gt; or Electoral College Simulation...&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/Size%20and%20color%20markers"&gt;Size and color markers&lt;/a&gt; on map mashup.&lt;/li&gt;&lt;li&gt;Nice sample of final product : &lt;a href="http://en.wikipedia.org/wiki/Red_states_and_blue_states"&gt;voting pattern visualization&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://chart.apis.google.com/chart?chs=350x200&amp;amp;chf=bg,s,000000&amp;amp;cht=t&amp;amp;chtm=usa&amp;amp;chco=ffffff,0000ff,cccccc,ff0000&amp;amp;chld=ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDTNTXUTVTVAWAWVWIWY&amp;amp;chd=s:99teAtAAttA9A9O9eeAAAAA9et9eOAOA99e9AAA99e99A9AeA9" /&gt;&lt;div&gt;This complete Electoral College map model is encoded as a concise HTTP GET using a single URL:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;http://chart.apis.google.com/chart?chs=350x200&amp;chf=bg,s,000000&amp;cht=t&amp;chtm=usa&amp;chco=ffffff,0000ff,cccccc,ff0000&amp;chld=ALAKAZARCACOCTDEFLGAHIIDILINIAKSKYLAMEMDMAMIMNMSMOMTNENVNHNJNMNYNCNDOHOKORPARISCSDTNTXUTVTVAWAWVWIWY&amp;chd=s:99teAtAAttA9A9O9eeAAAAA9et9eOAOA99e9AAA99e99A9AeA9&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Basically, it encodes as fields the size [chs=350x200], background color [chf=bg,s,000000], country selection (chtm=usa), colorization default and gradient [chco=ffffff,0000ff,cccccc,ff0000], list of states, and colorization of those states to base 64 levels using &lt;a href="http://code.google.com/apis/chart/#simple"&gt;Google Simple Encoding&lt;/a&gt; from A-Z,a-z,0-9.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-9043864094059237542?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/9043864094059237542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=9043864094059237542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9043864094059237542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9043864094059237542'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/google-map-api-links.html' title='Google Map API Links'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3048804525656565090</id><published>2008-05-01T20:17:00.000-07:00</published><updated>2008-11-22T12:47:43.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Google releases AppEngine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://www.google.com/accounts/ah/appengine.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 170px; height: 130px;" src="https://www.google.com/accounts/ah/appengine.gif" alt="" border="0" /&gt;&lt;/a&gt;This entry is about a month behind, but must be posted nonetheless.  Google has released its &lt;a href="http://code.google.com/appengine"&gt;AppEngine&lt;/a&gt;.  What is this you may ask?  Well if you want to host your Web 2.0 start-up and need to worry about how to scale it up to millions of users, AppEngine is the product for you!&lt;br /&gt;&lt;br /&gt;It starts out with 500MB of free hosting and enough bandwidth to handle 5 million page views per month.  You write your app in &lt;a href="http://docs.python.org/"&gt;Python&lt;/a&gt; using the &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; framework, and save your data using a limited sub-set of SQL to Google's own &lt;a href="http://labs.google.com/papers/bigtable-osdi06.pdf"&gt;BigTable&lt;/a&gt; backend.   BigTable is the same thing Google uses to serve up their fast searches, so it will locally cache up common data queries on demand.  If 200,000 users start hitting your site for an hour in China, and simultaneously you get a bunch of hits from New York, your data will cache up and serve fast as needed using the same technology that powers YouTube and the like.&lt;br /&gt;&lt;br /&gt;So this is all very cool, what's the catch?  Well the API tends to direct your users to be controlled by Google itself.  This isn't forced on you, but it is made, lets say, very convenient.  Also, the pricing isn't published yet, so you have no idea how much scaling beyond the initial 0.5GB will really cost you.  Nonetheless this totally changes the web start-up landscape.  So far roll-out is limited to the first 10,000 developers that signed up in the first hour of launch.  (Secret: to get immediate access, &lt;a href="http://appengine.google.com/"&gt;sign up here&lt;/a&gt;, then sign up for the &lt;a href="http://code.google.com/events/hackathons/appengine-sf.html"&gt;free SF hack-a-thon&lt;/a&gt; next week, or pay $400 and &lt;a href="http://code.google.com/events/io/"&gt;attend Google IO&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The sample &lt;a href="http://appgallery.appspot.com/"&gt;app gallery&lt;/a&gt; doesn't have anything super spectacular yet, but there are some cool things there considering they have all been developed in a few weeks.  Actually, there's a little side story with that.  At launch, the app gallery had a great sample app called "Huddle Chat".  It was this really clean collaboration chat engine where you could invite members of your team into a "Huddle" and conduct a live, group chat session in a web page.  You could drag and drop pictures and documents straight into the chat window and they would appear inline with the text of the chat.  Also, you could leave and reenter your chat and all the context was saved and searchable.  The app was awesome, but it was all to similar to &lt;a href="http://www.campfirenow.com/"&gt;Campfire Chat&lt;/a&gt; by the creators of &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, another popular web app framework that competes with Django for mind share.    Anyway, so many people cried fowl and protested in the forums that Google had copied the &lt;a href="http://www.37signals.com/"&gt;37signals&lt;/a&gt; group chat app feature for feature, and that Google was evil, that they took it down!  So now there are only some ok ones.  The one I like most right now is the simple &lt;a href="http://loan-amortization.appspot.com/"&gt;amortization calculator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So how is coding in Python?  Well first thing to note is that the inventor of Python works for Google.  He's sort of their resident James Gosling (inventor of Java for Sun) of sorts.  The language is okay, it's clean and modern, has good OO concepts builtin, and dynamic typing similar to JavaScript (squishy assignment of new instance data on the fly...)  But I don't like that whitespace is significant in the syntax.  There are no curly braces for code blocks, instead you have to indent perfectly to specify what code belongs inside an if statement or loop.  So if your editor isn't very good (vi via ssh) or you've moved the code between platforms (dos line feeds get added on somehow by cvs or however) the code breaks ...  Ugh, Python is not a good candidate language for cross-fertilized genetic programming ...  Oh, and there are these weird __main__ and __init__ functions which allow you to override the internals of the class structure and language.  Other than that though, it seems alright!&lt;br /&gt;&lt;br /&gt;The AppEngine site says they'll add more languages and frameworks over time.  Seems like a no brainer that Ruby On Rails will be added, but no guarantees yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3048804525656565090?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3048804525656565090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3048804525656565090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3048804525656565090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3048804525656565090'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/05/google-releases-appengine.html' title='Google releases AppEngine'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5214605226615536783</id><published>2008-04-30T14:04:00.000-07:00</published><updated>2008-04-30T14:35:00.701-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><title type='text'>Urine to solve global food crisis</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://graphics8.nytimes.com/images/2008/04/30/business/30Fertilizer_slide_wide_thu.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://graphics8.nytimes.com/images/2008/04/30/business/30Fertilizer_slide_wide_thu.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;With food prices going through the roof, major media outlets are starting to write many articles trying to explain the impact and cause, including &lt;a href="http://www.nytimes.com/2008/04/30/business/worldbusiness/30fertilizer.html?ref=business"&gt;this one about low fertilizer production worldwide&lt;/a&gt;.  What is mentioned here is that production of Nitrogen-based fertilizers such as &lt;a href="http://en.wikipedia.org/wiki/Urea"&gt;Urea&lt;/a&gt; are the limiting factor, and that it may take some time before more natural gas fueled factories can produce the stuff.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Urea-3D-vdW.png/100px-Urea-3D-vdW.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 125px; height: 122px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Urea-3D-vdW.png/100px-Urea-3D-vdW.png" alt="" border="0" /&gt;&lt;/a&gt;What isn't mentioned is the basic chemistry behind all this.  First of all, Nitrogen is abundant in that it makes up 80% of the air in the atmosphere. Second, using a complex, fossil fueled, chemical plant is not the only way to convert inert gas Nitrogen found in the air into fertilizer.  In fact, every biological organism does this naturally &lt;span style="font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;–&lt;/span&gt; in the form of &lt;span style="font-style: italic;"&gt;urine&lt;/span&gt;.  It turns out that perhaps the most environmental way to produce more fertilizer would be to capture the urine naturally produced by the creatures living on Earth.  Sounds gross, but it might be the only way. &lt;a href="http://www.ecosanres.org/pdf_files/Fact_sheets/ESR6lowres.pdf"&gt;This article&lt;/a&gt; shows the difference a little urine can make with three specimens of corn fed differing amounts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5214605226615536783?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5214605226615536783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5214605226615536783' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5214605226615536783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5214605226615536783'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/04/urine-to-solve-global-food-crisis.html' title='Urine to solve global food crisis'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1095747030159133665</id><published>2008-04-28T15:58:00.000-07:00</published><updated>2008-11-22T13:00:26.586-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Twitter feelings visualizer</title><content type='html'>This visualization software that is pretty cool: &lt;a href="http://www.wefeelfine.org/wefeelfine_pc.html"&gt;We Feel Fine&lt;/a&gt;.  It lets you slice and dice twitter messages based on age, location, gender, feeling, and weather.&lt;br /&gt;&lt;br /&gt;Don't forget this classic twitter visualizer too: &lt;a href="http://twittervision.com/"&gt;Twittervision&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1095747030159133665?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1095747030159133665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1095747030159133665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1095747030159133665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1095747030159133665'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/04/twitter-feelings-visualizer.html' title='Twitter feelings visualizer'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8238984997112382876</id><published>2008-04-07T00:27:00.000-07:00</published><updated>2009-08-15T17:10:24.829-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='crypto'/><title type='text'>One line password sniffer</title><content type='html'>My wife asked me if I could help her update her website last night, only there was one problem -- she couldn't for the life of her remember the password she assigned to the FTP access...  Luckily the password was locked inside of Dreamweaver, so we could get at the files that way, but we needed to use it for more sophisticated access to get her new WordPress blog online.  Also, Dreamweaver was hiding the password with the classic "********" display (&lt;a href="http://l8rs.blogspot.com/2008/02/secret-password-ui-in-flash-and-osx.html"&gt;see previous post on how to obscure passwords in text boxes&lt;/a&gt;), so you could use it within Dreamweaver, but not export it beyond.  We needed to get that password!  Well, FTP happens to be the least secure protocol that remains popular on the net.  It is so bad, I would call it a "password broadcast" protocol.  Basically any password you type into a FTP client gets blabbed all over the web in the easiest to understand form.  &lt;br /&gt;&lt;br /&gt;Here is a one line command that will sniff FTP passwords as they come across the local network:&lt;pre&gt;sudo tcpdump -A -s 0 -i eth0 -l -e port ftp | grep -e "Welcome\|USER\|PASS"&lt;/pre&gt;&lt;br /&gt;To use this on OSX, just switch the &lt;b&gt;eth0&lt;/b&gt; interface above with &lt;b&gt;en1&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Here is the output as an unknowing user on a different machine on the LAN logs into ftp.kernel.org with their ultra-secret anonymous/secret user/pass pair...&lt;pre&gt;v......&amp;gt;220 Welcome to ftp.kernel.org.&lt;br /&gt;...ev...USER anonymous&lt;br /&gt;...xv./.PASS secret&lt;/pre&gt;&lt;br /&gt;So there are many lessons here:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;1) Don't use "good" passwords with FTP -- expect any FTP password to be compromised...&lt;br /&gt;&lt;li&gt;2) Use SSL whenever possible (it makes casual sniffing like this much harder)&lt;br /&gt;&lt;li&gt;3) Remember your passwords!  Well, this is a much bigger problem -- keychain software needs to get better and more popular.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So I ran the one line sniffer above on my machine, asked Dreamweaver to login to the site from her machine, and oula!  The password was revealed!  After all that, what was this impossible to crack password?  It turned out to be the classic "hand-off" password when you don't want to share your secrets with someone who is helping you -- it was the first name of the developer who last helped my wife upload her website. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8238984997112382876?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8238984997112382876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8238984997112382876' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8238984997112382876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8238984997112382876'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/04/one-line-password-sniffer.html' title='One line password sniffer'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5465022153460654736</id><published>2008-04-02T15:34:00.000-07:00</published><updated>2008-11-22T12:48:05.512-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>C Syntactic Surprises</title><content type='html'>I don't why, but I thought this was a cool, lesser know syntactic feature of C.  Basically, when statically allocating an array of structs, you can specify the offset with [offset] and the field with .field.  It makes sense and looks quite nice for allocating static configurations, but wouldn't have thought to try it without an example:&lt;br /&gt;&lt;pre&gt;/// Example of cool C syntax for statically populating sparse array of structs.&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;struct my_struct&lt;br /&gt;{&lt;br /&gt; unsigned field1;&lt;br /&gt; unsigned field2;&lt;br /&gt; unsigned field3;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static const struct my_struct my_array[] = {&lt;br /&gt; [3] = {&lt;br /&gt;  .field1  = 33,&lt;br /&gt; },&lt;br /&gt; [2] = {&lt;br /&gt;  .field1  = 25,&lt;br /&gt; },&lt;br /&gt; [4] = {&lt;br /&gt;  .field2  = 44,&lt;br /&gt;  .field3  = 45,&lt;br /&gt; },&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int main(int argc, char*argv[])&lt;br /&gt;{&lt;br /&gt;printf("Test: %d %d %d %d %d\n",&lt;br /&gt;  my_array[0].field1,&lt;br /&gt;  my_array[1].field1,&lt;br /&gt;  my_array[2].field1,&lt;br /&gt;  my_array[3].field1,&lt;br /&gt;  my_array[4].field1&lt;br /&gt;  );&lt;br /&gt;}&lt;br /&gt;&lt;/stdio.h&gt;&lt;/pre&gt;The now save the above as sparse_struct.c, and run the following to test it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;l8rs@l8rs [Wed Apr 02 15:32:02] ~/code/c&lt;br /&gt;$ gcc sparse_struct.c -o sparse_struct&lt;br /&gt;&lt;br /&gt;l8rs@l8rs [Wed Apr 02 15:39:03] ~/code/c&lt;br /&gt;$ sparse_struct&lt;br /&gt;Test: 0 0 25 33 0&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5465022153460654736?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5465022153460654736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5465022153460654736' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5465022153460654736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5465022153460654736'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/04/c-syntactic-suprises.html' title='C Syntactic Surprises'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-123302313856443702</id><published>2008-03-28T15:39:00.000-07:00</published><updated>2008-03-31T12:20:07.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypto'/><title type='text'>MD5 Cracked!</title><content type='html'>The much touted &lt;a href="http://en.wikipedia.org/wiki/MD5"&gt;MD5 cryptographic hash&lt;/a&gt; algorithm is not all it once was.  It was invented by RSA and has become the de facto standard for authenticating files such as software installer binaries, hashing user names for website back ends, and a wide number of other uses.  &lt;span style="font-style: italic;"&gt;Those glory days are officially over&lt;/span&gt;.  In 2005, an all female &lt;a href="http://www.infosec.sdu.edu.cn/uploadfile/papers/How%20to%20Break%20MD5%20and%20Other%20Hash%20Functions.pdf"&gt;team from China figured out a way to generate collisions in the MD5 hash space&lt;/a&gt;.  Now there are exploits readily available in the form of the &lt;a href="http://www.win.tue.nl/hashclash/"&gt;HashClash&lt;/a&gt; project, which have examples of conflicting documents that result in the same MD5 authentication hash.  Their two examples are &lt;a href="http://www.win.tue.nl/hashclash/Nostradamus/"&gt;stamped pdfs predicting the winner of the 2008 presidential election&lt;/a&gt; and &lt;a href="http://www.win.tue.nl/hashclash/SoftIntCodeSign/"&gt;paired HelloWorld/GoodbyeWorld executables that share the same MD5&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What's the problem exactly?  Think of a contract; you read and signed a copy you approved of.  Now imagine if someone showed up in court with your official signature on a totally different contract that they modified to their will.  That's the issue in a nutshell when a cryptographic hash is compromised.&lt;br /&gt;&lt;br /&gt;Another weakness of MD5 is that it is in such wide use, that Google searches for the hash can often tell you what the likely source document was.  For example, one story of &lt;a href="http://www.lightbluetouchpaper.org/2007/11/16/google-as-a-password-cracker/"&gt;a web developer who was hacked&lt;/a&gt; found the password of the hacker by simply searching Google, and figuring out his password was "&lt;a href="http://www.google.com/search?q=20f1aeb7819d7858684c898d1e98c1bb"&gt;Anthony&lt;/a&gt;".  Well, this weakness was mainly due to the developer not using a &lt;a href="http://en.wikipedia.org/wiki/Salt_%28cryptography%29"&gt;salt&lt;/a&gt;, but that's another story.  In short, Google is inadvertently acting as a huge, public &lt;a href="http://en.wikipedia.org/wiki/Rainbow_tables"&gt;rainbow table&lt;/a&gt; for reverse look-up of MD5 hash values.&lt;br /&gt;&lt;br /&gt;The solution?  Well, in the short term, use &lt;a href="http://en.wikipedia.org/wiki/SHA1"&gt;SHA1&lt;/a&gt;.  But it sounds like its time is limited...  Long term: contribute to the success of the &lt;a href="http://csrc.nist.gov/groups/ST/hash/documents/FR_Notice_Nov07.pdf"&gt;public development of SHA3&lt;/a&gt;.  The &lt;a href="http://csrc.nist.gov/groups/ST/hash/index.html"&gt;NIST&lt;/a&gt; is requesting that the public submit proposals for the new standard by Oct 2008 in a program that will emulate the development of &lt;a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"&gt;AES&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-123302313856443702?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/123302313856443702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=123302313856443702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/123302313856443702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/123302313856443702'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/md5-cracked.html' title='MD5 Cracked!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-44368780418758343</id><published>2008-03-28T15:22:00.000-07:00</published><updated>2008-11-22T12:48:22.255-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>Install new CPAN perl packages in 5 seconds</title><content type='html'>The &lt;a href="http://www.cpan.org/"&gt;CPAN&lt;/a&gt; repository is quite amazing, and need not be intimidating at all to leverage.  You can &lt;a href="http://search.cpan.org/"&gt;search&lt;/a&gt; for capabilities here:&lt;br /&gt;&lt;form method="get" action="http://search.cpan.org/search" name="f" class="searchbox"&gt;&lt;br /&gt;&lt;input name="query" value="" size="35" type="text"&gt;&lt;br /&gt;in &lt;select name="mode"&gt; &lt;option value="all"&gt;All&lt;/option&gt; &lt;option value="module"&gt;Modules&lt;/option&gt; &lt;option value="dist"&gt;Distributions&lt;/option&gt; &lt;option value="author"&gt;Authors&lt;/option&gt;&lt;/select&gt; &lt;input value="CPAN Search" type="submit"&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;For instance, the results for &lt;a href="http://search.cpan.org/search?query=Send+GMail&amp;amp;mode=all"&gt;"Send GMail"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then, once you determine the modules you need, all you have to do is run the following perl command line script to install them:&lt;br /&gt;&lt;pre&gt;perl -MCPAN -e "install Email::Send::Gmail"&lt;/pre&gt;Just replace Email::Send::Gmail with the exact package you need.  There is even a little shell utility for managing packages:&lt;br /&gt;&lt;pre&gt;perl -MCPAN -e "shell"&lt;/pre&gt;The way these commands work is by using the perl -M (use Module) and -e (execute) flags.  By simply including the CPAN module and running the shell and install commands it provides, you can install packages from the web with hardly any effort at all.&lt;br /&gt;&lt;br /&gt;Question is: does Ruby have an equivalent to CPAN?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-44368780418758343?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/44368780418758343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=44368780418758343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/44368780418758343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/44368780418758343'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/install-new-cpan-perl-packages-in-5.html' title='Install new CPAN perl packages in 5 seconds'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6100473850712952294</id><published>2008-03-19T11:04:00.000-07:00</published><updated>2008-11-22T13:00:03.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>Echo is your friend</title><content type='html'>Sometimes the simplest tools are easily overlooked.  I was adverse to vi for example for a very long time.  I thought every unix system would have emacs, and I can just use that.  But every system does not have emacs, and when you need to edit a file knowing the cryptic vi syntax is just critical.&lt;br /&gt;&lt;br /&gt;Likewise, our old friend echo is on every unix system, and it lets you generate STDIN streams easily by simply doing this: &lt;pre&gt;echo "my stream..." |&lt;/pre&gt; It's so basic, it can be deceiving; when was the last time anyone looked at the echo manual?  Well I saw some code that looked like this that made me wonder: &lt;pre&gt;(/bin/echo $2; /bin/echo $2) | &lt;/pre&gt;...  Clearly, this code is trying to generate a multiple line stream, but to do so it is calling echo once for each line...  Well, there is a better way!  Here are some examples that demonstrate almost every feature of echo (default, escaping, and suppress final newline).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;l8rs@l8rs [Wed Mar 19 11:03:47] ~&lt;br /&gt;$ echo "hi\nhow\nare\nyou"&lt;br /&gt;hi\nhow\nare\nyou&lt;br /&gt;&lt;br /&gt;l8rs@l8rs [Wed Mar 19 11:03:53] ~&lt;br /&gt;$  echo -e "hi\nhow\nare\nyou"&lt;br /&gt;hi&lt;br /&gt;how&lt;br /&gt;are&lt;br /&gt;you&lt;br /&gt;&lt;br /&gt;l8rs@l8rs [Wed Mar 19 11:03:56] ~&lt;br /&gt;$  echo -e -n "hi\nhow\nare\nyou"&lt;br /&gt;hi&lt;br /&gt;how&lt;br /&gt;are&lt;br /&gt;you&lt;br /&gt;l8rs@l8rs [Wed Mar 19 11:04:01] ~&lt;br /&gt;$&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6100473850712952294?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6100473850712952294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6100473850712952294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6100473850712952294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6100473850712952294'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/echo-is-your-friend.html' title='Echo is your friend'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-400606921280460155</id><published>2008-03-13T01:57:00.001-07:00</published><updated>2008-11-22T12:59:51.416-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Mono ported to the iphone</title><content type='html'>This is exciting: open source C# development coming soon to the iphone.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.sublimeintervention.com/archive/2008/Mar-13.html"&gt;http://blog.sublimeintervention.com/archive/2008/Mar-13.html&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-400606921280460155?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/400606921280460155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=400606921280460155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/400606921280460155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/400606921280460155'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/mono-ported-to-iphone.html' title='Mono ported to the iphone'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8767953091618065935</id><published>2008-03-10T00:41:00.000-07:00</published><updated>2008-04-07T19:36:48.536-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Aspen Simulator is very nice</title><content type='html'>So finally downloaded the iphone SDK after ~3 days due to our crawling snail DSL.  It's pretty cool, albeit not so well documented with regard to where things are.  There are actually very few references to an iphone in the SDK, and the platform is actually called "Aspen".  I guess this makes sense, since rather than saying you are developing for MacBook Pro, and Air, and all the folks that upgraded, you simply say Leopard (or OSX 10.5).  Anyway, I found perhaps the most critical app in the SDK, the iphone simulator here:&lt;br /&gt;&lt;br /&gt;/Developer/Platforms/AspenSimulator.platform/Developer/Applications/Aspen Simulator.app&lt;br /&gt;&lt;br /&gt;And there seems to be no iphone example apps that get installed with the SDK?  I found this surprising, but they are easy enough to download from this page:&lt;br /&gt;&lt;a href="http://developer.apple.com/iphone/samples"&gt;&lt;br /&gt;http://developer.apple.com/iphone/samples&lt;/a&gt;&lt;br /&gt;So after downloading one of the samples called FingerSketch, unzipping it, double-clicking on the project file FingerSketch.xcodeproj, and hitting "Build and Go", the Aspen simulator automatically came up and oula!&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_mb5txD4vOHA/R9TrigM_AFI/AAAAAAAAAFs/fnWmZpfIUkA/s400/Picture+1.jpg" alt="" id="BLOGGER_PHOTO_ID_5176020849748017234" border="0" /&gt;&lt;br /&gt;Pretty sweet.  That's not a photo of my screen with my iphone laying on top, that's the simulator!  I would imagine running the other examples will be just as easy, and there seems to be quite a few good ones on the apple dev site.  Fun Fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8767953091618065935?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8767953091618065935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8767953091618065935' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8767953091618065935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8767953091618065935'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/aspen-simulator-is-very-nice.html' title='Aspen Simulator is very nice'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mb5txD4vOHA/R9TrigM_AFI/AAAAAAAAAFs/fnWmZpfIUkA/s72-c/Picture+1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2805967897685547238</id><published>2008-03-07T12:32:00.000-08:00</published><updated>2008-03-31T12:21:15.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Apple releases iphone SDK</title><content type='html'>True to his word, Steve Jobs and company &lt;a href="http://www.engadget.com/2008/03/06/live-from-apples-iphone-press-conference/"&gt;revealed the iphone SDK&lt;/a&gt; yesterday.  It looks awesome.  It has full support for tethered debugging, wireless deployment, and even a slick simulator.  It's XCode based, so it will likely only run on a Mac.  Required for touchpad sim: Multi-touch Mac Pro or Air.&lt;br /&gt;&lt;br /&gt;For $99 (one time fee, unlimited apps?) you can list your app in the store.   Free apps are free.  Commercial apps 70% of the royalties go to the developer, and Apple keeps 30% for the store overhead and hosting.  Apple said they would distribute anything except porn, malicious apps, sim unlocks, Skype-like VoIP via cell network (wifi ok), ...  It isn't clear whether daemons are in or out -- something that pings the internet regularily like an RSS reader.  Hopefully that will pass muster.&lt;br /&gt;&lt;br /&gt;They showed some demos from some really excited game developers too.  All the games had accelerometer controls.   Cool, except that I'm still downloading it -- need to upgrade this dusty old DSL!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2805967897685547238?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2805967897685547238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2805967897685547238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2805967897685547238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2805967897685547238'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/03/apple-releases-iphone-sdk.html' title='Apple releases iphone SDK'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8597890673270432225</id><published>2008-02-19T01:01:00.000-08:00</published><updated>2008-02-19T11:50:37.907-08:00</updated><title type='text'>Hot or Not cashing in their fish</title><content type='html'>&lt;a href="http://hotornot.com/"&gt;HotOrNot.com&lt;/a&gt; is a web site that some UCB classmates of mine, &lt;a href="http://blog.jhong.org/2008/02/so-long-hotornot-and-thanks-for-all.html"&gt;James Hong&lt;/a&gt; and Jim, founded after college.  It did quite well, and was fairly cash rich wrt monthly revenue from their meetmeat service.   Anyway, &lt;a href="http://www.techcrunch.com/2008/02/11/hotornot-apparently-very-hot-acquired-for-20-million/"&gt;Tech Crunch&lt;/a&gt; reported that HotOrNot sold last week for a purported $20 million (exact dollar amount contested.)  It appears that there was an interesting attempt to shift to a &lt;a href="http://www.techcrunch.com/2007/05/08/hot-or-not-tears-itself-apart-reinvents/"&gt;failed free revenue model&lt;/a&gt; 6 months before the sale.  The story of HotOrNot is  definitely inspirational for internet entrepreneurs.  The site made insane cash at various times from monthly subscriptions, google ad words, and virtual gift fees.&lt;br /&gt;&lt;br /&gt;This company is actually part of the short-list of Berkeley start-ups.  The classic comparison is always that Stanford grads created Yahoo and Google, and Berkeley grads created Inktomi and HotOrNot?!  One other bit that was nice about HotOrNot was that my favorite Berkeley professor, the late Dean &lt;a href="http://www.eecs.berkeley.edu/%7Enewton/"&gt;A. Richard Newton&lt;/a&gt;, helped influence the founders with his inspiration and vision.  One of his quotes was that "people are the killer app" -- totally predicting of all this Web 2.0 social application hubbub.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8597890673270432225?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8597890673270432225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8597890673270432225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8597890673270432225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8597890673270432225'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/02/hot-or-not-sold.html' title='Hot or Not cashing in their fish'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6186200239034391989</id><published>2008-02-15T22:55:00.000-08:00</published><updated>2008-11-22T12:50:31.027-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Femtocells -- your own private cell tower</title><content type='html'>I'm a big fan of the &lt;a href="http://www.economist.com/"&gt;Economist&lt;/a&gt; magazine.  I generally read it, figure others are reading it too, and think they provide excellent coverage of topics I've otherwise heard about in some form or another.  But this week's issue, Feb 16th, snuck a short article in the business section about a revolutionary product that blew me away.  The disruptive technology is called a &lt;a href="http://en.wikipedia.org/wiki/Femtocell"&gt;Femtocell&lt;/a&gt;, and it is essentially like a home WiFi access point for your cell phone.  This idea is so cool!  Supposedly the device costs about $200, and your phone will link to it rather than the local cell tower.  The phone companies of course want to maintain control and charge folks a monthly for the service, but I just can't help to think that a Femtocell could be used to convert your existing mobile into a free VOIP (voice-over-internet-protocol) phone while you're in your home.  The future will rock!  If anyone knows where to get a GSM Femtocell for $200, please comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6186200239034391989?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6186200239034391989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6186200239034391989' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6186200239034391989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6186200239034391989'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/02/femtocells-your-own-private-cell-tower.html' title='Femtocells -- your own private cell tower'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-6622845037888774122</id><published>2008-02-12T17:13:00.001-08:00</published><updated>2008-03-31T12:34:09.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crypto'/><title type='text'>Secret Password UI in Flash and OSX</title><content type='html'>Some platforms make things easy for the programmer with handy one-liners.  The featured one liner for today is how to magically make a text entry box handle secret stuff like passwords by auto-converting the input into asterisks -- Enter Password:  *****&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Flash&lt;/span&gt; - Here's how to do it in ActionScript mxml (Adobe Flex Builder 2 version):&lt;br /&gt;&lt;br /&gt;&lt;pre style="" width="200"&gt;&amp;lt;mx:textinput id="userPasswordEntry"&lt;br /&gt;displayaspassword="true" height="25" \&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Obj-C&lt;/span&gt; - And here's how to do it on Mac OSX or an iphone:&lt;br /&gt;&lt;br /&gt;&lt;pre style="" width="200"&gt;UITextField *textField = [[UITextField alloc]&lt;br /&gt;initWithFrame:rect];&lt;br /&gt;[textField setSecure:YES];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;or:&lt;br /&gt;&lt;br /&gt;&lt;pre style="" width="200"&gt;UIPreferencesTextTableCell *passwordCell =&lt;br /&gt;[[UIPreferencesTextTableCell alloc]&lt;br /&gt;initWithFrame:CGRectMake(0.0f, 44.0f, 100.0f, 44.0f)];&lt;br /&gt;[passwordCell setTitle:@"Password"];&lt;br /&gt;[[passwordCell textField] setSecure:YES];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C#&lt;/span&gt; - For Windows platforms, here's the drill:&lt;br /&gt;&lt;br /&gt;&lt;pre style="" width="200"&gt;TextBox tbox = new TextBox();&lt;br /&gt;tbox.UseSystemPasswordChar = true;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-6622845037888774122?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/6622845037888774122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=6622845037888774122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6622845037888774122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/6622845037888774122'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/02/secret-password-ui-in-flash-and-osx.html' title='Secret Password UI in Flash and OSX'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2228853701441431349</id><published>2008-01-28T14:38:00.001-08:00</published><updated>2010-02-12T11:18:33.775-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='gps'/><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>GPS Satellite Map</title><content type='html'>The image below shows the current location of all GPS Satellites.  The information is out there, just need to know where to find it...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nstb.tc.faa.gov/incoming/waas_sats.png"&gt;&lt;img src="http://www.nstb.tc.faa.gov/incoming/waas_sats.png" height="600" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some other good GPS links follow:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.edu-observatory.org/gps/tracking.html"&gt;Observatory GPS Links&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.navtechgps.com/Extra/12_links.asp"&gt;Navtech GPS links&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://celestrak.com/NORAD/elements/"&gt;Celestrak&lt;/a&gt; &lt;a href="http://celestrak.com/NORAD/elements/supplemental/gps.txt"&gt;current GPS satellite locations&lt;/a&gt; in &lt;a href="http://celestrak.com/NORAD/documentation/tle-fmt.asp"&gt;NORAD format&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.n2yo.com/index.php?k=20"&gt;N2Yo GPS Satellites in your area -- Google Map Mash-up&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kowoma.de/en/gps/data_composition.htm#"&gt;GPS Data Packet Breakdown&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Books:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.navcen.uscg.gov/pubs/gps/sigspec/default.htm"&gt;Original GPS Specification&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Hey, this may be everything you need to roll your own &lt;a href="http://en.wikipedia.org/wiki/A-GPS"&gt;A-GPS&lt;/a&gt; server...  Deriving near-real-time&lt;a href="http://en.wikipedia.org/wiki/L2C"&gt; almanac&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Ephemeris"&gt;ephemeris&lt;/a&gt; data from these sources should be possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2228853701441431349?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2228853701441431349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2228853701441431349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2228853701441431349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2228853701441431349'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/01/gps-sattelite-map.html' title='GPS Satellite Map'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2385556646146488327</id><published>2008-01-19T21:18:00.000-08:00</published><updated>2008-11-22T12:48:50.296-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>perl chomp</title><content type='html'>I often do google searches to look for code samples to solve "classic" problems.  After figuring out the problem, I often imagine archiving the results for all to benefit from.  Perhaps I will generate such a well-organized coding reference library someday, but for now, I want to document one of the most basic of perl hints: how to quickly parse a perl system call using backticks that returns a single line of data.  This is one of the most fundamental of problems.  You have some command line call that you know returns exactly one line of data, and you want to parse that.  Easy, just call it using the slick perl backticks capability and assign it to a variable:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Get line count of a file named README.txt using the wc (word count) UNIX command.&lt;br /&gt;$line_cnt = `wc -l README.txt`;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The only problem is that once you want to do a match on the result, you'll realize you have a silly newline character messing you up!  So this is where chomp comes in.  It will strip this newline character without a fuss.  You just need to know whether you are on a Windows or Unix system, and define what your newline character sequence is: \n or \r\n...  Chomp will only remove the last character if it is the newline character, unlike chop which will remove the last character no matter what it is.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Use substitute to strip out all but the line count from the output&lt;br /&gt;$line_cnt =~ s/(.*)[ ].*/$1/;&lt;br /&gt;&lt;br /&gt;# Strip the pesky newline that remains.&lt;br /&gt;chomp($line_cnt);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now $line_cnt is just what you want -- a perl variant that contains nothing but the number of lines in the file that can be treated as a string or integer as you need.  It takes three lines of code to do it, but I'd argue that is still way less in Perl than in Java, or C++, or just about anything else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2385556646146488327?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2385556646146488327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2385556646146488327' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2385556646146488327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2385556646146488327'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/01/perl-chomp.html' title='perl chomp'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-8439117598670279550</id><published>2008-01-13T21:00:00.000-08:00</published><updated>2008-12-30T19:23:47.305-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>Polish -- language of the future</title><content type='html'>I have a fond place in my heart for Polish, the only other language I know besides English.  It has always been difficult to find fellow speakers my age here on the west coast, but apparently Polish is making an impact on the internet.  On &lt;a href="http://wikipedia.org"&gt;Wikipedia&lt;/a&gt;, it has the fourth most articles ahead of Japanese, Italian, and even Spanish!  (Why Chinese doesn't make it into the top 10 is a bit of a mystery...)  In some ways this makes sense to me because I always found it a very precise language -- all words are phonetically written, and the grammatical context of each word is encoded into the endings (for nouns as well as verbs.)  So for linguists and computer scientist that want to attack the problem of natural language processing Polish would seem like a nice place to start.  And with 50,000,000 native speakers (twice population of Australia) it has a reasonable case for staying relevant.  So what's the catch?  Well the casual listener of spoken Polish will note the insane number of consonant slurs.  It makes for challenging pronunciation.  For example, here is a popular children's nursery rhyme about a train:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CnjaEluJOHs&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CnjaEluJOHs&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;And this video is an entertaining case study of reading a few popular Polish tongue twisters:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0nN7f9yDE7o&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0nN7f9yDE7o&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-8439117598670279550?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/8439117598670279550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=8439117598670279550' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8439117598670279550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/8439117598670279550'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/01/polish-language-of-future.html' title='Polish -- language of the future'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-9030881889466270743</id><published>2008-01-11T14:21:00.000-08:00</published><updated>2008-11-22T12:59:02.272-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><title type='text'>Can someone say "Recycle -&gt;&lt;-"?</title><content type='html'>&lt;p&gt;A &lt;a href="http://www.nytimes.com/2008/01/09/business/worldbusiness/09cnd-yuan.html?_r=1&amp;amp;ref=business&amp;amp;oref=slogin"&gt;new york times article on China&lt;/a&gt; oil consumption reports that the country uses 3 *billion* with a "B" plastic bags a day!!&lt;br /&gt;&lt;/p&gt;&lt;p  style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;On Tuesday, the State Council banned production of ultra-thin plastic bags and required store owners to charge customers for thicker plastic bags. The new initiative is intended to not only fight littering but also reduce oil usage. Chinese media has reported that China uses roughly three billion plastic bags every day. To create this many bags, China must refine 37 million barrels of crude oil every year, according to the Web site of China Trade News.&lt;/span&gt;&lt;/p&gt;&lt;p  style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;“Our country consumes a large amount of plastic bags,” stated a circular posted Tuesday on the central government’s main Web site. “While convenient for consumers, the bags also lead to a severe waste of resources and environmental pollution.”&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-9030881889466270743?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/9030881889466270743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=9030881889466270743' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9030881889466270743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9030881889466270743'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2008/01/can-someone-say-recycle.html' title='Can someone say &quot;Recycle -&gt;&lt;-&quot;?'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1858011922214550304</id><published>2007-12-28T16:34:00.001-08:00</published><updated>2008-11-22T12:51:33.914-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Canon 400D vs. Nikon 40D</title><content type='html'>I wanted to do the head-to-head with a Nikon 40DX, but they didn't have any in stock.  These shots were all done with exactly the same lens: Sigma 50-200mm f/2.8 on a partly cloudy Berkeley day.  The indoor shots are at Sarber's camera -- photos of David Sarber himself!&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Subject&lt;/th&gt;&lt;th&gt;Canon 400d (Rebel XTi)&lt;/th&gt;&lt;th&gt;Nikon D40&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Pharmacia Building&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917022-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917022-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917155-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917155-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Remax Building&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917419-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917419-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917550-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917550-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Mr. Sarber - Auto&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917808-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917808-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236917925-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236917925-S.jpg" width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Mr. Sarber - No Flash&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236918513-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236918513-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236918617-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236918617-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Mr. Sarber - Portrait&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236918861-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236918861-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236918971-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236918971-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Tree&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236919151-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236919151-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://bustopher.smugmug.com/gallery/4068163#236919272-L-LB"&gt;&lt;img src="http://bustopher.smugmug.com/photos/236919272-S.jpg"  width=150 height=100 /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1858011922214550304?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1858011922214550304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1858011922214550304' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1858011922214550304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1858011922214550304'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/12/canon-400d-vs-nikon-40d.html' title='Canon 400D vs. Nikon 40D'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1124806918154614795</id><published>2007-12-21T22:54:00.000-08:00</published><updated>2008-11-22T12:51:47.692-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Entering the digital SLR realm</title><content type='html'>&lt;p&gt;In the tradition of my brother, who likes to hail new technology deals over big family events, I'm leaving the birth announcement to my wife's blog, and will discuss our new digital SLR camera here.  My wife made me promise we would get a "nice" camera as soon as we had a baby, and true to that promise, we now own a Canon Rebel XTi (400D) with some nice glass.  Deciding on the body was not easy!  This post attempts to outline how the decision was made, and the many dilemmas involved along the way.&lt;br /&gt;&lt;br /&gt;The first tough choice was Canon vs. Nikon. ... ...  This is a big choice, because once you enter into one of these vendors, you are pretty much committed since all your lenses will only fit bodies by the same vendor.  So here is the pros / cons list as far as I can tell:&lt;/p&gt;&lt;table border="1" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;br /&gt;&lt;/th&gt;&lt;th&gt;Canon XTi&lt;/th&gt;&lt;th&gt;Nikon D40&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Lens&lt;/td&gt;&lt;td&gt;More flexibility -- lenses work all the way up to 5D and beyond&lt;/td&gt;&lt;td&gt;Fewer -- AF lenses only&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Auto Focus Points&lt;/td&gt;&lt;td&gt;More (9)&lt;/td&gt;&lt;td&gt;Fewer (3)&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Metering&lt;/td&gt;&lt;td&gt;Defaults are not so good&lt;/td&gt;&lt;td&gt;Brilliant colors with minimal effort&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;ISO&lt;/td&gt;&lt;td&gt;1600 max&lt;/td&gt;&lt;td&gt;3200 max&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Pix&lt;/td&gt;&lt;td&gt;10 meg pix&lt;/td&gt;&lt;td&gt;6 meg pix -- but better light capture per pixel&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Hand Feel&lt;/td&gt;&lt;td&gt;Thin rail&lt;/td&gt;&lt;td&gt;Smaller, yet feels better&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.dalsa.com/markets/ccd_vs_cmos.asp"&gt;Sensor&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Canon CMOS - self-cleaning&lt;/td&gt;&lt;td&gt;Sony CCD (better?)&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://kammagamma.com/articles/noise-analysis-db.php?camera1=10&amp;amp;camera2=14"&gt;Noise&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.imaging-resource.com/PRODS/XTI/XTIA.HTM"&gt;Chroma noise&lt;/a&gt; (random colors)&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://kammagamma.com/articles/canon-eos-400d-vs-nikon-d80-studio-scene-high-iso.php"&gt;Luma noise&lt;/a&gt; (illumination sharpness)&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Reference&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.cindyli.com/index.php/site/comments/why_i_love_my_canon_rebel_xti400d_even_after_over_a_year/"&gt;Cindy Li&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.kenrockwell.com/tech/d200-d80-d70-d50-d40-5d-xti.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I've been really debating between these two for awhile, and finally chose the Canon, mainly because it had more auto-focus points.  I was advised that good lenses makes more of a difference.  So here are the len choices:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.shutterbug.net/test_reports/0804sb_tamron/index.html"&gt;Tamron 17-35mm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tamron.com/lenses/prod/28300_vc.asp"&gt;Tamron 28-300mm with VC (vibration compensation)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So the verdict: underwhelmed....  The Canon XTi just doesn't generate the kind of brilliant colors I was hoping for.  I only have the second lens so far, and that seems pretty good, but the body / sensor isn't performing to my expectations in outdoor, sunlit, or full flash situations.&lt;br /&gt;&lt;br /&gt;RESOURCES:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.imaging-resource.com/IMCOMP/COMPS01.HTM"&gt;Comparison Photos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://photography-on-the.net/forum/showthread.php?p=4565572"&gt;Photo Net Forum&lt;/a&gt;&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/21430394-1124806918154614795?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1124806918154614795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1124806918154614795' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1124806918154614795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1124806918154614795'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/12/entering-digital-slr-realm.html' title='Entering the digital SLR realm'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5873712330576298482</id><published>2007-12-04T22:07:00.000-08:00</published><updated>2008-03-31T12:22:46.845-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone tools up and running!</title><content type='html'>So I finally have the iPhone tools up and running in Cygwin.  Most of the delay was caused by bad symbolic links in the file system...  It seems Mac OS X and Linux / Cygwin treat these slightly differently.  Anyway, I compiled and modified the HelloWorld app, uploaded it, and have it running on the device from an icon on the main screen.  Exciting!  The only buzz-kill is that the apps are not written in C++, they are all in &lt;a href="http://objc.toodarkpark.net/"&gt;Objective-C&lt;/a&gt;.  The language is a classic pre-compiler throw back to other now dead or near dead CS languages that I am so familiar with such as GOC (Geoworks) and nesC (TinyOS).  All three share similar keyword escaping like @class or @implementation.  I like the efficient addition of object oriented syntax that Obj-C introduces: static methods, local methods, and garbage collection.  I don't like the TCL-TK like syntax for method calls: [obj method alias1:param1 alias2:param2].  One nice fall back is that you can &lt;a href="http://macresearch.org/objective_c_for_objective_c_programmers"&gt;mix C++ and Objective-C&lt;/a&gt;, so back-end calculations can be in a more "portable" language.  Perhaps I can integrate my C++ statistics package into some handy iPhone app.&lt;br /&gt;&lt;br /&gt;Anyway, the big challange now is not the language itself, but learning all the libraries -- specifically &lt;a href="http://www.cocoadev.com/index.pl?UIKit"&gt;UIKit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5873712330576298482?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5873712330576298482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5873712330576298482' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5873712330576298482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5873712330576298482'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/12/iphone-tools-up-and-running.html' title='iPhone tools up and running!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1713663952777276226</id><published>2007-11-28T23:53:00.000-08:00</published><updated>2008-11-22T12:58:42.378-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Google Android sounds interesting</title><content type='html'>&lt;center&gt;&lt;object width="425" height="355"&gt;&lt;br /&gt;&lt;param name="movie" value="http://www.youtube.com/v/1FJHYqE0RDg&amp;#038;rel=0&amp;#038;border=0"&gt;&lt;/param&gt;&lt;br /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1FJHYqE0RDg&amp;#038;rel=0&amp;#038;border=0" type="application/x-shockwave-flash" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;I like the idea of a 3d engine that ports to any phone platform.  Too bad Apple didn't sign on...  I just got the iphone tools up and running!  Ugh.  Already two dominant platforms to develop apps in before anything is even written yet!  &lt;a href="http://code.google.com/android/"&gt;Android home&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1713663952777276226?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1713663952777276226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1713663952777276226' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1713663952777276226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1713663952777276226'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/11/google-android-sounds-interesting.html' title='Google Android sounds interesting'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4713360469494541331</id><published>2007-11-11T07:54:00.000-08:00</published><updated>2008-11-22T12:52:33.631-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><title type='text'>Oil Spill in the Bay?!?</title><content type='html'>Breaking news that a  tanker clipped the Bay Bridge, and &lt;a href="http://news.yahoo.com/s/ap/20071111/ap_on_re_us/bay_spill;_ylt=AsDKLHhPx2GvHbiiHSyEf_es0NUE"&gt;58,000 gallons of shipping oil spilled into the center of the bay&lt;/a&gt;.  Apparently this happened on Wednesday, but news is coming out on it only today.  This is horrible, yet strange that nothing like this as happened before.  Hopefully the amount isn't very much, and the clean up efforts will be successful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-4713360469494541331?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4713360469494541331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4713360469494541331' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4713360469494541331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4713360469494541331'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/11/oil-spill-in-bay.html' title='Oil Spill in the Bay?!?'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7459494895657731183</id><published>2007-11-06T06:21:00.000-08:00</published><updated>2008-03-31T12:35:42.681-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Zipline makes Maki</title><content type='html'>Zipline is releasing a new &lt;a href="http://songfight.org/"&gt;SongFight&lt;/a&gt; single -- Maki.  Check it out!&lt;br /&gt;&lt;br /&gt;Some lyrical outtakes:&lt;br /&gt;"Maki meets a mochi ... takes a Pocky for a walk ...&lt;br /&gt;Godzilla does a ... moonwalk ... talks to Chewbacca ...&lt;br /&gt;There's a danger to blowfish.  For those that are brave enough to taste it.&lt;br /&gt;..."&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://songfight.org/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_mb5txD4vOHA/RzB5H-uUuvI/AAAAAAAAAFM/WguAX6QFEkM/s400/bdd_Chewbacca.jpg" alt="" id="BLOGGER_PHOTO_ID_5129733153578334962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Note: sometimes it takes a few days for the new song to post.  Also, may the best song win -- vote for the one you like, not necessarily just Zipline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7459494895657731183?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7459494895657731183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7459494895657731183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7459494895657731183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7459494895657731183'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/11/zipline-makes-maki.html' title='Zipline makes Maki'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mb5txD4vOHA/RzB5H-uUuvI/AAAAAAAAAFM/WguAX6QFEkM/s72-c/bdd_Chewbacca.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-3352489191385784675</id><published>2007-10-17T18:39:00.000-07:00</published><updated>2008-03-31T12:23:17.501-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Apple announces plans to release iPhone SDK</title><content type='html'>Yay!  &lt;a href="http://www.scripting.com/stories/2007/10/17/applesIphoneSdkAnnouncemen.html"&gt;Apple announced that it will officially allow native 3rd-party apps &lt;/a&gt;to be developed and distributed on the iPhone.  The SDK is scheduled to be released in February.  In the mean-time early work using the available Google SDK for 1.0.2 should help speed along the quality of "official" apps.  All is good.  By this time next year you'll be downloading apps to your iPod touch via iTunes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-3352489191385784675?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/3352489191385784675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=3352489191385784675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3352489191385784675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/3352489191385784675'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/10/apple-announces-plans-to-release-iphone.html' title='Apple announces plans to release iPhone SDK'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1107702254224494571</id><published>2007-10-12T02:06:00.000-07:00</published><updated>2008-03-31T12:35:10.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>In Rainbows</title><content type='html'>Don't forget to download Radiohead's new album, &lt;a href="http://www.inrainbows.com/"&gt;In Rainbows&lt;/a&gt;.  It's only available on their site -- you pick the price!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.inrainbows.com/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_mb5txD4vOHA/Rw867Rwc8lI/AAAAAAAAAEo/8BwAj4KIGe8/s200/nradio.jpg" alt="" id="BLOGGER_PHOTO_ID_5120376091396862546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mb5txD4vOHA/Rw86IBwc8hI/AAAAAAAAAEI/FyaHrRMV48k/s1600-h/2007-10-06T201148Z_01_NOOTR_RTRIDSP_2_TECH-RADIOHEAD-DC.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_mb5txD4vOHA/Rw86IBwc8hI/AAAAAAAAAEI/FyaHrRMV48k/s320/2007-10-06T201148Z_01_NOOTR_RTRIDSP_2_TECH-RADIOHEAD-DC.jpg" alt="" id="BLOGGER_PHOTO_ID_5120375210928566802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://onrainbows.com/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1107702254224494571?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1107702254224494571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1107702254224494571' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1107702254224494571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1107702254224494571'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/10/in-rainbows.html' title='In Rainbows'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mb5txD4vOHA/Rw867Rwc8lI/AAAAAAAAAEo/8BwAj4KIGe8/s72-c/nradio.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2135340181705189108</id><published>2007-10-06T23:12:00.001-07:00</published><updated>2008-12-30T20:29:20.071-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Pipes @ Yahoo</title><content type='html'>Web 2.0 is in full effect, and the latest tip from a friend is the visual programming tools for generating quick mashups provided at &lt;a href="http://pipes.yahoo.com"&gt;pipes.yahoo.com&lt;/a&gt;.  Pretty cool!  My first pipe: the &lt;a href="http://pipes.yahoo.com/pipes/pipe.run?_id=jI67vjhy3BGzzMdx9YS63A"&gt;Skyrocket&lt;/a&gt; store application.  It takes &lt;a href="http://pitchforkmedia.com"&gt;pitchforkmedia&lt;/a&gt; suggestions and links them to the amazon store.  Buy buy buy!&lt;br /&gt;&lt;br /&gt;&lt;div style="background:#F0F0F0; font-family: Arial"&gt;&lt;br /&gt;&lt;iframe src="http://pipes.yahoo.com/pipes/pipe.run?_id=jI67vjhy3BGzzMdx9YS63A" width=100% height=600&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2135340181705189108?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2135340181705189108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2135340181705189108' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2135340181705189108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2135340181705189108'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/10/pipes-yahoo.html' title='Pipes @ Yahoo'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-57357793258521684</id><published>2007-09-26T23:27:00.000-07:00</published><updated>2008-11-22T12:57:47.384-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>iPhone toolchain, brick threat, and other fun</title><content type='html'>The fast-track to compiling your own &lt;a href="http://code.google.com/p/iphone-dev/wiki/Building"&gt;iPhone toolchain is available at google code&lt;/a&gt;.  Thanks google!  This more than makes up for not indexing me. :)  Please comment with any good app ideas -- they may just get implemented in a late night hacking session. &lt;br /&gt;&lt;br /&gt;The threat to all this euphoria is of course that &lt;a href="http://arstechnica.com/news.ars/post/20070919-apples-fight-against-iphone-unlocks-may-result-in-expensive-bricks.html"&gt;Apple could introduce digital signing of binaries&lt;/a&gt; in a future update to iTunes and brick all iPhones that have been modified to run 3rdparty software or SIM unlocked.&lt;br /&gt;&lt;br /&gt;Though they may have some legal right to do this wrt their support agreement, why would they?  It sounds expensive to me having tons of people making a fuss in the Apple stores. &lt;br /&gt;&lt;br /&gt;These things are really nothing more than mini-unix boxes running on a 600MHz ARM.  It is so sweet to be able to ssh over WiFi into your iPhone and check out all the files. &lt;br /&gt;Why wouldn't they provide a basic means to restore your iPhone back to the factory defaults?  I just don't think brick is in the cards for iPhone hackers.&lt;br /&gt;&lt;br /&gt;On a side-note -- the ARM core that the iPhone uses is &lt;a href="http://www.arm.com/products/esd/jazelle_home.html"&gt;Jazelle&lt;/a&gt; capable.  This means it has &lt;span style="font-style: italic;"&gt;native support for running java&lt;/span&gt; byte codes!  Now the iPhone does not currently ship with a JVM, but in theory one could be written that exploits this native hardware support.  What I really want is a Flash player...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-57357793258521684?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/57357793258521684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=57357793258521684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/57357793258521684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/57357793258521684'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/09/iphone-toolchain-brick-threat-and-other.html' title='iPhone toolchain, brick threat, and other fun'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-168595041668802526</id><published>2007-09-21T09:11:00.000-07:00</published><updated>2008-03-31T12:24:06.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>OMG iPhone application installer!!!</title><content type='html'>The iPhone crackerz have been working overtime!  You can now fully pimp out your iPhone with tons of applications by simply downloading the Nullriver installer from &lt;a href="http://iphone.nullriver.com/beta/"&gt;here&lt;/a&gt;.  Apple is probably going to add digital signing of binaries in an iTunes release soon to shut this all down, but in the meantime, don't let your iPhone remain "lame" with only the default applications.  The installer gives you a dynamic client similar to most Linux releases, where you can query a list of live apps over the web, and choose to download/upgrade them right to your device.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lifehacker.com/software/hack-attack/install-third+party-applications-on-your-iphone-295985.php"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_mb5txD4vOHA/RvQX6IeqqHI/AAAAAAAAAD4/LoEsZT3b0Is/s400/iphone-apps-head.jpg" alt="" id="BLOGGER_PHOTO_ID_5112737764448315506" border="0" /&gt;&lt;/a&gt;Must haves:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NES emulator&lt;/li&gt;&lt;li&gt;ssh/telnet client!&lt;/li&gt;&lt;li&gt;Navizon GPS location using WiFi and cell phone triangulation&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lifehacker.com/software/hack-attack/install-third+party-applications-on-your-iphone-295985.php"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-168595041668802526?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/168595041668802526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=168595041668802526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/168595041668802526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/168595041668802526'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/09/omg-iphone-application-installer.html' title='OMG iPhone application installer!!!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mb5txD4vOHA/RvQX6IeqqHI/AAAAAAAAAD4/LoEsZT3b0Is/s72-c/iphone-apps-head.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-4083921477505517380</id><published>2007-09-15T12:24:00.000-07:00</published><updated>2007-09-15T12:28:10.096-07:00</updated><title type='text'>Map Mashups</title><content type='html'>Map Mashups are sort of old news by now, but they are still really cool!!  Here are some of the better ones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.panoramio.com/"&gt;Panoramio&lt;/a&gt;: Photos all over the world&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windermere.com/index.cfm?fuseaction=listing.SearchPropertyMapv3"&gt;Widermere&lt;/a&gt;: Real estate all over the US&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.housingmaps.com/"&gt;Housing Maps&lt;/a&gt;: Find rentals from craigslist&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/21430394-4083921477505517380?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/4083921477505517380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=4083921477505517380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4083921477505517380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/4083921477505517380'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/09/map-mashups.html' title='Map Mashups'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7272185979178447157</id><published>2007-09-05T13:03:00.000-07:00</published><updated>2008-11-22T12:53:26.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone price cut</title><content type='html'>Apple just &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;taxonomyName=mobile_devices&amp;amp;articleId=9034492&amp;taxonomyId=75&amp;amp;intsrc=kc_top"&gt;slashed the price of the iPhone&lt;/a&gt; by 33%!  The 8GB iPhone is now $399.&lt;br /&gt;&lt;br /&gt;They also released a bunch of new iPods that look like the iPhone and even have WiFi.&lt;br /&gt;&lt;br /&gt;They're going to sell a lot of these for sure.  What's rough is that it's only been out for 2 months, so early adopters got stiffed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7272185979178447157?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7272185979178447157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7272185979178447157' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7272185979178447157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7272185979178447157'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/09/iphone-price-cut.html' title='iPhone price cut'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1296747156267180195</id><published>2007-08-15T01:33:00.001-07:00</published><updated>2007-08-15T01:47:24.963-07:00</updated><title type='text'>Ginormous Etymology</title><content type='html'>Ever notice people you know starting to talk like you?  I never know whether to feel honored, or guilty for lowering the standards of those around me.  This came up recently with the word GINORMOUS.  I'm pretty sure I invented this word in the early 80s as an aspiring skater teen in the Bay Area.  It was typically used for the size of "air" we'd get off of home-made launch ramps made from recycled Track Housing ply before Home Depot existed.  I continue to use it to this day in my mid-thirties, and had a recent uptick of usage in the past few months -- so much so that I was starting to get self-conscious about it, and made a concerted effort to select more "mature" words instead.  Just when I parred down my use, I noticed my wife and good friends started using the word -- almost as if they were filling the void left behind from my denial of this retro-skater flashback.  As recently as two weeks ago, it was even added to the &lt;a href="http://www.m-w.com/info/newwords07.htm"&gt;Merriam-Webster&lt;/a&gt; dictionary!  So I just wanted to say that GINORMOUS is not only an awesome word that is descriptive, fun, and useful (and goes really well with IT'S LIKE UHH), but I hereby claim that I invented this word!  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1296747156267180195?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1296747156267180195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1296747156267180195' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1296747156267180195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1296747156267180195'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/08/ginormous-etymology.html' title='Ginormous Etymology'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7417639092728359900</id><published>2007-07-25T12:34:00.001-07:00</published><updated>2007-07-25T12:44:11.301-07:00</updated><title type='text'>Is google losing its way?</title><content type='html'>Google is a great search engine, no question, but they aren't free of issues.  The two things I found recently are:&lt;br /&gt;&lt;br /&gt;1) New sites do not get integrated quickly.  This blog for example.  Do a really specific search for "l8rs iPhone" or "l8rz iPhone" and this blog won't even show up!  I've been giving play-by-play reviews of the iPhone for over a week now, and am not indexed.  This blog has been on blogger, which is *owned by google*, for over 6 months, and it hasn't been indexed.  That's pretty sad.&lt;br /&gt;&lt;br /&gt;2) Google maps is missing some obvious listings.  There happens to be this *awesome DMV* in Pleasanton, CA.  Raving about it is a bit of a different story, but in short it is really fast and open on Saturday.  For full-service stuff that the AAA can't do, they're the best DMV I've ever been to.  They greet you at the door, figure out what you're trying to do, and even have screwdrivers on hand if you're getting new plates.  The wait was basically non-existent.  Now try and find it on google?!  "DMV, Pleasanton, CA" gives you some hospital in Livermore.  "Department of Motor Vehicles, Pleasanton, CA" gives you nothing as well (well, the DMV in Redwood City and Corte Madera...)  That's pretty pathetic -- but a good way to keep the best kept secret of DMVs a secret.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7417639092728359900?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7417639092728359900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7417639092728359900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7417639092728359900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7417639092728359900'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/is-google-losing-its-way_25.html' title='Is google losing its way?'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-2565452566275282877</id><published>2007-07-25T12:29:00.001-07:00</published><updated>2008-03-31T12:24:49.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone hacking</title><content type='html'>With a 600MHz ARM core the iPhone is clearly a great platform for native development beyond the current AJAX limitation.  So here is the scoop on unlocking the platform for such things:&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://www.hackint0sh.org/forum/showthread.php?t=1323"&gt;Root password cracked in 3 days&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://gizmodo.com/gadgets/breaking/iphone-can-now-serve-web-pages-run-python-open-source-apps-282139.php"&gt;Apache web server ported to iPhone&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://iphone.fiveforty.net/wiki/index.php/ARM/Mach-O_Toolchain"&gt;iPhone development wiki&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://developer.berlios.de/projects/iphone-binutils/"&gt;iPhone ARM toolchain&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://iphonejtag.blogspot.com/"&gt;iPhone JTAG&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm still waiting for Apple approved updates, but some of this stuff matures more, I may try it!  Will keep you posted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-2565452566275282877?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/2565452566275282877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=2565452566275282877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2565452566275282877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/2565452566275282877'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/iphone-hacking.html' title='iPhone hacking'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-827771706780217192</id><published>2007-07-25T12:15:00.000-07:00</published><updated>2008-03-31T12:25:57.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone grabby grabby</title><content type='html'>Ok, so I'm in this meeting at work with 5 other people, and get a call from a team member on my cell phone.  I decide I need to answer it since its work related.  I take my phone out of my pocket and start walking out of the meeting room.  All of a sudden the whole meeting stops what they're talking about and start saying in unison "Is that an iPhone?", "Oh, you got an iPhone?" and reaching over and blocking my way and longly wanting to touch it.  It was so weird?!?  I'm just trying to take a call!  I had to raise my hands and squirm past people in the door way to get to an empty meeting room to take the call.  I've definitely had to give my share of individual demos, which I love to do, but this throng of grabbing hands was insane.  Watch out for the iPhone paparazzi!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-827771706780217192?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/827771706780217192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=827771706780217192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/827771706780217192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/827771706780217192'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/iphone-grabby-grabby.html' title='iPhone grabby grabby'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-312781471688607661</id><published>2007-07-25T12:03:00.000-07:00</published><updated>2008-03-31T12:26:23.180-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone hard reset</title><content type='html'>Despite periodic problems and bugs I run into with the iPhone, I still love this device.  The new discovery tip is the "hard reset".  Holding the top and bottom buttons of an iPhone for 7 seconds will hard-reboot the device (similar to pulling the plug out of a computer).  I learned this the hard-way -- by going to the place I was hoping to avoid -- the Genius Bar.  Why?  Well, the first time my iPhone went down to 20%, then 10%, then 5%, then out-of-power, everything seemed cool; it would warn me each time with a friendly dialog.  So I came home and put it in its charging cradle for the night (who needs a dog to practice for kids when they have an iPhone).  The next day, the thing wouldn't boot!  It was a dark scr3een and I had to leave on a business trip that evening.  So the "Genius" taught me the hard-reboot, and all is well now.  He said the thing basically crashed with the screen in standby.  I have since had to hard-reboot it 3 times.  Once on the airport when the EDGE network just dropped off, and once while jogging and taking action shots of deer in the cemetery.  The cell connectivity sometimes drops out suddenly, and it crashes sometimes, but I love it anyway.  They say new babies are a real joy -- but they get moody and cry a lot too.  That's how the iPhone is.  Looking forward to the first toddler software update!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-312781471688607661?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/312781471688607661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=312781471688607661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/312781471688607661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/312781471688607661'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/iphone-hard-reset.html' title='iPhone hard reset'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5986516682633941545</id><published>2007-07-19T00:14:00.000-07:00</published><updated>2008-03-31T12:27:00.767-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Fun iPhone apps</title><content type='html'>It's amazing how quickly folks have developed iPhone applications using AJAX.&lt;br /&gt;&lt;br /&gt;Here is a short list of a few good ones that seem to work well:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://ichess.morfik.com/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;iChess&lt;/span&gt;&lt;/a&gt; (Easy)&lt;br /&gt;- &lt;a href="http://www.shredderchess.com/iphone/"&gt;Shredder Chess&lt;/a&gt; (Hard)&lt;br /&gt;- &lt;a href="http://sudoku.myiphone.pl/"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Sudoku&lt;/span&gt;&lt;/a&gt; (Polish developer - graphic heavy)&lt;br /&gt;- &lt;a href="http://macmost.com/iphonegames/Sudoku/"&gt;Sodoku&lt;/a&gt; (lean and mean)&lt;br /&gt;- &lt;a href="http://iphone.scenario.com/"&gt;Texas Hold'em&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Hmm&lt;/span&gt;, these are all games.  Well, when I find some good productivity apps, I'll post them.  Or, rather than hold your breath, check out this listing site that allows developers to post their links directly:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://iphoneapplicationlist.com/"&gt;http://iphoneapplicationlist.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, the MacMost collection seems good:&lt;br /&gt;&lt;a href="http://www.macmost.com/iphonegames/"&gt;&lt;br /&gt;http://www.macmost.com/iphonegames/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5986516682633941545?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5986516682633941545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5986516682633941545' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5986516682633941545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5986516682633941545'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/fun-iphone-apps.html' title='Fun iPhone apps'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-1443197570326039597</id><published>2007-07-19T00:03:00.000-07:00</published><updated>2008-03-31T12:27:29.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Solving basic iPhone issues</title><content type='html'>So about an hour after my last post on my iPhone experience, the thing basically stopped working.  The "slide to unlock" motion would only work after 3, then 5, then 20 attempts, and basically all apps would "crash" (return to home screen) after about 2-3 seconds of use.  I planned to go to the Apple store as soon as I got home from work, and mapped out my series of complaint for the Genius at the Genius Bar.  "I love my new iPhone I've had for 3 days, but..."&lt;br /&gt;&lt;br /&gt;Luckily, I told my woes to my carpool buddy on the drive home, and he had a brilliant suggestion:  "Why don't you reboot it?"  So I did, and that solved *everything*.  Why didn't I think of that?  When in doubt, just REBOOT!  Perhaps that seems like such a Microsoft solution; but this is my 2nd Apple product ever, and any computational device this complex has potential to benefit from the occasional reboot.  You know, it had a hard first few days.  I activated it, and clicked through every feature possible.  It's like a severe stress test that includes an operation that usually only occurs once (activation.)  Now the web browser and other apps are much more stable -- Safari hasn't crashed yet since the reboot.&lt;br /&gt;&lt;br /&gt;Oh, so there was one other problem that has been solved easily:  My calendar is populated by synching with Outlook on my local laptop machine.  The only problem is that all the appointments are 8 hours off, and I get little alarms all throughout the evening once the meetings are long over and I'm relaxing at home.  Well the fix was easy:&lt;br /&gt;  1) go to Settings&lt;br /&gt;  2) go to General&lt;br /&gt;  3) go to Date &amp;amp; Time&lt;br /&gt;  4) confirm Time Zone Support is ON (default)&lt;br /&gt;  5) go to Time Zone&lt;br /&gt;  6) type in your city, state&lt;br /&gt;&lt;br /&gt;Done!  All my appointments instantly shifted to the correct time.  Why this info can't be gleaned from the AT&amp;amp;T network directly, I don't know, but the fix was easy enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-1443197570326039597?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/1443197570326039597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=1443197570326039597' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1443197570326039597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/1443197570326039597'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/solving-basic-iphone-issues.html' title='Solving basic iPhone issues'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5064241747121830861</id><published>2007-07-16T10:41:00.000-07:00</published><updated>2008-03-31T12:27:45.495-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Early Adopter - iPhone!</title><content type='html'>Well, I got one, and am very happy.  I'll give a quick overview of the experience step-by-step.&lt;br /&gt;&lt;br /&gt;MOTIVATION: I had no contract, and an old phone that was ready to die, and have been basically holding out for a smart phone with mp3 player and work e-mail capability. The iPhone was a great choice, but I wanted to assess the competition before signing my life to AT&amp;amp;T.&lt;br /&gt;&lt;br /&gt;COMPETITION:&lt;br /&gt;The main competitor was the N95 from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Nokia&lt;/span&gt;. It has a 5 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;megpix&lt;/span&gt; camera, takes video, integrated GPS, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;flashLite&lt;/span&gt; player, and it would work with my existing T-mobile plan. The processor is slower though (300MHz vs. 600&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Mhz&lt;/span&gt;), and there is no keyboard - just a number pad. So I deliberated for 3-4 days with web comparisons. Then I saw this chart that shows the iPhone battery life is 2x all the others. That was a powerful argument for me.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mb5txD4vOHA/Rpu5fwsHsgI/AAAAAAAAAA4/viZ-r6jP_d8/s1600-h/competitivedatachart2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_mb5txD4vOHA/Rpu5fwsHsgI/AAAAAAAAAA4/viZ-r6jP_d8/s400/competitivedatachart2.jpg" alt="" id="BLOGGER_PHOTO_ID_5087864159342146050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;PURCHASE:&lt;br /&gt;So I went into the local Apple store and played with the device for about 40 minutes.  What sold me was not all the "known" cool features like the album view &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;iPod&lt;/span&gt; or great video playback.  I needed a work phone.  So I was reassured after looking at the e-mail application which was very simple to use.  Then I clicked on a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;PDF&lt;/span&gt; attachment, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;BAM&lt;/span&gt; it opened up and displayed with full zoom/pan controls at my finger tips.  The same happened for Excel and Word document support.  The viewer was just &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;seamless&lt;/span&gt;!  So that clinched it.  I was worried about no Flash player, and no 3rd party app development, but pretty much decided this is a serious platform that can handle software upgrades over time.  600 MHz and huge touch screen is really the device of the future and good selections were made for the initial feature set.  I was sold!  So I went to the front desk, said I wanted a 8GB iPhone, handed my credit card, and walked out of the store with the device in its super slick box/bag packaging.  The transaction took about 3 minutes!  It was like buying a cup of coffee, it was that easy!&lt;br /&gt;&lt;br /&gt;ACTIVATION:&lt;br /&gt;I had read on forums that activation could be potentially frustrating.  I actually didn't open the box for 24 hours because I was fretting over &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_8"&gt;losing&lt;/span&gt; my super cheap T-mobile plan.  It turns out my plan wasn't that cheap after all (they bumped me at some point to $39.99 for 1000 minutes + free weekends -- I thought it was still $29.99).  Data plans on both AT&amp;amp;T and T-mobile are $20.  So for 900 minutes, AT&amp;amp;T is charging about $20/month over industry standard.  I consider this an extra $500 for the phone over 2 years.   So it helps to get a work justification or some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;sponsorship&lt;/span&gt;, but the device itself costing $500 seems pretty good considering I had two phones that cost $220 each destroyed in the past few years.  Anyway,  once I decided to give T-mobile the boot for good, I connected &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;iTunes&lt;/span&gt;, and went through the simple wizard to activate a new AT&amp;amp;T account and transfer my number.  The activation said I had to wait for an e-mail for the transaction to complete.  My phone was still not unlocked.  I could see how so many users where frustrated by this bit.  I really wanted to just connect via my home &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;WiFi&lt;/span&gt; and play with the awesome new device I just opened.  Alas, activation can take as long as 24+ hours.  So I called the iPhone activation number I found on one of the forums, and spoke with the tech support in India to speed it along.  Then I went to sleep.  The phone was activated when I woke up in the morning.  Sweet!&lt;br /&gt;&lt;br /&gt;USAGE:&lt;br /&gt;This device is simply awesome.  Naysayers are simply jealous.  I will list the issues, but overall the default description of this device is that it is perfect.&lt;br /&gt;&lt;br /&gt;1) Voice call quality is not the best.  It got better when I took off the plastic sheet that was protecting the screen and muffling the ear speaker.&lt;br /&gt;&lt;br /&gt;2) Dropped calls.  The iPhone has dropped a few calls in the middle of normal conversation.  Both times occurred while driving on the highway near downtown.&lt;br /&gt;&lt;br /&gt;3) Browser crashes often.  The nice thing is the browser crashes elegantly, almost like you meant it by going back to the home screen.  The browser does crash often however in the middle of fairly normal operations.&lt;br /&gt;&lt;br /&gt;4) &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;iTunes&lt;/span&gt; is tricky to mute/disable.  I guess you can just turn the volume down.  To actually pause the song you have to unlock the phone, navigate to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;iTunes&lt;/span&gt;, and hit pause - a slide and two clicks.  If the headphones are in, you can just yank them out to pause, but if you want to silence the speaker quickly you may get stuck.&lt;br /&gt;&lt;br /&gt;5) Ringer is tricky to mute quickly.  I'm worried I'll get a call in a meeting and have to stumble around to silence my ringer (and not take the call).  Haven't run into this yet, but I'll be a bit anxious until I figure out there is a clean way to do this.&lt;br /&gt;&lt;br /&gt;6) Outlook imported my calendar nicely, but all the appointments are off and shifted by about 9 hours...  (11am appointment shows as 7pm.)&lt;br /&gt;&lt;br /&gt;7) Map applet doesn't have a simple way to start a new search.  At least I couldn't figure it out.  The app is great until I want to start over and find something new.  Perhaps I just need to get used to it, but I felt stuck a few time with directions to someplace I was going a few days ago, and had trouble just starting a new search in a new city.  Without GPS, the flow tends to be: search for general area (get map zoomed to city you are currently in), search for businesses in that city, select business, select driving to directions, input street/intersection you are starting from.  The applet handles such flow nicely, but it's tough to simply start over anew.&lt;br /&gt;&lt;br /&gt;I'm looking forward to some software updates from Apple.  Hopefully, they'll focus on the following:&lt;br /&gt;&lt;br /&gt;- Safari robustness - make the browser rock solid&lt;br /&gt;- Flash player - add this to provide a development platform for games and adv. web apps&lt;br /&gt;&lt;br /&gt;- Expand rotation to all the applets (stocks, weather, ...)  Not sure if this would be good or not, but most users expect rotating the device to reorient the screen even in these little demo apps.  Perhaps make it a setting?  Also extending the calculator to be scientific would be nice.&lt;br /&gt;&lt;br /&gt;Anyway...  Despite the glitches, I'm a happy camper!&lt;br /&gt;&lt;br /&gt;NON-ISSUES:&lt;br /&gt;- EDGE is slow.  It really isn't!  If you need speed, go to a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;WiFi&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;hotspot&lt;/span&gt;.  If you are on the go in America, EDGE is all you get, and 88&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Mbit&lt;/span&gt;/s is pretty good -- &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;ISDN&lt;/span&gt; or 2x dial-up speeds.  There is only one 3G phone in the US right now.  Perhaps the iPhone2 will use 3G, but I haven't noticed the EDGE being as bad as &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_18"&gt;Internet&lt;/span&gt; forums are making it out to be.&lt;br /&gt;&lt;br /&gt;SURPRISES:&lt;br /&gt;- &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;PodCasts&lt;/span&gt;!  Syncing is a high-bandwidth shortcut.  Subscribing to all sorts of radio and TV shows is easy, and loads nice surprise content to your iPhone every time you charge it.  I never tried &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;PodCasts&lt;/span&gt; on my shuffle, but the video on the iPhone is just too nice not to enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5064241747121830861?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5064241747121830861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5064241747121830861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5064241747121830861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5064241747121830861'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/07/early-adoptor-iphone.html' title='Early Adopter - iPhone!'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mb5txD4vOHA/Rpu5fwsHsgI/AAAAAAAAAA4/viZ-r6jP_d8/s72-c/competitivedatachart2.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-7946651000007548555</id><published>2007-05-27T16:50:00.000-07:00</published><updated>2008-03-31T12:36:39.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Last.FM</title><content type='html'>The web is reaching its virtual tentacles out deeper and deeper into our lives.  The latest squeeze is on our ears.  This service provides a plug-in for iTunes that tracks the trax you're listening to, and posts your playlist on the web with typical Web 2.0 community site add-ons:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.last.fm/user/l8rs/"&gt;L8rs on Last.FM&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-7946651000007548555?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/7946651000007548555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=7946651000007548555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7946651000007548555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/7946651000007548555'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/05/lastfm.html' title='Last.FM'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-9193831113865433638</id><published>2007-05-22T00:04:00.002-07:00</published><updated>2008-11-22T12:54:00.752-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hw'/><title type='text'>Digital Audio Interfaces</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mb5txD4vOHA/RlKaIKHaK1I/AAAAAAAAAAw/PjFrx3B7J0s/s1600-h/firestudio_angle.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_mb5txD4vOHA/RlKaIKHaK1I/AAAAAAAAAAw/PjFrx3B7J0s/s400/firestudio_angle.jpg" alt="" id="BLOGGER_PHOTO_ID_5067281995690290002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Okay, back to the nerdy musician topic.  Digital audio is the irreversible future, and I now have some direct experience with some of the products out there.  This post is meant to be a deep dive into the technology that is out there and a summary of my experiences.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.m-audio.com/products/en_us/FireWire1814-main.html"&gt;M-Audio Firewire 1814&lt;/a&gt; (Avid) - This unit is great on the surface -- at its core are 8 analog inputs, 2 with optional Pre-amps.  Phantom power,  headphone monitors, and even ADAT light pipe for a hidden extra 8 tracks in!  The unit was ~$400 on the used market.  M-Audio technical support is awesome -- they work really hard to get you going.  The problem: the unit works great for a week or two, then can't be detected by my PC anymore!  When it did work, it was beautiful -- it totally replaced my old Alesis 8-track ADAT, had no latency, and made live studio recording and transfers a snap.  This is bus powered, and uses FireWire, but they say you are absolutely in no way supposed to hot swap your device.  This is odd to me, and implies they aren't using the bus in a 100% standard way.  I read this device is detected by the BIOS, not the FireWire driver.  While weird, that would be okay.  But when your main audio interface doesn't get detected at all after multiple reboots, well, that's more than frustrating... &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.m-audio.com/products/en_us/MobilePreUSB-main.html"&gt;M-Audio MobilePre USB&lt;/a&gt; (Avid) - This unit is ~$150 tops, and is super reliable and easy to use.  It gives you two tracks of inputs, both with preamps, monitoring, and phantom power.  This is a great little bus powered unit for overdubs and tracking of stereo live shows straight out of the mixer.  The only hang up is USB, while easy to use, is a pretty weak audio protocol, so you have to tolerate latency on the order of 100-200 ms in your recordings.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.emu.com/products/product.asp?category=505&amp;subcategory=491&amp;amp;product=10447"&gt;E-MU 0404 USB 2.0&lt;/a&gt; (Creative Labs) - Powerful on paper, this 2 track input has live monitoring, MIDI, and really high sample rates.  The price is just under ~$200.  The two problems are it is not bus powered, and it clicks like there is no tomorrow!  What's the point of an audio interface that drops samples?  This device shows how bad USB can be for audio -- the audio portion of the bus standard has no error correction, so a touch of latency results in dropped bytes that sound like harsh cracks and clicks.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.presonus.com/firepod.html"&gt;Presonus FirePod&lt;/a&gt; - 8 track FireWire with 8 preamps for $499.  Haven't tried it yet.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.presonus.com/firestudio.html"&gt;Presonus FireStudio&lt;/a&gt; - Like the FirePod but adds ADAT lightpipe and better pres for the ultimate studio interface.  $799.  Haven't tried it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.motu.com/products/motuaudio/828/"&gt;MOTU 828&lt;/a&gt; - A friend has this one, and it works great for him!  Full 8-track FireWire input device with PreAmps on 2 of the channels.&lt;br /&gt;&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/21430394-9193831113865433638?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/9193831113865433638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=9193831113865433638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9193831113865433638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/9193831113865433638'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/05/digital-audio-interfaces.html' title='Digital Audio Interfaces'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mb5txD4vOHA/RlKaIKHaK1I/AAAAAAAAAAw/PjFrx3B7J0s/s72-c/firestudio_angle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-510955152242697057</id><published>2007-03-08T18:42:00.000-08:00</published><updated>2007-03-08T18:54:13.784-08:00</updated><title type='text'>Invisible Man</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mb5txD4vOHA/RfDLwV96uqI/AAAAAAAAAAk/2fBpbAtjmoQ/s1600-h/wall_invisibleman_300_a.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_mb5txD4vOHA/RfDLwV96uqI/AAAAAAAAAAk/2fBpbAtjmoQ/s400/wall_invisibleman_300_a.jpg" alt="" id="BLOGGER_PHOTO_ID_5039752014418590370" border="0" /&gt;&lt;/a&gt;I started reading &lt;i&gt;“Invisible Man” &lt;/i&gt;by Ralph Ellison recently, and after only a few pages of the Prologue, I was surprised by a description of a strangely familiar image of a cellar room filled with 1369 light bulbs.  It turns out I had seen this Jeff Wall photo in a museum in Europe and remembered the image vividly.  What does this say about our new multimedia world?  In a world of sound bites, clips, and news bites, many people experience an original idea for the first time through the filters of interpretation. A person's original experience may be a reaction to the second or third iteration of inspiration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-510955152242697057?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/510955152242697057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=510955152242697057' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/510955152242697057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/510955152242697057'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/03/invisible-man.html' title='Invisible Man'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mb5txD4vOHA/RfDLwV96uqI/AAAAAAAAAAk/2fBpbAtjmoQ/s72-c/wall_invisibleman_300_a.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-5832338377534279919</id><published>2007-03-06T23:30:00.000-08:00</published><updated>2008-11-22T12:54:19.798-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><title type='text'>Where does water come from?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mb5txD4vOHA/Re5qIoIseEI/AAAAAAAAAAU/rHrGOhlZWmw/s1600-h/IMG_4056.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_mb5txD4vOHA/Re5qIoIseEI/AAAAAAAAAAU/rHrGOhlZWmw/s320/IMG_4056.JPG" alt="" id="BLOGGER_PHOTO_ID_5039081729519548482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Visiting Patagonia is all about visiting the glaciers.  The main thing to do is to trek up to each of the main scenic peaks and hope the weather is good enough to get a nice view.  Each of these peaks tend to have their own little glacier that fills its own little lake, which continuously empties into a stream.  This image of the Fitz Roy shows most of this without the lake.  The funny thing is when you hike up to the glacier, it seems so small, and doesn't appear to be melting fast enough to really fill the lake.  Despite this, the river flows out of it so fast -- you would think the lake would just drain like your bath tub.  Perhaps I'll need to revisit my fluid dynamics books to figure out how it all works...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-5832338377534279919?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/5832338377534279919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=5832338377534279919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5832338377534279919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/5832338377534279919'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/03/where-does-water-come-from.html' title='Where does water come from?'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mb5txD4vOHA/Re5qIoIseEI/AAAAAAAAAAU/rHrGOhlZWmw/s72-c/IMG_4056.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-117031349044588375</id><published>2007-01-31T23:00:00.000-08:00</published><updated>2007-01-31T23:21:15.946-08:00</updated><title type='text'>Death Star Moon</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/712021/PIA08278%20Mimas.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/320/873809/PIA08278%20Mimas.jpg" alt="" border="0" /&gt;&lt;/a&gt;Mimas is one of Saturn's many moons, but the resemblance to the Death Star of Star Wars is simply uncanny!  What's funny is that the Death Star was designed and filmed *before* any detailed photos of Mimas were available from the Cassini or even Voyager probes.&lt;br /&gt;&lt;br /&gt;Is this fact of urban folklore testament to the capabilities of the collective consciousness?  Or perhaps it is a sign that the human mind has the power to perceive its surroundings beyond the "five" senses...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mimas_%28moon%29"&gt;Mimas on Wikipedia&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-117031349044588375?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/117031349044588375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=117031349044588375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/117031349044588375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/117031349044588375'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/01/death-star-moon.html' title='Death Star Moon'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-116841208116183026</id><published>2007-01-09T22:50:00.000-08:00</published><updated>2008-03-31T12:28:06.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Yes its cool</title><content type='html'>iPhone was announced today.  200 patents, wow!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/348164/iphone.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/320/415814/iphone.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;AAPL is Kramer's #2 growth pick for 2007.  Glad I bought shares during the dip a few days ago.  Wish I bought in 2003 when iPod sales started to ramp.  At $599 for the 8GB, this will be pricey, but it will be a device we really care about and changes our lives.  Considering the last two $220 phones I had either went through the wash or got lost in Germany on a business trip, $599 stops sounding so bad.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/171782/iphone_pix.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/200/669766/iphone_pix.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/855454/iPhone-wireless.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/200/834386/iPhone-wireless.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AAPL is now the largest component of the QQQQ (Nasdaq 100) index at ~7%.  Strange that a large move in Apple still hardly moves the index.&lt;br /&gt;&lt;br /&gt;I haven't thought this through thoroughly yet, but I am starting to think that technology is not the right sector for index funds.  Other sectors, yes, but technology is too stratified between a few super stars and then a load of under performers dragging the whole bunch down.  Why is QCOM such a large portion of the QQQQ for instance?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-116841208116183026?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/116841208116183026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=116841208116183026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116841208116183026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116841208116183026'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/01/yes-its-cool.html' title='Yes its cool'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-116797785891964725</id><published>2007-01-04T22:15:00.000-08:00</published><updated>2007-01-04T22:21:42.466-08:00</updated><title type='text'>Investment News: a 24/7 addiction</title><content type='html'>A good way to develop habitual insomnia is to get into investment research.  This financial news link is really good: &lt;a href="http://www.247wallst.com/"&gt;24/7 Wall St.&lt;/a&gt;.  I love stuff like this, and good investment news and analysis tools are hard to find.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-116797785891964725?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/116797785891964725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=116797785891964725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116797785891964725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116797785891964725'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/01/investment-news-247-addiction.html' title='Investment News: a 24/7 addiction'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-116796586334762874</id><published>2007-01-04T18:51:00.000-08:00</published><updated>2007-01-04T22:22:47.960-08:00</updated><title type='text'>Cassini Probe Rocks Saturn</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/384980/Dione.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/320/468503/Dione.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have been completely won over by the amazing photographs being returned by the Cassini probe from Saturn. &lt;br /&gt;&lt;br /&gt;The probe arrived in 2004, and will end its mission in 2008.  We are right in the middle of the action now!&lt;br /&gt;&lt;br /&gt;The image shown here is of one of the moons, Dione, above the razor thin ice ring with Saturn in the back.  Classic!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://saturn.jpl.nasa.gov/home/index.cfm"&gt;Cassini Homepage&lt;/a&gt;&lt;br /&gt;&lt;a href="http://saturn.jpl.nasa.gov/multimedia/images/index.cfm"&gt;Cassini Images&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-116796586334762874?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/116796586334762874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=116796586334762874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116796586334762874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116796586334762874'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2007/01/cassini-probe-rocks-saturn.html' title='Cassini Probe Rocks Saturn'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-116174736430331301</id><published>2006-10-24T20:33:00.000-07:00</published><updated>2008-11-22T12:54:49.079-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lang'/><title type='text'>More on Mix-ins</title><content type='html'>This &lt;a href="http://www.informit.com/articles/article.asp?p=31473&amp;seqNum=3&amp;rl=1"&gt;pattern&lt;/a&gt; is quite cool for those who care.  It is called the Curiously Recurring Template Pattern (CRTP), and allows one to use virtual method type techniques, but linked statically at compile time.&lt;br /&gt;&lt;br /&gt;Here is a splendid example:&lt;br /&gt;&lt;br /&gt;A C++ implementation of this counting idea is none other than the canonical example for a Curiously Recurring Template Pattern (aka a Self-parameterized Base Class), and goes like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class ="indent"&gt;&lt;br /&gt;// A base class that provides counting&lt;br /&gt;template&amp;lt;class T&amp;gt; class Counted {&lt;br /&gt;  static int count;&lt;br /&gt;public:&lt;br /&gt;  Counted() {&lt;br /&gt;    ++count;&lt;br /&gt;  }&lt;br /&gt;  Counted(const Counted&amp;lt;T&amp;gt;&amp;) {&lt;br /&gt;    ++count;&lt;br /&gt;  }&lt;br /&gt;  ~Counted() {&lt;br /&gt;    --count;&lt;br /&gt;  }&lt;br /&gt;  static int getCount() {&lt;br /&gt;    return count;&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;class T&amp;gt; int Counted&amp;lt;T&amp;gt;::count = 0;&lt;br /&gt;&lt;br /&gt;// Curious class definitions&lt;br /&gt;class CountedClass : public Counted&amp;lt;CountedClass&amp;gt; {};&lt;br /&gt;class CountedClass2 : public Counted&amp;lt;CountedClass2&amp;gt; {};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-116174736430331301?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/116174736430331301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=116174736430331301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116174736430331301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116174736430331301'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2006/10/more-on-mix-ins.html' title='More on Mix-ins'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21430394.post-116170359354527620</id><published>2006-10-24T08:10:00.000-07:00</published><updated>2007-01-04T22:37:52.283-08:00</updated><title type='text'>What happened to Camp Falcon???</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/968866/camp%20falcon%20explosion.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/200/607555/camp%20falcon%20explosion.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On Oct. 11th, I saw a short clip on CNN cable news that showed a large recurring explosion in Iraq.  The reporter said they were 4 km away, and they were filming the live footage of Camp Falcon exploding into the night.  The reporter stated that the immense explosions being shown were milder than before, and that they had been going on for 14 hours?!!??  It turned out that a well placed mortor hit the US amunition depot and set off a chain reaction of tank artillery and small arms "cooking off".  From the look of the explosions, it looked bad.&lt;br /&gt;&lt;br /&gt;Being a patriotic US citizen who wants nothing more than to see US forces succeed in bringing democracy to Iraq and promptly leave, I desparately wanted follow up information on this incident.  I started looking for online sources of news everyday looking for follow up -- what exactly happened?  What was the damage and impact of this attack?&lt;br /&gt;&lt;br /&gt;I was quite surprised to find that there was *no followup* to these video clips on CNN in any of the official news sources.  news.yahoo.com -- nothing.  news.google.com -- nothing.  All that was available was the official sound bite from the military press: less than 500 officers were stationed there at the time, and there are no casualties.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/2538/2167/1600/188188/camp%20falcon.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/2538/2167/200/980772/camp%20falcon.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Its been two weeks and I want to know -- what happened?  The only detailed news on this I can find is on &lt;a href="http://www.jihadunspun.com/intheatre_internal.php?article=106619&amp;amp;list=/home.php"&gt;"jihad unspun"&lt;/a&gt;, and it reports immense devestation.  CNN, AP, please report a follow up to this story!&lt;br /&gt;&lt;br /&gt;Such a severe lack of information from the press leaves the impression that censureship is real and possible in America.  Perhaps the most valuable philosophy the US has brought to the world is free speech.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21430394-116170359354527620?l=l8rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l8rs.blogspot.com/feeds/116170359354527620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21430394&amp;postID=116170359354527620' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116170359354527620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21430394/posts/default/116170359354527620'/><link rel='alternate' type='text/html' href='http://l8rs.blogspot.com/2006/10/what-happened-to-camp-falcon.html' title='What happened to Camp Falcon???'/><author><name>l8rz</name><uri>http://www.blogger.com/profile/00808529599193305008</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://static.flickr.com/16/90591754_2987d45971.jpg'/></author><thr:total>1</thr:total></entry></feed>
