<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0IAR387eyp7ImA9WhVbEk8.&quot;"><id>tag:blogger.com,1999:blog-13322352</id><updated>2012-05-28T11:25:46.103-07:00</updated><category term="calendar" /><category term="guitar hero" /><category term="iron meadows" /><category term="sre" /><category term="dom" /><category term="sysadmin" /><category term="news" /><category term="organization" /><category term="apple" /><category term="wedding" /><category term="comics" /><category term="privacy" /><category term="art" /><category term="sidebar" /><category term="osx" /><category term="creativity" /><category term="sleep" /><category term="applescript" /><category term="firefox" /><category term="restraint" /><category term="summer" /><category term="iphone" /><category term="vigor" /><category term="dashcode" /><category term="jenny" /><category term="rss" /><category term="noogler" /><category term="emo" /><category term="freebsd" /><category term="alarm clock" /><category term="greasemonkey" /><category term="work" /><category term="opera" /><category term="baby wombats" /><category term="safari" /><category term="friends" /><category term="thor" /><category term="law" /><category term="schedule" /><category term="engineering" /><category term="webdav" /><category term="programming" /><category term="lcachefs" /><category term="holiday" /><category term="tattoo" /><category term="party" /><category term="games" /><category term="music" /><category term="geek" /><category term="blog" /><category term="move" /><category term="msie" /><category term="svg" /><category term="juniper" /><category term="sawzall" /><category term="Linux" /><category term="desk" /><category term="shakespeare" /><category term="statistics" /><category term="traffic" /><category term="reader" /><category term="ipv6" /><category term="google" /><title type="text">Stopwords</title><subtitle type="html">The rantings, ravings, musings, wisdom, and silliness of Piquan</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://stopwords.piquan.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Piquan</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>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/piquan/blog" /><feedburner:info uri="piquan/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nd/3.0/" /><feedburner:emailServiceId>piquan/blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpiquan%2Fblog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/piquan/blog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpiquan%2Fblog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><entry gd:etag="W/&quot;Dk8MQH4-eip7ImA9WhdUF00.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-2778757904461958938</id><published>2011-09-09T15:08:00.000-07:00</published><updated>2011-10-03T22:08:01.052-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T22:08:01.052-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><category scheme="http://www.blogger.com/atom/ns#" term="applescript" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><title>iChat, Growl, and Lion</title><content type="html">UPDATE: This script has been improved; the new version is now on&amp;nbsp;&lt;a href="https://github.com/Piquan/iChat-Growl"&gt;github&lt;/a&gt;.&lt;br /&gt;
UPDATE 2: Growl 1.3 was just released, so I've updated the script to work with 1.3. &amp;nbsp;If you were using this script and it broke with 1.3, then just download the updated version from the same place. &amp;nbsp;If you're still using Growl 1.2.2, you'll need to use &lt;a href="https://github.com/Piquan/iChat-Growl/blob/033f9a864390fee3d9d653ffc1da8159db7a66e7/Growl.applescript"&gt;the old version of this script&lt;/a&gt;. &amp;nbsp;All the rest of the instructions are the same regardless of which version of Growl you're using.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.apple.com/macosx/"&gt;Lion&lt;/a&gt; is the latest version of OS X. &amp;nbsp;&lt;a href="http://www.apple.com/macosx/apps/all.html#ichat"&gt;iChat&lt;/a&gt; is the chat program that's part of OS X. &amp;nbsp;&lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; is a system that lets all sorts of programs post little notification windows on your screen.&lt;br /&gt;
&lt;br /&gt;
For example, if you get a message in iChat while you're in another window, it's nice to have the message pop up on your screen so you can decide whether or not to switch windows to read it. &amp;nbsp;Or if a buddy logs in, it's nice to know about that (which can be done in iChat with an audio notification), and see who it is without having to check your buddy list.&lt;br /&gt;
&lt;br /&gt;
I used to use &lt;a href="http://www.ksuther.com/chax/"&gt;Chax&lt;/a&gt; for this. &amp;nbsp;Chax is a pretty good program, but when a new version of OS X comes out, it takes a little while to catch up. &amp;nbsp;The main reasons I use Chax are:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Accept text chat invitations without being prompted.&lt;/li&gt;
&lt;li&gt;Put all my buddies in the same window.&lt;/li&gt;
&lt;li&gt;Give me Growl notifications.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Everything but the Growl feature is now built into iChat in Lion. &amp;nbsp;(The auto-accept is an AppleScript that ships with Lion; you can turn that on in Preferences:Alerts. &amp;nbsp;The option for "Show all my accounts in one list" is in Preferences:General.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Chax isn't yet compatible with Lion, so I searched online and found &lt;a href="http://amccloud.com/lion-ichat-growl-notifications-50108"&gt;a little AppleScript program&lt;/a&gt; to do a bit of what I need. &amp;nbsp;Using the ideas from that, I expanded it a bit. &amp;nbsp;Goodbye Chax; I'll miss you!&lt;br /&gt;
&lt;br /&gt;
To use this:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Install&amp;nbsp;&lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt;, if you don't have it already.&lt;/li&gt;
&lt;li&gt;Visit&amp;nbsp;&lt;a href="https://github.com/Piquan/iChat-Growl/raw/master/Growl.applescript"&gt;https://github.com/Piquan/iChat-Growl/raw/master/Growl.applescript&lt;/a&gt; in your web browser. &amp;nbsp;(You can use the &lt;a href="https://github.com/Piquan/iChat-Growl/blob/master/Growl.applescript"&gt;formatted&lt;/a&gt;&amp;nbsp;page instead.)&lt;/li&gt;
&lt;li&gt;Open AppleScript Editor (in Applications:Utilities).&lt;/li&gt;
&lt;li&gt;Copy and paste the code from the web page into a new script.&lt;/li&gt;
&lt;li&gt;Save it to your home directory's Library:Scripts:iChat folder. &amp;nbsp;(I used the filename "Growl".) &amp;nbsp;The iChat folder might not exist; you need to create it. &amp;nbsp;By default, your Library folder is hidden. &amp;nbsp;(Personally, I solved that by saving to the desktop, and then I ran "open ~/Library/Scripts" in Terminal so that the Scripts window opened in Finder, and dragged my script there.)&lt;/li&gt;
&lt;li&gt;In iChat, open the Preferences.&lt;/li&gt;
&lt;li&gt;Under Alerts, select the "Message Received" event.&lt;/li&gt;
&lt;li&gt;Turn on "Run an AppleScript script:", and select the script you saved earlier.&lt;/li&gt;
&lt;li&gt;Repeat the last two steps for each event you're interested in.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Note that the "Message Received in Chat Room" (which is called "addressed message received" in the AppleScript) and "Invitation to Share Buddy's Screen" (a.k.a. "received remote screen sharing invitation") aren't currently enabled, since it looks like there may be a bug in iChat that will cause them to be confused with each other.&lt;br /&gt;
&lt;br /&gt;
If you use the Growl script for chat invitations, you can't also use the Auto-Accept script, since you can only select one script to be run. &amp;nbsp;Because of this, I've added an auto-accept capability to this Growl script. &amp;nbsp;By default, it's turned off, but you can turn it on. &amp;nbsp;Near the top of the program, there's a line that says:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font: 12.0px Verdana; margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; property&lt;/b&gt; &lt;span style="color: #279800;"&gt;autoAccept&lt;/span&gt; : {""}&lt;/div&gt;&lt;br /&gt;
Change this to:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font: 12.0px Verdana; margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; property&lt;/b&gt; &lt;span style="color: #279800;"&gt;autoAccept&lt;/span&gt; : {"text"}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Suggestions for improvements are welcome. &amp;nbsp;Share and enjoy!&lt;br /&gt;
&lt;br /&gt;
(If you expected the source code to be here in my blog, I've moved it. &amp;nbsp;See&amp;nbsp;&lt;a href="https://github.com/Piquan/iChat-Growl/raw/master/Growl.applescript"&gt;https://github.com/Piquan/iChat-Growl/raw/master/Growl.applescript&lt;/a&gt;&amp;nbsp;for my latest version.)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-2778757904461958938?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/WMdGN0dfmxA" height="1" width="1"/&gt;</content><link rel="related" href="https://github.com/Piquan/iChat-Growl" title="iChat, Growl, and Lion" /><link rel="enclosure" type="text/plain" href="https://github.com/Piquan/iChat-Growl/raw/master/Growl.applescript" length="0" /><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/2778757904461958938/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=2778757904461958938&amp;isPopup=true" title="33 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2778757904461958938?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2778757904461958938?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/WMdGN0dfmxA/ichat-growl-and-lion.html" title="iChat, Growl, and Lion" /><author><name>Piquan</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>33</thr:total><feedburner:origLink>http://stopwords.piquan.org/2011/09/ichat-growl-and-lion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IHSXs-eyp7ImA9WhZaGEg.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-7794791952443521986</id><published>2011-07-05T02:52:00.000-07:00</published><updated>2011-07-05T02:52:18.553-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T02:52:18.553-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="sysadmin" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><title>Copying a filesystem on Linux</title><content type="html">In the last two days, I've had to copy a filesystem on my Linux development VM four times (to grow it). &amp;nbsp;I eventually made a shell script for it, since I kept forgetting details (like the arguments to cpio). &amp;nbsp;Since I started this blog to have a place to publish random bits of information for future Google users, I'm putting the script here. &amp;nbsp;The script is below; you pass in the old device name (e.g., &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sda&lt;/span&gt;) as the first argument, and the new one (e.g., &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sdc&lt;/span&gt;) as the second.&lt;br /&gt;
&lt;br /&gt;
There's some significant assumptions in this script, and they may not be warranted for your system:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;It assumes that you have only one filesystem, and that's on the first partition of the disk. &amp;nbsp;(It's also easy to add a swap partition using &lt;a href="http://manpages.debian.net/cgi-bin/man.cgi?query=mkswap&amp;amp;sektion=8"&gt;mkswap&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;You're expected to use &lt;a href="http://tldp.org/HOWTO/Partition/fdisk_partitioning.html"&gt;fdisk&lt;/a&gt; to set up the new filesystem yourself. &amp;nbsp;(Linux is fs type 83; Linux swap is 82.)&lt;/li&gt;
&lt;li&gt;This builds an ext3 filesystem.&lt;/li&gt;
&lt;li&gt;It assumes that once you're finished, you'll be putting the new device into the old device's place; in other words, it doesn't try to replace &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sdc&lt;/span&gt; with &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sda&lt;/span&gt; in &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/etc&lt;/span&gt; files. &amp;nbsp;(If you're only using UUIDs in your &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;fstab&lt;/span&gt;, this probably doesn't matter.)&lt;/li&gt;
&lt;li&gt;It uses a default grub install, more or less. &amp;nbsp;If you're using LILO, or have got something funky going on, it might not carry over. &amp;nbsp;If you've customized your &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;grub.cfg&lt;/span&gt;, for example, it will get overwritten. &amp;nbsp;(However, changes in &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;grub.d&lt;/span&gt; are fine and will be reflected.)&lt;/li&gt;
&lt;li&gt;As used here, cpio will make sparse files out of non-sparse files. &amp;nbsp;Normally, this is a good thing, but some programs (such as BitTorrent clients) will intentionally build non-sparse files. &amp;nbsp;(It's ok to turn them sparse after the torrent completes, and it's only a fragmentation hit if they get turned into sparse before the torrent is done.)&lt;/li&gt;
&lt;li&gt;This uses a 64k I/O block size. &amp;nbsp;I'm doing that because that's the block size of the default QEMU backing store under qcow2. &amp;nbsp;(Remember, in my case, I'm doing this for a VM.) &amp;nbsp;I'm not sure if that helps anything or not (since the I/O goes through many layers between cpio and qcow), but it's not going to hurt anything. &amp;nbsp;However, you may want to replace the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-C65536&lt;/span&gt; with &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-B&lt;/span&gt; if you're using a normal disk.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
This script is better to learn from than to use directly. &amp;nbsp;But if you need to copy a filesystem (to grow it, move off a failing disk, defragment it (&lt;a href="http://www.tldp.org/LDP/sag/html/filesystems.html"&gt;rarely necessary on Linux&lt;/a&gt;), or whatever), this may give you a good starting point.&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#! /bin/sh&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;in=$1&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;out=$2&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;set -xe&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;fdisk /dev/${out}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mke2fs -j /dev/${out}1&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mount /dev/${out}1 /mnt&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;find / -xdev -depth -print0 | cpio -pdmV0a --sparse -C65536 /mnt&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;grub-install --root-directory=/mnt /dev/${out}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;perl -pi.bak -e s/$(blkid -o value -s UUID /dev/${in}1)/(blkid -o value -s UUID&amp;nbsp;/dev/${out}1)/g /mnt/etc/fstab /mnt/boot/grub/grub.cfg&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;umount /mnt&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
A few implementation comments:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;This makes a lot of assumptions (listed above) for simplicity. &amp;nbsp;Feel free to improve it.&lt;/li&gt;
&lt;li&gt;The &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-depth&lt;/span&gt; is so that find will print the directories after their contents, which will cause cpio to fix the modification time. &amp;nbsp;Otherwise, cpio will create the directory, change its mtime to match the original, and then add contents, thereby changing the directory's mtime to the current time.&lt;/li&gt;
&lt;li&gt;The Perl can be done by hand: it's changing the old filesystem's UUID to the new filesystem's UUID in &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;fstab&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;grub.cfg&lt;/span&gt;. &amp;nbsp;You can find out the IDs by running &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo blkid&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Note that the Perl line is long; be careful when copying it. &amp;nbsp;It spans from &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;perl&lt;/span&gt; to &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;grub.cfg&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Share and enjoy!&lt;br /&gt;
&lt;br /&gt;
PS: If you're wanting to grow a filesystem on the same disk (i.e., you've deleted the next partition and want to use its free space), there's &lt;a href="http://www.google.com/search?q=ext3+grow+filesystem"&gt;utilities to do that.&lt;/a&gt;&amp;nbsp;&amp;nbsp;This script is about moving to a different disk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="post-body entry-content" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;(Disclaimer: I release the above code to the public domain, as if the public actually wants it. &amp;nbsp;It's for education, and should be evaluated and customized before running it in any particular environment. &amp;nbsp;I provide no warranty, expressed or implied; if it breaks, you get to keep both pieces.)&lt;/span&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="post-footer" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.blogblog.com/tictac_blue/tictac_grey.gif); background-origin: initial; background-position: 0% 8px; background-repeat: no-repeat no-repeat; color: #999999; font-family: Verdana, sans-serif; font-size: 11px; line-height: 19px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 14px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-7794791952443521986?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/bcXqjmGOhYY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/7794791952443521986/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=7794791952443521986&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/7794791952443521986?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/7794791952443521986?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/bcXqjmGOhYY/copying-filesystem-on-linux.html" title="Copying a filesystem on Linux" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2011/07/copying-filesystem-on-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNRXw4fSp7ImA9WhZQGE0.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-2203196094888672246</id><published>2011-04-26T00:46:00.000-07:00</published><updated>2011-04-26T01:23:14.235-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-26T01:23:14.235-07:00</app:edited><title>iPhone location log to Google Earth, all with shell commands</title><content type="html">If you're a privacy geek, then you've no doubt heard people talking about a file on the iPhone called &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://www.google.com/search?q=consolidated.db"&gt;consolidated.db&lt;/a&gt;&lt;/span&gt;. &amp;nbsp;This file stores all the places your phone has been.&lt;br /&gt;
&lt;br /&gt;
I don't know why everybody is making such a fuss about it. &amp;nbsp;I expect my own computers (including my phone) to store logs of what I'm doing. &amp;nbsp;It's good to be able to reset this information before I give a device to somebody else, and hey, the iPhone has a comprehensive reset function!&lt;br /&gt;
&lt;br /&gt;
I think the concern is that the phone is sending this to Apple periodically. &amp;nbsp;That would be a very serious concern. &amp;nbsp;But until somebody gives any sort of evidence to that effect, I think it's just a badly-managed log file.&lt;br /&gt;
&lt;br /&gt;
Anyhow.&lt;br /&gt;
&lt;br /&gt;
Yesterday, I saw that I had apparently bought a song on my iPhone that I didn't recognize. &amp;nbsp;I listened to it, and it didn't sound familiar. &amp;nbsp;It also didn't sound like something I'd buy. &amp;nbsp;After a couple of blind alleys, I checked the purchase date in iTunes. &amp;nbsp;I then correlated that to&amp;nbsp;&lt;a href="https://www.google.com/latitude/b/0/history/manage"&gt;Google Latitude's history&lt;/a&gt;. &amp;nbsp;Ah, it was a mall in Santa Cruz. &amp;nbsp;Now I remembered:&amp;nbsp;the reason I went into the mall was to get a lemonade at Starbucks, and while I was there my friend gave me one of the vouchers that Starbucks has for a free iTunes song.&lt;br /&gt;
&lt;br /&gt;
While I was relaying this story to another friend, he asked if I'd used consolidated.db to read it. &amp;nbsp;Nope, but not a bad idea. &amp;nbsp;I started wondering what was actually in there. &amp;nbsp;Most stuff I saw to read that requires me to download some stranger's code, and I wasn't too thrilled about that.&lt;br /&gt;
&lt;br /&gt;
OS X and iOS tend to use &lt;a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html%23//apple_ref/doc/uid/10000048i-CH3-SW2"&gt;property lists&lt;/a&gt; and &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;&amp;nbsp;for all kinds of storage, so I'd guessed it was SQLite. &amp;nbsp;That meant that it could be read from the command line using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sqlite3&lt;/span&gt; utility, which is part of OS X.&lt;br /&gt;
&lt;br /&gt;
So, without further ado, here's a quick rundown on how to look at all this stuff straight from the command line. &amp;nbsp;There's one bit of Perl to convert it to Google Earth's &lt;a href="http://code.google.com/apis/kml/documentation/kmlreference.html"&gt;KML&lt;/a&gt; format, but the Perl really isn't necessary to view the data in lat/long format. &amp;nbsp;Note that making use of the following requires a certain degree of technical savvy; knowing SQL is going to be very useful to fiddle with the data. &amp;nbsp;However, you don't need to know anything about OS X (except how to start the terminal), iPhone development, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# Get the current time in the format used by the database (Apple's CFAbsoluteTime, which is the number of seconds since Jan 1, 2001 at midnight GMT; we use UTC instead of GMT here, but it's close enough for these purposes):&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ perl -MTime::Local -e 'print time() + timegm(0,0,0,1,0,70) - timegm(0,0,0,1,0,101), "\n"'&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;325464777&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Go to the backups&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ cd ~/Library/Application\ Support/MobileSync/Backup/&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Go to the most recent backup&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ cd $( ls -t | head -1 )&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # The files in here are named (almost) randomly.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Get the database's filename by looking at table lists of all of the SQLite databases and finding one that has CellLocation&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # (This prints the filename and leaves it in $db)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ for db in $( file * | sed -e '/SQLite/ !d' -e 's/:.*//' ) ; do sqlite3 $db .tables | grep -q CellLocation &amp;amp;&amp;amp; echo $db &amp;amp;&amp;amp; break ; done&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;4096c9ec676f2847dc283405900e284a7c815836&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Your filename will be different; it's based on a hash of the data.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # View the file&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ sqlite3 $db&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; -- Take a look at the schema of CellLocation&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sqlite&amp;gt; schema CellLocation&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CREATE TABLE CellLocation (MCC INTEGER, MNC INTEGER, LAC INTEGER, CI INTEGER, Timestamp FLOAT, Latitude FLOAT, Longitude FLOAT, HorizontalAccuracy FLOAT, Altitude FLOAT, VerticalAccuracy FLOAT, Speed FLOAT, Course FLOAT, Confidence INTEGER, PRIMARY KEY (MCC, MNC, LAC, CI));&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; -- (That will also print a few other tables that you can ignore.)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; -- View the contents of the past week (this uses the time computed at the beginning of this walkthrough; 604800 is the number of seconds in a typical week)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sqlite&amp;gt; select latitude,longitude,timestamp from CellLocation where timestamp &amp;gt; 325464777 - 604800 order by timestamp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; -- Back to the shell&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sqlite&amp;gt; .exit&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Put the data through Perl to convert to KML&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ sqlite3 $db "select longitude,latitude,timestamp from CellLocation where timestamp &amp;gt; 325464777 - 1209600 order by timestamp, horizontalAccuracy" | perl -nw -MPOSIX -MTime::Local -e 'BEGIN { our $LTS=0; print "&lt;kml xmlns:gx="\&amp;quot;http://www.google.com/kml/ext/2.2\&amp;quot;" xmlns="\&amp;quot;http://www.opengis.net/kml/2.2\&amp;quot;"&gt;&lt;document&gt;&lt;placemark&gt;&lt;gx:track&gt;\n";} next if /^[0.]+\|[0.]+\|/; my ($long, $lat, $tstamp) = split /\|/; next if $tstamp==$LTS; $LTS=$tstamp; my @time = gmtime($tstamp - timegm(0,0,0,1,0,70) + timegm(0,0,0,1,0,101)); my $tstr = strftime("%Y-%m-%dT%H:%M:%SZ", @time); print "&lt;when&gt;$tstr&lt;/when&gt;&lt;gx:coord&gt;$long $lat 0&lt;/gx:coord&gt;\n"; END { print "&lt;/gx:track&gt;&lt;/placemark&gt;&lt;/document&gt;&lt;/kml&gt;"; } ' &amp;gt; ~/Desktop/locations.kml&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; # Open it in Google Earth&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ open ~/Desktop/locations.kml&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
If you're trying to make sense of the Perl (particularly the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$LTS&lt;/span&gt; bit), note that each timestamp tends to have several locations with varying precisions. &amp;nbsp;I'm not sure whether that's a triangulation of the user's position, or of the cells the user was able to communicating with, but I suspect it's increasingly precise triangulations of the position that are recorded with the same timestamp. &amp;nbsp;This code will use the first recorded position for each timestamp, which (because of the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ORDER BY&lt;/span&gt; clause) is going to be the one with the smallest &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;horizontalAccuracy&lt;/span&gt;. &amp;nbsp;I'm currently supposing that the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;horizontalAccuracy&lt;/span&gt; column is actually the precision radius.&lt;br /&gt;
&lt;br /&gt;
I also played with using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;WifiLocation&lt;/span&gt; table (which is similar), but it seems to be pretty unreliable data; it seems to include data based on one database that's about 10 miles too far north. &amp;nbsp;(At least, in my case, it kept showing me jumping abruptly between Santa Clara / Sunnyvale and Fremont. &amp;nbsp;I haven't been on the Fremont side of the bay in over a month.) &amp;nbsp;I read online that Verizon customers need to use &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CdmaCellLocation&lt;/span&gt; instead of &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CellLocation&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you're a potential employer, please note that the Perl above was thrown together for my own experimenting. &amp;nbsp;I just put it here on the blog in case somebody else wanted to fiddle with it, and it's not at all what I'd put into production.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Well, that's about all the time I felt like putting into decoding that file. &amp;nbsp;Feel free to post improvements in the comments section below. &amp;nbsp;Share and enjoy!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;(Disclaimer: I release the above code to the public domain, if you care. &amp;nbsp;It's for education, and is not intended to run in any particular environment. &amp;nbsp;I provide no warranty, expressed or implied; if it breaks, you get to keep both pieces.)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-2203196094888672246?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/E-nyXOZP4vI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/2203196094888672246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=2203196094888672246&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2203196094888672246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2203196094888672246?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/E-nyXOZP4vI/reading-iphone-location-log.html" title="iPhone location log to Google Earth, all with shell commands" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2011/04/reading-iphone-location-log.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMFQHg5cSp7ImA9WhZTE04.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-648347159939176090</id><published>2011-03-16T19:53:00.000-07:00</published><updated>2011-03-16T19:53:31.629-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-16T19:53:31.629-07:00</app:edited><title>Magic GarageBand Chords</title><content type="html">&lt;style type="text/css"&gt;/*&lt;![CDATA[*/
/* The comments are there to allow this to be parsed as HTML or XHTML. */

table.chords {
    table-layout: auto;
    border-spacing: 0px;
    border: 1px solid black;
    empty-cells: hide;
    background: #ddd;
}
table.chords th, table.chords td {
    /* General */
    border-left: 1px solid #ddd;
    border-right: 1px solid #ddd;
    border-top: none;
    border-bottom: 1px solid #ddd;
    margin: 0px;
    padding-top: 0.2em;
    padding-bottom: 0.2em;
    background: white;
    vertical-align: baseline;
}
table.chords &gt; tbody &gt; tr &gt; th:first-child {
    /* Verse */
    width: auto;
    min-width: 5em;
    padding-left: 0.3em;
    padding-right: 0.3em;
}
table.chords &gt; tbody &gt; tr &gt; th:first-child + th {
    /* Measure */
    width: 2em;
    text-align: right;
    padding-left: 0.3em;
    padding-right: 0.3em;
}
table.chords &gt; tbody &gt; tr &gt; td {
    /* Chords (and comments, if not overridden) */
    border-left: none;
    border-right: none;
    border-top: none;
    border-bottom: 1px solid #ddd;
    padding-left: 0.5em;
    padding-right: 0.5em;
    width: auto;
    min-width: 2em;
}
table.chords &gt; tbody &gt; tr &gt; th:first-child + th + td + td + td + td + td,
table.chords &gt; tbody &gt; tr &gt; .chord-comment {
    /* Comments */
    border-left: 1px solid #ddd;
    border-right: 1px solid #ddd;
    padding-left: 1em;
    padding-right: 1em;
    width: auto;
    min-width: 3em;
    empty-cells: show;
    vertical-align: middle;
}

span.chordadd {
    vertical-align: super;
    font-size: .83em;
}
span.chordsub {
    vertical-align: sub;
    font-size: .83em;
}

span.timesig-num {
    vertical-align: super;
    font-size: .83em;
}
span.timesig-denom {
    vertical-align: sub;
    font-size: .83em;
}
/*]]&gt;*/&lt;/style&gt;&lt;br /&gt;
&lt;h1&gt;Magic GarageBand Chords&lt;/h1&gt;&lt;p&gt;I sat down to practice my guitar by improvising along with GarageBand's "Magic GarageBand" feature.  This handy feature lets you put together a five-piece band from a wide selection of instruments and styles, which will play a song in a genre of your choosing.  You can accompany them (using a mic, MIDI instrument, or DI from a guitar or other instrument), and record the result.  By choosing the instruments and styles, you can get very different-sounding songs.&lt;/p&gt;&lt;p&gt;This is great if you want to jam but don't have a band with you at the moment.  But, there's one bit of information that's missing.&lt;/p&gt;&lt;p&gt;In order to accomplish this mix-and-match, each genre (of the nine possibilities) plays the same basic chord changes.  The individual parts riff all over those, but since they're following the same basic pattern, you get a good harmony.  This is handy information to know if you're trying to play along!  All of these have pretty straightforward patterns, but it's a lot easier to know the changes ahead of time.&lt;/p&gt;&lt;p&gt;Regrettably, I wasn't able to keep up with the chord changes when I sat down to play the other day.  I went online to find them, but couldn't find anybody who had written them down for the world to see.All Google brought me is other people looking for the changes.&lt;/p&gt;&lt;p&gt;Hence, today's post: the chord changes for all nine genres in Magic GarageBand.  If you have any suggestions for improvements, let me know!  (I mean, something that makes this list closer to what GarageBand actually plays.  I'm not looking for improvements to the songs; talk to Apple about that!)&lt;/p&gt;&lt;h2&gt;Blues (E, 90bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;When you create the GarageBand project, it says the song is in B,but it's really in E.  The loops are also in the wrong key, which can lead to surprises if you try to use them in your own project!&lt;/p&gt;&lt;p&gt;Other than that, there's really no surprises here.  This is a moderate tempo 12-bar blues, which is probably what you were expecting here.  There's not even a real intro or outro.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;    
&lt;tr&gt;&lt;th&gt;Intro&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;td/&gt;&lt;td/&gt;&lt;td&gt;Pickup; can use A as well.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt;2&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;6&lt;/th&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Verse 3&lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th/&gt;&lt;th&gt;34&lt;/th&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td/&gt;&lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;!--INTRO    [ 1] E          Pickup; can use A as well.VERSE 1  [ 2] E  E  E  E         [ 6] A  A  E  E         [10] B  A  E  EVERSE 2  [14] E  E  E  E         [18] A  A  E  E         [22] B  A  E  EVERSE 3  [26] E  E  E  E         [30] A  A  E  E         [34] B  A  E  E--&gt;&lt;br /&gt;
&lt;h2&gt;Rock (D, 140bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;table class="chords"&gt;&lt;tbody&gt;    &lt;tr&gt;&lt;th&gt;Intro    &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Verse 1  &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;A &lt;/td&gt;&lt;td&gt;A &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Chorus   &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;Bm&lt;/td&gt;&lt;td&gt;Bm&lt;/td&gt;&lt;td&gt;E &lt;/td&gt;&lt;td&gt;E &lt;/td&gt;&lt;td&gt;Remodulating in the chorus.  Can use G♯° instead of E.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;A &lt;/td&gt;&lt;td&gt;A &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Verse 2  &lt;/th&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;34&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;38&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;42&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;Ending   &lt;/th&gt;&lt;th&gt;46&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;50&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;&lt;th&gt;         &lt;/th&gt;&lt;th&gt;53&lt;/th&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;D &lt;/td&gt;&lt;td&gt;Sustained fade&lt;/td&gt;&lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Jazz (F, 164bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;This is similar to the 12-bar blues progression, but with a more jazzy twist to the chords actually being used.&lt;/p&gt;&lt;p&gt;The basic idea is still the 12 bar pattern F / F / F / F / B♭ / B♭/ F / F / B♭ / C / F / F.  However, there's some changes that are often used:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The B♭ (IV) is often played as D° (vi°)&lt;/li&gt;  &lt;li&gt;The F is often played as an F&lt;span class="chordadd"&gt;7&lt;/span&gt;,      particularly in long stretches.&lt;/li&gt;  &lt;li&gt;Bars 7–8 and 11–12 (of the 12-bar pattern) are usually played to      walk into the next phrase (changing chords every two beats)      instead of being played straight.  In particular, bar 8 is      &lt;em&gt;very&lt;/em&gt; rarely played as an F, but if you're improvising      over an F you'll still be fine.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First, here's the basic pattern:&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt; 5&lt;/th&gt;&lt;td&gt;B♭&lt;/td&gt;&lt;td&gt;B♭&lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt; 9&lt;/th&gt;&lt;td&gt;B♭&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Now, here's the pattern as I've interpreted it.  As I said, there's a lot of possibilities here.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro   &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;-  &lt;/td&gt;&lt;td&gt;   &lt;/td&gt;&lt;td&gt;   &lt;/td&gt;&lt;td&gt;   &lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Head    &lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;May substitute F for F&lt;span class="chordadd"&gt;7&lt;/span&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;        &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;D°&lt;/td&gt;&lt;td&gt;D°&lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;C; D&lt;/td&gt;&lt;td&gt;Not sure about this phrase.  May substitute B♭ or even Fm&lt;span class="chordadd"&gt;6&lt;/span&gt; for D°.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;        &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;Gm &lt;/td&gt;&lt;td&gt;C  &lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt;; F&lt;/td&gt;&lt;td&gt;B♭; C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Chorus 1&lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;D°&lt;/td&gt;&lt;td&gt;F  &lt;/td&gt;&lt;td&gt;F  &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;        &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;D°&lt;/td&gt;&lt;td&gt;D°&lt;/td&gt;&lt;td&gt;F&lt;span class="chordadd"&gt;7&lt;/span&gt; &lt;/td&gt;&lt;td&gt;C; D&lt;/td&gt;&lt;td&gt;Some of the accompaniments can get a bit muddied in the chords here.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;        &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;B♭ &lt;/td&gt;&lt;td&gt;Gm; C&lt;/td&gt;&lt;td&gt;F; F&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;B♭; C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Chorus 2&lt;/th&gt;&lt;td class="chord-comment" colspan="6" rowspan="3"&gt;Too tired to transcribe these; it's jazz, so just get the idea from the pattern I've done so far.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Chorus 3&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Head Out&lt;/th&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Country (G, 100bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;Another 12-bar blues progression, played pretty much straight this time.  (In case you haven't gotten the picture, 12-bar blues is great for improvising over, so it's used a lot in Magic GarageBand.)&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;If you want to keep up with the lead-in for the last bar, it's D / C / Bm / Am&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 3&lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;34&lt;/th&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;Same lead-in as the end of verse 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Ending &lt;/th&gt;&lt;th&gt;38&lt;/th&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;Sustained fade&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Reggae (C min, 75bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;I don't really know reggae, so this may be totally off.  I've marked it as C minor, even though when you create the project GarageBand lists it as C major.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;- &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;A♭; Gm&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;A♭; Gm&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Chorus &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;B♭m; A♭&lt;/td&gt;&lt;td&gt;A♭; E♭&lt;/td&gt;&lt;td&gt;B♭m; A♭&lt;/td&gt;&lt;td&gt;A♭; E♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;B♭m; A♭&lt;/td&gt;&lt;td&gt;A♭; E♭&lt;/td&gt;&lt;td&gt;B♭m; A♭&lt;/td&gt;&lt;td&gt;A♭; E♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;A♭; Gm&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;A♭; Gm&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Sustain from last note&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Funk (C, 120bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;Also really not sure how accurate this one is.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;Cm&lt;/td&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 5&lt;/th&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td rowspan="2"&gt;If it's too monotonous, you can make the first and third bars F; C (two beats each)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 9&lt;/th&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;13&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;17&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;Em&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;You can use a G for the Em&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Bridge &lt;/th&gt;&lt;th&gt;21&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;25&lt;/th&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;F &lt;/td&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;29&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;Fermata from bar 28&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;34&lt;/th&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Ending &lt;/th&gt;&lt;th&gt;38&lt;/th&gt;&lt;td&gt;G&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;G&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;42&lt;/th&gt;&lt;td&gt;G&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;G&lt;span class="chordadd"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;46&lt;/th&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Latin (Fm, 98bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;This is pretty simple.  There's just one pattern: Fm, E♭, D♭, C,for two beats each.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;Fm   &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Bridge &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;Fm   &lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;Fm   &lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;Fm   &lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;Fm&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 3&lt;/th&gt;&lt;th&gt;32&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;36&lt;/th&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;Fm,E♭&lt;/td&gt;&lt;td&gt;D♭,C&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;40&lt;/th&gt;&lt;td&gt;Fm   &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Roots Rock (G, 76bpm, &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;Not really sure what distinguishes the chorus from the verse, but it could just be the instruments I picked don't really do much differently.  This is a simple pattern, but has a lot of room for improvisation.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Chorus &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Bridge &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;Em&lt;/td&gt;&lt;td&gt;Bm&lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;Em&lt;/td&gt;&lt;td&gt;Bm&lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;26&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;30&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;Am&lt;/td&gt;&lt;td&gt;C &lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Outro  &lt;/th&gt;&lt;th&gt;34&lt;/th&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;G &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Slow Blues (A♭, 88bpm, &lt;span class="timesig-num"&gt;12&lt;/span&gt;/&lt;span class="timesig-denom"&gt;8&lt;/span&gt;)&lt;/h2&gt;&lt;p&gt;Wow, there IS something other than &lt;span class="timesig-num"&gt;4&lt;/span&gt;/&lt;span class="timesig-denom"&gt;4&lt;/span&gt; in here!  Unsurprisingly, it &lt;em&gt;is&lt;/em&gt; still 12-bar blues, although with a IV in the second bar to keep it interesting.&lt;/p&gt;&lt;table class="chords"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Intro  &lt;/th&gt;&lt;th&gt; 1&lt;/th&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Pickup&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 1&lt;/th&gt;&lt;th&gt; 2&lt;/th&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt; 6&lt;/th&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;10&lt;/th&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Verse 2&lt;/th&gt;&lt;th&gt;14&lt;/th&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;18&lt;/th&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;       &lt;/th&gt;&lt;th&gt;22&lt;/th&gt;&lt;td&gt;E♭&lt;/td&gt;&lt;td&gt;D♭&lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Ending &lt;/th&gt;&lt;th&gt;24&lt;/th&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;A♭&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;The measure breaks are hinky&lt;!--; it's a &lt;i&gt;rallentando&lt;/i&gt; (or &lt;i&gt;tempo rubato&lt;/i&gt; in its purest form)--&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-648347159939176090?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/ALO2MVNb5a4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/648347159939176090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=648347159939176090&amp;isPopup=true" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/648347159939176090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/648347159939176090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/ALO2MVNb5a4/magic-garageband-chords.html" title="Magic GarageBand Chords" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2011/03/magic-garageband-chords.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8CRHY6fyp7ImA9Wx9XFUs.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-1737108221140655039</id><published>2011-01-08T19:43:00.000-08:00</published><updated>2011-01-09T01:04:25.817-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-09T01:04:25.817-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="freebsd" /><category scheme="http://www.blogger.com/atom/ns#" term="sysadmin" /><category scheme="http://www.blogger.com/atom/ns#" term="ipv6" /><title>Imminent Death of the Net Predicted</title><content type="html">&lt;div style="float: right;"&gt;&lt;script src="http://ipv6.he.net/v4ex/sidebar.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;/div&gt;I didn't know that it was coming this soon, but in mid-February, the Internet will run out of addresses.&lt;br /&gt;
&lt;br /&gt;
My blog post's title is a bit tongue-in-cheek. People have been talking about the net not being able to handle the growth rate for decades. The address space exhaustion is going to take some work to deal with, but it's not going to cause things to grind to a halt.&lt;br /&gt;
&lt;br /&gt;
There's already some great resources to explain this to people who don't know about the problem:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;You can get an app for your smartphone, blog, etc that shows the countdown from &lt;a href="http://ipv6.he.net/statistics/"&gt;Hurricane Electric's IPv6 page&lt;/a&gt;. (Hurricane Electric is a very IPv6-friendly ISP. If you're a technical person, they can set you up with a free tunnel.)&lt;/li&gt;
&lt;li&gt;ABC wrote a story, &lt;a href="http://abcnews.go.com/Technology/story?id=3445885"&gt;"IP address shortage to limit Internet access"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A slightly more technical, but still pretty accessible, FAQ is on &lt;a href="http://www.potaroo.net/ispcol/2010-09/exhaustguide.html"&gt;Geoff Huston's blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Of course, Wikipedia has a page on &lt;a href="http://en.wikipedia.org/wiki/IPv4_address_exhaustion"&gt;IPv4 address exhaustion&lt;/a&gt; for all the backgroundy stuff that Wikipedia tends to have.&lt;/li&gt;
&lt;/ul&gt;What I couldn't find is an answer to my friend's question, "What will happen when we run out?" Nobody knows for sure, but here's a basic rundown.&lt;br /&gt;
&lt;br /&gt;
Internet addresses are globally administered by IANA. They give blocks of addresses to the regional groups, RIRs. These cover continent-sized areas, like Europe, Asia/Pacific, North America, etc. The RIRs give blocks to the local registries (LIRs), which are usually large ISPs, but may also be large organizations (like Stanford, although that's mostly because they were one of the first places on the Internet).&lt;br /&gt;
&lt;br /&gt;
Once IANA runs out (which is the event in February), then the individual regions can't get more addresses. The first to run out will be APNIC (Asia/Pacific), in about eight months or so (we're guessing; nobody can be sure). Then APNIC won't be able to give out new addresses to its LIRs. When an LIR can't get new addresses, it can't attach new customers. Its customers are mostly small ISPs or companies.&lt;br /&gt;
&lt;br /&gt;
So there's a trickle in the "supply chain" before things get to the end users. You won't see problems until it gets down to this level, although you may see some changes as ISPs hurriedly try to prepare (with IPv6; I'll get to that in a minute).&lt;br /&gt;
&lt;br /&gt;
Once a small ISP runs out, then it can't put new servers on the Internet: that means no new web servers, no new mail servers, nothing. (To a limited degree, it's possible to piggyback these on existing servers in some cases.) The ISP can attach new home customers (who don't use servers) for a little while, but if they attach too many, then people won't be able to connect. (A home ISP tends to hand out addresses for two hours at a time, as long as the customer's router or computer is on.)&lt;br /&gt;
&lt;br /&gt;
At that point, to deal with that, they'll probably start putting large blocks of home customers behind NATs. NATs let several computers use the same IP address. However, you can't have a server behind a NAT, it can be unreliable, and a lot of games, video or voice chat programs, file-sharing programs, etc. don't behave well with NAT. Because APNIC is running out of addresses, much of Russia and China are already behind regional NATs.&lt;br /&gt;
&lt;br /&gt;
There's also a possibility that organizations will start trading small blocks of IP addresses. (Nobody "owns" them; they're allocated by IANA.) However, routers will have a hard time keeping up with that (a router is designed to think in large blocks, and lots of tiny blocks can be a problem); this might make the Internet more flaky.&lt;br /&gt;
&lt;br /&gt;
I don't really know how the situation is going to be for end users. There'll be some hiccups, but it'll probably come down to just a little bit of reconfiguration; your ISP will tell you to do it, and you'll have some notice. If you've got a particularly old router, you may end up having to replace it.&lt;br /&gt;
&lt;br /&gt;
Ultimately, the solution is to go to IPv6. This has a lot more addresses: 3.4x10^28; that's enough for every gram of matter on Earth to have 10 addresses. (The current mechanism, IPv4, has about 4 billion addresses.) However, IPv6 adoption has been slow, because customers aren't asking for it. Most devices support IPv6, but some don't. Not many websites are currently equipped for IPv6; you have to have IPv4.&lt;br /&gt;
&lt;br /&gt;
I migrated my home network to IPv6 yesterday, and it was a breeze. Right now it's just to get a dancing turtle on &lt;a href="http://www.kame.net/"&gt;Kame's website&lt;/a&gt;, but I recommend that my techie friends with a home network do the migration. Even though your ISP probably doesn't provide IPv6 connectivity, there's still peers all over the place that'll give you tunnels.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="float: right;"&gt;&lt;a href="http://ipv6.he.net/certification/scoresheet.php?pass_name=piquan" target="_blank"&gt;&lt;img alt="IPv6 Certification Badge for piquan" border="0" height="194" src="http://ipv6.he.net/certification/create_badge.php?pass_name=piquan&amp;amp;badge=2" width="250" /&gt;&lt;/a&gt;&lt;/div&gt;For the technically-minded among us,I actually did the migration twice: once using 6to4 for connectivity with the Anycast2002:c058:6301:: peer for 6to4. Then, I did it again using a tunnel (using FreeBSD's gif interface, which also works on OS X) that I got for free from &lt;a href="http://tunnelbroker.net/"&gt;Hurricane Electric's website&lt;/a&gt;. The tunnel is faster (23ms ping time vs the 6to4 peer's 96ms), and their website walks you through the process; it's got easy instructions for Windows, OS X, Linux, BSD, or whatever else you've got.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-1737108221140655039?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/ssr_CiwfS8w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/1737108221140655039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=1737108221140655039&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/1737108221140655039?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/1737108221140655039?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/ssr_CiwfS8w/imminent-death-of-net-predicted.html" title="Imminent Death of the Net Predicted" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2011/01/imminent-death-of-net-predicted.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUENQ3w9fSp7ImA9Wx5XGEs.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-107470133684042031</id><published>2010-08-17T20:06:00.000-07:00</published><updated>2010-09-18T20:41:32.265-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-18T20:41:32.265-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dashcode" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Dealing With Dashcode, Part 4: Dashcode and Debugging</title><content type="html">UPDATE: As Todd points out in a comment, the bug described here has been fixed in 3.2.4. &amp;nbsp;That's now out of beta, and registered developers can &lt;a href="http://developer.apple.com/technologies/xcode.html"&gt;download it from Apple&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
(This is a continuation of a &lt;a href="http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-3-dashcode.html%22"&gt;previous post&lt;/a&gt;. You may want to read the &lt;a href="http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-1.html"&gt;first post&lt;/a&gt; in this series for an overview of the architecture.)&lt;br /&gt;
&lt;br /&gt;
The last problem I'm blogging about is actually the first one that I encountered.  It's also what first inspired me to write this "Dealing With Dashcode" series of posts.&lt;br /&gt;
&lt;br /&gt;
Early on in my development process, I made sure that I had the latest XCode installed (3.2.3), which is the iOS 4 development environment; my app is targeting iOS 4 on iPhone 3GS and 4. &amp;nbsp;The iOS SDK includes the iPhone Simulator, with environments for iOS 3.2 on the iPad, and iOS 4 on the iPhone 3GS and iPhone 4.&lt;br /&gt;
&lt;br /&gt;
Dashcode comes with a quite handy JavaScript debugger. &amp;nbsp;Since Mobile Safari's built-in developer support is fairly scant (you can globally turn on and off console logging), having a JavaScript debugger is really handy. &amp;nbsp;The JavaScript debugger works against Mobile Safari in the simulator: when you're running your program in the iPhone Simulator, you can use breakpoints, inspection, single-stepping, etc. from within Dashcode's debugger. &amp;nbsp;Nice, huh? &amp;nbsp;Too bad it doesn't work.&lt;br /&gt;
&lt;br /&gt;
Here's what I've been able to work out. &amp;nbsp;Dashcode implements this debugger by loading an extra framework into Mobile Safari when it launches. &amp;nbsp;When you click the "Run" button, Dashcode launches Mobile Safari with some extra arguments to load a framework called CayenneClientDebugger (which is within the Dashcode executable). &amp;nbsp;It looks like Mobile Safari (as well as the Browser Simulator that's part of Dashcode's Safari targeting) has hooks to load this framework for some debugging usage. &amp;nbsp;The debugger UI that's built into Dashcode communicates with the debugger backend loaded in Mobile Safari.&lt;br /&gt;
&lt;br /&gt;
(By the way: I looked online to see if I could find any references to this Cayenne. &amp;nbsp;There's an Apache project named Cayenne, but it seems unrelated. &amp;nbsp;I suspect that Cayenne was the internal codename for Dashcode; it looks like the bulk of Dashcode is implemented in a framework called CYKit.)&lt;br /&gt;
&lt;br /&gt;
Now, here's the catch. &amp;nbsp;iOS 4 uses a different ABI than 3.x did. &amp;nbsp;It looks like the CayenneClientDebugger is built for the old version. &amp;nbsp;Mobile Safari refuses to load it, so instead of a debugger, all you get is a message in system.log.&lt;br /&gt;
&lt;br /&gt;
I tried to cherry-pick a few bits of XCode from a backup I had from before I upgraded it. &amp;nbsp;I tried copying iPhoneSimulator3.0.sdk into the current installation, and although the iPhone Simulator would display the 3.0 version in its Version menu, if I tried to actually select it, then the Simulator would crash. &amp;nbsp;I tried a few other combinations of replacing the Simulator, CayenneClientDebugger, and even all of Dashcode, but couldn't get anything really going. &amp;nbsp;I probably could back out the entire XCode installation, but that's a bit far.&lt;br /&gt;
&lt;br /&gt;
As it was, I never did solve this problem. &amp;nbsp;I just made a lot of use of console.log for debugging purposes. &amp;nbsp;If I needed something more than I could get that way, then I'd use Safari (the OS X one); I could load my webpage there and use Safari's built-in development tools. &amp;nbsp;The most signifiant bit of UI I was using for this app (StackLayout; it's essentially a nested list that you navigate one level at a time) doesn't actually work in Safari — only Mobile Safari — but I could still test little bits in some ways. &amp;nbsp;It was enough for me to finish coding.&lt;br /&gt;
&lt;br /&gt;
I haven't looked into the 4.1 SDK yet (as of this writing it's in beta and has limited availability); I hope that Apple's fixed this problem. &amp;nbsp;Not having access to a debugger makes Mobile Safari development a bit tricky.&lt;br /&gt;
&lt;br /&gt;
By the way: there are a few options out there. &amp;nbsp;The best of these seems to be "&lt;a href="http://www.joehewitt.com/blog/firebug_for_iph.php"&gt;Firebug for iPhone&lt;/a&gt;". &amp;nbsp;Don't get your hopes up, though: it's not &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;&amp;nbsp;(the must-have development tool for Firefox). &amp;nbsp;It's not even close. &amp;nbsp;Firebug for iPhone mostly just relays console messages to your server, and lets you send commands to the browser. &amp;nbsp;While this is very useful, it's still not a substitute for a full JavaScript debugger. &amp;nbsp;(I considered writing something similar, using AJAX to relay messages between my code and a program running on my server.)&lt;br /&gt;
&lt;br /&gt;
IBM has an article on using &lt;a href="http://www.aptana.com/"&gt;Aptana&lt;/a&gt;&amp;nbsp;(a webapp development system for &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;)&amp;nbsp;while developing iPhone web apps. &amp;nbsp;It's entitled "&lt;a href="http://www.ibm.com/developerworks/opensource/tutorials/os-eclipse-iphone-debug/"&gt;Debug iPhone Web applications with Eclipse&lt;/a&gt;", but in truth, Aptana doesn't support the iPhone for debugging. &amp;nbsp;Instead, the article recommends you use Firefox with Aptana to debug your application. &amp;nbsp;Uh... no thanks. &amp;nbsp;WebKit and Gecko are different enough that, if I'm developing an iPhone-specific application, I'll want to do my development with Mobile Safari.&lt;br /&gt;
&lt;br /&gt;
Neither of these was really worth the effort of learning; the app in question is simple enough that console.log does everything I needed. &amp;nbsp;But I do hope that Apple has fixed this problem in the newest Dashcode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-107470133684042031?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/snbIQyjuHW8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/107470133684042031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=107470133684042031&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/107470133684042031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/107470133684042031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/snbIQyjuHW8/dealing-with-dashcode-part-4-dashcode.html" title="Dealing With Dashcode, Part 4: Dashcode and Debugging" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2010/08/dealing-with-dashcode-part-4-dashcode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYDRHs9eyp7ImA9Wx5TEU0.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-5738262974668320221</id><published>2010-07-25T16:29:00.000-07:00</published><updated>2010-07-25T16:56:15.563-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-25T16:56:15.563-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dashcode" /><category scheme="http://www.blogger.com/atom/ns#" term="sysadmin" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="webdav" /><title>Dealing With Dashcode, Part 3: Dashcode, WebDAV, and Trailing Slashes</title><content type="html">(This is a continuation of a &lt;a href="http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-2-apache.html"&gt;previous post&lt;/a&gt;. &amp;nbsp;You may want to read the &lt;a href="http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-1.html"&gt;first post&lt;/a&gt; in this series for an overview of the architecture.)&lt;br /&gt;
&lt;br /&gt;
At this point, I had a WebDAV-accessible directory that I had configured Dashcode to deploy to. &amp;nbsp;It worked to deploy once, but after that, future deploys would fail. &amp;nbsp;A dialog box would appear with the title, "An error occured while deploying the project to the server." and the text, "The folder “myapp” cannot be created on the server." &amp;nbsp;After that, the status at the top of the Run &amp;amp; Share page would show "Last deploy attempt failed:&amp;nbsp;The folder “myapp” cannot be created on the server."&lt;br /&gt;
&lt;br /&gt;
The problem is that Apple's&amp;nbsp;WebDAVFS will send a WebDAV PROPFIND request for "serv/myapp" (which is a folder), get a 301 redirect to "serv/myapp/" (with a trailing slash this time), and then send a PROPFIND for "serv/myapp/", but using credentials which are only valid for "serv/myapp". &amp;nbsp;Apache doesn't like that, sends a 401 Forbidden response, and WebDAVFS gives up and sends an error to Dashcode. &amp;nbsp;(I'm not sure whether this particular problem of retaining credentials across redirects is specific to WebDAVFS, or if it's actually in CFNetwork.)&lt;br /&gt;
&lt;br /&gt;
The solution is to not have Apache send the 301 redirect. &amp;nbsp;Adding this to the Location section for my DAV URL does the trick:&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;Location /myapp-devel/dav/&amp;gt;&lt;br /&gt;
&lt;div style="margin-left: 4ex;"&gt;&lt;div&gt;# In addition to the DAV-related directives&lt;/div&gt;&lt;div&gt;# I talked about in Part 1, add:&lt;/div&gt;&lt;div&gt;DirectorySlash Off&lt;/div&gt;&lt;/div&gt;&amp;lt;/Location&amp;gt;&lt;/blockquote&gt;This is probably a good thing to do on all DAV directories, since redirection isn't exactly a great thing to do within a filesystem.&lt;br /&gt;
&lt;br /&gt;
After this, I could deploy repeatedly from Dashcode with no problems.&lt;br /&gt;
&lt;br /&gt;
This is as much as I needed to deploy my app. &amp;nbsp;Debugging it, though, was still of an issue. &amp;nbsp;See the next post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-5738262974668320221?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/rbqqJLE3JSw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/5738262974668320221/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=5738262974668320221&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5738262974668320221?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5738262974668320221?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/rbqqJLE3JSw/dealing-with-dashcode-part-3-dashcode.html" title="Dealing With Dashcode, Part 3: Dashcode, WebDAV, and Trailing Slashes" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-3-dashcode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEINRnszeSp7ImA9Wx5TEU0.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-8316670800764652931</id><published>2010-07-25T15:11:00.000-07:00</published><updated>2010-07-25T17:03:17.581-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-25T17:03:17.581-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="freebsd" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><title>Dealing With Dashcode, Part 2: Apache, WebDAV, and umasks</title><content type="html">(This is a continuation of a &lt;a href="http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-1.html"&gt;previous post&lt;/a&gt;.)&lt;br /&gt;
&lt;br /&gt;
At this point,&amp;nbsp;I had set up a directory that I could publish to using WebDAV and also edit as my regular user id. &amp;nbsp;Since WebDAV works as user www, my normal user id (piquan) wouldn't have access to edit them. &amp;nbsp;So I needed to set up a directory using FreeBSD's ACLs to give write access to both me and www.&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;$ mkdir serv&lt;br /&gt;
$ setfacl -m u:piquan:rwx,u:www:rwx piquan&lt;br /&gt;
$ setfacl -d -m u:piquan:rwx,u:www:rwx,u::rwx,g::rx,o::rx,mask::rwx serv&lt;/blockquote&gt;&lt;div&gt;The problem is, when WebDAV created a directory, it created it with mode 755 (rwxr-xr-x). &amp;nbsp;The problem is, if a program that's not aware of ACLs creates (or chmods) a file or directory, the ACLs mask bits get taken from the group access bits. &amp;nbsp;In other words, the permissions that the program gives for the group restrict the permissions of any u:… or g:… entries in the ACLs. &amp;nbsp;The r-x mask that WebDAV created my directory with masked my u:piquan:rwx ACL entry to an effective u:piquan:r-x. &amp;nbsp;(Since www was the directory's owner, its u::rwx entry didn't get masked.)&lt;br /&gt;
&lt;br /&gt;
In other words, I could no longer add, rename, or delete files from the directories that WebDAV created. &amp;nbsp;I also couldn't edit the files, since they were created with mode 644.&lt;br /&gt;
&lt;br /&gt;
After some investigation, I found that WebDAV creates files and directories based on the Apache process's &lt;a href="http://en.wikipedia.org/wiki/Umask"&gt;umask&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
On one hand, I could edit /usr/local/sbin/apachectl and /usr/local/etc/rc.d/apache22 to set the umask before launching Apache. &amp;nbsp;However, I didn't like that idea, since then any Apache upgrades would blow away my changes. &amp;nbsp;I wanted something a little more lasting.&lt;br /&gt;
&lt;br /&gt;
Instead, I used – or rather abused – a mechanism in rc.d/apache22 that's designed for setting &lt;a href="http://www.freebsd.org/cgi/man.cgi?query=ulimit&amp;amp;sektion=3"&gt;process limits&lt;/a&gt;. &amp;nbsp;It includes a bit that runs some shell code and evaluates the output. &amp;nbsp;I added to /etc/rc.conf:&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;apache22limits_enable=YES&lt;br /&gt;
apache22limits_args="echo umask 0002"&lt;/blockquote&gt;&lt;div&gt;After that, I ran "sudo /usr/local/etc/rc.d/apache22 restart", sudo rm'd the files that WebDAV had created already, and published it again. &amp;nbsp;This time, WebDAV created files I could edit. &amp;nbsp;Mind you, after that, Dashcode couldn't delete the directory it had created to republish it, but that's for my next post.&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/13322352-8316670800764652931?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/cDXxAqDwu3U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/8316670800764652931/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=8316670800764652931&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8316670800764652931?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8316670800764652931?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/cDXxAqDwu3U/dealing-with-dashcode-part-2-apache.html" title="Dealing With Dashcode, Part 2: Apache, WebDAV, and umasks" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-2-apache.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcBRX0_eSp7ImA9Wx5SFkg.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-4678709469773453409</id><published>2010-07-25T01:54:00.000-07:00</published><updated>2010-08-12T15:27:34.341-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-12T15:27:34.341-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dashcode" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Dealing With Dashcode, Part 1: Architecture and Basic Configuration</title><content type="html">I've been writing a web app for the iPhone recently. &amp;nbsp;The main tool for this type of web app is Dashcode, which is part of Xcode. &amp;nbsp;There's a couple of problems with my setup: one of them I've solved, and the other I haven't. &amp;nbsp;In the hopes that somebody else on the Internets might find this information useful, here ya go.&lt;br /&gt;
&lt;br /&gt;
The solved problem is how to publish this on my own server. &amp;nbsp;Most of this revolved around my Apache configuration. &amp;nbsp;Most of this should be pretty obvious to anybody who's dealt with WebDAV, but one problem with authentication wasn't obvious; that's at the end, but first I'll talk about my setup.&lt;br /&gt;
&lt;br /&gt;
My app involves a combination of three major elements: static HTML documents, dynamically generated data, and the web app that's generated by Dashcode. &amp;nbsp;(The web app is served as a static page by Apache, of course – it's the client that does all the computation there – but it has its own considerations in the Apache configuration.) &amp;nbsp;My web site, therefore, has three sections. &amp;nbsp;(All the project names, domain names, etc. in this are replaced with more generic versions. &amp;nbsp;These are not real URLs.)&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;http://www.piquan.org/myapp/gen/ &amp;nbsp; : Dynamic content, generated by Python scripts. &amp;nbsp;This is being read by Ajax, so there's some files in here that generate XML, some that generate JSON, and for my own convenience it's nice to have a few static files in here as well.&lt;/li&gt;
&lt;li&gt;http://www.piquan.org/myapp/htdocs/ &amp;nbsp; : Static content, just a bunch of HTML files. &amp;nbsp;The web app will sometimes send the user to these files (and out of the app entirely) by setting window.location.&lt;/li&gt;
&lt;li&gt;http://www.piquan.org/myapp/serv/ &amp;nbsp; : This holds the app generated by Dashcode. &amp;nbsp;I want Dashcode to be able to blow everything under here away, and replace it.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;All of the files are currently in ~/src/myapp, and while I'm just working on the initial version, I want it to be served straight out of there. &amp;nbsp;While I'm doing development, all of this is under http://www.piquan.org/myapp-devel/ , and I'll move to /myapp/ once I've got a releasable version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;To get the static files to be served is pretty easy. &amp;nbsp;I just put this in my Apache config (within the VirtualHost section for www.piquan.org):&lt;/div&gt;&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;Alias /myapp-devel/ /home/piquan/src/myapp/&lt;br /&gt;
&amp;lt;Directory /home/piquan/src/myapp&amp;gt;&lt;br /&gt;
&lt;div style="margin-left: 4ex;"&gt;AllowOverride All&lt;br /&gt;
Order allow,deny&lt;br /&gt;
Allow from 192.168.42.0/24&lt;/div&gt;&amp;lt;/Directory&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
(The "AllowOverride All" is to make it easier for me to experiment using .htaccess instead of needing to change my Apache config and restart the server.  Of course, .htaccess is somewhat limited in some ways, as we'll discuss later.)&lt;br /&gt;
&lt;br /&gt;
Ok, so what next?  Well, I need to serve the dynamic content. &amp;nbsp;Remember that there's both static and dynamic files in there. &amp;nbsp;Ideally, it should be transparent whether the content is coming from a static file or being dynamically generated.&lt;br /&gt;
&lt;br /&gt;
To generate the dynamic content, I chose to use Python with raw WSGI. &amp;nbsp;This is a very simple way to write simple dynamic content. &amp;nbsp;For complex projects, then a web application framework like Django would be more appropriate, but here I'm looking at about 300 lines of code, so Django would be overkill. &amp;nbsp;Also, remember that here I'm only sending either simple XML or JSON. &amp;nbsp;Now, WSGI is actually an interface standard (like CGI), not an implementation; the Apache WSGI implementation is &lt;a href="http://code.google.com/p/modwsgi/"&gt;mod_wsgi&lt;/a&gt;. &amp;nbsp;I installed this (using FreeBSD's Ports mechanism).&lt;br /&gt;
&lt;br /&gt;
The default for mod_wsgi is to serve data from within the Apache process. &amp;nbsp;On one hand, this is very efficient. &amp;nbsp;On the other hand, it's very inconvenient for development, because if you change your code, you have to restart Apache. &amp;nbsp;There's an easy solution: put the WSGI handlers in a separate group of processes that Apache automatically manages. &amp;nbsp;When you change your code, mod_wsgi will automatically kill and restart those. &amp;nbsp;If you don't understand that, then don't worry: the config file additions are quite simple. &amp;nbsp;I just added to the VirtualHost section:&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;WSGIDaemonProcess piquan.org display-name=%{GROUP}&lt;br /&gt;
WSGIProcessGroup piquan.org&lt;/blockquote&gt;This sets up a simple set of processes to manage all WSGI requests. &amp;nbsp;In this configuration, the same set manages everything across my entire domain. &amp;nbsp;(That's not because of "piquan.org" there; that's just an identifier for the process group. &amp;nbsp;It applies to my entire domain because it's within the VirtualHost section, not within a Directory section.) &amp;nbsp;Once it's time to release, I'll change the name from "piquan.org" to "myapp" or something, tune the WSGIDaemonProcess line to use the appropriate amount of resources (in terms of processes, timeouts, etc), and move the WSGIProcessGroup to within a Directory section so that it only applies to my program.&lt;br /&gt;
&lt;br /&gt;
The mod_wsgi &lt;a href="http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide"&gt;Quick Configuration Guide&lt;/a&gt;&amp;nbsp;says to use WSGIScriptAlias to tell mod_wsgi what directory should be considered WSGI programs. &amp;nbsp;However, remember that I have a mix of dynamic and static files, so I took a different tack.&lt;br /&gt;
&lt;br /&gt;
To deal with this, I put the static files in files named things like staticdata.js, staticdata.xml. &amp;nbsp;The dynamic files are named things like dynamicdata.js.wsgi and dynamicdata.js.wsgi. &amp;nbsp;Then, a bit of .htaccess magic, along with the miracle of MultiViews (which I don't know WHY it's not more widespread) lets me tell Apache to send things the right place.&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;Options All MultiViews&lt;br /&gt;
MultiviewsMatch Handlers Filters  &lt;br /&gt;
AddType application/json .js&lt;br /&gt;
AddType text/xml .xml&lt;br /&gt;
AddHandler wsgi-script .wsgi&lt;/blockquote&gt;&lt;br /&gt;
This is actually a bit of overkill.  I specified a very widespread &lt;a href="http://httpd.apache.org/docs/2.2/mod/core.html#options"&gt;Options&lt;/a&gt; line. &amp;nbsp;The only option I really needed for this was MultiViews. &amp;nbsp;[Edit: I also need ExecCGI. &amp;nbsp;Thanks, Graham!] &amp;nbsp;It's just more convenient during development to have things like Indexes and FollowSymLinks on. &amp;nbsp;Also, I set the &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_mime.html#multiviewsmatch"&gt;MultiviewsMatch&lt;/a&gt; to include Filters, when really I only need it to deal with Handlers. &amp;nbsp;(I'll probably turn on the mod_deflate filter later, since this is an iPhone web app that will sometimes be sent over 3G and even EDGE networks, but that's not something that MultiviewsMatch needs to be involved in.) &amp;nbsp;I generally tend to put in pretty broad web capabilities during dev, and then tighten it when I deploy.&lt;br /&gt;
&lt;br /&gt;
The two AddType directives are because I thought one of the libraries I was using was being a bit picky about the Content-Type it gets back. &amp;nbsp;(I could have named my JSON files with .json instead of .js, since Apache already associates application/json with the .json extension, but the .json extension irks me a bit.) &amp;nbsp;As it turns out, the library wasn't as picky as I thought (for instance, it would be happy with Apache's default of application/xml, which is arguably more appropriate for this purpose; note that both are valid MIME types for XML), but I left them in anyway.&amp;nbsp;Note that the AddType directives only apply to the static data; they don't apply to WSGI scripts, since those send their own Content-Type header.&lt;br /&gt;
&lt;br /&gt;
(By the way: when you're writing apps like this, you can handle REST-style URLs pretty easily. &amp;nbsp;For example, http://www.piquan.org/myapp/gen/person/piquan could be handled by a script named gen/person.wsgi, which can look at environ['PATH_INFO'] to read the "/mary" bit. &amp;nbsp;Note that this is the environ passed to application, not sys.environ. &amp;nbsp;If you really wanted to get fancy, you can probably add some MultiViews magic along with &lt;limit&gt; sections to separate this into person.GET.wsgi, person.PUT.wsgi, person.POST.wsgi, etc. &amp;nbsp;Hmmm... maybe I'll write a filter module to let that happen easily.)&lt;/limit&gt;&lt;br /&gt;
&lt;br /&gt;
Finally, we have the Dashcode-generated content. &amp;nbsp;This is created on my &lt;a href="http://www.amazon.com/Apple-MacBook-MC371LL-15-4-Inch-Laptop/dp/B003G2ZJTG?ie=UTF8&amp;amp;tag=stopwords-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Mac&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=stopwords-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B003G2ZJTG" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, and I need to send it to my web server. &amp;nbsp;Hello, WebDAV! &amp;nbsp;WebDAV is pretty nice to have on your web server if you use a Mac as your &lt;a href="http://www.amazon.com/Apple-Mac-Mini-MC270LL-Desktop/dp/B0013FK9U2?ie=UTF8&amp;amp;tag=stopwords-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;desktop&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=stopwords-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B0013FK9U2" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;: it lets you keep an iCal calendar shared on a website (without paying for &lt;a href="http://www.amazon.com/Apple-MC660Z-A-Mobileme-Individual/dp/B003TLJUJE?ie=UTF8&amp;amp;tag=stopwords-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;MobileMe&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=stopwords-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B003TLJUJE" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;!), gives you a pretty convenient and WAN-accessible file storage from the Finder, you can publish from &lt;a href="http://www.amazon.com/Apple-MB966Z-A-iLife-09/dp/B0014X5XEK?ie=UTF8&amp;amp;tag=stopwords-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;iWeb&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=stopwords-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B0014X5XEK" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;, and so on. &amp;nbsp;(Ok, blatant advertising done.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;WARNING&lt;/span&gt;&lt;/b&gt;: Don't configure WebDAV until you have secured your web server! &amp;nbsp;WebDAV lets people write to your disk. &amp;nbsp;That's its point. &amp;nbsp;If you don't have a secure server, then you may find people you don't want writing to your disk.&lt;br /&gt;
&lt;br /&gt;
In fact, don't trust my configs on this. &amp;nbsp;Read over the docs for &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_dav.html"&gt;mod_dav&lt;/a&gt;, and you should have a decent understanding of web server security. &amp;nbsp;At a bare minimum, read&amp;nbsp;Apache's docs on &lt;a href="http://httpd.apache.org/docs/2.2/misc/security_tips.html"&gt;Security Tips&lt;/a&gt;, and also the docs on &lt;a href="http://httpd.apache.org/docs/2.2/howto/auth.html"&gt;Authentication, Authorization and Access Control&lt;/a&gt;. &amp;nbsp;You should also know why the latter is insecure. &amp;nbsp;(Hint: Don't use Basic auth; use Digest instead!)&lt;br /&gt;
&lt;br /&gt;
Ok, now that I've made it clear that I don't want you to open your disk to the whole world, here's a bit of my configuration to allow Dashcode to publish using WebDAV. &amp;nbsp;I actually opened up a lot more than I needed to: instead of just the area where Dashcode puts its static files, I have it set up to allow WebDAV access to my entire program. &amp;nbsp;This lets me fiddle with stuff in the Finder if I need to.&lt;br /&gt;
&lt;br /&gt;
Now, here's why that's a really bad idea from a security perspective. &amp;nbsp;WebDAV lets people write files. &amp;nbsp;WSGI lets people run files. &amp;nbsp;That means that with the two together, an attacker could write to, and then execute, a file on MY computer. &amp;nbsp;Bad news. &amp;nbsp;Don't do this unless you're satisfied with your security: in particular, and at least put a &lt;a href="http://httpd.apache.org/docs/2.2/howto/access.html"&gt;reasonable Allow clause&lt;/a&gt; in place.&lt;br /&gt;
&lt;br /&gt;
Here's the configuration I used. &amp;nbsp;Again, this is back in the Apache config file, in the VirtualHost section.&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;Alias /myapp-devel/dav/ /home/piquan/src/myapp/&lt;br /&gt;
&amp;lt;Location /myapp-devel/dav/&amp;gt;&lt;br /&gt;
&lt;div style="margin-left: 4ex;"&gt;Dav On&lt;br /&gt;
Options Indexes&lt;br /&gt;
Require user piquan&lt;/div&gt;&amp;lt;/Location&amp;gt;&lt;/blockquote&gt;And then in .htaccess:&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;AuthType Digest&lt;br /&gt;
AuthName "myapp DAV area"&lt;br /&gt;
AuthUserFile /home/piquan/.htdigest&lt;/blockquote&gt;(By the way: everything I put in my .htaccess, you can put in the regular Apache config. &amp;nbsp;I just prefer to use .htaccess for everything I can, since it lets me change options without restarting Apache.)&lt;br /&gt;
&lt;br /&gt;
Finally, I set up my password file by using the &lt;a href="http://httpd.apache.org/docs/2.2/programs/htdigest.html"&gt;htdigest&lt;/a&gt; shell command on my web server:&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;$ htdigest ~/.htdigest "myapp DAV area" piquan&lt;/blockquote&gt;(I already had a ~/.htdigest, and just was adding a new realm+username+password tuple. &amp;nbsp;If I didn't have an .htdigest, I would need to specify the -c option.)&lt;br /&gt;
&lt;br /&gt;
Now, the &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_dav.html"&gt;mod_dav&lt;/a&gt; docs recommend using completely different URLs for the WebDAV URL and the "regular" serving URL. &amp;nbsp;That's probably a little bit easier to configure. &amp;nbsp;As for me,&amp;nbsp;I kinda wanted to keep my entire project under the same top-level directory (myapp-devel), so I made the DAV-enabled section a subtree.&lt;br /&gt;
&lt;br /&gt;
Ok, there's one element left: permissions. &amp;nbsp;I needed the web server to be able to write to the serv directory (where Dashcode was to write its files), but I also wanted to be able to – as my normal user on the web server – edit those files (to edit the manifest, or for whatever other post-deploy changes I wanted to make). &amp;nbsp;Since WebDAV accesses files as user www, and I access them as user piquan, I needed to make serv writable by both. &amp;nbsp;But I didn't want to make it globally writable, either.&lt;br /&gt;
&lt;br /&gt;
For this, I turned to &lt;a href="http://www.freebsd.org/doc/en/books/handbook/fs-acl.html"&gt;FreeBSD's ACL support&lt;/a&gt;. &amp;nbsp;I'm not going to go into details on how to configure a filesystem or kernel for ACL support; there's guides for that online already. (If you don't like the Handbook's dry style, try the &lt;a href="http://onlamp.com/pub/a/bsd/2005/09/22/FreeBSD_Basics.html"&gt;O'Reilly ONLamp&lt;/a&gt; article instead.)&lt;br /&gt;
&lt;br /&gt;
I needed the serv directory itself to be writable by www and piquan, and also I needed any files within that either I or WebDAV create to be the same (unless explicitly changed). &amp;nbsp;This means configuring both an access ACL and a default ACL.&lt;br /&gt;
&lt;blockquote style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;div&gt;$ mkdir serv&lt;/div&gt;&lt;div&gt;$ setfacl -m u:piquan:rwx,u:www:rwx piquan&lt;/div&gt;&lt;div&gt;# The next command is all on one line.&lt;/div&gt;&lt;div&gt;$ setfacl -d -m u:piquan:rwx,u:www:rwx,u::rwx,g::rx,o::rx,mask::rwx serv&lt;/div&gt;&lt;/blockquote&gt;After all this was done, I went back to Dashcode's "Run &amp;amp; Share" section, and added my web server as a new destination.  Finally, it was time to publish!&lt;br /&gt;
&lt;br /&gt;
At this point, everything I've talked about so far worked.  But soon after that, I started having problems. &amp;nbsp;I'll tackle each of these in a separate post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-4678709469773453409?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/gR01i8w-ikY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/4678709469773453409/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=4678709469773453409&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4678709469773453409?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4678709469773453409?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/gR01i8w-ikY/dealing-with-dashcode-part-1.html" title="Dealing With Dashcode, Part 1: Architecture and Basic Configuration" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2010/07/dealing-with-dashcode-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcARXo-eyp7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-3760704462634460098</id><published>2009-04-18T15:36:00.000-07:00</published><updated>2010-05-17T17:20:44.453-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T17:20:44.453-07:00</app:edited><title>Good Businesses</title><content type="html">Here's some businesses I dealt with over the last week that have given me excellent customer service, and I'd like to recognize publicly.&lt;br /&gt;
&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://speakeasy.net/"&gt;Speakeasy&lt;/a&gt;, my DSL provider&lt;a href="http://www.starvingmusician.com/"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.starvingmusician.com/"&gt;The Starving Musician&lt;/a&gt;, where I get instruments and equipment.  (I don't deal with them online; I go to their Santa Clara location.)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.statefarm.com/bank/bank.asp"&gt;State Farm Bank&lt;/a&gt;, my bank (natch)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.audible.com/"&gt;Audible&lt;/a&gt;, an audiobook website&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Shouts out to these companies for taking care of their customers!&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/13322352-3760704462634460098?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/jKdauuv3AVk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/3760704462634460098/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=3760704462634460098&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3760704462634460098?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3760704462634460098?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/jKdauuv3AVk/good-businesses.html" title="Good Businesses" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2009/04/good-businesses.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcBRnc9fip7ImA9WxVWEE4.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-2467870415335560341</id><published>2009-02-19T01:30:00.001-08:00</published><updated>2009-02-19T01:50:57.966-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T01:50:57.966-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="wedding" /><category scheme="http://www.blogger.com/atom/ns#" term="juniper" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="iron meadows" /><category scheme="http://www.blogger.com/atom/ns#" term="music" /><category scheme="http://www.blogger.com/atom/ns#" term="lcachefs" /><category scheme="http://www.blogger.com/atom/ns#" term="baby wombats" /><title>A few non-secrets</title><content type="html">A month and a half without a post, yow.  Ok, so here's the thing.  I've had stuff going on in my life, but a lot of it involves friends, and their privacy.  I can't talk about the friend getting surgery, because that's medical.  I can't talk about the acquaintance who I suspect may be trying to manipulate me, because it's just a hunch right now.  There's a lot of stuff I can't talk about going on.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's some things I &lt;span class="Apple-style-span" style="font-style: italic;"&gt;can&lt;/span&gt; talk about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Two of my best friends are getting married in two weeks.  Congratulations, Scott and Mili!  Scott and I have been close friends since fourth grade, and he and Mili have been crazy about each other for years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My work has been progressing well.  I've still been working on the project I talked about in my last post, but the pilot has been running more slowly than we had expected.  There's been some minor technical changes from the description I made (most notably changing from using a magic uid/gid as a marker to using UFS2 extended attributes), but all the details will be out when we open-source it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you know, I've occasionally been writing &lt;a href="http://www.soundclick.com/piquan"&gt;some music&lt;/a&gt;.  Mostly funny stuff, not good stuff, although I do kinda like "&lt;a href="http://soundclick.com/share?songid=7176212"&gt;Baby Wombats (House Remix)&lt;/a&gt;".  I've also been working on a metal song about puppies and rainbows and stuff.  I've got it written, but need to re-record it since what I've recorded so far is just draft quality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope I'll have something more interesting to post soon!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-2467870415335560341?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/enjY6NeYL60" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/2467870415335560341/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=2467870415335560341&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2467870415335560341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2467870415335560341?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/enjY6NeYL60/few-non-secrets.html" title="A few non-secrets" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2009/02/few-non-secrets.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUGR3g-cCp7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-5148576557631599097</id><published>2008-12-31T13:18:00.000-08:00</published><updated>2010-05-17T17:23:46.658-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T17:23:46.658-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="juniper" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="lcachefs" /><title>What I'm working on at Juniper</title><content type="html">I haven't had much time to update my blog for a while.  It's mostly been work, so I think I'll tell you all about it.&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;I'm loving my job at Juniper, although I must say it's keeping me very busy lately.  The project I'm on is pretty close to the wire.  In the weeks approaching the Christmas holidays, I was spending every waking minute working on my code to get it ready.  That left me able to go to Christmas and enjoy it without worrying about work (more about my vacation in another post, but the basic summary is, it was &lt;span class="Apple-style-span" style="font-style: italic;"&gt;terrific&lt;/span&gt;!).  Even though my part is working great, there's some other parts to the project that are a bit tense, so I'm helping where I can.  Since I got back from vacation, though, things have been a bit more relaxed for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Anyway, I can't go into all the background on the project, but I can tell you about my part.  (This gets a bit technical from here on in, so you can skip it if you're not a computer geek.)  The goal is to make it possible to compile with source code on NFS servers and object code on local disk.  The source then can be edited remotely on workstations, and easily backed up; the objects don't take up expensive NetApp space, and the compile proceeds at local speeds.  This mechanism speeds up compiles by a factor of 2-3.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The core of this is a new filesystem layer that I wrote, lcachefs.  This is a type of loopback filesystem, similar to nullfs or unionfs.  lcachefs does some magic mirroring involving three directories.  As with any filesystem, one of these is the mountpoint: where lcachefs shows its results.  Unlike most filesystems, though, it involves two sources: one is known as the source directory (which holds the NFS-mounted sources), and the other is a storage directory (local disk).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Ok, let's pretend that you first copy your sources from a source directory to the storage directory.  Then you &lt;a href="http://www.freebsd.org/cgi/man.cgi?query=mount_nullfs"&gt;loopback-mount&lt;/a&gt; the storage directory over your original source directory.  Then, you compile there.  (You mount it over your original source directory so that the filenames in the debugging information point to the original sources, instead of to a temporary storage directory.)  This looks, to the compiler, just like a regular compile.  However, instead of doing the compile on NFS, you're doing it on local disk.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;This has two advantages.  The one that's easy to explain is that you're storing your objects and products on local disk (which is &lt;a href="http://www.pricewatch.com/hard_removable_drives/"&gt;cheap&lt;/a&gt;), instead of on NetApps (which, despite all their greatness, are &lt;a href="http://www.google.com/products?q=netapp%20nas&amp;amp;brand=netapp"&gt;expensive&lt;/a&gt;).  Objects can easily be recreated, and take up most of the space in a build tree.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The other part is that you're working entirely on local disk.  This is much, MUCH faster than using NFS.  It's not because of the bulk data transfer (i.e., reads and writes), so higher bandwidth doesn't help.  The problem is with the per-request overhead.  There are a LOT of requests going across the wire in a compile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Let's consider what happens when you build a file.  Specifically, we'll talk about if you're just building hello.o.  Make will look for Makefile, makefile, BSDmakefile, and .depend.  Then it will look at hello.c and hello.o.  (If it needs to, it may look for hello.s, hello.S, hello.f, and whatever other potential sources you may have.)  It'll look up hello.c.gch (if you have &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html"&gt;precompiled header support&lt;/a&gt;), hello.gcda (if you have &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html"&gt;coverage support&lt;/a&gt;).  Then it has to look for stdio.h.  Well, let's suppose that you have two directories in your -I path; let's call them foo and bar.  Now it needs to check for foo/stdio.h.gch, foo/stdio.h, bar/stdio.h.gch, and bar/stdio.h, all of which are in your source repository (hence usually on NFS) before it can go on to look at /usr/include/stdio.h.  Well, the first thing that stdio.h does (on FreeBSD; your OS may vary) is to include sys/cdefs.h.  You got it... another four lookups in the source repository to find sys/cdefs.h!  Repeat for sys/_null.h, sys/_types.h, and machine/_types.h.  In the end, just to compile hello.o, you've done 39 file lookups into your source directory.  Of those lookups, 21 are for .h files... and hello.c only includes one file, stdio.h!  The average .c file (using the FreeBSD source base as a sample) includes 9 files directly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;That's a lot of work.  These lookups are all blocking I/O, so it's one round trip each; from watching network traces, I'm actually very impressed with how fast NetApps can respond, but it's still a non-zero time.  Moreover, though, you've got to look at the CPU usage.  NFS uses RPC, and the overhead isn't cheap.  In my testing, using NFS to compile something requires four times as much kernel processing-- which works out to twice as much CPU overall-- as using local disk!  (That's all in the kernel, too, and that means that preemption isn't as easy, so scheduling takes a little hit... and don't forget the new network interrupts!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Finally, NFS is designed around concurrent use.  You can't assume that the contents of an NFS-mounted directory will be the same now as they were 90 seconds ago.  While local disk can use metadata caches very, very effectively (and FreeBSD's filesystems do), when you're using NFS, you have to expire caches a lot.  (There are also some things that FreeBSD could do better when it comes to its NFS client, but I fixed those and only got a 5% boost.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Ok, now you should be convinced that the speed hit for NFS is bad, and that building on local disk is much, much, faster.  Let's go back to talking about lcachefs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Earlier, I asked you to think about copying your sources to local disk, and doing the compile there.  That's exactly what lcachefs does, but with a twist: it does this lazily, by which I mean it won't copy files until they're needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;When you first mount an lcachefs directory, it scans just the top-level of your source directory.  It then creates stub files for each entry in the local storage.  This is just an empty file with a special uid/gid pair that marks it as a stub.  If you ls -l that file, then the filesystem will report the correct uid/gid, size, link count, etc, but in reality the locally-stored file is empty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;When you actually try to read (or otherwise use) a file or directory that's a stub, then it will copy it over to local storage before the system call returns to userland.  In the case of a file, this means it copies the contents and sets the uid/gid to its real, non-stub values.  In the case of a directory, it scans the directory and populates the stubs just like I described in the previous paragraph.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;That's the basic overview.  The reality is quite complicated because of hard links, the need to watch out for vnode lock order reversal, and other icky stuff like that.  You can see all the gory details, though, once we open-source lcachefs.  I'm currently awaiting clearance from legal, but I hope to either contribute it to FreeBSD, or release it as an independent open-source project.&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/13322352-5148576557631599097?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/v1M7rp94dmo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/5148576557631599097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=5148576557631599097&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5148576557631599097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5148576557631599097?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/v1M7rp94dmo/what-im-working-on-at-juniper.html" title="What I'm working on at Juniper" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2008/12/what-im-working-on-at-juniper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cNSX07fSp7ImA9WxRbFkQ.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-4744339400049261101</id><published>2008-12-07T15:59:00.001-08:00</published><updated>2008-12-07T16:11:38.305-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-07T16:11:38.305-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="friends" /><title>Good Friends</title><content type="html">I was thinking that I should make a post today, and was wondering what.  I was trying to think of cheery topics, and looked at my blog to get ideas.  Then the Google ads were one for losing fat, and one for help with alcohol &amp;amp; depression.  Boy, how cheery can you get?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actually, quite so.  In the last several weeks, I've gotten in touch with a &lt;span class="Apple-style-span" style="font-style: italic; "&gt;lot&lt;/span&gt; of friends who are very dear to me.  People I haven't heard from in years and years.  Some of them contacted me, I contacted some of them.  Most of this has been over Facebook or MySpace, one was on this blog which led to some emailing (and there'll be more of that, I promise!), one I got to visit in person while I was in Texas (rock on!), others I've only spoken with on the phone.  But it really seems like the stars have aligned for reopening old friendships!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Really, think of everybody who's ever been your life who has their own big mansion in your heart.  Then imagine getting to visit with each of them, over the span of a couple of weeks.  It's been an incredibly special time for me lately.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm gonna be grinning like a fool for a long time now.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-4744339400049261101?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/7Er7pcYNwZo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/4744339400049261101/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=4744339400049261101&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4744339400049261101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4744339400049261101?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/7Er7pcYNwZo/good-friends.html" title="Good Friends" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2008/12/good-friends.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUEQns7fyp7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-3863083504421855518</id><published>2008-12-04T01:53:00.001-08:00</published><updated>2010-05-17T17:40:03.507-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T17:40:03.507-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="juniper" /><category scheme="http://www.blogger.com/atom/ns#" term="restraint" /><title>Not what I'm doing at Juniper</title><content type="html">I don't often make technical blog posts (ok, lately I don't often make posts), because two of the three people who read my blog don't really care.  But sometimes it's nice to be able to brag about what I'm doing at work.  Besides, last post I promised to talk about what I'm doing.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Since then, I haven't made any posts, because I didn't have the time to say what I was doing at work.  Which is stupid, really.  You three people don't read my blog because it's got juicy technical details; that's for the &lt;a href="http://stopwords.piquan.org/2007/08/ive-been-found.html"&gt;rest of the masses&lt;/a&gt;, and they don't care what I might have said I was going to post about until I post it.  I've had other things to write about, but since I said I'd write about work, I didn't want to write about anything else.  I several times thought, "Ooh, I should blog about this!" and then thought, "No, I said my next post would be about my work at Juniper."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Well, I am hereby renouncing that commitment.  What's more, I am advising you three (tonight's loyal fans) to take anything I might tease about as merely speculation on future topics, and not be sure I won't write about something completely different first.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So there.  I've just freed myself to write about other stuff.  I don't really know why I felt it necessary to maintain an obligation that nobody cares about; why would anybody care if I put some posts in between the previous post (when I said I'd talk about my Juniper work) and the future post when I actually do, is totally beyond me.  I just did feel that it's necessary, so now I can go on with more regular posts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Except it's late and I'm going to bed instead of subjecting you to more of my incredibly convoluted late-night grammar.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-3863083504421855518?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/va96x9ODRzI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/3863083504421855518/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=3863083504421855518&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3863083504421855518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3863083504421855518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/va96x9ODRzI/not-what-im-doing-at-juniper.html" title="Not what I'm doing at Juniper" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2008/12/not-what-im-doing-at-juniper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CQHsyfip7ImA9WxRVGUo.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-3827431026220593431</id><published>2008-11-17T17:18:00.000-08:00</published><updated>2008-11-17T17:31:01.596-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T17:31:01.596-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="juniper" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Gasp!  It's a post!</title><content type="html">So here's the thing.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was miserable at Google.  It's a great company, and I think it's a wonderful place to work.  But the position I was in just wasn't right for me.  I didn't want to blog at the time, because I didn't want people to get the wrong impression about Google.  Seriously, it's a great company; I just wasn't where I should have been.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So at the end of July, I left Google and went back to Juniper.  I was happy at Juniper, and wanted to be happy again.  Besides that, Juniper offered me a promotion, a raise, my choice of projects, and the opportunity to work under a manager I know I work well with.  I'll talk about the work I'm doing for Juniper in my next blog post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After I went back to Juniper, I've been concentrating on getting into the swing of things, so I still haven't been blogging.  Now I'm doing well, and can start posting again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, here's one last note to the blogosphere: you may note that I'm still using a Google's blogger.com, storing the photos using Google's Picasa Web, and displaying Google AdSense ads.  If I were upset with the company, I wouldn't be doing these things.  I'm strenuously emphasizing that I like the company, because things get taken the wrong way in the blogosphere, and I don't want anybody to get the wrong idea.  I'm also free to badmouth the company if I wanted to, since they're no longer my employer and have no control over my actions.  But I'm not; I'm talking about how great they are.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, my point is, hello world, it's nice to see you again!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-3827431026220593431?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/tcl-B5pdgqk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/3827431026220593431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=3827431026220593431&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3827431026220593431?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3827431026220593431?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/tcl-B5pdgqk/gasp-its-post.html" title="Gasp!  It's a post!" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2008/11/gasp-its-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQ3c4fip7ImA9WB5bGUo.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-5627411656330948832</id><published>2007-09-04T21:58:00.000-07:00</published><updated>2007-09-04T22:28:32.936-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-04T22:28:32.936-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jenny" /><category scheme="http://www.blogger.com/atom/ns#" term="party" /><category scheme="http://www.blogger.com/atom/ns#" term="engineering" /><category scheme="http://www.blogger.com/atom/ns#" term="holiday" /><title>An Oakland Shade</title><content type="html">Wow, that was a whiny post last weekend!  Fortunately, this weekend was much better... after all, Labor Day, right?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/Piquan/OaklandQuickshade/photo#5106581045665193138"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://lh3.google.com/Piquan/Rt44Z7ud3LI/AAAAAAAAAr0/dmjADqqePgc/s200/IMG_0241.JPG" alt="" border="0" /&gt;&lt;/a&gt;My friend Jenny threw a party this weekend, a holiday barbecue.  She had a problem: there's been a heat wave lately, and her house was going to be positively sweltering.  She came to me, a friendly neighborhood engineer, to build a shade.&lt;br /&gt;&lt;br /&gt;The party was Sunday, so on Saturday I went over there, scoped out the project, took some measurements, and made a list of supplies.  Then, off we went to the hardware store to get supplies, which naturally deviated considerably from my list.  (Anybody who likes going to hardware stores understands what I mean.  Computer stores too.)  Three canvas sheets, some rope, twine, dowels, and various fasteners.  For once, I needed exactly what I got!  (Well, I had a small pack of garden stakes left over.)  A couple of supports, stitching together the canvas, some guy lines, and the job was done.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/Piquan/OaklandQuickshade/photo#5106580809441991778"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 200px;" src="http://lh4.google.com/Piquan/Rt44MLud3GI/AAAAAAAAArM/mYbieA1ETvU/s200/IMG_0236.JPG" alt="" border="0" /&gt;&lt;/a&gt;It's not the best shade in the world, but for an afternoon job, I liked it.  I also had a lot of fun building it; I may have had more fun building the shade than going to the party!  It reminds me of something I used to do when I was a kid called Christmas in April.  A lot of people would get together and rebuild the house of somebody who really needed it, and couldn't afford it; usually, this was an elderly or severely disabled person on a very minimal income.  We'd have people who knew what they were doing well enough to lead our efforts, plus &lt;span style="font-style: italic;"&gt;lots&lt;/span&gt; of hands helping get the work done.&lt;br /&gt;&lt;br /&gt;I like building stuff; I think I get that from my Dad.  I think I was first attracted to computers because I could make my creations come to life, from my mind to the computer.  Even so, there's something satisfying about building something in the physical world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-5627411656330948832?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/fcRbMVHPneY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/5627411656330948832/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=5627411656330948832&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5627411656330948832?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5627411656330948832?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/fcRbMVHPneY/oakland-shade.html" title="An Oakland Shade" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/09/oakland-shade.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGQXg9fCp7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-4085683429918512931</id><published>2007-08-27T00:00:00.000-07:00</published><updated>2010-05-17T17:43:40.664-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T17:43:40.664-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thor" /><category scheme="http://www.blogger.com/atom/ns#" term="comics" /><category scheme="http://www.blogger.com/atom/ns#" term="creativity" /><category scheme="http://www.blogger.com/atom/ns#" term="svg" /><category scheme="http://www.blogger.com/atom/ns#" term="greasemonkey" /><category scheme="http://www.blogger.com/atom/ns#" term="dom" /><category scheme="http://www.blogger.com/atom/ns#" term="juniper" /><category scheme="http://www.blogger.com/atom/ns#" term="desk" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="emo" /><title>Why This Post Isn't About The Javascript DOM</title><content type="html">My original title for this post was "Why The DOM Is The Best Lousy Thing We've Got".  I guess I'm not feeling terribly creative with my titles tonight.  To be honest, I'm not feeling terribly creative at all tonight.  It was a terrific week, but a pretty lousy weekend.  I had some unexpected work take up all my time, and it put me in a sour mood for most of the weekend.&lt;br /&gt;
&lt;br /&gt;
It's strange how creativity is so dependent on mood.  I'm not just talking about blogging, here; I'm talking about coding, too.  When I'm doing well, I can code anything, start to finish, piece of cake.  When I'm doing poorly, then even writing hello.c is a huge effort.  The work I talked about earlier involved some coding at the end of it— nothing big, just a few dozen lines to shove some data around— but if it weren't for that, I probably would have had a &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; lousy weekend, instead of the merely lousy one I had.&lt;br /&gt;
&lt;br /&gt;
Ok, now I'm just sounding needlessly whiny.  If you start seeing emo bands show up on my weekly top ten chart on the sidebar, send help.  Like a box of kittens or something.&lt;br /&gt;
&lt;br /&gt;
Anyway, where was I.  Oh, that's right, having a lousy weekend because of work.  I really started thinking that maybe I made a mistake taking this job; maybe I was more cut out for the Juniper job than the Google one.  Now, here's the irony.  When I left Friday, I was writing a document that includes advice to people who feel that way... pretty much saying, "No, it's normal, everybody feels that way, you'll do fine".  (This is advice I had &lt;a href="http://stopwords.piquan.org/2007/07/noogler-day-18-geekiest-social-scene.html"&gt;previously given Cheryl&lt;/a&gt;, and also &lt;a href="http://stopwords.piquan.org/2007/07/noogler-day-19-tgif.html"&gt;talked about more in my blog&lt;/a&gt;.)  And then this weekend I get hit with this wave.  Wasn't expecting it.&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/Piquan/ThorAndMe/photo#5103277610224180290"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 200px;" src="http://lh6.google.com/Piquan/RtJ78rud3EI/AAAAAAAAApA/-3gzznkyRmU/s200/desk.jpg" alt="" border="0" /&gt;&lt;/a&gt;I did get some useful stuff done for myself this weekend, though.  The office is in much better shape, with the bookshelf moved, lighting hung, and desk accessories connected.  Even the living room looks cleaner for some reason.  At the end of it, I wanted to relax by writing some code.  I was going to learn some SVG.  Still, as I sat down to work on it, nothing came to mind.  I hate hacker's block.&lt;br /&gt;
&lt;br /&gt;
If you haven't read Jhonen Vasquez's "I Feel Sick", it's about an artist who is suffering from artistic withdrawl once she takes a job at a big company.  I hadn't read it, and didn't know what it was about, but picked it up tonight to read and forget about my bad mood.  (Hint: the "Alice" soundtrack works well with Vasquez.)  Y'know, that just didn't help me forget as well as I had expected.&lt;br /&gt;
&lt;br /&gt;
Finally, I decided to write about a blog post I've been wanting to write for a while... I even alluded to it in &lt;a href="http://stopwords.piquan.org/2007/08/restraint_13.html"&gt;a post from two weeks ago&lt;/a&gt; (when I refer to the "later, more technically-oriented post").  And that's what I've sat down to do here.  Hmmm... I seem to have done a great job, haven't I?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-4085683429918512931?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/HAOP_xPYgCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/4085683429918512931/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=4085683429918512931&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4085683429918512931?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/4085683429918512931?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/HAOP_xPYgCk/why-this-post-isnt-about-javascript-dom.html" title="Why This Post Isn't About The Javascript DOM" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/08/why-this-post-isnt-about-javascript-dom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4FQHc9cSp7ImA9WB5UFE0.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-6656860907645518978</id><published>2007-08-17T19:01:00.000-07:00</published><updated>2007-08-17T19:08:31.969-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-17T19:08:31.969-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="move" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Moving</title><content type="html">We moved from upstairs to downstairs in the same building.  I like the new crib, although now I'm back in a cube.  Still, it's the best cube I've worked in, and there's plenty of opportunity for cube dressing.  I'm going to go by the surplus store, hardware store, and toy store to get some supplies for a few ideas I have, and cube decorations from past jobs (which are still in the box I took home from Juniper) will also play a heavy part.&lt;br /&gt;&lt;br /&gt;There was some discussion about airspace issues.  There's 18' ceilings in this area, so the question of how to handle the airspace becomes relevant.  Naturally, the discussion mostly involved us playing with Karl's RC helicopters, and trajectory arcs of Nerf guns.&lt;br /&gt;&lt;br /&gt;Anybody have cube decoration ideas they want to throw into the ring?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-6656860907645518978?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/t-9Ft7lejGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/6656860907645518978/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=6656860907645518978&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/6656860907645518978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/6656860907645518978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/t-9Ft7lejGk/moving.html" title="Moving" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/08/moving.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCR3c5eCp7ImA9WB5UE0Q.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-5815716617368537956</id><published>2007-08-17T16:10:00.000-07:00</published><updated>2007-08-17T16:27:46.920-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-17T16:27:46.920-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tattoo" /><category scheme="http://www.blogger.com/atom/ns#" term="party" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="summer" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="sre" /><title>SRE R00lz!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/Piquan/Google/photo#5099788593541274674"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://lh4.google.com/Piquan/RsYWtLud3DI/AAAAAAAAAog/dsavxW8R4qg/s288/IMG_0173.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;This was taken at a company picnic yesterday.  We had a tropical theme going... steel drums, flower leis, etc.  There was a climbing wall, human foosball, and, of course, volleyball.  Since my knee has been giving me problems (I actually had to leave early to go to physical therapy), I stayed away from the volleyball pits and instead played frisbee.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-5815716617368537956?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/jl61pCSY8xA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/5815716617368537956/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=5815716617368537956&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5815716617368537956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/5815716617368537956?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/jl61pCSY8xA/sre-r00lz.html" title="SRE R00lz!" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/08/sre-r00lz.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QHRXYyeSp7ImA9WB5UEkw.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-425755536460564105</id><published>2007-08-15T16:02:00.000-07:00</published><updated>2007-08-15T16:08:54.891-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-15T16:08:54.891-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="restraint" /><category scheme="http://www.blogger.com/atom/ns#" term="privacy" /><title>Yesterday's Beans</title><content type="html">Okay, yesterday's post was evidently more tantalizing than I meant for it to be.  I started by saying that I wasn't talking about my new friend.  Well, that seems to have been raising questions among my other friends, so I've been getting bugged to talk about it.&lt;br /&gt;&lt;br /&gt;Well, not from all of my friends.  Some of my friends were there, some of them are too polite to pry, some are so busy that we haven't talked since then, but this is not an exclusive partition of my friends.  So &lt;a href="http://matthewfletcher.com/blog/"&gt;m3tus&lt;/a&gt;, this post is for you.&lt;br /&gt;&lt;br /&gt;The thing is, it's not like there's anything scandalous that would make Matt Drudge drool.  I just talked to my new friend about some problems she's been going through.  I thought those problems might make for an interesting post, but her problems are hers to tell the world, not mine.  That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-425755536460564105?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/UejtA9SJm8o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/425755536460564105/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=425755536460564105&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/425755536460564105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/425755536460564105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/UejtA9SJm8o/yesterdays-beans.html" title="Yesterday's Beans" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/08/yesterdays-beans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFSXYzcSp7ImA9WB5UEU4.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-6034381248374799229</id><published>2007-08-13T21:38:00.000-07:00</published><updated>2007-08-14T15:58:38.889-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-14T15:58:38.889-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="art" /><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="law" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="guitar hero" /><category scheme="http://www.blogger.com/atom/ns#" term="restraint" /><category scheme="http://www.blogger.com/atom/ns#" term="shakespeare" /><title>Restraint</title><content type="html">All week now, I've been mulling over a blog post.  It's about a new friend I made last weekend, and the interesting circumstances under which we met.  But there's a problem: that would be a violation of her privacy.  I spent a fair bit of the week thinking about this.  For a while, I was considering writing a version that left out some parts.  Finally, I decided that I should let her tell her own story to the people she wants to; it's not my place to do so.&lt;br /&gt;&lt;br /&gt;This is the sort of thing I have to think about when I'm writing to a public audience.  (Okay, that public audience is-- in the last week-- only 56, but ethics is not a numbers game.)  I have to do this all the time when I write about work.  Obviously, this is partly because I don't want to end up like &lt;a href="http://www.blogherald.com/2005/02/17/is-mark-jen-the-blogospheres-dumbest-blogger/"&gt;Mark Jen&lt;/a&gt; or something.  But moreover, it's because I have a responsibility to my employer, and don't want to disclose information when it might do harm.&lt;br /&gt;&lt;br /&gt;This is a sort of self-restraint, which is a good thing.  It suppose that in this context, it's similar to the legal concept of &lt;a href="http://en.wikipedia.org/wiki/Prior_restraint"&gt;prior restraint&lt;/a&gt;, which is generally considered a bad thing under most circumstance.  However, there's a big difference.  Here, I'm avoiding talking about things on my own volition; in the case of prior restraint, it's from a governmental gag order.&lt;br /&gt;&lt;br /&gt;This weekend was my friend's birthday.  His girlfriend and I had planned out a birthday party for him, culminating with us seeing a performance of The Compleat Wks Of Wm Shakespeare (Abridged).  But it started off with us playing Guitar Hero Encore: Rocks the 80s.  I've got Guitar Hero and Guitar Hero II, and we have a blast playing them multiplayer.  Unfortunately, we realized when we started playing that most tracks in multiplayer aren't available until you unlock them in single player mode.  That meant that, for the time being, we only had eight songs available.  Luckily, by the time we finished those eight, it was time for us to head up to the city.&lt;br /&gt;&lt;br /&gt;Now, that all happened Saturday, so Sunday I had to myself.  I took care of some personal errands, like laundry and groceries, but also played Guitar Hero for a while... y'know, just to unlock the songs.  I normally play GH on Expert, but this time, I played on Hard.  That way, my friend and I would be able to play the Expert level for the first time together.  (I did unlock all the songs, by the way.  If you want the track list, and have iTunes, I put together &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewIMix?id=262018582"&gt;an iMix&lt;/a&gt; with the songs.)&lt;br /&gt;&lt;br /&gt;I thought about some of the stuff I had going on at work.  There's plenty that I'd enjoy doing, but I was keeping myself from doing work.  I was bound and determined to make the weekend about myself, and NOT the shiny new job that's been occupying me for the last few weeks.&lt;br /&gt;&lt;br /&gt;I got pretty bored playing Guitar Hero on Hard, but wanted to unlock the songs.  So I kept at it.  I played on Hard, and not on Expert.  I unlocked songs, instead of doing some interesting work.&lt;br /&gt;&lt;br /&gt;Why the restraint there?  I have to wonder if at some times, I'm holding back where I shouldn't.&lt;br /&gt;&lt;br /&gt;I feel like that at work too.  I keep feeling like I'm marking time, slowly learning, waiting until I get to the point where I get to take off the kid gloves and really get to it.  Thursday and Friday, I sat down and did some coding.  I started on a program to help me maintain my calendar, and another one to give me a cheat sheet for a weekly meeting.  The former is pretty mundane, but the latter was certainly fun.  I'll talk about why in a later, more technically-oriented post.&lt;br /&gt;&lt;br /&gt;For now, I'll have to think about when's the right time to hold back, and when's the right time to let loose.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-6034381248374799229?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/U1KmYN_E7Q8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/6034381248374799229/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=6034381248374799229&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/6034381248374799229?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/6034381248374799229?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/U1KmYN_E7Q8/restraint_13.html" title="Restraint" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/08/restraint_13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQEQXoyfSp7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-8078993136522920267</id><published>2007-08-03T21:51:00.000-07:00</published><updated>2010-05-17T17:58:20.495-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T17:58:20.495-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="sawzall" /><category scheme="http://www.blogger.com/atom/ns#" term="vigor" /><title>I've been found!</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_k2C-5IOqqwU/S_HllA6sYnI/AAAAAAAABLU/u1HU0YSTXKA/s1600/FirefoxScrShot001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://4.bp.blogspot.com/_k2C-5IOqqwU/S_HllA6sYnI/AAAAAAAABLU/u1HU0YSTXKA/s320/FirefoxScrShot001.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Okay, this is a surprise.  I've been writing this under the idea that I'd have some small portion of my friends and family reading.  And maybe the occasional Google search.  I figured that's where the &lt;a href="http://www.piquan.org/blog/2007/07/noogler-day-11-work-and-play-at-google.html"&gt;one comment I've had&lt;/a&gt; came from.  Then, today, I did a little log analysis.&lt;br /&gt;
&lt;br /&gt;
Since I opened the site a couple of weeks ago, I've had 2,490 visits from all over the world, from Malaysia to Tanzania.  The visitors are pretty telling of the type of audience: 49% have been using Windows, 29% using Macs, and 21% using Linux.  The browser numbers are more optimistic: 69% Firefox, 12% Safari, and only 7.5% using Internet Explorer.&lt;br /&gt;
&lt;br /&gt;
I will point out that these numbers may well be skewed.  The statistics were only collected for about 2/3 or less of the page views.  In other words, I know that there's been &lt;span style="font-style: italic;"&gt;at least&lt;/span&gt; 6,000 views, but only about 4,000 of those had statistics logged.&lt;br /&gt;
&lt;br /&gt;
How did all this come about?  Well, somebody found my &lt;a href="http://www.piquan.org/blog/2007/07/noogler-day-11-work-and-play-at-google.html"&gt;post about Sawzall&lt;/a&gt;, and posted it to &lt;a href="http://reddit.com/help/faq"&gt;reddit&lt;/a&gt;.  There was a little bit of activity before that, but I haven't yet looked at what led them to find it.&lt;br /&gt;
&lt;br /&gt;
Then again, I never did publicize &lt;a href="http://vigor.sourceforge.net/"&gt;Vigor&lt;/a&gt; at all (I just sent Illiad an email), and enough people downloaded it that I was getting dozens of emails a day.  I suppose even the most trivial writings are still going to be found by the zillions of eyes on the Internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-8078993136522920267?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/yjnxHi-cwlE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/8078993136522920267/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=8078993136522920267&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8078993136522920267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8078993136522920267?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/yjnxHi-cwlE/ive-been-found.html" title="I've been found!" /><author><name>Piquan</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://4.bp.blogspot.com/_k2C-5IOqqwU/S_HllA6sYnI/AAAAAAAABLU/u1HU0YSTXKA/s72-c/FirefoxScrShot001.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://stopwords.piquan.org/2007/08/ive-been-found.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMQnY5eip7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-8748024287155325624</id><published>2007-08-03T20:47:00.000-07:00</published><updated>2010-05-17T18:01:23.822-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T18:01:23.822-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="calendar" /><category scheme="http://www.blogger.com/atom/ns#" term="organization" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="schedule" /><title>Carving out time</title><content type="html">You haven't heard from me all week, and you're starting to wonder if I vanished into thin air, lost my password, or what.  Well, I've just been busy.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_k2C-5IOqqwU/S_HmjkwbEgI/AAAAAAAABLc/RDxv_ReozTA/s1600/iCalScrShot001.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="371" src="http://1.bp.blogspot.com/_k2C-5IOqqwU/S_HmjkwbEgI/AAAAAAAABLc/RDxv_ReozTA/s400/iCalScrShot001.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;All last week, I was wondering why I was having such a hard time getting anything done.  I had so much stuff that I wanted to get done, but never seemed to be making any traction on it.  Then I looked at my calendar, and it all became clear.&lt;br /&gt;
&lt;br /&gt;
Okay, admittedly, that screen shot is from two weeks ago, when I still had a full schedule of training.  But nevertheless, I've been going to a lot of meetings.  Some of them are necessary, some aren't.  I realized that I'd have to defend my schedule against meetings.&lt;br /&gt;
&lt;br /&gt;
That's what I've been doing the past week: I was declining meetings that I didn't need to go to, and making time to work instead.  This involved studying, coding, the usual stuff.  This week, I was getting stuff done— but I was staying there until 11:30 PM at the earliest, 1:30 AM at the latest.  I wasn't getting &lt;span style="font-style: italic;"&gt;nearly&lt;/span&gt; enough sleep.  On the upside, spending all this time in the office gave me a chance to learn about the laundry facilities at work, but overall, I think it was more of a bad thing.&lt;br /&gt;
&lt;br /&gt;
Next week, I'm going to be defending my personal schedule against my work schedule.  I need to make sure that I give myself time to relax, to take care of personal errands, to visit with friends, sleep, and do all of the rest of the things I have to do that don't involve work.&lt;br /&gt;
&lt;br /&gt;
You may have noticed that my "Recent News I Found" sidebar has had a fairly high number of life organization articles.  (Remember that it's a separate feed from my blog.  To subscribe to that, click the "Read More..." in the sidebar, and subscribe to the feed there.)  I suppose that, as I'm finding my feet in my new job, I've been thinking a lot about getting my life better organized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-8748024287155325624?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/UhFEOhA_LL0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/8748024287155325624/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=8748024287155325624&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8748024287155325624?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/8748024287155325624?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/UhFEOhA_LL0/carving-out-time.html" title="Carving out time" /><author><name>Piquan</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/_k2C-5IOqqwU/S_HmjkwbEgI/AAAAAAAABLc/RDxv_ReozTA/s72-c/iCalScrShot001.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://stopwords.piquan.org/2007/08/carving-out-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEBR3k4eip7ImA9WxFXEUk.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-3111729312587345393</id><published>2007-07-29T19:18:00.001-07:00</published><updated>2010-05-17T18:04:16.732-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T18:04:16.732-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="reader" /><category scheme="http://www.blogger.com/atom/ns#" term="msie" /><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="sidebar" /><category scheme="http://www.blogger.com/atom/ns#" term="opera" /><category scheme="http://www.blogger.com/atom/ns#" term="rss" /><title>Welcome to the blog!</title><content type="html">As you can see, the new format is up, up, and away!  I've brought my Noogler writings over here, of course, and you'll be seeing more new content as the muse strikes.&lt;br /&gt;
&lt;br /&gt;
Let me start by giving you the executive summary for this post.  If you don't care about technical details, or getting things just right for your tastes, then just go to &lt;a href="http://reader.google.com/"&gt;reader.google.com&lt;/a&gt;, sign up if you need to, click "Add subscription", then in the box that pops up, type "www.piquan.org".  Then, add another subscription, this time for (and you'll need to copy/paste this) http://www.google.com/reader/public/atom/user/10100467309635594692/state/com.google/broadcast&lt;br /&gt;
(whew; got that all)?  Add subscriptions for all the other sites you might go to frequently to read news (Slashdot, CNN, other blogs, etc).  Then, instead of going to each of those sites each day, you can go to &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt; to see them all together, easily read.  There you go, now you don't have to read the rest of this post.&lt;br /&gt;
&lt;br /&gt;
Whew.  We've got the type A personalities out of here.  Now the rest of us can relax and enjoy the new blog.&lt;br /&gt;
&lt;br /&gt;
Now, if you've taken the time to look over the sidebar, you might think this website is the height of vanity.  Besides my last ten posts, and monthly archives, you've also got my bookmarks, my news clippings, my music, my friends, my photos, my art, me, me, me!  Yeah, okay.  I guess the way I figure, it's my blog; it should have a lot of my personality in it.  You've got links to loads of personality, right there in the sidebar.  And naturally, you should come back every day to check it!&lt;br /&gt;
&lt;br /&gt;
Okay, no, that's not true.  Most of us already have websites we periodically look at; I have about 30 different websites I like to check every day already!  (You can click on the "daily" tag in the sidebar under "My Bookmarks" to get a list.)  &lt;span style="font-style: italic;"&gt;Surely &lt;/span&gt;there's some great technology to help us keep up with all the articles from these different sites, and show us just the new ones that we, personally, haven't seen.&lt;br /&gt;
&lt;br /&gt;
Why yes, there is!  It's called RSS, and it's all over this website.  I'll talk about some of the basics of using RSS now, so later on I can just say that some feature "has its own RSS feed", and you'll know what I mean, and how to use it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.feedicons.com/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_k2C-5IOqqwU/S_HnMwkiEoI/AAAAAAAABLk/RBk9suaOx0M/s200/feed-icon.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;First, I want you to look at the right hand side of the address bar.  Yes, the bar at the top where you type in "www.piquan.org".  There may be an RSS logo there.  Depending on what browser you're using, it might be the word "RSS", or might look like a silly orange logo instead.  Chances are, it looks like the silly orange logo.  (If you're using Internet Explorer 6, you won't even see the logo; we'll talk about that case in a little bit.)&lt;br /&gt;
&lt;br /&gt;
Now, you could click on that, and I'll talk about how different browsers handle it.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Firefox&lt;/span&gt;: If you're using Firefox, you'll be shown the &lt;span style="font-style: italic;"&gt;feed &lt;/span&gt;(a list of the recent articles) and given a chance to add it as a Live Bookmark, or &lt;span style="font-style: italic;"&gt;subscribe &lt;/span&gt;(mark it as something you want to read) using one of a number of other possibilities (certain websites or programs).  If you add it as a Live Bookmark, then you'll have a bookmark (by default, in your bar) that's actually a drop-down list of articles.  When you feel like reading my articles, you can click on that bookmark, find a headline that looks interesting, and click it to go straight to the article.  It's a quick way to scan headlines without having to visit the site!&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Safari&lt;/span&gt;: When you click on the RSS icon, the web page will transform into a feed view.  If you drag that to your bookmarks bar, it will turn into a bookmark that will always show how many new articles there are.  If, for example, there's two articles since you last looked at the site, you'll see Piquan(2) for the bookmark.  Clicking that bookmark will take you to back to the feed.  Safari also has a lot of other RSS features, like the ability to show multiple feeds at once (put them in a bookmark folder), show just part of each article in the feed display (the control is on the right side), or turn your RSS feeds into a screensaver (it's in the Desktop &amp;amp; Screen Saver system preference panel, with all the other screensavers).&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Opera&lt;/span&gt;: When you subscribe to the feed (use the Atom feed), it will be added to your Feeds menu.  Within the feeds menu, you can click on an individual feed to read just that, or "Read Feeds" for all your feeds at once.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Internet Explorer 6&lt;/span&gt;: Doesn't support RSS.  Use Firefox, or look at the section below for alternatives.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Internet Explorer 7&lt;/span&gt;: It supports RSS, but I don't really know anything about it.  I'm afraid you'll have to play with it yourself, or use Firefox.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iPhone&lt;/span&gt;:  The iPhone does support RSS, but its support is pretty primitive. The RSS icon isn't displayed, presumably because there's not much screen space.  You'll need to click the Atom button at the bottom of the sidebar.  You can view the feed that way, and it's easier to read and pick out articles that way, but it doesn't remember which articles are read, or let you aggregate articles.  I recommend Google Reader instead; see below.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;Lots of different websites have RSS.  Pretty much, any website that has short, periodically added content will support RSS.  Obviously, this includes &lt;a href="http://www.piquan.org/blog/atom.xml"&gt;blogs&lt;/a&gt; (both individual and corporate), but it also includes newspapers like the &lt;a href="http://www.nytimes.com/services/xml/rss/index.html"&gt;New York Times&lt;/a&gt; and &lt;a href="http://www.mercurynews.com/rss"&gt;San Jose Mercury-News&lt;/a&gt; (yes, even &lt;a href="http://www.gosanangelo.com/feeds/headlines/news/local/"&gt;smaller local papers&lt;/a&gt; have RSS!), news channels like &lt;a href="http://www.cnn.com/services/rss/"&gt; CNN&lt;/a&gt; and the &lt;a href="http://news.bbc.co.uk/2/hi/help/3223484.stm"&gt;BBC News&lt;/a&gt;, and even common social sites like &lt;a href="http://picasaweb.google.com/data/feed/base/user/Piquan?kind=photo&amp;amp;alt=rss&amp;amp;hl=en_US&amp;amp;access=public"&gt;personal photo galleries&lt;/a&gt;, &lt;a href="http://ws.audioscrobbler.com/1.0/user/Piquan/recenttracks.rss"&gt;music trackers&lt;/a&gt;, and even &lt;a href="http://del.icio.us/rss/Piquan"&gt;social bookmarking sites&lt;/a&gt;.  If you have a personal site, such as a team high score list or baby diary, you may want to ask your administrator about enabling RSS, if he hasn't already.&lt;br /&gt;
&lt;br /&gt;
Okay, everybody's using it, but why is RSS so great?  It lets you keep up with a lot of different sites easily.  Some feed readers (such as the one in Opera) let you read all your feeds at once, so you can read your day's news from a variety of different sites, all at the same time.  Some (such as the one in Firefox) don't do that, but do let you quickly scan the article headlines without visiting the website, so you can quickly see if there are any articles you want to read.&lt;br /&gt;
&lt;br /&gt;
There's also programs that let you see RSS news in other ways than your web browser.  For example, the Mac ships with a screensaver that will read and display RSS feeds.  Google Desktop for Windows has a widget that will display RSS feeds at the side of your screen.&lt;br /&gt;
&lt;br /&gt;
Okay, you remember how I said that my website should have my personality?  Apparently, that includes my tendency towards long-winded technical explanations.  For just that reason, I'm going to recommend that you stand up, take a break, get a cuppa tea, and come back.  But we're getting to my favorite part, so don't go too far!&lt;br /&gt;
&lt;br /&gt;
Better?  Okay, then, &lt;a href="http://en.wikiquote.org/wiki/Stan_Lee"&gt;face front, true believer,&lt;/a&gt; 'cause here we go!&lt;br /&gt;
&lt;br /&gt;
I mentioned before that there are third-party programs to view RSS feeds.  I don't know what they are; you can &lt;a href="http://www.google.com/search?q=rss+feed+reader"&gt;search Google for them&lt;/a&gt; if you feel the need.  (Firefox will automatically find several of these programs, and give you the option of using them to subscribe to RSS feeds.)  But I have other ways I prefer to read my feeds.&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="" id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docId=5980861656829941065&amp;amp;hl=en" style="float: right; height: 245px; width: 300px;" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;  My favored method is &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt;.  I hadn't really bothered with it before recently.  The explanation they gave on the web page was far too vague for my taste, and I didn't really understand what it was.  So now, I'm here to tell you.&lt;br /&gt;
&lt;br /&gt;
Google Reader takes all of the RSS feeds you have from every different site and puts them all together.  It keeps track of which ones you've read.  It lets you mark some of them with a star so you remember to go back to them.  It lets you share them with other people.  It does all this in a very easy-to-use web interface.  It also has a huge list of feeds available, so you can search for feeds on &lt;a href="http://feeds.feedburner.com/parenting/updates"&gt;baby clothes&lt;/a&gt;, &lt;a href="http://blog.cowboy.com/?feed=rss2"&gt;cowboy poetry&lt;/a&gt;, or whatever else tickles your fancy.  Personally, I'll spend a few minutes each day scanning over my Google Reader inbox, and quickly pick out the articles that are worth reading.&lt;br /&gt;
&lt;br /&gt;
If you use &lt;a href="http://www.google.com/ig"&gt;iGoogle&lt;/a&gt;, which is Google's customizable portal page, then you can also put a Google Reader widget there.&lt;br /&gt;
&lt;br /&gt;
Okay, I probably sound like I work for Google or something.  But seriously, I've really enjoyed using it.  Now, maybe you go to Yahoo! every morning.  Or perhaps you prefer Ask.com, because it used to be named after &lt;a href="http://en.wikipedia.org/wiki/Jeeves"&gt;an amusing character from Wodehouse books&lt;/a&gt;.  Well, you're in luck!  Yahoo! has a similar service; you can put your RSS feeds on your My Yahoo! homepage.  (I don't know how, but it's something they've been promoting a lot lately.)  There's also a service called Bloglines that's owned by Ask.com; I don't know anything about that, though.&lt;br /&gt;
&lt;br /&gt;
So maybe, just maybe, you're wondering what interesting stuff I'm finding while I'm looking over all my RSS feeds.  Well, you're in luck!  You see in the sidebar, where it says "Recent News I Found"?  While I'm perusing my RSS feeds, I've got a button in Google Reader to share articles.  That will put the article in the "Recent News I Found" sidebar.  I've been doing this for several days now, and there's &lt;a href="http://www.google.com/reader/shared/user/10100467309635594692/state/com.google/broadcast"&gt;quite a few things I've found&lt;/a&gt; in that time.&lt;br /&gt;
&lt;br /&gt;
Of course, the "Recent News I Found" section has an RSS feed.  The articles I put in there aren't in the blog RSS feed, and vice versa.  That way, you can choose to read just the articles I find interesting (but didn't write), without having to deal with my ramblings, or you can read all my wisdom without having to put up with the rush-a-day tidbits about killer badgers in the UK.  The feed for the "Recent News I Found" section is a bit long, though... ready?  Here goes: http://www.google.com/reader/public/atom/user/10100467309635594692/state/com.google/broadcast&lt;br /&gt;
&lt;br /&gt;
Okay, that's it for today.  That's plenty enough, don't you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-3111729312587345393?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/WBYmhso_7yI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/3111729312587345393/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=3111729312587345393&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3111729312587345393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/3111729312587345393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/WBYmhso_7yI/welcome-to-blog.html" title="Welcome to the blog!" /><author><name>Piquan</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/_k2C-5IOqqwU/S_HnMwkiEoI/AAAAAAAABLk/RBk9suaOx0M/s72-c/feed-icon.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://stopwords.piquan.org/2007/07/welcome-to-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4GRHw9cCp7ImA9WB5VEkw.&quot;"><id>tag:blogger.com,1999:blog-13322352.post-2986844620477455374</id><published>2007-07-27T11:21:00.000-07:00</published><updated>2007-08-04T00:35:25.268-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-04T00:35:25.268-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sysadmin" /><category scheme="http://www.blogger.com/atom/ns#" term="holiday" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><title>If You Can Read This, Thank A Sysadmin</title><content type="html">&lt;p&gt;Today is Sysadmin Appreciation Day.  Sysadmining, as most of you know, is a rough, thankless job.  That's why the last Friday of July is designated Sysadmin Appreciation Day.  Do something special for your system administrator, network administrator, sysop, support tech, or (ahem) son today!&lt;/p&gt;&lt;p&gt;If you have no idea what I'm talking about, then visit &lt;a href="http://www.sysadminday.com/"&gt;sysadminday.com&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13322352-2986844620477455374?l=stopwords.piquan.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/piquan/blog/~4/dZGQnogPWsY" height="1" width="1"/&gt;</content><link rel="related" href="http://www.sysadminday.com/" title="If You Can Read This, Thank A Sysadmin" /><link rel="replies" type="application/atom+xml" href="http://stopwords.piquan.org/feeds/2986844620477455374/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=13322352&amp;postID=2986844620477455374&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2986844620477455374?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/13322352/posts/default/2986844620477455374?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/piquan/blog/~3/dZGQnogPWsY/if-you-can-read-this-thank-sysadmin.html" title="If You Can Read This, Thank A Sysadmin" /><author><name>Piquan</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><feedburner:origLink>http://stopwords.piquan.org/2007/07/if-you-can-read-this-thank-sysadmin.html</feedburner:origLink></entry></feed>

