<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0MFRXY9eSp7ImA9WhBQGEk.&quot;"><id>tag:blogger.com,1999:blog-3062430</id><updated>2013-03-20T21:50:14.861-07:00</updated><category term="nerdiness" /><category term="events" /><category term="photos" /><category term="books" /><category term="thoughts" /><title>Vic’s Blog</title><subtitle type="html">Work. Play. Think. Love. Life.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.vicshih.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.vicshih.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/vicshih/PRAV" /><feedburner:info uri="vicshih/prav" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUcGR344cSp7ImA9WhJaEEs.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-7255585287038898383</id><published>2012-09-30T20:12:00.000-07:00</published><updated>2012-09-30T20:43:46.039-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-30T20:43:46.039-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photos" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>Daly Tripper</title><content type="html">&lt;div style="float: left; margin-right: 10px;"&gt;
It's been a few weeks now in our new city! We took advantage of the weekend and made a trip to Golden Gate Park.&lt;br /&gt;
&lt;br /&gt;
While we waited for the Muni at the Daly City &lt;span style="font-size: x-small;"&gt;BART&lt;/span&gt;, an elderly Asian lady tried talking to us, but we couldn't understand her. Finally she pointed to something behind us. &amp;nbsp;Turns out we were waiting at the wrong stop; she must have noticed we were waiting for the 28-bus after seeing us rush to catch the one that just left. &amp;nbsp;I was impressed that she put in the effort to let us know!&lt;br /&gt;
&lt;br /&gt;
We ate and picked up some random necessities at different shops. &amp;nbsp;We even dropped by an estate sale along the way. &amp;nbsp;It turned out to be a really nice, sunny day, which was a huge contrast for me, being cooped up in gloomy, foggy Daly City all week. &amp;nbsp;Here's a picture of us waiting for the bus again, enjoying our&amp;nbsp;first&amp;nbsp;(quite cheap) "self-serve boba" milk tea:&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xXF-4NGwp5E/UGkFesMe20I/AAAAAAAABas/yQaAXrbcOms/s1600/photo.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-xXF-4NGwp5E/UGkFesMe20I/AAAAAAAABas/yQaAXrbcOms/s200/photo.JPG" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Public transportation gluttons&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/p5-X981SKJo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/7255585287038898383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=7255585287038898383&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7255585287038898383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7255585287038898383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/p5-X981SKJo/daly-tripper.html" title="Daly Tripper" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-xXF-4NGwp5E/UGkFesMe20I/AAAAAAAABas/yQaAXrbcOms/s72-c/photo.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2012/09/daly-tripper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8BSXs6eip7ImA9WhdbFUo.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-8085463204373189119</id><published>2011-10-14T00:18:00.000-07:00</published><updated>2011-10-14T00:54:18.512-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-14T00:54:18.512-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photos" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>Hitched</title><content type="html">&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-YNtcPUnCi5w/TpfZf0dYmlI/AAAAAAAABJg/BkV7QgHx6TU/s1600/IMG_5548.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="272" src="http://1.bp.blogspot.com/-YNtcPUnCi5w/TpfZf0dYmlI/AAAAAAAABJg/BkV7QgHx6TU/s640/IMG_5548.JPG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;photo: &amp;nbsp;Alan Harris&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Wow. &amp;nbsp;It really happened! &amp;nbsp;I put in my share of time and effort, but really Vicki gets all the credit. &amp;nbsp;Somehow we managed to pull it off in these past&amp;nbsp;three months.&lt;br /&gt;
&lt;br /&gt;
I'd like to give a very heartfelt thanks to everyone who went out of their way to attend. &amp;nbsp;If it wasn't the most complicated ceremony/reception arrangement possible, it must have been close to it. &amp;nbsp;It meant so much to us to be able to see all of your faces. &amp;nbsp;Friends and family came from as far north as Seattle, as far south as Texas, as far west as Taiwan, and as far east as France. &amp;nbsp;As much as Vicki and I dislike being the center of attention, we are so moved by the love and support you all have shown us.&lt;br /&gt;
&lt;br /&gt;
And as if coming out all that way wasn't enough, everyone gave us so much! &amp;nbsp;Thank you all for your kind generosity.&lt;br /&gt;
&lt;br /&gt;
It would be impossible to adequately thank everyone who helped make this happen. &amp;nbsp;We definitely could not have done it without the help of: Vicki's&amp;nbsp;mom, aunts and uncles; her&amp;nbsp;sisters Karen, Mimi, and Betty; and her bridesmaids Joanne and Ann. &amp;nbsp;A special thanks to groomsmen Ben and Joel (and their wives, Claire and Joanne) for throwing me a blast of a party and as well as staying so on top of things throughout the entire marathon of a day.&lt;br /&gt;
&lt;br /&gt;
And a heartfelt apology to all those we couldn't invite. &amp;nbsp;Hopefully we will get to see all of you in the near future.&lt;br /&gt;
&lt;br /&gt;
Thanks again, everyone!&lt;br /&gt;
&lt;br /&gt;
P.S. I also deeply apologize for the band at the reception. &amp;nbsp;Yikes.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/frOfWC11z28" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/8085463204373189119/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=8085463204373189119&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8085463204373189119?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8085463204373189119?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/frOfWC11z28/hitched.html" title="Hitched" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-YNtcPUnCi5w/TpfZf0dYmlI/AAAAAAAABJg/BkV7QgHx6TU/s72-c/IMG_5548.JPG" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Oxnard, CA, USA</georss:featurename><georss:point>34.1975048 -119.1770516</georss:point><georss:box>34.0924383 -119.3349801 34.3025713 -119.0191231</georss:box><feedburner:origLink>http://blog.vicshih.com/2011/10/hitched.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENQHs8eCp7ImA9WhJTFUU.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-5434619371873197981</id><published>2011-09-04T20:27:00.000-07:00</published><updated>2012-06-24T18:11:31.570-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-24T18:11:31.570-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>DropboxDiff Chrome Extension</title><content type="html">&lt;b&gt;2012/06/24 update:&lt;/b&gt;&amp;nbsp;version 1.0.2.6 is out, which handles the latest Dropbox site format (no table header).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I've written &lt;a href="https://chrome.google.com/webstore/detail/aefdkgcdokdiaoppobphjogcilaaakka"&gt;DropboxDiff&lt;/a&gt;,
 a Chrome extension which allows you to compare different versions of text files you have on Dropbox. &amp;nbsp;It basically triggers a diff tool you have installed on your local machine already, which you must configure.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;On the Dropbox website, browse to the "Previous versions" page of any text file.&lt;/li&gt;
&lt;li&gt;A "Diff" column has been added where you can select which two versions to compare.&lt;/li&gt;
&lt;li&gt;Click the "Diff" button.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;If a diff tool is not yet configured, the options page opens where you can specify one.  If you don't have one installed already, I recommend &lt;a href="http://kdiff3.sourceforge.net/"&gt;kdiff3&lt;/a&gt;.  The setting is accessible from Tools &amp;gt; Extensions &amp;gt; DropboxDiff &amp;gt; Options.&lt;/li&gt;
&lt;li&gt;Otherwise, your diff tool should open.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
This should run on Windows, Mac, and Linux. &amp;nbsp;Please let me know if any issues come up.&lt;/div&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
Get &lt;a href="https://chrome.google.com/webstore/detail/aefdkgcdokdiaoppobphjogcilaaakka"&gt;DropboxDiff&lt;/a&gt;.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/8Ubz3PwV-M0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/5434619371873197981/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=5434619371873197981&amp;isPopup=true" title="22 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5434619371873197981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5434619371873197981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/8Ubz3PwV-M0/dropboxdiff-chrome-extension.html" title="DropboxDiff Chrome Extension" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>22</thr:total><feedburner:origLink>http://blog.vicshih.com/2011/09/dropboxdiff-chrome-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFRHw5fip7ImA9WhdXGUw.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-8090512999668879363</id><published>2011-09-01T16:12:00.000-07:00</published><updated>2011-09-01T16:23:35.226-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-01T16:23:35.226-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>Blame it on the Tron</title><content type="html">I watched old school Tron the other night.  So much awesome kitch in that movie, I couldn't stop grinning during the whole thing.

&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
Some things I noticed, since last time I watched it, a few decades ago:

&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-he7ndvv7wF4/TmAGianKshI/AAAAAAAABI4/2TPsu3Vmr-Q/s1600/flynns2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-he7ndvv7wF4/TmAGianKshI/AAAAAAAABI4/2TPsu3Vmr-Q/s1600/flynns2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
The "Watseka" street sign sounded really familiar.  Lo and behold:
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Watseka+Avenue,+Los+Angeles,+CA&amp;amp;aq=2&amp;amp;sll=40.776146,-87.736422&amp;amp;sspn=0.103735,0.184364&amp;amp;vpsrc=6&amp;amp;gl=us&amp;amp;g=Watseka,+IL&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Watseka+Ave,+Los+Angeles,+California&amp;amp;ll=34.023985,-118.395259&amp;amp;spn=0.001785,0.00387&amp;amp;z=14&amp;amp;layer=c&amp;amp;cbll=34.022818,-118.39566&amp;amp;panoid=9gDlp1GUsSYiHn8gyvBjbQ&amp;amp;cbp=13,38.21,,0,1.46&amp;amp;output=svembed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Watseka+Avenue,+Los+Angeles,+CA&amp;amp;aq=2&amp;amp;sll=40.776146,-87.736422&amp;amp;sspn=0.103735,0.184364&amp;amp;vpsrc=6&amp;amp;gl=us&amp;amp;g=Watseka,+IL&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Watseka+Ave,+Los+Angeles,+California&amp;amp;ll=34.023985,-118.395259&amp;amp;spn=0.001785,0.00387&amp;amp;z=14&amp;amp;layer=c&amp;amp;cbll=34.022818,-118.39566&amp;amp;panoid=9gDlp1GUsSYiHn8gyvBjbQ&amp;amp;cbp=13,38.21,,0,1.46" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I live within 10 miles of Flynn's!  We'll have to pay homage some time. Here's the wider shot.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-3PHU3eglPlw/TmAGivfwodI/AAAAAAAABJA/1CvSXBqXRK4/s1600/flynns1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3PHU3eglPlw/TmAGivfwodI/AAAAAAAABJA/1CvSXBqXRK4/s1600/flynns1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
I don't think they used the same spot for Tron: Legacy, though.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-PgvwX-CaUH4/TmAGitdxeSI/AAAAAAAABJI/3pgBSVkx-gM/s1600/flynns3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PgvwX-CaUH4/TmAGitdxeSI/AAAAAAAABJI/3pgBSVkx-gM/s1600/flynns3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
I also don't remember this blatant Easter egg:

&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ijPy8kKgo-0/TmAGi9db04I/AAAAAAAABJQ/jXo76iYXgJA/s1600/pacman.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ijPy8kKgo-0/TmAGi9db04I/AAAAAAAABJQ/jXo76iYXgJA/s1600/pacman.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
They even sampled the Pac-Man sound effects.  I remember Pac-Man being such an incredible craze at the time (we sang the "Pac-Man Fever" song in school once, badly), but somehow I never caught it here.&lt;br /&gt;
&lt;br /&gt;
The Messianic overtones of the movie were pretty interesting too — Flynn being the User/god, come to inhabit the world of programs in order to save them. I certainly didn't pick that up as an 8-year old. Then again, it's only these days that I spend any time wondering whether our reality is just a computer simulation.&lt;br /&gt;
&lt;br /&gt;
Here's a bit of dialogue I liked quite a bit. &amp;nbsp;Flynn has just revealed to Tron that he is actually a User, and not just a program, like the rest of them.&lt;br /&gt;
&lt;blockquote&gt;
Tron: "If you are a User, then everything you've done has been according to a plan, right?&lt;/blockquote&gt;
&lt;blockquote&gt;
Flynn: "You wish! You guys know what it's like; you just keep doing what it looks like you're supposed to be doing, no matter how crazy it seems."&lt;/blockquote&gt;
&lt;blockquote&gt;
Tron: "That's the way it is with programs, yes..."&lt;/blockquote&gt;
&lt;blockquote&gt;
Flynn: "I hate to disappoint you pal, but most of the time that's the way it is for Users, too."&lt;/blockquote&gt;
&lt;blockquote&gt;
Tron: "Stranger and stranger."&lt;/blockquote&gt;
Wise words.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/VVWcKdP-1DM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/8090512999668879363/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=8090512999668879363&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8090512999668879363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8090512999668879363?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/VVWcKdP-1DM/blame-it-on-tron.html" title="Blame it on the Tron" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-he7ndvv7wF4/TmAGianKshI/AAAAAAAABI4/2TPsu3Vmr-Q/s72-c/flynns2.jpg" height="72" width="72" /><thr:total>1</thr:total><georss:featurename>Flynn&amp;#39;s, Culver City, CA 90232, USA</georss:featurename><georss:point>34.0244874 -118.3969075</georss:point><georss:box>34.0211974 -118.401843 34.0277774 -118.391972</georss:box><feedburner:origLink>http://blog.vicshih.com/2011/09/blame-it-on-tron.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ECQH44eyp7ImA9WhdTE04.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-2632449974592144418</id><published>2011-07-10T15:07:00.000-07:00</published><updated>2011-07-10T15:07:41.033-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T15:07:41.033-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Facebook Dis</title><content type="html">Have you ever been alone, minding your own business, and suddenly realize that someone has been following you, watching your every move, for the past two hours?&lt;br /&gt;
&lt;br /&gt;
That's what it feels like when I'm visiting different websites and I suddenly see:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qwdy5sW5kpE/ThobCpiLfoI/AAAAAAAABIY/dBXTNxfo0wc/s1600/wp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qwdy5sW5kpE/ThobCpiLfoI/AAAAAAAABIY/dBXTNxfo0wc/s1600/wp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
"&lt;i&gt;[various friends]&lt;/i&gt; like this."&lt;br /&gt;
&lt;br /&gt;
The scary thing is that the stalker metaphor is quite appropriate&amp;nbsp;– Facebook really &lt;i&gt;is&lt;/i&gt; stalking you, keeping track of wherever you go whenever you see one of these.&lt;br /&gt;
&lt;br /&gt;
So I really liked a Chrome extension called&amp;nbsp;&lt;a href="https://chrome.google.com/webstore/detail/ejpepffjfmamnambagiibghpglaidiec"&gt;Facebook Disconnect&lt;/a&gt;. &amp;nbsp;Unfortunately, it tends to break some sites (Scrabble, in particular). &amp;nbsp;So I extended the extension to allow whitelisting certain sites.&lt;br /&gt;
&lt;br /&gt;
Presenting: &amp;nbsp;&lt;a href="https://chrome.google.com/webstore/detail/lhjdbhdnelckmkdhebjhgkdiiocdijnm"&gt;Facebook Dis&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you really want to get fancy you can read the whitelist from a specific URL, say a website or public Dropbox file. &amp;nbsp;This lets you to configure several installations of Facebook Dis in a single place; all instances will stay up to date automatically the next time you open your browser or click "refresh" from the options page.&lt;br /&gt;
&lt;br /&gt;
Thanks to Brian Kennish for the original Facebook Disconnect.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/HCFStwlyZFI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/2632449974592144418/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=2632449974592144418&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/2632449974592144418?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/2632449974592144418?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/HCFStwlyZFI/facebook-dis.html" title="&lt;a href='https://chrome.google.com/webstore/detail/lhjdbhdnelckmkdhebjhgkdiiocdijnm'&gt;Facebook Dis&lt;/a&gt;" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-qwdy5sW5kpE/ThobCpiLfoI/AAAAAAAABIY/dBXTNxfo0wc/s72-c/wp.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2011/07/facebook-dis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQBR3Y7eip7ImA9WhZSFkw.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-1907302203127934156</id><published>2011-03-31T15:53:00.000-07:00</published><updated>2011-03-31T15:59:16.802-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-31T15:59:16.802-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Fast Make for Vim</title><content type="html">I wasn't really satisfied with Vim's :make behavior so I wrote a script to do what I wanted.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Saves buffer first&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;If there are errors, show them in the quickfix window&lt;/li&gt;
&lt;li&gt;Success is reported in the status bar&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Saves some keystrokes, especially if mapped to &lt;code&gt;F5&lt;/code&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;Here it is.  You can put it in &lt;code&gt;~/.vim/plugin/Make.vim&lt;/code&gt;, or if you are using &lt;a href="http://www.vim.org/scripts/script.php?script_id=2332"&gt;pathogen&lt;/a&gt;, &lt;code&gt;~/.vim/bundle/Make/plugin/Make.vim&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
This is basically my first Vim plugin so please let me know if there are things I could improve.  &lt;style type="text/css"&gt;
pre { font-family: monospace; color: darkblue }
.Constant { color: #ffa0a0; }
.Identifier { color: #40ffff; }
.Special { color: #ffa500; }
.Statement { color: #60ff60; font-weight: bold; }
.PreProc { color: #ff80ff; }
.Comment { color: #80a0ff; }
&lt;/style&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span class="Comment"&gt;"=============================================================================&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;File:&lt;/span&gt;&lt;span class="Comment"&gt; Make.vim&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;Author:&lt;/span&gt;&lt;span class="Comment"&gt; Victor Shih&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;Last Change:&lt;/span&gt;&lt;span class="Comment"&gt; 3/30/2011&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;Version:&lt;/span&gt;&lt;span class="Comment"&gt; 0.01&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;WebPage:&lt;/span&gt;&lt;span class="Comment"&gt; &lt;a href="http://blog.vicshih.com/2011/03/fast-make-for-vim.html"&gt;http://blog.vicshih.com/2011/03/fast-make-for-vim.html&lt;/a&gt;&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;Description:&lt;/span&gt;
&lt;span class="Comment"&gt;" Custom Make command:&lt;/span&gt;
&lt;span class="Comment"&gt;" - if results are a single line, echo;&lt;/span&gt;
&lt;span class="Comment"&gt;" - otherwise output to quickfix buffer&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt; &lt;span class="PreProc"&gt;Usage:&lt;/span&gt;
&lt;span class="Comment"&gt;"    :Make [&amp;lt;target(s)&amp;gt;]&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Comment"&gt;" Trigger via F5 by specifying:&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Comment"&gt;"   if exists('g:make_loaded')&lt;/span&gt;
&lt;span class="Comment"&gt;"     map &amp;lt;buffer&amp;gt; &amp;lt;F5&amp;gt; :Make&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="Comment"&gt;"     imap &amp;lt;buffer&amp;gt; &amp;lt;F5&amp;gt; &amp;lt;ESC&amp;gt;:Make&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="Comment"&gt;"   endif&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Comment"&gt;" in any desired ftplugin scripts.&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Comment"&gt;" g:make_loaded is set when this script is run&lt;/span&gt;
&lt;span class="Comment"&gt;"&lt;/span&gt;
&lt;span class="Statement"&gt;function&lt;/span&gt;! Make&lt;span class="Special"&gt;(&lt;/span&gt;args&lt;span class="Special"&gt;)&lt;/span&gt;
&lt;span class="Comment"&gt;  " Close quickfix&lt;/span&gt;
  &lt;span class="Statement"&gt;cclose&lt;/span&gt;

&lt;span class="Comment"&gt;  " Compile arguments&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l&lt;span class="vimFuncBody"&gt;:&lt;/span&gt;&lt;span class="Statement"&gt;args&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;strlen&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;a:args&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="vimFuncBody"&gt; ? &lt;/span&gt;&lt;span class="Constant"&gt;' '&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;.&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;a:args&lt;/span&gt;&lt;span class="vimFuncBody"&gt; : &lt;/span&gt;&lt;span class="Constant"&gt;''&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l&lt;span class="vimFuncBody"&gt;:&lt;/span&gt;title&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;expand&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;'%'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;.&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;' - Make'&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;.&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l:args

&lt;span class="Comment"&gt;  " Force write&lt;/span&gt;
  &lt;span class="Statement"&gt;silent&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;write&lt;/span&gt;&lt;span class="vimFuncBody"&gt;!&lt;/span&gt;

&lt;span class="Comment"&gt;  " Move to current directory&lt;/span&gt;
  &lt;span class="Statement"&gt;lcd&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;%&lt;/span&gt;&lt;span class="Identifier"&gt;:p:h&lt;/span&gt;

&lt;span class="Comment"&gt;  " Make&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l&lt;span class="vimFuncBody"&gt;:&lt;/span&gt;out&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;split&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Identifier"&gt;system&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;'make'&lt;/span&gt; &lt;span class="Statement"&gt;.&lt;/span&gt;&lt;span class="vimOperParen"&gt; l:args&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="vimOperParen"&gt;, &lt;/span&gt;&lt;span class="Constant"&gt;"\n"&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;
  &lt;span class="Statement"&gt;let&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l&lt;span class="vimFuncBody"&gt;:&lt;/span&gt;len&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;len&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;l:out&lt;span class="Special"&gt;)&lt;/span&gt;

&lt;span class="Comment"&gt;  " Output to quickfix&lt;/span&gt;
  &lt;span class="Statement"&gt;cgetexpr&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l:out
  &lt;span class="Statement"&gt;let&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;w&lt;span class="vimFuncBody"&gt;:&lt;/span&gt;&lt;span class="vimFuncBody"&gt;quickfix_title &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l:title

&lt;span class="Comment"&gt;  " If no output, just report success&lt;/span&gt;
  &lt;span class="Statement"&gt;if&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l:len&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;==&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
    &lt;span class="Statement"&gt;redraw&lt;/span&gt;
    &lt;span class="Statement"&gt;echo&lt;/span&gt; l&lt;span class="vimEcho"&gt;:&lt;/span&gt;&lt;span class="vimVar"&gt;title&lt;/span&gt;&lt;span class="vimEcho"&gt; . &lt;/span&gt;&lt;span class="Constant"&gt;' succeeded'&lt;/span&gt;
&lt;span class="Comment"&gt;  " If output is a single line, echo it&lt;/span&gt;
  &lt;span class="Statement"&gt;elseif&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;l:len&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;==&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;
    &lt;span class="Statement"&gt;cc&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;
    &lt;span class="Statement"&gt;redraw&lt;/span&gt;
    &lt;span class="Statement"&gt;echo&lt;/span&gt; l&lt;span class="vimEcho"&gt;:&lt;/span&gt;&lt;span class="vimVar"&gt;out&lt;/span&gt;&lt;span class="vimEcho"&gt;[0]&lt;/span&gt;
  &lt;span class="Statement"&gt;else&lt;/span&gt;
    &lt;span class="Statement"&gt;execute&lt;/span&gt; &lt;span class="Constant"&gt;'copen'&lt;/span&gt;&lt;span class="vimExecute"&gt; &lt;/span&gt;l&lt;span class="vimExecute"&gt;:&lt;/span&gt;&lt;span class="vimVar"&gt;len&lt;/span&gt;&lt;span class="vimExecute"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;+&lt;/span&gt;&lt;span class="vimExecute"&gt; 1&lt;/span&gt;
    &lt;span class="Statement"&gt;cc&lt;/span&gt;&lt;span class="vimFuncBody"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;
  &lt;span class="Statement"&gt;endif&lt;/span&gt;
&lt;span class="Statement"&gt;endfunction&lt;/span&gt;

&lt;span class="Statement"&gt;command&lt;/span&gt;! &lt;span class="Statement"&gt;-&lt;/span&gt;&lt;span class="PreProc"&gt;nargs&lt;/span&gt;&lt;span class="Statement"&gt;=?&lt;/span&gt;&lt;span class="vimUserCmd"&gt; &lt;/span&gt;Make&lt;span class="vimUserCmd"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;call&lt;/span&gt;&lt;span class="vimUserCmd"&gt; &lt;/span&gt;Make&lt;span class="vimUserCmd"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;"&amp;lt;args&amp;gt;"&lt;/span&gt;&lt;span class="vimUserCmd"&gt;)&lt;/span&gt;

&lt;span class="Statement"&gt;let&lt;/span&gt; g:make_loaded&lt;span class=""&gt; &lt;/span&gt;&lt;span class="Statement"&gt;=&lt;/span&gt;&lt;span class=""&gt; &lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;

&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/5tchvTeP1tk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/1907302203127934156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=1907302203127934156&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1907302203127934156?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1907302203127934156?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/5tchvTeP1tk/fast-make-for-vim.html" title="Fast Make for Vim" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2011/03/fast-make-for-vim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUBQH4zcSp7ImA9Wx9SEEg.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-1930900018415739738</id><published>2010-11-29T09:04:00.000-08:00</published><updated>2010-11-29T09:04:11.089-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-29T09:04:11.089-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Ruby Autoflush</title><content type="html">Google seems to need help with this particular association, so here goes.&lt;br /&gt;
&lt;br /&gt;
In Ruby, to flush currently buffered data just once, call &lt;code&gt;flush&lt;/code&gt; on the handle in question:&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;STDOUT.flush&lt;/code&gt;&lt;/blockquote&gt;To "autoflush", or continuously flush output immediately, set the &lt;code&gt;sync&lt;/code&gt; attribute:&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;STDOUT.sync = true&lt;/code&gt;&lt;/blockquote&gt;References:  &lt;a href="http://ruby-doc.org/core/classes/IO.html#M002278"&gt;flush&lt;/a&gt;, &lt;a href="http://ruby-doc.org/core/classes/IO.html#M002263"&gt;sync&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/QT4CWoYJvOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/1930900018415739738/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=1930900018415739738&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1930900018415739738?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1930900018415739738?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/QT4CWoYJvOM/ruby-autoflush.html" title="Ruby Autoflush" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.vicshih.com/2010/11/ruby-autoflush.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHRHs4cSp7ImA9WxFaGUQ.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-1424022963715713010</id><published>2010-04-25T22:37:00.000-07:00</published><updated>2010-07-24T11:50:35.539-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-24T11:50:35.539-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Keyboard Shortcuts for Facebook Photo Tagging</title><content type="html">Finally got around to tagging some photos in Facebook.  I probably would not have bothered, had &lt;a href="http://thegleebox.com/"&gt;gleeBox&lt;/a&gt; not made it a bit tolerable by providing some form of keyboard shortcuts for the process:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Created an "ESP vision" for the Page URL&lt;blockquote&gt;&lt;code&gt;facebook.com/photo.php&lt;/code&gt;&lt;/blockquote&gt;with the jQuery selector&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;#photoactions&amp;gt;a[onclick],input[type="submit"]&lt;br /&gt;&lt;s&gt;#photoactions&amp;gt;a:first-child,input[type="submit"]&lt;/s&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Changed my "Shortcut to launch gleeBox" to ";"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This allows tagging to go as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Navigate to a Facebook photo album&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Press &lt;b&gt;&lt;code&gt;;&amp;lt;ENTER&amp;gt;&lt;/code&gt;&lt;/b&gt; with left hand to enter tagging mode&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tag at will&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Press &lt;b&gt;&lt;code&gt;;&amp;lt;ENTER&amp;gt;&lt;/code&gt;&lt;/b&gt; again to leave tagging mode&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Left-click photo to move to the next photo&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;With the target crosshairs, it's about as close to an FPS you can get.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7/24/10 Update&lt;/b&gt;: Updated to skip new "Share" link.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/9MkT0mI5ioQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/1424022963715713010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=1424022963715713010&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1424022963715713010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1424022963715713010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/9MkT0mI5ioQ/keyboard-shortcuts-for-facebook-photo.html" title="Keyboard Shortcuts for Facebook Photo Tagging" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2010/04/keyboard-shortcuts-for-facebook-photo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4NQ3ozfCp7ImA9WxFSE0s.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-1422768748295092994</id><published>2010-04-15T12:41:00.000-07:00</published><updated>2010-04-15T12:49:52.484-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-15T12:49:52.484-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Mac Remote Desktop Connection Keyboard Shortcuts</title><content type="html">To send the three-finger salute, &lt;code&gt;Ctrl+Alt+Del&lt;/code&gt;, to a Windows box when you are connected using a Mac via Microsoft's Remote Desktop Connection, try &lt;code&gt;Ctrl+Option+Delete&lt;/code&gt; (&lt;code&gt;backspace&lt;/code&gt;).&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/ShhbJjjZ3rE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/1422768748295092994/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=1422768748295092994&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1422768748295092994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1422768748295092994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/ShhbJjjZ3rE/mac-remote-desktop-connection-keyboard.html" title="Mac Remote Desktop Connection Keyboard Shortcuts" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2010/04/mac-remote-desktop-connection-keyboard.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MMR389eSp7ImA9WxFTFEk.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-5217700397205071886</id><published>2010-04-04T21:48:00.000-07:00</published><updated>2010-04-04T22:31:26.161-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-04T22:31:26.161-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Edit "Save Password" Exceptions in Google Chrome for Mac OS X</title><content type="html">If you're a Google Chrome for Mac OS X user and you've ever hit "Never for this site" by accident (or have girlfriend who does so consistently), it's a little tricky finding out how to edit these "Save Password" exceptions.  It's pretty clear for Windows' Chrome:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;answer=156325"&gt;http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;answer=156325&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;but I had trouble finding a solution for the Mac.  A little snooping reveals that Chrome keeps its login information in a SQLite database file:&lt;blockquote&gt;&lt;code&gt;&lt;b&gt;~/Library/Application Support/Google/Chrome/Default/Login Data&lt;/b&gt;&lt;/code&gt;&lt;/blockquote&gt;To remove an entry from the exception list, do the following:&lt;ol&gt;&lt;li&gt;Shut down Chrome&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Probably a good idea to make a backup of the database file&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Open the database file in a SQLite database browser; I use &lt;a href='http://sqlitebrowser.sourceforge.net/'&gt;SQLite Database Browser&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Select the "Browse Data" tab&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Sites for which "Never for this Site" has been selected will have the value &lt;code&gt;1&lt;/code&gt; for the column &lt;code&gt;blacklisted_by_user&lt;/code&gt;. Double-click the desired cell, change the value to &lt;code&gt;0&lt;/code&gt;, and click "Apply Changes"&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Save and close the database file&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Restart Chrome&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/0EKHRtWhUhA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/5217700397205071886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=5217700397205071886&amp;isPopup=true" title="20 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5217700397205071886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5217700397205071886?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/0EKHRtWhUhA/edit-save-password-exceptions-in-google.html" title="Edit &quot;Save Password&quot; Exceptions in Google Chrome for Mac OS X" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>20</thr:total><feedburner:origLink>http://blog.vicshih.com/2010/04/edit-save-password-exceptions-in-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYMR38ycSp7ImA9Wx9UEEs.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-6526000087700882921</id><published>2009-04-27T09:49:00.000-07:00</published><updated>2011-02-06T23:19:46.199-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T23:19:46.199-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Ubiquity - Bugmenot command</title><content type="html">I like to use &lt;a href='http://www.bugmenot.com'&gt;BugMeNot&lt;/a&gt; when trying to access some websites which require registration, most frequently the New York Times.&lt;br /&gt;
&lt;br /&gt;
Bugmenot has a bookmarklet, but it opens a new window, and is therefore slow, and you have to copy and paste login information yourself.&lt;br /&gt;
&lt;br /&gt;
&lt;a href='https://wiki.mozilla.org/Labs/Ubiquity'&gt;Ubiquity&lt;/a&gt; is a command line interface to various things for Firefox.&lt;br /&gt;
&lt;br /&gt;
I've created a &lt;a href='http://gist.github.com/102363'&gt;Bugmenot command for Ubiquity&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Simply execute &lt;code&gt;bugmenot&lt;/code&gt; while viewing the desired login page, and the top-ranked Bugmenot entry will be populated and submitted.&lt;br /&gt;
&lt;br /&gt;
If that login has expired, you can specify an entry number as a parameter, from the list of entries in the Ubiquity preview pane.&lt;br /&gt;
&lt;br /&gt;
Get it at &lt;a href='http://gist.github.com/102363'&gt;http://gist.github.com/102363&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/SfXqcNBoS5I/AAAAAAAAAyo/IjDupqwCqUA/s1600-h/gr.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0; cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/SfXqcNBoS5I/AAAAAAAAAyo/IjDupqwCqUA/s320/gr.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329423504316582802" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style='clear: both'&gt;&lt;/div&gt;&lt;br /&gt;
Some code was borrowed from &lt;a href='http://www.yalazi.org/ubiquity/list.html'&gt;Onur Yalazı&lt;/a&gt; and Brandon Goldsworthy.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7/9/09 update&lt;/b&gt;: Updated to support Ubiquity's Parser 2. The old code is still available &lt;a href='http://gist.github.com/102363/39ebf2b60bf3db2a5c9cd80c334526dd71f899ae'&gt;here&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/Uff04v7uSaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/6526000087700882921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=6526000087700882921&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6526000087700882921?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6526000087700882921?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/Uff04v7uSaE/bugmenot-command-for-ubiquity.html" title="Ubiquity - &lt;a href='http://gist.github.com/102363'&gt;Bugmenot command&lt;/a&gt;" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_veBqaZQ0UaM/SfXqcNBoS5I/AAAAAAAAAyo/IjDupqwCqUA/s72-c/gr.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.vicshih.com/2009/04/bugmenot-command-for-ubiquity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMASX8_fyp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-1228022005259125577</id><published>2009-01-02T18:47:00.000-08:00</published><updated>2009-07-23T00:17:28.147-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T00:17:28.147-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Fix for Firefox’s Password Exporter Add-on</title><content type="html">&lt;b&gt;7/23/09 Update&lt;/b&gt;: Updated to be compatible up to Firefox 3.5.1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1/8/09 Update&lt;/b&gt;: If you tried installing the .xpi and got &amp;#8220;Firefox could not install the file at [...] because: Not a valid install package -207,&amp;#8221; please see the revised download instructions below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I like Firefox’s &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2848"&gt;Password Exporter Add-on&lt;/a&gt;, but recently I noticed a bug with version 1.1 (released January 5, 2008) when importing into Firefox 3.  Several entries return the following error:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;'Can't add a login with both a httpRealm and formSubmitURL.' when calling method: [nsILoginManager::addLogin]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I’ve posted the .xpi at &lt;a href="http://www.vicshih.com/files/password_exporter-1.1-fx_tb-formSubmitURL-fix.xpi"&gt; http://www.vicshih.com/files/password_exporter-1.1-fx_tb-formSubmitURL-fix.xpi&lt;/a&gt; (90.1KB).&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;Right-click and&lt;/strike&gt; Left-click this link, which should prompt Firefox to download to your machine.  My web page does a redirect, so right-clicking directly actually saves an intermediate web page, which is not what you want.  If in doubt, make sure file size is correct.  Drag to a browser window to install.&lt;br /&gt;&lt;br /&gt;Here’s the diff, in case you are queasy about installing my unsigned version.&lt;br /&gt;&lt;br /&gt;Within the file &lt;code&gt;chrome/content/passwordexporter.jar&lt;/code&gt;, in the file &lt;code&gt;content/pwdex-loginmanager.js&lt;/code&gt;,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;540,541c540,549&lt;br /&gt;&amp;lt;                &lt;br /&gt;&amp;lt;                 var bogusLoginInfo = new nsLoginInfo(entries[i].hostname, 'http://passwordexporter',&lt;br /&gt;---&lt;br /&gt;&amp;gt;     var doModify = false;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;     var formSubmitURL = entries[i].formSubmitURL;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;     if (formSubmitURL) {&lt;br /&gt;&amp;gt;      formSubmitURL = '';&lt;br /&gt;&amp;gt;      doModify = true;&lt;br /&gt;&amp;gt;     }&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;                 var bogusLoginInfo = new nsLoginInfo(entries[i].hostname, formSubmitURL,&lt;br /&gt;548c556&lt;br /&gt;&amp;lt;                     loginManager.modifyLogin(bogusLoginInfo, entries[i]);&lt;br /&gt;---&lt;br /&gt;&amp;gt;                     if (doModify) loginManager.modifyLogin(bogusLoginInfo, entries[i]);&lt;br /&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/YZHoUa0sz8U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/1228022005259125577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=1228022005259125577&amp;isPopup=true" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1228022005259125577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/1228022005259125577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/YZHoUa0sz8U/fix-for-firefoxs-password-exporter-add.html" title="Fix for Firefox’s Password Exporter Add-on" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>21</thr:total><feedburner:origLink>http://blog.vicshih.com/2009/01/fix-for-firefoxs-password-exporter-add.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AASX0yfyp7ImA9WxRWGEQ.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-8332897720724366671</id><published>2008-11-04T22:40:00.000-08:00</published><updated>2008-11-05T06:35:48.397-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-05T06:35:48.397-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Shortcut to Toggle Firefox Bookmarks Toolbar (like Chrome)</title><content type="html">One of the things I've really liked about Google Chrome is the ability to toggle the bookmarks toolbar with a quick &lt;code&gt;Ctrl+B&lt;/code&gt;.  I hunted around for this ability in Firefox but it took a little finagling -- here's the how-to:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Install &lt;a href="http://forums.mozillazine.org/viewtopic.php?t=72994"&gt;Keyconfig&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Open Keyconfig's configuration dialog via "Tools | Keyconfig..." or &lt;code&gt;Ctrl+Shift+F12&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;If you want to use &lt;code&gt;Ctrl+B&lt;/code&gt; to toggle the Bookmarks Toolbar, first disable the default association to "Bookmarks" by selecting it and clicking the "Disable" button.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Click the "Add a new key" button and fill out the form using the following:&lt;br /&gt;   &lt;ul&gt;&lt;br /&gt;     &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;&amp;nbsp;&amp;nbsp; &lt;code&gt;Toggle Bookmarks Toolbar&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;     &lt;li&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;pre&gt;var b = document.getElementById('PersonalToolbar');&lt;br /&gt;b.collapsed = !b.collapsed;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;div style='clear: both'&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_veBqaZQ0UaM/SRFIJ8MnJRI/AAAAAAAAAuk/WDRikld7T7E/s1600-h/keyconfig1.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 335px; height: 260px;" src="http://2.bp.blogspot.com/_veBqaZQ0UaM/SRFIJ8MnJRI/AAAAAAAAAuk/WDRikld7T7E/s400/keyconfig1.PNG" alt="" id="BLOGGER_PHOTO_ID_5265068774987867410" border="0" /&gt;&lt;/a&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt; &lt;li&gt;Click "OK."&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Select your new key, select the text field, type your desired shortcut (&lt;code&gt;Ctrl+B&lt;/code&gt;, for example), and click "Apply."&lt;div style='clear: both'&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/SRFG3L1ApUI/AAAAAAAAAuc/RfBr6pGKssU/s1600-h/keyconfig.PNG"&gt;&lt;img style="margin: 0pt 10pt 10px 0px; float: left; cursor: pointer; width: 338px; height: 304px;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/SRFG3L1ApUI/AAAAAAAAAuc/RfBr6pGKssU/s400/keyconfig.PNG" alt="" id="BLOGGER_PHOTO_ID_5265067353254700354" border="0" /&gt;&lt;/a&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;Your shortcut will be active in the next window opened.  Yay nerdiness!&lt;br /&gt;&lt;br /&gt;Another key I've added is a shortcut to toggle the status bar.  Here's the code:&lt;pre&gt;var s = document.getElementById('status-bar');&lt;br /&gt;s.hidden = !s.hidden;&lt;/pre&gt;  Enjoy!&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/bx5S34d56fI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/8332897720724366671/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=8332897720724366671&amp;isPopup=true" title="20 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8332897720724366671?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8332897720724366671?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/bx5S34d56fI/toggle-firefox-bookmarks-toolbar.html" title="Shortcut to Toggle Firefox Bookmarks Toolbar (like Chrome)" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_veBqaZQ0UaM/SRFIJ8MnJRI/AAAAAAAAAuk/WDRikld7T7E/s72-c/keyconfig1.PNG" height="72" width="72" /><thr:total>20</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/11/toggle-firefox-bookmarks-toolbar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AHRHg8fSp7ImA9WxRXEEU.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-6989133579275693082</id><published>2008-04-12T15:56:00.000-07:00</published><updated>2008-10-15T08:48:55.675-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-15T08:48:55.675-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Todoist Sidebar - Firefox Add-On</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_veBqaZQ0UaM/SAE630LIWiI/AAAAAAAAAfk/CfKK3BVZJSA/s1600-h/1-login.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_veBqaZQ0UaM/SAE630LIWiI/AAAAAAAAAfk/CfKK3BVZJSA/s320/1-login.png" alt="" id="BLOGGER_PHOTO_ID_5188492976280066594" border="0" /&gt;&lt;/a&gt;&lt;b&gt;Note&lt;/b&gt;:  please see the latest &lt;a href='#10_15_08_update'&gt;update&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I recently switched from Google Notebook to &lt;a href="http://todoist.com/"&gt;Todoist&lt;/a&gt; for my to-do lists.  I'd searched a while for a list manager that could do hierarchical tasks, and Todoist looks like the only one that does, at least for free.  It does hierarchical projects too, in fact.&lt;br /&gt;&lt;br /&gt;One hack I saw on their site described a way to load Todoist into Firefox's sidebar, basically by bookmarking a &lt;a href="http://todoist.com/?mini=1"&gt;simplified view&lt;/a&gt; of the site and checking "Load this bookmark in the sidebar."  Nice!&lt;br /&gt;&lt;br /&gt;My joy soon soured though, when I noticed that adding a task has the side-effect of loading the Todoist website into the main browser window, browsing over whatever site you already have in the current tab.  Not so nice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_veBqaZQ0UaM/SAE630LIWjI/AAAAAAAAAfs/I7LsO5n5-ZM/s1600-h/2-list.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_veBqaZQ0UaM/SAE630LIWjI/AAAAAAAAAfs/I7LsO5n5-ZM/s320/2-list.png" alt="" id="BLOGGER_PHOTO_ID_5188492976280066610" border="0" /&gt;&lt;/a&gt;Plus, I don't like the fact the button to open the sidebar (really just a bookmark) doesn't toggle -- to close the sidebar, you have to mouse &lt;em&gt;all the way over to the sidebar's close button&lt;/em&gt;!  Ridiculous!  And though you can define a keyword for the bookmark which allows easy access through the address bar, there's no way to define a keyboard shortcut to hide the sidebar.&lt;br /&gt;&lt;br /&gt;So, I put together a Firefox add-on which solves these problems, which I have creatively christened Todoist Sidebar.&lt;br /&gt;&lt;br /&gt;Some perhaps non-obvious things to note:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Left-click&lt;/span&gt; the toolbar button to toggle the Todoist sidebar.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Middle-click&lt;/span&gt; the toolbar button to open Todoist in a new tab.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;The default keyboard shortcut is &lt;code&gt;&lt;span style="font-weight: bold;"&gt;Alt+Shift+2&lt;/span&gt;&lt;/code&gt; on Windows and Linux, and &lt;code&gt;&lt;span style="font-weight: bold;"&gt;Cmd+Shift+2&lt;/span&gt;&lt;/code&gt; on the Mac.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;The keyboard shortcut can be &lt;span style="font-weight: bold;"&gt;customized&lt;/span&gt; by modifying the string values&lt;br /&gt;&lt;code&gt;todoist-sidebar.key&lt;/code&gt; and &lt;code&gt;todoist-sidebar.modifiers&lt;/code&gt; in &lt;code&gt;about:config&lt;/code&gt;, according to Mozilla's &lt;a href="http://developer.mozilla.org/en/docs/XUL:key"&gt;XUL:key specification&lt;/a&gt;.  A Firefox restart is required for the changes to take effect.  Setting either of these values to blank disables the keyboard shortcut.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/SAE64ELIWkI/AAAAAAAAAf0/-P9zwzjZpos/s1600-h/3-add-item.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/SAE64ELIWkI/AAAAAAAAAf0/-P9zwzjZpos/s320/3-add-item.png" alt="" id="BLOGGER_PHOTO_ID_5188492980575033922" border="0" /&gt;&lt;/a&gt;All of this will probably be moot once Google continues their world conquest by rolling out their Calendar tasks implementation.  But hey, it will be fun while it lasts...&lt;br /&gt;&lt;br /&gt;Right now the add-on is hosted in the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/7007"&gt;Firefox add-on sandbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name='10_15_08_update'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;10/15/08 update&lt;/b&gt;: Okay, Amir, the creator of Todoist, contacted me a bit ago all the way from Denmark to collaborate on the Todoist Sidebar, and he has updated it and now maintains it on the Todoist website!  He blogged about it at &lt;a href='http://amix.dk/blog/viewEntry/19333'&gt;http://amix.dk/blog/viewEntry/19333&lt;/a&gt;.  Please go there to install.  Woohoo!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5/15/08 update&lt;/b&gt;: Hm, it seems to still exhibit the naughty toggle behavior described in the comments on initial install.  Restarting Firefox makes the problem go away.  I'll look into this at some point.  Lame!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4/28/08 update&lt;/b&gt;: Version 1.0.2 fixes the previously mentioned bug where any key press triggers the sidebar.  Also the default key accelerator is now &lt;code&gt;Alt+Shift+2&lt;/code&gt; for Windows and Linux, and &lt;code&gt;Cmd+Shift+2&lt;/code&gt; for the Mac.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4/26/08 update&lt;/b&gt;: Please note that currently there is a bug with the default installation where every key press toggles the sidebar (see comments).  This is due to my incorrectly implementing the default shortcut key.  Also, the intended default is a bit problematic because it tends to interfere with the Tools menu accelerator.&lt;br /&gt;&lt;br /&gt;I plan to change the default to &lt;code&gt;Alt+Shift+2&lt;/code&gt; (&lt;code&gt;Cmd+Shift+2&lt;/code&gt; on the Mac) when I get the chance.  In the meantime, you can do this yourself by setting &lt;code&gt;todoist-sidebar.key&lt;/code&gt; to "&lt;b&gt;2&lt;/b&gt;" and &lt;code&gt;todoist-sidebar.modifiers&lt;/code&gt; to "&lt;b&gt;alt shift&lt;/b&gt;" for Windows/Linux or "&lt;b&gt;accel shift&lt;/b&gt;" for the Mac in &lt;code&gt;about:config&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4/24/08 update&lt;/b&gt;: Please note that some users are experiencing behavior where every key they type (or some subset) toggles the sidebar (see comments).  This may possibly be remedied by fiddling with the &lt;code&gt;todoist-sidebar.modifiers&lt;/code&gt; setting in &lt;code&gt;about:config&lt;/code&gt;.  Please be patient and I'll look into this shortly.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/IlIPfa2jzS4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/6989133579275693082/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=6989133579275693082&amp;isPopup=true" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6989133579275693082?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6989133579275693082?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/IlIPfa2jzS4/todoist-sidebar.html" title="Todoist Sidebar - &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/7007&quot;&gt;Firefox Add-On&lt;/a&gt;" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_veBqaZQ0UaM/SAE630LIWiI/AAAAAAAAAfk/CfKK3BVZJSA/s72-c/1-login.png" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/04/todoist-sidebar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGQns4fSp7ImA9WxBVGUU.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-6610323761174494996</id><published>2008-04-08T03:06:00.000-07:00</published><updated>2010-02-23T19:18:43.535-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T19:18:43.535-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Move to Trash from the Mac Command Line</title><content type="html">I was about to make a lengthy comment to a &lt;a href="http://lifehacker.com/software/geek-to-live/useful-command-line-tricks-for-mac-users-302197.php"&gt;post&lt;/a&gt; on &lt;a href="http://lifehacker.com/"&gt;Life Hacker&lt;/a&gt;  and decided to put most of it here instead.  That site is seriously starting to take over my life.&lt;br /&gt;&lt;br /&gt;A while back I wrote this shell function to be able to move files to the trash from the command line on my Mac, rather than condemning them to oblivion with no chance of return.  This is in my &lt;code&gt;.profile&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;It's a little hairy looking but it does the job.  Note that it attempts to append names with a date stamp if a file/directory with that name already exists in the trash, just as the Finder does.&lt;br /&gt;&lt;pre&gt;function del() {&lt;br /&gt;  while [ -n "$1" ]; do&lt;br /&gt;    if [ ! -e "$1" ]; then&lt;br /&gt;      echo "'$1' not found; exiting"&lt;br /&gt;      return&lt;br /&gt;    fi  &lt;br /&gt;&lt;br /&gt;    local file=`basename -- "$1"`&lt;br /&gt;&lt;br /&gt;    # Chop trailing '/' if there&lt;br /&gt;    file=${file%/}&lt;br /&gt;&lt;br /&gt;    local destination=''&lt;br /&gt;&lt;br /&gt;    if [ -e "$HOME/.Trash/$file" ]; then&lt;br /&gt;      # Extract file and extension&lt;br /&gt;      local ext=`expr "$file" : ".*\(\.[^\.]*\)$"`&lt;br /&gt;      local base=${file%$ext}&lt;br /&gt;&lt;br /&gt;      # Add a space between base and timestamp&lt;br /&gt;      test -n "$base" &amp;&amp; base="$base "&lt;br /&gt;&lt;br /&gt;      destination="/$base`date +%H-%M-%S`_$RANDOM$ext"&lt;br /&gt;    fi  &lt;br /&gt;&lt;br /&gt;    echo "Moving '$1' to '$HOME/.Trash$destination'"&lt;br /&gt;    \mv -i -- "$1" "$HOME/.Trash$destination" || return&lt;br /&gt;    shift&lt;br /&gt;  done&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;alias rm='del'&lt;/pre&gt;An interesting side-effect is that&lt;br /&gt;&lt;pre&gt;rm &amp;lt;directory&amp;gt;&lt;/pre&gt; works as well, which is a little uncanny because ordinarily either &lt;code&gt;rmdir &amp;lt;directory&amp;gt;&lt;/code&gt; (for an empty directory) or &lt;code&gt;rm -rf&lt;/code&gt; is required.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2/23/10 update&lt;/b&gt;: Handle case where rm options are mistakenly specified.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7/4/08 update&lt;/b&gt;: Fixed problem when removing file names containing spaces.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/m8yT3x5sIcg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/6610323761174494996/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=6610323761174494996&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6610323761174494996?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/6610323761174494996?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/m8yT3x5sIcg/move-to-trash-from-mac-command-line.html" title="Move to Trash from the Mac Command Line" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/04/move-to-trash-from-mac-command-line.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXs4eyp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-8409303260644163142</id><published>2008-04-07T10:34:00.000-07:00</published><updated>2008-05-03T02:57:44.533-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:57:44.533-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>Apologies</title><content type="html">Sorry, I can't get enough of reading my own type (and corrections).  I replied to &lt;a href="http://www.xanga.com/SonOfPethuel/643819708/item.html"&gt;SonOfPethuel's blog&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/0-aeyBDFnlY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/8409303260644163142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=8409303260644163142&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8409303260644163142?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8409303260644163142?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/0-aeyBDFnlY/apologies.html" title="Apologies" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/04/apologies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DQ3syfCp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-4356310611159812399</id><published>2008-04-04T19:39:00.000-07:00</published><updated>2008-05-03T02:46:12.594-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:46:12.594-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Create Firefox Multiple-Item Packages - maddon.py</title><content type="html">I have a (growing) list of Firefox add-ons that I use all the time, so whenever I am customizing a clean machine, it's a tedious process browsing to each add-on's page and going through the installation procedure repeatedly.&lt;br /&gt;&lt;br /&gt;I learned that the Mozilla framework supports Multiple-Item Packages -- multiple add-ons and/or themes grouped together in a single file.  I've written a Python script which takes a list of add-ons and themes in any format I could think of and generates a multiple-item package for you -- &lt;a href="http://www.vicshih.com/files/maddon.py"&gt;maddon.py&lt;/a&gt;, for "multiple add-on."  You can pass to it:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;local .xpi/jar files&lt;br /&gt;&lt;li&gt;directories of .xpi/jar files&lt;br /&gt;&lt;li&gt;text files, with each line containing a .xpi/jar file&lt;br /&gt;&lt;li&gt;remote URLs&lt;br /&gt;&lt;li&gt;websites which will get scraped for .xpi/jar files&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I use the text file &lt;a href="http://www.vicshih.com/files/VicsAddons.txt"&gt;VicsAddons.txt&lt;/a&gt; to generate my personal add-on favorites:&lt;br /&gt;&lt;pre&gt;# Download Statusbar&lt;br /&gt;https://addons.mozilla.org/en-US/firefox/addon/26&lt;br /&gt;# Google Browser Sync&lt;br /&gt;http://tools.google.com/firefox/browsersync/install.html&lt;br /&gt;# CustomizeGoogle&lt;br /&gt;https://addons.mozilla.org/en-US/firefox/addon/743&lt;br /&gt;# Better Gmail 2&lt;br /&gt;http://lifehacker.com/software/exclusive-lifehacker-download/better-gmail-2-firefox-extension-for-new-gmail-320618.php&lt;br /&gt;# Better GCal&lt;br /&gt;http://lifehacker.com/software/exclusive-lifehacker-download/enhance-google-calendar-with-the-better-gcal-firefox-extension-260074.php&lt;br /&gt;# Better GReader&lt;br /&gt;http://lifehacker.com/software/exclusive-lifehacker-download/trick-out-google-reader-with-better-greader-262020.php&lt;br /&gt;# Adblock&lt;br /&gt;https://addons.mozilla.org/en-US/firefox/addon/10&lt;br /&gt;# dragdropupload&lt;br /&gt;https://addons.mozilla.org/en-US/firefox/addon/2190&lt;br /&gt;# Firebug&lt;br /&gt;http://getfirebug.com/&lt;br /&gt;# Google Gears&lt;br /&gt;http://dl.google.com/gears/current/gears-osx-opt.xpi&lt;br /&gt;# PicLens&lt;br /&gt;http://www.piclens.com/site/firefox/tutorial_pl_ff.php&lt;/pre&gt;&lt;br /&gt;Running it produces the following output:&lt;br /&gt;&lt;pre&gt;$ maddon.py VicsAddons.txt&lt;br /&gt;Parsing 'VicsAddons.txt'&lt;br /&gt;Parsing 'https://addons.mozilla.org/en-US/firefox/addon/26'&lt;br /&gt;Scanning page...&lt;br /&gt;Downloading 'https://addons.mozilla.org/en-US/firefox/downloads/file/24860/download_statusbar-0.9.6.1-fx.xpi'&lt;br /&gt;Adding 'download_statusbar-0.9.6.1-fx.xpi'&lt;br /&gt;Parsing 'http://tools.google.com/firefox/browsersync/install.html'&lt;br /&gt;Scanning page...&lt;br /&gt;Downloading 'http://dl.google.com/firefox/google-browsersync.xpi'&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;Created 'VicsAddons.xpi' with the following files:&lt;br /&gt;download_statusbar-0.9.6.1-fx.xpi&lt;br /&gt;google-browsersync.xpi&lt;br /&gt;customizegoogle-0.71-fx+sm.xpi&lt;br /&gt;bettergmail2_0.3.4.xpi&lt;br /&gt;bettergcal_0.2.2.xpi&lt;br /&gt;bettergreader_0.2.2.xpi&lt;br /&gt;adblock-0.5.3.043-fx+fl+mz+ns.xpi&lt;br /&gt;dragdropupload-1.5.25-fx.xpi&lt;br /&gt;firebug1.0-current.xpi&lt;br /&gt;firebug-1.1.0b12.xpi&lt;br /&gt;gears-osx-opt.xpi&lt;br /&gt;piclens-mac-release-1.6.2.1659.xpi&lt;br /&gt;install.rdf&lt;/pre&gt;&lt;br /&gt;I can then drag &lt;code&gt;VicsAddons.xpi&lt;/code&gt; to a Firefox window, and all add-ons and themes are installed in one fell swoop (restarting Firefox still required, unfortunately).&lt;br /&gt;&lt;br /&gt;Note that since Firebug has both its current and beta versions on the same web page, &lt;code&gt;maddon.py&lt;/code&gt; adds them both, which could be problematic.  I could reference the exact desired .xpi version, but this loses the benefit of retrieving the latest version when run.  Ah, trade-offs.&lt;br /&gt;&lt;br /&gt;Here is the help.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;usage: maddon.py [options] &amp;lt;file_or_directory&amp;gt; [...]&lt;br /&gt;&lt;br /&gt;Create a multiple-item XPI.  The &amp;lt;file_or_directory&amp;gt; argument(s) can be any of the following:&lt;br /&gt;&lt;br /&gt;  .(xpi|jar) file - added directly to bundle&lt;br /&gt;  URL, .webloc file&lt;br /&gt;                  - if ends with '.(xpi|jar)', will be downloaded and add to bundle;&lt;br /&gt;                    otherwise, the web page is scanned for links ending with '.(xpi|jar)'&lt;br /&gt;  directory       - scanned for files satisfying any of the above requirements&lt;br /&gt;  text file       - each line is scanned as if it were given as a parameter.  Lines beginning&lt;br /&gt;                    with '"', '#', '!', or ':' are considered comments&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/hE5jPsW2uuM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/4356310611159812399/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=4356310611159812399&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/4356310611159812399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/4356310611159812399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/hE5jPsW2uuM/create-firefox-multiple-item-packages.html" title="Create Firefox Multiple-Item Packages - &lt;a href=&quot;http://www.vicshih.com/files/maddon.py&quot;&gt;maddon.py&lt;/a&gt;" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/04/create-firefox-multiple-item-packages.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DQ3syfCp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-7059158001433788514</id><published>2008-03-28T11:00:00.000-07:00</published><updated>2008-05-03T02:46:12.594-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:46:12.594-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Find Duplicate Files - dups.py</title><content type="html">I have a lot of images imported at different times and from different sources, and I wanted a quick way to find duplicates.  Not finding a satisfactory (read: free) solution (though I admittedly didn't do a very exhaustive search), I took this opportunity to learn Python and came up with &lt;a href="http://www.vicshih.com/files/dups.py"&gt;dups.py&lt;/a&gt;.  Note that the file displays within a frame, so you might have to view frame source to get to the actual code.&lt;br /&gt;&lt;br /&gt;Without arguments, &lt;code&gt;dups.py&lt;/code&gt; checks the current directory, recursively:&lt;br /&gt;&lt;pre&gt;$ dups.py&lt;br /&gt;Duplicates found:&lt;br /&gt;./Data/2004/05_4/015_12A.jpg&lt;br /&gt;./Data/2004/2004.09.29 Grandma/015_12A.jpg&lt;br /&gt;Duplicates found:&lt;br /&gt;./Data/2002/19/uvs021219-008.jpg&lt;br /&gt;./Data/2006/01_2/uvs040430-006.jpg&lt;br /&gt;  ...&lt;/pre&gt;This has been tested on the Mac OS X and cygwin, and should also work with Python for Windows.&lt;br /&gt;&lt;br /&gt;There are lots of nerdy options, like filtering by file size and following symbolic links.  Try &lt;code&gt;dups.py -h&lt;/code&gt; to see them all:&lt;br /&gt;&lt;pre&gt;usage: dups.py [options] [&amp;lt;file_or_directory&amp;gt; ...]&lt;br /&gt;&lt;br /&gt;Find duplicate files in the given path(s).  Defaults to searching files recursively,&lt;br /&gt;except for hidden files (beginning with "."), empty files, and symbolic links.&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  --version             show program's version number and exit&lt;br /&gt;  -h, --help            show this help message and exit&lt;br /&gt;  -v, --verbose         verbose&lt;br /&gt;&lt;br /&gt;  Exclusion Options:&lt;br /&gt;    -f, --flat          do not scan directories recursively&lt;br /&gt;    -g n, --greater-than=n&lt;br /&gt;                        only scan files of size greater than n bytes&lt;br /&gt;    -l n, --less-than=n&lt;br /&gt;                        only scan files of size less than n bytes&lt;br /&gt;&lt;br /&gt;  Inclusion Options:&lt;br /&gt;    -L, --follow-links  follow symbolic links (warning: beware of infinite&lt;br /&gt;                        loops)&lt;br /&gt;    -H, --hidden-files  include hidden files&lt;br /&gt;    -z, --zero-files    include empty files&lt;br /&gt;&lt;br /&gt;  Miscellaneous:&lt;br /&gt;    -D, --delete        delete subsequent duplicates (files are scanned in&lt;br /&gt;                        argument-list order)&lt;br /&gt;    -c, --create-rel-links&lt;br /&gt;                        replace subsequent duplicates with relative links&lt;br /&gt;                        (non-Windows only)&lt;br /&gt;    -C, --create-abs-links&lt;br /&gt;                        same as "-c", but links are absolute&lt;br /&gt;    -s, --special-hidden&lt;br /&gt;                        changes meaning of "hidden files" (-H) depending on&lt;br /&gt;                        platform:  cygwin - uses Windows file attributes&lt;br /&gt;                        (warning: slow); win32 - files with names starting&lt;br /&gt;                        with "." considered hidden&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;P.S. I hacked together a way to detect Windows hidden files from cygwin but it's ugly and slow.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4/6/08 update&lt;/b&gt;: I added the ability to delete duplicates (-D), and create relative (-c) or absolute (-C) symbolic links.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/VFfW68rMzk0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/7059158001433788514/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=7059158001433788514&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7059158001433788514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7059158001433788514?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/VFfW68rMzk0/find-duplicate-files.html" title="Find Duplicate Files - &lt;a href=&quot;http://www.vicshih.com/files/dups.py&quot;&gt;dups.py&lt;/a&gt;" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/03/find-duplicate-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DQ3syfSp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-5553265522500949105</id><published>2008-03-01T17:06:00.000-08:00</published><updated>2008-05-03T02:46:12.595-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:46:12.595-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Hacking Lite - Evading Coffee Shop Banners</title><content type="html">This is mostly a note to myself and not intended to express approval of the behavior described ;-)&lt;br /&gt;&lt;br /&gt;Occasionally I like to bring my laptop to a nearby coffee shop to get some work done without all of the distractions of my apartment.  My favorite place has been a &lt;a href="http://losangeles.citysearch.com/profile/32776025/"&gt;Tanner's Coffee Company&lt;/a&gt; within walking distance of my place.  It's a little noisy sometimes, and the food isn't the freshest, but the drinks are decent and I seem to get a lot done whenever I'm there.&lt;br /&gt;&lt;br /&gt;Their wireless offering injects an ad banner at the top of every page.  This alone would not be prohibitively annoying since adblock successfully strips the ads, leaving only the banner, but what does tend to dampen the customer experience is that it breaks some sites, Google Reader in particular.  Because of this, I started to do a little tinkering...&lt;br /&gt;&lt;br /&gt;I figured they didn't inject all internet traffic, since I'm able to ssh without problems.  Maybe they detect requests to servers at port 80?  I toyed with the idea of using a local proxy server, blah blah blah...&lt;br /&gt;&lt;br /&gt;Turns out, they actually filter on the user agent field within HTTP requests!  This means that if you're using Firefox or Safari (or, I imagine, Internet Explorer), the banner will be injected; Opera, however, is ad-free.  This also means that simply changing the user agent field that your browser declares in its HTTP requests sets you (ad) free as well.&lt;br /&gt;&lt;br /&gt;In Firefox there are a number of ways to do this:  install a &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/59"&gt;Firefox extension&lt;/a&gt;, or simply add a string value to &lt;code&gt;about:config&lt;/code&gt; named:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;general.useragent.override&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;with a value like&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Opera/9.26 (Macintosh; Intel Mac OS X; U; en)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;as described &lt;a href="http://johnbokma.com/mexit/2004/04/24/changinguseragent.html"&gt;here&lt;/a&gt;.  It's probably a good idea to stick with a realistic user agent string as opposed to something arbitrary, since websites like Gmail may switch to less functional versions if they don't recognize your browser.&lt;br /&gt;&lt;br /&gt;A quick way to determine your browser's user agent is &lt;a href="javascript:document.write(navigator.userAgent)" target="_new"&gt;javascript:document.write(navigator.userAgent)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The service responsible for the ads at this particular Tanner's (I think they're all independently owned) seems to be a company named &lt;a href="http://box.anchorfree.net/ad-free.php?tag=AFGL00001100"&gt;AnchorFree&lt;/a&gt;.  Chances are, this technique could work for ad-injection schemes used by other wi-fi spots.&lt;br /&gt;&lt;br /&gt;Done and done.  Back to high-quality coffee shop web surfing!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5/1/08 update&lt;/b&gt;: Okay, I'm dumb.  A much easier way to do this is to add the filter&lt;br /&gt;&lt;br /&gt;*.anchorfree.*&lt;br /&gt;&lt;br /&gt;in &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1865"&gt;AdBlock Plus&lt;/a&gt;.  This solves the problem much more elegantly and doesn't run into issues with sites not supporting your supposed user agent.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/tC68_lChbfA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/5553265522500949105/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=5553265522500949105&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5553265522500949105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5553265522500949105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/tC68_lChbfA/hacking-lite.html" title="Hacking Lite - Evading Coffee Shop Banners" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/03/hacking-lite.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQGRX49eCp7ImA9WxZaGEw.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-5598023676453130345</id><published>2008-02-05T23:24:00.000-08:00</published><updated>2008-05-03T03:58:44.060-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T03:58:44.060-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nerdiness" /><title>Navigate Gmail Using Your Apple Remote</title><content type="html">&lt;p&gt;When I first got my Mac, I was really impressed with Front Row and how easy it was to manage all of my media with an interface as sparse and simple as the Apple Remote.  Yet, there was one thing that left me wanting -- "If only I could use it to check my email," I thought wistfully.  "I'd never leave my couch!"&lt;/p&gt;&lt;p&gt;Finally, my ambition for laziness can now satisfied!  Though lacks the shiny polish of Front Row, an application called &lt;a href="http://www.filewell.com/iRedLite/"&gt;iRed Lite&lt;/a&gt; allows mere mortals to customize the behavior of the Apple Remote.  I've written what's called a "layer" in the iRed Lite parlance, which is basically a set of actions tailored for a specific application.&lt;/p&gt;&lt;p&gt;If this is something you're interested in trying out, a couple of caveats about my solution:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It assumes you are running Firefox. &lt;/li&gt;&lt;li&gt;It assumes you are always logged into Gmail (by checking "Remember me on this computer" at login). &lt;/li&gt;&lt;li&gt;So far it seems that iRed Lite cannot save an entire layer at once; each action must be saved as a separate script.  I've created an archive called &lt;a href="http://www.vicshih.com/files/iRedLite_Gmail.zip"&gt;iRedLite_Gmail.zip&lt;/a&gt; consisting of actions which I map in the following manner:&lt;/li&gt;&lt;/ul&gt;&lt;table style="border-collapse: collapse;" align="center" cellpadding="6" border="1" width="350"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="right"&gt;Open - browse to Gmail&lt;/td&gt;&lt;td align="center"&gt;double-click play&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Open conversation (o)&lt;/td&gt;&lt;td align="center"&gt;play&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Back to conversation list (u)&lt;/td&gt;&lt;td align="center"&gt;left&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Star conversation (s)&lt;/td&gt;&lt;td align="center"&gt;hold play&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Previous conversation (k)&lt;/td&gt;&lt;td align="center"&gt;up&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Next conversation (j)&lt;/td&gt;&lt;td align="center"&gt;down&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Previous message (p)&lt;/td&gt;&lt;td align="center"&gt;right&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Scroll down&lt;/td&gt;&lt;td align="center"&gt;double-click down&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Scroll up&lt;/td&gt;&lt;td align="center"&gt;double-click up&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Increase text size (cmd-=)&lt;/td&gt;&lt;td align="center"&gt;double-click right&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Decrease text size (cmd--)&lt;/td&gt;&lt;td align="center"&gt;double-click left&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Of course you can easily remap them any way you wish.  Beware that iRed Lite tends to crash here and there, though -- save early, save often.&lt;/p&gt;&lt;p&gt;To recap, first download and install &lt;a href="http://www.filewell.com/iRedLite/"&gt;iRed Lite&lt;/a&gt;.  Then download and unzip &lt;a href="http://www.vicshih.com/files/iRedLite_Gmail.zip"&gt;iRedLite_Gmail.zip&lt;/a&gt;, create a new layer and import the actions defined in each file in the archive.&lt;/p&gt;&lt;p&gt;&lt;b&gt;3/15/08 update&lt;/b&gt;:  Thanks everyone for your comments!  To summarize:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;My actions have been grouped into one file &lt;a href="http://www.filewell.com/iRedLite/downloads/GMail.irla.zip"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;You need to enable keyboard shortcuts in your Gmail Settings for this to work.&lt;/li&gt;&lt;li&gt;This doesn't play well with Firefox Beta 3; I'll do what I can to tinker with this:&lt;ul&gt;&lt;li&gt;You'll need to change the "increase font size" shortcut to send "cmd-+" instead of "cmd-=".&lt;/li&gt;&lt;li&gt;"Open Gmail" doesn't work.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I will work on a Google Reader version at some point.  I will incorporate everyone's suggestions and post updates here.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/s2oUwSEgoNs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/5598023676453130345/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=5598023676453130345&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5598023676453130345?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5598023676453130345?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/s2oUwSEgoNs/navigate-your-gmail-using-your-apple.html" title="Navigate Gmail Using Your Apple Remote" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.vicshih.com/2008/02/navigate-your-gmail-using-your-apple.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXs4fCp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-7628351885808992925</id><published>2007-08-12T22:58:00.000-07:00</published><updated>2008-05-03T02:57:44.534-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:57:44.534-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>From Your Side</title><content type="html">&lt;p&gt;Here are the lyrics to a song I wrote back in my less heathenistic days.  I have an entry on my to-do list to record this some day but I haven't been very motivated to get it done.&lt;/p&gt;&lt;blockquote&gt;&lt;h3&gt;From Your Side&lt;/h3&gt;There was a day&lt;br /&gt;I thought I knew just what I wanted&lt;br /&gt;But my heart had gotten in the way&lt;/blockquote&gt;&lt;blockquote&gt;There was no use&lt;br /&gt;I was sullen as a stone&lt;br /&gt;I didn't have a thing to say&lt;/blockquote&gt;&lt;blockquote&gt;I wish that you could carve my heart&lt;br /&gt;So that I could have another start&lt;/blockquote&gt;&lt;blockquote&gt;But we all have our demons&lt;br /&gt;And I know you have your reasons&lt;br /&gt;I just wish I could see the other side&lt;/blockquote&gt;&lt;blockquote&gt;What does it really matter&lt;br /&gt;You tell me there's an answer&lt;br /&gt;But I can't help thinking that there must be more&lt;/blockquote&gt;&lt;blockquote&gt;I know it's not about me&lt;br /&gt;But sometimes it's not so easy&lt;br /&gt;I know the picture's bigger from your side&lt;br /&gt;From your side&lt;/blockquote&gt;&lt;blockquote&gt;There is a way&lt;br /&gt;And though I know which way to go&lt;br /&gt;It doesn't wash the pain away&lt;/blockquote&gt;&lt;blockquote&gt;So now today&lt;br /&gt;There is something I've got to do&lt;br /&gt;I'm going to give it all away&lt;/blockquote&gt;&lt;blockquote&gt;I wish that I could see your eyes&lt;br /&gt;'Cause then I think I'd realize&lt;/blockquote&gt;&lt;blockquote&gt;When the hunger is so strong&lt;br /&gt;And I know I can't go on&lt;br /&gt;You're always there to tell me it's all right&lt;/blockquote&gt;&lt;blockquote&gt;Could it be that I'm too late&lt;br /&gt;But you're so willing to wait&lt;br /&gt;There are better things than this world, in the next&lt;/blockquote&gt;&lt;blockquote&gt;I know it's not about me&lt;br /&gt;But sometimes it's not so easy&lt;br /&gt;I know the picture's bigger from your side&lt;br /&gt;From your side&lt;br /&gt;From your side&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/LECCcGJjIHs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/7628351885808992925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=7628351885808992925&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7628351885808992925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7628351885808992925?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/LECCcGJjIHs/from-your-side.html" title="From Your Side" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2007/08/from-your-side.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXs4fSp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-869953161601126955</id><published>2007-07-31T22:55:00.000-07:00</published><updated>2008-05-03T02:57:44.535-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:57:44.535-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>Dear John Letter</title><content type="html">&lt;p&gt;Here is my email to John Oakes.  It's a bit less derisive than my earlier &lt;a href="http://vshih.blogspot.com/2007/07/john-oakes-problem-of-pain-and.html"&gt;post&lt;/a&gt;; I just listened to the lecture and his approach is quite respectful and less self-assured than I was led to believe by just reading the notes.  Nevertheless the content is the same and so I feel my criticism is warranted.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I just listened to your lecture on The Problem of Pain and Suffering and had a couple of comments.&lt;/p&gt;&lt;p&gt;Before I elaborate, let me mention that I applaud your respectful treatment of the difficulty that the question presents to the Christian.  I also appreciate the fact that you address the sources of suffering separately, namely other people, and natural causes.  It is with your explanation for the latter that I take issue, however.&lt;/p&gt;&lt;p&gt;First of all, I do not believe it is up to "us" — whether unbelievers, or doubters, or objects of God's creation — to propose a universe which does not include plate tectonics, before we can rightfully criticize the concept of an omnipotent God who created a world where suffering comes at the hand of that same world.  It is the bible that makes the claim that such a God exists; thus the burden of proof lies with the bible — or at least the theist who claims to believe it — to sufficiently explain this assertion.&lt;/p&gt;&lt;p&gt;Second, would you have us believe that God spoke this world into existence, can change the nature of physics at will to enable a man to walk on water, and yet cannot save people from earthquakes caused by the plates of the earth shifting because they are necessary for life?  Or, what of the virgin birth?  And, is it not Jesus' unique ability to nullify the natural order of life and death, the very reason that we should believe he is from God?  And yet, this same God must now submit to the very same laws of physics he so remarkably violated before?  This approach seems very inconsistent.&lt;/p&gt;&lt;p&gt;You went on to include other phenomena such as hurricanes, tornadoes, floods, and even bacteria.  Unremarkably, then, you have made God subservient to exactly the circumstances of the natural world in which we find ourselves.  If this is the case, then wouldn't it easier to assume that God does not exist, or at least does not care?  At least this would relieve us of the aching burden of searching to find some purpose for senseless suffering.&lt;/p&gt;&lt;p&gt;Consider this:  are there plate tectonics in heaven as well?  If heaven is some different kind of existence, why not just start with that existence?  This solves the problem of envisioning an environment that does not include plate tectonics.  God could still accomplish his goal of "soul-making," or whatever other justification one might have for suffering at the hand of other humans with free will, without adding the additional burden of suffering from natural causes.  Thus I respectfully find your explanation lacking.&lt;/p&gt;&lt;p&gt;Another issue you may wish to address in your talk is the problem of animal suffering — that is, if animals do not have souls and do not have the chance to go to heaven, their suffering has no meaningful explanation.  As of yet I have not heard much argument from the apologetic side on this issue (I have not yet listened to the rest of the conference lectures so I apologize if this is addressed elsewhere).&lt;/p&gt;&lt;p&gt;Thanks for your time.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/laKnvKNKi90" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/869953161601126955/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=869953161601126955&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/869953161601126955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/869953161601126955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/laKnvKNKi90/dear-john-letter.html" title="Dear John Letter" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2007/07/dear-john-letter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACQng4fCp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-7187645668553160656</id><published>2007-07-23T23:52:00.001-07:00</published><updated>2008-05-03T02:59:23.634-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:59:23.634-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photos" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>The Hills are Alive!  Run!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWi9-E3JGI/AAAAAAAAADE/oSZ-EY1N-3c/s1600-h/878174873_1fe62a636b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWi9-E3JGI/AAAAAAAAADE/oSZ-EY1N-3c/s320/878174873_1fe62a636b.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090654139331322978" /&gt;&lt;/a&gt;&lt;p&gt;On June 30&lt;sup&gt;th&lt;/sup&gt; I joined one crazy crew of fans at the Sound of Music Sing-A-Long at the Hollywood Bowl.  It's kind of like the Rocky Horror Picture Show, but for kids.  And strange fanatical adults.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWmc-E3JLI/AAAAAAAAADs/1XMQODXLmd8/s1600-h/879020782_7cad469f82.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWmc-E3JLI/AAAAAAAAADs/1XMQODXLmd8/s320/879020782_7cad469f82.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090657970442151090" /&gt;&lt;/a&gt;&lt;p&gt;These photos were shamelessly stolen from &lt;a href="http://flickr.com/photos/9632759@N06/sets/72157600967802836/"&gt;Claire&lt;/a&gt;.  Of course I only stole the, uh, relevant ones.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWmc-E3JMI/AAAAAAAAAD0/KEppvEmLG2k/s1600-h/879021864_deae9dc2cc.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWmc-E3JMI/AAAAAAAAAD0/KEppvEmLG2k/s320/879021864_deae9dc2cc.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090657970442151106" /&gt;&lt;/a&gt;&lt;p&gt;Claire kept snapping pictures so I decided to start pointing out the object of interest in each one, in case it wasn't obvious.  This is the only example I stole from her site though.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWmdeE3JOI/AAAAAAAAAEE/Au_4tdpvkfo/s1600-h/879024248_b3a4361bfb.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWmdeE3JOI/AAAAAAAAAEE/Au_4tdpvkfo/s320/879024248_b3a4361bfb.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090657979032085730" /&gt;&lt;/a&gt;&lt;p&gt;We pretty much baked for the first hour or so before the sun dipped past the trees, during the pre-game entertainment.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWi9-E3JHI/AAAAAAAAADM/qT1slPOnvfM/s1600-h/878178245_90958ae0fe.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWi9-E3JHI/AAAAAAAAADM/qT1slPOnvfM/s320/878178245_90958ae0fe.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090654139331322994" /&gt;&lt;/a&gt;&lt;p&gt;The pre-game was emceed by Melissa Peterman, who was actually quite entertaining.  So much so I am almost tempted to check out an episode of the show of Reba where she apparently is part of the cast.  Almost.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWi-eE3JII/AAAAAAAAADU/AWln7w_ROOE/s1600-h/878184307_e4aed2be05.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWi-eE3JII/AAAAAAAAADU/AWln7w_ROOE/s320/878184307_e4aed2be05.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090654147921257602" /&gt;&lt;/a&gt;&lt;p&gt;The real endurance part of this mad race was the endless costume parade.  Of course it's cute in the beginning but wow, two hours?  Yikes.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWnUeE3JQI/AAAAAAAAAEU/J4FoAVN8KTU/s1600-h/878180537_ee513d29e7.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_veBqaZQ0UaM/RqWnUeE3JQI/AAAAAAAAAEU/J4FoAVN8KTU/s320/878180537_ee513d29e7.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090658923924890882" /&gt;&lt;/a&gt;&lt;p&gt;One of the winners of the costume contest is pictured here.  They're the curtains that Maria uses to make play clothes for the kids.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_veBqaZQ0UaM/RqWnjuE3JRI/AAAAAAAAAEc/9FbR_uzU9ns/s1600-h/879032792_ca7710cfae.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_veBqaZQ0UaM/RqWnjuE3JRI/AAAAAAAAAEc/9FbR_uzU9ns/s320/879032792_ca7710cfae.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090659185917895954" /&gt;&lt;/a&gt;&lt;p&gt;One of the great scenes in the movie, complete with subtitles by which to sing-a-long.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_veBqaZQ0UaM/RqWi-uE3JJI/AAAAAAAAADc/aWvG10q-Kp0/s1600-h/878185583_64bfea9622.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_veBqaZQ0UaM/RqWi-uE3JJI/AAAAAAAAADc/aWvG10q-Kp0/s320/878185583_64bfea9622.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090654152216224914" /&gt;&lt;/a&gt;&lt;p&gt;This (third from the left) is the actress who played Liesel in the film.&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_veBqaZQ0UaM/RqWi_OE3JKI/AAAAAAAAADk/U3v64vBH3lU/s1600-h/878185985_7b0387fe26.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_veBqaZQ0UaM/RqWi_OE3JKI/AAAAAAAAADk/U3v64vBH3lU/s320/878185985_7b0387fe26.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5090654160806159522" /&gt;&lt;/a&gt;&lt;p&gt;Heh, I'm pretty wiped out at this point.  All in all, lots of fun!  Thanks to Steve and Sophia for putting it all together.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/3PwWS76eXx8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/7187645668553160656/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=7187645668553160656&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7187645668553160656?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/7187645668553160656?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/3PwWS76eXx8/hills-are-alive-run.html" title="The Hills are Alive!  Run!" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_veBqaZQ0UaM/RqWi9-E3JGI/AAAAAAAAADE/oSZ-EY1N-3c/s72-c/878174873_1fe62a636b.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.vicshih.com/2007/07/hills-are-alive-run.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXs4fSp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-5199136157140906816</id><published>2007-07-20T16:01:00.000-07:00</published><updated>2008-05-03T02:57:44.535-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:57:44.535-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>John Oakes — The Problem of Pain and Suffering</title><content type="html">&lt;p&gt;John Oakes is a member of the San Diego Church of Christ, which I used to attend.  I remember him speaking a number of times to my part of the congregation.  He has a Ph.D in chemical physics and has authored a number of books.&lt;/p&gt;&lt;p&gt;I recall hearing him for the first time many years ago.  I remember being a bit surprised at one of his answers during the Q &amp; A session, mostly because it seemed to depart subtly from the doctrine of inerrancy in which we had been trained.  Basically I had asked what his take was regarding the fact that Chinese history books go back so many more generations than the bible accounts for.  His response was something to the effect of, anyone trying to make that assertion is trying to nail down specific genealogies to a certain time in history, which simply is not the intent of the bible.  At any rate, I respected his knowledge quite a bit, and he continues to be well respected within the church to this day.&lt;/p&gt;&lt;p&gt;John has a website dedicated to Christian apology, &lt;a href="http://www.evidenceforchristianity.org"&gt;http://www.evidenceforchristianity.org&lt;/a&gt;.  I have been reading some of the notes he posts, which are presumably from speaking engagements in which he has participated.  One in particular,&lt;br /&gt;"&lt;a href="http://www.evidenceforchristianity.org/efc/default.nsf/Article/486A57CF04B28CF18825721F00616D62?OpenDocument"&gt;The Problem of Pain and Suffering, Part I&lt;/a&gt;," caught my attention.  The gist of John's essay is to offer explanations to the classic apparent contradiction among the collective assertions that: 1) God is omnipotent, 2) God is loving, and yet 3) suffering exists.  First John deals with suffering at the hands of other people, and offers the familiar explanation of free will.  Then he tries to tackle the issue of suffering due to natural causes.  Here is an excerpt:&lt;/p&gt;&lt;blockquote&gt;The fortunate facts about the earth we live on include the production of heat inside the earth from radioactive uranium and the action of plate tectonics caused by the release of that heat. Without plate tectonics, the earth would have lost its atmosphere and the soil would have lost its ability to support an abundance of life a long time ago. Plate tectonics, a necessity for life, also produces earthquakes. Humans suffer because of earthquakes. Before we fault God for causing earthquakes, we better propose a universe and an environment in that universe which does not include plate tectonics. Are earthquakes evil? No, they are necessary to life.&lt;/blockquote&gt;&lt;p&gt;Now, this strikes me as ridiculously inconsistent.&lt;/p&gt;&lt;p&gt;First of all, it is not up to "us" — whether unbelievers, or doubters, or objects of God's creation — to propose a universe which does not include plate tectonics, before we can rightfully criticize the concept of an omnipotent God who created a world where suffering comes at the hand of that same world.  It is the bible that makes the claim that such a God exists; thus the burden of proof lies with the bible — or at least the theist who claims to believe it — to sufficiently explain this assertion.&lt;/p&gt;&lt;p&gt;Second, John would have us believe that God spoke this world into existence, can change the nature of physics at will to enable a man to walk on water, and yet cannot save people from earthquakes caused by the plates of the earth shifting because they are necessary for life?  This God decided to miraculously circumvent the natural order of child-birth to bring his one and only son to this earth — an event about which all of history supposedly revolves.  The very &lt;i&gt;basis&lt;/i&gt; of Christianity is based on Christ's ability to nullify the natural order of life and death!  The resurrection is the very event proclaimed so loudly as evidence that Jesus is above the natural physical laws, and therefore from God!  And yet, this same God must now submit to the very same laws of physics he so remarkably violated before?&lt;/p&gt;&lt;p&gt;Which is it?  God is not subject to the physical laws that we observe, or he is?&lt;/p&gt;&lt;p&gt;John's notes continue on to include other phenomena such as hurricanes, tornadoes, floods, and even bacteria.  Essentially he has made God subservient to &lt;i&gt;exactly the circumstances of the natural world in which we find ourselves&lt;/i&gt;.  Pardon me, then, if I do not seem very much in awe at the power of such an "omnipotent" God.  And if this is the case, then isn't it easier to assume that God does not exist, or at least does not care?  At least this would relieve us of the aching burden of searching to find some purpose for senseless suffering.&lt;/p&gt;&lt;p&gt;I start to wonder what kind of heaven John believes in.  Are there plate tectonics in John's version of heaven as well?  I'm sure he will say something to the effect of, no, in heaven there will be a different kind of existence.  But then, why not just start with that existence?  There; the problem of envisioning an environment that does not include plate tectonics has just been solved!  God could still accomplish his goal of "soul-making," or whatever other justification one might have for suffering at the hand of other humans with free will, without adding the additional burden of suffering from natural causes.&lt;/p&gt;&lt;p&gt;And yet he apparently did not choose that route, because such suffering does exist.  Thus I find John's explanation sorely lacking.&lt;/p&gt;&lt;p&gt;I just ordered the CD containing the lectures of the 2007 International Apologetics Conference, where presumably John spoke from these notes.  If no further insight into John's argument can be gleaned, I will likely send him an email of my criticisms.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/mUHZQ6l5yck" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/5199136157140906816/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=5199136157140906816&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5199136157140906816?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/5199136157140906816?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/mUHZQ6l5yck/john-oakes-problem-of-pain-and.html" title="John Oakes — The Problem of Pain and Suffering" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.vicshih.com/2007/07/john-oakes-problem-of-pain-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXs4fSp7ImA9WxZaGE0.&quot;"><id>tag:blogger.com,1999:blog-3062430.post-8821367085357497071</id><published>2007-07-04T13:17:00.000-07:00</published><updated>2008-05-03T02:57:44.535-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-03T02:57:44.535-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>Science Superior to Religion</title><content type="html">&lt;p&gt;I've been thinking a lot about the relationship between science and religion.  Each camp seems to characterize this relationship in their respective ways.  For instance, theists will typically claim that science is a faith, implying that the same amount of faith is required to believe in it as, say, Christianity.  Others, on the other hand, tend to treat them as completely separate — "incompatible magisteria" being the classic label.&lt;/p&gt;&lt;p&gt;I must note that I am very likely abusing the word "science" here.  By it I am trying to encompass all skeptical thought based on observed evidence.  Also implied in science is the possibility that any theory may be proven incorrect in the future, given sufficient evidence.&lt;/p&gt;&lt;p&gt;First of all, I take issue with the theist's claim by arguing that the faith in science is somehow comparable to the faith required to accept something like Christianity.  It is true that there are some things that will never be proven and we must take them to be axiomatic truths.  But the amount of faith required to believe in any religion is orders of magnitude greater than that required to accept the basic axioms that we use to describe the world which we observe.&lt;/p&gt;&lt;p&gt;The more interesting issue that this brings up, however, is that the theists are more correct than they know — science and religion actually &lt;i&gt;are&lt;/i&gt; quite similar.  The error is in which criteria by which to compare them.&lt;/p&gt;&lt;p&gt;My assertion is that science is what religion tries to be.  So, from this perspective, science supersedes religion, as it is more powerful and less prone to religion's pitfalls.&lt;/p&gt;&lt;p&gt;Of course, this is incompatible with the theist perspective that religion (whichever one is correct) is supernaturally revealed and therefore trumps any conclusions based on evidence and observation.  But there are clues inside of every believer that invalidate the theist's position.  To illustrate this, I outline the typical process of coming to faith.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A prospective believer somehow comes in contact with the bible (or other holy book).&lt;br /&gt;&lt;li&gt;He reads it and finds that it contains profound wisdom and provides meaning for his life.&lt;br /&gt;&lt;li&gt;He decides to accept it and dedicates his life to learning from and obeying this book.&lt;/ol&gt;&lt;p&gt;I omit the possible step of 0) a religious or miraculous experience.  Although I believe it to be common, theists typically don't allude to it as a reason for their faith in a discussion such as this, which seems wise.&lt;/p&gt;&lt;p&gt;Now the crucial point of this process to note is step 2).  How does someone come to the conclusion that this book holds profound wisdom?  Answer:  the bible accurately and successfully (in the prospective believer's mind, anyway) explains the world that he has experienced so far; it illuminates and confirms his suspicions about how the world works.&lt;/p&gt;&lt;p&gt;And this is precisely what science does — attempt to explain the evidence that we observe about the world.  I reiterate my claim — religion is an attempt to explain the observable world, and is therefore an attempt at what science more powerfully achieves.&lt;/p&gt;&lt;p&gt;Another way to look at it is this:  there are several myths and religions to choose from; why reject almost all of them in favor of just one?  Most of them are quickly dismissed because they do not accurately describe the world that we observe.  If you found that the holy book to which you currently subscribe had decreed something ridiculous, like "kill all babies," you would never have considered it legitimate in the first place.  Why?  Because it deviates so wildly from what you already observe to be true and right.&lt;/p&gt;&lt;p&gt;When faced with deciding between equivalently realistic religions, what does the believer do?  He assesses the credibility and authority of each religion based on the weight of evidence for each.  Again, science has provided the means of distinguishing between religions.&lt;/p&gt;&lt;p&gt;Other thoughts regarding the relationship between science and religion:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Science is the means by which we choose to accept a religion (consciously or not).&lt;br /&gt;&lt;li&gt;Science is the means by which we judge between religions (consciously or not).&lt;br /&gt;&lt;li&gt;Science is the means by which we correct/reinterpret religion's incorrect/misinterpreted claims (consciously or not).&lt;br /&gt;&lt;li&gt;Science evolves and grows, whereas religion is static, except for reinterpretation, which is enabled and prompted by science.&lt;br /&gt;&lt;li&gt;No religion has been perfect from its inception; each is trying to get closer and closer to an ideal.  This nullifies any advantage of divine revelation that religion can claim to provide over science.&lt;br /&gt;&lt;li&gt;Religion is more vulnerable to gullibility and a stubborn resistance to correction than science because it depends on belief disproportionate to the amount evidence supporting it.&lt;/ul&gt;&lt;p&gt;The other approach to the relationship between science and religion, that they occupy non-overlapping magisteria, has its mantra:  "Science tells us how; religion tells us why."  The problem with this is, the answers that religion gives for those "why"s are so scant and nebulous as to be effectively worthless and serve only to raise the suspicion that they are mere hand-waving inventions of man.  Try following any of these lines of questioning and you end up with infinite regression.&lt;/p&gt;&lt;p&gt;Why are we here?  God has a purpose for all of us.  What is our purpose?  To love God.  Okay, what does that entail?  Love people.  So, in other words, do whatever helps people (including myself) succeed in life?  Did I need God to tell me that?&lt;/p&gt;&lt;p&gt;What happens when I die?  We go to heaven.  What's that like?  Better than anything you can imagine.  What will we do?  Trust me, you want to be there.  Um, okay.&lt;/p&gt;&lt;p&gt;The only way I can see these answers satisfying anyone is in the way of comfort.  Certainly it is comforting to believe that an omnipotent father-figure is always watching out for us, or that the greatest loss we can possibly suffer in this world is cushioned, even eclipsed, by the promise of an afterlife.  Pity that truth is not subject to wishful thinking.&lt;img src="http://feeds.feedburner.com/~r/vicshih/PRAV/~4/blUg8K2DRQ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.vicshih.com/feeds/8821367085357497071/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3062430&amp;postID=8821367085357497071&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8821367085357497071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3062430/posts/default/8821367085357497071?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/vicshih/PRAV/~3/blUg8K2DRQ0/science-superior-to-religion.html" title="Science Superior to Religion" /><author><name>Victor Shih</name><uri>https://plus.google.com/106413998281612012060</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-UXLZCa303JE/AAAAAAAAAAI/AAAAAAAABbM/82E0u6BCnys/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.vicshih.com/2007/07/science-superior-to-religion.html</feedburner:origLink></entry></feed>
