<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30268243</id><updated>2011-08-02T10:30:53.469-07:00</updated><category term='airsnort'/><category term='postgresql'/><category term='system beep'/><category term='news'/><category term='bugs'/><category term='m4p'/><category term='streamripper'/><category term='privacy'/><category term='routers'/><category term='Wine'/><category term='api'/><category term='jpg'/><category term='query'/><category term='audio'/><category term='streaming audio'/><category term='configuration'/><category term='pci'/><category term='latitude'/><category term='spam'/><category term='rss'/><category term='beryl'/><category term='hard disk'/><category term='chainlynx'/><category term='email'/><category term='bzip2'/><category term='parking'/><category term='mashup'/><category term='solaris'/><category term='waseem'/><category term='GMail'/><category term='proc'/><category term='bcm43xx'/><category term='scripting'/><category term='facebook'/><category term='packages'/><category term='aircrack'/><category term='iTMS'/><category term='ogg'/><category term='file fomats'/><category term='karmic koala'/><category term='graphics'/><category term='online video'/><category term='at'/><category term='ffmpeg'/><category term='etc'/><category term='format'/><category term='wireshark'/><category term='mtv'/><category term='networking'/><category term='pdf'/><category term='c'/><category term='tidy'/><category term='iPhone'/><category term='iTunes'/><category term='e70'/><category term='QTFairUse'/><category term='dell 2407 monitor'/><category term='.bashrc'/><category term='mp3'/><category term='chickenfoot'/><category term='robert laughlin'/><category term='ubuntu'/><category term='window manager'/><category term='nvidia'/><category term='job control'/><category term='svn'/><category term='subversion'/><category term='google'/><category term='DEFCON 15'/><category term='ruby'/><category term='xinerama'/><category term='mail'/><category term='Brood War'/><category term='defaults'/><category term='fuser'/><category term='video quality'/><category term='DEFCON 16'/><category term='hacking'/><category term='ethereal'/><category term='osx'/><category term='picard'/><category term='censorship'/><category term='spellcheck'/><category term='blocking'/><category term='pgp'/><category term='gutsy'/><category term='amd64'/><category term='Las Vegas'/><category term='nokia'/><category term='file extensions'/><category term='shell'/><category term='format conversion'/><category term='irc'/><category term='stanford'/><category term='productivity'/><category term='cowsay'/><category term='xgl'/><category term='computer building'/><category term='hardware'/><category term='Static IP'/><category term='screen'/><category term='tricks'/><category term='extensions'/><category term='netstat'/><category term='gdb'/><category term='sansa clip'/><category term='photography'/><category term='howto'/><category term='.vimrc'/><category term='cell phone'/><category term='remote'/><category term='.exrc'/><category term='music'/><category term='ssh'/><category term='ettiquite'/><category term='lifehacker'/><category term='version'/><category term='issue'/><category term='xmonad'/><category term='xmodmap'/><category term='openssh'/><category term='linksys'/><category term='tar'/><category term='s5'/><category term='databases'/><category term='x'/><category term='ack'/><category term='experimental search'/><category term='malloc'/><category term='sql'/><category term='wireless'/><category term='ipod'/><category term='administration'/><category term='twitter'/><category term='server'/><category term='lsb-release'/><category term='s60'/><category term='web site'/><category term='VIM'/><category term='pyramid scheme'/><category term='ftp'/><category term='audio compression'/><category term='7.10'/><category term='encoding'/><category term='gnu coreutils'/><category term='kiba-dock'/><category term='recruiting'/><category term='factory settings'/><category term='wepcrack'/><category term='singleton'/><category term='RAID'/><category term='ads'/><category term='printing'/><category term='Ghosts'/><category term='gang of four'/><category term='DEFCON'/><category term='globbing'/><category term='news feed'/><category term='public key encryption'/><category term='phone'/><category term='broadcom'/><category term='netgear'/><category term='presentation'/><category term='firefox'/><category term='encryption'/><category term='Amazon Music Store'/><category term='archiveing'/><category term='aim'/><category term='tips'/><category term='DRM'/><category term='keyboard'/><category term='dpkg'/><category term='top'/><category term='forecastfox'/><category term='scp'/><category term='system monitor'/><category term='aspell'/><category term='cron'/><category term='sniffing'/><category term='greasemonkey'/><category term='kismet'/><category term='xp'/><category term='Edgy Eft'/><category term='banner'/><category term='google toolbar'/><category term='ext3'/><category term='google maps'/><category term='mysql'/><category term='soundconverter'/><category term='san francisco'/><category term='arrays'/><category term='security'/><category term='crime of reason'/><category term='macros'/><category term='gotchas'/><category term='school'/><category term='bash'/><category term='wpa'/><category term='fortune'/><category term='batch'/><category term='wmctrl'/><category term='split'/><category term='permissions'/><category term='m4a'/><category term='myFairTunes'/><category term='whois'/><category term='html'/><category term='regular expressions'/><category term='amarok'/><category term='cat'/><category term='factory'/><category term='proftpd'/><category term='UNIX'/><category term='yahoo'/><category term='JHymn'/><category term='design patterns'/><category term='admin'/><category term='apple'/><category term='alt'/><category term='indent'/><category term='gzip'/><category term='youtube'/><category term='conference'/><category term='kill'/><category term='GNOME'/><category term='enscript'/><category term='.pythonrc.py'/><category term='compression'/><category term='vsftpd'/><category term='evince'/><category term='essid'/><category term='python'/><category term='comparison'/><category term='internet'/><category term='debian'/><category term='windows'/><category term='compiz'/><category term='port'/><category term='txt2regex'/><category term='pipes'/><category term='linux'/><category term='gnupg'/><category term='powerpoint'/><category term='advanced search'/><category term='birthday'/><category term='vi'/><category term='process'/><category term='programming'/><category term='Nine Inch Nails'/><category term='aol instant messanger'/><category term='Jonathan Zittrain'/><category term='Nautilus'/><category term='Starcraft'/><category term='fat32'/><category term='terminal'/><category term='lpr'/><category term='musicbrainz'/><category term='hacks'/><category term='languages'/><category term='compositor'/><category term='search'/><category term='mtvmusic'/><category term='wep'/><category term='microsoft'/><category term='aiglx'/><category term='command line'/><category term='slashdot'/><category term='critique'/><category term='cards'/><category term='metadata'/><category term='zip'/><title type='text'>chainlynx / c|-|41nl`/n&gt;&lt;</title><subtitle type='html'>Day-to-day trials and tribulations of a DIY computer enthusiast/Silicon Valley programmer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default?start-index=101&amp;max-results=100'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>114</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30268243.post-2374202149345303098</id><published>2011-05-09T19:51:00.000-07:00</published><updated>2011-05-09T19:56:45.149-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>How to get a RSS feed from a Twitter account</title><content type='html'>So it seems that Twitter has &lt;a href="http://support.twitter.com/groups/31-twitter-basics/topics/111-features/articles/15361-how-to-find-your-rss-feed"&gt;killed&lt;/a&gt; RSS feeds (I'm not sure what that has to do with implementing OAuth), but fortunately, there's an easy workaround.&lt;br /&gt;&lt;br /&gt;You can get an RSS feed by &lt;a href="http://dev.twitter.com/doc/get/statuses/user_timeline"&gt;querying&lt;/a&gt; another URL for the desired user.  For instance, to get the RSS feed for user &lt;a href="http://twitter.com/#%21/ggreenwald"&gt;ggreenwald&lt;/a&gt;, you can find the feed at this url: &lt;a href="http://twitter.com/statuses/user_timeline/ggreenwald.rss"&gt;http://twitter.com/statuses/user_timeline/ggreenwald.rss&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2374202149345303098?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2374202149345303098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2374202149345303098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2374202149345303098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2374202149345303098'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2011/05/how-to-get-rss-feed-from-twitter.html' title='How to get a RSS feed from a Twitter account'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7459804956517618023</id><published>2011-03-12T10:29:00.000-08:00</published><updated>2011-03-12T10:32:24.965-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>Facebook Wall question</title><content type='html'>I sometimes have the question asked of me, "Danny, you are such a strong advocate of transparency and access; aren't you being a hypocrite by not allowing others to comment on your Facebook wall?"&lt;br /&gt;&lt;br /&gt;This has always struck me as a rather strange question because it confuses the obligations of a person with the obligations of a state or corporation.  It is true that I think that, say, governments should be relatively transparent -- that's a prerequisite for accountability.  I, on the other hand, am a priori accountable to no one so I don't have those same obligations.&lt;br /&gt;&lt;br /&gt;This accusation is analogous to claiming that WikiLeaks is a hypocritical organization because its members don't share all their internal communication with the world (many in the mainstream media do make this point after each release from WikiLeaks in order to discredit the organization).  As if 1) there is any equivalence between the transparency obligations of states/corporations and activist groups or 2) WikiLeaks isn't facing an existential threat from organizations that would use that internal information to try and destroy the group.&lt;br /&gt;&lt;br /&gt;But that aside, there is a valid question contained within the query.  Why do I have the personal preference of configuring my Facebook Wall settings in such a way?  I just don't feel that it is worth the time and mental strain to police my Facebook profile 24/7 to expunge things said by others (whether said out of malice, ignorance or superfluousness) that I would rather not have on there.  There are sufficient potentially undesirable comments that may be put on one's profile for this to be a valid concern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7459804956517618023?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7459804956517618023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7459804956517618023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7459804956517618023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7459804956517618023'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2011/03/facebook-wall-question.html' title='Facebook Wall question'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5997208590336134747</id><published>2010-05-22T19:10:00.000-07:00</published><updated>2010-05-22T19:19:24.522-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='malloc'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>Multidimensional arrays with GCC's variable length arrays</title><content type='html'>GCC's extensions allow you to do some crazy things with multidimensional arrays.  For C99, GCC implements &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html"&gt;variable-length arrays&lt;/a&gt;.  So a declaration like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;int matrix[a][b + 1];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Can be passed by reference to a function with this prototype:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;void foo(int a, int b, int matrix[a][b+1]);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or, if you want to get really crazy, you can use forward declarations and change around the parameter order:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;void foo(int a; int b; int matrix[a][b+1], int a, int b);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No malloc needed!  Much better than &lt;a href="http://www.eumus.edu.uy/eme/c/c-notes_summit/intermediate/sx9.html"&gt;the old way&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5997208590336134747?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5997208590336134747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5997208590336134747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5997208590336134747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5997208590336134747'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2010/05/multidimensional-arrays-with-gccs.html' title='Multidimensional arrays with GCC&apos;s variable length arrays'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8710131273415114070</id><published>2010-04-10T08:22:00.000-07:00</published><updated>2010-04-10T08:26:02.443-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='fuser'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><category scheme='http://www.blogger.com/atom/ns#' term='netstat'/><title type='text'>Which application is using that port?</title><content type='html'>See which ports are open, as an attacker would:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;nmap 127.0.0.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Superuser seems to need to be used on some the following commands)&lt;br /&gt;&lt;br /&gt;See which process is using port 25:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;netstat -nlp | grep 25&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Same, with a bit less info:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fuser -n tcp 25&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or you could also do:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fuser -u smtp/tcp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Discovered &lt;a href="http://blog.spikesource.com/fuser_netstat.htm"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8710131273415114070?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8710131273415114070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8710131273415114070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8710131273415114070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8710131273415114070'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2010/04/which-application-is-using-that-port.html' title='Which application is using that port?'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1670182055081765263</id><published>2010-03-17T19:34:00.000-07:00</published><updated>2010-03-17T19:47:00.453-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sansa clip'/><category scheme='http://www.blogger.com/atom/ns#' term='karmic koala'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Sansa Clip and Karmic</title><content type='html'>Upon upgrade to Karmic Koala Ubuntu (9.10), my trusty &lt;a href="http://www.amazon.com/Sandisk-Sansa-Clip-Player-Black/dp/B001H9O6QW/ref=sr_1_1?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1268879813&amp;amp;sr=8-1"&gt;Sansa Clip&lt;/a&gt; player was not autodetecting like it did under the Ubuntu distribution I was previously using.  So I scoured the web and found &lt;a href="http://www.howtoforge.com/sandisk_mp3_player_linux"&gt;this site&lt;/a&gt; which gives a workaround: when the Sansa Clip is disconnected, go to &lt;span style="font-weight: bold;"&gt;Settings-&gt;USB Mode&lt;/span&gt; on the Sansa Clip and set it to &lt;span style="font-weight: bold;"&gt;MSC&lt;/span&gt;.  It should now present itself to the computer as a normal file system.  Unless, of course, the file system is screwed up, in which case you'll have to go to &lt;span style="font-weight: bold;"&gt;Settings-&gt;Format&lt;/span&gt; and format the Sansa Clip drive before connecting it again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1670182055081765263?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1670182055081765263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1670182055081765263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1670182055081765263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1670182055081765263'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2010/03/sansa-clip-and-karmic.html' title='Sansa Clip and Karmic'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3079719597768948422</id><published>2010-03-05T21:52:00.000-08:00</published><updated>2010-03-25T16:01:09.635-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Funny C tricks</title><content type='html'>Taken from Bill Rowan's &lt;a href="http://stanfordacm.com/"&gt;Stanford ACM&lt;/a&gt; &lt;a href="http://stanfordacm.com/2010/03/acm-general-meeting/"&gt;presentation&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;The "downto" operator:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;int i = 5;&lt;br /&gt;while(i --&amp;gt; 0) // --&amp;gt; is the downto operator!&lt;br /&gt;{&lt;br /&gt;  printf("%d\n", i);&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Cast any type to "bool" type (that is, 1 or 0):&lt;br /&gt;&lt;pre&gt;!!foo&lt;/pre&gt;"Computed goto" (compiler-dependent &amp;amp;&amp;amp; unary operator):&lt;br /&gt;&lt;pre&gt;void print_loop(int s, int e) {&lt;br /&gt; assert(s &lt; e);   &lt;br /&gt; top:    &lt;br /&gt; printf("%d\n", s);  &lt;br /&gt; goto *( &amp;amp;&amp;amp;top + ( !!(s++/e) ) * ( &amp;amp;&amp;amp;end - &amp;amp;&amp;amp;top ) );    &lt;br /&gt; end:  &lt;br /&gt; ;&lt;br /&gt;} &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3079719597768948422?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3079719597768948422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3079719597768948422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3079719597768948422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3079719597768948422'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2010/03/funny-c-tricks.html' title='Funny C tricks'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8933363082775503464</id><published>2010-01-12T18:31:00.000-08:00</published><updated>2010-01-12T18:59:12.903-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='tar'/><category scheme='http://www.blogger.com/atom/ns#' term='split'/><category scheme='http://www.blogger.com/atom/ns#' term='cat'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gzip'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><title type='text'>Make a big file into many small files (and back again)</title><content type='html'>Adapted from &lt;a href="http://tech.slashdot.org/story/10/01/12/1932232/Google-Docs-To-Host-Any-File-Type"&gt;this slashdot thread&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create many little files called "chunks00000" etc. from bigfile that are all just under 10MB in size: &lt;span style="font-weight: bold;"&gt;split -a 5 -b 10MB -d bigfile chunks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Put the chunks back together: &lt;span style="font-weight: bold;"&gt;cat * &amp;gt; newbigfile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do the same, except with compression: &lt;span style="font-weight: bold;"&gt;tar -zc bigfile | split -a 5 -b 10MB -d - chunks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Put the compressed chunks back together: &lt;span style="font-weight: bold;"&gt;cat chunks000* | tar -zxO &amp;gt; newbigfile&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8933363082775503464?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8933363082775503464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8933363082775503464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8933363082775503464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8933363082775503464'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2010/01/make-big-file-into-many-small-files-and.html' title='Make a big file into many small files (and back again)'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4155800749865015002</id><published>2009-12-02T07:30:00.000-08:00</published><updated>2009-12-02T07:36:25.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Browsing as Googlebot to circumvent paywalls</title><content type='html'>Interesting technique from &lt;a href="http://yro.slashdot.org/story/09/12/02/0224250/Google-May-Limit-Free-News-Access?from=rss&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29"&gt;a Slashdot article&lt;/a&gt; and commenter &lt;a href="http://slashdot.org/%7Edarthflo"&gt;darthflo&lt;/a&gt;:&lt;br /&gt;&lt;div class="commentBody"&gt;    &lt;div id="comment_body_30295374"&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Most 'papers like Google and the visitors Google sends them; so the Google Bot and hits with a google.com Referer tend to get a free pass. Use this to your advantage:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Google the Article's URI, click the link and off you go (with a real Google referer).&lt;/li&gt;&lt;li&gt;If it's not indexed yet and you're using Opera: Go to any Google page, press Ctrl + U, change any one link's href to the article's URI, click "Save Changes", click the link and off you go (with a fake Google referer. This works for any fake referer, by the way).&lt;/li&gt;&lt;li&gt;If they're picky, they mightn't let hits from Google through but still allow the Google bot to index their pages. Change your User-Agent accordingly. In Firefox, go to about:config and change general.useragent.extra.firefox to Googlebot 2.1 and off you go (as Googlebot).&lt;/li&gt;&lt;li&gt;As a last resort, there's quite a few ad-blocking personal proxies out there. Most of them allow you to fake Referers or change User-Agents, for any browser.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4155800749865015002?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4155800749865015002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4155800749865015002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4155800749865015002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4155800749865015002'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/12/browsing-as-googlebot-to-circumvent.html' title='Browsing as Googlebot to circumvent paywalls'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3871855198468574475</id><published>2009-10-25T12:38:00.000-07:00</published><updated>2009-10-26T11:14:56.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Insidious C bugs</title><content type='html'>Here's a couple novel C bugs that I've encountered recently (using gcc).  Man, it sucks when these happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) No compiler warnings when not instantiating structs correctly&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following code will give no warning indicating that you have not, when declaring an array of structs using the curly bracket notation, instantiated all members of the struct:&lt;br /&gt;&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  struct a_struct {&lt;br /&gt;     int a;&lt;br /&gt;     int b;&lt;br /&gt;  } buggy[] = {&lt;br /&gt;     { 1, 2, },&lt;br /&gt;     { 3, /* oops! */ },&lt;br /&gt;     { 5, 6, },&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;  int i;&lt;br /&gt;  for(i = 0; i &amp;lt; sizeof(buggy) / sizeof(*buggy); i++)&lt;br /&gt;  {&lt;br /&gt;     printf("%i: %i %i\n", i, buggy[i].a, buggy[i].b);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Here's the ouptut:&lt;br /&gt;&lt;pre&gt;0: 1 2&lt;br /&gt;1: 3 0&lt;br /&gt;2: 5 6&lt;br /&gt;&lt;/pre&gt;Oops!  It would have been nice for the compiler to tell us about this...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Forgetting to delete the semicolon when turning an assert into an if statement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Say you have&lt;br /&gt;&lt;pre&gt;assert(cond);&lt;br /&gt;&lt;/pre&gt;But you want to make it an if statement to have a little more debugging output when it triggers.  So you change it to:&lt;br /&gt;&lt;pre&gt;if(!cond);  /* oops! */&lt;br /&gt;{&lt;br /&gt;  dump_stats();&lt;br /&gt;  assert(0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Whoops!  Now the if statement has an empty body and the block between the curly braces will always execute!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Strange things you can't do within case statements&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;This isn't really insidious so much as annoying&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;-- why are you allowed to do some things inside a case statement (that don't seem to make sense) but aren't allowed to do others (that seem to make much more sense)?  For instance:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int main() {&lt;br /&gt;  int i = 0;&lt;br /&gt;&lt;br /&gt;  switch(i)&lt;br /&gt;  {&lt;br /&gt;     int j = 5;    /* fine */&lt;br /&gt;     case 0:&lt;br /&gt;        char ch;  /* error */&lt;br /&gt;        break;&lt;br /&gt;     case 1:&lt;br /&gt;        i = 1;&lt;br /&gt;        char ch2; /* fine */&lt;br /&gt;        break;&lt;br /&gt;     default:;   &lt;br /&gt;        char ch3; /* fine */&lt;br /&gt;        break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return i;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Note the semicolon following the 'default:'  There's a good discussion of this problem &lt;a href="http://bytes.com/topic/c/answers/214730-c99-variable-declarations-inside-switch-statements"&gt;here&lt;/a&gt;.  Essentially, the first thing after a label cannot be a declaration.  The error that the compiler gives here is usually pretty cryptic, too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Similar links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.andromeda.com/people/ddyer/topten.html"&gt;Top 10 Ways to get screwed by the C programming language&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3871855198468574475?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3871855198468574475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3871855198468574475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3871855198468574475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3871855198468574475'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/10/insidious-c-bugs.html' title='Insidious C bugs'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5934397783023839035</id><published>2009-10-04T23:50:00.000-07:00</published><updated>2010-12-26T14:22:03.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Youtube kung-fu on Linux</title><content type='html'>This is just a collection of commands that I have used in the past to edit video, especially for uploading to online video sites such as YouTube.  This entry is small now, hopefully it grows as I figure out how to do more useful stuff.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Cut a clip from a whole video file (-ss is base, -t is offset)&lt;br /&gt;ffmpeg -sameq -i input.avi -ss 00:1:23 -t 00:02:35 output.avi&lt;br /&gt;&lt;br /&gt;# Boost the volume of a video file&lt;br /&gt;ffmpeg -sameq -vol 1000 -i input.avi output.avi&lt;br /&gt;or, see Avidemux tutorial here: http://www.youtube.com/watch?v=w8K0D2t0ysE&lt;br /&gt;&lt;br /&gt;# Dump audio of an flv video file to mp3&lt;br /&gt;ffmpeg -i inputfile.flv -f mp3 -vn -acodec copy ouputfile.mp3&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5934397783023839035?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5934397783023839035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5934397783023839035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5934397783023839035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5934397783023839035'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/10/youtube-kung-fu-on-linux.html' title='Youtube kung-fu on Linux'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1689643147992443235</id><published>2009-09-23T10:47:00.000-07:00</published><updated>2009-09-23T10:52:41.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openssh'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>Mandating key-based logins with sshd</title><content type='html'>&lt;a href="http://sial.org/howto/openssh/publickey-auth/"&gt;This page&lt;/a&gt; provides a pretty good summary of creating a public/private key pair on the client and adding the public key to the server's authorized_keys file. &lt;br /&gt;&lt;br /&gt;On the server side, edit &lt;span style="font-weight: bold;"&gt;/etc/ssh/sshd_config&lt;/span&gt; and add the directive &lt;span style="font-weight: bold;"&gt;PasswordAuthentication no&lt;/span&gt; and then restart sshd with &lt;span style="font-weight: bold;"&gt;sudo /etc/init.d/ssh restart&lt;/span&gt;  Anyone that tries to log in to your server without a public key in the server's authorized_keys file will now not even be given the chance to enter a password.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?sshd_config+5"&gt;sshd_config manpage&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1689643147992443235?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1689643147992443235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1689643147992443235' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1689643147992443235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1689643147992443235'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/09/mandating-key-based-logins-with-sshd.html' title='Mandating key-based logins with sshd'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5326336509090491755</id><published>2009-09-21T18:01:00.000-07:00</published><updated>2009-12-07T18:53:40.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x'/><category scheme='http://www.blogger.com/atom/ns#' term='xmonad'/><title type='text'>xmonad</title><content type='html'>&lt;a href="http://xmonad.org/"&gt;Xmonad&lt;/a&gt; is a &lt;a href="http://xmonad.org/tour.html"&gt;sweet&lt;/a&gt; window manager.  So sweet, in fact, that I've decided to use it.  Here's a quick reference, basically the manpage rearranged (mod = alt by default) ... (also, remember to change the session login to "Run Xclient script" so that other things, like xmodmap, can be run in .xsession):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;=== Launch ===&lt;br /&gt;mod-shift-q -- Quit xmonad&lt;br /&gt;mod-q -- Restart xmonad (and reload config file)&lt;br /&gt;mod-shift-return -- Launch terminal&lt;br /&gt;mod-shift-c -- Close the focused window&lt;br /&gt;mod-p -- Launch dmenu&lt;br /&gt;&lt;br /&gt;=== Layout ===&lt;br /&gt;mod-space -- Rotate through the available layout algorithms&lt;br /&gt;mod-shift-space -- Reset the layouts on the current workspace to default&lt;br /&gt;&lt;br /&gt;=== Focus ===&lt;br /&gt;mod-tab -- Move focus to the next window&lt;br /&gt;mod-shift-tab -- Move focus to the previous window&lt;br /&gt;mod-j -- Move focus to the next window&lt;br /&gt;mod-k -- Move focus to the previous window&lt;br /&gt;mod-m -- Move focus to the master window&lt;br /&gt;&lt;br /&gt;=== Swap ===&lt;br /&gt;mod-return -- Swap the focused window and the master window&lt;br /&gt;mod-shift-j -- Swap the focused window with the next window&lt;br /&gt;mod-shift-k -- Swap the focused window with the previous window&lt;br /&gt;&lt;br /&gt;=== Resize ===&lt;br /&gt;mod-h -- Shrink the master area&lt;br /&gt;mod-l -- Expand the master area&lt;br /&gt;&lt;br /&gt;=== Master Area (the area on the left) ===&lt;br /&gt;mod-comma -- Increment the number of windows in the master area&lt;br /&gt;mod-period -- Deincrement the number of windows in the master area&lt;br /&gt;&lt;br /&gt;=== Workspace ===&lt;br /&gt;mod-[1..9] -- Switch to workspace N&lt;br /&gt;mod-shift-[1..9] -- Move client to workspace N&lt;br /&gt;&lt;br /&gt;=== Multiple Screens ===&lt;br /&gt;mod-{w,e,r} -- Switch to physical/Xinerama screens 1, 2, or 3&lt;br /&gt;mod-shift-{w,e,r} -- Move client to screen 1, 2, or 3&lt;br /&gt;&lt;br /&gt;=== Mouse ===&lt;br /&gt;mod-button1 -- Set the window to floating mode and move by dragging&lt;br /&gt;mod-button2 -- Raise the window to the top of the stack&lt;br /&gt;mod-button3 -- Set the window to floating mode and resize by dragging&lt;br /&gt;mod-t -- Push window back into tiling&lt;br /&gt;&lt;br /&gt;=== Setup ===&lt;br /&gt;sudo apt-get install xmonad dwm xlockmore xclock htop&lt;br /&gt;&lt;br /&gt;=== ? ===&lt;br /&gt;mod-shift-p -- Launch gmrun&lt;br /&gt;mod-n -- Resize viewed windows to the correct size&lt;br /&gt;mod-b -- Toggle the status bar gap&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here are some other useful utilities to replace functionality that is present in, say, GNOME on the command line:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.xfree86.org/4.0.2/xclock.1.html"&gt;xclock&lt;/a&gt; -- tell the time&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gwyn.tux.org/%7Ebagleyd/xlockmore.html"&gt;xlock&lt;/a&gt; -- lock the X window session&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://htop.sourceforge.net/"&gt;htop&lt;/a&gt; -- a better system monitor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alsamixer"&gt;alsamixer&lt;/a&gt; -- control volume, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mp3blaster.sourceforge.net/"&gt;mp3blaster&lt;/a&gt; -- play music&lt;/li&gt;&lt;li&gt;&lt;a href="http://linux.about.com/library/cmd/blcmdl1_cal.htm"&gt;cal&lt;/a&gt; -- calendar&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;How to install &lt;a href="http://code.haskell.org/%7Earossato/xmobar/"&gt;Xmobar&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, install the necessary packages:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo apt-get install libghc6-http-dev libghc6-zlib-dev libx11-dev libxft-dev&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hadn't installed any packages with &lt;a href="http://www.haskell.org/cabal/"&gt;cabal&lt;/a&gt; before, so I needed to set up that as well.  I found it necessary to do the standard download, untar, runhaskell Setup configure &amp;amp;&amp;amp; runhaskell Setup build &amp;amp;&amp;amp; sudo runhaskell Setup install for the following packages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://hackage.haskell.org/packages/archive/HTTP/4000.0.8/HTTP-4000.0.8.tar.gz&lt;/li&gt;&lt;li&gt;http://haskell.org/cabal/release/cabal-1.6.0.2/Cabal-1.6.0.2.tar.gz&lt;/li&gt;&lt;li&gt;http://haskell.org/cabal/release/cabal-install-0.6.2/cabal-install-0.6.2.tar.gz&lt;/li&gt;&lt;/ul&gt;A &lt;span style="font-weight: bold;"&gt;cabal update&lt;/span&gt; initializes the package database and a &lt;span style="font-weight: bold;"&gt;cabal install xmobar&lt;/span&gt; grabs the package.&lt;br /&gt;&lt;br /&gt;Put this in your &lt;span style="font-weight: bold;"&gt;xmonad.hs&lt;/span&gt; (changing the paths appropriately, of course):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import XMonad&lt;br /&gt;import XMonad.Hooks.DynamicLog&lt;br /&gt;import XMonad.Hooks.ManageDocks&lt;br /&gt;import XMonad.Util.Run(spawnPipe)&lt;br /&gt;import System.IO&lt;br /&gt;&lt;br /&gt;main = do&lt;br /&gt;xmproc &amp;lt;- spawnPipe "/home/dannyc/.cabal/bin/xmobar /home/dannyc/.xmonad/xmobarrc"&lt;br /&gt;xmonad $ defaultConfig {&lt;br /&gt; layoutHook = avoidStruts  $  layoutHook defaultConfig&lt;br /&gt;, logHook = dynamicLogWithPP $ xmobarPP&lt;br /&gt; { ppOutput = hPutStrLn xmproc&lt;br /&gt; , ppTitle = xmobarColor "green" "" . shorten 50&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;And put this in your&lt;span style="font-weight: bold;"&gt; xmobarrc&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;Config { font = "-*-Fixed-Bold-R-Normal-*-13-*-*-*-*-*-*-*"&lt;br /&gt; , bgColor = "black"&lt;br /&gt; , fgColor = "grey"&lt;br /&gt; , position = TopW L 90&lt;br /&gt; , commands = [ Run Weather "EGPF" ["-t"," &amp;lt;tempF&amp;gt;F","-L","64","-H","77",&lt;br /&gt;"--normal","green","--high","red","--low","lightblue"] 36000&lt;br /&gt;              , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10&lt;br /&gt;              , Run Memory ["-t","Mem: &amp;lt;usedratio&amp;gt; 10&lt;br /&gt;              , Run Swap [] 10&lt;br /&gt;              , Run Date "%a %b %_d %l:%M" "date" 10&lt;br /&gt;              , Run StdinReader&lt;br /&gt;              ]&lt;br /&gt; , sepChar = "%"&lt;br /&gt; , alignSep = "}{"&lt;br /&gt; , template = "%StdinReader% }{ %cpu% | %memory% * %swap%    &amp;lt;fc=#ee9a00&amp;gt;date%&amp;lt;fc&amp;gt; | %EGPF%"&lt;br /&gt; }&lt;br /&gt;&lt;tempf&gt;&lt;usedratio&gt;&lt;br /&gt;&lt;/usedratio&gt;&lt;/tempf&gt;&lt;/pre&gt;There, you now have a bare-bones xmobar install.  I figured this out by loosely following the instructions &lt;a href="http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration"&gt;here&lt;/a&gt;.  I don't know any haskell (yet) and this is my first time messing with the xmonad config, so I don't guarantee at all that I am doing things the Right Way.  If your xmonad keeps locking up because of this configuration, see the big bold comment in the link above which points to &lt;a href="http://haskell.org/haskellwiki/Xmonad/Frequently_asked_questions#XMonad_stops_but_the_current_window_still_responds_to_keys"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;TODO&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;customize xmobar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;some kind of screen-like titleing for workspaces&lt;/li&gt;&lt;li&gt;better fonts?&lt;/li&gt;&lt;li&gt;picture background on startup (/transparent windows?)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5326336509090491755?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5326336509090491755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5326336509090491755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5326336509090491755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5326336509090491755'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/09/xmonad.html' title='xmonad'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2327808268091936905</id><published>2009-08-24T19:34:00.001-07:00</published><updated>2009-12-02T11:26:16.601-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='online video'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Video DownloadHelper Firefox extension + YouTube = Napster</title><content type='html'>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3006"&gt;Video DownloadHelper&lt;/a&gt; can download videos from &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; (or other video sites) and convert the audio to &lt;a href="http://en.wikipedia.org/wiki/MP3"&gt;mp3&lt;/a&gt; (or other formats) using &lt;a href="http://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; (the default).  Pick the mp4 (high quality / high definition -- these are format 18 or 22) videos off of YouTube to get the highest quality audio (128 kbps).&lt;br /&gt;&lt;br /&gt;Ah, this &lt;a href="http://static.userland.com/images/radiodiscuss/napsterScreenShot.gif"&gt;brings me back&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;Update: Even better, now that &lt;a href="http://www.lala.com/"&gt;Lala&lt;/a&gt;, et al are providing music streaming &lt;a href="http://latimesblogs.latimes.com/technology/2009/10/google-music-myspace-lala-ilike.html"&gt;straight from a Google search&lt;/a&gt;, one need not even bother with YouTube -- faster download/conversion, and same (better?) quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2327808268091936905?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2327808268091936905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2327808268091936905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2327808268091936905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2327808268091936905'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/08/video-downloadhelper-firefox-extension.html' title='Video DownloadHelper Firefox extension + YouTube = Napster'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3962207341055296576</id><published>2009-07-25T14:06:00.000-07:00</published><updated>2009-07-28T22:39:08.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='jpg'/><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><title type='text'>Photo metadata</title><content type='html'>&lt;pre&gt;# get &lt;a href="http://www.sno.phy.queensu.ca/%7Ephil/exiftool/"&gt;exiftool&lt;/a&gt;&lt;br /&gt;sudo apt-get install libimage-exiftool-perl&lt;br /&gt;&lt;br /&gt;# get &lt;a href="http://libexif.sourceforge.net/"&gt;libexif&lt;/a&gt; CLI tool&lt;br /&gt;sudo apt-get install exif&lt;br /&gt;&lt;br /&gt;# erase all metadata&lt;br /&gt;exiftool -all='' img.jpg&lt;br /&gt;&lt;br /&gt;# see what metadata tags your photo has&lt;br /&gt;exif -l img.jpg&lt;br /&gt;&lt;br /&gt;# see the values of the included metadata tags&lt;br /&gt;exif img.jpg&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;EXIF specifications: http://www.exif.org/specifications.html&lt;br /&gt;For PNGs: http://pmt.sourceforge.net/pngmeta/index.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3962207341055296576?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3962207341055296576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3962207341055296576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3962207341055296576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3962207341055296576'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/07/photo-metadata.html' title='Photo metadata'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5857070995885518489</id><published>2009-07-23T22:48:00.001-07:00</published><updated>2009-07-23T23:08:54.692-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>And now, a demonstration in how ridiculously easy it is to hack stuff with Google</title><content type='html'>Inspired by &lt;a href="http://www.reddit.com/r/programming/comments/9351d/how_not_to_secure_your_network_printers/"&gt;this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;reddit&lt;/span&gt; thread&lt;/a&gt; (look &lt;a href="http://chainlynx.blogspot.com/2006/11/google-hacking-maximize-effectiveness.html"&gt;here&lt;/a&gt; for help deciphering the Google syntax).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=inurl%3ASELECT+inurl%3AFROM+inurl%3AWHERE+intitle%3Aphpmyadmin&amp;amp;btnG=Search"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;phpMyAdmin&lt;/span&gt;&lt;/a&gt; -- &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;inurl&lt;/span&gt;:SELECT &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;inurl&lt;/span&gt;:FROM &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;inurl&lt;/span&gt;:WHERE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;intitle&lt;/span&gt;:&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;phpmyadmin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?q=%22identify+the+document+you+want+to+print+by+using+either+option+shown+below,+then+select+the+apply+button.%22&amp;amp;num=100&amp;amp;hl=en&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla:en-US:official&amp;amp;filter=0"&gt;HP Laserjet printers&lt;/a&gt; -- "identify the document you want to print by using either option shown below, then select the apply button."&lt;br /&gt;&lt;a href="http://www.google.co.uk/search?hl=en&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;amp;hs=33a&amp;amp;q=%22Web+Image+Monitor%22+location+comment+%22device+name%22&amp;amp;btnG=Search&amp;amp;meta="&gt;&lt;br /&gt;More printers&lt;/a&gt; -- "Web Image Monitor" location comment "device name"&lt;br /&gt;&lt;a href="http://www.google.com/search?q=inurl:%22viewerframe+mode=%22"&gt;&lt;br /&gt;Web cams&lt;/a&gt; -- inurl:"viewerframe mode="&lt;br /&gt;&lt;br /&gt;And, let's not forget the &lt;a href="http://johnny.ihackstuff.com/ghdb/"&gt;Google Hacking Database&lt;/a&gt; or how to use Google to &lt;a href="http://it.slashdot.org/article.pl?sid=07/11/20/1914209"&gt;crack MD5-hashed passwords&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5857070995885518489?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5857070995885518489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5857070995885518489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5857070995885518489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5857070995885518489'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/07/and-now-demonstration-in-how.html' title='And now, a demonstration in how ridiculously easy it is to hack stuff with Google'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-910590543527626204</id><published>2009-07-12T10:18:00.001-07:00</published><updated>2009-07-12T10:23:16.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='at'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>batch: like at, but better</title><content type='html'>&lt;a href="http://linux.die.net/man/1/batch"&gt;batch&lt;/a&gt; is a tool that is identical to &lt;a href="http://linux.die.net/man/1/batch"&gt;at&lt;/a&gt; (same manpage even), except it runs a specified job when the &lt;a href="http://www.linuxjournal.com/article/9001"&gt;load&lt;/a&gt; averages are low instead of at a certain time.  Very handy if one needs a job to execute on a busy server and doesn't care when it happens, just that it happens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-910590543527626204?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/910590543527626204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=910590543527626204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/910590543527626204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/910590543527626204'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/07/batch-like-at-but-better.html' title='batch: like at, but better'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8229178009080749423</id><published>2009-05-31T14:37:00.000-07:00</published><updated>2009-05-31T14:49:02.472-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stanford'/><title type='text'>Stanford students 'better than other people'?</title><content type='html'>&lt;span id="mn_Global"&gt;&lt;span id="mn_Article"&gt;A telling quote from a Stanford student in today's San Jose Mercury News &lt;a href="http://www.mercurynews.com/topstories/ci_12486425?nclick_check=1"&gt;front-page story&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"When they welcome you to freshman orientation," Robbins says, "part of what they tell you is that you're better than other people."&lt;br /&gt;&lt;br /&gt;Not smarter, not better at standardized test scores or kissing ass to get ahead, but unequivocally superior human beings than all those proles that attend state schools.  I have to say, this quote typifies the holier-than-thou, aristocratic, snub-nosed attitude that runs through a lot of the student body (and faculty).&lt;/span&gt;&lt;/span&gt;&lt;span id="mn_Global"&gt;&lt;span id="mn_Article"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8229178009080749423?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8229178009080749423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8229178009080749423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8229178009080749423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8229178009080749423'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/05/stanford-students-better-than-other.html' title='Stanford students &apos;better than other people&apos;?'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8951420477581024287</id><published>2009-05-30T00:24:00.001-07:00</published><updated>2010-06-10T12:12:42.671-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.pythonrc.py'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>My .pythonrc.py</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import os&lt;br /&gt;import atexit&lt;br /&gt;&lt;br /&gt;# color prompt&lt;br /&gt;sys.ps1 = '\001\033[1;36m\002&gt;&gt;&gt; \001\033[0m\002'&lt;br /&gt;&lt;br /&gt;# tab completion&lt;br /&gt;# from http://www.doughellmann.com/PyMOTW/rlcompleter/index.html&lt;br /&gt;try:&lt;br /&gt; import readline&lt;br /&gt;except ImportError:&lt;br /&gt; # Silently ignore missing readline module&lt;br /&gt; pass&lt;br /&gt;else:&lt;br /&gt; import rlcompleter&lt;br /&gt; readline.parse_and_bind("tab: complete")&lt;br /&gt;&lt;br /&gt;# history&lt;br /&gt;# from http://dotfiles.org/~remote/.pythonrc.py&lt;br /&gt;histfile = os.path.join(os.environ["HOME"], ".python_history")&lt;br /&gt;try:&lt;br /&gt; readline.read_history_file(histfile)&lt;br /&gt;except IOError:&lt;br /&gt; pass&lt;br /&gt;&lt;br /&gt;atexit.register(readline.write_history_file, histfile)&lt;br /&gt;del os, histfile&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If running 'python' on the command line does not run the file, you can always alias python to 'python -i ~/.pythonrc.py'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8951420477581024287?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8951420477581024287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8951420477581024287' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8951420477581024287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8951420477581024287'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/05/my-pythonrcpy.html' title='My .pythonrc.py'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5394574769644195092</id><published>2009-05-26T23:21:00.000-07:00</published><updated>2009-05-26T23:24:16.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crime of reason'/><category scheme='http://www.blogger.com/atom/ns#' term='critique'/><category scheme='http://www.blogger.com/atom/ns#' term='robert laughlin'/><title type='text'>Critique of Laughlin's "The Crime of Reason"</title><content type='html'>When I saw Robert &lt;span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; speak at Stanford, I was terribly disturbed by some of his ideas and intrigued by others.  As someone who drinks the free software/culture &lt;span class="misspell" suggestions="kook,Koo,Kohl,cool,kohl"&gt;kool&lt;/span&gt;-aid, I was always of the opinion that the free flow of information helped humanity, not hurt it.  As a follow up on his talk, I decided to pick up a copy of &lt;span class="misspell" suggestions="Laughing's,Laughton's,Lanolin's,Lifeline's,Lurline's"&gt;Laughlin's&lt;/span&gt; book, &lt;a title="The Crime of Reason" href="http://www.amazon.com/Crime-Reason-Closing-Scientific-Mind/dp/0465005071" id="xv2x"&gt;The Crime of Reason&lt;/a&gt;, to investigate his ideas further.  The book, like is talk, contains some very interesting and important ideas but is poorly put together and rather meandering.  Writing style aside, the book discusses the following topics, which I will comment on in turn:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;The Intellectual Property system is necessary for economic progress&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; states that "Universal access to knowledge is fundamentally incompatible with market economics." (p.45)  By this he mostly means that the patent system in the United States is necessary for economic development.  He doesn't provide any convincing evidence to back this up, but merely provides a false analogy equating the economy with a game of poker in which everyone has incentives to hide and steal from each other.  Perhaps these dynamics apply in certain sectors of the economy (particularly looking through the lens of a physicist who has spent his entire life inside the bowels of the military-industrial complex), but in other cases they do not.  The open-source software industry immediately springs to mind as an example in which companies have an interest in freely sharing knowledge with each other.&lt;br /&gt;&lt;br /&gt;In any event, the idea of the necessity of a patent system has been completely eviscerated by &lt;span class="misspell" suggestions="Bouldering,Bolding,Aldrin,Balduin,Baldwin"&gt;Boldrin&lt;/span&gt; and Levine in their book &lt;a title="Against Intellectual Monopoly" href="http://www.amazon.com/Against-Intellectual-Monopoly-Michele-Boldrin/dp/0521879280" id="owmk"&gt;Against Intellectual Monopoly&lt;/a&gt;.  Looking at history, the acquisition of a patent in a particular field coincided with a stall of progress in an industry until the patent expired and, not coincidentally, substantially increased patent lawsuits within that industry as the patent holder sought to restrict anyone else from innovating.  Patents are a type of monopoly and, as any econ 101 student will tell you, monopolies are a Bad Thing because they deprive both consumers of a low cost for products and also prevent other potential producers from making money by entering the market.  Awarding patents is hardly "necessary for living" (p.49) as &lt;span id="bad_word" class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; claims.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How and why technical knowledge becomes illegal&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;The main thrust of the book has to do with the troubling tendency of modern societies to effectively outlaw knowledge.  &lt;span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; compiles a list of fields today whose study has been criminalized in some form or another:&lt;br /&gt;&lt;br /&gt;- cryptography&lt;br /&gt;- circumvention (&lt;span class="misspell" suggestions="YMCA,MAC,MYCA,MICA,DC"&gt;DMCA&lt;/span&gt;)&lt;br /&gt;- physics (nukes)&lt;br /&gt;- genetics&lt;br /&gt;- bioengineering (engineered diseases)&lt;br /&gt;- biology (cloning, chimeras)&lt;br /&gt;- national security related processes&lt;br /&gt;- chemistry&lt;br /&gt;- etc.&lt;br /&gt;&lt;br /&gt;He asserts that learning about these fields has been criminalized either in the law itself (which is rarely challenged in open court because of the potential government 'secrets' a trial could leak) or by &lt;span class="misspell" suggestions="DE,De,DEA,DOE,Dee"&gt;de&lt;/span&gt; facto means such as withdrawal of research funds or public ostracism.  This development, of course, is quite at odds with the way that learning is supposed to work in our society, as &lt;span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; recognizes: "Modern civilization rests on two mutually exclusive kinds of thinking -- one embodied in the free speech guarantees in the First Amendment of the U.S. constitution, the other in the Atomic Energy Act." (p.82)  His most effective case in point is that of nuclear physics, in which the U.S. government has led a campaign of a quasi-legal nature to suppress the spreading of knowledge on the subject.  He reasons that this censorship "set a precedent that has now led, by small steps, to a significant and growing threat to our freedom to reason and learn." (p.84)  This is the most convincing, and consequential, argument of the book, and deserves serious thought by all members of our government and society.  Are we really willing to sacrifice our freedoms to pursue intellectually interesting scientific facts for the sake of purported security, morality and order?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The consequences for a society which deems scientific knowledge illegal&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;In the final chapter, &lt;span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline"&gt;Laughlin&lt;/span&gt; conducts a thought experiment: what will smart people do if and when we achieve this nightmare society in which the pursuit of any and all interesting technical knowledge is illegal?  &lt;span class="misspell" suggestions="Laughing's,Laughton's,Lanolin's,Lifeline's,Lurline's"&gt;Laughlin's&lt;/span&gt; suggestion that "The sensible course of action would probably be to give up" (p.144) is deeply unsatisfying.  He then postulates that the talented technical folk (that is, everyone that didn't become a doctor or a lawyer or a businessman) will either seek employment in the service of rogue dictatorships that allow science, become 'guerrilla warriors' of a sort within their own country or go somewhere else (in the interplanetary sense) to establish a new society where there is no crime of reason.  It's very romantic to think of the creation of a new order by a disgruntled segment of society (a la the emigration of persecuted religious groups to America).  If it is necessary, however, is another matter entirely.  It's certainly way too early, in my opinion, to 'give up' on our present society.  A more enlightened public debate on this topic, if not reform, is not out of reach.&lt;br /&gt;&lt;br /&gt;You can read &lt;a href="http://www.amazon.com/Crime-Reason-Closing-Scientific-Mind/product-reviews/0465005071/ref=cm_cr_dp_all_helpful?ie=UTF8&amp;amp;coliid=&amp;amp;showViewpoints=1&amp;amp;colid=&amp;amp;sortBy=bySubmissionDateDescending"&gt;other peoples' opinions on the book on Amazon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5394574769644195092?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5394574769644195092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5394574769644195092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5394574769644195092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5394574769644195092'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/05/critique-of-laughlins-crime-of-reason.html' title='Critique of Laughlin&apos;s &quot;The Crime of Reason&quot;'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8188604733185538610</id><published>2009-05-21T22:04:00.000-07:00</published><updated>2011-02-04T23:42:11.248-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter: Good or Evil (or Irrelevant or Same ol')?</title><content type='html'>Everyone seems to be talking about and using &lt;a title="Twitter" href="http://twitter.com/" id="ybce"&gt;Twitter&lt;/a&gt; these days (I'm not on it and have no plans to join in the immediate future).  It seems as though Twitter is the newest wave of social media hype, for better or for worse.  If you cut through the frenzied enthusiasm about Twitter, however, you get a picture of a service that is just another method of communication, with all the positives and negatives that that provides (albeit with a unique short-message twist).&lt;br /&gt;&lt;br /&gt;Twitter has proven itself as one of a number of social media platforms that can be used to report breaking news events faster than traditional news reporters can arrive on the scene.  The most important and striking example of this was the coverage of the &lt;a title="Mumbai Terror Attacks" href="http://www.telegraph.co.uk/news/worldnews/asia/india/3530640/Mumbai-attacks-Twitter-and-Flickr-used-to-break-news-Bombay-India.html" id="j463"&gt;&lt;span class="misspell" suggestions="Mamba,Mambo,Rumba,Mambas,Mumble"&gt;Mumbai&lt;/span&gt; Terror Attacks&lt;/a&gt;.  Other sites, notably &lt;span class="misspell" suggestions="Wiped,Wimped,Kipped,Wicked,Whipped"&gt;Wikipedia&lt;/span&gt; and &lt;span class="misspell" suggestions="Flickery,Flicker,Flick,Flicks,Flickers"&gt;Flickr&lt;/span&gt;, also contained up-to-the-minute details of the attack that mainstream media sites such as CNN cribbed for their stories on the incident.  Twitter has also been used by activists to organize and rapidly disseminate information.  Consider reporters in Egypt that were &lt;a title="able to alert colleagues to their arrest" href="http://www.cnn.com/2008/TECH/04/25/twitter.buck/" id="hvoq"&gt;able to alert colleagues to their arrest&lt;/a&gt; via Twitter.  Others recently mounted a campaign to expose Amazon.&lt;span class="misspell" suggestions="Com's,Como's,coma's,corm's,Cm's"&gt;com's&lt;/span&gt; system that placed &lt;a title="gay and lesbian-related items lower" href="http://www.internetnews.com/ec-news/article.php/3815101" id="j20c"&gt;gay and lesbian-related items lower&lt;/a&gt; in the site rankings.&lt;br /&gt;&lt;br /&gt;But Twitter not only has the power to educate and organize, it also has the power to misinform.  Consider the recent swine flu panic: Twitter users reacted to the global scare by essentially &lt;a title="amplifying the pig paranoia" href="http://neteffect.foreignpolicy.com/posts/2009/04/25/swine_flu_twitters_power_to_misinform" id="a.nf"&gt;amplifying the pig paranoia&lt;/a&gt; rather than providing any useful information about the disease.  The 'social' factor of Twitter exacerbates this phenomena: often users post not to communicate substance, but to fit in.  The result is a hysterical echo chamber of misinformation.  (In fact, the author of the linked Foreign Policy article speculates that Twitter would be a very good medium for someone who wanted to intentionally incite fear in the populace.)  &lt;span class="misspell" suggestions="Valley wag,Valley-wag,Vallejo,Valenka,Villeinage"&gt;Valleywag&lt;/span&gt; nicely &lt;a title="summarizes this point" href="http://valleywag.gawker.com/5254702/why-googlefail-is-really-a-twitterfail" id="t93v"&gt;summarizes this point&lt;/a&gt;: "What Twitter actually does is inflate problems out of all proportion, as &lt;span class="misspell" suggestions="Totterers,Twittered,Twitters,Totterer's,Twittery"&gt;Twitterers&lt;/span&gt; noisily tweet about how with it, on it, and over it they all are, repeating each other's messages without adding anything of value. Any [person looking to inform themselves] would go mad long before he extracted useful information."  The desire of many Twitter users to be on the cutting edge of news also enhances their gullibility, and the lack of context inherent in 140 character posts makes it much easier to pull the wool over a reader's eyes.  Twitter users fell for the &lt;span class="misspell" suggestions="Fax,fax,aux,flux"&gt;faux&lt;/span&gt; news items of &lt;a title="Patrick Swaze's death" href="http://valleywag.gawker.com/5261286/todays-twitter-hysteria-says-patrick-swayze-has-died-he-didnt" id="nzyk"&gt;Patrick &lt;span class="misspell" suggestions="Swazi's,Swazis,Saxe's,Swanee's,Sewage's"&gt;Swaze's&lt;/span&gt; death&lt;/a&gt; and nefarious items snuck into &lt;a title="Obama's stimulus package" href="http://www.dailykos.com/story/2009/3/26/713407/-Twitter-+-StimulusConservative-Stupidity" id="sm0o"&gt;&lt;span class="misspell" suggestions="IBM's,Obama,ABMs,Asama's,Baum's"&gt;Obama's&lt;/span&gt; stimulus package&lt;/a&gt;, to cite only two examples.&lt;br /&gt;&lt;br /&gt;The fact that entries on Twitter are limited to 140 characters apiece makes it difficult to convey much useful insight in one post.  Many use Twitter for precisely that reason -- they have little or nothing to say.  Glenn &lt;span class="misspell" suggestions="Grunewald,Reinwald,Greenwood,Greenmailed,Greenfield"&gt;Greenwald&lt;/span&gt; &lt;a title="nails it" href="http://www.salon.com/opinion/greenwald/2009/03/22/various_matters/" id="iye0"&gt;nails it&lt;/a&gt;:  "About Twitter messages, John says 'they all read like cell phone text messages between 12 year &lt;span class="misspell" suggestions="ODs,old,bolds,colds,folds"&gt;olds&lt;/span&gt;,' and indeed, the only purpose I can discern is that it provides a format for expressing thoughts that are too inconsequential to merit a stand-alone article or post.  For precisely that reason, it is unsurprising that Twitter has become &lt;a target="_blank" href="http://www.washingtonpost.com/wp-dyn/content/article/2009/02/22/AR2009022201921.html"&gt;a huge hit among our media stars&lt;/a&gt;, for whom triviality is a guiding principle."  Appropriately, a vast cult of &lt;a title="celebrity Twitter worship" href="http://www.victoriaadvocate.com/news/2009/apr/30/bc-cpt-celebtwittercc-_-entertainment/?entertainment" id="xf0v"&gt;celebrity Twitter worship&lt;/a&gt; has emerged, with eager fans eating up every last tasteless morsel that is tossed to them by their gods.  The fact that Twitter is often an outlet for the mundane is hammered home by spoof sites such as &lt;a title="MyLifeIsAverage" href="http://www.techcrunch.com/2009/05/14/mylifeisaverage-the-service-twitter-was-meant-to-be/" id="jiqc"&gt;&lt;span class="misspell" suggestions=""&gt;MyLifeIsAverage&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Quite possibly the most devastating critique of Twitter is not that it incites fear or inhabited by vapid users, but that there is simply nothing special about it -- that it is more of the same.  Seth &lt;span class="misspell" suggestions=""&gt;Finkelstein&lt;/span&gt; &lt;a title="maintains" href="http://sethf.com/infothought/blog/archives/001428.html" id="ky82"&gt;maintains&lt;/a&gt; that Twitter is just another &lt;a title="sucker's game that only serves the needs of a tiny elite" href="http://www.guardian.co.uk/technology/2009/may/07/twitter-is-a-suckers-game" id="j3dr"&gt;sucker's game that only serves the needs of a tiny elite&lt;/a&gt;: 'After I saw Twitter in use, I realised the difference was that, while &lt;span class="misspell" suggestions="RIC,IRV,IR,RC,ARC"&gt;IRC&lt;/span&gt; had all participants equal, Twitter implements a distilled version of many problematic aspects of blogging. Namely, a one-to-many broadcasting system that serves the needs of high-attention individuals, combined with an appeal to low-attention individuals that the details of one's life matter to an audience... Twitter is low-level celebrity for the chattering class. And the pathologies of celebrity are all on display, including the exploitative industries that prey on the human desire to be heard and noticed. My answer to &lt;span class="misspell" suggestions="Twitters,Twister's,Tweeter's,Titer's,Titters"&gt;Twitter's&lt;/span&gt; slogan of "What are you doing?" is: 'Not playing a sucker's game.'"  Twitter, in other words, is just another way for the powerful to broadcast their message and for advertisers to blast users with pitches for their newest products and &lt;a title="peer into consumers' minds" href="http://www.nytimes.com/2009/04/14/technology/internet/14twitter.html?pagewanted=2&amp;amp;_r=1&amp;amp;partner=rss" id="h:mw"&gt;peer into consumers' minds&lt;/a&gt;, all the while deluding the average user that it's an empowering service.&lt;br /&gt;&lt;br /&gt;Clearly, Twitter is many things to many people.  Perhaps that's the only conclusion that one can draw from such a myriad of uses.  Twitter is a communication medium and, like any other one, can be used and &lt;a title="abused" href="http://www.theage.com.au/news/technology/security/report-warns-of-terrorist-twitter-dangers/2008/10/27/1224955904519.html" id="nb49"&gt;abused&lt;/a&gt; for just about any purpose.  Although Twitter encourages its own unique kind of communication from being a 140-character accepting social media service, many of these sites' quirks are simply a reflection of their users, and it's wrong to blame the tool for having too much influence in shaping what people do with it.  As one &lt;a title="responder to Greenwald put it" href="http://letters.salon.com/opinion/greenwald/2009/03/22/various_matters/permalink/f6db5aa3862e7c65f04ebadd4b204fc1.html" id="cj10"&gt;responder to &lt;span class="misspell" suggestions="Grunewald,Reinwald,Greenwood,Greenmailed,Greenfield"&gt;Greenwald&lt;/span&gt; put it&lt;/a&gt;, "Criticizing the form [of Twitter] is like criticizing haiku as a form."&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;TechCrunch takes a &lt;a href="http://www.techcrunch.com/2009/11/07/nsfw-after-fort-hood-another-example-of-how-citizen-journalists-cant-handle-the-truth/"&gt;pessimistic viewpoint&lt;/a&gt;, in the context of the Fort Hood Massacre.&lt;/li&gt;&lt;li&gt;Valleywag &lt;a href="http://valleywag.gawker.com/5404764/killing-them-softly-the--______-is-dead-twitter-meme"&gt;lays down the rules&lt;/a&gt; for the manipulate-the-gullible-public-into-believing-someone-is-dead-when-they're-not game&lt;/li&gt;&lt;li&gt;Joel Spolsky also has some &lt;a href="http://www.joelonsoftware.com/items/2010/03/14.html"&gt;unkind words&lt;/a&gt; for Twitter&lt;/li&gt;&lt;li&gt;&lt;a href="http://sethf.com/infothought/blog/archives/001433.html"&gt;Study&lt;/a&gt;: Men follow Men and Nobody Tweets&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I finally caved.  &lt;a href="http://twitter.com/#%21/danny_colligan"&gt;danny_colligan&lt;/a&gt; is my twitter handle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8188604733185538610?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8188604733185538610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8188604733185538610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8188604733185538610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8188604733185538610'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/05/twitter-good-or-evil-or-irrelevant-or.html' title='Twitter: Good or Evil (or Irrelevant or Same ol&apos;)?'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3083377758025519788</id><published>2009-05-17T15:10:00.000-07:00</published><updated>2009-08-23T13:42:25.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>.gdbinit file</title><content type='html'>Personal settings for gdb -- nothing too elaborate&lt;br /&gt;&lt;br /&gt;# color prompt&lt;br /&gt;set prompt \001\033[1;36m\002(gdb) \001\033[0m\002&lt;br /&gt;&lt;br /&gt;# history across invocations&lt;br /&gt;set history save on&lt;br /&gt;set history filename ~/.gdb_history&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3083377758025519788?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3083377758025519788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3083377758025519788' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3083377758025519788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3083377758025519788'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/05/gdbinit-file.html' title='.gdbinit file'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4780434848170057916</id><published>2009-04-25T16:23:00.000-07:00</published><updated>2009-04-25T16:33:42.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ettiquite'/><category scheme='http://www.blogger.com/atom/ns#' term='stanford'/><category scheme='http://www.blogger.com/atom/ns#' term='recruiting'/><title type='text'>How NOT to recruit software engineers</title><content type='html'>After going through Stanford's recruiting process for a summer internship for the first time (and having been contacted sporadically by headhunters for quite some time), I've been genuinely disappointed in a select few of my interactions with recruiters.  A certain subset of recruiters commit some boneheaded errors that one might think would be precluded by an iota of common sense.  These missteps waste my time and give the recruiters' respective companies a bad reputation with the students.  Additionally, I have no reason to think my experience is unique amongst my fellow engineering student peers.  Since my blog is actively read by thousands of recruiters worldwide (well, maybe not, but I'll pretend like it is anyway) I have resolved to better their recruiting process by providing them a few helpful tips on what NOT to do when trying to gather talent:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Schedule appointments unilaterally&lt;/b&gt;&lt;br /&gt;Remember, the applicant's life already revolves around your company, so have no qualms about telling him when an interview will be.  Never take his schedule or conflicts into account.  Never ask if he can make an appointment, simply assume he can.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Don't keep appointments&lt;/b&gt;&lt;br /&gt;&lt;span class="body"&gt;If you schedule an appointment with a recruit, make sure you do not show up.  Optionally, show up at a different time and/or place.  The same goes for phone calls: try calling at a different time than which you promised.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't follow up after interviews&lt;/b&gt;&lt;br /&gt;Feel free to cut off contact with the recruit at any time, for any reason or without reason.  Resist closure for the applicant.  Never tell him if or why he was or was not accepted for the position.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Strive for an inconsistent message&lt;/b&gt;&lt;br /&gt;Make sure the recruit has multiple contacts at the company, and make sure each of them is sending him a different message.  Give him the impression that working for your company will entail functioning within a hopelessly mismanaged bureaucracy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Be annoying&lt;/b&gt;&lt;br /&gt;Clog the recruit's inbox with as much irrelevant information as possible.  Send multiple copies of the same email.  Send the same message over several different mediums (phone, email, pager, carrier pigeon, etc.).  Ensure that mandatory forms are filled out multiple times.  Redouble your efforts after the recruit says he is not available or not interested.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Treat the applicant like a number, not a person&lt;/b&gt;&lt;br /&gt;Make sure the recruit knows that he is just another anonymous cog in the corporate machine.  Send out obviously templatized emails that start with things such as "Dear $applicantName."  Never make exceptions for an individual's extenuating circumstances.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Never apologize&lt;/b&gt;&lt;br /&gt;No matter how badly you screw up, never acknowledge that you did anything wrong.  Refuse to apologise.  Stand your ground, especially in the case of overwhelming evidence to the contrary.&lt;br /&gt;&lt;br /&gt;On a related note, if you are a recruiter/interviewer and wondering what you &lt;i&gt;should&lt;/i&gt; be doing, please read the authoritative documents on &lt;a title="recuiting" href="http://www.joelonsoftware.com/articles/FindingGreatDevelopers.html" id="nv.o"&gt;recruiting&lt;/a&gt;  and &lt;a title="interviewing" href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html" id="u1rt"&gt;interviewing&lt;/a&gt; from the &lt;a title="Joel on Software blog" href="http://www.joelonsoftware.com/" id="l9nj"&gt;Joel on Software blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4780434848170057916?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4780434848170057916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4780434848170057916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4780434848170057916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4780434848170057916'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/04/how-not-to-recruit-software-engineers.html' title='How NOT to recruit software engineers'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5556647685518955443</id><published>2009-02-17T19:48:00.000-08:00</published><updated>2009-02-17T19:49:51.397-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latitude'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='cell phone'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Dispelling Google Latitude Privacy Hysteria</title><content type='html'>Google recently came out with a new service called &lt;a title="Latitude" href="http://www.google.com/latitude/intro.html" id="b0cf"&gt;Latitude&lt;/a&gt; which allows people to share their locations with each other via a Google Maps interface. [1]  Almost immediately, talk about privacy concerns &lt;a title="dominated the dialogue" href="http://tech.slashdot.org/article.pl?sid=09/02/07/0014204&amp;amp;tid=217" id="xy.z"&gt;dominated the dialogue&lt;/a&gt; concerning Latitude.  These fears, upon closer scrutiny, are largely baseless.  Latitude does not present a significant danger to users' privacy; any suggestion otherwise is mere technophobia and headline-grabbing Google-bashing.&lt;br /&gt;&lt;br /&gt;The most important point in this entire conversation is that your cell phone is already a tracking device in and of itself.  Carrying around a cell phone surreptitiously exposes more personal information than Latitude could ever dream of doing.  The GPS, wireless Internet, and cell phone signals that emanate from your phone can be used to locate you any time your phone is on.  The cell phone companies, obviously, know your location because they need it to deliver you service; the government can get it via &lt;a title="Triggerfish" href="http://www.schneier.com/blog/archives/2008/11/government_can.html" id="ao68"&gt;Triggerfish&lt;/a&gt; or by &lt;a title="just asking" href="http://www.washingtonpost.com/wp-dyn/content/article/2007/11/22/AR2007112201444_pf.html" id="aq_-"&gt;just asking the phone companies&lt;/a&gt;.  But a phone can be used as more than just a locator -- it can also be used as an eavesdropper.  Consider the well-known &lt;a title="NSA surveillance program" href="http://en.wikipedia.org/wiki/NSA_warrantless_surveillance_controversy" id="tb1i"&gt;NSA surveillance program&lt;/a&gt;  that slurps up cell phone conversations, or the ability of the government to listen to whatever noise a cell phone picks up &lt;a title="even when it is powered off" href="http://arstechnica.com/tech-policy/news/2006/12/8343.ars" id="h75j"&gt;even when it is powered off&lt;/a&gt;.  If you are seriously worried about your privacy, you won't even be carrying around a phone in the first place.&lt;br /&gt;&lt;br /&gt;Google Latitude can not honestly be called a privacy threat because it is opt-in at every level and gives one the opportunity to leave or disable the service at any time.  For another person to have access to your location, you must 1) explicitly enable Latitude 2) request the other person to receive your location via Latitude or accept a similar request from him 3) not turn the service off.  Disabling the service can come in the form of either opting out of Latitude entirely or hiding your location temporarily.  You can even enable a 'city-level-only' location option, which only shares your location to the town level of granularity, or set a manuallocation that doesn't move.  (Your mobile location can be exactly determined only if you install Latitude on your mobile phone as opposed to using the stationary option.)  Again, no one besides the group of people you explicitly agree to share your location with can see your location. &lt;br /&gt;&lt;br /&gt;The &lt;a title="example scenarios" href="http://www.privacyinternational.org/article.shtml?cmd%5B347%5D=x-347-563567" id="s0-o"&gt;example scenarios&lt;/a&gt;  that have been raised by &lt;a title="Privacy International" href="http://www.privacyinternational.org/" id="kxw4"&gt;Privacy International&lt;/a&gt; with regard to Latitude's purported privacy degradation that have captured headlines are pretty far-fetched.  All of the scenarios involve a malicious user creating a Google account, enabling Latitude on a phone and giving the phone to someone else with the intention of tracking them (without, of course, informing them that Latitude is enabled on the phone).  Any reasonably competent person would quickly discover that Latitude was enabled on the phone, if he had not inspected the phone in the first place when he initially received it.  There are many other major invasions of privacy taking place elsewhere, and Privacy International would do well to raise a stink about those issues rather than chase windmills at the Googleplex.&lt;br /&gt;&lt;br /&gt;There is a legitimate privacy concern that Google will store the history of a user's location, which could be used to construct a profile of where a user was at certain points in time.  However, Google states in the &lt;a title="Latitude FAQ" href="http://www.google.com/support/mobile/bin/topic.py?topic=19501" id="eo_9"&gt;Latitude FAQ&lt;/a&gt; that this is not the case: "Google Latitude only reports your last updated location and does not keep a history of previously reported locations."  As long as Google keeps its word in this regard, and I believe that to be a reasonably safe assumption, there is no privacy danger here.&lt;br /&gt;&lt;br /&gt;It is unfortunate that so much ado has been made about a service that is essentially a useful visualization of your friend group. [2]  Google Latitude is a service that you should have no qualms about using, provided that carrying around a cell phone does not make you queasy.&lt;br /&gt;&lt;br /&gt;============================&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Footnotes:&lt;/span&gt;&lt;br /&gt;[1]  As several other commentators on Slashdot pointed out, Google is not the first company to offer this kind of service (&lt;a title="Brightkite" href="http://brightkite.com/" id="yi.3"&gt;Brightkite&lt;/a&gt;, &lt;a title="Loopt" href="http://www.loopt.com/" id="f2-d"&gt;Loopt&lt;/a&gt;, and &lt;a title="Mologogo" href="http://www.mologogo.com/" id="tg91"&gt;Mologogo&lt;/a&gt;  to name just a few).&lt;br /&gt;&lt;br /&gt;[2]  One could imagine other use cases: giving truckers cell phones to track their shipments, planning visits to friends based on their proximity to a certain destination, serendipitousmeetup opportunities with nearby friends, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5556647685518955443?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5556647685518955443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5556647685518955443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5556647685518955443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5556647685518955443'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2009/02/dispelling-google-latitude-privacy.html' title='Dispelling Google Latitude Privacy Hysteria'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1145369431086428017</id><published>2008-12-14T13:01:00.000-08:00</published><updated>2008-12-14T13:53:12.313-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='pyramid scheme'/><title type='text'>iPhone App Pyramid Scheme Plan</title><content type='html'>Where is the next fertile soil for a &lt;a href="http://en.wikipedia.org/wiki/Pyramid_scheme"&gt;pyramid scheme&lt;/a&gt;?  Why, the &lt;a href="http://www.apple.com/iphone/appstore/"&gt;iPhone Application store&lt;/a&gt;, of course!  Following these few easy directions, you can scam millions of yuppies for fun and profit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How&lt;/span&gt;: First, create an iPhone Application with some kind of cheesy social-networking appeal (e.g. 'How many friends do you REALLY have?').  It doesn't really matter what the functionality of the app is as long as each install of the app is assigned a unique identifier.  The buyer will enter the id of the person who referred them to the app.  In this way, an n-ary tree can be constructed (with you at the root) of subsequent referrals and installs of the app.  Motivate the spread of the app by promising some amount of money to a user every time someone else buys the app and enters the his or her 'promo code.'  Price the app such that you net the difference of the cost of the app and the amount you are paying out on each install.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why it will work&lt;/span&gt;:  People who purchase iPhones have a &lt;a href="http://www.iphonealley.com/news/app-store-statistics-show-steady-growth-despite-bad-times"&gt;proven record&lt;/a&gt; of buying a lot of iPhone applications with their disposable income.  It is perfectly reasonable to believe that many of them would not mind spending a few bucks more to purchase another novelty application (indeed, some have proven that they will &lt;a href="http://www.foxnews.com/story/0,2933,399461,00.html"&gt;spend a great deal&lt;/a&gt; for a novelty application / status symbol).  Second, sites like Facebook have proven users' insatialbe thirst for social applications that connect them to their friends/coworkers/strangers/etc.  Many of &lt;a href="http://www.facebook.com/apps/"&gt;these applications&lt;/a&gt; exploit some kind of emotional dynamic (for instance, who are your '&lt;a href="http://www.facebook.com/apps/application.php?id=2425101550&amp;amp;b=&amp;amp;ref=pd_r"&gt;Top Friends&lt;/a&gt;'?) to appeal to users.  The sucess of these applications leaves no doubt that other appeals of the same kind would find an audience.  Third, the iPhone App store provides a quick and easy means of distribution and, presumably, payment.  Finally, every pyramid scheme exploits people's motivation for profit, a powerful motive indeed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Variables&lt;/span&gt;:  The setting of a reasonable price and payout is critical.  Ask too much and nobody will buy the app; ask too little and you won't make much money.  Promise too much as a payout and you won't make much money, promise too little and the app will not virally spread.  Another important decision is the appeal of the application -- how are you going to convince uses to buy the application in the first place?  What is the most compelling social/emotional/psychological/whatever message that you can send to them that makes them want to buy?  Going hand in hand with that, what does the application actually do?  Does it simply redirect to a web page showing some statistics of who has recruited the most people to the scheme, or does it have something more sophisticated?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unknowns&lt;/span&gt;:  Apps need to be approved by Apple and can be yanked by Apple at any time, with or without explanation.  The app needs to be written in such a way that it does not appear to be something that Apple would find questionable.  The &lt;a href="http://www.ftc.gov/speeches/other/dvimf16.shtm"&gt;legality&lt;/a&gt; of these practices is another issue.  Depending on what the function of the application is, you might be able to make a case that you are actually delivering a product to the user.  Another unknown is the most effective way to move many small payments of money between people, and what kind of cost is incurred for those services.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1145369431086428017?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1145369431086428017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1145369431086428017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1145369431086428017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1145369431086428017'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/12/iphone-app-pyramid-scheme-plan.html' title='iPhone App Pyramid Scheme Plan'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2147351560772203670</id><published>2008-11-29T13:44:00.000-08:00</published><updated>2008-11-29T14:00:43.947-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><title type='text'>Funny UNIX tricks from Slashdot</title><content type='html'>There was a &lt;a href="http://ask.slashdot.org/article.pl?sid=08/11/05/2027234"&gt;recent story&lt;/a&gt; on slashdot about useless (or useful) things one can do in UNIX.  Being a command line junkie, I read through virtually every comment (all 2300+ of them) to learn some new tricks.  Here are some of the better ones:&lt;br /&gt;&lt;br /&gt;&lt;li face="courier new" id="q:7x"&gt;&lt;a title="Bash History" href="http://www.gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins" id="haly"&gt;Bash History&lt;/a&gt; &lt;/li&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li id="q:7x"&gt;&lt;b&gt;history -c&lt;/b&gt; # clear history (good for preserving privacy/passwords, or check out the more precise -d option)&lt;br /&gt;&lt;/li&gt;&lt;li id="q:7x"&gt;In vi command mode, type &lt;b&gt;/query&lt;/b&gt; and hit &lt;b&gt;Enter&lt;/b&gt; to search history, &lt;b&gt;n&lt;/b&gt; to keep searching backwards, &lt;b&gt;N&lt;/b&gt; to search forwards&lt;/li&gt;&lt;/ul&gt;&lt;li face="courier new" id="q:7x"&gt;&lt;a title="vimdiff" href="http://vim.dindinx.net/vim7/html/diff.txt.php" id="pp40"&gt;vimdiff&lt;/a&gt; &lt;/li&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li id="q:7x"&gt;&lt;b&gt;vimdiff original_file patched_file&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;li id="q:7x"&gt;unified format: open original file, then &lt;b&gt;:vertical diffpatch path/to/diff&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li face="courier new" id="q:7x"&gt;Encryption&lt;/li&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li id="q:7x"&gt;&lt;b&gt;openssl aes-256-cbc -a -e -salt -in INPUT_FILENAME -out OUTPUT_FILENAME&lt;/b&gt; # encrypt&lt;/li&gt;&lt;li id="q:7x"&gt;&lt;b&gt;openssl aes-256-cbc -a -d -salt -in INPUT_FILENAME -out OUTPUT_FILENAME&lt;/b&gt; # decrypt&lt;/li&gt;&lt;li id="q:7x"&gt;&lt;b&gt;echo Oe lbh pna vzcyrzrag UK tbireazrag fgnaqneq rapelcgvba jvgu ge | tr a-z n-za-m&lt;/b&gt; # Rot 13 encrypt/decrypt&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Others:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sleep 8h; cat&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;/dev/urandom &amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;/dev/dsp&lt;/span&gt; # alarm clock&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;eject -T&lt;/span&gt; # close cd tray if open, open if closed (useful to find out which physical machine you are logged into)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sl&lt;/span&gt; # punish users who accidentally type 'sl' instead of 'ls'&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;eposd &amp;amp;&amp;amp; say 'hello'&lt;/span&gt; # make the computer talk&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;:(){&lt;/b&gt;&lt;b&gt; :|:&amp;amp; };:&lt;/b&gt;  # &lt;a title="forkbomb" href="http://wooledge.org:8000/BashFAQ/059" id="g9c9"&gt;forkbomb&lt;/a&gt; (space required between { and :) (protect against this with &lt;a title="ulimit" href="http://www.ss64.com/bash/ulimit.html" id="abg0"&gt;ulimit&lt;/a&gt; -u)&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;for I in $(seq 1 100) ; do echo $I; sleep .25; done | dialog --gauge "PIZZA" 6 50 100&lt;/b&gt; # Pizza timer via &lt;a title="dialog" href="http://linux.die.net/man/1/dialog" id="vjcs"&gt;dialog&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2147351560772203670?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2147351560772203670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2147351560772203670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2147351560772203670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2147351560772203670'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/11/funny-unix-tricks-from-slashdot.html' title='Funny UNIX tricks from Slashdot'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2364326525632826159</id><published>2008-10-29T10:15:00.000-07:00</published><updated>2008-10-30T19:45:57.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='censorship'/><category scheme='http://www.blogger.com/atom/ns#' term='mtvmusic'/><category scheme='http://www.blogger.com/atom/ns#' term='online video'/><category scheme='http://www.blogger.com/atom/ns#' term='mtv'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>New MTV Video Site's Censorship -- Bleeping out Names of File-Sharing Software</title><content type='html'>MTV has just launched a &lt;a href="http://www.mtvmusic.com/"&gt;new online video site&lt;/a&gt;.  While I won't go through the trouble of mocking the site (or the TV network) for its irrelevance (please visit &lt;a href="http://tech.slashdot.org/article.pl?sid=08/10/29/0516228"&gt;this slashdot thread&lt;/a&gt; for plenty of that), it is worth noting that it does have one feature that other video sites do not: in-video censorship!  As &lt;a href="http://slashdot.org/%7EFireye"&gt;this observant slashdot commenter&lt;/a&gt; says:&lt;br /&gt;&lt;blockquote&gt;&lt;div class="commentBody"&gt;    &lt;div id="comment_body_25553673"&gt;&lt;p&gt; I was perusing this yesterday, and came across the Weird Al video "Don't Download This Song". One line in the original song goes:&lt;br /&gt;o/~ Like Morpheus or Grokster or Limewire or KaZaA o/~&lt;/p&gt;&lt;p&gt;But the version on the new MTV site goes:&lt;br /&gt;o/~ Like *beep* or *beep* or *beep* or *beep* o/~&lt;/p&gt;&lt;p&gt;Does anyone know if it was aired on MTV/VH1 this way, or is this unique to the web version?&lt;/p&gt;&lt;p&gt;MTV: &lt;a href="http://www.mtvmusic.com/video/?id=108884" title="mtvmusic.com" rel="nofollow"&gt;http://www.mtvmusic.com/video/?id=108884&lt;/a&gt; [mtvmusic.com]&lt;br /&gt;Youtube: &lt;a href="http://www.youtube.com/watch?v=Yz-grdpKVqg" title="youtube.com" rel="nofollow"&gt;http://www.youtube.com/watch?v=Yz-grdpKVqg&lt;/a&gt; [youtube.com]&lt;/p&gt;&lt;/div&gt;  &lt;/div&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;&lt;br /&gt;More coverage: &lt;a href="http://news.slashdot.org/article.pl?sid=08/10/30/2324231&amp;amp;from=rss"&gt;Slashdot&lt;/a&gt; &lt;a href="http://www.techdirt.com/articles/20081030/0358562688.shtml"&gt;Techdirt &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2364326525632826159?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2364326525632826159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2364326525632826159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2364326525632826159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2364326525632826159'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/10/new-mtv-video-sites-obvious-censorship.html' title='New MTV Video Site&apos;s Censorship -- Bleeping out Names of File-Sharing Software'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3278886485038082306</id><published>2008-10-23T17:21:00.000-07:00</published><updated>2008-10-23T17:41:45.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DRM'/><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><title type='text'>Interesting New Perspective on DRM</title><content type='html'>While browsing a Slashdot thread about &lt;a href="http://it.slashdot.org/article.pl?sid=08/10/23/1520201&amp;amp;from=rss"&gt;a purported "open-source &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DRM&lt;/span&gt;" product&lt;/a&gt; I came across an interesting comment by a guy named &lt;a href="http://slashdot.org/%7ESancho"&gt;Sancho&lt;/a&gt;.  While I had always viewed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;DRM&lt;/span&gt; as a uniquely new development, he ties it to practices that have been &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;occurring&lt;/span&gt; in the recording industry for some time:&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I tend to think of it as ensuring repeated sales of their art throughout their lifetimes.&lt;/p&gt;&lt;p&gt;For a while there, ensuring this was as easy as making sure that your music was released on the format &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;du&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;jour&lt;/span&gt;. Records, 8-tracks, cassettes, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;CDs&lt;/span&gt;.... With the advent of digital music sans a physical medium, this trend of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;rebuying&lt;/span&gt; all of your albums is at risk. Suddenly, you're faced with customers never having to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;rebuy&lt;/span&gt; the White album, and you see your sustained profits going down the tubes.&lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;DRM&lt;/span&gt; solves that. Now, rather than coming out with a new format every few years, you just have to come up with a new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;DRM&lt;/span&gt; scheme and turn off the old servers. Because the devices playing the music are somewhat general purpose, it's easy to move quickly--you don't have to worry about market penetration for the players, because it's just a free software update away.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;One small point: in the old days, format upgrades, say from tape to CD, often brought with them added benefits (better sound quality, more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;convenient&lt;/span&gt; access to songs, larger storage space, etc.) so there were actually &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;justifiable&lt;/span&gt; reasons to upgrade.  Now, switching from one &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;DRM&lt;/span&gt;-encumbered format to the next offers no such incentives for the consumer.&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3278886485038082306?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3278886485038082306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3278886485038082306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3278886485038082306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3278886485038082306'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/10/interesting-new-perspective-on-drm.html' title='Interesting New Perspective on DRM'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1359494099707993713</id><published>2008-10-10T21:33:00.000-07:00</published><updated>2008-10-10T21:38:57.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='wmctrl'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><title type='text'>wmctrl and friends</title><content type='html'>&lt;a href="http://www.sweb.cz/tripie/utils/wmctrl/"&gt;wmctrl&lt;/a&gt; seems like an awesome utility.  I first read about it in Kyle Rankin's Linux Journal column &lt;a href="http://www.linuxjournal.com/article/9973"&gt;here&lt;/a&gt;.  The wmctrl project page also has links to a bunch of other desktop-automation and related utilities.  This is all going in the "to learn when I have some spare time" file along with &lt;a href="http://www.gnu.org/software/screen/"&gt;screen&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1359494099707993713?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1359494099707993713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1359494099707993713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1359494099707993713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1359494099707993713'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/10/wmctrl-and-friends.html' title='wmctrl and friends'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8164410275239763056</id><published>2008-09-08T18:43:00.000-07:00</published><updated>2010-04-02T13:10:18.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='critique'/><category scheme='http://www.blogger.com/atom/ns#' term='Jonathan Zittrain'/><title type='text'>Critique of Zittrain's "The Future of the Internet and How to Stop It"</title><content type='html'>One book that the technorati have been talking about recently (ok, not so recently... it took me a while to write this article) is Jonathan Zittrain's &lt;i id="k9as"&gt;&lt;a title="The Future of the Internet and How to Stop It" href="http://www.amazon.com/Future-Internet-How-Stop/dp/0300124872" id="dj:n"&gt;The Future of the Internet and How to Stop It&lt;/a&gt;&lt;/i&gt;.  For a book written by a &lt;a title="co-founder" href="http://cyber.law.harvard.edu/people" id="apan"&gt;co-founder&lt;/a&gt; of the Berkman Center and someone who is a remarkably good speaker, I found the work to be disappointing.  The book's argument is not convincing and the writing seems to lack discipline, often wandering from one loosely related subject to another.&lt;br /&gt;&lt;br /&gt;Zittrain's main point is that the security failings of generative technologies will push consumers to buy more restrictive, and supposedly safer, devices.  This claim has a number of problems with it.  The first is that tethered devices are not safer or more secure than generative ones -- in fact, normally the opposite is true.  Compare the number of vulnerabilities in the Windows operating systems vs the number in Linux or BSD operating systems.  Or bugs in Internet Explorer vs bugs in Firefox.  This claim is even more dubious the more control the manufacturer has over the device:  &lt;a title="Richard Stallman" href="http://en.wikipedia.org/wiki/Richard_Stallman" id="o1.y"&gt;Richard Stallman&lt;/a&gt; points out in his &lt;a title="response" href="http://bostonreview.net/BR33.2/stallman.php" id="ok2u"&gt;response&lt;/a&gt; to Zittran that the iPhone's remote kill-switch makes the iPhone "designed for remote attack by Apple."&lt;br /&gt;&lt;br /&gt;The second problem with Zittrain's principal claim is that a consumer has no incentive to prefer a non-generative device.  Since non-generative devices are less secure than generative ones, any purported advantage that the non-generative device manufacturer could claim is lost.  There is empirical evidence to support the belief that consumers prefer generative devices --Stallman cites the number of jailbroken iPhones as an example.  Roger Grimes adds in his  &lt;a title="response" href="http://bostonreview.net/BR33.2/grimes.php" id="galn"&gt;response&lt;/a&gt;: "It’s hard to say that closed systems are taking a more prominent role when open examples abound. Even the 'closed' systems he mentions are becoming more open thanks to competition and customer demand."&lt;br /&gt;&lt;br /&gt;Even if, for the sake of argument, locked-down devices were somehow more secure than generative devices, consumers wouldn't necessarily migrate to non-generative appliances because users rarely make purchasing decisions based on security.  Most computers are purchased because the user is comfortable with the platform or because he thinks that the computer is pretty or because that particular computer is necessary to run some type of software.  Rarely will a run-of-the-mill consumer take into account a record of operating system vulnerabilities or the pros and cons of different systems architectures when deciding between OSX and Windows.&lt;br /&gt;&lt;br /&gt;There are other shortcomings of the book besides the weakness of the main argument.  For one, Zittrain mistakes generativity as being a zero-sum game: something is either generative or it isn't.  There is a continuum of generativity: for instance, Linux is more generative than Windows XP, but Windows XP is more generative than Windows Vista.  It is a fallacy to simply assume that all products fall into one non-generative bucket or the other generative one.&lt;br /&gt;&lt;br /&gt;For a book whose title suggests solutions to the problems with the Internet, Zittran's ideas underdeliver.  Virtual machines, extra-legal incentives, data portability and network neutrality are all things that are familiar, and have been, to policymakers and programmers for a while.  In a book such as this which only worries about theoretical overtures and not about the detailed technical implementation, more out-of-the-box, grander thinking and proposals would have been welcome.&lt;br /&gt;&lt;br /&gt;The book has a couple of chapters that feel decidedly out of place.  The final chapter regarding privacy and the chapter exploring Wikipedia both don't seem to fit in to the framework of the book.  That being said, both are certainly worthy of scholarship on their own merits.  I particularly found the chapter on privacy engaging, if not particularly relevant to the rest of the book.&lt;br /&gt;&lt;br /&gt;Zittrain's book is still worth a read: it addresses areas of concern in today's Internet and references much interesting material.  The end result, however, is unconvincing and disappointing -- keep a few grains of salt handy when reading.&lt;br /&gt;&lt;br /&gt;=========================================&lt;br /&gt;&lt;b id="s0:b"&gt;REFERENCES / FURTHER READING&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="Jonathan Zittrain" href="http://en.wikipedia.org/wiki/Jonathan_Zittrain" id="o81j"&gt;Jonathan Zittrain&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/zittrain.php&lt;br /&gt;"Protecting the Internet Without Wrecking It"&lt;br /&gt;&lt;br /&gt;&lt;a title="Richard Stallman" href="http://en.wikipedia.org/wiki/Richard_Stallman" id="spj3"&gt;Richard Stallman&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/stallman.php&lt;br /&gt;"The root of this problem is software controlled by its developer"&lt;br /&gt;&lt;br /&gt;&lt;a title="Bruce M Owen" href="http://en.wikipedia.org/wiki/Bruce_M._Owen" id="rvyv"&gt;Bruce M Owen&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/owen.php&lt;br /&gt;"As long as flexibility has value to users, suppliers will have incentives to offer it"&lt;br /&gt;&lt;br /&gt;Roger A Grimes&lt;br /&gt;http://bostonreview.net/BR33.2/grimes.php&lt;br /&gt;"Fixing Web insecurity requires more than a caring community"&lt;br /&gt;&lt;br /&gt;&lt;a title="Hal Varian" href="http://en.wikipedia.org/wiki/Hal_R._Varian" id="x4cw"&gt;Hal Varian&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/varian.php&lt;br /&gt;"Ultimately, the best protection is an informed buyer who demands openness"&lt;br /&gt;&lt;br /&gt;&lt;a title="Susan Crawford" href="http://en.wikipedia.org/wiki/Susan_Crawford_%28Professor%29" id="d7:j"&gt;Susan Crawford&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/crawford.php&lt;br /&gt;"In the eyes of many exiting institutions, security isn't a problem -- it's an opportunity"&lt;br /&gt;&lt;br /&gt;&lt;a title="David D. Clark" href="http://en.wikipedia.org/wiki/David_D._Clark" id="kt3p"&gt;David D. Clark&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/clark.php&lt;br /&gt;"We need to develop a socially embedded online experience"&lt;br /&gt;&lt;br /&gt;&lt;a title="Jonathan Zittrain" href="http://en.wikipedia.org/wiki/Jonathan_Zittrain" id="x2.j5"&gt;Jonathan Zittrain&lt;/a&gt;&lt;br /&gt;http://bostonreview.net/BR33.2/zittrainresponse.php&lt;br /&gt;"The best solutions don't assume a zero-sum tradeoff between security and generativity"&lt;br /&gt;&lt;br /&gt;&lt;a title="Coverage on BoingBoing" href="http://www.boingboing.net/2008/07/23/zittrains-the-future.html" id="it63"&gt;Coverage on BoingBoing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://arstechnica.com/articles/culture/book-review-2008-06-2-admin.ars"&gt;Ars Technica review and interview&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8164410275239763056?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8164410275239763056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8164410275239763056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8164410275239763056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8164410275239763056'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/09/critique-of-zittrans-future-of-internet.html' title='Critique of Zittrain&apos;s &quot;The Future of the Internet and How to Stop It&quot;'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3060632684591534039</id><published>2008-08-29T15:59:00.000-07:00</published><updated>2008-08-29T16:00:26.924-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video quality'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Watch High Quality YouTube Videos by Default</title><content type='html'>Explained &lt;a href="http://cybernetnews.com/2008/03/12/watch-youtube-high-quality-videos-by-default/"&gt;here&lt;/a&gt;.  Man, I missed the boat on this one... it's been out for half a year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3060632684591534039?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3060632684591534039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3060632684591534039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3060632684591534039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3060632684591534039'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/watch-high-quality-youtube-videos-by.html' title='Watch High Quality YouTube Videos by Default'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1734947602375967541</id><published>2008-08-29T15:49:00.000-07:00</published><updated>2009-08-20T15:32:21.698-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GMail'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><title type='text'>Cool Gmail Feature -- Periods do not Matter</title><content type='html'>It's true: john.doe@gmail.com is the same email address as johndoe@gmail.com as far as Gmail is concerned.   And to think that everyone makes such a big fuss about making sure you have that period in the right place when they give out their emails...&lt;br /&gt;&lt;br /&gt;This feature is documented in Gmail help &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;amp;ctx=mail&amp;amp;answer=10313#"&gt;here&lt;/a&gt;.  Gmail even idiot-proofs this feature by having a link to the docs when you receive an email at a different address from the one you registered (see photo).&lt;br /&gt;&lt;br /&gt;Some have used this feature to their advantage to &lt;a href="http://lifehacker.com/144397/instant-disposable-gmail-addresses"&gt;reduce spam&lt;/a&gt; or &lt;a href="http://creativebits.org/twitter/one_gmail_many_twitter_accounts"&gt;create multiple accounts&lt;/a&gt; on a web service that all send mail to the same Gmail address.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1m9DQw3ptG4/SLh96PRmbLI/AAAAAAAAAEw/k5XlWqa7juM/s1600-h/blog.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_1m9DQw3ptG4/SLh96PRmbLI/AAAAAAAAAEw/k5XlWqa7juM/s320/blog.jpg" alt="" id="BLOGGER_PHOTO_ID_5240076605931809970" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1734947602375967541?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1734947602375967541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1734947602375967541' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1734947602375967541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1734947602375967541'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/cool-gmail-feature-periods-do-not.html' title='Cool Gmail Feature -- Periods do not Matter'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1m9DQw3ptG4/SLh96PRmbLI/AAAAAAAAAEw/k5XlWqa7juM/s72-c/blog.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8950557473323150697</id><published>2008-08-22T21:39:00.000-07:00</published><updated>2009-07-24T07:11:53.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Thoughts on Facebook and Privacy (or Lack Thereof)</title><content type='html'>After watching a DEFCON 16 presentation about the vulnerabilities in social networks, I reflected further upon Facebook and the privacy it offers you and me, which is close to nil.  Your guarantees to privacy on Facebook depend on a multitude of assumptions, all of which are quite poor. [B]&lt;br /&gt;&lt;br /&gt;First, you are trusting that the Facebook developers have implemented the privacy controls correctly such that there is no inadvertent information leakage on the site as a result of bugs.  I write code for a living, and let me tell you, bug-free code does not exist.  Facebook, like other applications, has had its &lt;a title="share" href="http://www.theregister.co.uk/2007/07/31/facebook/" id="byf2"&gt;share&lt;/a&gt; &lt;a title="of" href="http://ajaxian.com/archives/facebook-javascript-and-security" id="oyyb"&gt;of&lt;/a&gt; &lt;a title="bugs" href="http://www.theregister.co.uk/2008/03/25/facebook_exposes_private_pics/" id="zj1r"&gt;bugs&lt;/a&gt; to scramble to fix in the past (including at least one &lt;a title="truly amateur mistake" href="http://www.techcrunch.com/2007/08/11/facebook-source-code-leaked/" id="d0wp"&gt;truly amateur mistake&lt;/a&gt;) and the future will be (and the present is) no different.&lt;br /&gt;&lt;br /&gt;Second, you are assuming that you can configure the myriad privacy options correctly such that every piece of information on your site is accessible to only those that you want it to be.  Are you really sure that marking one person as only being allowed to see your limited profile and specifying that picture as globally viewable, for example, will turn out the restrictions you desire for the correct people?  How can you tell which preferences override which?  It would certainly be tedious to register other accounts (or use friends') and test various combinations of privacy features against their profiles and I am not aware of anyone that does this.&lt;br /&gt;&lt;br /&gt;Third, anyone that can see your information is capable of leaking it to the public. [A]  With the addition of every friend you are increasing the chance that your pictures, contact info, videos, etc. will be posted and shared outside of the Facebook walled garden.  It is simply not possible that each of your 500 friends is not susceptible to give away information that you thought was just between you and them, especially when they have some kind of (monetary or otherwise) incentive to do so.  The scenarios of a rival political party digging up dirt on a candidate and gossip magazines researching what someone did last night both come to mind.&lt;br /&gt;&lt;br /&gt;Fourth, all of your information can be accessed by any Facebook engineer or executive who choses to do so.  The engineers likely need access to real-world pages to debug their code, and the managers can order information from a compliant underling (if Facebook doesn't have internal tools set up already for them to access this information).  And let's not forget everyone else that works there (sales, PR, HR, etc.) who can request your personal information as a favor from an engineer friend.&lt;br /&gt;&lt;br /&gt;Fifth, just as with any other website, information on Facebook can be subpoenaed in a trial.  Facebook, needing to comply with the law, will gladly turn over your personal information to any judge who so wishes.&lt;br /&gt;&lt;br /&gt;Sixth, let's not forget the countless ways Facebook could involuntarily compromise your information.  A malicious hacker could slurp down personal data off the site.  A Facebook employee could negligently leave an unencrypted disk drive with your information on it in a public place.  Etc.&lt;br /&gt;&lt;br /&gt;The only conclusion is this sound advice: don't put anything on Facebook that you don't want to be exposed to the world.  Because chances are, sooner or later, it will be.&lt;br /&gt;&lt;br /&gt;Footnotes:&lt;br /&gt;&lt;br /&gt;[A] This is, of course, assuming that your group of Facebook friends can not be considered 'the public.'  With the amount of friends some have, and especially one's willingness to accept any request that comes their way and fire out friend requests at random, this distinction begins to blur.&lt;br /&gt;&lt;br /&gt;[B]  I was going to add this post to my &lt;a title="Facebook Sucks" href="http://chainlynx.blogspot.com/2007/12/facebook-sucks.html" id="piy8"&gt;Facebook Sucks&lt;/a&gt; article but it became too long and I thought it deserved a post of its own.&lt;br /&gt;&lt;br /&gt;Updates:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.allfacebook.com/2009/02/facebook-privacy/"&gt;Here&lt;/a&gt; is a post for those that want a HOWTO for micromanaging their privacy settings on Facebook.  (Even Schneier &lt;a href="http://www.schneier.com/blog/archives/2009/02/privacy_on_face.html"&gt;likes it&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://yro.slashdot.org/article.pl?sid=09/03/15/0026215&amp;amp;from=rss"&gt;Here&lt;/a&gt; is a Slashdot story about a court demanding Facebook information pursuant to a case&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8950557473323150697?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8950557473323150697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8950557473323150697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8950557473323150697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8950557473323150697'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/thoughts-on-facebook-and-privacy-or.html' title='Thoughts on Facebook and Privacy (or Lack Thereof)'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-6113685231477724736</id><published>2008-08-19T23:34:00.000-07:00</published><updated>2008-08-26T22:12:34.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DEFCON'/><category scheme='http://www.blogger.com/atom/ns#' term='DEFCON 16'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>DEFCON 16</title><content type='html'>&lt;a title="DEFCON 16" href="https://www.defcon.org/" id="lg4_"&gt;DEFCON 16&lt;/a&gt; was awesome, as expected.  Some highlights:&lt;br /&gt;&lt;ul id="ix_x0"&gt;&lt;li id="ix_x1"&gt;The first presentation I went to was called "Hacking in the Name of Science."  Here a bunch of University of Washington grad students and a professor discussed the sweet research they are doing, almost all of which has been in the news (&lt;a title="Implicating" href="http://www.p2pnet.net/story/16124" id="k5bl"&gt;Implicating&lt;/a&gt; 'downloading' printers to the RIAA monitors, RFID ghost proxies, TCP information leakage, voting machine vulnerabilities, &lt;a title="TrueCrypt vulnerabilities" href="http://www.schneier.com/blog/archives/2008/07/truecrypts_deni.html" id="vmtc"&gt;TrueCrypt vulnerabilities&lt;/a&gt;, &lt;a title="implantable medical device" href="http://www.nytimes.com/2008/03/12/business/12heart-web.html?_r=4&amp;amp;oref=slogin&amp;amp;oref=slogin&amp;amp;oref=slogin&amp;amp;oref=slogin" id="f7va"&gt;implantable medical device&lt;/a&gt; hacking, &lt;a title="ISP injected ads" href="http://vancouver.cs.washington.edu/" id="cfl1"&gt;ISP injected ads&lt;/a&gt;, etc.).  They discussed the difference between just hacking and what you need to do in an academic setting to study what anyone else would call hacking.  They encouraged attending academic security conferences, such as ACM CCS, NDSS, IEEE Security + Privacy, HotSec and Woot&lt;br /&gt;&lt;/li&gt;&lt;li id="kfdp1"&gt;A talk entitled "Satan is on my Friends List" detailed the security vulnerabilities in OpenSocial-enabled websites.  These guys demonstrated some hilarious things, including using a CSRF DOS attack: using an img tag placed in an html-enabled form that displays on a page, you can automatically logout anyone that sees that img by pointing the img's src attribute to the logout page.  The speakers talked about how the socnet widget applications space is essentially a security free-for-all: apps hacking personal information, apps hacking other apps, etc.  An opt-in security model for javascript safety in apps exacerbates the problem.  An amusing conclusion to the talk was the speakers' impersonation of another security researcher on social networks which fooled his colleagues and family alike.&lt;/li&gt;&lt;li id="grkx"&gt;Locksport enthusiast Eric Schmedl gave a talk that had some amusing anecdotes about cloak-and-dagger spying.  &lt;a title="Mary Lou McFate" href="http://www.motherjones.com/news/feature/2008/07/mary-mcfate-sapone-gun-lobby-nra-spy.html" id="veb7"&gt;Mary Lou McFate&lt;/a&gt; (NRA infiltrator of anti-gun groups), &lt;a title="reconstructing passwords from audio of keystrokes" href="http://portal.acm.org/citation.cfm?id=1102169" id="al6h"&gt;reconstructing passwords from audio of keystrokes&lt;/a&gt;, and &lt;a title="multiple" href="http://www.flexispy.com/" id="as6j"&gt;multiple&lt;/a&gt; &lt;a title="phone" href="http://www.world-tracker.com/" id="hal:"&gt;phone&lt;/a&gt; &lt;a title="bugging" href="http://www.builderau.com.au/news/soa/Hack-turns-iPhone-into-spy-phone/0,339028227,339284002,00.htm" id="ey_y"&gt;bugging&lt;/a&gt; technologies were discussed.&lt;/li&gt;&lt;li id="dv_8"&gt;Fyodor gave a talk on nmap, the tool he created and how he used it to scan a large subset of the Internet.  He also presented some new features of the tool, including traceroute, ping, and netcat-like functionality... what can't it do?&lt;/li&gt;&lt;li id="dv_80"&gt;I briefly stopped in on a talk called "Taking Back Your Cellphone" which plugged the site &lt;a title="HowardForums" href="http://www.howardforums.com/" id="ie0t"&gt;HowardForums&lt;/a&gt; as an excellent resource for phone modification.&lt;/li&gt;&lt;li id="lwml"&gt;The activity that I took part in for a fair share of my time there was the Lockpicking Village.  I bought a set of lockpicks, and tried my skills on a variety of locks lying about the room.  I also listened to talks on how to crack certain types of locks, including masterlocks (use coke can shiv, patterns for figuring out combo).&lt;/li&gt;&lt;li id="tpjf"&gt;Probably the most interesting thing that happened at DEFCON nobody got to see: a judge &lt;a title="ordered" href="http://blog.wired.com/27bstroke6/2008/08/mit-students-su.html" id="qnm:"&gt;ordered&lt;/a&gt; a group of MIT students not to talk about hacking the Boston Subway system.  This was rather pointless because 1) the presentation was distributed on CD before the gag was ordered 2) the ban was &lt;a title="lifted" href="http://blog.wired.com/27bstroke6/2008/08/federal-judge-t.html" id="lup9"&gt;lifted&lt;/a&gt; after the conference 3) MIT's student newspaper put the &lt;a title="presentation" href="http://www-tech.mit.edu/V128/N30/subway/Defcon_Presentation.pdf" id="e12c"&gt;presentation&lt;/a&gt; up on its site&lt;/li&gt;&lt;li id="e3yb"&gt;Other cool things: &lt;a title="the badge" href="http://blog.wired.com/27bstroke6/2008/08/exclusive-defco.html" id="ogik"&gt;the badge&lt;/a&gt;, the &lt;a title="mystery box" href="http://blog.wired.com/27bstroke6/2008/08/the-defcon-16-m.html" id="hv-9"&gt;mystery box&lt;/a&gt; &lt;/li&gt;&lt;li id="fjfz"&gt;Didn't see these presentations, but I looked at them on the CD:&lt;/li&gt;&lt;ul id="hj1a"&gt;&lt;li id="hj1a0"&gt;"The Death of Cash" features a preview of a world without cash.  People are turning to credit because it is more convenient, banks love it because of better profit margins, government loves it because it makes you easier to track.  (Note: Illegal to transfer $10,000 in/out of the country without declaring it).  This is getting worse with stupid legislation (Patriot Act).  Also, national security risk: electronic outages now mean that people can't get access to cash (even more troublesome as electric grid becomes less reliable).  Strong crypto might be the basis of a future E-payment system.  Advice: keep some cash on hand for emergencies, use non-cash as little as possible.  thowlett@netsecuritysvcs.com says the presentation can be downloaded at &lt;a title="www.netsecuritysvcs.com/presentations/defcon16/" href="http://www.netsecuritysvcs.com/presentations/defcon16/" id="dkw6"&gt;www.netsecuritysvcs.com/presentations/defcon16/&lt;/a&gt; but I don't see it there...&lt;/li&gt;&lt;li id="cg93"&gt;An introduction to ham radio called "Ham for Hackers"&lt;/li&gt;&lt;li id="cg930"&gt;A presentation on Javascript obfuscation that goes over the following methods: ASCII/Unicode escapes, XOR (ASCII/encoding), string splitting, simple encryption, non-obvious variable and function names, member enumeration, whitespace encoding/decoding&lt;/li&gt;&lt;li id="y1_:"&gt;Another presentation on SCADA systems that made me have nightmares&lt;/li&gt;&lt;li id="gp7."&gt;A HOWTO on SSL cookie hijacking by Tor developer Mike Perry: insert an img tag with src mail.yahoo.com into an unencrypted connection and read their cookie, then save that cookie to cookies.txt and read their email (over SSL, if you want!)&lt;/li&gt;&lt;li id="xsgp"&gt;OCR tools: tesseract, jocr, ocrad&lt;/li&gt;&lt;li id="kp9."&gt;A presentation similar to "Satan is on my Friends List" for Google Gadgets&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Update:&lt;br /&gt;Good photos of the event can be found &lt;a href="http://www.flickr.com/photos/stits/sets/72157606608859399/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-6113685231477724736?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/6113685231477724736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=6113685231477724736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6113685231477724736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6113685231477724736'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/defcon-16.html' title='DEFCON 16'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3573038941484456492</id><published>2008-08-18T20:51:00.000-07:00</published><updated>2009-07-31T07:22:14.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parking'/><category scheme='http://www.blogger.com/atom/ns#' term='san francisco'/><title type='text'>Proposal: Free Parking through Self-Booting</title><content type='html'>San Francisco is a tough city to park in, so I've been scheming up some ways in which to get free parking... here's one thing I've come up with, but haven't had the guts to try yet.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Buy four boots (or more formally, &lt;a href="http://www.universalboot.com/"&gt;wheel immobilizers&lt;/a&gt;).  &lt;/li&gt;&lt;li&gt;Park in a tow-away parking zone.&lt;/li&gt;&lt;li&gt;Affix one boot to each wheel of your car.&lt;/li&gt;&lt;li&gt;Laugh at the people figuring out how to tow your car away seeing that they can not drag your car along on its back wheels nor wheel the car up onto a platform.&lt;/li&gt;&lt;li&gt;Return to your car at your leisure, detach boots, drive away.&lt;/li&gt;&lt;/ol&gt;Some things to consider:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Boots are somewhat expensive, so the whole cost-efficiency of this scheme needs to be taken into consideration (price of tickets, if you plan to pay them, price of parking, risk of having car destroyed by angry tow truckers).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I'm not sure what kinds of contracts tow truckers have with the city, private establishments, etc.  If they are not liable for any harm that comes to your car, this probably isn't such a good idea, as the towers have no incentive to not damage your car trying to toe it away.&lt;/li&gt;&lt;li&gt;Not paying tickets can bite you in the ass if the ticket-giver somehow manages to figure out your &lt;a href="http://en.wikipedia.org/wiki/Vehicle_identification_number"&gt;Vehicle Identification Number&lt;/a&gt;, usually found etched in various places in the car.  Unpaid tickets can come up when you try and re-register your vehicle.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Boots can be pried off... I'm sure &lt;a href="http://www.hackaday.com/2005/02/24/hacking-a-car-boot/"&gt;this&lt;/a&gt; isn't the only way&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: Nothing to do with booting, but here's &lt;a href="http://it.slashdot.org/story/09/07/31/0110213/Hackers-Get-Free-Parking-In-San-Francisco?from=rss"&gt;another way&lt;/a&gt; to get free parking in San Francisco, courtesy of Black Hat&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3573038941484456492?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3573038941484456492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3573038941484456492' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3573038941484456492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3573038941484456492'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/proposal-free-parking-through-self.html' title='Proposal: Free Parking through Self-Booting'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2754549985168595045</id><published>2008-08-11T20:02:00.000-07:00</published><updated>2008-08-18T20:47:38.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xinerama'/><category scheme='http://www.blogger.com/atom/ns#' term='dell 2407 monitor'/><category scheme='http://www.blogger.com/atom/ns#' term='x'/><category scheme='http://www.blogger.com/atom/ns#' term='nvidia'/><title type='text'>HOWTO vertical display (X, Nvidia)</title><content type='html'>Here is how to get your monitor looking something like this (not my monitor, btw):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.liewcf.com/blog/wp-images/dell-lcd-vertical.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://www.liewcf.com/blog/wp-images/dell-lcd-vertical.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Put this line as an option in the &lt;span style="font-weight: bold;"&gt;"Device"&lt;/span&gt; section of &lt;span style="font-weight: bold;"&gt;/etc/X11/xorg.conf&lt;/span&gt;:&lt;span style="font-weight: bold;"&gt;  Option         "Rotate" "CCW"&lt;/span&gt;  Then, restart X with &lt;span style="font-weight: bold;"&gt;Ctrl+Alt+Backspace&lt;/span&gt;.  Afterwards, start up&lt;span style="font-weight: bold;"&gt; sudo nvidia-settings&lt;/span&gt; and shuffle the screens around in &lt;span style="font-weight: bold;"&gt;X Server Display Configuration&lt;/span&gt; so that they are properly aligned.  Be sure to press the &lt;span style="font-weight: bold;"&gt;Save to X Configuration File&lt;/span&gt; button.&lt;br /&gt;&lt;br /&gt;Found via &lt;a href="http://ubuntuforums.org/showthread.php?t=478244"&gt;this forum thread&lt;/a&gt; and a tip from &lt;a href="http://www.getdropbox.com/about"&gt;Arash&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;Following is an xorg.conf file to get 2 Dell 2407 monitors in a T formation (with one on the left vertical and one on the right horizontal aka &lt;a href="http://www.getdropbox.com/about"&gt;Rajiv&lt;/a&gt;-style).  This setup has a few problems, though...&lt;br /&gt;1) The screens are flush at the top, which makes a window across both monitors look disjointed... not a huge problem, and could probably be solved by tweaking the config&lt;br /&gt;2) Can't seem to get compiz-fusion to work&lt;br /&gt;3) Using Xinerama instead of Twinview is waaaaay slower, especially when an object is on both screens&lt;br /&gt;4) Just feels too unnatural... I'm going back to both screens horizontal&lt;br /&gt;It's also a bit hard finding helpful forum posts on these things anyways because everyone seems to misuse the terminlogy (Xinerama, Twinview, etc.) and problems are very individual (Depending on video drivers, screens, etc.).  Anyways, here's the xorg.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;   Identifier     "Default Layout"&lt;br /&gt;   Screen      0  "Screen0" RightOf "Screen1"&lt;br /&gt;   Screen      1  "Screen1" 0 0&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Module"&lt;br /&gt;   Load           "glx"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerFlags"&lt;br /&gt;   Option         "Xinerama" "1"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;   Identifier     "Generic Keyboard"&lt;br /&gt;   Driver         "kbd"&lt;br /&gt;   Option         "XkbRules" "xorg"&lt;br /&gt;   Option         "XkbModel" "pc105"&lt;br /&gt;   Option         "XkbLayout" "us"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;   Identifier     "Configured Mouse"&lt;br /&gt;   Driver         "mouse"&lt;br /&gt;   Option         "CorePointer"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;   Identifier     "Configured Monitor"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;   Identifier     "Monitor0"&lt;br /&gt;   VendorName     "Unknown"&lt;br /&gt;   ModelName      "DELL 2407WFP"&lt;br /&gt;   HorizSync       30.0 - 83.0&lt;br /&gt;   VertRefresh     56.0 - 76.0&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;   Identifier     "Monitor1"&lt;br /&gt;   VendorName     "Unknown"&lt;br /&gt;   ModelName      "DELL 2407WFP"&lt;br /&gt;   HorizSync       30.0 - 83.0&lt;br /&gt;   VertRefresh     56.0 - 76.0&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;   Identifier     "Videocard0"&lt;br /&gt;   Driver         "nvidia"&lt;br /&gt;   VendorName     "NVIDIA Corporation"&lt;br /&gt;   BoardName      "GeForce 7900 GS"&lt;br /&gt;   Option         "Rotate" "CCW"&lt;br /&gt;   Option         "NoLogo" "True"&lt;br /&gt;   BusID          "PCI:1:0:0"&lt;br /&gt;   Screen          0&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;   Identifier     "Videocard1"&lt;br /&gt;   Driver         "nvidia"&lt;br /&gt;   VendorName     "NVIDIA Corporation"&lt;br /&gt;   BoardName      "GeForce 7900 GS"&lt;br /&gt;   BusID          "PCI:1:0:0"&lt;br /&gt;   Screen          1&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;   Identifier     "Screen0"&lt;br /&gt;   Device         "Videocard1"&lt;br /&gt;   Monitor        "Monitor0"&lt;br /&gt;   DefaultDepth    24&lt;br /&gt;   Option         "TwinView" "0"&lt;br /&gt;   Option         "metamodes" "DFP-0: nvidia-auto-select +0+0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;   Identifier     "Screen1"&lt;br /&gt;   Device         "Videocard0"&lt;br /&gt;   Monitor        "Monitor1"&lt;br /&gt;   DefaultDepth    24&lt;br /&gt;   Option         "TwinView" "0"&lt;br /&gt;   Option         "metamodes" "DFP-1: nvidia-auto-select +0+0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2754549985168595045?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2754549985168595045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2754549985168595045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2754549985168595045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2754549985168595045'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/08/howto-vertical-display-x-nvidia.html' title='HOWTO vertical display (X, Nvidia)'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2732871623432019697</id><published>2008-07-21T23:18:00.000-07:00</published><updated>2008-07-21T23:20:52.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>Keep SSH connections from timing out, client-side</title><content type='html'>Put these lines in &lt;span style="font-weight: bold;"&gt;~/.ssh/config &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ServerAliveInterval 300&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TCPKeepAlive yes&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2732871623432019697?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2732871623432019697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2732871623432019697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2732871623432019697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2732871623432019697'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/07/keep-ssh-connections-from-timing-out.html' title='Keep SSH connections from timing out, client-side'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4966507612633242636</id><published>2008-07-06T17:38:00.000-07:00</published><updated>2008-07-06T17:44:48.074-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><category scheme='http://www.blogger.com/atom/ns#' term='txt2regex'/><title type='text'>txt2regex</title><content type='html'>&lt;a href="http://txt2regex.sourceforge.net/"&gt;txt2regex&lt;/a&gt; is an awesome tool that allows you to specify a regular expression in an interactive curses-based interface that is then printed out in a variety of formats, including English, vim, perl, etc.  Perfect for when you know exactly what you want to match, but are not particularly knowledgeable about the idiosyncrasies of the current regex engine you're using.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4966507612633242636?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4966507612633242636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4966507612633242636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4966507612633242636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4966507612633242636'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/07/txt2regex.html' title='txt2regex'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1391912712992808232</id><published>2008-07-04T08:12:00.000-07:00</published><updated>2008-07-04T09:03:33.271-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cards'/><category scheme='http://www.blogger.com/atom/ns#' term='birthday'/><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>Stop Spamming me with Corporate Birthday Cards</title><content type='html'>It is the time of year when my birthday is fast approaching and that means that I am receiving a few birthday cards, sometimes from parties from which I would not expect one.  Some of these parties are not people, but corporations who happen to have my birth date on file for one reason or another.  &lt;br /&gt; &lt;br /&gt;In any other context, snail mail sent from a corporation to one's home mailbox for marketing purposes would be called junk mail or spam.  Sunglasses Hut, et al. try and disguise the purpose of the letter (making you want to buy more of their products) by making the implication that they're corresponding out of consideration for you by politely remembering the celebration of your birth.  Now, some may think that this is a genuine gesture of kindness, but I disagree.  The entire point of a card is to remind someone that you are thinking about him or her and his/her particular situation.  I find nothing personal or redeeming about being the recipient of a letter sent by a cron job at HQ once a year which was ordered by a marketing director that neither knows me nor has any reason to care about my circumstance save trying to extract more of my hard-earned cash out of my pocket.&lt;br /&gt; &lt;br /&gt;In fairness I must note that, unlike most every other sender of birthday spam, Sunglasses Hut at least sent me a twenty-dollar gift certificate to their store.  Considering that I don't need another pair of sunglasses and would hesitate to buy from SH again given this annoying practice, I find it small recompense for wasting my time and mailbox space with their spam.  &lt;br /&gt;  &lt;br /&gt;I guess this can just be chalked up to another consequence of an age when more private parties are holding our personal data and are ever eager to exploit it for their own ends.  It seems as there is no disincentive for corporations to send all the spam they want, I'll be receiving quite a few more cards from well-wishing chief marketing officers in the future.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bigshotcmo@sunglasseshut27:~$ crontab -l&lt;br /&gt;# m h  dom mon dow   command&lt;br /&gt;  0 0  1   *   *     ./send_birthday_cards_for_month&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;db.execute("SELECT * FROM customer WHERE MONTH(birthday) = MONTH(NOW())).each do |customer|&lt;br /&gt;    Notifier.send_individual_card(customer)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Dear $customer.first_name,&lt;br /&gt;&lt;br /&gt;Happy birthday!  You are super special to us!  Spend more money at our store!  &lt;br /&gt;Thanks for providing us with your birthday!  Thanks to our expert DBAs and &lt;br /&gt;comprehensive database backup policy, we're able to retrieve your personal &lt;br /&gt;information on demand and sure to never expunge your data from our records.  &lt;br /&gt;Have a nice day!&lt;br /&gt;&lt;br /&gt;Love,&lt;br /&gt;&lt;br /&gt;Moneybags&lt;br /&gt;CMO&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1391912712992808232?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1391912712992808232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1391912712992808232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1391912712992808232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1391912712992808232'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/07/stop-spamming-me-with-corporate.html' title='Stop Spamming me with Corporate Birthday Cards'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7909647038376873004</id><published>2008-06-17T10:15:00.000-07:00</published><updated>2008-06-17T10:23:03.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xmodmap'/><title type='text'>HOWTO Swap caps lock and escape keys in Linux</title><content type='html'>Caps lock takes up way too much space on a keyboard for how little (never) one presses it.  Esc is a very useful key that gets pressed a lot (especially for vi users) but is rather far away and takes more effort to press in the corner of the keyboard.  Here is how to switch the functionality of the two keys (solution adapted from the xmodmap manpage) in Linux.&lt;br /&gt;&lt;br /&gt;Create a file called &lt;span style="font-weight: bold;"&gt;.Xmodmap&lt;/span&gt; in your home directory.  Put the following text in the file:&lt;br /&gt;&lt;br /&gt;!&lt;br /&gt;! Swap Caps_Lock and Escape&lt;br /&gt;!&lt;br /&gt;remove Lock = Caps_Lock&lt;br /&gt;remove Control = Escape&lt;br /&gt;keysym Escape = Caps_Lock&lt;br /&gt;keysym Caps_Lock = Escape&lt;br /&gt;add Lock = Caps_Lock&lt;br /&gt;add Control = Escape&lt;br /&gt;&lt;br /&gt;Next time you log in, these settings should stick.  If you want to switch the keys manually instead of on startup, run &lt;span style="font-weight: bold;"&gt;xmodmap&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;.Xmodmap &lt;/span&gt;to do so.  Loading the file again after you have loaded it once will switch the keys back to their original functionalities.&lt;br /&gt;&lt;br /&gt;Btw, an informative discussion of all of this X customization stuff is found in chapter 6 of &lt;a href="http://www.amazon.com/UNIX-Power-Tools-Jerry-Peek/dp/1565922603"&gt;Unix Power Tools&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7909647038376873004?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7909647038376873004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7909647038376873004' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7909647038376873004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7909647038376873004'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/06/howto-swap-caps-lock-and-escape-keys-in.html' title='HOWTO Swap caps lock and escape keys in Linux'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-6157769169536087198</id><published>2008-04-29T18:06:00.000-07:00</published><updated>2008-06-07T09:00:19.736-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vi'/><category scheme='http://www.blogger.com/atom/ns#' term='experimental search'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Experimental Search</title><content type='html'>Today I stumbled across Google's &lt;a href="http://www.google.com/experimental/"&gt;experimental&lt;/a&gt; page which has some add-ons to search that can be enabled.  "Keyboard shortcuts" kicks ass: it's basically a &lt;a href="http://en.wikipedia.org/wiki/Vi"&gt;vi&lt;/a&gt;-like interface to search.  j to go down, k to go up, / to search, etc.  It's really quite slick.&lt;br /&gt;&lt;br /&gt;Although Google says that you can only add one of these experimental features at a time, "Keyword suggestions" is an option that can be enabled via the &lt;a href="http://www.customizegoogle.com/"&gt;Customize Google&lt;/a&gt; Firefox extension.  "Keyword suggestions" is a great feature as well.&lt;br /&gt;&lt;br /&gt;The "Alternate views" options , on the other hand, are a heaping waste of time.  Even the search results for the example queries listed on the page are unintuitive and uninformative.&lt;br /&gt;&lt;br /&gt;Google also offers keyboard shortcuts for a lot of other products (Gmail, Calendar, Docs, Reader, Maps, Video), detailed &lt;a href="http://www.google.com/notebook/public/10082229128833698422/BDQFPQwoQ35SekYwi"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;UPDATE: I actually disabled the experimental features.  The vi emulation was not helpful enough... I could scan the page visually faster than my fingers could keep up.  Furthermore, I missed the utility of Firefox's "/" to search the text on the page fast on a Google search result page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-6157769169536087198?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/6157769169536087198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=6157769169536087198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6157769169536087198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6157769169536087198'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/04/google-experimental-search.html' title='Google Experimental Search'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3529813788765111607</id><published>2008-04-04T23:50:00.000-07:00</published><updated>2008-04-20T19:52:25.966-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ack'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Searching SVN trees with Ack (for Ruby on Ubuntu)</title><content type='html'>Searching through a &lt;a title="subversion" href="http://subversion.tigris.org/" id="c1sv"&gt;subversion&lt;/a&gt; tree with &lt;a title="grep" href="http://en.wikipedia.org/wiki/Grep" id="uec4"&gt;grep&lt;/a&gt; is a pain in the ass.  It wastes time searching through files I don't want to look into and its syntax is inconvenient for the task.  Fortunately, there is a tool called &lt;a title="ack" href="http://petdance.com/ack/" id="gicn"&gt;ack&lt;/a&gt; which is suited specifically for matching text in VCS trees (including svn trees).  Here's how to set it up on Ubuntu Gutsy (apparently you won't need to do all this in the next Ubuntu release; there's a &lt;a title="package" href="http://groups.google.com/group/ack-users/browse_thread/thread/87d4df10293419a9" id="fpcq"&gt;package&lt;/a&gt; for Hardy).&lt;br /&gt;&lt;br /&gt;First, you're going to need some relevant libraries.  &lt;span id="l9-3" style="font-weight: bold;"&gt;sudo apt-get install perl-doc&lt;/span&gt; to start.  Next, download the &lt;a title="File-Next" href="http://search.cpan.org/dist/File-Next/" id="l01z"&gt;File-Next&lt;/a&gt; archive from &lt;a title="CPAN" href="http://www.cpan.org/" id="srps"&gt;CPAN&lt;/a&gt;.  Extract the archive and cd into the directory, then use the series of commands &lt;span id="qeys" style="font-weight: bold;"&gt;perl Makefile.PL &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make test &amp;amp;&amp;amp; sudo make install&lt;/span&gt; to install it.&lt;br /&gt;&lt;br /&gt;Now for ack itself.  &lt;span id="yz_n" style="font-weight: bold;"&gt;svn checkout http://ack.googlecode.com/svn/trunk/ ack-read-only&lt;/span&gt; to checkout the source tree from &lt;a title="Google Code" href="http://code.google.com/p/ack/" id="l6jn"&gt;Google Code&lt;/a&gt; and cd into the directory.  Now if you want to edit some of the types that are built into the program, here's where to do it.  For example, &lt;a title="I want" href="http://groups.google.com/group/ack-users/browse_thread/thread/ee113a4bcc989134" id="nduk"&gt;I want&lt;/a&gt; to also search for &lt;a title="haml" href="http://haml.hamptoncatlin.com/" id="zbzp"&gt;haml&lt;/a&gt; files with the &lt;span id="omzm" style="font-weight: bold;"&gt;--ruby&lt;/span&gt; flag.  I &lt;span id="cf.2" style="font-weight: bold;"&gt;grep -R rhtml *&lt;/span&gt; to see that four files (actually, less, but let's go ahead and edit all of them anyways...) require modification.  The ruby line in Ack.pm, for instance, now reads ruby  =&amp;gt; [qw( rb rhtml rjs rxml erb &lt;span id="eb-2" style="font-weight: bold;"&gt;haml&lt;/span&gt; )].  (Types can also be set on the command line using the &lt;span id="diuy" style="font-weight: bold;"&gt;--type-add&lt;/span&gt; and &lt;span id="ha-u" style="font-weight: bold;"&gt;--type-set flags&lt;/span&gt;).  Once you're finished tweaking types, use the same &lt;span id="qeys" style="font-weight: bold;"&gt;perl Makefile.PL &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make test &amp;amp;&amp;amp; sudo make install &lt;/span&gt;&lt;span id="qeys"&gt;command&lt;/span&gt;&lt;span id="qeys"&gt; to install ack.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;For extra credit, you can also add flags to a &lt;span id="ynjh" style="font-weight: bold;"&gt;~/.ackrc&lt;/span&gt; file that get executed upon each invocation of ack.  Personally, I add the --ruby flag because it seems to be that .rb, .haml and .rhtml files are all that I'm searching for these days.&lt;br /&gt;&lt;br /&gt;And voila!  Now a simple &lt;span id="lt4c" style="font-weight: bold;"&gt;ack -f&lt;/span&gt; gives me a listing of all the ruby files in my svn tree (and no vi swp files, svn files, log files, etc.).  ack "regex" returns a grep-like search of the relevant parts of the subversion tree with the parts of the line that matched the regex highlighted.  SWEET!  Get more information on the command line with&lt;span id="fldu" style="font-weight: bold;"&gt; ack --help&lt;/span&gt; for more help, &lt;span id="vjc3" style="font-weight: bold;"&gt;ack --help type&lt;/span&gt; for a listing of matching types.&lt;br /&gt;&lt;br /&gt;Do you know how hard this would have been with find/grep/xargs?  Well, tough.  &lt;span id="fens" style="font-weight: bold;"&gt;grep -RE "regex" * | grep -v svn | grep -v log | ...etc...&lt;/span&gt; searches all files in the tree and might exclude matching lines if the contain one of the strings being filtered out by the later grep instances.  That syntax can be improved to a alternating regular expression with &lt;span id="jhm9" style="font-weight: bold;"&gt;grep -RE "regex" * | grep -v -E \(log\|svn\)&lt;/span&gt; but it still has the same problems.  grep also has an --exclude flag which can exclude certain filenames that match a glob from being searched (although the manpage would &lt;a title="seem to imply otherwise" href="https://bugs.launchpad.net/ubuntu/+source/grep/+bug/23023" id="kvws"&gt;seem to imply otherwise&lt;/a&gt;), but it doesn't have regex capabilities.  So maybe we can use find and xargs?  Nope, a svn tree output will kill xargs, which will compain that the "argument line is too long" if too much gets sent to it: &lt;span id="ubni" style="font-weight: bold;"&gt;grep -E "regex" `find . -regex '.*\.\(rhtml\|rb\|haml\)' | xargs -0`  &lt;/span&gt;Perhaps find's --exec flag could be of use?  Well, only if you want to kill your computer with the overhead of creating a new grep process and forking and context switching a couple times (etc.) upon each file match... &lt;span id="cblk" style="font-weight: bold;"&gt;find . -regex "regex" -exec grep -E "regex" '{}' \;&lt;/span&gt; will really do your cpu in.  Then there's the cumbersome &lt;span id="mow5" style="font-weight: bold;"&gt;grep -E "regex" $(find . -regex "regex" | grep -vE &lt;/span&gt;&lt;span id="jhm9" style="font-weight: bold;"&gt;\(log\|svn\)) &lt;/span&gt;&lt;span id="jhm9"&gt;... well, let's just say I'm glad I found ack at this point.&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;Put &lt;span style="font-weight: bold;"&gt;--type-add=ruby=.haml&lt;/span&gt; in your .ackrc to add haml as a type dynamically.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3529813788765111607?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3529813788765111607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3529813788765111607' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3529813788765111607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3529813788765111607'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/04/searching-svn-trees-with-ack-for-ruby.html' title='Searching SVN trees with Ack (for Ruby on Ubuntu)'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-959282049652205285</id><published>2008-03-30T21:16:00.000-07:00</published><updated>2008-04-04T23:56:29.762-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Music Store'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Amazon's Music Store on Ubuntu Gutsy</title><content type='html'>Unfortunately, there are some CDs that are so obscure nobody is seeding them on BitTorrent.  One of these happens to be &lt;a title="Hicksville" href="http://www.amazon.com/gp/product/B000QZUM3E/ref=dm_pp_alb?ie=UTF8&amp;amp;qid=1206935222&amp;amp;sr=103-1" id="u2x1"&gt;Hicksville&lt;/a&gt; by Celtic Cross.  I decided to give the &lt;a title="Amazon Music Store" href="http://www.amazon.com/MP3-Music-Download/b?ie=UTF8&amp;amp;node=163856011" id="u9sg"&gt;Amazon Music Store&lt;/a&gt;, where this CD is available for purchase, a shot.&lt;br /&gt;&lt;br /&gt;On Ubuntu Gutsy, there are a few things you need to do to make this work.  The first, of course, is to download the .deb package from &lt;a title="this page" href="http://www.amazon.com/gp/dmusic/help/amd.html/ref=dm_gs_amd" id="l9ol"&gt;this page&lt;/a&gt;.  Install that with &lt;span id="s.z8" style="font-weight: bold;"&gt;sudo dpkg -i amazonmp3.deb&lt;/span&gt; or &lt;span id="v5g2" style="font-weight: bold;"&gt;sudo dpkg --force-architecture -i amazonmp3.&lt;/span&gt;&lt;span style="font-weight: bold;" id="v5g2"&gt;de&lt;/span&gt;&lt;span id="oixk" style="font-weight: bold;"&gt;b&lt;/span&gt; if on a 64 bit system.  You're also going to need a few &lt;a title="Boost" href="http://www.boost.org/" id="tzty"&gt;Boost&lt;/a&gt; libraries: &lt;span id="juhb" style="font-weight: bold;"&gt;sudo apt-get install libboost-date-time1.34.1 libboost-thread1.34.1 libboost-iostreams1.34.1 libboost-signals1.34.1&lt;/span&gt;  If you're on a 32 bit system, launching the &lt;span id="xwd_" style="font-weight: bold;"&gt;/usr/bin/amazonmp3&lt;/span&gt; binary should now work (it also inserts an entry in the GNOME panel under &lt;span id="j0h8" style="font-weight: bold;"&gt;Applications-&amp;gt;Internet&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;But for all you 64-bit'ers out there, there's a bit more work to do.  Launching the binary fails with the message "amazonmp3: error while loading shared libraries: libgtkmm-2.4.so.1: cannot open shared object file: No such file or directory".  This is because amazonmp3 needs 32 bit libraries, not 64 bit ones (see &lt;a title="this thread" href="http://ubuntuforums.org/showthread.php?t=712078" id="mmf2"&gt;this thread&lt;/a&gt;).  Download &lt;a title="getlibs" href="http://ubuntuforums.org/showthread.php?t=474790" id="ny0b"&gt;getlibs&lt;/a&gt;, a bash script which installs 32 bit versions of libraries on 64 bit systems.  Install the package with &lt;span id="d-tx" style="font-weight: bold;"&gt;sudo dpkg -i getlibs-all.deb&lt;/span&gt; and then run &lt;span id="ax1l" style="font-weight: bold;"&gt;getlibs /usr/bin/amazonmp3&lt;/span&gt; to install the 32 bit libraries.  The program should now run without error.&lt;br /&gt;&lt;br /&gt;The application, by the way, is quite minimalistic.  I don't know why they put users through this trouble and don't just send you a tarball of the music files.  I guess there might be some reason on other platforms where it integrates with other applications... not on Linux, though!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-959282049652205285?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/959282049652205285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=959282049652205285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/959282049652205285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/959282049652205285'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/03/amazons-music-store-on-ubuntu-gusty.html' title='Amazon&apos;s Music Store on Ubuntu Gutsy'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4055887620940939876</id><published>2008-03-12T20:45:00.000-07:00</published><updated>2008-03-15T09:34:06.998-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ghosts'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='Nine Inch Nails'/><title type='text'>Why NIN's "Ghosts" Release Matters</title><content type='html'>&lt;a title="Nine Inch Nails" href="http://en.wikipedia.org/wiki/Nine_Inch_Nails" id="y:t:"&gt;Nine Inch Nails&lt;/a&gt; ushered in another landmark event in the slow march towards freedom of digital media recently when it released its newest work &lt;a title="for free" href="http://slashdot.org/article.pl?sid=08/03/03/1420251&amp;amp;from=rss" id="s0f0"&gt;for free&lt;/a&gt; (gratis and libre) on its web site.  NIN band member Trent Reznor has frequently been at the forefront of innovation in music and the surrounding areas and it is not at all surprising and very pleasing that it is him to be the first high-profile artist (to my knowledge) to release a major work under a Creative Commons license.  However, not everyone seems to grasp the significance of what has happened here.  In fact, not even the article that the Slashdot article links to reports the fact that the album has been released under a CC license and many other news outlets have neglected this important point as well.  In this article, I'll give a summary of the events surrounding NIN's release of &lt;i&gt;Ghosts I-IV&lt;/i&gt; and an analysis of its significance.&lt;br /&gt;&lt;br /&gt;First, some history of the band: Nine Inch Nails has never been a conformist where promoting its music has been concerned.  The history of their original ideas is impressive: &lt;a title="breaking off" href="http://www.news.com/8301-10784_3-9793541-7.html?tag=more" id="p3ly"&gt;breaking off&lt;/a&gt; from their label and releasing their work independently; encouraging fans at concerts to &lt;a title="&amp;quot;steal&amp;quot;" href="http://www.youtube.com/watch?v=TJ5iHaV0dP4&amp;amp;eurl=http%3A%2F%2Fwww.theninhotline.net%2Fnews%2Findex.php" id="vjrd"&gt;"steal"&lt;/a&gt; music; &lt;a title="hiding" href="http://www.usatoday.com/life/music/news/2007-04-18-nine-inch-nails_N.htm" id="v6.7"&gt;hiding&lt;/a&gt; USB drives for fans to find with new, unreleased songs on them; performing &lt;a title="surprise concerts" href="http://www.wired.com/entertainment/music/magazine/16-01/ff_args" id="wa:9"&gt;surprise concerts&lt;/a&gt; as part of an elaborate fantasy world constructed for fans and releasing &lt;a title="Garageband samples" href="http://apple.slashdot.org/article.pl?sid=07/04/27/0140237" id="hgb6"&gt;Garageband samples&lt;/a&gt; for others to remix.&lt;br /&gt;&lt;br /&gt;There is precedent for releasing music free (both gratis and libre) online.  Most artists now have a myspace page or other limited Internet presence where one can listen to, but usually not download (or only download a small piece of) an album.  Many low-profile artists have been releasing their music online for years under various licenses.  &lt;a title="Radiohead" href="http://en.wikipedia.org/wiki/Radiohead" id="kzgb"&gt;Radiohead&lt;/a&gt;, arguably, has been the most famous band to release an album free of charge online (with &lt;a title="In Rainbows" href="http://en.wikipedia.org/wiki/In_Rainbows" id="ercg"&gt;&lt;i&gt;In Rainbows&lt;/i&gt;&lt;/a&gt; last year).  Radiohead allowed each customer to specify their own price for a full download of the album off of its site, even $0.  It is estimated that Radiohead made &lt;a title="many millions of dollars" href="http://en.wikipedia.org/wiki/In_Rainbows" id="or0-"&gt;many millions of dollars&lt;/a&gt; with this tactic.&lt;br /&gt;&lt;br /&gt;Next, the facts about the &lt;i&gt;Ghosts&lt;/i&gt; release.  From the Nine Inch Nails &lt;a title="website" href="http://nin.com/" id="nim."&gt;website&lt;/a&gt; there are a variety of &lt;a title="options" href="http://ghosts.nin.com/main/order_options" id="y0tx"&gt;options&lt;/a&gt; for downloading the album, etc:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Free: The first 9 tracks from the &lt;i&gt;Ghosts I-IV&lt;/i&gt; collection available as high-quality, DRM-free MP3s, including the complete PDF. &lt;/li&gt;&lt;li&gt;$5: All 36 tracks in a variety of digital formats including a 40 page PDF.&lt;/li&gt;&lt;li&gt;$10: &lt;i&gt;Ghosts I-IV&lt;/i&gt; on two audio CDs in a six panel digipak package with a 16 page booklet.  Pre-order, to be shipped April 8, 2008. INCLUDES immediate full download in a variety of digital formats.&lt;br /&gt;        &lt;/li&gt;&lt;li&gt;   &lt;div class="item"&gt;         &lt;div class="itemLabel"&gt;$75: &lt;i&gt;Ghosts I-IV&lt;/i&gt; in a hardcover fabric slipcase containing: 2 audio CDs, 1 data DVD with all 36 tracks in multi-track format, and a Blu-ray disc with &lt;i&gt;Ghosts I-IV&lt;/i&gt; in high-definition 96/24 stereo and accompanying slideshow.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;$300:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a title="Click to close" href="http://ghosts.nin.com/main/order_options#"&gt;&lt;img src="http://ghosts.nin.com/images/popup_product_ultradeluxe.jpg" id="lightboxImage" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nine Inch Nails also uploaded a torrent to the Pirate Bay of the first 9 tracks of the album (out of 36 total) with the following message:&lt;br /&gt;&lt;blockquote&gt;Hello from Nine Inch Nails.&lt;br /&gt;&lt;br /&gt;We\\\'re very proud to present a new collection of instrumental music, Ghosts I-IV. Almost two hours of music recorded over an intense ten week period last fall, Ghosts I-IV sprawls Nine Inch Nails across a variety of new terrain.&lt;br /&gt;&lt;br /&gt;Now that we\\\'re no longer constrained by a record label, we\\\'ve decided to personally upload Ghosts I, the first of the four volumes, to various torrent sites, because we believe BitTorrent is a revolutionary digital distribution method, and we believe in finding ways to utilize new technologies instead of fighting them.&lt;br /&gt;&lt;br /&gt;We encourage you to share the music of Ghosts I with your friends, post it on your website, play it on your podcast, use it for video projects, etc. It\\\'s licensed for all non-commercial use under Creative Commons.&lt;br /&gt;&lt;br /&gt;We\\\'ve also made a 40 page PDF book to accompany the album. If you\\\'d like to download it for free, visit http://ghosts.nin.com/main/pdf&lt;br /&gt;&lt;br /&gt;Ghosts I is the first part of the 36 track collection Ghosts I-IV. Undoubtedly you\\\'ll be able to find the complete collection on the same torrent network you found this file, but if you\\\'re interested in the release, we encourage you to check it out at ghosts.nin.com, where the complete Ghosts I-IV is available directly from us in a variety of DRM-free digital formats, including FLAC lossless, for only $5. You can also order it on CD, or as a deluxe package with multitrack audio files, high definition audio on Blu-ray disc, and a large hard-bound book.&lt;br /&gt;&lt;br /&gt;We genuinely appreciate your support, and hope you enjoy the new music.  Thanks for listening.&lt;br /&gt;&lt;a href="http://ghosts.nin.com/" rel="nofollow"&gt;&lt;br /&gt;http://ghosts.nin.com&lt;/a&gt;&lt;/blockquote&gt;&lt;a href="http://ghosts.nin.com/" rel="nofollow"&gt;&lt;/a&gt;A little while after the release of the album and the spreading of the news, the NIN website got overloaded with requests, prompting Trent Reznor to post the following message there:&lt;br /&gt;&lt;blockquote&gt;Update: The response to this album has been overwhelming, causing our website to slow to a crawl. We THOUGHT we were ready, but...&lt;br /&gt;We've been adding more servers to accommodate the unexpected demand and we expect to be running smoothly in the next few hours. In the meantime, if you've had any problems with downloads from the Ghosts site, don't worry - you'll be able to use your download link again when the site is more stable. Thanks everyone for making this such an immediate success.&lt;br /&gt;&lt;br /&gt;posted by Trent Reznor at 5:47 PM pst, from hong kong.&lt;/blockquote&gt;So why is the release of &lt;i&gt;Ghosts&lt;/i&gt; significant?  Because it's the most visible &lt;a title="release" href="http://ghosts.nin.com/main/faq" id="hlx3"&gt;release&lt;/a&gt; of art under a Creative Commons license to date (&lt;a title="by-nc-sa" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/" id="snh4"&gt;by-nc-sa&lt;/a&gt; 3.0, to be exact).  This means that Trent Reznor can not take you to court for distributing the music on, say, the Pirate Bay; it explicitly permits this kind of activity.  All the license mandates is that if you use the work, you must credit the original author and you must release your new work that incorporates NIN's art under the same license.  The license also prohibits any use of the work for financial gain by a third party (no selling the album on the street for five bucks a pop).  This is in marked contrast to Radiohead, who did not specify the license that &lt;i&gt;In Rainbows&lt;/i&gt; was under, so because of this ambiguity we must only assume that it is under a traditional copyright license.  This means that Radiohead CAN take you to court for distributing the music  if one day it decides that suing its fans is fashionable.  Releasing art, especially music, in this fashion is going to become increasingly prevalent as more artists realize the benefits of instantly sharing art with the world via the Internet in preference to traditional distribution channels such as record labels.  With computer technology, how fans use music is increasingly out of an artists' control.  It is a much more amicable arrangement for the artist to indulge fans by releasing music in a way they find convenient (and, also, not sue them).&lt;br /&gt;&lt;br /&gt;The release of &lt;i&gt;Ghosts&lt;/i&gt; also establishes BitTorrent as a recognized distribution channel in which established artists can release their music.  Frequently, the BitTorrent protocol and its users are denigrated in the media as "pirates" or "thieves."  The fact that a respected artist is using BitTorrent in preference to direct download or a record label-sponsored distribution will legitimize this method of sharing in the eyes of many and heighten the profile of BitTorrent generally.  Using BitTorrent was also a good move simply because it is a superior protocol for large files, as the slowness of the NIN website showed.  Also, it is more convenient to use than having to click through the kind of omg-it's-free messages (or, more generally, an unfamiliar interface) that Radiohead made users weather to buy &lt;i&gt;In Rainbows&lt;/i&gt;.  Being so in touch with how music fans want to acquire their music definitely doesn't hurt NIN's publicity, either.&lt;br /&gt;&lt;br /&gt;Reznor also proves that it is wholly possible to make a lot of money off of a free product on the Internet, something that many ill-informed pundits think impossible.  Slashdot &lt;a title="reports" href="http://slashdot.org/article.pl?sid=08/03/05/076221&amp;amp;from=rss" id="yf2r"&gt;reports&lt;/a&gt; that the most expensive option sold out in about a day, netting Reznor $750,000.  This is to say nothing of any of the other purchasing options, which also likely brought in a significant amount of revenue, possibly much more than the $300 dollar option.  So why are people paying for something that they could more or less otherwise get for free?  A few answers can be found in Kevin Kelly's essay &lt;a title="Better Than Free" href="http://www.edge.org/3rd_culture/kelly08/kelly08_index.html" id="y3kh"&gt;Better Than Free&lt;/a&gt;.  Kelly claims that the Internet has made copyable material infinitely abundant, and therefore impossible to charge money for.  What can be charged for are what Kelly calls "generatives" -- things that can't be copied.  He suggests 8 generatives from which money can be made in a world with Internet technology: immediacy, personalization, interpretation, authenticity, accessibility, embodiment, patronage and findability (convinience).  By autographing records, NIN provides authenticity and personalization.  By offering downloads off its site in a variety of digital formats, NIN makes money off of findability, accessibility and immediacy.  And, of course, being an artist offering up works for free under a CC license NIN reaps the benefit of patronage: listeners loving what they are seeing and hearing and willing to pay for more of the same.&lt;br /&gt;&lt;br /&gt;Another important point about this event is that all the data on NIN's site will eventually find its way out from behind the wall of authentication and payment and onto public networks.  That is, users that paid for enhanced versions of the product will upload them to a BitTorrent tracker: &lt;a title="here" href="http://isohunt.com/torrent_details/36076302/ghosts?tab=summary" id="rl.2"&gt;here&lt;/a&gt; already are the ($5) FLAC versions of all 36 songs and some extras.  It is often repeated that information wants to be free, as we can see here.  What is not often repeated, but equally true, is that information wants to be convenient.  Fans of &lt;span style="font-style: italic;"&gt;In Rainbows&lt;/span&gt; proved this yet again when they uploaded the album to BitTorrent (humorously leading some ignorant columnists to castigate users for "&lt;a title="stealing" href="http://www.forbes.com/technology/2007/10/16/radiohead-download-piracy-tech-internet-cx_ag_1016techradiohead.html?boxes=author" id="i-2h"&gt;stealing&lt;/a&gt;" it -- how can you steal something if it's free and able to be infinitely copied?).&lt;br /&gt;&lt;br /&gt;In conclusion, the experimental release of &lt;span style="font-style: italic;"&gt;Ghosts&lt;/span&gt; on the Internet under a Creative Commons license and for free is a milestone event for a variety of reasons.  It is the first high-profile musical release that is free, both as in freedom and as in beer.  It made NIN a whole lot of money, proving that artists can survive in the Internet era (even without performing).  And it enhances the profile of the BitTorrent protocol as a distribution mechanism and reinforces some well-understood properties of Internet-based information distribution.  Hopefully other artists will follow NIN's example and release their work in a similar manner.&lt;br /&gt;&lt;br /&gt;===============================&lt;br /&gt;Further reading:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reznor decries fact that people see Radiohead as first to release free online, says industry won't follow his lead anytime soon because it's inept.  (&lt;a href="http://arstechnica.com/news.ars/post/20080313-reznor-says-radiohead-offering-insincere-industry-inept.html"&gt;Link&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4055887620940939876?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4055887620940939876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4055887620940939876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4055887620940939876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4055887620940939876'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/03/why-nins-ghosts-release-matters.html' title='Why NIN&apos;s &quot;Ghosts&quot; Release Matters'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-249347521648163305</id><published>2008-02-21T22:46:00.000-08:00</published><updated>2008-05-31T08:38:15.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Ruby (vs Python): a preliminary assessment</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:78%;"&gt;I've been using Ruby for a little over a month now.  While this hasn't been enough time to explore the depths of the language, it has given me ample time to evaluate how I feel about some of the more superficial aspects of Ruby.  There are some things I like about it, a few things I don't care about, and a lot of things I don't like.  In some aspects it is quite similar to Python, my favorite programming language.  In the following sections I lay out what I do, kinda, and don't like about Ruby, sometimes in comparison to or in contrast with Python to put things in context.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;Things I like about Ruby&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Naming conventions are enforced&lt;/b&gt;  The less surprises there are in code, the easier it is to read.  I would be very surprised, for example, if a C VARIABLE_IN_ALL_CAPS were not a constant.  It only takes one joker working on code to completely screw with convention and degrade readability of code for everyone else working on it.  Ruby heads off this problem at the pass.  Instance variables look like @this, class variables look like @@this, constants look like THIS, global variables look like $this, etc.  This is a Good Idea.  I can easily live without the flexibility to name my class h0We\/ER_I_want.  This also makes the code easier to parse and syntax highlight.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Block Comments&lt;/b&gt;  I'm not sure how Python missed the boat on this one.  The "large chunks of code shouldn't be commented anyway, so take them out" and "get a decent text editor that can :50,70s/^/#/" and "that's what doc comments are for" school of thought just doesn't resonate with me.  Too often there is some large chunk of code lying around that just isn't applicable anymore and quickly commenting it out is a temporary solution.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Constants&lt;/b&gt;  There is just something about the assurance that certain variables are read-only that makes me sleep well at night.  Otherwise, I need to worry about things getting overwritten, and that's no fun.  I guess there's always CONVENTION to prevent this in Python, but that doesn't stop someone from breaking CONVENTION += 1&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Examples are the norm in documentation&lt;/b&gt;  Examples are the quickest way to learn about new code.  However, the docs could benefit from some non-example elaboration most of the time.  How is one supposed to figure out corner cases?  I guess "examples first" goes along with the whole Ruby-has-no-formal-spec thing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;'case' syntax&lt;/span&gt; The syntax of Ruby's case statement (analogous to switch in other languages) is pretty rad.  It's a great feature for when multiple properties of one variable need to be tested.  The case statement accepts comparisons, ranges, regular expressions, etc.  Very cool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Things I could go either way on&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Regular expressions built into the language  &lt;/b&gt;Regular expressions are cool, and I use them a lot, but I just don't know if they have a place amongst the pantheon of hashes, lists and the like.  They are convenient, but overuse might turn your code into *gasp* Perl.  No one likes unreadable ASCII-splatter, although it's tough for Ruby to get &lt;i&gt;that&lt;/i&gt; bad.  Plus, half the time I am using regexes some other function might do just as well, like &lt;a title="rindex" href="http://www.ruby-doc.org/core-1.9/classes/String.html#M000858" id="c8y_"&gt;rindex&lt;/a&gt;.  Maybe that's just my laziness that Ruby caters to.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Interned strings&lt;/b&gt;  It's like a pointer, I get it.  It saves memory over using a string object, cool.  Was it really worth including in the language?  Not sure.  It seems like their most common uses, such as keys in hashes, could be implemented under the hood anyway (well, at least in a real language like Python where hash keys are immutable).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;! and ? as legal characters in method names&lt;/b&gt;  I can understand that does_this_work? is a natural way to read that a function returns a boolean.  I get that destroy! suggests an internal change of state of the object.  But then there's the problems.  First, not every method that returns a boolean or changes an object's state is forced to use these constructs.  If they were enforced like all-caps constants and @ before instance members, maybe I'd be more bullish on them.  Second, what qualifies as a change of state can get kind of messy: maybe a method only conditionally changes its object's state; is an exclamation mark appropriate then?  The exclamation mark can also be misread, especially if parentheses are omitted (looks an awful lot like a logical not operator, doesn't it?).  And now for my nitpicky objections: ? and ! are harder to type than letters and vim doesn't auto-complete the full method name by default (it completes everything but the last character) if one of those characters is included.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Marriage to Rails&lt;/b&gt;  On the one hand, it's nice to have a large support community for tools that one is likely to use.  On the other hand, it's annoying to wade through a bunch of comments by people on forums and mailing lists that are completely irrelevant to what you're trying to do with the language.  These people are normally exclusively concerned with getting their website up and running, aren't terribly gifted programmers and don't really care about the language per se.  Some bloggers assume that any talk about Ruby is in the context of Rails because... well, isn't that what you're using it for?  What else could you possibly do with Ruby?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Indentation&lt;/span&gt;  Python has a unique indentation system.  In most cases (Makefiles) whitespace indentation is a horrible idea, but Python manages to make it work.  It reduces noise on the screen and is pretty intuitive.  I'm not convinced that Python wouldn't be more effective, however, with a traditional bracket-defined indentation scheme which Ruby is close to.  It's a toss-up for me.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;b&gt;Things I don't like about Ruby&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TMTOWTDI&lt;/b&gt;  There's more than one way to do it in Ruby, alright -- you're smothered with options.  This is the dark path that leads to Perl.  Take &lt;a title="looping" href="http://www.techotopia.com/index.php/Looping_with_for_and_the_Ruby_Looping_Methods#The_Ruby_times_Method" id="gt2t"&gt;looping&lt;/a&gt; as an example.  In Python, you have for and while.  That's it.  In Ruby, you have for, while, times, upto, downto, begin/end and each (there's probably more that I missed).  What's wrong with for?  It's really difficult to be intimately familiar with this many options.  And this symptom doesn't just plague looping, it also plagues the standard library.  Do we really need every one of &lt;a title="&amp;lt;&amp;lt;" href="http://www.ruby-doc.org/core/classes/Array.html#M002190" id="wqa6"&gt;&amp;lt;&amp;lt;&lt;/a&gt;, &lt;a title="push" href="http://www.ruby-doc.org/core/classes/Array.html#M002191" id="qtl2"&gt;push&lt;/a&gt; and &lt;a title="+" href="http://www.ruby-doc.org/core/classes/Array.html#M002232" id="dxr:"&gt;+&lt;/a&gt; to append to the end of an array?  Why have both brackets and "end" to enclose a block?  Has anyone ever used all three versions of defining a class method in any mood but malice and spite?  I guess we can all take solace in the many ways in Ruby via &lt;a title="active_support" href="https://rubyforge.org/projects/activesupport/" id="e:1a"&gt;active_support&lt;/a&gt; to compute the amount of bytes in a gigabyte: 1.gigabyte, 1024.megabytes, 1048576.kilobytes, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Go with the Flow&lt;/span&gt;  There is a prevailing attitude with Ruby users, especially in Rails, to favor &lt;a title="convention over configuration" href="http://en.wikipedia.org/wiki/Convention_over_Configuration" id="e9q_"&gt;convention over configuration&lt;/a&gt;.  This means that tools that espouse this philosophy reward going with the flow and punish breaking out of the mold and customizing your applications.  My attitude towards this philosophy is this: unless you are creating the most pedestrian and generic of applications, you are going to need to customize the application at some point.  When that happens, it is much better to have a tool that allows flexibility than one that disdains it.  Otherwise you are going to need to go down to the core of the tool to make minor changes to your application, and that will cost you in time and sanity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hashes are broken&lt;/b&gt;  In Python, it's impossible to change the keys in a dictionary because those keys must be immutable when they go in.  Python also nicely throws a KeyError when something you're looking for in a dictionary is not there.  Ruby does neither of these things; the programmer is expected to maintain the immutability of hash keys.  High-level languages are supposed to take care of important details like these for us humans who are busy thinking about other things.  In fact, the Python FAQ lists this as an "&lt;a href="http://www.python.org/doc/faq/general/#why-must-dictionary-keys-be-immutable"&gt;unacceptable solution&lt;/a&gt;" for an alternative implementation of hashes: "Allow lists as keys but tell the user not to modify them.  This would allow a class of hard-to-track bugs in programs when you forgot or modified a list by accident."  Default return values aren't that much of a design travesty, but I still prefer the error.  Besides, if you really want a default return value in python, you can just use &lt;a href="http://docs.python.org/lib/typesmapping.html"&gt;setdefault&lt;/a&gt; when accessing the element that may or may not be there instead of setting a default value for the whole hash at creation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ranges are broken&lt;/b&gt;  This absolutely baffles me.  Why did Ruby not choose to incorporate Python's elegant slicing syntax and instead chose a less powerful and more confusing one?  Why did Ruby choose to create an unnecessary class called &lt;a title="Range" href="http://www.ruby-doc.org/core/classes/Range.html" id="ju.8"&gt;Range&lt;/a&gt; when they just could have had a function called, oh I don't know, &lt;a title="range" href="http://docs.python.org/lib/built-in-funcs.html" id="sprz"&gt;range&lt;/a&gt; that is much more powerful, simple and general and that returns lists/arrays?  Why do you need to call range.to_a to convert your useless Range object to an array in Ruby when they could have just used a function like range and gotten to the point?  Furthermore, why are there two ways to create ranges, .. (two periods) and ... (three periods) that look EXACTLY THE SAME!  Argh.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optional omission of syntax elements&lt;/b&gt;  Sure, it's less typing in Ruby, but remember what I said earlier about less surprises equaling more readable code?  It holds here as well.  Is this_thing a variable or a function call?  This also excludes the convenient syntax for introspection that calling function() without parentheses in Python affords.  And the fact that sometimes you need the "do" keyword and sometimes you don't is also a design decision that just begs for unnecessary tripping over the syntax.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Inline control flow constructs&lt;/b&gt;  When I first saw these, I thought "Wow!  I can now do in one line what previously took me three in Ruby!"  And then I started reading a lot of lines and wondering why they weren't executing.  And then I read those lines a bit further and saw that they had conditional statements tacked on to the end of them.  And then I vowed to never use them again.  One example of how this can go bad is tacking on "and return" to the end of a long statement.  If you're looking at the code, and not scrolling right far enough (and your lines are that long that you need to scroll, which may or may not be a good idea), it looks like the code falls through after every statement instead of returning.  Confusing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Different names for the same method&lt;/b&gt;  &lt;a title="find_all" href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003155" id="mu5m"&gt;find_all&lt;/a&gt;?  What the hell does that do?  Oh, it's the same as select.  &lt;a title="Collect" href="http://www.ruby-doc.org/core/classes/Enumerable.html#M003158" id="j3u2"&gt;Collect&lt;/a&gt;?  What's that?  Oh, it's the same as map.  Too bad I only found these things out after going to the documentation.  Why can't one function just have one name, so we can all have a common point of reference?  Oh, right, because Ruby "allows you to program in your natural language."  Which means confusing everybody else, including myself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Different precedence for seemingly identical operators&lt;/span&gt; ! binds more tightly than not.  &amp;amp;&amp;amp; and || bind more tightly than "and" and "or".  This is incredibly confusing; why not just make them the same precedence?  Changing one form to the other form when it is right near another operator whose precedence is between the two could alter the control flow of your code.&lt;br /&gt;&lt;br /&gt;&lt;span id="raxt" style="font-weight: bold;"&gt;Inability to override = (and non-obvious performance gotcha)&lt;/span&gt;  There is some fine print to go along with the "every operator is just a function" propaganda.  One annoying exception to the rule is the = operator.  Now, why would anyone want to override the equals sign?  First let me point out that it's not just =, but also -=, +=, *=, etc. that also are incapable of being overridden, so it affects a substantial set of important operators that are literally expanded to x = x + y, etc.  Now here's the kicker: these methods are orders of magnitude slower than their true method counterparts for arrays and strings.  So I want to override += for arrays to have it call concat or &amp;lt;&amp;lt; which are both efficient as a way of aliasing all +='s in the existing codebase.  In C++ and other languages, this would be quite possible (never mind that you wouldn't be facing this problem in C++ to being with) but in C Ruby, a design decision has been made that no one can override the sacred = and therefore coders will inevitably trip over this performance gotcha.  Why?  I'm not sure... maybe &lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/54802"&gt;this&lt;/a&gt; or &lt;a title="that" href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/54826" id="u9e-"&gt;that&lt;/a&gt; post may offer some insight.  In any event, don't use += and its cousins for anything but numbers or risk serious performance hits (changing one to the other is further complicated by their difference in precedence... both behave differently within a conditional operator, for example.  Grrr.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Confusing operator overloading&lt;/b&gt; &amp;lt;&amp;lt; is a way to print things out (a la C++), define a class method, and append to the end of an array.  Only the last one makes sense to me; the other two seem out of place.  Remember what I said about less surprises = better code readability?  It's beginning to become quite a theme...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No list comprehensions&lt;/b&gt;  [heavy_sigh for each_time_I_can_not_do_this in Ruby if I_am_particularly_exasperated]  I guess there's always select and collect.  Too bad I need to decide if I want all the items in the list or only a subset before I can select the correct method to use (instead of at the end in Python, where I can insert if statements if necessary).  I also haven't discovered a way in Ruby (yet?) to do the related task of a one-line instantiation of a hash.  In Python, this would be d = dict((x, None) for x in [1,2,3])&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Perl-like operators&lt;/b&gt;  &amp;lt;&amp;lt; &amp;lt;=&amp;gt; and =~?  Sorry, I just can't get into it.  Keep it simple, please.  Function calls with letters are good.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lists and hashes are printed strangely&lt;/b&gt;  puts {1=&amp;gt;2,2=&amp;gt;3,3=&amp;gt;4} gives me 122334 in Ruby.  WTF?  I thought I was dealing with a hash, not a number.  print {1: 2, 2: 3, 3: 4} gives me {1: 2, 2: 3, 3: 4} in Python.  puts [1,2,3] gives me numbers on separate lines in Ruby. print [1,2,3] gives me [1, 2, 3] in Python.  The seemingly small detail that data structures are printed out exactly how they are written in code makes a world of a difference.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Strings are unintuitive&lt;/b&gt;  Strings are iterated over by word, not by character in Ruby: "one two".each {|x| puts x} in Ruby outputs "one" and "two" on separate lines.  Compare this to for i in "one two": print i in Python, which prints out a character on each line.  To iterate over each character in a string in Ruby, you'll have to use &lt;a title="each_byte" href="http://www.ruby-doc.org/core-1.9/classes/String.html#M000921" id="d6b:"&gt;each_byte&lt;/a&gt; (in which case you'll find that Ruby will print out numbers unless you convert the numbers with .chr... this problem also occurs when selecting a character from a string, as in str[5] even though the docs &lt;a title="say otherwise" href="http://www.ruby-doc.org/core-1.9/classes/String.html#M000843" id="maq2"&gt;say otherwise&lt;/a&gt;) or &lt;a title="each_char" href="http://www.ruby-doc.org/core-1.9/classes/String.html#M000922" id="gdjr"&gt;each_char&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bad decisions on naming&lt;/b&gt;  Why is there a built in variable called $DEBUG?  Doesn't everyone have a global variable called that in their program at some point or another?  Well, overwriting this variable unknowingly will cause your code do very strange things, like disregard begin/rescue/ensure blocks.  I found this out the hard way.  Python's is __debug__.  Who is going to create a variable called __debug__ in their program?  Nobody, that's who.  The closest thing Ruby has to a constructor is called initialize.  Why so long?  __init__ works fine, and programmers who failed literature can actually spell it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Shortcuts for everything&lt;/b&gt;  "p" for print.  The attr family of keywords for attribute access.  Why not just create usable constructs and stick with them, instead of inventing unwieldy constructs and then working around them with shortcuts?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hype&lt;/span&gt;  Ruby is definitely the flavor of the week in programming languages.  This results in a bunch of n00bs flocking to the language when they want to learn to program.  Now, I have nothing against people who want to learn how to program.  In fact, I'm thrilled that anyone wants to take a little time to learn the art.  But the experience of a community has benefits: better tools and better discussions.  As a result the conversations in Ruby forums and mailing lists are generally of a lower quality than that on Python mailing lists which tend to be frequented by more knowledgeable, veteran coders.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Japanese Origins&lt;/span&gt;  As an English speaker, I appreciate that most of the cutting-edge blog posts and PEPs and what not are in English.  Ruby originated from Japan, so this is not the case there.  It's frustrating for me to see a link like "the solution to your problem is &lt;a title="here" href="http://d.hatena.ne.jp/zorio/20060416" id="ncr1"&gt;here&lt;/a&gt;" only to be led to a page which to me might as well be in... well, Japanese.  I am sure I would feel differently if I were Japanese, of course.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OSX/TextMate-centric community&lt;/span&gt;  A large number of Ruby users use Macs.  Not sure why, that's just the way it is.  They also seem to like &lt;a title="TextMate" href="http://en.wikipedia.org/wiki/TextMate" id="zc-q"&gt;TextMate&lt;/a&gt;.  Me?  I &lt;a title="hate" href="http://chainlynx.blogspot.com/2007/10/indictment-of-apple-part-1.html" id="attl"&gt;hate&lt;/a&gt; Apple and love &lt;a title="vim" href="http://en.wikipedia.org/wiki/Vim_%28text_editor%29" id="yrln"&gt;vim&lt;/a&gt;.  The more people that use the tools that you use, the higher probability that someone has already solved the configuration problem that is bugging you.  Although I will note that the default settings for Ruby in vim are very nice... there's at least one knowledgeable vim user writing Ruby out there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Younger Language&lt;/span&gt;  Python has been around since the late 80s.  Ruby has been around since 1993 (both for certain definitions of "around").  Python has a head start on Ruby in terms of developer time.  A more mature language is likely to have fewer bugs, more features, less experimentation and and more users.  The same goes for libraries written for that language: a greater number of better-implemented libraries will be available to users of a language that has been around longer.  All other things being equal, the older language has to win the stability and reliability battle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unfamiliar keywords&lt;/b&gt;  Instead of try/catch (or except)/finally, Ruby has begin/rescue/ensure.  Instead of continue, Ruby has next.  Instead of else if or elif, Ruby has elsif.  Instead of switch/case, Ruby has case/when.  I guess every language commits this foul to some extent, but it's just one more thing to trip over.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implicit returns&lt;/span&gt;  Another Perlism that I despise.  To me, a function looks like it doesn't return anything if it doesn't have the "return" keyword in there at some point.  It's much easier to read (and maintain) code if the points at which a function could return something are explicitly outlined.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Things I don't have an opinion on... yet&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introspection/Reflection&lt;/span&gt;  Haven't really dug that deeply into what Ruby can do here yet...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Package management&lt;/span&gt;  The gems system vs letting apt-get do everything.  Neither has failed me in any way thus far, but then again, I haven't really tried to do anything remotely complicated with either and I'm not a sysadmin presiding over a myriad of different configurations...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Threading&lt;/span&gt;  Ruby doesn't support native threads.  What are Python's options?  &lt;a title="This looks like a good article" href="http://www.ddj.com/linux-open-source/206103078;jsessionid=AIK5MYYPGTZXOQSNDLPSKH0CJUNN2JVN?pgno=1" id="ofgp"&gt;This looks like a good article&lt;/a&gt; and what about &lt;a title="Stackless Python" href="http://www.onlamp.com/pub/a/python/2000/10/04/stackless-intro.html" id="ymqv"&gt;Stackless Python&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Object Oriented stuff&lt;/span&gt;  Namespaces, modules, Inheritance, etc.  I'm sure there's some Python vs Ruby flamewar going on out there, I just have to find the thread...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-249347521648163305?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/249347521648163305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=249347521648163305' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/249347521648163305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/249347521648163305'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/02/ruby-vs-python-preliminary-assessment.html' title='Ruby (vs Python): a preliminary assessment'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8032042250478911492</id><published>2008-01-07T07:15:00.000-08:00</published><updated>2009-02-22T12:09:34.825-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='fortune'/><category scheme='http://www.blogger.com/atom/ns#' term='cowsay'/><category scheme='http://www.blogger.com/atom/ns#' term='banner'/><title type='text'>Funny UNIX utilities</title><content type='html'>Some humorous UNIX utilities that brighten my day:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nog.net/%7Etony/warez/cowsay.shtml"&gt;cowsay&lt;/a&gt; -- get a cow, etc. to do the talking&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fortune_%28program%29"&gt;fortune&lt;/a&gt; -- witticisms, some more offensive than others (&lt;span style="font-weight: bold;"&gt;fortunes-off&lt;/span&gt; package contains more offensive fortunes, &lt;span style="font-weight: bold;"&gt;fortune -o&lt;/span&gt; invokes offensive fortunes)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Banner_%28Unix%29"&gt;banner&lt;/a&gt; -- big friggin letters&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8032042250478911492?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8032042250478911492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8032042250478911492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8032042250478911492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8032042250478911492'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/01/funny-unix-utilities.html' title='Funny UNIX utilities'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3290325145809093000</id><published>2008-01-07T07:07:00.000-08:00</published><updated>2009-09-21T12:08:29.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='enscript'/><category scheme='http://www.blogger.com/atom/ns#' term='lpr'/><category scheme='http://www.blogger.com/atom/ns#' term='printing'/><title type='text'>Printing with enscript</title><content type='html'>&lt;a href="http://www.codento.com/people/mtr/genscript/"&gt;enscript&lt;/a&gt; is an awesome utility for printing text files; it kicks lpr's lame ass.  Here are some examples of usage (more to come as the need arises):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Letter &lt;span style="font-weight: bold;"&gt;enscript --no-header --word-wrap example_file.txt&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Also, navigate to &lt;span style="font-weight: bold;"&gt;localhost:631&lt;/span&gt; on any system with &lt;a href="http://en.wikipedia.org/wiki/CUPS"&gt;CUPS&lt;/a&gt; installed in order to configure the default printer and such.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3290325145809093000?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3290325145809093000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3290325145809093000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3290325145809093000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3290325145809093000'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2008/01/printing-with-enscript.html' title='Printing with enscript'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5299040597286894484</id><published>2007-12-14T14:44:00.000-08:00</published><updated>2007-12-17T23:00:49.540-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Learning Ruby from Python</title><content type='html'>I just started to pick up &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; today (to install: &lt;b&gt;  sudo apt-get install ruby irb ri rubygems&lt;/b&gt;).  Here are some things I learned along the way, coming from a Python mindset.  The (very good and highly recommendable) references I looked at were (in order):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="Ruby in Twenty Minutes" href="http://www.ruby-lang.org/en/documentation/quickstart/" id="e1t:"&gt;Ruby in Twenty Minutes&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="To Ruby From Python" href="http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/" id="sspq"&gt;To Ruby From Python&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Ruby Essentials (free, on-line book)" href="http://www.techotopia.com/index.php/Ruby_Essentials" id="uzig"&gt;Ruby Essentials (free, on-line book)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/"&gt;Important Language Features and Some Gotchas&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Similarities&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Brackets for arrays, braces for dictionaries (called hashes in Ruby)&lt;/li&gt;&lt;li&gt;Strong dynamic typing&lt;/li&gt;&lt;li&gt;Everything is an object, variables are just references&lt;/li&gt;&lt;li&gt;Exceptions are similar&lt;/li&gt;&lt;li&gt;No special line termination characters&lt;/li&gt;&lt;li&gt;# for single line comments&lt;/li&gt;&lt;li&gt;def to define a method, class to define a class&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Differences&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interactive prompt: python =&amp;gt; &lt;span style="font-weight: bold;"&gt;irb&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Interactive prompt help:  help(str.count) =&amp;gt; &lt;span style="font-weight: bold;"&gt;help "String#count"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interactive prompt reload: reload(foo) =&amp;gt; &lt;span style="font-weight: bold;"&gt;load "foo.rb"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Command line docs: pydoc =&amp;gt; &lt;span style="font-weight: bold;"&gt;ri&lt;/span&gt;&lt;/li&gt;&lt;li&gt;File extension: .py =&amp;gt; &lt;span style="font-weight: bold;"&gt;.rb&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Shebang line: #!/usr/bin/python =&amp;gt; &lt;span style="font-weight: bold;"&gt;#!/usr/bin/env ruby&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Indentation and blocks: : and tabs =&amp;gt; either &lt;span style="font-weight: bold;"&gt;{ }&lt;/span&gt; or &lt;span style="font-weight: bold;"&gt;end&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Strings: immutable =&amp;gt; &lt;span style="font-weight: bold;"&gt;mutable&lt;/span&gt; (can use freeze method for immutability)&lt;/li&gt;&lt;li&gt;Naming conventions: unenforced =&amp;gt; &lt;span style="font-weight: bold;"&gt;enforced&lt;/span&gt; (ex. class names start with a capital letter, variables start with a lowercase letter)&lt;/li&gt;&lt;li&gt;Raw strings: r"blah" =&amp;gt; &lt;span style="font-weight: bold;"&gt;'blah'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Parantheses: mandatory =&amp;gt; &lt;span style="font-weight: bold;"&gt;sometimes optional&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Booleans: True, False =&amp;gt; &lt;span style="font-weight: bold;"&gt;true, false&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Null value: None =&amp;gt; &lt;span style="font-weight: bold;"&gt;nil&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Else-if statement: elif =&amp;gt; &lt;span style="font-weight: bold;"&gt;elsif&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Module import: import foo =&amp;gt; &lt;span style="font-weight: bold;"&gt;require "foo"&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Boolean conversion: 0, False, None and anything empty =&amp;gt; &lt;span style="font-weight: bold;"&gt;Only nil and false&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Doc generation: docstrings below things =&amp;gt; &lt;span style="font-weight: bold;"&gt;regular comments above things&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Output: print =&amp;gt; &lt;span style="font-weight: bold;"&gt;puts&lt;/span&gt; (or &lt;span style="font-weight: bold;"&gt;print&lt;/span&gt; if you don't want a trailing newline)&lt;/li&gt;&lt;li&gt;Command line execution: python -c =&amp;gt; &lt;span style="font-weight: bold;"&gt;ruby -e&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Global Variables&lt;/li&gt;&lt;li&gt;Ranges: range(x,y) =&amp;gt; &lt;span style="font-weight: bold;"&gt;x...y&lt;/span&gt; exclusive, &lt;span style="font-weight: bold;"&gt;x..y &lt;/span&gt;inclusive (&lt;span style="font-weight: bold;"&gt;.to_a&lt;/span&gt; to return array)&lt;/li&gt;&lt;li&gt;Slicing: arr[1:3] =&amp;gt; &lt;span style="font-weight: bold;"&gt;arr[1...3]&lt;/span&gt; or &lt;span style="font-weight: bold;"&gt;arr[1..2]&lt;/span&gt; (inclusive)&lt;/li&gt;&lt;li&gt;Object initialization: __init__ =&amp;gt; &lt;span style="font-weight: bold;"&gt;initialize&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Object creation: a() =&amp;gt; &lt;span style="font-weight: bold;"&gt;a.new&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Ternary operator: if_true if statement else if_false =&amp;gt; &lt;span style="font-weight: bold;"&gt;statement ? if_true : if_false&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Substring matching: 'foo' in str =&amp;gt; &lt;span style="font-weight: bold;"&gt;str['foo']&lt;/span&gt; &lt;/li&gt;&lt;li&gt;"Main": if __name__ == '__main__' =&amp;gt;&lt;span style="font-weight: bold;"&gt; if __FILE__ == $0 ... end&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Philosophical differences&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Attribute access: direct access =&amp;gt; &lt;span style="font-weight: bold;"&gt;method calls&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Need getter and setter methods to access attribute outside class&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Access permissions: convention by underscore =&amp;gt; &lt;span style="font-weight: bold;"&gt;public, protected, private&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Multiple inheritance: allowed =&amp;gt; &lt;span style="font-weight: bold;"&gt;mixins&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Stuff Ruby has that Python doesn't&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Double quoted strings allow expression substitution #{} and escape sequences \t\n&lt;/li&gt;&lt;li&gt;You can re-open a class at any time and add more methods&lt;/li&gt;&lt;li&gt;Block comments: ==begin and ==end&lt;/li&gt;&lt;li&gt;Special variable characters (begins with...):&lt;/li&gt;&lt;ul&gt;&lt;li&gt;$ global&lt;/li&gt;&lt;li&gt;@ instance&lt;/li&gt;&lt;li&gt;[a-z_] local&lt;/li&gt;&lt;li&gt;[A-Z] constant (triggers warnings when reassigned)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;@@ class&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Arrays support some set operations&lt;/li&gt;&lt;ul&gt;&lt;li&gt;difference -&lt;br /&gt;&lt;/li&gt;&lt;li&gt;intersection &amp;amp;&lt;/li&gt;&lt;li&gt;union |&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Method conventions (ends with...)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;! changes internal state of object&lt;/li&gt;&lt;li&gt;? returns boolean&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;do keyword -- optional loop keyword (unless on single line)&lt;/li&gt;&lt;li&gt;Crazy for loop &lt;a title="alternatives" href="http://www.techotopia.com/index.php/Looping_with_for_and_the_Ruby_Looping_Methods#The_Ruby_times_Method" id="aud0"&gt;alternatives&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="General delimited strings" href="http://www.techotopia.com/index.php/Ruby_Strings_-_Creation_and_Basics#General_Delimited_Strings" id="s.rc"&gt;General delimited strings&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Case statement" href="http://www.techotopia.com/index.php/The_Ruby_case_Statement" id="p2p4"&gt;Case statement&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Lots of options for &lt;a title="string element access" href="http://www.techotopia.com/index.php/Ruby_String_Concatenation_and_Comparison#Accessing_String_Elements" id="l2id"&gt;string element access&lt;/a&gt; and string &lt;a title="substitution and insertion" href="http://www.techotopia.com/index.php/Ruby_String_Replacement%2C_Substitution_and_Insertion" id="xhwo"&gt;substitution and insertion&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Regular expressions as first-order objects&lt;/li&gt;&lt;li&gt;Perl-like control flow constructs that can be tacked onto the end of an expression&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5299040597286894484?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5299040597286894484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5299040597286894484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5299040597286894484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5299040597286894484'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/12/learning-ruby-from-python.html' title='Learning Ruby from Python'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4453003697178613087</id><published>2007-12-11T21:02:00.000-08:00</published><updated>2007-12-12T13:26:41.415-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>"Why don't you write a Facebook Application?"</title><content type='html'>There is a lot of hype surrounding the newly released Facebook application platform.  Developers are falling all over themselves to get a product rushed out the door, &lt;a title="funding" href="http://www.techcrunch.com/2007/09/17/facebook-launches-fbfund-with-accel-and-founders-fund-to-invest-in-new-facebook-apps/" id="hx_p"&gt;funding&lt;/a&gt; for Facebook apps is flowing in from VCs and you can even take a &lt;a title="class" href="http://youtube.com/watch?v=RwpGcfAV9fQ" id="qqj2"&gt;class&lt;/a&gt; in Facebook application development at Stanford.  Amid all of this irrational exuberence, I find myself frequently getting asked why I don't write to it.  Well, there are a lot of good reasons to stay as far away from the platform as possible.  It's proprietary, unpredictable, not a level playing field in the least and crowded with unworthy offerings.  My time and effort is much better spent somewhere else.&lt;br /&gt;&lt;br /&gt;First of all, even if we assume for the sake of argument that I am interested in developing a Facebook app, the deck is stacked against me.  Tim O'Reilly &lt;a title="points out" href="http://radar.oreilly.com/archives/2007/10/facebook_long_tail_report.html" id="dgs9"&gt;points out&lt;/a&gt; that there is a steep drop off in users after the first four or five most popular apps (the graph on O'Reilly's page is instructive).  There are a few reasons for this.  The first is that the door has largely closed on the willingness of users to add new applications or suggest them to their friends; the fad has come and gone.  &lt;a title="In other words" href="http://www.ajaxninja.com/?p=88" id="t6pi"&gt;In other words&lt;/a&gt;, "[W]e must acknowledge that ... users have grown accustomed to a small subset of applications available to all users, and the exploratory period has come to an end... Facebook is all about communicating an image of yourself to your peers, and unless someone creates a truly captivating, innovative, or better F8 application, no one is going to adopt it on a whim."  The quickest functional and moderately compelling apps to get out the door were the ones that users pounced on.  The second reason for the disparity in users parallels the disparity in the finances and professionalism of the makers of the apps.  Five of the top six apps right now are made by just two companies: &lt;a title="Slide" href="http://www.slide.com/" id="pv0y"&gt;Slide&lt;/a&gt; and &lt;a title="RockYou!" href="http://www.rockyou.com/" id="ex5:"&gt;RockYou!&lt;/a&gt;. [A]  Making little flash widgets is essentially these companies' entire business and both of them are &lt;a title="well" href="http://venturebeat.com/2006/11/14/slide-gets-big-vc-round-for-its-slideshow-product/" id="x183"&gt;well&lt;/a&gt; &lt;a title="financed" href="http://startupsquad.com/2007/05/16/breaking-rockyou-announces-funding-throws-back-150-million-number-at-slide/" id="m89k"&gt;financed&lt;/a&gt;.  Amateur developers do not stand a chance against a small army of VC-backed Flash coders who do this for a living. [B]  Any entry into the Facebook app market now is essentially futile.&lt;br /&gt;&lt;br /&gt;The survivability of the Facebook platform is another issue.  It bears some eerie similarities to "walled garden" initiatives past.  Perhaps most illustrative is the case of AOL, whose proprietary platform, of course, nobody uses anymore.  Should I really bother developing against a technology predicting that it won't survive 10 years?  Perhaps, but I would rather write to a platform that is built on open standards.  Jason Kottke &lt;a title="explains" href="http://www.kottke.org/07/06/facebook-is-the-new-aol" id="bua2"&gt;explains&lt;/a&gt;: [E]&lt;br /&gt;&lt;blockquote&gt;As it happens, we already have a platform on which anyone can communicate and collaborate with anyone else, individuals and companies can develop applications which can interoperate with one another through open and freely available tools, protocols, and interfaces. It's called the internet and it's more compelling than AOL was in 1994 and Facebook in 2007.&lt;br /&gt;&lt;/blockquote&gt;  The fact that Facebook could change its platform or go out of business at any time is a disincentive to write a Facebook application.  I don't like my creations functioning at the whims of Facebook or its investors; it's a better bet to go with an established, open platform.&lt;br /&gt;&lt;br /&gt;I ran across a &lt;a title="similar post" href="http://www.alexkates.com/2007/10/facebook-why-applications-suck.html" id="i964"&gt;similar post&lt;/a&gt; on Facebook app suckiness that raised an additional reason not to develop a Facebook app.  If, against all odds, your application is truly innovative and distinguishes itself in the crowd of petty profile pollution, you still are on Facebook's turf; that carries some important consequences.  Specifically, Facebook could copy your idea with a feature that they subsequently build in to Facebook itself.  It will be accessible to all users, not just the ones that choose to add it as an application, and there will be no use for your app anymore.  Facebook could take your idea and reimplement it, thus sucking away all of your users, and there would be nothing you could do about it.&lt;br /&gt;&lt;br /&gt;Then there is the embarrassing stigma of being in the company of Facebook application developers.  The (&lt;a title="many" href="http://www.zdnet.com.au/news/software/soa/FaceBook-platform-attracts-1-000-developers-a-day/0,130061733,339278661,00.htm" id="cx3z"&gt;many&lt;/a&gt;) applications are written by developers who want to jump on the Facebook hype bandwagon.  Most of them are amateurs, and it shows.  Take the &lt;a href="http://www.facebook.com/apps/application.php?id=2341007765&amp;amp;b&amp;amp;ref=pd"&gt;Quizzes&lt;/a&gt; application, for instance (ranked 14th in most active users, so a reasonably popular app).  It lacks basic functionality that one would expect in such an application: namely, the ability to see the correct answers after you take the quiz.  It also creates a quiz that other people can take before you even indicate you are finished adding questions!  Furthermore, I couldn't access the application at all today because, presumably, it is choking under the load that Facebook is sending to it (another all-to-frequent problem of these applications).  Quizzes, admittedly, might be an application that one might use occasionally.  I can not say the same about other applications, most of which can be broken down into four categories:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Horoscope&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=7242826158&amp;amp;b&amp;amp;ref=pd"&gt;What flower are you?&lt;/a&gt; -- "Are you rose, lilly, foxglove, daffodil, nigella, sunflower, violet? Find out."&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=6331972105&amp;amp;b&amp;amp;ref=pd"&gt;Birthstones&lt;/a&gt; -- "From the time gemstones were discovered, they were believed to have mystical powers and attributes that could be passed to the wearer. The red of ruby was fiery and passionate; cool blue sapphire was calm and composed. What's yours?"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=19488187448&amp;amp;b&amp;amp;ref=pd"&gt;Psychic Breeze - Psychic Readings and Fortune Telling&lt;/a&gt; -- "Accurate psychic, psychic medium and clairvoyant readings are available today. Our extraordinary psychics, mediums and clairvoyants use their psychic ability to provide you with guidance in relationships, love, finances, and other life hurdles."&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Decorative trinkets&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=6268909580&amp;amp;b&amp;amp;ref=pd"&gt;Snow Globe Gifts&lt;/a&gt; -- "Snow Globe Gifts!  Send your friends realistic, shakeable, snow globes..."&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=20635230880&amp;amp;b&amp;amp;ref=pd"&gt;Christmas Music Tree&lt;/a&gt; -- "Create your own special Christmas Tree. Decorate your tree with your friends and make them play many famous Christmas songs. It's your Musical Christmas Tree."&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=2394473030&amp;amp;b&amp;amp;ref=pd"&gt;My Fab Bag&lt;/a&gt; -- "Buy and give your friends designer handbags. Choose your favorite to carry and display on your profile."&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Finding a boyfriend&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=17091798008&amp;amp;b&amp;amp;ref=pd"&gt;Are YOU Interested?&lt;/a&gt; -- "FUN application to see who is interested in YOU!"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=4188419540&amp;amp;b&amp;amp;ref=pd"&gt;Likeness UNRATED&lt;/a&gt; -- "Find out who you're like on mature topics like purity, vices, and the seven deadly sins. Can you find a perfect match?"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=6323135851&amp;amp;b&amp;amp;ref=pd"&gt;Will you KISS me?&lt;/a&gt; -- "Send kisses to loved ones, lovers, romantics, mistresses and everyone! Ever wanted a friend or crush to kiss youand find that they want to kiss you too What if it happens on a Full moon night? Give and take kisses"&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Just good ol' pestering people&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=2341504841&amp;amp;b&amp;amp;ref=pd"&gt;Zombies&lt;/a&gt; -- "Bite your friends and make them zombies! Mmmmm... Brains! Also - you can fight Zombies, Vampires and Werewolves now!"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=2458301688&amp;amp;b&amp;amp;ref=pd"&gt;Vampires&lt;/a&gt; -- "From the makers of Zombies comes Vampires! Kind of like Zombies. Except that the vampires are hot. VERY hot. Also - you can fight Zombies, Vampires and Werewolves now!" [C]&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.facebook.com/apps/application.php?id=2345673396&amp;amp;b&amp;amp;ref=pd"&gt;X Me&lt;/a&gt; -- "Tired of just poking? X me opens up a whole new world of action-based messaging, for example 'Hug Her, Slap Him, Tickle Them!'"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Is this trash what I really want to spend my time developing?  Do people actually waste their time using this filth?  It's depressing that humans' frontal lobes have not yet developed sufficiently to resist soliciting the advice of fortune-teller applications. [D]  Given this kind of crowd, I don't think I could expect anyone to take me seriously if I told him I was developing a Facebook application.  I would anticipate him laughing in my face.&lt;br /&gt;&lt;br /&gt;That's why I don't develop for the Facebook platform: it's pure hype.  Nothing of significance has been produced in the form of a Facebook application, and the only applications that get any views are ones that are made by companies who specialize in them.  This environment exists at the whim of Facebook and its investors, and could come crashing to a halt if the business goes belly-up or Mr. Zuckerberg has a change of heart.  I'll take my code somewhere else, thank you very much.&lt;br /&gt;&lt;br /&gt;===========================&lt;br /&gt;&lt;br /&gt;[A]  Prepare for some awful, awful music and graphics if you go to RockYou!'s page.  I had the displeasure of being aurally assaulted by Lil' Mama blowing kisses at me.  You have been warned.&lt;br /&gt;&lt;br /&gt;[B]  To hammer this point into the ground, RockYou!'s CEO discusses &lt;a title="here" href="http://venturebeat.com/2007/05/29/qa-with-ilikes-ali-partovi-on-facebook/" id="rv9e"&gt;here&lt;/a&gt; how, in order to prepare for an expected spike in traffic, they ran around filling a 24-ft truck full of servers and hooking them up over a weekend.  Does this sound like the kind of thing you could pull off with the change you found under the sofa?  I didn't think so.&lt;br /&gt;&lt;br /&gt;[C]  "From the makers of Zombies..."  As if Zombies was a fantastic, useful product to stake their reputation on.  They have &lt;a href="http://www.facebook.com/apps/application.php?id=2721700161&amp;amp;b&amp;amp;ref=pd"&gt;WereWolves&lt;/a&gt;, too.  Maybe there's more, I didn't care to look.&lt;br /&gt;&lt;br /&gt;[D]  And there's a hell of a lot more dumb applications, if you want to take a &lt;a title="peek" href="http://www.facebook.com/apps/" id="so7_"&gt;peek&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[E]  He expands on the "Facebook as AOL" theme in &lt;a title="this" href="http://www.kottke.org/07/07/facebook-vs-aol-redux" id="g89i"&gt;this&lt;/a&gt; post.  Scott Rosenberg also has his &lt;a title="thoughts" href="http://www.wordyard.com/2007/06/29/facebook-aol/" id="ke8f"&gt;thoughts&lt;/a&gt; on the subject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4453003697178613087?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4453003697178613087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4453003697178613087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4453003697178613087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4453003697178613087'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/12/why-dont-you-write-facebook-application.html' title='&quot;Why don&apos;t you write a Facebook Application?&quot;'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4697314003060769294</id><published>2007-12-11T14:46:00.000-08:00</published><updated>2008-11-24T20:17:32.630-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>Why I am Still on Facebook</title><content type='html'>Facebook &lt;a title="sucks" href="http://chainlynx.blogspot.com/2007/12/facebook-sucks.html" id="pe00"&gt;sucks&lt;/a&gt;.  And yet, I can't bring myself to terminate my account.  It has a few essential features that I just could not do without because of its dominant position as today's preeminent social platform.  Like the AOL of yesteryear, everyone else uses it (a bit too much) and expects you to use it to communicate with them.  These few communication and sharing features are the site's strengths.  Facebook counts on users sticking around in order to use these features regardless of how many ads they plaster on their pages or how many privacy violations they can rack up.  Facebook's flaws are outweighed by its utility, which is why I haven't quit Facebook... yet.&lt;br /&gt;&lt;br /&gt;Facebook's best feature is what it started out as: a directory of contact information.  The average person does not have the time, skill, interest or money to register a domain name, set up a personal web page and push it to the top of Google's index for searches against his name.  A social networking page is a much more convenient way to disseminate contact information.  Facebook is the best solution for this because it shares contact information only with people of which the person approves.  This arrangement makes many more comfortable than if they had shared their contact information on a public site such as MySpace.  As Facebook also started out as a college network about the time that I was in college, it is the platform of choice of virtually all the people I would desire to contact.  Most of the time, the aggregate contact information for someone just starting their professional life is not available anywhere else.  I can not count the number of times when I quickly needed to contact somebody, only to realize that I did not have her AIM screen name, email address, phone number, etc and fetched the information off Facebook.&lt;br /&gt;&lt;br /&gt;The other killer feature of Facebook is photo sharing, which is why it is now the &lt;a title="largest" href="http://www.facebook.com/jobs/engineering.php" id="ytre"&gt;largest&lt;/a&gt; photo sharing site in the United States with over a billion pictures.  If I were to withdraw from Facebook, I would no longer have access to my friends' photos and they would no longer have access to mine.  Of course, I could always migrate all of my pictures to &lt;a title="Flickr" href="http://www.flickr.com/" id="b67z"&gt;Flickr&lt;/a&gt; or some other site and then point all my friends there.  But is it really worth the time and effort to do that, knowing that Facebook already has a great framework for doing this that my friends and I currently use?  Again, Facebook's privacy controls are also an important feature: if I transitioned to another platform, I would need to re-implement the privacy controls there (assuming they were even supported!).  Additionally, all of the tag data and comments that Facebook supports would be lost in translation.&lt;br /&gt;&lt;br /&gt;And let us not forget the networking part of social &lt;span style="font-style: italic;"&gt;networking&lt;/span&gt;.  Facebook does provide opportunities to network, in the business sense. [A]  It's easier to approach a person if he looks familiar, you have some background on him and you can draw from a number of topics of conversation.  Also, even if the only contact two people have is seeing each others' name go by on their respective News Feeds and having the other's face pop up once in a while on sample friend lists, that connection is sufficient to leave a lasting impression on the subconscious mind. [B]  And requesting someone to be a friend on Facebook can be sometimes interpreted as a digital 'good meeting you' compliment.  In spite of all this, I believe the networking aspect of Facebook to be a relatively minor incentive for staying on the site.&lt;br /&gt;&lt;br /&gt;So photos and contact information are really the only two things that keep me from ending my adventures with Facebook.  For the time being, it seems that I'm just going to have to swallow my pride, eat my words and keep using the site.&lt;br /&gt;&lt;br /&gt;=============================&lt;br /&gt;&lt;br /&gt;[A] "&lt;span style=""&gt;Expanding one's social network or sphere of influence by initiating mutually advantageous new relationships with people." (&lt;a title="link" href="http://www.iuniverse.com/how-we-work/terms.htm" id="xd2b"&gt;link&lt;/a&gt;) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;[B] I didn't come up with this theory, my friend Monique did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4697314003060769294?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4697314003060769294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4697314003060769294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4697314003060769294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4697314003060769294'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/12/why-i-am-still-on-facebook.html' title='Why I am Still on Facebook'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4824581726543403400</id><published>2007-12-10T15:06:00.000-08:00</published><updated>2010-03-25T09:55:37.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Facebook Sucks</title><content type='html'>Every time I sign on to &lt;a title="Facebook" href="http://www.facebook.com/" id="vr63"&gt;Facebook&lt;/a&gt;, a little part of me dies.  Not only am I usually wasting my time, but I am allowing Facebook to violate my privacy, potentially offending hundreds of "friends" and being bombarded with ads and spam.  Furthermore, I am forced to use Facebook's clumsy tools to communicate with others on Facebook who seem to never have heard of email, all while wading through the ostentatious posturing of Facebook's users.  In short, Facebook sucks.&lt;br /&gt;&lt;br /&gt;Facebook is a great opportunity to offend people.  As if I didn't have enough trouble minding my etiquette in the real world, the choice to friend or not to friend (or grant restricted access, or defriend) provides daily chances for someone accidentally or intentionally insult someone else.  The heart of the problem is that some people have different conceptions of what a Facebook friend actually entails.  Does it mean you are friends in real life?  Is it meaningless?  &lt;a title="Some" href="http://www.collegehumor.com/article:1722203" id="s5za"&gt;Some&lt;/a&gt; are willing to Facebook friend &lt;a title="total strangers" href="http://www.news.com/8301-10784_3-9759401-7.html" id="ux5b"&gt;total strangers&lt;/a&gt; and others keep a very small circle Facebook friends that might actually be closer to the number of good friends they have in real life.  There is a point at which this managing of digital networks becomes tiresome, evoking a &lt;a title="social network fatigue" href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2006/11/02/FATIGUE.TMP" id="lrjx"&gt;social network fatigue&lt;/a&gt;.  The value of a particular user's experience on Facebook (or on any social network) rises and then falls as the number of users increases. [B]  At first, the user is excited to connect with all of his friends and perhaps reconnect with some that he had lost touch with.  But over time, as more people join the site, more time is spent on fending off unwanted friend requests and friend network management.  This eventually drives the user to become much less active on the website, if not to opt out of it completely.&lt;br /&gt;&lt;br /&gt;Facebook is a black hole that sucks up time.  There is certainly something compelling about browsing your "social network" through a hyperlinked photo yearbook.  In fact, it's too compelling -- some have complained of "&lt;a title="Facebook addiction" href="http://www.youtube.com/watch?v=IHKzIwIeeQ4&amp;amp;feature=related" id="x12r"&gt;Facebook addiction&lt;/a&gt;."  Facebook exacerbates this problem (well, certainly not a problem for them) by sending you incessant reminders of activity on your account by default ("Someone has done x to you on Facebook") which pull you back to the site again. [A]  Apps have worsened this addiction because now every app requires its own micro-management and sends its own messages to your inbox.  &lt;a title="Here" href="http://www.calacanis.com/2007/07/27/facebook-bankruptcy/" id="miqj"&gt;Here&lt;/a&gt; is a picture of the overwhelming number of annoyances a typical Facebook user might face upon login.  All of the time spent on Facebook wouldn't be wasted if there was substantive communication taking place on the site but, for the most part, there's not.  It's all just about how many people you've converted into &lt;a title="zombies" href="http://personalweb.about.com/od/makefriendsonfacebook/qt/facebookzombie.htm" id="rcu5"&gt;zombies&lt;/a&gt; or whether you identify more with &lt;a title="pirates or ninjas" href="http://www.associatedcontent.com/article/397727/the_top_5_dumbest_facebook_applications.html" id="n.:x"&gt;pirates or ninjas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Facebook reinvents the wheel in a variety of ways, moving online communication a step backwards.  Since Facebook wants you to stay within the site's walls, Facebook provides tools for you to accomplish certain goals, no matter how mediocre those tools may be.  For example, Facebook provides a "Marketplace" for users to buy and sell items on their site.  Of course, there are many superior auction/barter/market sites already on the Internet: Amazon.com, eBay and Craigslist, to name a few.  Facebook provides "Posted Items" and "Notes," whose features are poor substitutes for nearly any blogging platform.  And Yahoo and Google groups are many times more advanced than Facebook's groups.  The most irritating example of Facebook's compulsive re-engineering is Facebook messages -- it reminds me of a dark age when GMail didn't exist, and also gives me another inbox to manage (much more clumsily, mind you).&lt;br /&gt;&lt;br /&gt;Twice Facebook has disregarded its responsibilities to its users and precipitated privacy invasions, both for which Zuckerberg promptly &lt;a title="issued" href="http://blog.facebook.com/blog.php?post=2208562130" id="vuyt"&gt;issued&lt;/a&gt; &lt;a title="apologies" href="http://blog.facebook.com/blog.php?post=7584397130" id="au8j"&gt;apologies&lt;/a&gt;.  First there was the &lt;a title="News Feed" href="http://www.time.com/time/nation/article/0,8599,1532225,00.html" id="kpur"&gt;News Feed&lt;/a&gt;, which broadcasted users' actions to all of their friends.  Facebook followed that with &lt;a title="Beacon" href="http://gigaom.com/2007/11/06/facebook-beacon-privacy-issues/" id="p5:-"&gt;Beacon&lt;/a&gt;, a system that tracked a users' actions on affiliate sites, such as the New York Times, and then fed information back to Facebook (and that users' friends through the News Feed) about a users' behavior.  Twice Facebook has recklessly played fast and loose with its users' data, and twice it has pushed its audacity to the limit until it faced a revolt by its users.  The most shocking part of this whole story is that these systems &lt;span style="font-style: italic; font-weight: bold;"&gt;never went away&lt;/span&gt;!  In each instance Zuckerberg waved his hands to make an apology, as if users' concerns had been assuaged, and only partially disabled the systems that caused the uproar.  The News Feed, although it did get &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; controls, still doesn't give the user a choice if some types of stories are broadcasted.  Beacon is also wholly intact, but was changed from an opt-out to an opt-in system. [C]  There is no reason to think this is the last time this pattern will happen, as Scott Rosenberg &lt;a title="points out" href="http://www.wordyard.com/2007/12/10/deep-packet-inspection/" id="st1a"&gt;points out&lt;/a&gt;.  To justify its massive valuation, Facebook is under a lot of pressure to find additional ways to monetize its service, and there is good money to be made selling out users.   What privacy-infringing "feature" will Facebook be pressured to invent next?  [D]&lt;br /&gt;&lt;br /&gt;And then there are ads -- lots of ads.  In addition to the easily blockable banner ads on the bottom and sides of the page (an Internet staple since as far as I can remember), Facebook has devised ways to deliver ads to users that are not so trivially thwarted.  Facebook actually embeds ads inside the News Feed that come from the same server as the rest of the News Feed, unlike other embedded ads (like Google's) which come from a third-party server and are thus easy to identify and block.  Fortunately, there are some &lt;a title="ways" href="http://chainlynx.blogspot.com/2007/11/blocking-facebook-news-feed-ads-with.html" id="mf_."&gt;ways&lt;/a&gt; to rid your eyeballs of these menaces.  It is also much harder to tell that you are looking at an ad in the news feed: Facebook &lt;a title="blends them in" href="http://mashable.com/2006/10/20/facebooks-annoying-news-feed-ads-go-live/" id="bm7m"&gt;blends them in&lt;/a&gt; so well to almost make them indistinguishable from bona fide News Feed stories.  This approach is in stark contrast to what Google and other sites do, clearly identifying which content is sponsored and which content is not.  This practice is irritating at best and deceptive at worst.&lt;br /&gt;&lt;br /&gt;And speaking of deceptive ads, how about &lt;a href="http://blog.wired.com/business/2008/01/facebook-ads-ma.html"&gt;using my image&lt;/a&gt; in an ad for a sponsor, as if I were sending a personal recommendation to a friend?  Taking a "social action" (as Facebook puts it) is not a license to use me as a viral marketing stooge for Blockbuster, et al. [I]  To add insult to injury, Facebook is now allowing advertisers to send targeted emails directly to your Facebook inbox (the first line of the most recent one I received from CbsSports.com: "Hey College Hoops Fan!").  Hm, unwanted emails in my inbox trying to sell stuff; I think that's better known by its more conventional name -- spam.  You spam your "friends" with application requests, corporations spam you with messages in your inbox, your "friends" spam you with pokes and news feed items.  &lt;span style="font-style: italic;"&gt;This is essentially what Facebook has become: a very efficient platform for spamming people.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can put a lot of data in to Facebook, but getting that data out is an entirely different story.  It is quite easy, for example, to &lt;a href="https://register.facebook.com/findfriends.php?tabs"&gt;import your contacts&lt;/a&gt; from another platform into Facebook.  Facebook, however, provides no convenient method for exporting those contacts into Outlook, Gmail, or the other social network flavor of the week.  The same goes for photos, videos and all other multimedia.  Looking for a "backup my photos" link?  Sorry, it doesn't exist.   There &lt;span style="font-style: italic;"&gt;are&lt;/span&gt; ways to get data out of Facebook, but they are inconvenient and few.  One is to use the API either by writing an app yourself (clearly out of the reach of most users) or using an application like &lt;a href="http://www.facebook.com/apps/application.php?id=6751187779"&gt;FriendCSV&lt;/a&gt; [K].  The API, however, doesn't allow extraction of some types of information, like email.  Another is to scrape the site, which is against the &lt;a href="http://www.facebook.com/terms.php"&gt;terms of use&lt;/a&gt; (like most companies') and can lead to the &lt;a href="http://scobleizer.com/2008/01/03/ive-been-kicked-off-of-facebook/"&gt;termination of your account&lt;/a&gt; if they catch you doing so.  And it is also &lt;a href="http://www.nytimes.com/2008/02/11/technology/11facebook.html?_r=1&amp;amp;oref=slogin"&gt;impossible&lt;/a&gt; to get Facebook to delete your information from their servers, &lt;span style="font-style: italic;"&gt;even if you quit using the site&lt;/span&gt;!  Facebook is not only a black hole for your time, but also for your personal data.&lt;br /&gt;&lt;br /&gt;Facebook has become the victim of its own success: phishers are &lt;a href="http://www.wired.com/politics/security/news/2008/01/facebook_phish"&gt;starting to use&lt;/a&gt; the site as a launchpad for attacks.  Phishers embed links on a user's wall that point to a malicious domain that harvests their names and passwords for Facebook.  This, in turn, can lead to more phishing attempts as well as stealing other credentials (such as banking login information) and/or spamming for pharmesuticals, etc.  Of course, no site is immune from the scrutiny of attackers, so this is hardly Facebook's fault.  As a commenter on the Wired blog puts it, "Anywhere there is popularity and potential profit, there will be hackers and scammers."  However, it is notable that criminals now see Facebook as a lucrative target.  Facebook needs to crack down on these activities if it expects users to continue to feel comfortable using it. [J]&lt;br /&gt;&lt;br /&gt;Perhaps this isn't the fault of Facebook per se, but a lot of the people on Facebook are really annoying.  You know the ones I'm talking about.  The coward who thinks that the epitome of activism is clicking a button that says "Join Group." [E]  The gullible student that believes the world will be changed by joining groups with titles like "For every [number] people that join this group, I will donate [amount] to [cause]." [F]  The narcissist that ceaselessly uploads pictures of themselves and her friends partying and broadcasts her status message to the world at least ten times a day.  The clueless folk carrying on what, prior to Facebook, would have been a private conversation on each others' walls. [G]  And people that have way too much free time giving each other gifts [H] and engaging in poke wars (or now, thanks to &lt;a title="SuperPoke" href="http://www.facebook.com/apps/application.php?id=2357179312" id="dqmt"&gt;SuperPoke&lt;/a&gt;, throwing cow wars or the like).  Facebook is often a cesspool of narcissism and ignorance that I could do without.&lt;br /&gt;&lt;br /&gt;It may come as a surprise that, despite all of these grievances, I haven't terminated my Facebook account.  It is true that I still grudgingly sign on to the service at least once a day because it provides some tangible benefits that no other service offers.  Regardless of its flaws, I haven't quit Facebook... yet.  I intend to write two follow up articles to this one, the first discussing what Facebook gets right and the second as an answer to "Why don't you write a Facebook application?"  Stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; I'm finally getting off of Facebook.  The straw the eventually broke the camel's back for me was the sheer unusability of the site.  Nearly every page load on Facebook maxes out my processor (on a decent machine).  It's not just the sheer load of crap that Facebook is bringing into each page; even the most basic user actions cause my browser to lock up.  For example, entering characters into a text box (for commenting on a photo or sending an email) has a delay of several seconds between when I hit the keys on the keyboard and when the letters show up onscreen.  These inexcusable bugs plague the site.  Congratulations, Facebook, you've finally driven me away.&lt;br /&gt;&lt;br /&gt;=========================&lt;br /&gt;&lt;br /&gt;[A]  Yes, I know you can change this in your settings.  Yes, I know that they now &lt;a title="send the contents" href="http://www.techcrunch.com/2007/12/06/facebook-messages-small-change-big-impact/" id="rbrh"&gt;send the contents&lt;/a&gt; of messages in the email as well.  Everything else, however, still gets you the same information-void kind of notification that begs you to come to Facebook if you want to find out what was actually said.&lt;br /&gt;&lt;br /&gt;[B]  I'm certainly not the first person to identify this phenomenon, by the way.  I'm not sure who, if anyone, is the right person to attribute this to.  Thoughts?&lt;br /&gt;&lt;br /&gt;[C]  And who knows what Facebook thinks "opt-in" means?  The devil is in the details: does not clicking on an "I don't want this" indicate the user wants to participate?  Zuckerberg, upon Beacon's release, already had some &lt;a title="interesting ideas" href="http://bits.blogs.nytimes.com/2007/11/30/coke-is-holding-off-on-sipping-facebooks-beacon/" id="uo.i"&gt;interesting ideas&lt;/a&gt; about what "opt-in" meant.&lt;br /&gt;&lt;br /&gt;[D]  Ed Felten provides an excellent Beacon post-mortem &lt;a title="here" href="http://www.freedom-to-tinker.com/?p=1234" id="jvkk"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[E]  Some think that the best way to protest Facebook's practices and policies is to join a group whose cause is to recognize the fact that all its members dislike a new feature.  It's not.  The best way to protest is to delete your Facebook profile.&lt;br /&gt;&lt;br /&gt;[F]  A frequent question I ponder when I see groups like this is, why do people waste their time supporting these groups if they have zero assurance that the donation/action/whatever will actually happen?&lt;br /&gt;&lt;br /&gt;[G]  I really, really don't need to know the day-to-day private details of your life.  And I REALLY don't need them broadcasted to me in my News Feed.  If you're negotiating a play date with your friend, take it off Facebook!  If you're &lt;a href="http://valleywag.com/tech/breakups/digg-users-take-revenge-on-girl-who-dumped-beau-via-facebook-330354.php"&gt;dumping your boyfriend&lt;/a&gt;, take it off Facebook!&lt;br /&gt;&lt;br /&gt;[H]  Perhaps these do serve a cause since Facebook &lt;a title="donates" href="http://blog.facebook.com/blog.php?post=2234372130" id="a6cg"&gt;donates&lt;/a&gt; $1 for most of them to charity.  But it annoys me when it is implied that there is some kind of scarcity to information, playing to misconceptions about the Internet.  Okay, pet peevey rant over.&lt;br /&gt;&lt;br /&gt;[I] In the legal sense, as well: could this practice be &lt;a href="http://blogs.law.harvard.edu/infolaw/2007/11/08/facebook-social-ads/"&gt;illegal&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;[J] It is also a testament to the cleverness of the phishers (and the nature of Facebook's users) that they are using such well-targeted bait in the text for their links: "lol i can't believe these pics got posted.... it's going to be BADDDD when her boyfriend sees these,"&lt;br /&gt;&lt;br /&gt;[K] Careful, FriendCSV's creators try to sign you up for their own social network when you use their product.  How hypocritical, offering a way out of someone else's frying pan and into their fire.&lt;br /&gt;&lt;br /&gt;===================================&lt;br /&gt;UPDATES:&lt;br /&gt;&lt;br /&gt;Facebook is sharing too much data with application developers. (&lt;a href="http://yro.slashdot.org/yro/08/02/07/1646250.shtml"&gt;Link&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Facebook, in violation of their privacy policy, is now &lt;a href="http://www.techcrunch.com/2008/11/14/the-very-curious-microsoft-facebook-user-data-relationship/"&gt;sharing your personal data with Microsoft&lt;/a&gt;.  Hm, does that have anything to do with &lt;a href="http://news.cnet.com/8301-13577_3-9803872-36.html"&gt;taking $240 million&lt;/a&gt; of their money?&lt;br /&gt;&lt;br /&gt;Facebook is arbitrarily removing applications that don't seem to be in violation of their privacy policy, a la Apple and the iPhone store.  The victim this time?  &lt;a href="http://www.techcrunch.com/2009/01/14/facebook-blows-a-whopper-of-an-opportunity/"&gt;Burger King&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Facebook may be eliminating local networks, &lt;a href="http://valleywag.gawker.com/5417145/facebooks-new-privacy-scheme-smells-like-an-anti+privacy-plot"&gt;exposing more personal data to more people&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In a rare moment of good news, Facebook has &lt;a href="http://yro.slashdot.org/story/09/12/08/223206/Facebook-Axes-Beacon-Donates-95M-To-Settle-Suit?from=rss&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29"&gt;agreed to abandon Beacon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another reason to stay off Facebook: &lt;a href="http://science.slashdot.org/story/10/03/25/1525208/Facebook-Leads-To-Increase-In-STDs-in-Britain?from=rss&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29"&gt;STDs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4824581726543403400?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4824581726543403400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4824581726543403400' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4824581726543403400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4824581726543403400'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/12/facebook-sucks.html' title='Facebook Sucks'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2506375189232125315</id><published>2007-12-04T23:46:00.000-08:00</published><updated>2009-11-02T16:41:35.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='indent'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='tidy'/><title type='text'>Code formatting</title><content type='html'>Here are some tools to make your code pretty (in Ubuntu repos):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;C -- &lt;a href="http://www.gnu.org/software/indent/"&gt;indent&lt;/a&gt;&lt;/li&gt;&lt;li&gt;HTML -- &lt;a href="http://tidy.sourceforge.net/"&gt;tidy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Python -- N/A :)&lt;/li&gt;&lt;/ul&gt;For indent, I find that the following arguments seem to work well for code I write: -bap -bbb -bl -blf -bli0 -bls -cli3 -di1 -fca -hnl -i3 -ip0 -l80 -lc80 -nbbo -nut -nsaf -nsai -nsaw -psl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2506375189232125315?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2506375189232125315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2506375189232125315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2506375189232125315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2506375189232125315'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/12/code-formatting.html' title='Code formatting'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-9737961533678877</id><published>2007-11-12T12:54:00.000-08:00</published><updated>2009-02-25T08:55:03.171-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='news feed'/><category scheme='http://www.blogger.com/atom/ns#' term='ads'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='blocking'/><title type='text'>Blocking Facebook News Feed Ads with Greasemonkey</title><content type='html'>I hate ads, so I block them.  If I want something, I'll search it out.  I don't need marketers wasting my time trying to convince me that I need something I don't.  Most of the time I have &lt;a title="ads blocked" href="http://ubuntuforums.org/showthread.php?t=110440" id="lea6"&gt;ads blocked&lt;/a&gt; by aliasing most known ad servers to 127.0.01 in &lt;span style="font-weight: bold;"&gt;/etc/hosts/&lt;/span&gt;.  This only works when the ads are coming through a server that is listed in the file (say, ad.doubleclick.net) and not when the ads embedded in the page are served from the same server from which the original page was requested.&lt;br /&gt;&lt;br /&gt;This is exactly the problem with the ads from &lt;span class="misspell" suggestions="Face book,Face-book,Casebook,Passbook,Forsook"&gt;Facebook&lt;/span&gt;, which just &lt;a title="deployed" href="http://www.pcworld.com/article/id,139385-c,webservices/article.html" id="d.tg"&gt;deployed&lt;/a&gt; a new ads system that has ads targeted on what you've listed in your profile.  For example, if you listed Jane Austen novels as some of your favorite books, you might see text ads in the sidebar or in your news feed advertising "Jane Austen: The Ultimate Sappy Romance Collection" ... or something.  So how to block these ads?&lt;br /&gt;&lt;br /&gt;&lt;a title="Greasemonkey" href="https://addons.mozilla.org/en-US/firefox/addon/748" id="ogny"&gt;&lt;span class="misspell" suggestions="Grease monkey,Grease-monkey,Gruesomeness,Gruesomeness's"&gt;Greasemonkey&lt;/span&gt;&lt;/a&gt; is a &lt;span class="misspell" suggestions="FireFox,Fire fox,Fire-fox,Firebox,Fairfax"&gt;Firefox&lt;/span&gt; (&lt;a title="and IE" href="http://www.gm4ie.com/" id="fx.r"&gt;and IE&lt;/a&gt;, although I wouldn't know much about that :-) ) extension to inject arbitrary &lt;a title="Javascript" href="http://en.wikipedia.org/wiki/JavaScript" id="q7_n"&gt;Javascript&lt;/a&gt; into web pages, meaning that you can manipulate a page, or parts of a page, automatically as you see fit.  Its behavior is defined by scripts, many of which can be found at &lt;a title="userscripts.org" href="http://userscripts.org/" id="wrsa"&gt;&lt;span class="misspell" suggestions="user scripts,user-scripts"&gt;userscripts&lt;/span&gt;.org&lt;/a&gt;.  If you're familiar with web design, you can write your own scripts quite easily.  &lt;span class="misspell" suggestions="Motive,Mozart,Mossed,Moused,Moldova"&gt;Mozdev&lt;/span&gt; has a good &lt;a title="quickstart" href="http://greasemonkey.mozdev.org/authoring.html" id="kt0z"&gt;&lt;span class="misspell" suggestions="quick start,quick-start,quickstep,quicksand,quickest"&gt;quickstart&lt;/span&gt;&lt;/a&gt; guide, and Mark Pilgrim has an online &lt;a title="guide" href="http://diveintogreasemonkey.org/" id="ot.2"&gt;guide&lt;/a&gt; and a &lt;a title="book" href="http://www.amazon.com/Greasemonkey-Hacks-Tools-Remixing-Firefox/dp/0596101651" id="smvn"&gt;book&lt;/a&gt; if you want to research this further.&lt;br /&gt;&lt;br /&gt;There are a few ways to do block &lt;span class="misspell" suggestions="Face book's,Face-book's,Casebook's,Casebooks,Passbook's"&gt;Facebook's&lt;/span&gt; new ads.  The first is using &lt;span style="font-weight: bold;"&gt;document.&lt;span class="misspell" suggestions=""&gt;getElementsByTagName&lt;/span&gt;('div')&lt;/span&gt; to fetch all the divs in the page and then loop through them, testing them for known ad-serving attributes (for example, a &lt;span style="font-weight: bold;"&gt;&lt;span class="misspell" suggestions="class Name,class-Name,classing,classroom,classiness"&gt;className&lt;/span&gt;&lt;/span&gt; like 'social_ad_advert' (sidebar) or 'feed_item &lt;span class="misspell" suggestions="clear fix,clear-fix,clerics,clergies,Colfax"&gt;clearfix&lt;/span&gt; social_ad' (news feed) or an &lt;span style="font-weight: bold;"&gt;id&lt;/span&gt; of '&lt;span class="misspell" suggestions="sponsor,sponsors,Spenser,cosponsor,spins"&gt;ssponsor&lt;/span&gt;', 'sponsor', or 'announce' (all banner ads)) [1] and then either hiding them with &lt;span style="font-weight: bold;"&gt;element.style.display = 'none'&lt;/span&gt; or removing the element entirely using &lt;span style="font-weight: bold;"&gt;element.parentNode.removeChild(element)&lt;/span&gt;.  A second is &lt;a title="using" href="http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript" id="zdun"&gt;using&lt;/a&gt; &lt;a title="XPath" href="http://en.wikipedia.org/wiki/XPath" id="blxd"&gt;&lt;span class="misspell" suggestions="Path,Spathe,Apathy,Pith,Spat"&gt;XPath&lt;/span&gt;&lt;/a&gt;, which makes for much more compact code. [2]  &lt;span class="misspell" suggestions="user scripts,user-scripts"&gt;userscripts&lt;/span&gt;.org is awash in (mostly mediocre [3]) scripts to block &lt;span class="misspell" suggestions="Face book,Face-book,Casebook,Passbook,Forsook"&gt;Facebook&lt;/span&gt; ads, but the most comprehensive one I found was &lt;a title="&amp;quot;Remove All Facebook Ads&amp;quot;" href="http://userscripts.org/scripts/review/13787" id="bm1t"&gt;"Remove All &lt;span class="misspell" suggestions="Face book,Face-book,Casebook,Passbook,Forsook"&gt;Facebook&lt;/span&gt; Ads"&lt;/a&gt; which I'm using in my browser right now.  The only suggestion I have for this script would be to use the &lt;span style="font-weight: bold;"&gt;window.&lt;span class="misspell" suggestions=""&gt;addEventListener&lt;/span&gt;&lt;/span&gt; to trigger execution of the code rather than embedding it in an anonymous function, as explained in the &lt;span class="misspell" suggestions="quick start,quick-start,quickstep,quicksand,quickest"&gt;quickstart&lt;/span&gt; guide (under "Tips").&lt;br /&gt;&lt;br /&gt;&lt;span class="misspell" suggestions="Grease monkey,Grease-monkey,Gruesomeness,Gruesomeness's"&gt;Greasemonkey&lt;/span&gt; scripts are executed after the DOM is loaded, which means that all the ads will be fetched from their sources and displayed on the page before they can be stomped out, unfortunately.  Therefore, to make the page load faster by not fetching and displaying ads in the first place, it would be wise to use an /etc/hosts blocking scheme instead of a &lt;span class="misspell" suggestions="Grease monkey,Grease-monkey,Gruesomeness,Gruesomeness's"&gt;Greasemonkey&lt;/span&gt; solution where possible.  &lt;span class="misspell" suggestions="Grease monkey,Grease-monkey,Gruesomeness,Gruesomeness's"&gt;Greasemonkey&lt;/span&gt; should be used only as a last resort in combination with /etc/hosts where /etc/hosts can't block ads that aren't fetched from a server different than the one used for the requested page, as in the case of Facebook news feed ads.&lt;br /&gt;&lt;br /&gt;[1] It would probably be faster to not test for the id matches and just using &lt;span style="font-weight: bold;"&gt;&lt;span class="misspell" suggestions=""&gt;getElementById&lt;/span&gt;&lt;/span&gt; for those few cases outside of the loop instead (within try-catch blocks if the elements aren't guaranteed to be on to page and could potentially throw an error).&lt;br /&gt;[2] I'm not sure about the efficiency implications of using one vs the other.   Anyone care to comment?&lt;br /&gt;[3] For instance, &lt;a href="http://userscripts.org/scripts/review/13767"&gt;"Hide Facebook Ads"&lt;/a&gt; tries to do some browser detection... I'm not sure how large the market for IE4 Greasemonkey users is...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Now using &lt;a href="http://userscripts.org/scripts/show/30392"&gt;New Facebook Layout Ad Killer&lt;/a&gt; for the new Facebook layout&lt;br /&gt;&lt;br /&gt;Argh, it seems Facebook has added another lame ad sidebar.  Just extend the NFLAK script by looking for a document ID called 'fadbar' and hide it if it's there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-9737961533678877?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/9737961533678877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=9737961533678877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/9737961533678877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/9737961533678877'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/11/blocking-facebook-news-feed-ads-with.html' title='Blocking Facebook News Feed Ads with Greasemonkey'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7944692094578639730</id><published>2007-10-24T01:31:00.000-07:00</published><updated>2008-04-04T23:57:10.732-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gutsy'/><category scheme='http://www.blogger.com/atom/ns#' term='7.10'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Gutsy (Ubuntu 7.10) Tweaks</title><content type='html'>Just upgraded to Gutsy from within Feisty, which took about an hour, and things look great, for the most part.  But here's a few things just to make sure everything was in tip-top shape:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To enable Compiz Fusion, System-&amp;gt;Preferences-&amp;gt;Appearance-&amp;gt;Visual Effects-&amp;gt;Extra&lt;/li&gt;&lt;li&gt;Gutsy doesn't ship with the Compiz Fusion settings manager, and I wanted my old (Beryl) settings back... run &lt;span style="font-weight: bold;"&gt;sudo apt-get install compizconfig-settings-manager&lt;/span&gt; in a terminal to install it and &lt;span style="font-weight: bold;"&gt;ccsm&lt;/span&gt; in a terminal to launch it&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Don't forget to create a new profile in &lt;span style="font-weight: bold;"&gt;Preferences&lt;/span&gt; or else you'll be screwing with the default settings&lt;/li&gt;&lt;li&gt;Personally, from the defaults I enable Rotate Cube, Paint fire, Water effect, Wobbly windows, Annotate, Splash, Cube Caps, Shift Switcher; I disable Expo; I tweak Desktop Cube (General-&amp;gt;Multi Output Mode-&amp;gt;One Big Cube) and Animations&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Fonts on my system were oddly stretched out vertically.  Here's a solution from &lt;a href="http://ubuntuforums.org/showthread.php?t=575978"&gt;this thread&lt;/a&gt;: edit the line in&lt;span style="font-weight: bold;"&gt;  /etc/gdm/gdm.conf&lt;/span&gt; that says &lt;span style="font-weight: bold;"&gt; -command=/usr/bin/X -br -audit 0&lt;/span&gt; to say &lt;span style="font-weight: bold;"&gt; -command=/usr/bin/X -br -audit 0 -dpi 96&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;The fonts still look a little screwy.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;span&gt;I'm just going to bite the bullet and install the MS core fonts ... a HOWTO is &lt;a href="http://www.debianadmin.com/install-microsoft-corewindows-truetypeubuntu-titlemacintosh-fonts-in-ubuntu.html"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Download updates automatically in the background: &lt;span style="font-weight: bold;"&gt;System&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;Administration&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;Software Sources&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;Updates&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span&gt;Download all updates in the background&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Synchronize your clock to NTP servers&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; sudo apt-get install ntp&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Autohide pannels:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Right click on a panel&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;-&amp;gt;Properties-&amp;gt;Autohide&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Set how much of a panel can be seen when it is hidden&lt;span style="font-weight: bold;"&gt;: &lt;/span&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=482285"&gt;link&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7944692094578639730?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7944692094578639730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7944692094578639730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7944692094578639730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7944692094578639730'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/10/gusty-ubuntu-710-tweaks.html' title='Gutsy (Ubuntu 7.10) Tweaks'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-190302547027011442</id><published>2007-10-23T14:09:00.000-07:00</published><updated>2011-06-27T06:28:30.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DRM'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>An Indictment of Apple, Part 1</title><content type='html'>Unless you have been in a cave for the past several years, you've probably noticed the increasing brightness of an odd, white glow that radiates wherever students, geeks or professionals congregate.  That strange luminosity is the combined brilliance of the hypnotizing and stylish logos on Apple notebooks that everyone seems to be carrying around these days.  It's no secret that Apple's hardware (and accompanying software) has been selling well recently, with its popular &lt;a title="laptops" href="http://www.macworld.com/news/2007/08/21/appleshare/index.php" id="s5et"&gt;laptops&lt;/a&gt;, &lt;a title="iPods" href="http://www.news.com/Its-all-about-the-iPod/2100-1041_3-5406519.html" id="ajke"&gt;iPods&lt;/a&gt;, &lt;a title="iPhones" href="http://money.cnn.com/2007/07/02/technology/iphone_sales/" id="j7qs"&gt;iPhones&lt;/a&gt;, etc.  Everyone I know seems to be purchasing one of Apple's shiny toys: my family, my friends, my UNIX zealot colleagues and technoignorant acquaintances alike.  The media constantly flatters Apple with positive reviews of its products, editorials praising CEO Steve Jobs' visionary genius and provides an &lt;a title="extraordinary amount" href="http://www.blogherald.com/2007/03/12/400-million-in-free-advertising-for-apples-iphone/" id="cuy:"&gt;extraordinary amount&lt;/a&gt; of marketing hype for its new products.  Could this company possibly do any wrong?&lt;br /&gt;&lt;br /&gt;The answer to that question is a resounding "Yes."  It could, it can, and it does.&lt;br /&gt;&lt;br /&gt;Apple's products have become a liability to own.  They are often ladden with restrictions, break easily, frequently can not be extended by third-party developers and are, in some cases, just a prime example of bad design.  Furthermore, it is perplexing that Apple's products continue to be so popular when superior alternatives exist.  In this article, I will focus primarily on how a top-down culture of control inherent in Apple products decreases their value.  I will address other issues in subsequent articles.&lt;br /&gt;&lt;br /&gt;Some of Apple's problems stem from its desire for the user to have an experience using its product over which it has total control.  Another way to phrase that would be that Apple wants you to lock you in to its product line, so that it can compel you to fork over your cash for the next edition of OSX or the newest personal electronic device.  It is a culture of top-down control that, on the whole, does not benefit the user.  For example, about a month ago new iPods  &lt;a title="shipped with a technical restriction" href="http://www.boingboing.net/2007/09/14/new-ipods-reengineer.html" id="r4-a"&gt;shipped with a technical restriction&lt;/a&gt; that prevented them from working with other operating systems (Fortunately, the gtkpod developers &lt;a title="broken" href="http://ipodminusitunes.blogspot.com/2007/09/weve-won.html" id="atic"&gt;broke&lt;/a&gt; the lock within days).  Basically, Apple is saying to the consumer, "In order to use our products, you need to buy even more of our products.  Otherwise, tough."  Apple is similarly inconveniencing customers with iPod's ability to pipe video output to a TV: in order to use this feature, you need to either use a device with a built-in Apple authentication chip or &lt;a title="purchase an Apple video cable" href="http://www.ilounge.com/index.php/news/comments/apple-locks-tv-out-in-new-ipods-breaks-video-add-ons/" id="zf8f"&gt;purchase an Apple video cable&lt;/a&gt; for $49.&lt;br /&gt;&lt;br /&gt;The recent tug-of-war between iPhone owners who want their pricey gadget to be as useful as possible and Apple's not-unless-we-approve attitude is an illustrative case in point.  In case you haven't been following the news, Apple made a deal with AT&amp;amp;T so that it would be the &lt;a title="exclusive carrier" href="http://www.usatoday.com/tech/wireless/2007-05-21-at&amp;amp;t-iphone_N.htm" id="x_7c"&gt;exclusive carrier&lt;/a&gt; of iPhone voice traffic for five years and built technical mechanisms into the phone to ensure this arrangement.  Naturally, customers of other carriers wanted to use the phone on the network they were already paying for, which meant they would have to hack the phone to get this functionality.  Thus, the iPhone was &lt;a title="hacked" href="http://www.engadget.com/2007/08/24/iphone-unlocked-atandt-loses-iphone-exclusivity-august-24-2007/" id="a6dd"&gt;hacked&lt;/a&gt;, &lt;a title="again" href="http://www.msnbc.msn.com/id/20424880/" id="cmg6"&gt;again&lt;/a&gt; and &lt;a title="again" href="http://www.eweek.com/article2/0,1759,2177373,00.asp" id="e327"&gt;again&lt;/a&gt;.  Apple &lt;a title="estimates" href="http://www.nytimes.com/2007/10/23/technology/23apple.html?_r=2&amp;amp;th&amp;amp;emc=th&amp;amp;oref=slogin&amp;amp;oref=slogin" id="qifa"&gt;estimates&lt;/a&gt; as many as 250,000 people, roughly one sixth of iPhone buyers, have hacked their phone.  In response, Apple released a firmware update to the phone which &lt;a title="made the unlocked phones inoperable" href="http://arstechnica.com/news.ars/post/20070924-apple-firmware-update-likely-to-make-unlocked-iphones-permanently-inoperable.html" id="pbs8"&gt;made the unlocked phones inoperable&lt;/a&gt;.  Apple's consistent attempts to prevent its customers doing what they want with Apple products are an insult to its users' intelligence and detrimental to their ultimate experience with the iPhone.  As &lt;a title="Jon Lech Johansen" href="http://en.wikipedia.org/wiki/Jon_Lech_Johansen" id="do-2"&gt;Jon Lech Johansen&lt;/a&gt; &lt;a title="puts it" href="http://nanocr.eu/2007/09/29/think-closed/" id="mp34"&gt;puts it&lt;/a&gt;, "When Steve Jobs claimed the iPhone was 5 years ahead of every other phone, was he talking about the iPhone’s revolutionary handcuffs?  In a world where open technologies are increasingly becoming the norm, Apple’s way of Thinking Different means marching in the opposite direction."&lt;br /&gt;&lt;br /&gt;Apple is hostile to not only users' interests, but developers' interests as well.  Will Shipley, a developer for the Apple platform, writes an &lt;a title="excellent post" href="http://wilshipley.com/blog/2007/09/iphone-ipod-contain-or-disengage.html" id="uky_"&gt;excellent post&lt;/a&gt; about third parties' inability to put their applications on Apple's platforms.  He explains that Apple's arrogant attitude is damaging its relationship with users and developers alike:&lt;br /&gt;&lt;blockquote&gt;And the iPhone is a closed system, like the iPods before it, so third parties can only develop software for it if they are EXTREMELY close to Apple. This is an incredibly frightening trend. As Apple gets more and more of its revenue from non-Mac devices, they are also getting more and more of their revenue from devices that simply exclude third parties...&lt;br /&gt;&lt;br /&gt;But with the iPod Touch, what's Apple's excuse for locking up the platform? Why can't I write programs for this device? Who might it hurt? Why is Steve announcing that he's playing cat-and-mouse with developers who intend to do so? Is Apple so far removed from its customers that even when the latter overwhelming votes for extending a device (by downloading iPhone programs in the hundreds of thousands), Apple's response is, "No, you can't do that. We know what you want, you don't. You want AJAX apps, you just don't know it yet."&lt;br /&gt;&lt;br /&gt;That sure reminds me of the old, crappy Apple. The one that almost went bankrupt because of its hubris.&lt;br /&gt;&lt;/blockquote&gt;When Apple disallows third parties from writing to its platforms, then everybody suffers.  The users suffer because they don't get to use the added functionality of their devices, the developers suffer since there are less opportunities to extend Apple's software and Apple suffers because less people buy their gizmos and consumer relations are soured.  Innovation often doesn't happen at the center -- it happens at the edge, and Apple does not have a monopoly on good developers or good ideas.&lt;br /&gt;&lt;br /&gt;Apple's poisonous politics don't stop at simply excluding developers from its platforms -- they permeate the very coding tools engineers use to create.  I submit to you the bizarre incidents of Apple crippling both the &lt;a href="http://blogs.sun.com/ahl/entry/mac_os_x_and_the"&gt;dtrace&lt;/a&gt; and &lt;a href="http://steike.com/code/debugging-itunes-with-gdb/"&gt;gdb&lt;/a&gt; versions on OSX.  Both programs' source contain uncommented portions of code that disallow  low-level examination of certain Apple-built programs, including iTunes.  These suspicious lines are not in any other version of these utilities on any other platform.  Why Apple did this is anyone's guess -- it seems rather stupid to try and outwit many extremely talented programmers who will inevitably discover these unpleasant surprises (as they did).  What is certain is that Apple's handicapping of OSX versions of open-source tools make Macs a less attractive purchase for developers.&lt;br /&gt;&lt;br /&gt;Now we turn to iTunes and its accompanying &lt;a title="Digital Rights Management (DRM)" href="http://en.wikipedia.org/wiki/Digital_rights_management" id="kfqh"&gt;Digital Rights Management (DRM)&lt;/a&gt;, which is quite the antithesis of Apple's &lt;a title="&amp;quot;It just works&amp;quot;" href="http://www.apple.com/getamac/" id="mfs2"&gt;"It just works"&lt;/a&gt; slogan that it uses to push its products.  iTunes has an elaborate system of "Authorization" that limits the number of computers on which one can play their music.  To play a song from another computer, you must get that computer to "authorize" yours. which requires it dialing Apple HQ to ensure that this is all right with Mr. Jobs.  If you don't happen to have a network connection at that point, you can't make this connection and thus can't play your friend's music -- tough luck.  Of course, only a total of 5 computers can be authorized per source computer, so if your friend has already authorized the limit, he'll have to de-authorize someone else (perhaps even himself, which is allowed -- revoking the right to play songs he paid for via the iTunes store on his own computer... the gall of Apple amazes me!), at which point that person who was just de -authorized will start wondering why she can't play certain songs on her computer.  What a mess.  I find it repulsive, not to mention inconvenient, that I need to ask a corporation's permission to listen to certain songs in certain ways.&lt;br /&gt;&lt;br /&gt;iTunes also has a bad habit of rolling back its already limited functionality with its frequent 'upgrades.'  iTunes 4.5 decreased the amount of CDs one can create with a single playlist from 10 to 7 and also &lt;a title="detected and blocked" href="http://www.boingboing.net/2004/04/30/apples-new-drm-reneg.html" id="w78l"&gt;detected and blocked&lt;/a&gt; similar playlists.  iTunes 4.7.1 &lt;a title="took away" href="http://www.boingboing.net/2005/03/16/apple-steals-itunes-.html" id="t_p."&gt;took away&lt;/a&gt; the previous ability to stream music to anyone on a local network.  One wonders when the march towards never being allowed to play any music anywhere will stop.  And let's not forget the insidious 'features' that Apple included in iTunes from the very beginning: the draconian measure of  &lt;a title="embedding user data into songs" href="http://lifehacker.com/software/too-good-to-be-true/-265125.php" id="mfub"&gt;embedding user data into songs&lt;/a&gt; [1] they purchased (presumably as a deterrent against file-sharing) and restricting iTunes-purchased songs to be played the iPod only to the exclusion of all other digital music devices.  [2] [3]&lt;br /&gt;&lt;br /&gt;I can already hear the Apple faithful clamoring that all of these malfunctions are not the fault of Apple, but the fault of the record companies whose music Apple licenses.  Even Steve Jobs wrote a much-cited &lt;a title="article" href="http://www.apple.com/hotnews/thoughtsonmusic/" id="u572"&gt;article&lt;/a&gt; which put the blame for DRM at the feet of the RIAA constituents.  This "They made me do it" excuse, as John Lech Johansen &lt;a title="points out" href="http://nanocrew.net/2007/01/13/ihandcuffs/" id="fd3w"&gt;points out&lt;/a&gt;, is quite lame because Apple both refuses to open up &lt;a title="FairPlay" href="http://en.wikipedia.org/wiki/FairPlay" id="ci4d"&gt;FairPlay&lt;/a&gt; (its DRM scheme) to other companies and applies DRM to songs &lt;span style="font-style: italic;"&gt;whose labels do not require their songs to be DRMed&lt;/span&gt;.  Not to mention that other online music services have managed to operate without DRM just fine.  &lt;a title="Amazon" href="http://www.amazon.com/b?ie=UTF8&amp;amp;node=163856011" id="x3rp"&gt;Amazon&lt;/a&gt; can do it, &lt;a title="Magnatune" href="http://magnatune.com/" id="znt3"&gt;Magnatune&lt;/a&gt; can do it, why not Apple?  For a very good reason: Apple profits from the lock-in that DRM provides them (see Johansen's article for some telling quotes from Apple employees).  Apple is today's main proponent and user of DRM at the same time that it makes overtures declaring its wish to end DRM once and for all.  This is pure hypocrisy.  If you hate DRM so much, Mr. Jobs, then put your money where your mouth is and take all the DRM (in its many shapes and forms) out of your products.  Apparently Apple's CEO prefers cash in his pocket to shooting straight with the public.&lt;br /&gt;&lt;br /&gt;Apple loves controlling how people use its products.  Unfortunately for Apple, users often don't like being told exactly how they are supposed to use their computer, digital music player, et al.   And people extremely dislike having unnecessary restrictions placed on products for which they paid a substantial amount.  Limiting and sometimes rolling back the functionality of a company's products (and therefore angering customers and third-party developers) is not a winning strategy in the long term.  Apple would do well to abandon it.&lt;br /&gt;&lt;br /&gt;------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Footnotes&lt;/span&gt;&lt;br /&gt;[1]  I also responded to many posts on the linked Lifehacker discussion board.  It's amazing to see how willing people are to let Apple dictate right and wrong to them.  I also &lt;a title="wrote" href="http://bulletinthehead-wakeup.blogspot.com/2007/05/apple-turning-into-law-enforcement-one.html" id="pzcw"&gt;wrote&lt;/a&gt; about this on one of my other blogs.&lt;br /&gt;[2]  Makes me all the more embarrassed that I wrote a gushing &lt;a title="article" href="http://www.thegeorgetownindependent.com/home/index.cfm?event=displayArticle&amp;amp;ustory_id=93f71b0a-bb02-4137-a64d-f3eaa1aba319&amp;amp;page=2" id="a84r"&gt;article&lt;/a&gt; about iTunes for a school magazine when it came out as a freshman in college.&lt;br /&gt;[3]  I'm not going to even go into more reasons why you shouldn't install iTunes (especially on Windows).  See &lt;a title="here" href="http://www.boingboing.net/2006/01/11/itunes-update-spies-.html" id="dtuy"&gt;iTunes spying on you&lt;/a&gt; and  &lt;a title="here" href="http://chris.pirillo.com/2007/07/30/itunes-sucks/" id="o28h"&gt;bloat and ugliness&lt;/a&gt; and &lt;a title="here" href="http://www.neuber.com/taskmanager/process/ituneshelper.exe.html" id="carm"&gt;what exactly does ituneshelper.exe do?&lt;/a&gt;.  I'm sure there's more.&lt;div&gt;-------------------&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Updates&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apple has continued its controlling ways with the iPhone App Store: they are actively restricting the applications that people can download, even after they have been released live to the public.  An application that allows one to tether a PC to an iPhone connection is an &lt;a href="http://apple.slashdot.org/article.pl?sid=08/08/02/1226212&amp;amp;from=rss"&gt;example&lt;/a&gt;.  BoxOffice is &lt;a href="http://www.techcrunch.com/2008/08/04/apple-pulls-another-innocuous-iphone-app/"&gt;another&lt;/a&gt;.  I'm sure there will be dozens more.&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.apple.com/iphone/program/"&gt;iPhone development&lt;/a&gt; is the biggest Apple money-maker I have ever seen.  To simply write programs for an iPhone and get them uploaded to the iPhone store, you have to buy three things from Apple: 1) Some kind of Apple Computer (one to two grand) 2) an iPhone (two hundred to six hundred dollars, depending on when you bought it, to say nothing of the AT&amp;amp;T connection fees which account for the majority of cost) and 3) an enterprise or standard development license ($299 and $99, respectively).  You can not develop on anything else &lt;a href="http://bytes.com/forum/thread800163.html"&gt;besides&lt;/a&gt; an Mac.   You can not develop without a license for the SDK.  With all of these restrictions, you've just put around two to three thousand dollars into Apple's pockets.&lt;/li&gt;&lt;li&gt;With regards to the iPhone App Store, Apple is no longer banning only apps that they consider unacceptable in some way (see above) but also those that contain duplicate functionality.  Not only that, but Apple has been notifying developers of their rejection with a letter that has a non-discolsure agreement on it -- according to Apple's lawyers, one can't even talk about the details of why he was rejected.&lt;/li&gt;&lt;li&gt;Here's an interesting reason to kill an iPhone app: it's using up too much bandwidth.  But that's &lt;a href="http://www.macblogz.com/2008/11/08/latest-app-store-victim-castcatcher-by-return7/"&gt;just what Apple did&lt;/a&gt; to streaming audio app CastCatcher.&lt;/li&gt;&lt;li&gt;Apple traffics in deceptive advertising.  On the company's online store, supposed 'photos' of products are actually &lt;a href="http://brej.org/blog/?p=18"&gt;hand-generated drawings&lt;/a&gt; that misrepresent certain features of the products.  Furthermore, Apple has been forced to pull an ad that &lt;a href="http://mobile.slashdot.org/article.pl?sid=08/11/27/0142221&amp;amp;from=rss"&gt;grossly exaggerated&lt;/a&gt; the browsing speed of the iPhone.&lt;/li&gt;&lt;li&gt;Taking user oppression to the next level, Apple is now arguing that jail-breaking your phone is &lt;a href="http://yro.slashdot.org/article.pl?sid=09/02/13/1722237&amp;amp;from=rss"&gt;illegal&lt;/a&gt; under the DMCA.&lt;/li&gt;&lt;li&gt;The last place you would expect DRM to be is in headphones, but alas, Apple has put &lt;a href="http://www.boingboing.net/2009/03/13/new-ipods-have-drm-o.html"&gt;DRM in its headphones&lt;/a&gt; as well (&lt;a href="http://apple.slashdot.org/article.pl?sid=09/03/16/2352215&amp;amp;from=rss"&gt;false alarm&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Apple has outlawed &lt;a href="http://www.gutenberg.org/wiki/Main_Page"&gt;Project Gutenberg&lt;/a&gt; from the iPhone because some of the books &lt;a href="http://www.boingboing.net/2009/05/22/apple-says-no-projec.html"&gt;contain pornographic material&lt;/a&gt;.  Could this get any more ridiculous?  Yes, they are now censoring a &lt;a href="http://www.techdirt.com/articles/20090805/1832305780.shtml"&gt;dictionary&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apple is working on &lt;a href="http://apple.slashdot.org/story/09/08/06/1733253/Apple-Working-On-Tech-To-Detect-Purchasers-Abuse?from=rss"&gt;technology to detect&lt;/a&gt; when a customer violates the warranty.  Essentially, your device tells Apple what you have done with it when you bring it in for repair.  Apple already has deployed liquid submersion detectors in some of its hardware.&lt;/li&gt;&lt;li&gt;Apple, not AT&amp;amp;T, &lt;a href="http://valleywag.gawker.com/5343046/a-steve-jobs-confession-a-fanboy-shock"&gt;blocked Google Voice&lt;/a&gt; on the iPhone&lt;/li&gt;&lt;li&gt;The iPhone &lt;a href="http://www.cnn.com/2011/TECH/mobile/04/20/iphone.tracking/"&gt;secretly tracks your location&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apple has joined Facebook in shutting down &lt;a href="http://www.iol.co.za/scitech/technology/software/apple-under-fire-for-pulling-intifada-app-1.1089312"&gt;Palestinian-related apps&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-190302547027011442?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/190302547027011442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=190302547027011442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/190302547027011442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/190302547027011442'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/10/indictment-of-apple-part-1.html' title='An Indictment of Apple, Part 1'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4648659975865977453</id><published>2007-10-05T15:02:00.000-07:00</published><updated>2009-06-24T15:47:01.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Making Windows XP less Painful</title><content type='html'>That is, making &lt;a title="Windows XP" href="http://en.wikipedia.org/wiki/Windows_XP" id="lrw3"&gt;Windows XP&lt;/a&gt; more like Linux.  Occasionally, I need to boot into Windows XP to use some application that won't run with &lt;a title="WINE" href="http://www.winehq.org/" id="mzal"&gt;WINE&lt;/a&gt; on Linux.  Examples include &lt;a title="QTFairUse" href="http://hymn-project.org/forums/viewtopic.php?t=1553" id="b9sq"&gt;QTFairUse&lt;/a&gt; and the drivers and software included with my &lt;a title="Nokia E70 phone" href="http://en.wikipedia.org/wiki/Nokia_E70" id="v.5y"&gt;Nokia E70 phone&lt;/a&gt;.  Whenever I need to do this, however, I feel like I'm being suffocated by the constricting, feeble Windows environment and feel like doing the same to an unlucky bystander who just happens to bear the brunt of my Windows agitation.  Fortunately, I finally sat down and figured out a few things to makeXP a bit more usable... a bit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A (Somewhat) Usable Shell&lt;/span&gt;&lt;br /&gt;The first thing I needed was a command line that wasn't dropped as a baby.  &lt;a title="Cygwin" href="http://www.cygwin.com/" id="hnfk"&gt;Cygwin&lt;/a&gt;, which provides a UNIX-like environment on top of Windows, is perfect for this (another alternative is &lt;a title="MinGW" href="http://www.mingw.org/" id="usbl"&gt;MinGW&lt;/a&gt;).  The key to setting up Cygwin is configuring what applications you want installed in one of the setup menus.  Of course, if you miss something on the initial setup, you can runCygwin's setup.exe again and reconfigure the included applications.  Cygwin mounts the Windows C drive at  &lt;b&gt;/cygdrive/c&lt;/b&gt;.  I would recommend browsing the Cygwin Properties menu and tweaking it (especially the fonts) to your preferences.  Do this by clicking on the Cygwin icon in the upper left hand corner of the window and selecting &lt;b&gt;Properties&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Cutting and pasting from Cygwin is a pain in the ass.  To copy text, click the Cygwin icon and go to &lt;b&gt;Edit-&amp;gt;Mark&lt;/b&gt;.  You now have a "Visual Block" - type selection box.  I'm not sure if it's possible to select in a line-wrapping mode, the lack of which is also annoying.  Hit Enter to copy the selected text.  To paste text into theCygwin shell, click on the icon and hit  &lt;b&gt;Edit-&lt;/b&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;b&gt;Paste&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Install Software&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="Pidgin" href="http://www.pidgin.im/" id="xoj_"&gt;Pidgin&lt;/a&gt; for instant messaging&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Firefox" href="http://www.mozilla.com/en-US/firefox/" id="gtwv"&gt;Firefox&lt;/a&gt; and &lt;a href="http://chainlynx.blogspot.com/2006/08/firefox-extentionsadd-ons.html"&gt;extensions&lt;/a&gt; (especially &lt;a href="http://chainlynx.blogspot.com/2007/03/google-toolbar-3-has-made-my-life-32.html"&gt;Google Toolbar&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a title="VLC" href="http://www.videolan.org/vlc/" id="xvi0"&gt;VLC&lt;/a&gt; for video and audio of all kinds&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/putty/download.html"&gt;Putty &lt;/a&gt;for SSH&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Block Ads on the Web&lt;/b&gt;&lt;br /&gt;Ads suck.  Block them.  Download a sample hosts file &lt;a title="here" href="http://www.mvps.org/winhelp2002/hosts.txt" id="s5tw"&gt;here&lt;/a&gt; and save it (in Notepad or something: &lt;span style="font-weight: bold;"&gt;Start-&lt;/span&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;span style="font-weight: bold;"&gt;All Programs-&lt;/span&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;span style="font-weight: bold;"&gt;Accessories-&lt;/span&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;span style="font-weight: bold;"&gt;Notepad&lt;/span&gt;) to your file system.  Now copy that file to &lt;span style="font-weight: bold;"&gt;c:\WINDOWS\system32\drivers\etc&lt;/span&gt; and name it &lt;b&gt;HOSTS.MVP&lt;/b&gt;.  If that's too much work for you, &lt;a title="this page" href="http://www.mvps.org/winhelp2002/hosts.htm" id="ln-7"&gt;this page&lt;/a&gt; provides an automated tool to do it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Add a Button to Show the Desktop&lt;/span&gt;&lt;br /&gt;It's really aggravating if, in order to use the point-and-click Windows interface, you need to close all of the currently open windows to access the Desktop where a lot of clicking occurs.  To do this, open Notepad and paste the following lines into it:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="userInput"&gt;[Shell]&lt;br /&gt;Command=2&lt;br /&gt;IconFile=explorer.exe,3&lt;br /&gt;[Taskbar]&lt;br /&gt;Command=ToggleDesktop&lt;/span&gt;&lt;/blockquote&gt; Save the file as &lt;span style="font-weight: bold;"&gt;Show Desktop.scf&lt;/span&gt;.  Right click on the task bar (that blue bar at the bottom of the screen) and select &lt;span style="font-weight: bold;"&gt;Toolbars-&lt;/span&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;span style="font-weight: bold;"&gt;Quick Launch&lt;/span&gt;.  Now drag the icon of the file you just created into the Quick Launch area.  If all goes well, hitting that icon in the Quick Launch area should hide all the windows you have open and focus the desktop (or show them if you have them hidden).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Remove Unwanted Icons from the System Tray&lt;/span&gt;&lt;br /&gt;msconfig is your friend.  Good resources are &lt;a href="http://www.pcworld.com/article/id,73163-page,1/article.html"&gt;here&lt;/a&gt; and &lt;a href="http://www.netsquirrel.com/msconfig/msconfig_xp.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Remap keys&lt;/span&gt;&lt;br /&gt;There is a pretty easy tool that allows you to &lt;a href="http://julipedia.blogspot.com/2006/06/windows-remapping-keyboard-keys.html"&gt;remap your keys&lt;/a&gt; called &lt;a href="http://www.randyrants.com/2008/12/sharpkeys_30.html"&gt;SharpKeys&lt;/a&gt;.  I'm a fan of &lt;a href="http://chainlynx.blogspot.com/2008/06/howto-swap-caps-lock-and-escape-keys-in.html"&gt;Caps Lock to Escape remapping&lt;/a&gt;, myself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Personalization&lt;/span&gt;&lt;br /&gt;I recommend some &lt;a title="BSOD" href="http://en.wikipedia.org/wiki/Blue_Screen_of_Death" id="r0:5"&gt;BSOD&lt;/a&gt; &lt;a title="wallpaper" href="http://www.google.com/images?q=bsod&amp;amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;amp;rlz=1B3GGGL_enUS203US204" id="mf2o"&gt;wallpaper&lt;/a&gt; just to remind you from time to time that you're using an inferior operating system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4648659975865977453?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4648659975865977453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4648659975865977453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4648659975865977453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4648659975865977453'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/10/making-windows-xp-less-painful.html' title='Making Windows XP less Painful'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7821488453187745712</id><published>2007-09-24T00:17:00.000-07:00</published><updated>2007-10-17T23:01:11.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e70'/><category scheme='http://www.blogger.com/atom/ns#' term='nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='s60'/><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><title type='text'>Nokia E70 for phone n00bs</title><content type='html'>I just bought the &lt;a title="Symbian" href="http://en.wikipedia.org/wiki/Symbian_OS" id="r2t."&gt;Symbian&lt;/a&gt; &lt;a title="S60" href="http://en.wikipedia.org/wiki/S60_platform" id="f.c5"&gt;S60&lt;/a&gt; v3-based &lt;a title="Nokia E70" href="http://en.wikipedia.org/wiki/Nokia_E70" id="pmgm"&gt;Nokia E70&lt;/a&gt; mobile phone based mostly on the &lt;a title="glowing recommendation" href="http://www.thebestpageintheuniverse.net/c.cgi?u=iphone" id="w.jy"&gt;glowing recommendation&lt;/a&gt; of Maddox.  Since this is my first somewhat advanced mobile phone (taking pictures on a phone is still a novelty for me), I've chronicled all of the hoops I needed to jump through here in a E70-for-dummies type guide.  In addition to this guide, of course, I would highly suggest browsing the excellent user manual that ships with the phone to navigate using its myriad features.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Phone calls&lt;/b&gt;&lt;br /&gt;I got the phone off of &lt;a title="Amazon.com" href="http://www.amazon.com/Nokia-E70-Phone-Unlocked/dp/B000JNXDBG" id="wdg-"&gt;Amazon.com&lt;/a&gt; for $385.  Since it is an &lt;a title="unlocked phone" href="http://www.wisegeek.com/what-are-unlocked-cell-phones.htm" id="i.-j"&gt;unlocked phone&lt;/a&gt;, inserting the &lt;a title="SIM card" href="http://en.wikipedia.org/wiki/Subscriber_Identity_Module" id="ew:u"&gt;SIM card&lt;/a&gt; from my previous phone (a pretty old-school Nokia ... unsure about the model number) enabled the phone calling features.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Internet Service&lt;/b&gt;&lt;br /&gt;I upgraded to the unlimited Internet service from my provider (AT&amp;amp;T) for an additional $20 a month by going into their (pitifully understaffed and crowded) store and asking for it.  Selecting the globe icon on the main screen will launch the web browser.  The web browser lacks a couple of things that you would expect to find on a regular browser, namely support for animated &lt;a title="gifs" href="http://en.wikipedia.org/wiki/GIF" id="qp:l"&gt;gifs&lt;/a&gt; and flash movies.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Firmware update&lt;/b&gt;&lt;br /&gt;Updating the &lt;a title="firmware" href="http://en.wikipedia.org/wiki/Firmware" id="q89j"&gt;firmware&lt;/a&gt; is probably the first thing you should do when you get your hands on the phone, as it will erase all stored data and potentially make previously installed applications unusable.  The updates for the US edition are available from Nokia's site &lt;a title="here" href="http://www.nokiausa.com/A4410025?E70" id="plh."&gt;here&lt;/a&gt;.  From reading &lt;a title="some" href="http://forums.cingular.com/cng/board/message?board.id=nokia&amp;amp;message.id=37535" id="xh:o"&gt;some&lt;/a&gt; &lt;a title="message" href="http://www.allaboutsymbian.com/news/item/4293_E70_owners_can_come_out_of_hid.php" id="j-q6"&gt;message&lt;/a&gt; boards, it appears that the main benefits of this update are that applications are faster and less memory-intensive.  There have been a lot of reports of the phones bricking (those posts, however, are mostly about a year old), so don't say you haven't been warned!  My phone, since I bought it recently, shipped with the newest firmware installed and I did not have to go through this step.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing applications&lt;/b&gt;&lt;br /&gt;The E70 allows you to install applications on your phone, both &lt;a title="from Nokia" href="http://www.nokiausa.com/A4410109" id="x:p3"&gt;from Nokia&lt;/a&gt; and from third parties.  Once they install, you can find it under &lt;b&gt;Menu-&gt;Installations&lt;/b&gt; (Menu is the key both in portrait and landscape mode with the blue icon and nothing else on it).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Google Maps&lt;/b&gt;&lt;br /&gt;Google provides a &lt;a title="Maps" href="http://maps.google.com/" id="ebh5"&gt;Maps&lt;/a&gt; application for Symbian-based phones.  In the E70's web browser, navigate to maps.google.com and accept the web site's offer to install the application.  One of the confusing things about the application is that the labels that tell you how to control Google Maps via the buttons on your phone do not adjust to fit landscape mode.  Press the left/bottom selection key for the menu, the middle joystick to zoom in and the top/right selection key to zoom out.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SSH&lt;/b&gt;&lt;br /&gt;There is a &lt;a title="SSH" href="http://en.wikipedia.org/wiki/Secure_Shell" id="e2od"&gt;SSH&lt;/a&gt; client called &lt;a title="Putty" href="http://s2putty.sourceforge.net/news.html" id="mhjo"&gt;Putty&lt;/a&gt; for Symbian phones.  To install it, you'll need to download the application and then install it via the Nokia PC suite, which makes installation pretty easy (on a Windows PC, that is -- Ubuntu 7.04 didn't recognize the phone as anything: camera, storage, phone, or otherwise).  You must enable self-signing applications to install themselves via the directions &lt;a title="here" href="http://s2putty.sourceforge.net/installs60v3.html" id="fiat"&gt;here&lt;/a&gt;.  Installing fonts for Putty might also make your experience with it more pleasant -- get them &lt;a title="here" href="http://www.iptel.org/jan/nokia/putty/" id="zlfj"&gt;here&lt;/a&gt;.  Unfortunately, there's often a lot of lag between when you type something and when you see the output.  Check out the options menu to send special characters (Esc comes in handy for using vi!).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YouTube&lt;/b&gt;&lt;br /&gt;YouTube has a &lt;a title="website for mobile users" href="http://m.youtube.com/warning" id="akr3"&gt;website for mobile users&lt;/a&gt; that your E70 is automatically redirected to when trying to access YouTube.  To view videos, you must first set the default access point in &lt;b&gt;Menu-&gt;Media-&gt;RealPlayer-&gt;Options-&gt;Settings-&gt;Connection-&gt;Network&lt;/b&gt; to whatever connection you want the video delivered over.  Then click away on your favorite video.  Or at least your favorite video among those offered -- YouTube only provides a limited subset of all of its videos for viewing on its mobile site ("Only a portion of YouTube videos are available on mobile at this time.  We are working hard to bring you more!").  The video quality is pretty good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Transferring Phone Numbers&lt;/span&gt;&lt;br /&gt;AT&amp;amp;T claims that they can transfer your phone numbers if you have all of your phone numbers saved to the phone's SIM card.  Apparently they have some device at the AT&amp;amp;T store that does this and they will do it for free.  I have a hard timebeliving AT&amp;amp;T (a.k.a. 'Nickel and Dimeing you for Every Minor Service to Protect our Failing Business Model') would offer anything for free, but that's what they claim.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Text Messages&lt;/span&gt;&lt;br /&gt;My phone is able to receive text messages but not send them.  This is because the phone ships without any message center specified, which means the phone has no idea where to send the messages to get them to their final destination.  To change this, go to &lt;span style="font-weight: bold;"&gt;Menu-&gt;Messages-&gt;Options-&gt;Settings-&gt;Text message-&gt;Message centers-&gt;Message center-&gt;Msg. center number &lt;/span&gt;and change that number to whatever your message center's number is (&lt;a title="reference" href="http://www.e-series.org/archives/11" id="gzka"&gt;reference&lt;/a&gt;).  Mine was &lt;span style="font-weight: bold;"&gt;+13123149810&lt;/span&gt;.  Alternatively, there are services like &lt;a title="text140" href="http://text140.com/" id="ut8u"&gt;text140&lt;/a&gt; that allow you to send text messages to a phone from a computer, but it lacks a lot of the convenience of sending a text message from your phone.  Using this message will also not charge you for sending text messages (you're just accessing the 'unlimited' Internet, right?).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AT&amp;amp;T Phone Support&lt;/span&gt;&lt;br /&gt;This is an arduous process I suspect I'll be going through a few more times, so here's what you need to do to talk to an actual person on AT&amp;amp;T phone support (thePalo Alto store can be reached at (650) 617-8931):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;1 to continue in english&lt;/li&gt;&lt;li&gt;3 for an existing customer&lt;/li&gt;&lt;li&gt;2 for all other information&lt;/li&gt;&lt;li&gt;Enter phone number in question&lt;/li&gt;&lt;li&gt;0 to speak to customer service&lt;/li&gt;&lt;li&gt;0 (again) to speak to customer service&lt;/li&gt;&lt;li&gt;2 to not participate in a survey&lt;/li&gt;&lt;/ol&gt;Incidentally, once you start talking to a person and not a machine, they have been quite helpful.  Be prepared to give the last four digits of the social security number on the account if you want to make any changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Using WLAN Access Points for Web Access&lt;/span&gt;&lt;br /&gt;I've found that using WLAN Access Points is one of the weaker features of the E70.  Connections fail for every reason, whether it be the WPA authentication screwing up, the phone dropping connections or just failing to connect to an access point that is literally a foot away.  If you can get them to work, however, they're a lot faster than the cellular network.  Use &lt;span style="font-weight: bold;"&gt;Menu-&gt;Connect-&gt;Conn. Mgr.-&gt;Availab. WLAN-&gt;Options-&gt;Define Access Point&lt;/span&gt; to put an access point that your phone can currently see into a permanent list of access points.  Use&lt;span style="font-weight: bold;"&gt; Menu-&gt;Tools-&gt;Settings-&gt;Connection-&gt;Access points&lt;/span&gt; to access this list and configure the details on each point (encryption, hidden network, SSID, etc.).  To select the connection to use upon each launch of Web, select &lt;span style="font-weight: bold;"&gt;Web-&gt;Options-&gt;Settings-&gt;Access point-&gt;Always ask&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bluetooth&lt;/span&gt;&lt;br /&gt;The Bluetooth menu can be accessed via &lt;span style="font-weight: bold;"&gt;Menu-&gt;Connect-&gt;Bluetooth&lt;/span&gt;.  To view paired devices, move the joystick to the right.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Camera&lt;/span&gt;&lt;br /&gt;The resolution on the camera is pretty bad, and the phone doesn't come with a flash, which drastically limits the utility of the camera.  Getting photos on and off the phone, however, is pretty easy since you can access the phone file system via Windows Explorer just like any other series of directories. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gmail and Google Calendar&lt;/span&gt;&lt;br /&gt;Both of these Google services provide very convenient mobile web interfaces.  Perfect for someone who already has all of their data in El Goog's dirty paws.&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" title="Python" href="http://en.wikipedia.org/wiki/Python_%28programming_language%29" id="j6nm"&gt;Python&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;br /&gt;Snakes on a phone!  Most of the documentation for S60 Python for Nokia phones is on the &lt;a title="wiki" href="http://wiki.opensource.nokia.com/projects/Python_for_S60" id="v68r"&gt;wiki&lt;/a&gt;.  To install, follow the instructions &lt;a title="here" href="http://wiki.opensource.nokia.com/projects/Installing_PyS60" id="ruxj"&gt;here&lt;/a&gt; and download the appropriate things from the &lt;a title="Sourceforge page" href="http://sourceforge.net/projects/pys60" id="w690"&gt;Sourceforge page&lt;/a&gt;.  Now you've got a Python interpreter (and more) on your phone... what to do with it?  Well, you could install a variety of &lt;a title="applications" href="http://wiki.opensource.nokia.com/projects/PyS60_applications" id="sg90"&gt;applications&lt;/a&gt;, for one.  For help, the Nokia-supported Python &lt;a title="forum" href="http://discussion.forum.nokia.com/forum/forumdisplay.php?forumid=102" id="qifp"&gt;forum&lt;/a&gt; is the definitive place for answers.  There's also an IRC channel, #pys60 on freenode.  There's some additional &lt;a title="documentation" href="http://wiki.opensource.nokia.com/projects/PyS60Documentation" id="g10x"&gt;documentation&lt;/a&gt; for developers.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Other useful things to know&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cut and paste works just like on any other PC: Ctrl+X, Ctrl+V, Ctrl+C&lt;/li&gt;&lt;li&gt;Press and hold &lt;span style="font-weight: bold;"&gt;Menu&lt;/span&gt; to get a list of running applications&lt;/li&gt;&lt;li&gt;If you're in an app and choose the "Exit" softkey (or use the task-manager shortcut above) that will actually shut down that application, and take you to whatever you were doing before. But if you press the red end (hang-up) key to jump to the home screen, (or switch to another application,) the app stays running in the background.&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="Nokia E70 United States support" href="http://www.nokiausa.com/A4410105" id="tege"&gt;Nokia E70 United States support&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Tips and Tricks for Nokia E70" href="http://www.iptel.org/config/nokia_e70" id="r2tr"&gt;Tips and Tricks for Nokia E70&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Engadget thread about tips and tricks for S60 phones" href="http://www.engadget.com/2006/02/06/series-60-tips-and-tricks/" id="fbqt"&gt;Engadget thread about tips and tricks for S60 phones&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Codes to get low-level phone information" href="http://gsmmobiletipsandtricks.blogspot.com/2007/06/nokia-e70.html" id="tv_i"&gt;Codes to get low-level phone information&lt;/a&gt; (haven't tried these myself)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7821488453187745712?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7821488453187745712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7821488453187745712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7821488453187745712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7821488453187745712'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/09/nokia-e70-for-phone-n00bs.html' title='Nokia E70 for phone n00bs'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7215315078357873516</id><published>2007-08-26T14:05:00.001-07:00</published><updated>2007-08-26T14:18:49.174-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='split'/><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><category scheme='http://www.blogger.com/atom/ns#' term='macros'/><title type='text'>VIM split windows and macros quick reference</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;b&gt;ex commands for split windows&lt;/b&gt;&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;:sp&lt;/span&gt; filename create a new split with filename   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt; :vsp&lt;/span&gt; filename create a new vertical split with filename&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;:new&lt;/span&gt; create a new split with an empty buffer&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;:vne&lt;/span&gt; create a new vertical split with an empty buffer&lt;br /&gt;&lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;:wa&lt;/span&gt; save all open files   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;:wqa &lt;/span&gt;save and quit all open files   &lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Ctrl-W related commands for split windows&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w h&lt;/span&gt; moves split to the left of current split   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w j&lt;/span&gt; moves split below the current split   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w k&lt;/span&gt; moves split above the current split   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w l&lt;/span&gt; moves split to the right of the current split   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w +&lt;/span&gt; increase the current split by one line (or, prefix this command with a number to do that many line increases)   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w -&lt;/span&gt; decrease the current split by one line (same addendum as above)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;C-w &amp;lt;&lt;/span&gt; decrease the current split width&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;C-w &amp;gt;&lt;/span&gt; increase the current split width&lt;br /&gt;&lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;C-w _&lt;/span&gt; Maximize the current split   &lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Split windows in the .vimrc &lt;/span&gt;(taken from &lt;a href="http://jmcpherson.org/windows.html" id="s3ot" title="this page"&gt;this page&lt;/a&gt; ... also see the same author's excellent &lt;a href="http://jmcpherson.org/editing.html" id="swn7" title="Efficient Editing with VIM"&gt;Efficient Editing with VIM&lt;/a&gt; )&lt;br /&gt;&lt;ul&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;map &amp;lt;C-J&amp;gt; &amp;lt;C-W&amp;gt;j&amp;lt;C-W&amp;gt;_&lt;/span&gt; " Hit C-j to move the current split down and maximize it   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;map &amp;lt;C-K&amp;gt; &amp;lt;C-W&amp;gt;k&amp;lt;C-W&amp;gt;_&lt;/span&gt; " Hit C-k to move the current split up and maximize it   &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;set wmh = 0&lt;/span&gt; " allow splits with 0 lines open   &lt;/li&gt;&lt;/ul&gt; &lt;b&gt;Macros&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;q&amp;lt;register&amp;gt;&lt;/span&gt; start recording and save the macro in the specified register (use a lowercase letter, for example)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;q (again)&lt;/span&gt; end recording&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;@&amp;lt;register&amp;gt;&lt;/span&gt; playback the macro&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7215315078357873516?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7215315078357873516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7215315078357873516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7215315078357873516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7215315078357873516'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/08/vim-split-windows-and-macros-quick.html' title='VIM split windows and macros quick reference'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1068558752721126490</id><published>2007-08-26T13:10:00.000-07:00</published><updated>2009-08-25T16:44:12.479-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><title type='text'>Screen</title><content type='html'>Screen is an awesome UNIX utility that allows you to continue running commands on a remote system even after you have logged out!  Magic!  Here is a nice "screen for dummies" &lt;a title="tutorial" href="http://jmcpherson.org/screen.html" id="g:h0"&gt;tutorial&lt;/a&gt; with some links to related sites at the bottom.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;On the command line&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;screen&lt;/span&gt; (will spew some text and then give a prompt) start a screen session&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; screen -r&lt;/span&gt; reattach to screen session&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;screen -d&lt;/span&gt; detach an attached screen session (good for logging in after network cuts out)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;span style="font-weight: bold;"&gt;Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.linuxjournal.com/article/6340"&gt;Power Sessions With Screen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.catonmat.net/blog/wp-content/plugins/wp-downloadMonitor/user_uploads/screen.cheat.sheet.txt"&gt;Screen ASCII cheat sheet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Tips&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Launch screen with an alias such as &lt;span style="font-weight: bold;"&gt;alias screen='TERM=screen screen'&lt;/span&gt; in &lt;span style="font-weight: bold;"&gt;.bashrc &lt;/span&gt;&lt;span&gt;to avoid your &lt;a href="http://ubuntuforums.org/showthread.php?t=90910"&gt;backspaces getting mangled&lt;/a&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;There is a &lt;span style="font-weight: bold;"&gt;~/.screenrc&lt;/span&gt; file with which you can customize screen&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;My .screenrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# don't mangle backspaces&lt;br /&gt;termcapinfo xtermc kD=\E[3~&lt;br /&gt;&lt;br /&gt;# no startup message&lt;br /&gt;startup_message off&lt;br /&gt;&lt;br /&gt;# set shell that launches&lt;br /&gt;shell /bin/bash&lt;br /&gt;&lt;br /&gt;# lots of scrollback&lt;br /&gt;defscrollback 10000&lt;br /&gt;&lt;br /&gt;# ignore case when searching in copy mode&lt;br /&gt;ignorecase on&lt;br /&gt;&lt;br /&gt;# make it obvious we're within screen&lt;br /&gt;hardstatus string "screen%n - %h"&lt;br /&gt;&lt;br /&gt;# vim-style bindings&lt;br /&gt;bind k focus up   # cycle to the above split&lt;br /&gt;bind j focus down # cycle to the below split&lt;br /&gt;bind l next       # cycle to the next split&lt;br /&gt;bind h prev       # cycle to the previous split&lt;br /&gt;bind n split      # create a new split&lt;br /&gt;bind ^N split     # create a new split&lt;br /&gt;bind q remove     # remove the split&lt;br /&gt;bind + resize +3  # increase split three lines&lt;br /&gt;bind - resize -3  # decrease split three lines&lt;br /&gt;bind _ resize max # maximize current split&lt;br /&gt;bind = resize =   # make all splits equal size&lt;br /&gt;bind g info       # display info on the split&lt;br /&gt;bind ^G info      # display info on the split&lt;br /&gt;&lt;br /&gt;# other (some defaults, just to remind myself they exist)&lt;br /&gt;bind Q only       # get rid of all other splits but the current one&lt;br /&gt;bind M monitor    # toggle monitoring of the current window&lt;br /&gt;bind t title      # enter a title for this shell&lt;br /&gt;bind a other      # go to most recently viewed other split&lt;br /&gt;bind \' windowlist -b # go to window list&lt;br /&gt;bind x kill       # close the current shell&lt;br /&gt;bind ^X kill      # close the current shell&lt;br /&gt;bind \\ quit      # close all shells&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1068558752721126490?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1068558752721126490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1068558752721126490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1068558752721126490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1068558752721126490'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/08/screen.html' title='Screen'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1689610107370106196</id><published>2007-08-06T13:56:00.000-07:00</published><updated>2008-01-19T15:38:30.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DEFCON'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Las Vegas'/><category scheme='http://www.blogger.com/atom/ns#' term='DEFCON 15'/><title type='text'>Things I learned at DEFCON 15</title><content type='html'>I just went to &lt;a title="DEFCON" href="http://en.wikipedia.org/wiki/DEF_CON"&gt;&lt;span class="misspell" suggestions="DEF CON,DEF-CON,DEACON,DEVON,DEFOG"&gt;DEFCON&lt;/span&gt;&lt;/a&gt; in Las Vegas for the first time this year and it was a blast.  Tons of smart people, cool hacks, great speakers, fun activities and stuff to learn.  Here's a brief summary of some of the things I picked up this past weekend (in no particular order):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Virtually any lock that you have bought can be picked, &lt;a title="easily" href="http://youtube.com/watch?v=C5fLgxqWvJQ"&gt;easily&lt;/a&gt;.  Even the (supposedly) secure &lt;span class="misspell" suggestions="Me deco,Me-deco,Medico,Medic,Deco"&gt;Medeco&lt;/span&gt; locks that they have on the white house and other high-security areas can be broken by a &lt;a title="12-year-old girl" href="http://video.security.org/jennalynn-medeco.wmv"&gt;12-year-old girl&lt;/a&gt;.  For more, see the in.security.org blog entry (by the guys that made this presentation, Marc Weber Tobias and Matt Fiddler) &lt;a title="here" href="http://www.thesidebar.org/insecurity/?p=99"&gt;here&lt;/a&gt;.  Gun locks, also, are completely trivial for a kid to break as &lt;a title="this amazing video" href="http://video.security.org/gunlock_alert/gunlock-zev.wmv"&gt;this amazing video&lt;/a&gt; proves (more on this subject: &lt;a title="blog" href="http://www.thesidebar.org/insecurity/?p=8"&gt;blog&lt;/a&gt;, &lt;a title="report" href="http://download.security.org/gunlock_2007.pdf"&gt;report&lt;/a&gt;).  Also from the talk: most hotel safes are terribly insecure.  To break those that use your credit card to open/lock them, the code of the master card that unlocks all of them in stored in memory inside the safe.  All you have to do is open the safe (legitimately) and then dump that code and write it to a card to have a "master card" for all the safes in the hotel... yikes!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="SCADA systems" href="http://en.wikipedia.org/wiki/SCADA"&gt;&lt;span class="misspell" suggestions="SC ADA,SC-ADA,SCAD,SCADS,SADA"&gt;SCADA&lt;/span&gt; systems&lt;/a&gt;, the systems that run critical infrastructure such as water treatment plants, electrical grids and nuclear power plants have an &lt;a href="http://www.physorg.com/news105533409.html"&gt;overwhelming number of vulnerabilities&lt;/a&gt;.  Scary.  Nationwide emergency alert systems also have relatively easy attack vectors (from the talk by &lt;span class="misspell" suggestions="Ganesha,Garnish,Gnash,Gaines,Gash"&gt;Ganesh&lt;/span&gt; &lt;span class="misspell" suggestions="Trajan,Dvorak,Trojan,Dragon,Dvorak's"&gt;Devarajan&lt;/span&gt;).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is always a motive for Internet crimes, just like ones off the net.  The motive for the &lt;a title="attack on the Dolphin Stadium website" href="http://blogs.zdnet.com/security/?p=15&amp;amp;tag=nl.e589"&gt;attack on the Dolphin Stadium website&lt;/a&gt; prior to the 2007 Super Bowl was particularly interesting because the attack, which was made on several other lower-profile websites, was linked to a Chinese syndicate that wanted users' World of &lt;span class="misspell" suggestions="War craft,War-craft,Aircraft,Watercraft,Craft"&gt;Warcraft&lt;/span&gt; online credentials to acquire additional &lt;span class="misspell" suggestions="Wow,Woe,Wows,Ow,Vow"&gt;WoW&lt;/span&gt; gold!  This is the first attack of its kind. (From the Internet Wars 2007 panel)&lt;/li&gt;&lt;li&gt;One interesting way of getting &lt;span class="misspell" suggestions="Malawi,Malorie,malaria,Delaware,Mallorie"&gt;malware&lt;/span&gt; on a user's computer is to set up a website and register &lt;span class="misspell" suggestions="Malawi,Malorie,malaria,Delaware,Mallorie"&gt;malware&lt;/span&gt; to be downloaded on that website as a &lt;span class="misspell" suggestions="codex,CDC,code,codger,Codee"&gt;codec&lt;/span&gt; with Microsoft.  That way, when a victim visits the attacker's site, he is prompted with a "Additional &lt;span class="misspell" suggestions="code cs,code-cs,codex,codes,codgers"&gt;codecs&lt;/span&gt; are required to display content on this page... would you like to download them?" message.  If he does, he downloads the &lt;span class="misspell" suggestions="Malawi,Malorie,malaria,Delaware,Mallorie"&gt;malware&lt;/span&gt; onto his computer. (From the Internet Wars 2007 panel)&lt;/li&gt;&lt;li&gt;If you're a NBC Dateline reporter, don't refuse a press pass and then try to brew up some sensationalist report about hackers at &lt;span class="misspell" suggestions="DEF CON,DEF-CON,DEACON,DEVON,DEFOG"&gt;DEFCON&lt;/span&gt;.  You will &lt;a title="get" href="http://arstechnica.com/news.ars/post/20070805-only-at-defcon-nbc-dateline-nailed-trying-to-nail-feds-hackers.html"&gt;get&lt;/a&gt; &lt;a title="owned" href="http://youtube.com/watch?v=nCvmkxO5hoQ"&gt;owned&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Even the &lt;a title="badges" href="http://eecue.com/log_archive/eecue-log-730-Defcon_15___Badge_Radness.html"&gt;badges&lt;/a&gt; at the conference were a hack unto themselves (&lt;a title="video" href="http://youtube.com/watch?v=rIfpauirTx0"&gt;video&lt;/a&gt;).  How cool is that?  And there is a &lt;a href="http://www.osogato.com/hacks/"&gt;rap&lt;/a&gt; about the conference, too!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you want to start up an advocacy organization, the most important thing you can do is have a paid person sitting by the phone who knows what expert to contact (and how to contact them) when called by reporters.  &lt;a title="PledgeBank" href="http://www.pledgebank.com/"&gt;&lt;span class="misspell" suggestions="Pledge Bank,Pledge-Bank,Palembang,Polycarbonate,Polyclinic"&gt;PledgeBank&lt;/span&gt;&lt;/a&gt; is a good site to help organize the effort to raise this money.  (Funny quote from the same Danny O'Brien talk: "[Imitating a typical clueless reporter that calls EFF] People will call and say, 'I heard that such-and-such technology can make &lt;span class="misspell" suggestions="some one's,some-one's,someones,Simeon's,Simone's"&gt;someone's&lt;/span&gt; penis fall off; can this be done with Ruby on Rails?' ... In this way, EFF operates as a clearinghouse for idiots")&lt;/li&gt;&lt;li&gt;&lt;a title="Sam Bowne" href="http://samsclass.info/"&gt;Sam &lt;span class="misspell" suggestions="Bone,Boone,Borne,Bowen,Boner"&gt;Bowne&lt;/span&gt;&lt;/a&gt; offers a class at San Francisco City College called "Ethical Hacking and Network Defense" ... sweet!  (He recommends &lt;a title="Hack this Site" href="http://www.hackthissite.org/"&gt;Hack this Site&lt;/a&gt; and &lt;a title="Irongeek.com" href="http://www.irongeek.com/"&gt;&lt;span class="misspell" suggestions="Iron geek,Iron-geek,Ironwork,Orange,Orangery"&gt;Irongeek&lt;/span&gt;.com&lt;/a&gt; as good references)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Brendan O'Connor gave a really good talk about the extra layer of "security" that banks are now layering onto their authentication services and how this layer improves neither the user's privacy nor his security -- in fact, it may be degrading both.  Bruce Potter similarly lambasted "Defense in Depth" for being a lame attempt at covering up bad code with extra layers of "security."&lt;/li&gt;&lt;li&gt;Bruce Potter of the &lt;a href="http://www.shmoo.com/"&gt;Shmoo Group&lt;/a&gt; gave a talk about how the dynamics of vulnerability disclosure are changing: instead of informing the vendor of the weakness in their product, hackers are often now selling information about those vulnerabilities to third parties (who may or may not have good intentions).  Potter called for a discussion on whether this was ethical and/or good for the security community.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Thomas J. Holt presented on the economics and dynamics of the &lt;span class="misspell" suggestions="Malawi,Malorie,malaria,Delaware,Mallorie"&gt;malware&lt;/span&gt; marketplace.  This market is mainly organized around forms based in Russia and Eastern Europe where sellers start forum threads advertising their product.  Moderators of the forum then test the software to see if it does what the seller says it does and then give their opinion of it on the same thread.  If the opinion is good, and the seller has a good reputation, then buyers start asking questions about the software and perhaps buy it.  The final step is the reviews of the software by the buyers which attest to the &lt;span class="misspell" suggestions="Malawi's,Malorie's,malaria's,Delaware's,Mallorie's"&gt;malware's&lt;/span&gt; quality (or lack &lt;span class="misspell" suggestions="thereof,Theron,therefor,hereof,theory"&gt;therof&lt;/span&gt;).  Some sell not only hacking tools like Pinch, Nuclear Grabber and PG Universal Grabber but the data obtained by using these hacking tools.  Some forums maintain lists of sellers who are "rippers" -- rip off artists -- and blacklist them.&lt;/li&gt;&lt;li&gt;&lt;span class="misspell" suggestions="Agents,Agent's,Argent's,Agendas,Agneta's"&gt;AgentX&lt;/span&gt; gave a whirlwind talk about "22 Things that Keep me up at Night."  Among these: "Shrinking the Gap" (based off of ideas of Thomas Barnett), low cost pervasive bandwidth, open source warfare (the terrorists are all sharing techniques -- why aren't we?), the security industrial complex (complacency = bad), homogeneity of the hacker (all white males, but starting to change -- he notes good progress at &lt;span class="misspell" suggestions="DEF CON,DEF-CON,DEACON,DEVON,DEFOG"&gt;DEFCON&lt;/span&gt; 15), why aren't you encrypting all your communications? (because the NSA is listening)&lt;/li&gt;&lt;li&gt;Mike Murray had some interesting things to say about social engineering/&lt;span class="misspell" suggestions="LP,NP,NAP,NIP,ALP"&gt;NLP&lt;/span&gt;/hypnotism.  Such as: you are four times more likely to follow a command following a non-grammatical sentence, you wouldn't do something hypnotized that you wouldn't do in the first place (such as kill a commanding officer -- study), tag questions ("won't you?" "right?") are convincing, confusion is the key!, the right tone can be categorized as "artfully vague," stories are more powerful than reasoning, questions are more powerful than statements, &lt;a href="http://en.wikipedia.org/wiki/Milton_H._Erickson"&gt;Milton Erikson&lt;/a&gt; = best hypnotist ever&lt;/li&gt;&lt;li&gt;I missed Bruce Schneier's talk, but someone posted a video of it &lt;a href="http://video.google.com/videoplay?docid=-1672905904171732325&amp;amp;q=defcon+roysac.com+schneier&amp;amp;total=1&amp;amp;start=0&amp;amp;num=10&amp;amp;so=0&amp;amp;type=search&amp;amp;plindex=0"&gt;here&lt;/a&gt;.  The whole presentation is interesting, but probably the most stimulating is his discussion of how you DON'T need an ID to fly on an airplane; you just get a little extra screening.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Other notable moments/events include the Guitar Hero contest, Brew Wars, Phreaking Challenge, Capture the Flag, Hacker Jeopardy, TCP/IP Drinking Game, Lockpicking Village, automated airgun target contest, the Wall of Sheep and the Wireless Village.  Definitely going next year!&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;Videos of all of the presentations have been posted &lt;a href="http://www.roysac.com/blog/2007/09/all-defcon-15-sessions-and-panels.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1689610107370106196?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1689610107370106196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1689610107370106196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1689610107370106196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1689610107370106196'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/08/things-i-learned-at-defcon-15.html' title='Things I learned at DEFCON 15'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5340555803779313328</id><published>2007-08-02T20:58:00.000-07:00</published><updated>2009-08-31T20:52:29.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.vimrc'/><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>My .vimrc file</title><content type='html'>Thanks to Evan Klitzke and others at Yelp; a lot of this is ripped from their .vimrc's.  All hail vim!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set modeline&lt;/span&gt;   " Respect other people's options (when a modeline is present)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set encoding=utf-8&lt;/span&gt; " Use UTF-8 (8-bit variable width Unicode)&lt;br /&gt;&lt;br /&gt;" indenting options&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set autoindent&lt;/span&gt;  " Keep the indent level when hitting Return&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set smartindent&lt;/span&gt;  " Use smart indenting (mostly useful for C/C++ files)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set cindent&lt;/span&gt;  " Don't indent Python really poorly&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set tabstop=4&lt;/span&gt;  " Make tabs appear four spaces wide (default is 8 spaces)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set shiftwidth=4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set noexpandtab &lt;/span&gt; " Use hard tabs please! Watch out for files with soft tabs&lt;br /&gt;" that don't have a modeline present, especially Python files.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set fo=tcoqan&lt;/span&gt;  " Options for formatting text (i.e. for use with gq)&lt;br /&gt;&lt;br /&gt;" UI stuff&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set showmatch&lt;/span&gt;  " Show matching parens as they come up&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set ruler&lt;/span&gt;  " Show the column number in the status bar&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set incsearch&lt;/span&gt;  " Find as you type&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set lz&lt;/span&gt;   " Don't redraw the screen in the middle of executing macros&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nohlsearch&lt;/span&gt;  " Highlighting search terms is _really_ annoying&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;behave xterm&lt;/span&gt;  " Just in case...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set wrap&lt;/span&gt;  " Display files with word wrap, but don't actually insert newlines&lt;br /&gt;" (Set by default)... so lines don't go off edge&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set lbr&lt;/span&gt;   " Wrap only at word boundaries (default is at any character)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;syntax enable&lt;/span&gt;  " Who wouldn't want syntax highlighting?&lt;br /&gt;&lt;br /&gt;" Only allow folds that are manually set&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set foldmethod=manual&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;" Make our folds look like how they were when we exited vim last time.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set viminfo=s1,&amp;lt;1024,'1024,/1024,:1024,@1024,c,f1,%,n~/.viminfo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;autocmd BufReadPost *&lt;/span&gt;&lt;br /&gt;\ if expand("&amp;lt;afile&amp;gt;:p:h") !=? $TEMP |&lt;br /&gt;\   if line("'\"") &amp;gt; 0 &amp;amp;&amp;amp; line("'\"") &amp;lt;= line("$") |&lt;br /&gt;\     exe "normal g`\"" |&lt;br /&gt;\     let b:doopenfold = 1 |&lt;br /&gt;\   endif |&lt;br /&gt;\ endif&lt;br /&gt;" Need to postpone using "zv" until after reading the modelines&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;autocmd BufWinEnter *&lt;/span&gt;&lt;br /&gt;\ if exists("b:doopenfold") |&lt;br /&gt;\   unlet b:doopenfold |&lt;br /&gt;\   exe "normal zv" |&lt;br /&gt;\ endif&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nocompatible&lt;/span&gt;            " Don't act like SysV vi&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set shell=/bin/bash&lt;/span&gt;         " Use this shell to execute commands&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;filetype plugin indent on&lt;/span&gt;   " ability to run different vimrcs on different filetypes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set autoread&lt;/span&gt;                " When a file has been detected to have been changed outside of Vim and&lt;br /&gt;              " it has not been changed inside of Vim, automatically read it again.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set mouse=a&lt;/span&gt;                 " Have mouse operate in all modes -- disable mouse by holding the shift key&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set ttyfast&lt;/span&gt;                 " Tell vim to optimize for a fast terminal; will be on by&lt;br /&gt;              " default if your $TERM is xterm or screen, but could be&lt;br /&gt;              " turned off if you use a weird terminal (e.g. 'screen-bce').&lt;br /&gt;              " Set 'nottyfast' for slow SSH connections.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set history=50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set showmode&lt;/span&gt;                    " show what mode (e.g. INSERT) you're in&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set showcmd&lt;/span&gt;                     " Show (partial) command in status line&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set backspace=indent,eol,start&lt;/span&gt;  " explicitly makes the backspace work when at the beginning of a line&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;nmap &amp;lt;C-N&amp;gt;&amp;lt;C-N&amp;gt; :set invnumber &amp;lt;CR&amp;gt;&lt;/span&gt; " Press Ctrl-N twice to toggle line numbers in the left margin&lt;br /&gt;&lt;br /&gt;"splits&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set wmh=0&lt;/span&gt; " allow splits with 0 lines open&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;map &amp;lt;C-J&amp;gt; &amp;lt;C-W&amp;gt;j&amp;lt;C-W&amp;gt;_&lt;/span&gt; " Hit C-j to move the current split down and maximize it&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;map &amp;lt;C-K&amp;gt; &amp;lt;C-W&amp;gt;k&amp;lt;C-W&amp;gt;_&lt;/span&gt; " Hit C-k to move the current split up and maximize it&lt;br /&gt;&lt;br /&gt;" cycling through tabs&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;map &amp;lt;C-H&amp;gt; &amp;lt;C-PageUp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;map &amp;lt;C-L&amp;gt; &amp;lt;C-PageDown&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;imap &amp;lt;C-H&amp;gt; &amp;lt;C-PageUp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;imap &amp;lt;C-L&amp;gt; &amp;lt;C-PageDown&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set title&lt;/span&gt;           " sets title of terminal in menubar to that of file currently being edited&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set ignorecase&lt;/span&gt;      " perform case-insensitive searches...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set smartcase&lt;/span&gt;       " ... unless there are capitalized characters in the search pattern&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set mousehide&lt;/span&gt;       " hide the mouse when editing&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set exrc&lt;/span&gt;            " eliminates the possibility of another .exrc getting confused with mine on multi-user systems&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set bg=light&lt;/span&gt;        "this almost always looks better -- take this out or set it to dark if things look funny&lt;br /&gt;&lt;br /&gt;" for common typos&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;command! Q quit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;command! W write&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;command! Wq wq&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cabbrev Set &amp;lt;c-r&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;=(getcmdtype()==':' &amp;amp;&amp;amp; getcmdpos()==1 ? 'set' : 'Set')&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;CR&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Or, say you want soft tabs instead of hard ones (see &lt;a href="http://vim.wikia.com/wiki/Converting_tabs_to_spaces"&gt;converting tabs to spaces&lt;/a&gt;):&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;set expandtab &lt;/span&gt;    "soft tabs&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set tabstop=2 &lt;/span&gt;    "set tabstops&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set shiftwidth=2&lt;/span&gt;  "set shiftwidth&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set softtabstop=2&lt;/span&gt; "delete this many spaces upon deleting soft tab&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;More stuff from Rajiv:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set directory=/var/tmp,/tmp&lt;/span&gt; " put all the backup stuff in tmp directories&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set shortmess+=A&lt;/span&gt; " no swap file complaints&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nobackup&lt;/span&gt; " don't litter directories with swap files&lt;br /&gt;&lt;br /&gt;" move across rows, not lines&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;noremap j gj &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;noremap k gk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;noremap gk k&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;noremap gj j&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set display=lastline&lt;/span&gt; " ??????????????&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;syntax sync fromstart&lt;/span&gt; " always render syntax from the beginning of the file&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;au! BufRead,BufNewFile * lcd %:p:h&lt;/span&gt; " cd into the directory of the file you're editing&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set vb t_vb=&lt;/span&gt; " no visual bell&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5340555803779313328?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5340555803779313328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5340555803779313328' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5340555803779313328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5340555803779313328'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/08/my-vimrc-file.html' title='My .vimrc file'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-1331442348653200934</id><published>2007-06-08T17:18:00.000-07:00</published><updated>2007-06-08T17:29:56.744-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wpa'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><title type='text'>Configuring WPA manually</title><content type='html'>Configuring WPA is Ubuntu is no problem if NetworkManager works flawlessly.  However, sometimes it doesn't.  Here's how to configure WPA from the command line:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get wpa supplicant &lt;span style="font-weight: bold;"&gt;sudo aptitude install wpasupplicant&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Run &lt;span style="font-weight: bold;"&gt;wpa_passphrase&lt;/span&gt; which reads stdin and outputs the PSK that you'll need&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a configuration file, say &lt;span style="font-weight: bold;"&gt;/etc/wpa_supplicant.conf&lt;/span&gt;, with the the text following this numbered list&lt;br /&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;sudo wpa_supplicant -B -D wext -i eth0 -c /etc/wpa_supplicant.conf &lt;span style="font-weight: normal;"&gt;(B for background, D for driver (wext is a generic linux driver, ipw2100 does not work), i for interface, c for path to conf file)&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;You should be connected at this point.  Run &lt;span style="font-weight: bold;"&gt;dhclient&lt;/span&gt; to request an IP address from the server.  &lt;span style="font-weight: bold;"&gt;ping&lt;/span&gt; something to make sure you can reach the outside.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;(optional) This process can be automated on startup by editing the &lt;span style="font-weight: bold;"&gt;/etc/network/interfaces&lt;/span&gt; file appropriately&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote style="font-weight: bold;"&gt;ctrl_interface=/var/run/wpa_supplicant&lt;br /&gt;&lt;br /&gt;network={&lt;br /&gt;       ssid="My Network"&lt;br /&gt;       key_mgmt=WPA-PSK&lt;br /&gt;       psk=&amp;lt;generated passphrase&amp;gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;As always, look at the man pages for more details: &lt;span style="font-weight: bold;"&gt;man&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;wpa_supplicant&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;man&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;wpa_supplicant.conf&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;man wpa_passphrase&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-1331442348653200934?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/1331442348653200934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=1331442348653200934' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1331442348653200934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/1331442348653200934'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/06/configuring-wpa-manually.html' title='Configuring WPA manually'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2728077655575423548</id><published>2007-06-03T12:55:00.000-07:00</published><updated>2007-06-03T12:59:07.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packages'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='dpkg'/><category scheme='http://www.blogger.com/atom/ns#' term='amd64'/><title type='text'>dpkg's --force-architecture option is your friend on amd64 systems</title><content type='html'>&lt;a href="http://groups.google.com/group/Google-Labs-Picasa-for-Linux/browse_thread/thread/920020e33466f2a8"&gt;For example&lt;/a&gt;, to install &lt;a href="http://picasa.google.com/linux/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;picasa&lt;/span&gt; for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;linux&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;sudo&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;dpkg&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; --force-architecture -i &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;picasa&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;*.deb &lt;/span&gt;(-i for install)&lt;br /&gt;&lt;br /&gt;If you don't do this, you'll get a warning about the package being i386-based and therefore unusable on your system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2728077655575423548?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2728077655575423548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2728077655575423548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2728077655575423548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2728077655575423548'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/06/dpkgs-force-architecture-option-is-your.html' title='dpkg&apos;s --force-architecture option is your friend on amd64 systems'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8874097145119787368</id><published>2007-05-27T12:26:00.000-07:00</published><updated>2007-05-27T12:30:01.709-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hard disk'/><category scheme='http://www.blogger.com/atom/ns#' term='fat32'/><category scheme='http://www.blogger.com/atom/ns#' term='ext3'/><title type='text'>HOWTO format and mount an external hard disk</title><content type='html'>When I initially tried to back up my music library onto my Windows-created &lt;a title="FAT32" href="http://en.wikipedia.org/wiki/Fat32"&gt;FAT32&lt;/a&gt; external hard drive, the terminal threw a bunch of "Invalid argument" errors and failed to copy those respective files.  &lt;a title="It turns out" href="https://lists.ubuntu.com/archives/ubuntu-users/2007-May/115345.html"&gt;It turns out&lt;/a&gt; that windows-formatted drives can not have certain characters in their filenames ( \ / : * ? &lt; &gt; | ), so I decided to reformat the drive in a Linux-friendly fashion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instructions&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Connect the target drive to your computer (let's assume it's recognized as /dev/sdb1)&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Reformat it using the &lt;a title="ext3" href="http://en.wikipedia.org/wiki/Ext3"&gt;ext3&lt;/a&gt; file system (Linux default) by either...&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sudo mkfs.ext3 /dev/sdb1 &lt;/span&gt;(lots of options with this tool... read the &lt;a title="manpage" href="http://www.die.net/doc/linux/man/man8/mkfs.ext3.8.html"&gt;manpage&lt;/a&gt; )&lt;br /&gt;    &lt;/li&gt;&lt;li&gt;Using &lt;a title="gparted" href="http://gparted.sourceforge.net/"&gt;gparted&lt;/a&gt; (install with &lt;span style="font-weight: bold;"&gt;sudo aptitude install gparted&lt;/span&gt;), a GUI-based tool&lt;br /&gt;    &lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Create a mount point &lt;span style="font-weight: bold;"&gt;sudo mkdir /external&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Mount the drive &lt;span style="font-weight: bold;"&gt;sudo mount /dev/sdb1 /external&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Use the drive!&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/li&gt;&lt;li&gt;(optional) If you want the drive to be recognized in a certain way upon boot, edit the &lt;span style="font-weight: bold;"&gt;/etc/fstab&lt;/span&gt; file to your liking (Ubuntu 7.04 recognizes it anways)&lt;/li&gt;&lt;li&gt;(optional) To unmount the drive &lt;span style="font-weight: bold;"&gt;sudo umount /dev/sdb1&lt;/span&gt;&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;  &lt;span style="font-weight: bold;"&gt;Useful commands&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sudo fdisk -l&lt;/span&gt; List partition tables for all devices (mounted or not)&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;df -h &lt;/span&gt;Human-readable output of system disk space and usage&lt;br /&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;span style="font-weight: bold;"&gt;Tips&lt;/span&gt;&lt;br /&gt;hd* = IDE drive&lt;br /&gt;sd* = SATA drive&lt;br /&gt;&lt;br /&gt;Information used &lt;a title="from" href="http://www.cyberciti.biz/faq/howto-format-create-linux-filesystem/"&gt;from&lt;/a&gt; &lt;a title="these" href="http://ubuntuforums.org/showthread.php?t=413118"&gt;these&lt;/a&gt; &lt;a title="sources" href="http://www.yourdevconnection.com/dev-tutorials/partition-format-and-mount-a-secondary-hard-drive-in-linux.html"&gt;sources&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8874097145119787368?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8874097145119787368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8874097145119787368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8874097145119787368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8874097145119787368'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/05/howto-format-and-mount-external-hard.html' title='HOWTO format and mount an external hard disk'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8975928518562998676</id><published>2007-05-26T21:15:00.000-07:00</published><updated>2009-12-13T11:59:22.476-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amarok'/><category scheme='http://www.blogger.com/atom/ns#' term='soundconverter'/><category scheme='http://www.blogger.com/atom/ns#' term='m4a'/><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='musicbrainz'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='format conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='picard'/><title type='text'>HOWTO organize a music library of 10,000 songs</title><content type='html'>Several days ago, I set out on an epic quest to organize my music library of roughly 10,000 songs.  It's a daunting task, and one I've put off for a while, because my files are in several different places in several different formats with several different ID3 tag/naming standards.  And there are more problems too: identifying mislabeled files I got from other places, weeding out corrupted files, etc, etc etc.  Suffice it to say that it's been an intense few days with me in a zen-like state of focus trying to get everything in its right place.  So here's the short version of how I did it.&lt;br /&gt;&lt;br /&gt;The first (major) problem I faced was the massive swaths of files that had incorrect ID3 tags.  For this problem I needed a competent ID3 tagger.  About a year ago I &lt;a title="asked on ubuntu-users" href="http://www.archivum.info/ubuntu-users@lists.ubuntu.com/2006-08/msg02708.html"&gt;asked on ubuntu-users&lt;/a&gt; what the list's tool of choice was.  Suggestions ranged from &lt;a title="Quod Libet" href="http://www.sacredchao.net/quodlibet/wiki/Development/Mutagen"&gt;Quod Libet&lt;/a&gt; to &lt;a title="Foobar2000" href="http://www.foobar2000.org/"&gt;Foobar2000&lt;/a&gt; on &lt;a title="WINE" href="http://www.winehq.org/"&gt;WINE&lt;/a&gt; (outstanding reviews: "best program ever" and "the only program i miss since switching to ubuntu") to &lt;a title="gtkpod" href="http://www.gtkpod.org/about.html"&gt;gtkpod&lt;/a&gt; to &lt;a title="EasyTag" href="http://easytag.sourceforge.net/"&gt;EasyTag&lt;/a&gt; (mixed reviews: "tolerable" to "great") to &lt;a title="id3v2" href="http://sourceforge.net/projects/id3v2/"&gt;id3v2&lt;/a&gt; (command line based) to normal music players like &lt;a title="amarok" href="http://amarok.kde.org/"&gt;amarok&lt;/a&gt; and &lt;a title="banshee" href="http://banshee-project.org/Main_Page"&gt;banshee&lt;/a&gt;.  There is also a &lt;a title="Python module" href="http://id3-py.sourceforge.net/"&gt;Python module&lt;/a&gt; for accessing and editing ID3 tags, if I felt like scripting some things myself.&lt;br /&gt;&lt;br /&gt;Eventually I settled on &lt;a title="Picard" href="http://musicbrainz.org/doc/PicardTagger"&gt;Picard&lt;/a&gt;,  the tagger that &lt;a title="Musicbrainz" href="http://musicbrainz.org/"&gt;Musicbrainz&lt;/a&gt; (a great music metadata site) recommends.  Thanks to Ubuntu and the Picard team, installation is as simple as adding &lt;span style="font-weight: bold;"&gt;deb http://ftp.musicbrainz.org/pub/musicbrainz/users/luks/ubuntu edgy musicbrainz&lt;/span&gt; to /etc/apt/sources.list (even if you're not running edgy), importing the PGP key with &lt;span style="font-weight: bold;"&gt;wget http://ftp.musicbrainz.org/pub/musicbrainz/users/luks/public.key -O- | sudo apt-key add -&lt;/span&gt; and then a &lt;span style="font-weight: bold;"&gt;sudo aptitude update&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;sudo aptitude install picard&lt;/span&gt;.  There are only a few &lt;a title="limited operations" href="http://musicbrainz.org/doc/HowToTagFilesWithPicard"&gt;limited operations&lt;/a&gt; Picard can perform, but they are very powerful.  Picard interacts with the Musicbranz database to identify tracks in an album-based scheme.  It correctly identified and summarily tagged more than 95% of the CDs I threw at it, and I listen to some pretty obscure/out there music.  The ones it couldn't recognize were mostly tracks that didn't have a lot of existing context to go with them, and although I don't know exactly what information Picard looks at to determine the ID3 tags, I suspect that was the problem.  There are a few problems with Picard, however.  First of all, the UI sucks.  Second, there are very limited capabilities.  I would like to see, say, options that move files around on the file system depending upon how Picard tags (or fails to tag) them.  The albums that have their ID3 tags written by Picard don't seem to be organized in any meaningful way, except in the current running instance of the program, where they are added to the bottom of the list (which is also annoying because of the need to keep scrolling to the top to add files to tag and then to the bottom to click and drag the files it missed and back again).  Increased automation in the program would be nice, too, as I found myself performing the same operations over and over again.  There are also minor issues like it opening up a new browser tab on each database lookup (leading me to have firefox open with ~100 or more tabs at some points).  Fortunately for the future Picard user,  I saw most of these issued acknowledged and marked for future improvement in the &lt;a title="documentation" href="http://musicbrainz.org/doc/PicardDocumentation#head-ded444f5b8831342130eb689892664360d2bd25b"&gt;documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The second (major) task ahead of me was conversion of all of my files into the near-universal &lt;a title="mp3" href="http://en.wikipedia.org/wiki/MP3"&gt;mp3&lt;/a&gt; format (yes, I know I should be gunning for &lt;a title="ogg" href="http://en.wikipedia.org/wiki/Vorbis"&gt;ogg&lt;/a&gt;, but you can't use those files on your iPod... well, without the free &lt;a title="firmware" href="http://en.wikipedia.org/wiki/Rockbox"&gt;firmware&lt;/a&gt; you can load onto it... another day, another day).  For &lt;a title="m4a" href="http://en.wikipedia.org/wiki/M4a"&gt;m4a&lt;/a&gt; files, I used the script found at the end of &lt;a title="this thread" href="http://www.linuxquestions.org/questions/showthread.php?t=170553"&gt;this thread&lt;/a&gt; which happily copied my ID3 tags as well.  For ogg files, I would need something more general.  At first glance, &lt;a title="SoX" href="http://sox.sourceforge.net/"&gt;SoX&lt;/a&gt; seemed like a reasonable tool, but it needs to be recompiled for mp3 support.  I also found some other &lt;a title="scripts" href="http://www.linux.hr/modules/phpwiki/index.php/Konverzija%20izme%F0u%20razli%E8itih%20audio%20formata"&gt;scripts&lt;/a&gt;, but those didn't copy the ID3 tags, which made them unacceptable for my purposes.  I asked in the &lt;a title="freenode" href="http://en.wikipedia.org/wiki/Freenode"&gt;freenode&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;#ubuntu&lt;/span&gt; channel regarding my quandary, and someone mentioned Soundconverter as an option.&lt;br /&gt;&lt;br /&gt;&lt;a title="Soundconverter" href="http://soundconverter.berlios.de/"&gt;Soundconverter&lt;/a&gt; is a simple tool, but gets the job done.  I installed it with a simple &lt;span style="font-weight: bold;"&gt;sudo aptitude install soundconverter&lt;/span&gt;.  It provides a nice drag-and-drop interface that doesn't require knowledge of ID3 tag layouts or encoding/decoding details.  Most of the options are located in the&lt;span style="font-weight: bold;"&gt; Edit-&gt;Preferences&lt;/span&gt; menu; the rest of the program is idiot-proof.  Just drag the files, and hit &lt;span style="font-weight: bold;"&gt;Convert&lt;/span&gt;.  It does do some annoying things, like saving files in &lt;a title="URL-encoded" href="http://en.wikipedia.org/wiki/Percent-encoding"&gt;URL-encoded&lt;/a&gt; names (example: files in folder "Cannibal Corpse" with the option to save in the same folder on were saved in a newly created folder, "Cannibal%20Corpse"), but generally works well.&lt;br /&gt;&lt;br /&gt;Things were a bit more complicated than this, of course.  I was making nightly backups of my changes to a local FTP server, wrote up some Python scripts to assist me in my task of keeping track of where everything was going and manually edited some outlying tags in amarok -- but now my music library is (almost) officially organized.  Success!  Now to just incorporate all of my friends' libraries...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some cool links I found along the way&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="Music File Processing on Linux" href="http://stommel.tamu.edu/%7Ebaum/linux-music.html"&gt;Music File Processing on Linux&lt;/a&gt; describes command-line techniques for some tasks and gives an overview of available software&lt;/li&gt;&lt;li&gt;&lt;a title="MP3 Encoders Comparison" href="http://members.tripod.com/Milaa/mp3Comparison/links.html"&gt;MP3 Encoders Comparison&lt;/a&gt; &lt;/li&gt;&lt;li&gt;My previous post on &lt;a title="file extensions, compression, and conversion" href="http://chainlynx.blogspot.com/2006/08/file-extentions-compression-and.html"&gt;file extensions, compression, and conversion&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Some relevant command line tricks&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;find -type f ! -iregex '\(.*.flac\|.*.ogg\|.*.m4a\|.*.mp3\)' -delete -or -empty -delete&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8975928518562998676?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8975928518562998676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8975928518562998676' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8975928518562998676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8975928518562998676'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/05/how-to-organize-music-library-of-10000.html' title='HOWTO organize a music library of 10,000 songs'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-7826108041649573786</id><published>2007-04-20T12:37:00.000-07:00</published><updated>2008-04-27T11:56:07.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='alt'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Feisty Fawn customization</title><content type='html'>Here are the things I did after I installed Feisty Fawn Ubuntu 7.04 off of the alternate install CD on my Compaq X1000 laptop/other systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If on an AMD64 processor system&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Follow &lt;a href="http://ubuntuforums.org/showthread.php?t=202537"&gt;these instructions&lt;/a&gt; (and run the script) to get mplayer, flash and java support for firefox.  Update all launchers and shortcuts to launch &lt;span style="font-weight: bold;"&gt;firefox32&lt;/span&gt; instead of &lt;span style="font-weight: bold;"&gt;firefox&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Skip the remaining instructions that are &lt;span style="font-style: italic;"&gt;italicized&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Install add-on packages &lt;/span&gt;(by the way, all except the first can be done in one command... just append all the packages you want to install after "install")&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Edit &lt;span style="font-weight: bold;"&gt;/etc/apt/sources.list&lt;/span&gt; following &lt;a href="http://ubuntuguide.org/wiki/Ubuntu:Feisty#How_to_add_extra_repositories"&gt;these instructions&lt;/a&gt; to add extra repositories&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install full Vim support (without this, no help, syntax highlighting, etc.) &lt;span style="font-weight: bold;"&gt;sudo aptitude install vim-full&lt;/span&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;Install Flash &lt;span style="font-weight: bold;"&gt;sudo aptitude install flashplugin-nonfree&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Install media codecs &lt;span style="font-weight: bold;"&gt;sudo aptitude install gstreamer0.10-ffmpeg gstreamer0.10-gl gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse w32codecs&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Install Amarok &lt;span style="font-weight: bold;"&gt;sudo aptitude install amarok&lt;/span&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;Install Java&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;sudo aptitude install sun-java6-jre sun-java6-plugin sun-java6-fonts&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Install Azureus&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; sudo aptitude install azureus &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;(or, alternatively, &lt;span style="font-weight: bold;"&gt;ktorrent&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://ubuntuguide.org/wiki/Ubuntu:Feisty#How_to_play_DVD.27s"&gt;Enable DVD support&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Possible user programs: xmms, xchat, mplayer plugin, vlc, skype, picasa, eclipse, google earth, beagle, clipboard manager&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Security programs: &lt;span style="font-weight: bold;"&gt;sudo aptitude install nmap kismet wireshark airsnort aircrack-ng john&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Install Beryl (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://ubuntuguide.org/wiki/Ubuntu:Feisty#How_to_install_Beryl_.28Nvidia.29"&gt;nVidia&lt;/a&gt;) (I also find it convinient to add a sessions entry for &lt;span style="font-weight: bold;"&gt;beryl-manager&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;so the stone shows up in the tray)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Trick out Firefox&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add &lt;a href="http://chainlynx.blogspot.com/2006/08/firefox-extentionsadd-ons.html"&gt;desirable extensions&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://chainlynx.blogspot.com/2007/03/google-toolbar-3-has-made-my-life-32.html"&gt;Customize&lt;/a&gt; Google toolbar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit &lt;span style="font-weight: bold;"&gt;/etc/hosts&lt;/span&gt; to &lt;a href="http://ubuntuforums.org/showthread.php?t=110440"&gt;block ads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://ubuntuguide.org/wiki/Ubuntu:Feisty#How_to_install_multimedia_plug-ins_for_Firefox"&gt;Install multimedia plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Change default colors &lt;span style="font-weight: bold;"&gt;Edit-&amp;gt;Preferences-&amp;gt;Content-&amp;gt;Colors&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Set a master password&lt;span style="font-weight: bold;"&gt; Edit-&amp;gt;Preferences-&amp;gt;Security-&amp;gt;Use a master password&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Trick out the Terminal (and partners in crime)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Either create a new profile or edit the current profile&lt;/li&gt;&lt;li&gt;Disable &lt;span style="font-weight: bold;"&gt;General-&gt;Show menubar by default in new terminals&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Set &lt;span style="font-weight: bold;"&gt;Colors&lt;/span&gt; to aesthetically pleasing values&lt;/li&gt;&lt;li&gt;Set &lt;span style="font-weight: bold;"&gt;Effects-&gt;Transparent background&lt;/span&gt; and set the bar about 2/3 of the way to Maximum&lt;/li&gt;&lt;li&gt;Set &lt;span style="font-weight: bold;"&gt;Scrolling-&gt;Scrollback&lt;/span&gt; to 2000 lines&lt;/li&gt;&lt;li&gt;Edit &lt;a href="http://chainlynx.blogspot.com/2007/04/my-bashrc-file.html"&gt;~/.bashrc&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit &lt;a href="http://chainlynx.blogspot.com/2007/08/my-vimrc-file.html"&gt;~/.vimrc&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Put the line &lt;span style="font-weight: bold;"&gt;set editing-mode vi&lt;/span&gt; in &lt;span style="font-weight: bold;"&gt;~/.inputrc&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; (the configuration file for &lt;a href="http://tiswww.case.edu/php/chet/readline/rltop.html"&gt;readline&lt;/a&gt;... this also makes the set -o vi in the .bashrc redundant)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Trick out GNOME&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.pcworld.com/article/id,130923-page,1-c,linux/article.html"&gt;Fix the Right Alt key&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Keyboard-&gt;Layout Options-&gt;Third level choosers-&gt;Press Menu Key to Choose 3rd Level&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Change the Desktop Background by right clicking on it (good backgrounds &lt;a href="http://www.winmatrix.com/forums/index.php?showtopic=4326"&gt;here&lt;/a&gt; (OSX Tiger) and &lt;a href="http://gentoo-wiki.com/TIP_GIMP_Fractal_Backgrounds"&gt;here&lt;/a&gt; (fractals) and at &lt;a href="http://browse.deviantart.com/customization/wallpaper/"&gt;DeviantArt&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Map the Windows keys to do something cool in &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Keyboard Shortcuts &lt;/span&gt;(I think "Run a terminal" and "Hide all windows and focus desktop" are good candidates)&lt;/li&gt;&lt;li&gt;Enable visual system beep &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Sound-&gt;System Beep-&gt;Flash Window Titlebar&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Make the panels transparent &lt;span style="font-weight: bold;"&gt;Right Click on Panel-&gt;Properties-&gt;Background-&gt;Solid Color&lt;/span&gt; and adjust the slider appropriately (about halfway looks good)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Add the system monitor to the panel &lt;span style="font-weight: bold;"&gt;Right Click on Panel-&gt;Add to Panel-&gt;System &amp;amp; Hardware-&gt;System Monitor-&gt;Add to Panel&lt;/span&gt; (I enable all but "Load"... wtf is load?)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Disable launching of unnecessary programs at startup &lt;/span&gt;&lt;span&gt;(such as Evolution Alarm Notifier)&lt;/span&gt;&lt;span&gt; &lt;span style="font-weight: bold;"&gt;Preferences-&gt;Sessions-&gt;Startup Programs&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Save your session in a desireable state: &lt;span style="font-weight: bold;"&gt;gnome-session-save &lt;/span&gt;(don't use the automatic option in Prefs-&gt;Sessions... it causes problems!)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Put the panels in a desirable place by dragging them across the screen&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Get 4 workspaces &lt;span style="font-weight: bold;"&gt;Right Click on Workspaces on Panel-&gt;Preferences-&gt;Number of Workspaces&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Disable Rhythmbox launching upon iPod detection (Amarok rulez!) &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Removable Drives and Media-&gt;Multimedia-&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Uncheck&lt;/span&gt; "Play Music Files when Connected" &lt;/span&gt;&lt;span&gt;and also &lt;span style="font-weight: bold;"&gt;Uncheck Storage-&gt;"Browse removable media when inserted"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Enable the text-based location bar in Nautilus (in favor of the button-based one) by hitting the notepad button on the top left in a &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Nautilus window&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;If on a laptop...&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://allhuda.blogspot.com/2007/04/ease-of-wpa-in-ubuntu-feisty-fawn.html"&gt;Configure Wireless Networks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;In &lt;span style="font-weight: bold;"&gt;/etc/default/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;acpi&lt;/span&gt;-support&lt;/span&gt; set &lt;span style="font-weight: bold;"&gt;ENABLE_LAPTOP_MODE=true&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;So what's so different about Feisty (as opposed to Edgy)?&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;All the latest stable versions of software in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;repos&lt;/span&gt;, obviously&lt;/li&gt;&lt;li&gt;GNOME network manager manages wireless devices by default (and keyring support to boot)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fool-proof support for installing restricted drivers, media &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;codecs&lt;/span&gt;, etc.&lt;/li&gt;&lt;li&gt;Nice command line assistance if you try and run software that's not installed (prints a "use this repository and this command to get the software"-type message)&lt;/li&gt;&lt;li&gt;Easy enabling of "Desktop Effects"&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ubuntu.com/getubuntu/releasenotes/704tour"&gt;And more&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-7826108041649573786?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/7826108041649573786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=7826108041649573786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7826108041649573786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/7826108041649573786'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/fix-right-alt-key-on-ubuntu.html' title='Feisty Fawn customization'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3884509451632261957</id><published>2007-04-19T22:32:00.000-07:00</published><updated>2007-04-19T22:37:30.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amarok'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>iPod + Amarok</title><content type='html'>Using your iPod with Ubuntu is disgustingly easy.  As a Linux user, I was almost disappointed... no config files to edit?  No dependencies to chase down?  No bugs to fix?  Nope, Ubuntu and the Amarok music player make everything simple.  Here, I will detail how to use Amarok with your iPod on an Ubuntu system.  I'm using Ubuntu Feisty Fawn 7.04 (just installed today!), a &lt;a style="font-family: Verdana;" title="fourth-generation iPod" href="http://www.osxfaq.com/radio/10-2004/ipod.jpg"&gt;fourth-generation iPod&lt;/a&gt;&lt;span style="font-family:Verdana;"&gt; and Amarok version 1.4.5.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;First install Amarok with &lt;/span&gt;&lt;span style="font-weight: bold;font-family:Verdana;" &gt;sudo aptitude install amarok&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt; (&lt;/span&gt;&lt;a style="font-family: Verdana;" title="and with aptitude, not apt-get" href="http://ubuntuforums.org/showthread.php?t=350350"&gt;and with aptitude, not apt-get&lt;/a&gt;&lt;span style="font-family:Verdana;"&gt;).  If you want Amarok to be useful with most file formats (such as mp3) it would be a good idea to install proprietary codecs as well: &lt;span style="font-weight: bold;"&gt;sudo aptitude install gstreamer0.10-ffmpeg gstreamer0.10-gl gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse libxine-extracodecs w32codecs  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that those monster installs are finished, you can go ahead and connect your iPod.  If it automatically  shows up on your desktop as a little iPod icon, great!  If not, check out &lt;/span&gt;&lt;a title="this thread" href="http://ubuntuforums.org/showthread.php?t=103071"&gt;this thread&lt;/a&gt;&lt;span style="font-family:Verdana;"&gt; for more detailed info.  When I popped in my iPod, Amarok did me one better and recognized the device, popping up a little dialog asking me what kind of player it was.  When this happens, you should select &lt;span style="font-weight: bold;"&gt;Apple iPod Media Device &lt;/span&gt;in the drop-down box.&lt;/span&gt;  There are a few more options you can set regarding the device -- check out &lt;span style="font-weight: bold;"&gt;Settings-&gt;Configure Amarok-&gt;Media Devices&lt;/span&gt; in the Amarok toolbar menu.  (If this explanation was too complicated for you, there's a guide with &lt;a title="nice pictures here" href="http://www.debianadmin.com/install-amarok-144-music-player-in-ubuntu-edgy.html"&gt;nice pictures here&lt;/a&gt; describing a slightly different way of going about things.)&lt;br /&gt;&lt;br /&gt;To add files to the iPod, go to the &lt;span style="font-weight: bold;"&gt;Collection&lt;/span&gt; tab on the left and highlight whatever you want to transfer to the iPod in the left frame.  Right click on it and select &lt;span style="font-weight: bold;"&gt;Transfer to Media Device&lt;/span&gt;.  Then go to the &lt;span style="font-weight: bold;"&gt;Devices&lt;/span&gt; tab (with the little iPod logo) and hit &lt;span style="font-weight: bold;"&gt;Transfer&lt;/span&gt; at the top to transfer your files.  When you're done transferring files, hit &lt;span style="font-weight: bold;"&gt;Disconnect &lt;/span&gt;at the top.  If you're lucky, Amarok will unmount the device for you.  If not, you'll have to right click on the desktop icon of the iPod and unmount it that way.  I asked in the Amarok IRC channel if it was possible to sync the iPod and apparently it's not... for now, just delete everything off of the iPod and put the new stuff back on, as time consuming as that may be.&lt;br /&gt;&lt;br /&gt;There are some other things you can do in Amarok to tweak the settings for the iPod.  In the &lt;span style="font-weight: bold;"&gt;Devices&lt;/span&gt; tab under the (usually hidden) &lt;span style="font-weight: bold;"&gt;iPod &lt;/span&gt;menu you can set the model of your iPod.  This is used for advanced support such as photo and video copying.&lt;br /&gt;&lt;br /&gt;It's annoying that Rhythmbox, the default GNOME music application, launches whenever you connect your iPod.  To disable this, go to &lt;span style="font-weight: bold;"&gt;Preferences-&gt;Removable Drives and Media-&gt;Multimedia-&gt;Portable Music Players&lt;/span&gt; and disable &lt;span style="font-weight: bold;"&gt;Play music files when connected&lt;/span&gt;.  Just doing this will make a window open up in Nautilus every time you insert a removable drive, including an iPod.  To turn this off, go to the &lt;span style="font-weight: bold;"&gt;Storage &lt;/span&gt;tab and uncheck &lt;span style="font-weight: bold;"&gt;Browse removable media when inserted&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="Amarok" href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Amarok Wiki: Considerations common to all devices" href="http://amarok.kde.org/wiki/Media_Device:Considerations"&gt;Amarok Wiki: Considerations common to all devices&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Amarok Wiki: iPod page" href="http://amarok.kde.org/wiki/Media_Device:IPod"&gt;Amarok Wiki: iPod page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Post about &amp;quot;Read-only file system&amp;quot; problem if iPod is formatted on a Mac" href="http://simplyubuntu.wordpress.com/2006/07/29/ubupod/"&gt;Post about "Read-only file system" problem if iPod is formatted on a Mac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="iPod specs" href="http://www.apple.com/ipod/specs.html"&gt;iPod specs&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3884509451632261957?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3884509451632261957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3884509451632261957' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3884509451632261957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3884509451632261957'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/ipod-amarok.html' title='iPod + Amarok'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2996016420237723574</id><published>2007-04-06T21:24:00.000-07:00</published><updated>2007-04-14T21:40:15.432-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.vimrc'/><category scheme='http://www.blogger.com/atom/ns#' term='vi'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='.exrc'/><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>My .exrc file (vi/m) and then some</title><content type='html'>&lt;span&gt;What follows is my &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.exrc&lt;/span&gt;&lt;span&gt; file for various versions of vi, and some more related stuff.  I have yet to look through the &lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt; documentation exhasutively to see if there are any more useful options -- this is just stuff I have gleaned from random places on the Internet and from friends.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Plain vanilla vi (as on Solaris)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nu &lt;/span&gt;           " show line numbers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set ts=4    &lt;/span&gt;      " tabs take up four columns&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set sw=4   &lt;/span&gt;       " set shiftwidth (&gt;&gt; or &lt;&lt;) to 4 columns &lt;span style="font-weight: bold;"&gt;set showmatch  &lt;/span&gt;   " show matches of ()'s, {}'s, and []'s&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set showmode  &lt;/span&gt;    " show what mode (e.g. INSERT) you're in&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set autoindent &lt;/span&gt;   " indent to the extent of the previous line&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Vim:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; syntax enable &lt;/span&gt;  " enables syntax highlighting&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set nu &lt;/span&gt;         " show line numbers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set ts=4    &lt;/span&gt;    " tabs take up four columns&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set sw=4   &lt;/span&gt;     " set shiftwidth (&gt;&gt; or &lt;&lt;) to 4 columns &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;set title  &lt;/span&gt;     " sets title of terminal in menubar to that of file currently being edited&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set expandtab&lt;/span&gt;   " tabs aren't really tabs, but many spaces&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set softtabstop=4  &lt;/span&gt;     " delete four spaces when you delete a "tab"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set ignorecase &lt;/span&gt; " perform case-insensitive searches...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set smartcase &lt;/span&gt;  " ... unless there are capitalized characters in the search pattern&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set mousehide &lt;/span&gt;  " hide the mouse when editing&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set exrc &lt;/span&gt;       " eliminates the possibility of another .exrc getting confused with mine on multi-user systems&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set backspace=indent,eol,start  &lt;/span&gt;      "explicitly makes the backspace work when at the beginning of a line&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set bg=light &lt;/span&gt;            "this almost always looks better -- take this out or set it to dark if things look funny&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nohlsearch &lt;/span&gt;"no annoying search highlighting&lt;br /&gt;&lt;br /&gt;" for common typos&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; command! Q quit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; command! W write&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; command! Wq wq&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Vim Python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set autoindent&lt;/span&gt; " indent to the extent of the previous line&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Vim C/C++/Java&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set cindent&lt;/span&gt;  " indenting for C-style languages&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set showmatch &lt;/span&gt;" show matches of ()'s, {}'s, and []'s&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For Text (Vim 7.0 only)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;setlocal spell spelllang=en_us&lt;/span&gt; " English(US) spellcheck on (Vim 7.x only)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set tw=0 wrap linebreak&lt;/span&gt; " don't split words between lines, only wrap at end of word&lt;br /&gt;"lots of abbreviations (varies depending on the subject material)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ab STIA Science, Technology and International Affairs&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; How to produce nicely formatted C code in Vim (From p.221 of &lt;/span&gt;&lt;a style="font-style: italic;" title="Learning the vi editor" href="http://www.amazon.com/Learning-Editor-6th-Arnold-Robbins/dp/1565924266/ref=pd_bbs_sr_1/102-7890135-6992916?ie=UTF8&amp;s=books&amp;amp;qid=1175918735&amp;sr=8-1"&gt;Learning the vi editor&lt;/a&gt;&lt;span style="font-style: italic;"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set nocp incsearch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set cinoptions=:0,p0,t0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set cinwords=if,else,while,do,for,switch,case&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set formatoptions=tcqr&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; set cindent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; syntax on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; source ~/.exrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Options set when vim 6.4/7 starts on my system (Ubuntu Linux):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; helplang=en&lt;/span&gt; " language to display help in&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; ruler&lt;/span&gt; " show row and column in bottom right&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; ttyfast &lt;/span&gt;" indicates a fast terminal connection&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; viminfo='20,"50&lt;/span&gt; " configuration info&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; history=50 &lt;/span&gt;" number of : commands and previous search patters to be remembered&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; scroll=32&lt;/span&gt; " number of lines to scroll with CRTL-U and CTRL-D commands&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; ttymouse=xterm2 &lt;/span&gt;" mouse codes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; backspace=indent,eol,start &lt;/span&gt;"explicitly makes the backspace work when at the beginning of a line&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; fileencodings=ucs-bom,utf-8,latin1&lt;/span&gt; " list of character encodings considered when starting to edit a file&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; printoptions=paper:letter&lt;/span&gt; " controls format and output of printing&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;runtimepath=~/.vim,/usr/share/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vimcurrent,/usr/share/vim/vimfiles/after,/usr/share/vim/addons/after,~/.vim/after&lt;/span&gt; " list of directories which will be searched for runtime files&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc &lt;/span&gt;" Files with these suffixes get a lower priority when multiple files match a wildcard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Cool stuff that I have seen various places but I didn't find particularly useful (maybe someone else will):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set list     &lt;/span&gt;        "replaces all EOLs and TABs with $ and ^I&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;"auto-complete of brackets&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inoremap [ [] &amp;lt;left&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inoremap ( () &amp;lt;left&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inoremap { {} &amp;lt;left&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inoremap " "" &amp;lt;left&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inoremap ' '' &amp;lt;left&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To see the options vi(m) has enabled, enter &lt;span style="font-weight: bold;"&gt;:set&lt;/span&gt;&lt;br /&gt;To get help with options in Vim, enter &lt;span style="font-weight: bold;"&gt;:help set&lt;/span&gt; or &lt;span style="font-weight: bold;"&gt;:set all &lt;/span&gt;for regular vi&lt;br /&gt;Or just &lt;span style="font-weight: bold;"&gt;:help&lt;/span&gt; for the help contents... Vim has excellent documentation&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="Thread on comp.lang.python about vim" href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/7678e4269a806476/c65a6a9ed84e0eb2?lnk=gst&amp;q=python&amp;amp;rnum=5#c65a6a9ed84e0eb2"&gt;Thread on comp.lang.python about vim&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a title="comp.editors" href="http://groups.google.com/group/comp.editors/topics?lnk=sg"&gt;comp.editors&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/url?sa=t&amp;ct=res&amp;amp;amp;cd=1&amp;url=http%3A%2F%2Fvideo.google.com%2Fvideoplay%3Fdocid%3D2538831956647446078&amp;amp;ei=hccXRvOhEoiSgASMlsSADA&amp;usg=__jRzAU-jVlgSQp2X7eieVkCbtaD4=&amp;amp;sig2=A_ZEQPsZnDQPTYONaOLWGw"&gt;Bram Moolenaar's (Vim author) "7 Habits for Effective Editing 2.0" (Google Video)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2996016420237723574?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2996016420237723574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2996016420237723574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2996016420237723574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2996016420237723574'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/my-exrc-file-vim-and-then-some.html' title='My .exrc file (vi/m) and then some'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4755150656767625832</id><published>2007-04-06T20:42:00.000-07:00</published><updated>2009-09-21T16:23:12.408-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><category scheme='http://www.blogger.com/atom/ns#' term='.bashrc'/><title type='text'>My .bashrc file</title><content type='html'>&lt;span style="font-weight: bold;"&gt;export TERM="xterm-color"&lt;/span&gt; # xterm terminal emulation (with color -- be sure to put at top of file on Ubuntu)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;export PYTHONSTARTUP="$HOME/.pythonrc.py"&lt;/span&gt; # python startup file&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set -o vi&lt;/span&gt;                                        # sets vi command-line editing mode&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;bind -m vi-command -r 'v'&lt;/span&gt;            # so that every time you hit v in command mode, an editor doesn't launch&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ulimit -c unlimited&lt;/span&gt;                                        # dump core files, no matter how big they are&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;export EDITOR="vi"&lt;/span&gt;                                   #use vi as the default editor for some commands, like "fc"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias screen='TERM=screen screen' &lt;/span&gt;# workaround for screen backspace bug&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias d="date '+%r -- %A, %D'"&lt;/span&gt; # human-readable date output&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias ll="ls -lh"&lt;/span&gt; # long listing (with human-readable file sizes)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias lr="ls -ltrh"&lt;/span&gt; # list by reverse modification time&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias la="ls -Ah"&lt;/span&gt; # list hidden files (except implied . and ..)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias &amp;lt;name&amp;gt;="cd &amp;lt;important&amp;gt;"&lt;/span&gt; # get to important directories fast&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;alias &amp;lt;name&amp;gt;="ssh &amp;lt;login&amp;gt;@&amp;lt;important&amp;gt;"&lt;/span&gt; # log into oft-used remote machines fast&lt;name&gt;&lt;important&gt;&lt;name&gt;&lt;login&gt;&lt;important&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# prevent myself from doing stupid things with vi&lt;br /&gt;function vi {&lt;br /&gt;if [ ! -e "$1" ]; then&lt;br /&gt;if [ "$1" == "" ]; then&lt;br /&gt;vim&lt;br /&gt;else&lt;br /&gt;vim "$1"&lt;br /&gt;fi&lt;br /&gt;elif [ -d "$1" ]; then&lt;br /&gt;cd "$1"&lt;br /&gt;elif [[ -c "$1" || -b "$1" || -p "$1" || -S "$1" || ! -r "$1" ]]; then&lt;br /&gt;file "$1"&lt;br /&gt;else&lt;br /&gt;vim "$1"&lt;br /&gt;fi&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The following I only enable on Solaris systems:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;export PAGER="less"&lt;/span&gt;                      #uses less to view manpages instead of more&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;/important&gt;&lt;/login&gt;&lt;/name&gt;&lt;/important&gt;&lt;/name&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=614743"&gt;HOWTO: Customizing bash prompts&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4755150656767625832?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4755150656767625832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4755150656767625832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4755150656767625832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4755150656767625832'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/my-bashrc-file.html' title='My .bashrc file'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5712324627907538048</id><published>2007-04-04T14:28:00.000-07:00</published><updated>2007-09-09T11:08:52.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Common Bash Tasks</title><content type='html'>&lt;span style="font-family:Verdana;"&gt;I don't use Bash for much scripting.  Usually, if I have to open up a file to write a script, it will be done in &lt;/span&gt;&lt;a style="font-family: Verdana;" title="Python" href="http://www.python.org/"&gt;Python&lt;/a&gt;&lt;span style="font-family:Verdana;"&gt;.  However, the less I have to do that for mundane tasks that can be accomplished on the command line with Bash, the better.  This entry may not have much in it now, but every time I do something cool/useful/time-saving in Bash from now on, it'll go on here.&lt;/span&gt;&lt;span style="font-weight: bold;font-family:Verdana;" &gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Common Tasks&lt;/span&gt;&lt;br /&gt;&lt;ul  style="font-family:Verdana;"&gt;&lt;li&gt;Rename *.foo files to *.bar files: &lt;span style="font-weight: bold;"&gt;for i in *.foo; do mv $i ${i%.foo}.bar; done&lt;/span&gt; (BashFAQ)&lt;/li&gt;&lt;li&gt;Rename foo.* files to bar.* files: &lt;span style="font-weight: bold;"&gt;for i in foo.*; do mv $i bar.${i#foo.}; done &lt;/span&gt;&lt;span&gt;(also check out the perl regex-based &lt;span style="font-weight: bold;"&gt;rename &lt;/span&gt;Linux utility)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do something to multiple arguments: &lt;span style="font-weight: bold;"&gt;for i in arg1 arg2 arg3; do echo $i; done&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Print 0 through 9 on separate lines: &lt;span style="font-weight: bold;"&gt;for i in {0..9}; do echo $i; done&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Flatten output onto one line: &lt;span style="font-weight: bold;"&gt;&amp;lt;Multi-line output&amp;gt; | xargs&lt;/span&gt; (10 habits)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;       &lt;span style="font-weight: bold;font-family:Verdana;" &gt;Links&lt;br /&gt;&lt;/span&gt; &lt;ul style="font-family: Verdana;"&gt;&lt;li&gt;&lt;a title="GNU Bash Reference Manual" href="http://www.gnu.org/software/bash/manual/bashref.html"&gt;GNU Bash Reference Manual&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="Bash Manpage" href="http://pegasus.rutgers.edu/%7Eelflord/unix/bash.html"&gt;Bash Manpage&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="BashFaq" href="http://wooledge.org/mywiki/BashFaq#head-2c796fb4a5a0f2abf75b61dfbb3596ab43856d10"&gt;BashFaq&lt;/a&gt; Bash FAQs and answers&lt;/li&gt;&lt;li&gt;&lt;a href="http://wooledge.org/mywiki/BashPitfalls"&gt;Bash Pitfalls&lt;/a&gt; common mistakes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Advanced Bash Scripting Guide" href="http://tldp.org/LDP/abs/html/"&gt;Advanced Bash Scripting Guide&lt;/a&gt; Everything you would want to know about Bash scripting&lt;/li&gt;&lt;li&gt;&lt;a title="Bash Guide for Beginners" href="http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html"&gt;Bash Guide for Beginners&lt;/a&gt; A beginner's guide to Bash, some shell examples&lt;/li&gt;&lt;li&gt;&lt;a title="10 Good UNIX Habits" href="http://www-128.ibm.com/developerworks/aix/library/au-badunixhabits.html?ca=lnxw01GoodUnixHabits#ten"&gt;10 Good UNIX Habits&lt;/a&gt; Advanced tips on the command line&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5712324627907538048?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5712324627907538048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5712324627907538048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5712324627907538048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5712324627907538048'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/common-bash-tasks.html' title='Common Bash Tasks'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-6692030193964321010</id><published>2007-04-04T13:23:00.000-07:00</published><updated>2009-09-08T21:46:16.741-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='top'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='kill'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='system monitor'/><title type='text'>Finding and Killing a Process in GNOME</title><content type='html'>There are a few different ways to find and kill a process in Linux.  Using the GNOME interface, you can call up the &lt;span style="font-style: italic;"&gt;System Monitor&lt;/span&gt; (similar to the one on Windows XP) under &lt;span style="font-weight: bold;"&gt;System-&gt;Administration-&gt;System Monitor&lt;/span&gt;.  Under the &lt;span style="font-weight: bold;"&gt;Processes&lt;/span&gt; tab, right clicking on a process will give you a variety of options: stop/end/kill/continue the process, change the priority (&lt;span style="font-weight: bold;"&gt;nice&lt;/span&gt;), display a memory map (&lt;span style="font-weight: bold;"&gt;pmap&lt;/span&gt;) and display open files (&lt;span style="font-weight: bold;"&gt;lsof -p &amp;lt;procID&amp;gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Embedding the system monitor in a desktop panel is useful for constantly monitoring the system and quickly determining if and where there is a problem.  Do this with &lt;span style="font-weight: bold;"&gt;Right Click on Panel-&gt;Add to Panel...-&gt;System &amp;amp; Hardware-&gt;System Monitor-&gt;Add&lt;/span&gt;.  The display provides graphs of Processor, Memory, Network, Swap Space, Hard disk and Load activity (not quite sure what load is, perhaps some metric computed from all the others?  I don't use it, personally).&lt;br /&gt;&lt;br /&gt;On the command line, list processes with the &lt;span style="font-weight: bold;"&gt;ps&lt;/span&gt; command or &lt;span style="font-weight: bold;"&gt;ps -e&lt;/span&gt; for all users' processes.  Pipe that through &lt;span style="font-weight: bold;"&gt;grep&lt;/span&gt; (i.e., &lt;span style="font-weight: bold;"&gt;ps -e | grep firefox&lt;/span&gt;) to find a process ID of the target process (if you know the exact name of the program, you can also use &lt;span style="font-weight: bold;"&gt;pidof firefox-bin&lt;/span&gt;).  To kill a process, use the &lt;span style="font-weight: bold;"&gt;kill  &amp;lt;procID&amp;gt; &lt;/span&gt;command (with the &lt;span style="font-weight: bold;"&gt;-9&lt;/span&gt; flag if you want to kill it unconditionally).  Alternatively, if the process uses a gui, you can use &lt;span style="font-weight: bold;"&gt;xkill &lt;/span&gt;to merely click on the gui to kill the corresponding process.  There is also &lt;span style="font-weight: bold;"&gt;killall&lt;/span&gt; if you want to kill by process table name (i.e. &lt;span style="font-weight: bold;"&gt;killall firefox-bin&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://linux.about.com/library/cmd/blcmdl1_pkill.htm"&gt;pgrep and pkill&lt;/a&gt; are two very useful utilities, especially for dealing with processes with long command line invocations.  &lt;span style="font-weight: bold;"&gt;pgrep -fl -u danny "ruby.*asdf"&lt;/span&gt; will print the process id and name of  every process owned by danny whose command line invocation matches the passed in regular expression.  The -f argument tells it to match against the full command line invocation instead of just the process name.  &lt;span style="font-weight: bold;"&gt;pkill -fu dannyc "ruby.*asdf"&lt;/span&gt; will kill those same processes (for the life of me, I can't seem to coax similar behavior out of killall).&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;top&lt;/span&gt; command provides an integrated way of finding and killing a process on the command line.  If the process-to-be-killed is using a lot of system resources, it will appear towards the top of the display.  Hit &lt;span style="font-weight: bold;"&gt;k&lt;/span&gt; and then the process ID to kill the process.  Top comes with a lot of other functionality -- hit &lt;span style="font-weight: bold;"&gt;h&lt;/span&gt; for help.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: I recommend using &lt;a href="http://htop.sourceforge.net/"&gt;htop&lt;/a&gt; instead of top, which is top with less suck.  It has lots of good features like color, mouse support, a more responsive interface, a tree-based process view, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-6692030193964321010?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/6692030193964321010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=6692030193964321010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6692030193964321010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6692030193964321010'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/04/finding-and-killing-process-in-gnome.html' title='Finding and Killing a Process in GNOME'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-107530350978895452</id><published>2007-03-14T17:05:00.000-07:00</published><updated>2009-04-05T22:17:03.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><category scheme='http://www.blogger.com/atom/ns#' term='google toolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Toolbar 3 has made my life 1.7% better</title><content type='html'>&lt;a href="http://www.google.com/tools/firefox/toolbar/FT3/intl/en/index.html?utm_source=en-et-more&amp;amp;utm_medium=et&amp;amp;utm_campaign=en" title="Google Toolbar Version 3"&gt;Google Toolbar Version 3&lt;/a&gt; rules.  It is a tiny little piece of technology that has made my life significantly better since I started using it.  Linux users will have to go the extra mile (or in this case, inch) to make sure it works (nothing new...).  &lt;a href="http://www.ubuntuforums.org/showthread.php?t=286961" title="See this thread"&gt;See this thread&lt;/a&gt; and &lt;a href="http://www.google.com/support/firefox/bin/answer.py?answer=53937&amp;amp;hl=en" title="Google's toolbar for Linux page"&gt;Google's toolbar for Linux page&lt;/a&gt; for instructions for older builds; apparently it appears to be &lt;a href="http://ubuntuguide.org/wiki/Ubuntu_Edgy#How_to_install_Google_Toolbar_for_Firefox" title="playing nice"&gt;playing nice&lt;/a&gt; now.&lt;br /&gt;&lt;br /&gt;The coolest feature of the Toolbar is the ability to make custom search buttons.  Going to any page with a search bar, right clicking, and selecting "Generate Custom Search" will create a nice little button on the Toolbar (corresponding to a site's favicon).  Using this, you can search with the Toolbar as if you were on the page you generated a search for, the effect being that you never need to visit the page to use their search engine -- you can search from any arbitrary page!  It's also useful for doing the same search (i.e. "Donnie Darko") over several sites you have a custom search (i.e. RottenTomatoes, IMDB, Wikipedia).  If you don't know what buttons you want on your Toolbar, Google has provided a &lt;a href="http://toolbar.google.com/buttons/gallery" title="nice grab bag"&gt;nice grab bag&lt;/a&gt; to choose from.  My custom searches (as of right now) are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://images.google.com/"&gt;     Google Image Search&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/"&gt;     Google Groups&lt;/a&gt; (usenet)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://news.google.com/"&gt;     Google News&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://maps.google.com/"&gt;     Google Maps&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/"&gt;     Google Docs &amp;amp; Spreadsheets&lt;/a&gt; (online word processing + spreadsheets) (   &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/linux"&gt;     Google Linux Search&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/calendar/render"&gt;     Google Calendar&lt;/a&gt;   &lt;/li&gt;&lt;li&gt;&lt;a href="http://mail.google.com/"&gt;     Gmail&lt;/a&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/reader/view/"&gt;&lt;span style="text-decoration: underline;"&gt;Google Reader&lt;/span&gt;&lt;/a&gt; (RSS reader)&lt;/li&gt;&lt;li&gt;&lt;a href="http://isohunt.com/"&gt;IsoHunt&lt;/a&gt; (torrents)   &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.newegg.com/"&gt;     Newegg&lt;/a&gt; (hardware)   &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rottentomatoes.com/"&gt;     RottenTomatoes&lt;/a&gt; (movies, especially reviews)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.imdb.com/"&gt;     IMDB&lt;/a&gt; (movies)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;     &lt;a href="http://www.gamespot.com/"&gt;Gamespot&lt;/a&gt; (video games)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;     &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; (everything)   &lt;/li&gt;&lt;li&gt;     &lt;a href="http://youtube.com/"&gt;YouTube&lt;/a&gt; (videos)   &lt;/li&gt;&lt;li&gt;     &lt;a href="http://musicbrainz.org/"&gt;MusicBrainz&lt;/a&gt; (music metadata and info)   &lt;/li&gt;&lt;li&gt;     &lt;a href="http://en.wikipedia.org/wiki/Main_Page"&gt;Wikipedia&lt;/a&gt; (online encyclopedia)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.yelp.com/"&gt;Yelp&lt;/a&gt; (local search and reviews)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.allmusic.com/"&gt;Allmusic&lt;/a&gt; (music reviews and metadata)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Some more very useful features include enabling GMail to launch every time a &lt;span style="font-weight: bold;"&gt;mailto:&lt;/span&gt; link is clicked (Finally!  No more surprise Evolution/Outlook/etc. "setup page" launches!), an icon indicating if you're signed in to your Google account, and some keyboard shortcuts (more would be nice... especially for accessing custom buttons) like &lt;span style="font-weight: bold;"&gt;Shift+Enter&lt;/span&gt; for an "I'm Feeling Lucky" search (keeping in the spirit of eliminating useless page visits).  There are more features that I don't use (but many do) detailed on the &lt;a href="http://www.google.com/support/firefox/bin/static.py?page=features.html&amp;amp;v=3" title="features page"&gt;features page&lt;/a&gt;.  Some of these are pretty cutting edge and have generated a considerable amount of controversy, especially &lt;a href="http://blog.searchenginewatch.com/blog/050225-104317" title="AutoLink"&gt;AutoLink&lt;/a&gt;.  Others, such as the RSS subscribe and spellcheck, have already been implemented in Firefox 2.  In any event, you should get it.  Now.&lt;br /&gt;&lt;br /&gt;A couple of things that could use improvement:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;More keyboard shortcuts (as mentioned above)&lt;/li&gt;&lt;li&gt;Web spam reporting buttons, analogous to the "Report Spam" button that Gmail has... perhaps Google can build a database of &lt;a href="http://en.wikipedia.org/wiki/Splog"&gt;splog&lt;/a&gt;, etc. sites to blacklist, or maybe work with other search engines to do so?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sometimes the "Generate Custom Search..." option doesn't work... amazingly, Blogger is one of those examples... when trying to do a custom search on a particular blog, I get this (wtf?): "Information Unavailable The custom button cannot be installed. Custom button values out of range."&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1m9DQw3ptG4/RfiU_COCBfI/AAAAAAAAACU/csQJmi0W1UQ/s1600-h/Screenshot-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_1m9DQw3ptG4/RfiU_COCBfI/AAAAAAAAACU/csQJmi0W1UQ/s400/Screenshot-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5041943593489663474" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-107530350978895452?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/107530350978895452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=107530350978895452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/107530350978895452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/107530350978895452'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/03/google-toolbar-3-has-made-my-life-32.html' title='Google Toolbar 3 has made my life 1.7% better'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1m9DQw3ptG4/RfiU_COCBfI/AAAAAAAAACU/csQJmi0W1UQ/s72-c/Screenshot-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5861019407877232947</id><published>2007-03-07T22:10:00.000-08:00</published><updated>2009-09-22T20:02:28.033-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version'/><category scheme='http://www.blogger.com/atom/ns#' term='issue'/><category scheme='http://www.blogger.com/atom/ns#' term='etc'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='lsb-release'/><title type='text'>Which Ubuntu version am I using, again?</title><content type='html'>On the command line: &lt;span style="font-weight: bold;"&gt;lsb_release -a&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alternatively, look in one of these two files for the answer (links to sources where I found info): &lt;a href="http://blog.websitestyle.com/index.php/2007/01/18/how-to-find-out-your-ubuntu-version-name/"&gt;/etc/lsb-release&lt;/a&gt; or &lt;a href="http://www.itmission.org/index.php?n=Main.HowToFindOutTheUbuntuVersionThatYouAreRunning"&gt;/etc/issue&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, find out if your install is 64-bit via &lt;span style="font-weight: bold;"&gt;uname -m&lt;/span&gt; (&lt;a href="http://ubuntuforums.org/showthread.php?t=451820"&gt;thread1&lt;/a&gt;, &lt;a href="http://www.linuxquestions.org/questions/linux-software-2/how-do-i-tell-if-32-bit-or-64-bit-ubuntu-is-installed-on-a-machine-638622/"&gt;thread2&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5861019407877232947?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5861019407877232947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5861019407877232947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5861019407877232947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5861019407877232947'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/03/which-ubuntu-version-am-i-using-again.html' title='Which Ubuntu version am I using, again?'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-8885822069469043994</id><published>2007-03-07T16:31:00.000-08:00</published><updated>2007-03-07T16:36:29.443-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='pipes'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>Yahoo! Pipes and its Shortcomings</title><content type='html'>For the past couple of days, I have been fooling around with &lt;a title="Yahoo! Pipes" href="http://pipes.yahoo.com/"&gt;Yahoo! Pipes&lt;/a&gt;.  It's a tool and an interface for aggregating and/or manipulating &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; feeds.  It's an interesting experiment and has been receiving some hype, most notably from &lt;span class="author"&gt;Tim &lt;span class="misspell" suggestions="Reilly,Orella,Orelle,Orally,O'Neill"&gt;O'Reilly&lt;/span&gt; who called it a "&lt;/span&gt;&lt;a title="milestone in the history of the internet" href="http://radar.oreilly.com/archives/2007/02/pipes_and_filte.html"&gt;milestone in the history of the &lt;span class="misspell" suggestions="Internet,inter net,inter-net,interned,Internets"&gt;internet&lt;/span&gt;&lt;/a&gt;&lt;span class="author"&gt;."  So how useful/powerful is it?  My assessment is: right now, not very.  There are several problems that are keeping it from being a useful (or sometimes even usable) tool at present.&lt;br /&gt;&lt;br /&gt;The first problem is it is &lt;span style="font-weight: bold;"&gt;SLOW&lt;/span&gt;.  When manipulating the first one or two modules, things run fine, even to the point of web 2.0 &lt;span class="misspell" suggestions="Ajax,Ajay,Ajay's,Ajax's,Axe"&gt;AJAXy&lt;/span&gt; nirvana.  The scrolling is snappy, the debugger (which is a well-thought out touch) and &lt;span class="misspell" suggestions="HTML,DIHEDRAL,TREADMILL"&gt;DHTML&lt;/span&gt; animations look nice, and the interface is responsive.  However, after that things start crawling.  And after 10 or so modules, it slows to a why-am-I-even-bothering speed (and I'm on a pretty damn fast MIT connection right now with a capable PC).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The second problem are the &lt;span style="font-weight: bold;"&gt;all-too-frequent site outages&lt;/span&gt;.  A recent blog post by the development team humorously noted: "Our apologies for the unscheduled downtime this evening. As a reminder, &lt;span class="misspell" suggestions="to days,to-days,today's,toady's,toads"&gt;todays&lt;/span&gt; (sic) post was sponsored by the letters “b” “e” “t” and “a”."&lt;br /&gt;&lt;br /&gt;The third problem is the &lt;span style="font-weight: bold;"&gt;support of only &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; inputs&lt;/span&gt;.  But judging from the Pipes developers' posts, however, this problem &lt;a title="looks like it will be overcome in the future" href="http://discuss.pipes.yahoo.com/Message_Boards_for_Pipes/threadview?m=tm&amp;bn=pip-DeveloperHelp&amp;amp;tid=86&amp;mid=125&amp;amp;tof=181&amp;rt=2&amp;amp;frt=2&amp;off=1"&gt;looks like it will be overcome in the future&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; one do right now with Pipes?  The &lt;a title="canonical example" href="http://pipes.yahoo.com/pipes/vvW1cD212xGMiR9aqu5lkA/"&gt;canonical example&lt;/a&gt; has been putting the &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; feed of the New York Times through a &lt;span class="misspell" suggestions="Flickery,Flicker,Flick,Flicks,Flickers"&gt;Flickr&lt;/span&gt; filter, the result being that you can see the &lt;span class="misspell" suggestions="NUT,NT,NY,YT,NWT"&gt;NYT&lt;/span&gt; stories in photo form.  Which brings us to problem number four: &lt;span style="font-weight: bold;"&gt;your results are only as good as your data&lt;/span&gt;.  While a lot of these photos are applicable to current events, others are tangential and some are just irrelevant.  Kind of makes one think that a well-implemented &lt;a title="semantic web" href="http://en.wikipedia.org/wiki/Semantic_web"&gt;semantic web&lt;/a&gt; isn't such a bad idea, after all.&lt;br /&gt;&lt;br /&gt;Another thing one can do with Pipes is what I did with my first pipe, &lt;a title="Ray's Deals" href="http://pipes.yahoo.com/pipes/MNyp_zvL2xGa2vJmmLokhQ/"&gt;Ray's Deals&lt;/a&gt;.  It simply takes several &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; feeds from bargain electronics sites and aggregates them into one feed.  I then made the feed (or, more precisely, the titles of the items of the feed) &lt;span class="misspell" suggestions="search able,search-able,reachable,teachable,watchable"&gt;searchable&lt;/span&gt;.  The utility of this Pipe is that Ray now only needs to subscribe to the &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; feed from this pipe instead of several &lt;span class="misspell" suggestions="ROSS,RUSS,RS,SS,R'S"&gt;RSS&lt;/span&gt; feeds.  (&lt;span class="misspell" suggestions="Si denote,Si-denote,Side note,Side-note,Denote"&gt;Sidenote&lt;/span&gt;: I actually added way more modules than necessary here: instead putting each URL in a separate Fetch module, I could have just had multiple entries in a single Fetch module... live and learn, I guess.)&lt;br /&gt;&lt;br /&gt;That's about all the useful things one can do with Pipes at present -- my subsequent, more adventurous, Pipe experiments were fraught with frustration and, ultimately, failure.  This was in part due to Pipes problem #5: the &lt;span style="font-weight: bold;"&gt;limited amount of operators&lt;/span&gt; that Pipes provides.  There are currently no functions for performing the most basic of operations, such as generating random numbers (see the failure of my Pipe &lt;a title="Random Jokes (Incomplete)" href="http://pipes.yahoo.com/pipes/GKESH3HL2xGMixwm0kqv4w/"&gt;Random Jokes (Incomplete)&lt;/a&gt;) or extracting specific information from a feed.  There are some workarounds for things like selecting a particular item from a feed, as my second hackish pipe, &lt;a title="Selection Experiment 1" href="http://pipes.yahoo.com/pipes/_MAQqP3M2xG3QAI5r8cPhQ/"&gt;Selection Experiment 1&lt;/a&gt;, demonstrates.  To select a certain oldest item, I sorted the feed by Date and then cut off the feed after a certain number of items (6).  I then reversed the feed and cut off all but the first item, thus producing the selected item.  Wow, that's a lot of work.  Not to mention the limitations of some of the other operators, such as Sort not taking in a key value to sort by, etc.  To be fair, it's still a beta product and the selection and power of modules will no doubt grow with time.&lt;br /&gt;&lt;br /&gt;There are other concerns too, some of which are voiced in the &lt;a title="responses" href="http://radar.oreilly.com/archives/2007/02/pipes_and_filte.html"&gt;responses&lt;/a&gt; to Tim &lt;span class="misspell" suggestions="Reilly's,Orella's,Orelle's,Oriel's,Orel's"&gt;O'Reilly's&lt;/span&gt; post.  Among these are &lt;span style="font-weight: bold;"&gt;&lt;span class="misspell" suggestions="IPA,OP,UP,PI,IO"&gt;IP&lt;/span&gt; concerns&lt;/span&gt; -- is your &lt;span class="misspell" suggestions="mash up,mash-up,smashup,mishap,MASH"&gt;mashup&lt;/span&gt; your property, or the feed providers' partial (or full) property?  Also, there is the question of &lt;span style="font-weight: bold;"&gt;accessibility&lt;/span&gt;: will Pipes be a place that democratizes mashups, or is it just for geeky developers (who might be better off coding their own specialized apps anyways)?&lt;br /&gt;&lt;br /&gt;All in all, Yahoo! Pipes looks like a tool that has some potential.  It has a nice interface (when it's not super slow), the concept is fresh, and it's relatively easy to use (again, when it works).  Its current shortcomings, however, make it little more than a novelty item.  Once these get addressed, I'll be willing to give it a second try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-8885822069469043994?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/8885822069469043994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=8885822069469043994' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8885822069469043994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/8885822069469043994'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/03/yahoo-pipes-and-its-shortcomings.html' title='Yahoo! Pipes and its Shortcomings'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3349713973108496408</id><published>2007-03-06T08:36:00.000-08:00</published><updated>2007-03-07T22:23:24.608-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='server'/><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='remote'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Connecting to servers in Ubuntu with "Connect to Server..."</title><content type='html'>I don't know how this has eluded me for so long, but there is actually a very nice interface built into Ubuntu that allows you to connect to servers using any of the following protocols: ftp, ssh, windows share, WebDAV (http), Secure WebDAV (https), and more.  This is a nice alternative to using third party software like &lt;a href="http://fireftp.mozdev.org/"&gt;FireFTP&lt;/a&gt; (even though that program rocks) or the command line.&lt;br /&gt;&lt;br /&gt;Simply pulling down the &lt;span style="font-weight: bold;"&gt;Places-&gt;Connect to Server...&lt;/span&gt; option in GNOME opens a dialog box which allows you to enter the appropriate information about the server you want to connect to.  After the connection is successful, a folder representing the remote file system will appear on both the Desktop and in the Places menu.  Another nice feature is that the folder even has some little letters on it telling you what protocol it is connecting over.  You can now drag and drop files via the Nautilus interface, as if the directory was local.  How convenient!&lt;br /&gt;&lt;br /&gt;This tip found via the free online book &lt;a href="http://lifehacker.com/software/ubuntu/learn-ubuntu-linux-with-freely-available-ebook-241847.php"&gt;Ubuntu Linux Bible&lt;/a&gt;.  (&lt;a href="http://www.amazon.com/Ubuntu-Linux-Bible-William-Hagen/dp/0470038993/ref=pd_bbs_sr_1/002-0960127-3067208?ie=UTF8&amp;s=books&amp;amp;amp;amp;amp;qid=1173199591&amp;sr=8-1"&gt;Reviews on Amazon&lt;/a&gt;)  By the way, this is an incredibly comprehensive reference on all things that an end user might want to do on Ubuntu.  It also has sections on setting up subversion, using LaTeX, setting up other servers such as Apache, multimedia usage, and just about everything else.  UPDATE: Whoops!  This actually got posted by mistake by Lifehacker... the book has been taken down... it's still a good book, though!&lt;br /&gt;&lt;br /&gt;UPDATE: For some more (unrelated) GNOME fun, right click on an icon and select "Stretch Icon" to blow up the icon to a cartoonish size.  Click "Restore Icon's Original Size" in the same menu if you get tired of it (which you will, after 2 seconds).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3349713973108496408?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3349713973108496408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3349713973108496408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3349713973108496408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3349713973108496408'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/03/connecting-to-servers-in-ubuntu-with.html' title='Connecting to servers in Ubuntu with &quot;Connect to Server...&quot;'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-3512194211838758605</id><published>2007-02-14T08:48:00.000-08:00</published><updated>2007-02-14T09:02:51.191-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='whois'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='web site'/><title type='text'>whois</title><content type='html'>The WHOIS database is a nice way to determine contact information for a web site.  Query the site with &lt;span style="font-weight: bold;"&gt;whois&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&amp;lt;site&amp;gt;&lt;/span&gt;   It shows the name and address of the registrant, through who he/she registered the site, a technical and administrative contact, and the domain servers corresponding to the site.  Use it along with &lt;span style="font-weight: bold;"&gt;dig, host, ping&lt;/span&gt;, etc. (and if you're feeling naughty, &lt;span style="font-weight: bold;"&gt;nmap&lt;/span&gt;) to get information about a site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Whois"&gt;Whois (Wikipedia entry)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.faqs.org/rfcs/rfc954.html"&gt;Whois RFC&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-3512194211838758605?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/3512194211838758605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=3512194211838758605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3512194211838758605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/3512194211838758605'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/02/whois.html' title='whois'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-6289701410814098773</id><published>2007-01-20T12:16:00.000-08:00</published><updated>2007-01-24T15:24:59.237-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='proc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>UNIX status commands on Solaris</title><content type='html'>&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Proc&lt;/span&gt; tools:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;pflags&lt;/span&gt;&lt;/span&gt;          Print the /&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;proc&lt;/span&gt; tracing flags,  the  pending and  held  signals,  and  other /&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;proc&lt;/span&gt; status information for each &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;lwp&lt;/span&gt; in each process.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;pcred&lt;/span&gt;&lt;/span&gt;           Print or  set  the  credentials  (effective, real, saved &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;UIDs&lt;/span&gt; and &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;GIDs&lt;/span&gt;) of each process.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;pldd&lt;/span&gt;&lt;/span&gt;            List the dynamic libraries linked into  each process, including shared objects explicitly attached using &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;dlopen&lt;/span&gt;(3C).  See also &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;ldd&lt;/span&gt;(1).&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;psig&lt;/span&gt;&lt;/span&gt;            List the signal actions and handlers of each process. See signal.h(3HEAD).&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;pstack&lt;/span&gt;&lt;/span&gt;          Print a hex+symbolic stack  trace  for  each &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;lwp&lt;/span&gt; in each process.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;pfiles&lt;/span&gt;&lt;/span&gt;          Report &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;fstat&lt;/span&gt;(2) and &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;fcntl&lt;/span&gt;(2) information for all open files in each process. In addition, a path to the file is reported if the information  is  available  from  /&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;proc&lt;/span&gt;/&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;pid&lt;/span&gt;/path.  This is not necessarily the same  name  used to  open  the  file.  See  &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;proc&lt;/span&gt;(4)  for more information.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;pwdx&lt;/span&gt;&lt;/span&gt;            Print the current working directory of  each process.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;pstop&lt;/span&gt;&lt;/span&gt;           Stop each process (PR_REQUESTED stop).&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;prun&lt;/span&gt;&lt;/span&gt;            Set each process running (inverse of &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;pstop&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;pwait&lt;/span&gt;&lt;/span&gt;           Wait for all of the specified  processes  to terminate.&lt;/li&gt;&lt;li&gt;    &lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;ptime&lt;/span&gt;&lt;/span&gt;           Time the command, like  time(1),  but  using &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;microstate&lt;/span&gt;  accounting for reproducible precision. Unlike time(1), children of the command are not timed.&lt;/li&gt;&lt;/ul&gt;Other commands:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;arch&lt;/span&gt; display system architecture (i86&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;pc&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;uname&lt;/span&gt; &lt;/span&gt;print name of current system (&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;SunOS&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;pagesize&lt;/span&gt;&lt;/span&gt; display the size of pages of memory&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;iostat&lt;/span&gt;&lt;/span&gt; report I/O stats for terminal, disk, tape, etc&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;vmstat&lt;/span&gt;&lt;/span&gt; report virtual memory statistics&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;mpstat&lt;/span&gt; &lt;/span&gt;report CPU statistics&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;busstat&lt;/span&gt; &lt;/span&gt;report bus-related support statistics&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;lsof&lt;/span&gt; &lt;/span&gt;list open files (sockets (&lt;span style="font-weight: bold;"&gt;lsof -i&lt;/span&gt;), etc.)  &lt;a href="http://www.akadia.com/services/lsof_intro.html"&gt;Introductory lsof examples&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;nohup&lt;/span&gt;&lt;/span&gt; run a command immune to hangups&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;kstat &lt;/span&gt;display kernel statistics&lt;/li&gt;&lt;/ul&gt;While navigating manpages, note that Solaris uses &lt;span style="font-weight: bold;"&gt;more&lt;/span&gt; to view them, which is supremely annoying.  Use less with &lt;span style="font-weight: bold;"&gt;export PAGER="less"&lt;/span&gt; (tip found &lt;a href="http://codept.blogspot.com/2007/01/navigating-solaris-default-man-pages.html"&gt;here&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-6289701410814098773?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/6289701410814098773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=6289701410814098773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6289701410814098773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/6289701410814098773'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/01/unix-status-commands-on-solaris.html' title='UNIX status commands on Solaris'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2738128681179986741</id><published>2007-01-04T17:02:00.000-08:00</published><updated>2008-07-06T20:39:09.548-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Starcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='Wine'/><category scheme='http://www.blogger.com/atom/ns#' term='Brood War'/><category scheme='http://www.blogger.com/atom/ns#' term='Edgy Eft'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>HOWTO Starcraft/Brood War on Ubuntu Linux Edgy Eft with Wine</title><content type='html'>One of the (very very very) few things for which I use my Windows partition anymore is playing &lt;a title="Starcraft" href="http://www.blizzard.com/starcraft/"&gt;Starcraft&lt;/a&gt;  /&lt;a title="Brood War" href="http://www.blizzard.com/broodwar/"&gt;Brood War&lt;/a&gt;.  Of course, as anyone that dual-boots knows, restarting your machine just for one Windows application and then back to Linux is highly annoying and time-consuming.  One solution to running Windows apps on Linux is &lt;a title="Wine" href="http://www.winehq.com/"&gt;Wine&lt;/a&gt;, which I will describe how to configure to play SC/BW in this post.  I'm using Ubuntu 6.10 (Edgy Eft).  Thanks to JTerry for his help with this.&lt;br /&gt;&lt;br /&gt;First, you're going to need a few things.  Open a terminal and run &lt;span style="font-weight: bold;"&gt;sudo apt-get install wine &lt;/span&gt;to get wine.  After that finishes, insert the Starcraft CD.  &lt;span style="font-weight: bold;"&gt;cd&lt;/span&gt; to whatever cdrom drive you put the cd in (under the &lt;span style="font-weight: bold;"&gt;/media/&lt;/span&gt; directory).  Use Wine to setup SC with &lt;span style="font-weight: bold;"&gt;wine setup.exe&lt;/span&gt;.  You'll get the install screen for SC -- enter your CD key and install the software.  The SC executable will be installed under the path of &lt;span style="font-weight: bold;"&gt;~/.wine/drive_c/Program\ Files/Starcraft/starcraft.exe&lt;/span&gt;.  If you try and play SC now, you might notice that the sound does not work.  Run &lt;span style="font-weight: bold;"&gt;winecfg&lt;/span&gt; and go to the Audio tab.  Set Hardware Acceleration to Emulation.  The sound should now work fine.  If you want to play Brood War, read on; if not, skip to the next paragraph.  Eject the SC CD and insert the BW CD.  Again, &lt;span style="font-weight: bold;"&gt;cd &lt;/span&gt;to the appropriate &lt;span style="font-weight: bold;"&gt;/media/&lt;/span&gt; directory and run &lt;span style="font-weight: bold;"&gt;wine setup.exe&lt;/span&gt;.  To play SC/BW, run &lt;span style="font-weight: bold;"&gt;wine &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;~/.wine/drive_c/Program\ Files/Starcraft/&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;starcraft.exe&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Playing online over &lt;a title="Battle.net" href="http://en.wikipedia.org/wiki/Battle.net"&gt;Battle.net&lt;/a&gt;   requires a little bit more work.  First, you'll need the proper fonts that Battle.net uses... &lt;span style="font-weight: bold;"&gt;sudo apt-get install msttcorefonts&lt;/span&gt; for this.  You'll also need the newest patch for Battle.net which updates BW to version 1.14.  Get this patch &lt;a title="here" href="http://ftp.blizzard.com/pub/broodwar/patches/PC/BW-114.exe"&gt;here&lt;/a&gt; (other patches, for instance for regular SC, can be found &lt;a title="here" href="http://www.battle.net/files.shtml"&gt;here&lt;/a&gt;).  Use wine to run the downloaded file, &lt;span style="font-weight: bold;"&gt;BW-114.exe&lt;/span&gt;.  An updater should run, after which you'll be able to play online using Battle.net.  It works, but all is not perfect -- the display of the Battle.net interface is kind of screwed up (it never refreshes when you change views).  However, if you're familiar with the Battle.net interface you should be able to get into a game after which SC/BW runs without a hitch.&lt;br /&gt;&lt;br /&gt;Some tips: tweak your mouse sensitivity and acceleration to play SC/BW.  It runs at a low resolution and your cursor will be uncontrollably flying all over the place if you don't.  Change this in &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Mouse-&gt;Motion&lt;/span&gt;.  Also, sometimes (rarely) the screen resolution doesn't change back to what you had it at before playing SC/BW.  Change this in the &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Screen Resolution&lt;/span&gt; menu.  If you hear a lot of static from your speakers, try switching from OSS to ALSA in &lt;span style="font-weight: bold;"&gt;winecfg-&gt;Audio&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;More information on this topic can be found at the &lt;a title="Wine Application Database page for SC/BW" href="http://appdb.winehq.org/appview.php?iVersionId=149"&gt;Wine Application Database page for SC/BW&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Update: &lt;a href="http://ubuntuforums.org/showthread.php?t=168313"&gt;here&lt;/a&gt;'s another good page on Ubuntu forums&lt;br /&gt;&lt;br /&gt;Another update: yet &lt;a href="http://ubuntu-tutorials.com/2008/07/06/install-the-1152-no-cd-patch-for-starcraft-on-ubuntu-804/"&gt;another&lt;/a&gt; good page from the Ubuntu community detailing how to enable the 'no CD' patch&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2738128681179986741?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2738128681179986741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2738128681179986741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2738128681179986741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2738128681179986741'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/01/howto-starcraftbrood-war-on-ubuntu.html' title='HOWTO Starcraft/Brood War on Ubuntu Linux Edgy Eft with Wine'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-5025262452519999894</id><published>2007-01-01T20:20:00.000-08:00</published><updated>2007-01-01T20:21:12.420-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='routers'/><category scheme='http://www.blogger.com/atom/ns#' term='defaults'/><category scheme='http://www.blogger.com/atom/ns#' term='netgear'/><category scheme='http://www.blogger.com/atom/ns#' term='kismet'/><category scheme='http://www.blogger.com/atom/ns#' term='linksys'/><category scheme='http://www.blogger.com/atom/ns#' term='factory settings'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><title type='text'>Why default settings on your wireless router is a BAD thing</title><content type='html'>Lots of people recognize that 802.11 wireless networks are really cool and want to have them.  They go to Best Buy, grab a Linksys router, run home and, without going through the standard setup, plug the router into their network connection and turn it on.  Hopefully you are not one of these people because these people leave their router completely vulnerable to whoever wants to take control of it.&lt;br /&gt;&lt;br /&gt;Here, I will show how to discover one of these networks, how to get in to it, and what you can do once you're in command.  I will be using the &lt;a title="Linksys WRT54GL" href="http://www.amazon.com/Linksys-Cisco-WRT54GL-Wireless-G-Broadband-Compatible/dp/B000BTL0OA"&gt;Linksys WRT54GL&lt;/a&gt; as an example, but the lessons here are very applicable to other makes and models as well.&lt;br /&gt;&lt;br /&gt;First, the discovery.  You're going to need a tool like &lt;a title="kismet" href="http://www.kismetwireless.net/"&gt;kismet&lt;/a&gt; for this.  If you're on Ubuntu Edgy Eft (like me), a simple &lt;span style="font-weight: bold;"&gt;sudo apt-get install kismet&lt;/span&gt; will install it on your machine.  If you don't have apt-get or a comprable tool (such as &lt;span style="font-weight: bold;"&gt;yum&lt;/span&gt; on Red Hat flavors), you'll have to &lt;a title="download" href="http://www.kismetwireless.net/code/kismet-2006-04-R1.tar.gz"&gt;download&lt;/a&gt;   and compile it from source yourself.  Once you have kismet, edit the &lt;span style="font-weight: bold;"&gt;/etc/kismet/kismet.conf &lt;/span&gt;file.  Edit the line that begins with "source=" to whatever is appropriate.  The first value should be what comes up after the Nickname section of this command:  &lt;span style="font-weight: bold;"&gt;iwconfig | grep Nickname&lt;/span&gt;.   The second value should be the desired wireless interface (something like eth1... also on that same line of the previous command) and the third value is whatever you want to name this interface.  Mine is &lt;span style="font-weight: bold;"&gt;source= ipw2100,eth1,wireless&lt;/span&gt;.  More info is in the &lt;a title="README" href="http://www.kismetwireless.net/documentation.shtml"&gt;README&lt;/a&gt; under "Capture Sources."   Fire up kismet with &lt;span style="font-weight: bold;"&gt;sudo kismet&lt;/span&gt;.  Any detected networks that have the "F" under Flags (and, with color enabled, the line should come up as red) are networks with factory-default settings.  These routers are often named "linksys" or "NETGEAR" or the like.  If you want to change around the interface in kismet, edit the &lt;span style="font-weight: bold;"&gt;/etc/kismet/kismet_ui.conf&lt;/span&gt; file.&lt;br /&gt;&lt;br /&gt;Now that you have your target, log onto the network and (hoping that this isn't a &lt;a title="honeypot" href="http://en.wikipedia.org/wiki/Honeypot_%28computing%29"&gt;honeypot&lt;/a&gt;) point your browser to 192.168.1.1 (this IP address may vary depending on the make and model of the network that you're hacking... NETGEAR routers, for example, are 192.168.0.1).  When prompted for a username and password, enter admin/admin.  These are factory-set values that can be found for other models by searching on the Internet.  For example, &lt;a title="here" href="http://www.phenoelit.de/dpl/dpl.html"&gt;here&lt;/a&gt;   and &lt;a title="here" href="http://www.cirt.net/cgi-bin/passwd.pl"&gt;here&lt;/a&gt; (and &lt;a title="here" href="http://www.cirt.net/cgi-bin/passwd.pl?method=showven&amp;ven=D-Link"&gt;here&lt;/a&gt;   for D-link and &lt;a title="here" href="http://www.phenoelit.de/dpl/dpl.html"&gt;here&lt;/a&gt;   for Belkin).  Congratulations, you're in.&lt;br /&gt;&lt;br /&gt;What to do now?  Well, as far as the router is concerned, a lot of things.  Change the broadcasted ESSID of the network to "lol u R h4cked!" under &lt;span style="font-weight: bold;"&gt;Wireless-&gt;Basic Wireless Settings&lt;/span&gt;.  Enable a password in &lt;span style="font-weight: bold;"&gt;Wireless-&gt;Wireless Security&lt;/span&gt; so that the legitimate users of the network will not be able to log on.  In &lt;span style="font-weight: bold;"&gt;Access Restrictions&lt;/span&gt;, set the router so that it ceases to operate for five hours on Tuesdays.  Etc.  Of course, there are more things that you could do by exploiting the actual network itself, but that's beyond the scope of this entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-5025262452519999894?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/5025262452519999894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=5025262452519999894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5025262452519999894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/5025262452519999894'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2007/01/why-default-settings-on-your-wireless.html' title='Why default settings on your wireless router is a BAD thing'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-2474895803841287225</id><published>2006-12-30T21:26:00.000-08:00</published><updated>2009-08-23T10:13:11.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DRM'/><category scheme='http://www.blogger.com/atom/ns#' term='myFairTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='JHymn'/><category scheme='http://www.blogger.com/atom/ns#' term='file fomats'/><category scheme='http://www.blogger.com/atom/ns#' term='QTFairUse'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='iTMS'/><category scheme='http://www.blogger.com/atom/ns#' term='m4p'/><title type='text'>HOWTO scrub iTunes' DRM off of your purchased music with QTFairUse</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Digital_Rights_Management"&gt;DRM&lt;/a&gt; &lt;a href="http://www.eff.org/IP/DRM/"&gt;sucks&lt;/a&gt;.  &lt;a href="http://www.defectivebydesign.org/en/node"&gt;A lot&lt;/a&gt;.  Case in point: I just received a $25 dollar gift certificate from a loving relative who wanted me to buy some music.  I summarily went to the iTunes Music Store and downloaded about twenty-five bucks worth of &lt;a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;amp;searchlink=CANNIBAL%7CCORPSE&amp;amp;sql=11:2uzyxd7bjol0%7ET0"&gt;Cannibal Corpse&lt;/a&gt; songs.  All was good, until I tried to play the songs on another music player.  Surprise!  The .m4p files are a iTunes-only, DRMed format.  That is when I resolved to immediately blog about how to get around it (a mild form of protest, I know).&lt;br /&gt;&lt;br /&gt;(Disclaimer: doing this may be violating the &lt;a href="http://en.wikipedia.org/wiki/DMCA"&gt;DMCA&lt;/a&gt;.  But if you want to stick it to the man and protect your fair use rights, read on.  Besides, &lt;a href="http://www.eff.org/IP/DMCA/20030102_dmca_unintended_consequences.html"&gt;the DCMA sucks, too&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;First, you're going to need Windows (sorry... I guess you could always use &lt;a href="http://www.winehq.com/"&gt;Wine&lt;/a&gt; or &lt;a href="http://www.win4lin.com/"&gt;Virtualization&lt;/a&gt; inside Linux, but I don't have that set up yet -- I'm just dual-booting Ubuntu Edgy and Windows XP).   Next, download &lt;a href="http://rapidshare.com/files/5251505/QTFairUse6-2.5.zip"&gt;QTFairUse &lt;/a&gt;which is a utility that will scrub the DRM from your music files.  (There is also another utility for doing this called &lt;a href="http://rapidshare.com/files/4074530/myFairTunes6_v0.5.8.zip"&gt;myFairTunes&lt;/a&gt; and an older one that doesn't work anymore called &lt;a href="http://en.wikipedia.org/wiki/JHymn"&gt;JHymn&lt;/a&gt;).  Unzip the QTFairUse archive and launch the .exe file to start the program.  Use the drag-and-drop interface to select which songs you want scrubbed and then click the button at the bottom to begin the conversion.  You now have .m4a-format, DRM-free audio files!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;:&lt;br /&gt;Neither of these programs work under Wine... neither are in the Wine Application DB... looks like I'll have to stick with Windows (ugh) for now...&lt;br /&gt;&lt;br /&gt;QTFairUse throws a "ImportError: MemoryLoadLibrary failed loading win32api.pyd" when using the console version and an "ImportError: MemoryLoadLibrary failed loading win32gui.pyd" when using the GUI version&lt;br /&gt;&lt;br /&gt;myFairTunes sets up fine but throws this error when I run the application under Wine: "install the Windows version of Mono to run .NET executables" ... searched Google and it seems like this is a long way from being fixed&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATE 2&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;new links:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.oldapps.com/itunes.php"&gt;itunes 6.0.4 windows xp download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.softpedia.com/progDownload/QTFairUse-for-ITunes-Download-51171.html"&gt;QtFairUse&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Be sure your computer is 'authorized' to play 'protected' files on iTunes or this won't work.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-2474895803841287225?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/2474895803841287225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=2474895803841287225' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2474895803841287225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/2474895803841287225'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2006/12/howto-scrub-itunes-drm-off-of-your.html' title='HOWTO scrub iTunes&apos; DRM off of your purchased music with QTFairUse'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-132451071096074701</id><published>2006-12-21T14:05:00.000-08:00</published><updated>2008-08-13T20:17:16.587-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Static IP'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Static IPs in Debian-based Linux</title><content type='html'>Here's a brief overview of how to set up an internet connection using a static &lt;a href="http://en.wikipedia.org/wiki/Ip_address"&gt;IP address&lt;/a&gt; on &lt;a href="http://en.wikipedia.org/wiki/Debian#Distributions_based_on_Debian"&gt;Debian-based Linux systems&lt;/a&gt;.  Most large networks nowadays use &lt;a title="DHCP" href="http://en.wikipedia.org/wiki/Dhcp"&gt;DHCP&lt;/a&gt; to get a user an IP address, but knowledge of static IP configuration can still be helpful in a lot of situations.  First, edit the &lt;span style="font-weight: bold;"&gt;/etc/network/interfaces &lt;/span&gt;file as a superuser so that the entry for the desired interface looks something like this (replace x's with numeric values):&lt;br /&gt;&lt;br /&gt;iface eth0 inet static # static, as opposed to dhcp... replace eth0 with desired interface&lt;br /&gt;    address xxx.xxx.xxx.xxx # ip address you want assigned to this computer&lt;br /&gt;    netmask xxx.xxx.xxx.xxx # subnet mask&lt;br /&gt;    network xxx.xxx.xxx.xxx # optional&lt;br /&gt;    broadcast xxx.xxx.xxx.xxx # optional&lt;br /&gt;    gateway xxx.xxx.xxx.xxx # gateway (usually router/firewall) ip address&lt;br /&gt;&lt;br /&gt;Once you have done this, restart your network interfaces with &lt;code style="font-weight: bold; font-family: times new roman;"&gt;sudo /etc/init.d/networking restart&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The gateway can also be specified on the command line if it's not in the interfaces file: &lt;span style="font-weight: bold;"&gt;sudo route add default gw xxx.xxx.xxx.xxx&lt;/span&gt;  The command &lt;span style="font-weight: bold;"&gt;netstat -nr&lt;/span&gt; can show the routes, including gateways, that the kernel is currently using.&lt;br /&gt;&lt;br /&gt;To explicitly release a dhcp connection, do something like &lt;span style="font-weight: bold;"&gt;dhclient -r eth0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If your computer and network is set up correctly, you should now be able to ping your gateway and access sites on the internet by IP address.  However, in order to access sites by name you need the help of &lt;a title="DNS" href="http://en.wikipedia.org/wiki/Dns"&gt;DNS&lt;/a&gt;.  Add entries to the  &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;/etc/&lt;/span&gt;resolv.conf &lt;/span&gt;file as a superuser in this format (you can have as many as you want):&lt;br /&gt;&lt;br /&gt;nameserver xxx.xxx.xxx.xxx&lt;br /&gt;&lt;br /&gt;Now, if you point your browser to a domain name like &lt;a title="www.yahoo.com" href="http://www.yahoo.com/"&gt;www.yahoo.com&lt;/a&gt;, you should be able to get there.  Welcome to t3h 1nt3rw3b.  You can also do all the above by accessing the &lt;span style="font-weight: bold;"&gt;System-&gt;Administration-&gt;Network&lt;/span&gt; menu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="HOWTO Basic Network Troubleshooting" href="http://ubuntuforums.org/showthread.php?t=25557"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;HOWTO&lt;/span&gt; Basic Network Troubleshooting&lt;/a&gt;   An &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Ubuntu&lt;/span&gt; Forums post about basic networking... check out the great script towards the bottom of the first page&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="HOWTO Ubuntu Linux convert DHCP network to static IP" href="http://www.cyberciti.biz/tips/howto-ubuntu-linux-convert-dhcp-network-configuration-to-static-ip-configuration.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;HOWTO&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Ubuntu&lt;/span&gt; Linux convert &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;DHCP&lt;/span&gt; network to static &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;IP&lt;/span&gt;&lt;/a&gt;   Explains how to do this, and much more, on the command line&lt;/li&gt;&lt;li&gt;&lt;a title="Ubuntu Networking for Basic and Advanced Users" href="http://www.debianadmin.com/ubuntu-networking-for-basic-and-advanced-users.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Ubuntu&lt;/span&gt; Networking for Basic and Advanced Users&lt;/a&gt;   A visual guide to using the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Ubuntu&lt;/span&gt; Networking GUI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="SearchNetworking.com" href="http://searchnetworking.techtarget.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SearchNetworking&lt;/span&gt;.com&lt;/a&gt; A good, general-purpose networking resource&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt; (in light of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;ubuntu&lt;/span&gt;-users &lt;a href="http://www.nabble.com/How-to-explicitly-drop-dynamic-network-connection-in-favor-of-static-one--t3811109.html"&gt;post and responses&lt;/a&gt;):&lt;br /&gt;For switching from one interface configuration to another (assuming &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;eth&lt;/span&gt;0 and correct /etc/network/interfaces):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;sudo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ifdown&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;eth&lt;/span&gt;0&lt;/li&gt;&lt;li&gt;edit /etc/network/interfaces&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;sudo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;ifup&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;eth&lt;/span&gt;0&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;SIOCDELRT: No such process&lt;/span&gt; means something is screwy.  You probably have the wrong number (i.e. gateway) somewhere.  Haven't determined exactly what this means.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-132451071096074701?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/132451071096074701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=132451071096074701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/132451071096074701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/132451071096074701'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2006/12/static-ips.html' title='Static IPs in Debian-based Linux'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30268243.post-4972595067621725315</id><published>2006-12-21T10:01:00.000-08:00</published><updated>2006-12-21T10:03:03.052-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kiba-dock'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>kiba-dock</title><content type='html'>kiba-dock (couldn't find the project page...) is an OSX-like dock that you can use to launch applications, and it also has some silly animations to go with it.  I installed it on Ubuntu Edgy Eft 6.10 using the instructions &lt;a title="here" href="http://www.ubuntuforums.org/showthread.php?t=268645"&gt;here&lt;/a&gt;.  As the poster mentions, it only works properly after you try and install the second time.  Strange, but it works.  If you're not running some fancy compositor-window manager like XGL/Compiz or AIGLX/Beryl, it might look pretty ugly (black boxes around everything, sometimes text doesn't show up, etc.).  I'm using Beryl and it looks fine.&lt;br /&gt;&lt;br /&gt;To use kiba-dock, drag icons onto the dock to be able to launch them from the dock.  kiba-dock is, of course, completely customizable (colors, position on screen, physics, etc.) so if it's not immediately to your taste, you can change it. &lt;br /&gt;&lt;br /&gt;To launch kiba-dock at startup go to &lt;span style="font-weight: bold;"&gt;System-&gt;Preferences-&gt;Sessions&lt;/span&gt; and under &lt;span style="font-weight: bold;"&gt;Startup Programs&lt;/span&gt; add &lt;span style="font-weight: bold;"&gt;kiba-dock&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here's a video of kiba-dock in all its glory:&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gi6D0sD5GdU"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gi6D0sD5GdU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30268243-4972595067621725315?l=chainlynx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chainlynx.blogspot.com/feeds/4972595067621725315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30268243&amp;postID=4972595067621725315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4972595067621725315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30268243/posts/default/4972595067621725315'/><link rel='alternate' type='text/html' href='http://chainlynx.blogspot.com/2006/12/kiba-dock.html' title='kiba-dock'/><author><name>Danny Colligan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></autho
