<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I’m a Mac and iOS developer for Oomph  and Black Pixel.



You might know some of the apps I work on: Sidekick, Versions, and Kaleidoscope.</description><title>Rick's Random Ramblings</title><generator>Tumblr (3.0; @rickfillion)</generator><link>http://rickfillion.tumblr.com/</link><item><title>Sidekick 4.1 Beta</title><description>&lt;p&gt;Today I posted the first public beta of Sidekick v4.1. Anyone can get access to it by running `&lt;em&gt;defaults write com.oomphalot.Sidekick EnableBetaUpdates -bool YES&lt;/em&gt;` in a Terminal and restarting the app. It should prompt you to update to 4.1b2.&lt;/p&gt;
&lt;p&gt;You might not notice anything &amp;#8216;new&amp;#8217; in the app. Don&amp;#8217;t panic&amp;#8230; that&amp;#8217;s perfectly normal. Nearly all changes in 4.1 are under the hood.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mountain Lion Support&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sidekick 4.0 ran on Mountain Lion, but not as well as I wanted. v4.1 is the first version of Sidekick that should bring real support for 10.8.  This includes Developer ID code signing, so you won&amp;#8217;t need Option 3 enabled in Gatekeeper to run Sidekick anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bye Bye Garbage Collection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sidekick 4.0 inherited NetworkLocation&amp;#8217;s use of of the OS X Garbage Collector. When ARC was announced as the successor to GC, we were too far into the development of Sidekick to consider switching to it without it forcing our ship date to slip (moreso). We also weren&amp;#8217;t sure what the impact of switching to ARC from GC would be, we had code that was specifically done to take advantage of GC&amp;#8217;s strengths. We decided before 4.0 shipped that yes, eventually we will move to ARC, just not now. 4.1 is when that happens, and the results are nice&amp;#160;: lower memory footprint, less CPU being used when the app is inactive (we should be back to nearly 0% cpu usage).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixing Broken Things&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There were a bunch of little things that have broken over time in Sidekick, like icons for actions. Since we get a lot of those from the system in slightly unsupported ways, there&amp;#8217;s always a chance that they break. So we&amp;#8217;ve fixed up all the little issues that we&amp;#8217;ve found.  10.7 changed how some of the buttons rendered, causing them to look fuzzy. That&amp;#8217;s fixed. Little details here and there that have been bugging me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How beta is this beta?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is really more of a release candidate than a beta. It&amp;#8217;s stable here, and I use it every day. There are no known issues. But I&amp;#8217;m not labelling it 4.1.0 just yet simply because I want more eyes on it. We&amp;#8217;ve done our testing on 10.7 and 10.8, and it&amp;#8217;s looking really good. But I want to put it into the hands of more people and get more feedback and possibly crash logs (hopefully not?).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go Run That Command&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;defaults write com.oomphalot.Sidekick EnableBetaUpdates -bool YES&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/31601442003</link><guid>http://rickfillion.tumblr.com/post/31601442003</guid><pubDate>Sat, 15 Sep 2012 13:40:53 -0500</pubDate></item><item><title>I've integrated Oomph mapKit in my project, and I want to display a button on the map, so I drag a button from IB and set it as subview of mapKit view. but after the mapView load the data, I can't see the button. could you help me?</title><description>&lt;p&gt;GitHub would be a better place to ask these things, but i’ll answer here.&lt;/p&gt;
&lt;p&gt;That won’t work because the MKMapView, while it’s a descendent of NSView, actually creates a WebView and makes its frame the whole bounds of the MKMapView.  So whatever button you make inside of it will get hidden by the webview.  You’d need to use methods to bring it to the front after the webview has been loaded.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/29410636661</link><guid>http://rickfillion.tumblr.com/post/29410636661</guid><pubDate>Tue, 14 Aug 2012 10:14:02 -0500</pubDate></item><item><title>SimpleGrep : OpenStep to Cocoa</title><description>&lt;p&gt;With the Cube &lt;a href="http://rickfillion.tumblr.com/post/19291377949/1989-called-it-wants-its-cube-back"&gt;up and running&lt;/a&gt;, I did as any developer would do and tried to think up a small app that I could write for it. I had to decide what the goal of this app would be&amp;#8230;not what the app did, but what I wanted out of this experiment since let&amp;#8217;s be honest: I&amp;#8217;m not going to be spending a TON of time using that machine. I decided that I wanted to get a lesson in how different OS X is from OPENSTEP, and so to do that, I was going to write a little app that could be compiled and run on both my 10.7 Mac and this old Cube.&lt;/p&gt;
&lt;p&gt;I wanted an app that wasn&amp;#8217;t too complex, but at the same time would let me make use of non-trivial things like threads and interprocess communication. I decided that a good candidate for this would be a UI over the UNIX grep utility. Not a full-blown UI that presents all options, just something basic: give it a search term, a directory to start from, and a checkbox for Recursive. Or as I like to call it&amp;#160;: grep with the only option I ever use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating The App&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My first stop was Interface Builder on OPENSTEP on the cube&amp;#160;: had to make sure that this simple UI could be done without much work.  Since the nib file format has changed significantly from the days of Project Builder compared to xibs in Xcode4, I allowed myself to think of the nibs as the one platform-dependent part. And if you think about it, that would make sense even for a real app, the controller logic might be common code, but the UI should be done to fit in with the rest of the system that it is running on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mac/Cocoa Version&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With a photo of what the UI might look like with those glorious 4 shades of gray, I jumped into first building the Mac version of the app. I tried only making use of APIs that I knew had been around since 10.0 as that&amp;#8217;d likely mean they&amp;#8217;d also be in OpenStep.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not exactly a complex app, in a couple hours I had a basic app. It spun off threads that would use NSTask to execute grep with the right arguments, process output, and feed it back to the main thread, and the results would be shown in the table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Porting Process&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I really had no clue what the porting process was going to be like. Maybe this would just compile and run (one can hope, right?). I copied the source files over to my OPENSTEP virtual machine, and fired up Project Builder to create the project. I used the VM instead of the cube just because it&amp;#8217;d be faster. Have I mentioned how slow that cube is? Glacial.&lt;/p&gt;
&lt;p&gt;Step 1 was to create the nib, again. Oldschool Interface Builder had no way of looking into class files for outlet and actions, hell, IBOutlet didn&amp;#8217;t even exist as a keyword. You have to manually tell it about a class, add all outlets it might have, and the actions that can be triggered. In this case I only had a handful of either, and only 1 class instantiated in the nib (the app controller), so it wasn&amp;#8217;t too painful.&lt;/p&gt;
&lt;p&gt;The source files were imported into the project, and I attempted to build. Errors. A lot of errors. I commented out the parts where it was complaining about methods not existing (obviously I wasn&amp;#8217;t diligent enough), and tried to focus on the other errors. I can fix methods not existing somehow afterwards. One of the errors really stumped me though. Google wasn&amp;#8217;t too keen on helping out, and I don&amp;#8217;t blame it, I bet you no one has seen this error since 1996. After some trial and error I realized that this version of gcc was so old that it expected all stack variables to be defined at the top of a method/function before any code. Not the end of the world, but man is that ever annoying. This meant having to go over every function and make sure everything was defined at the top. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Missing APIs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In my original version, worker thread to main thread communication was done via -performSelectorOnMainThread:withObject:waitUntilDone:. OpenStep has NSThread, seems like a pretty safe assumption that it&amp;#8217;d have had this NSObject method. Nope. Turns out that method wasn&amp;#8217;t added to Cocoa until 10.2. This meant having to rethink how I was getting data back. Apparently the way to do inter-thread communication back then was to use NSConnection to get a proxy object. It felt a little heavy-handed to use this, since it&amp;#8217;s made to support proxy objects to other hosts on the network, but when in Rome&amp;#8230;&lt;/p&gt;
&lt;p&gt;That was the big change, most of the rest was stuff like using NSString initializers that didn&amp;#8217;t exist and could be easily swapped out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where&amp;#8217;d -R go?!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My original app on the Mac would call `grep` or `grep -R` depending on whether the user checked the Recursive checkbox. On OPENSTEP it would just fail whenever I&amp;#8217;d try recursive searches, and I was a little puzzled about why. Reading the (humourlessly short) man page told me that -R wasn&amp;#8217;t an argument for grep. Well that sucks. Considered my options, like just dropping that checkbox from one or both versions, and decided instead to move the recursive functionality into the app. Now both could call grep with the same arguments all the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Back to the Mac&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once the app ran as expected on OPENSTEP, I moved the code back to the and tried to run it there. Like any good project, it didn&amp;#8217;t work. Luckily it only needed a couple small changes with how I was getting the proxy object with NSConnection. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The App&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the app, in all of its glory. You can check out the sources on github:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/rickfillion/SimpleGrep"&gt;&lt;a href="http://github.com/rickfillion/SimpleGrep"&gt;http://github.com/rickfillion/SimpleGrep&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screenshots of it running on OS X and OPENSTEP.  &lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m2g02t0EWM1qa0w2c.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m2g03aoIC71qa0w2c.png"/&gt;&lt;/p&gt;
&lt;p&gt;Main features of the app:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Can search recursively&lt;/li&gt;
&lt;li&gt;All searches happen on secondary threads so the UI shouldn&amp;#8217;t be blocked&lt;/li&gt;
&lt;li&gt;Displays paths for results as well as the line number that matched, and the line of text itself.&lt;/li&gt;
&lt;li&gt;Shows the respective icon for each file&lt;/li&gt;
&lt;li&gt;Double clicking on a result opens that file with whatever app is associated with it&lt;/li&gt;
&lt;li&gt;Shows the app&amp;#8217;s status and how many results found so far.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/21051612070</link><guid>http://rickfillion.tumblr.com/post/21051612070</guid><pubDate>Fri, 13 Apr 2012 19:03:19 -0500</pubDate></item><item><title>1989 Called.. It wants its Cube back.</title><description>&lt;p&gt;I&amp;#8217;ve wanted a &lt;a href="http://lowendmac.com/next/nextcube.html"&gt;NeXTCube&lt;/a&gt; since I first learned what they were, which was well after they stopped being made, and some time after Apple bought NeXT. Last summer, I finally got one as &lt;a href="http://stuntsoftware.com/"&gt;Dan Messing&lt;/a&gt; decided he didn&amp;#8217;t want to lug his out to Portland in his move. It was a physical machine, but not much more than that. It couldn&amp;#8217;t boot. It couldn&amp;#8217;t even power on. But hey&amp;#8230; it had that awesome little logo on every component, and that was a hell of a start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Powering On&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;#8217;t speak for all NeXT hardware, but the cube was built so that the display would connect to the cube, then the keyboard, mouse and audio would connect through the display. There&amp;#8217;s no physical power button on the cube, the button is on the keyboard. This cube came without the cable that connects the display to the cube. I did some research online, and considered building the cable myself. Decided that since I&amp;#8217;m no electrical engineer, and I could manage some damage if I screwed up pins, that it&amp;#8217;d be a better idea to just find one somewhere I could buy. There&amp;#8217;s a company in the US, &lt;a href="http://www.blackholeinc.com/"&gt;Black Hole Inc&lt;/a&gt;, that actually sells NeXT equipment, so I ordered one from there.&lt;/p&gt;
&lt;p&gt;I got the cable a few weeks later, connected it all together and hit the power button. Fans turned on, the screen lit up, it beeped. I smiled. It spat out an error about the SCSI disk, which Dan told me had gone bad. Attempts at booting went nowhere. Well, at least I can look at the NeXT boot rom, right? The fact that they made that look like their Terminal app is &lt;em&gt;awesome&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Screw that, I didn&amp;#8217;t get a cube to just stare at its boot rom. Let&amp;#8217;s get this thing up and running! What do I need? Well&amp;#8230; something to install the operating system onto would be a good start. And a way to install said operating system would be another requirement. I figured I could likely find ISOs of OPENSTEP install media online, but as it turned out, &lt;a href="https://twitter.com/#!/fusionboy27"&gt;Chris Dandeneau&lt;/a&gt; had an original box of it from when IDFusion used to be a WebObjects company and Apple was dumping inventory. I took a trip to ye olde computer shop that I knew sold antiquated computer equipment and bought a 2gb SCSI-2 hardware along with a SCSI cdrom. &lt;/p&gt;
&lt;p&gt;Threw them in there, which was tricker than expected since it wasn&amp;#8217;t designed for either 3.5inch harddrives (it came from the days of 5.25inch HDs), nor CDROMs at all.  Its front face only really supports that bizarro Magneto-Optical thing the original cubes came with.  Let&amp;#8217;s just say the CDROM hung out outside. I&amp;#8217;m all set, I thought. Once the OS is installed, I don&amp;#8217;t really need the CDROM anymore, so it doesn&amp;#8217;t matter that it&amp;#8217;s a ghetto setup.  Well&amp;#8230; yeah&amp;#8230; no. As it turns out, though SOME NeXT machines could boot off of CDROM, this wasn&amp;#8217;t one of them. I wasn&amp;#8217;t able to find a floppy drive that was compatible with it, either. I needed something to jumpstart the install process&amp;#8230; you know, actually boot the thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8230;I said Boot!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I looked at my options, and realized my best bet was to do a netboot. Every NeXT machine came standard with a network interface. Luckily for me, the cube I have was the first one to have that be &amp;#8220;standard ethernet&amp;#8221; as opposed to coax (token-ring, I guess?). Unluckily for me, I knew nothing about netbooting other than the fact that it was this cool thing I&amp;#8217;ve always wanted to do back when I was a Linux user, but never had hardware capable of it.&lt;/p&gt;
&lt;p&gt;I spent a few nights with OS X&amp;#8217;s DHCP services, since it&amp;#8217;s capable of netbooting other Macs. I never got anywhere with that.  I installed NetBSD&amp;#8217;s DHCPd on OS X and tried with that.  I got to the point of getting an IP over to the cube, but it never did anything beyond that. I knew too little, and was rushed due to our move to Ottawa. I put it aside and said I&amp;#8217;d try again when things settled down again.&lt;/p&gt;
&lt;p&gt;It took a while for things to settle down. The move, new job, a few conferences, christmas&amp;#8230; Some time in February I finally managed to drag it out from the box it was in, and start toying around again.&lt;/p&gt;
&lt;p&gt;This time I was smarter: screw OS X as a netbooting host. I know next to nothing about OS X&amp;#8217;s network services, but I used to be a sysadmin at an ISP that ran Linux for everything. I setup a Debian virtual machine whose network adapter was bridged with my Mac&amp;#8217;s ethernet port. A nice bonus of using Linux was that it actually has read support for the NeXT flavor of UFS they used for the filesystem on the OPENSTEP install media.&lt;/p&gt;
&lt;p&gt;It actually didn&amp;#8217;t take me that long to get it netbooting from there. It was super interesting to watch tcpdump during the whole process to see what was going on. The trickiest part being setting up the TFTP server for some reason. You need a surprising number of services to netboot the thing: dhcpd, bootparamd, tftpd, nfsd, and dns. I hate bind configuration files. NFS not wanting to serve up the CDROM mount point was also an annoyance, but nothing a little cp -A couldn&amp;#8217;t fix. &lt;/p&gt;
&lt;p&gt;It could now boot into the installer, from the network. My original plan was just to get it to load the kernel to get it to see the CDROM and do the install that way. The fact that I could now just serve up the whole installer from the network was a huge bonus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install where, you say?!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m all set, right? Installer can start up, I should be up and running in no time. Well&amp;#8230; you see&amp;#8230; here&amp;#8217;s where I learned that somewhere between packaging the cube up before the move and now, I lost the harddrive I bought. Cause you know&amp;#8230; I didn&amp;#8217;t have enough trouble.&lt;/p&gt;
&lt;p&gt;Plow ahead! A this point I knew more than I&amp;#8217;ve ever wanted to know about netbooting, and I&amp;#8217;ve been reading from others who permanently run their NeXT boxes purely from the network once the harddrive died.  Not a bad idea, why would I want to depend on some old drive? When it dies, I have to go through all of this again? No thanks.&lt;/p&gt;
&lt;p&gt;New plan&amp;#160;: Let&amp;#8217;s setup two NFS shares, one that serves up the installer, and the other that I&amp;#8217;ll install it to.  Slight wrinkle in that plan&amp;#160;: The OPENSTEP installer A) fails when it can&amp;#8217;t find a harddrive in the machine, and B) doesn&amp;#8217;t support installing to an NFS mount (don&amp;#8217;t really blame it there).&lt;/p&gt;
&lt;p&gt;Interestingly, the entire installer process is a single shell script, the init process checks for its presence, and runs it if it&amp;#8217;s there. A shell script. To install an operating system. Think about that for a second. Even better, it asks about 4 questions then runs: &amp;#8220;ditto -arch some_arch -bom somebom / /install_mount&amp;#8221;. So&amp;#8230;comment out the parts that look for a disk, mount the NFS share, hardcode it to ditto over there and I&amp;#8217;m golden.&lt;/p&gt;
&lt;p&gt;Well not quite. Cause to get the critical parts to actually work out, I had to edit the install script, and the CDROM&amp;#8217;s /etc/fstab.  /etc/fstab is one of the files that&amp;#8217;s in the BOM list, so it gets copied over. Part of a BOM file is a checksum, and if the checksums don&amp;#8217;t match, the whole ditto process fails.  So I was getting to the point of copying /etc/, and things would go south. I considered rebuilding my own BOM file, but it seems like that format has changed between then and now (where I have tools for it).  I couldn&amp;#8217;t just remove the -bom option because then it&amp;#8217;d copy the whole CD.  I can do that with cp. Obviously it was omitting some files (like the installer script) that would indicate that it should boot as a live system.&lt;/p&gt;
&lt;p&gt;I ended up using my Mac to run ditto -arch from one share to another, and moved over the installer manually. When doing that and booting off of the new share, it actually got pretty far into the start up process. It actually got to the point of loading the window server, and I could telnet in, but it seemed stuck in a loop. Looking at log files it seemed stuck running BuildDisk. I&amp;#8217;m in over my head. WTF is BuildDisk? I signed up for what&amp;#8217;s likely the only active NeXT user forum still in existence, and asked my question there:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nextcomputers.org/forums/viewtopic.php?t=3048&amp;amp;sid=4cd22a9f527f6b152ae957ae368ae75f"&gt;&lt;a href="http://www.nextcomputers.org/forums/viewtopic.php?t=3048&amp;amp;sid=4cd22a9f527f6b152ae957ae368ae75f"&gt;http://www.nextcomputers.org/forums/viewtopic.php?t=3048&amp;amp;sid=4cd22a9f527f6b152ae957ae368ae75f&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Halp?!&lt;/p&gt;
&lt;p&gt;As you can see from their answers, they thoroughly did not approve of this &amp;#8216;clever&amp;#8217; installation method.  And obviously I was overthinking this whole thing.  Install OPENSTEP in a Virtual Machine, and have it serve the netboot environment to the cube. Duh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It ain&amp;#8217;t over till the FAT lady sings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Getting OPENSTEP running in a VM is a pretty trivial process. The whole driver issue is somewhat maddening (dealing with drivers manually always is), but other than that it was clear sailing. The added bonus of using a VM was that I could snapshot the harddrive and keep notes of what was working and what wasn&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;Remember that little shell script, and the ditto command it ran? Remember that -arch option? Yea well it trims all FAT binaries to only support the currently running architecture. That virtual machine&amp;#8230; it runs i386, and the cube&amp;#8230; m68k. I can&amp;#8217;t just boot the cube off of this install via netboot, cause all m68k support has been stripped/lipo&amp;#8217;ed. &lt;/p&gt;
&lt;p&gt;I came up with this idea.. I could write a script which went through their install BOM file, find all the FAT binaries, figure out if they were lipo&amp;#8217;ed, and if so, reinstall it from the install cd. It took me a couple tries, but I was able to run such a script. It worked, sort of. But afterwards all sorts of things didn&amp;#8217;t quite work right (I&amp;#8217;d get bizarre errors), which led me to believe that clearly this isn&amp;#8217;t a great idea.&lt;/p&gt;
&lt;p&gt;What I ended up having to do was setup a secondary harddrive in the VM, and use the tool they have that can create an install disk from the original. I could then edit the installer script to remove the -arch option to ditto. I was careful to not edit any files that might be listed in the BOM to avoid checksum mismatches. I could then boot that secondary harddisk as the installer, and install over the primary disk.&lt;/p&gt;
&lt;p&gt;That finally gave me an install where all binaries were FAT with support for i386 and m68k.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oh right&amp;#8230; the point was to boot the cube &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NeXT made some really nice GUI network management tools to configure their NetInfo stuff. I read their system administration guide to get a feel for how it should all be setup, and configured everything accordingly. I should mention that those &amp;#8216;really nice GUI network management tools&amp;#8217; are &amp;#8216;incredibly thin window dressings&amp;#8217; over the configuration files. In the sense that they do next to no validation of input, and let you put your machine in a state where it can&amp;#8217;t boot anymore. Thanks! Needed salt in the wound at this point.&lt;/p&gt;
&lt;p&gt;Eventually&amp;#8230; when the VM would boot again, and I was confident in what I had done: power up the cube again, and type in &amp;#8216;ben&amp;#8217; for the millionth time to have it boot over ethernet. The VM fed it the boot info like a champ. Everything&amp;#8217;s going swimmingly&amp;#8230; the window server starts up. Spinning beachball in glorious 4 shades of gray. Oh no.. I&amp;#8217;ve seen this before. I telnet in and check the logs. BuildDisk in a loop again. &lt;em&gt;*throws chair across the room*&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was pretty much convinced at this point that there was something wrong with the cube, hardware-wise. Now, having used OPENSTEP for more than 2 minutes, I know that BuildDisk is the utility that sets up an initial install. The CD copies itself to a disk, then BuildDisk runs and installs the optional pkg files. Part of its process is figuring out where to install, and it looks for fixed disks. That SCSI bus errors out on every boot, likely because it has no terminator on it. Some googling tells me you probably want to avoid interacting with an un-terminated SCSI bus. OK fine! I&amp;#8217;ll buy a terminator for it. If I can find one.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t think Ottawa has any stores that sell antiquated stuff like this. I emailed a few places and got either no responses or &amp;#8220;we don&amp;#8217;t sell that stuff anymore.&amp;#8221;  I even emailed &lt;a href="http://www.syrotech.mb.ca"&gt;Syrotech&lt;/a&gt;, my goto place in Winnipeg to see if they could ship me one.&lt;/p&gt;
&lt;p&gt;But wait&amp;#8230; what&amp;#8217;s telling BuildDisk that it should run? Why does it think things aren&amp;#8217;t setup? To netboot, you have to feed each machine its own /private mount, which is where /etc/ lives, amongst other things. I was able to confirm that nothing outside of /etc/ should be different for the cube than the host machine. Whatever it is, it would have to be in /etc/. So what I ended up doing was copying over the host&amp;#8217;s /etc/ into the netboot client&amp;#8217;s /etc/, then having to manually switch stuff out to be appropriate for the cube again.  It&amp;#8217;s worth a shot, right?&lt;/p&gt;
&lt;p&gt;Well&amp;#8230; that did it. So there&amp;#8217;s something in their new-netboot-client template that marks it &amp;#8220;not setup yet&amp;#8221;, that I was able to work around by just copying the entire /etc.  I still want to figure out what that is, and it shouldn&amp;#8217;t be too tough, there&amp;#8217;s only ~100 or so files in there. I could script something to diff each one and show me all differences. It&amp;#8217;s bound to pop up.&lt;/p&gt;
&lt;p&gt;The important thing is: It works! I can start it up, and login, and use the thing!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It works&amp;#8230; now what?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I now have a working NeXTCube. It boots off the network, it stores its swapfile on the network, and it&amp;#8217;s awesome. It&amp;#8217;s fantastically slow, which is probably partially because everything is network based (even though 10Mbps is probably about as fast as the hard disks back in the day?), but most likely because it has a 25Mhz processor. My iPhone probably has 100x the processing performance of this thing.&lt;/p&gt;
&lt;p&gt;OPENSTEP is actually really, really cool. Of course, dev tool stuff is neat, but I&amp;#8217;m actually starting to finally appreciate some of the stuff I&amp;#8217;ve heard that I used think was ridiculous. Like tearing off a menu that you use often and keeping it nearby. It comes in super handy. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been poking around, and trying to get a better feel for what has changed between then and now. One thing I didn&amp;#8217;t realize was the fact that you literally had to write postscript to do drawing. The code in an NSView&amp;#8217;s -drawRect: from that time really doesn&amp;#8217;t resemble today at all. I always assumed that Quartz and DPS had similar front-end code, and that it was mainly a backend difference.&lt;/p&gt;
&lt;p&gt;A big part of this for me was just the challenge. At any point, I could have ordered a SCSI disk from BlackHole with OPENSTEP pre-installed and been done with it. But what fun is that? I learned a ton in the process, and despite the loud cursing that could be heard coming out of my office, this type of stuff is actually really fun for me. Fun in a &amp;#8220;I never want to go through that again&amp;#8221; kind of way, I mean. &lt;/p&gt;
&lt;p&gt;I have a project or two that will make serious use of the cube, one of which is actually mostly done already and I&amp;#8217;ll probably blog about it in the not-too-distant future.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/19291377949</link><guid>http://rickfillion.tumblr.com/post/19291377949</guid><pubDate>Wed, 14 Mar 2012 10:17:00 -0500</pubDate></item><item><title>Details : Path's "+" Button</title><description>&lt;p&gt;I felt like one of the last people to finally download the new &lt;a href="http://path.com"&gt;Path&lt;/a&gt; app for iOS the other day. It seemed like everyone on my twitter feed thought this app was the coolest thing ever, but the &amp;#8220;It&amp;#8217;s like a social network!&amp;#8221; aspect of it turned me off. I don&amp;#8217;t need another social network in my life. But&amp;#8230; since everyone praised the UI, it was time to give it a try.&lt;/p&gt;
&lt;p&gt;I still don&amp;#8217;t know if/how this app would fit into my regular usage, but I won&amp;#8217;t talk about that today. The app is an absolute joy to use, and I think this is entirely because of its UI, and the hard work that went into all of the details. The screenshots don&amp;#8217;t do it justice, because it&amp;#8217;s the interactions and animations that make it shine. I&amp;#8217;d only give it a &amp;#8220;above average&amp;#8221; as far as pure looks go.&lt;/p&gt;
&lt;p&gt;A lot of these UI ideas are going to get copied into apps, just like pull-to-refresh did. One of them was &lt;a href="http://lab.victorcoulon.fr/css/path-menu/"&gt;redone using CSS&lt;/a&gt;. The + button, this is one of my favorite parts of the app. I could play with that button all day long, but the CSS version brings no such joy.&lt;/p&gt;
&lt;p&gt;I want to make something perfectly clear before I go on&amp;#8230; I think what Victor Coulon has done is really cool, and I applaud him for taking the time to try to replicate this control using CSS. I think it&amp;#8217;s using CSS beautifully to do what CSS should do: presentation of elements. So no&amp;#8230; this isn&amp;#8217;t a rant about how this doesn&amp;#8217;t belong in CSS.&lt;/p&gt;
&lt;p&gt;The CSS version doesn&amp;#8217;t feel as fun as the original because it tries to be just like the original and fails at it. It&amp;#8217;s in uncanny valley. &lt;/p&gt;
&lt;p&gt;So let&amp;#8217;s go through where they differ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Event Triggering&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Path&amp;#8217;s + button actually gets triggered on touch-down as opposed to touch-up-inside. This is a departure for from most buttons. At first I wasn&amp;#8217;t sure I liked this, but I&amp;#8217;ve decided that in this case it&amp;#8217;s completely appropriate. What&amp;#8217;s the harm in accidentally triggering this button? None. It doesn&amp;#8217;t bring you to another screen, it&amp;#8217;s never destructive, it doesn&amp;#8217;t put you in another mode. Accidental tapping in this case can very easily be undone by either re-tapping or tapping anywhere else on the screen (so actually it is modal, I lied).  Having it occur on touch-down makes it feel faster than most buttons. It&amp;#8217;s false, but that doesn&amp;#8217;t matter. &lt;/p&gt;
&lt;p&gt;Victor&amp;#8217;s CSS version gets triggered on click, which is equivalent to touch-up-inside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Animation Timing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UI animations need to be fast, otherwise they get tiresome after a while because the user can work tap faster than the UI can construct itself.  The animation duration of the CSS version is way off. On the open animation, I&amp;#8217;d guess it&amp;#8217;s about 25% slow. On the close animation I&amp;#8217;d guess about 50% too slow.&lt;/p&gt;
&lt;p&gt;This accentuates the fact that the close animation isn&amp;#8217;t quite like the original in how the rotation of the x back into + is timed against the rolling back in of the other elements. They feel completely separate on the CSS version, but in Path they feel related, if not synchronized.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Frame Animations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are two major components to this key frame animation: Spinning, and Movement (translation). &lt;/p&gt;
&lt;p&gt;In the original, you can clearly see that the elements spin upon opening. This might be the case the CSS version, but it ends up looking like a blur because the movement part is inaccurate. What&amp;#8217;s clearer is that there&amp;#8217;s excessive spinning upon closing in the CSS version.  I think the original does either 1, 1.25, or 1.5 revolutions upon closing (likely the same upon opening, but it&amp;#8217;s harder to see). The CSS version looks like it&amp;#8217;s doing over 2 revolutions. I&amp;#8217;ll note though, that being starts, it&amp;#8217;s particularly hard to track that.&lt;/p&gt;
&lt;p&gt;The movement feels very iOS-ish in Path.  It&amp;#8217;s similar to elastic scrolling. When the elements roll out they bounce into place.  The CSS version has the elements smashing against a wall.  Upon closing, the CSS version seems to exaggerate the pull back before they return. The distance that they pull back seems about right, but the proportion of time during the pull back versus the return is off which makes it feel more like a slingshot than the original.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Details Details Details&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think this is a great example of why details matter. This is essentially the same control, as far as functionality goes, but one feels like a treat and the other feels like a gimmick. &lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t mean to pick on Mr Coulon&amp;#8217;s work. I&amp;#8217;m sure if he spent more time on it, he could get it looking (err&amp;#8230; WORKING) almost exactly like the original. But that&amp;#8217;s my point&amp;#160;: details take time. Details are exhausting, and require a ton of trial and error. I spent at least 5 minutes last night just tapping Path&amp;#8217;s button again and again looking at the animation to try to figure it out exactly, to figure out why it felt so right. Recreating it would take me much longer than those 5 minutes. This exhausting trial and error is how you can manage to create things that not only look good, but feel fantastic.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/13780049175</link><guid>http://rickfillion.tumblr.com/post/13780049175</guid><pubDate>Mon, 05 Dec 2011 09:05:14 -0600</pubDate></item><item><title>Sidekick! Finally!</title><description>&lt;p&gt;It&amp;#8217;s been two years since I started the big &amp;#8220;reworking&amp;#8221; of core parts of &lt;a href="http://networklocationapp.com"&gt;NetworkLocation&lt;/a&gt;. It was my first real Cocoa app. The codebase grew and morphed as I learned the do&amp;#8217;s and dont&amp;#8217;s of how to write a proper Mac app. Some of the code was still present from v1.0, which could either mean it was doing a really good job or that we had painted ourselves into a corner where replacing it would be painful. There was some of both.&lt;/p&gt;
&lt;p&gt;AutoLocate, the little engine we have that figures out where you are, had grown in a way that was really starting to limit us. It had &amp;#8220;that one nasty method&amp;#8221; that did most of the hard work. It was much too long, and contained approximately zero comments. Modifying it had become something I really dreaded doing because it required thinking of every different permutation that we had designed it to handle, and how that scenario would play down the gauntlet. &lt;/p&gt;
&lt;p&gt;The general UI of the app was still very much so inspired by v1.0. We freshened it up with every release, but it was never redesigned. &lt;/p&gt;
&lt;p&gt;We decided that it was time to start rethinking things, and that it was ok if this release would take longer than our previous releases to build. At the time, we thought&amp;#8230; no real new features, we&amp;#8217;ll name this NetworkLocation 3.5.&lt;/p&gt;
&lt;p&gt;Chris started plugging away at a redesigned AutoLocate engine that was much better designed, and still every bit as powerful (if not moreso).&lt;/p&gt;
&lt;p&gt;Phil and I spent countless hours mocking up different versions of the configuration/preferences screen. How do we make all of this stuff simple to use? The biggest disconnect we dealt with was the relationship between AutoLocate rules and Locations. It was a one-to-many relationship, and each AL rule would contain a set of conditions for each type. Combine that with the fact that it wasn&amp;#8217;t an ALL or ANY used to evaluate the rule, instead it was &amp;#8220;the magic of ALv1 will figure it out&amp;#8221;&amp;#8230; and you had yourself something that was technically very cool, but in reality, a real pain to explain how to use. As the person who had to attempt to train support staff in how to figure out what was going on with users&amp;#8217; systems, let me tell you&amp;#8230; this was insane.&lt;/p&gt;
&lt;p&gt;So the challenge&amp;#8230; to make something that&amp;#8217;s as powerful as we had, but simple to explain. After many attempts we ended up landing on what we have now in Sidekick which is a simple ANY per type, and an ALL across the types. If I configure &amp;#8220;at 700 Corydon Ave&amp;#8221; and &amp;#8220;connected to 22inch Samsung&amp;#8221;, then both have to be true for it to work. If multiple devices are listed, then I need to be at that location, and connected to any of those devices. Much. Much. Simpler. Of course, there&amp;#8217;s weighting thrown into the mix to find the best match if there&amp;#8217;s a tie.&lt;/p&gt;
&lt;p&gt;We realized that CoreLocation was by far the most user friendly way of identifying where a Mac was. Having a user interact with CoreLocation though&amp;#8230; what with it being based on longitude/latitude&amp;#8230; ouch painful. Obviously a map can help here, but interacting with a map in a Mac app is no trivial task. After a bit (ok a lot) of prodding by Phil, I wrote a little prototype to see how difficult it&amp;#8217;d be to interact with a live Google Map. Turns out.. it wasn&amp;#8217;t that bad. Definitely feasible, but their API is pretty painful to work with. I was stuck writing a bunch of wrappers around it to make it less painful anyways, so that&amp;#8217;s when I started &lt;a href="http://rickfillion.tumblr.com/post/1134987954/pretroducing-mapkit-for-mac"&gt;MapKit for Mac&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fast forward another few months when we realize that &amp;#8220;NetworkLocation&amp;#8221; really doesn&amp;#8217;t fit with what the product has become. NetworkLocation started life out as a faster way to switch OS X&amp;#8217;s Network Location (the ones you configure under the Network tab of System Preferences). Now very few people actually use NL to do that at all. It&amp;#8217;s a tool to configure your Mac based on where you are. One of those things might be to change network settings, but calling it that is about as appropriate as it would be to call it PrinterLocation because it can set your default printer. We had to find a new name: Sidekick. You&amp;#8217;re the super hero, it&amp;#8217;s that little dude that hangs out and does those annoying little tasks for you.&lt;/p&gt;
&lt;p&gt;By now we&amp;#8217;ve gutted the UI, rebuilt the AutoLocate engine, added actions, recoded a bunch of the actions with cleaner code, recoded a ton of old code that I decided was too old/ugly to keep around, and changed the entire branding of the app. It wasn&amp;#8217;t a hard decision to stop calling it 3.5 and give it a 4.0 version number.&lt;/p&gt;
&lt;p&gt;Of course, there were other setbacks, like the fact that we also decided to rename the &lt;a href="http://oomphalot.com"&gt;company&lt;/a&gt; at the same time, switched store providers, and wrote a rather &lt;a href="http://AppBodega.com"&gt;sizeable app&lt;/a&gt; that sucked up all of my free time.&lt;/p&gt;
&lt;p&gt;We worked really hard on this, but I don&amp;#8217;t think the end result would have been in the same league had it not been for a bunch of people who helped us out. Ash Ponders and his team at &lt;a href="http://aptfolk.com"&gt;AptFolk&lt;/a&gt; have helped us in a big way by providing end user support. I used to do it all, and it left me with no time to do coding. They also wrote the user guide, and did an awesome job of it. Leanne Havelock from &lt;a href="http://fourletterword.c"&gt;FourLetterWord&lt;/a&gt; did all of our copywriting for the new site, press release, and a bunch of other stuff (some of which isn&amp;#8217;t out yet). &lt;a href="http://californiandesign.com"&gt;Miles Ponson&lt;/a&gt; did our app icon and status menu icon, both of which I think he nailed. Our relentless beta testers (too many to name) who sent me many a crash log to tend to. And of course, Tiff who&amp;#8217;s been kind enough to let me have an affair with Xcode.&lt;/p&gt;
&lt;p&gt;The end result is something I&amp;#8217;m really proud of. &lt;a href="http://oomphalot.com/sidekick/"&gt;Sidekick 4.0&lt;/a&gt; works in both Snow Leopard and Lion. We decided to make it a free upgrade for NL3 owners because we believe it&amp;#8217;s substantially better and want all of our users to upgrade as soon as possible, so we removed as many barriers as possible. It should be able to import all of your NL3 actions and locations, and even automatically upgrade your NLPlugins to SKPlugins if you have any installed.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://oomphalot.com/sidekick/"&gt;Sidekick&lt;/a&gt; is the new NetworkLocation.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/8459153589</link><guid>http://rickfillion.tumblr.com/post/8459153589</guid><pubDate>Wed, 03 Aug 2011 23:25:22 -0500</pubDate></item><item><title>Wanted: Ottawa Apartment</title><description>&lt;p&gt;&lt;span&gt;As some of you may know (and some of you may not) I am leaving Winnipeg and heading to Ottawa in a month. My girlfriend got into grad school there, so we&amp;#8217;re heading there at the end of August. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Why does this matter? Why am I blogging about this? &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This is a plea for a very huge favour from those of you from the Ottawa area. You see, we have been searching for apartments for over a month now, and either have been disappointed with our findings, or have not been on time with our application (since we can never be there in person after a viewing). But we have been limited to internet finds - all of those niche places who have no need to post online have been under our radar. I can only assume that Ottawa is like Winnipeg where the good finds just don&amp;#8217;t make it online. We&amp;#8217;re starting to run out of time, and don&amp;#8217;t especially feel like living in the ghetto.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;So, if you can help us find something, we will be forever grateful and shower you with gifts (or just take you out to dinner, whichever). &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here is a list of what we are looking for:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Location: Central. Tiff is going to Carleton U, so Glebe and north into Central Ottawa is prime and we want it! Basically the area between Bronson and Elgin from the north to the river. She&amp;#8217;s planning on busing it to school every day.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2 bedrooms (or one bedroom with den) Parking (1 spot, small car) and Laundry on site, Decent Kitchen, decent square footage (nothing under 700). We’d love a balcony or patio, or some sort of back porch/yard on which to drink/enjoy beer, but we can definitely do without it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Price? Technically we are looking in the 1200-1400 range, but we can go as high as 1550 with utils and parking included. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If you can help us out we promise to return the favour. (Did I mention that Tiff makes fresh bread?)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Email me at rick@centrix.ca if you&amp;#8217;ve got anything.&lt;/span&gt;&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/8093395952</link><guid>http://rickfillion.tumblr.com/post/8093395952</guid><pubDate>Tue, 26 Jul 2011 13:25:50 -0500</pubDate></item><item><title>Say hello to NetworkLocation v4.</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lm75qwj9id1qa4i81o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Say hello to NetworkLocation v4.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/6132682056</link><guid>http://rickfillion.tumblr.com/post/6132682056</guid><pubDate>Thu, 02 Jun 2011 23:28:09 -0500</pubDate></item><item><title>WWDC Prep-time</title><description>&lt;p&gt;I was reading Twitter last night and saw someone mention &amp;#8220;Monday&amp;#8217;s keynote,&amp;#8221; and thought.. &amp;#8220;I think you mean&amp;#8230; a week from Monday.&amp;#8221;  Then I realized, holy crap, nope, it&amp;#8217;s THIS Monday. WWDC 2011 is just around the corner.&lt;/p&gt;
&lt;p&gt;This will be an interesting one, I&amp;#8217;m sure. Besides the normal &amp;#8220;The sessions will be awesome, the beer will be fantastic, and the people will be vulgar&amp;#8221; I mean.  &lt;/p&gt;
&lt;p&gt;This year will be neat for a whole other set of reasons. For one, it&amp;#8217;s been like a month since we&amp;#8217;ve last seen @cvee, which is the longest we&amp;#8217;ve gone without seeing him since we hired the bird-like-individual a few years ago. I look forward to hanging out with him again. There&amp;#8217;s no big-bird like a drunk big-bird.&lt;/p&gt;
&lt;p&gt;Dave (he uhh&amp;#8230; doesn&amp;#8217;t do twitter), our new guy, or &amp;#8220;Rainman #2&amp;#8221; I like to call him (@cvee was Rainman #1) will be joining us for the first time. That&amp;#8217;ll be interesting, cause well, he doesn&amp;#8217;t drink (guess he didn&amp;#8217;t get the memo about what the D stood for). But seriously, I&amp;#8217;m looking forward to seeing what he thinks of the conference.  Dave quite literally taught me how to code, forever ago. He somehow had the patience to teach highschool-me how to code in assembly.  It&amp;#8217;s taken me years to convince him to learn Cocoa and tackle consumer software with me.&lt;/p&gt;
&lt;p&gt;@chrisfarber will be there. Jesus. Still doubting this one will actually happen. I&amp;#8217;ve known @chrisfarber for almost as long as I&amp;#8217;ve known Dave, the big difference here is that we&amp;#8217;ve been running a business together, and I&amp;#8217;ve never met him. When we started NetworkLocation, I think he was still in high school.  He&amp;#8217;s been in university for what feels like forever. He&amp;#8217;ll be bunking with Phil and I, so I fully expect him to leave mentally (and potentially physically/emotionally) scared. He might actually be 21 now, and so there will need to be some type of company initiation thing going on involving medically-unrecommended amounts of beer. Oh&amp;#8230; and at one point I have to &amp;#8220;accidentally&amp;#8221; introduce him to @rudyrichter.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll be sportin some new advert-tees that we just got in this week for Oomph, and Sidekick. Come find us and say hello, we don&amp;#8217;t bite. We might say awful awful things, but I promise we don&amp;#8217;t physically bite.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/6132607085</link><guid>http://rickfillion.tumblr.com/post/6132607085</guid><pubDate>Thu, 02 Jun 2011 23:25:07 -0500</pubDate></item><item><title>Raw Syntax: Importance of Side Projects</title><description>&lt;a href="http://rawsyntax.com/post/5982784556"&gt;Raw Syntax: Importance of Side Projects&lt;/a&gt;: &lt;p&gt;Completely agree.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rawsyntax.com/post/5982784556"&gt;rawsyntax&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Side projects are important for a few reasons. Programming is a creative process. Side projects allow programming without deadlines or restraints. Side projects allow programming in an exploratory way.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://rickfillion.tumblr.com/post/6013459451</link><guid>http://rickfillion.tumblr.com/post/6013459451</guid><pubDate>Mon, 30 May 2011 16:32:31 -0500</pubDate></item><item><title>Breadcrumb in action </title><description>&lt;p&gt;We recently made &lt;a href="http://madefresh.ca/breadcrumb"&gt;Breadcrumb&lt;/a&gt; available for private beta over at &lt;a href="http://madefresh.ca"&gt;freshcode&lt;/a&gt;. I&amp;#8217;ve since put it into &lt;a href="http://NetworkLocationApp.com"&gt;NetworkLocation&lt;/a&gt; so that we can use it, and see how it works in the real world. When we designed Breadcrumb, we wanted it to work with any store so we tried to make it as generic as possible and not require any server software.&lt;/p&gt;
&lt;p&gt;NetworkLocation is sold via a slightly customized &lt;a href="http://www.potionfactory.com/potionstore"&gt;PotionStore&lt;/a&gt; install over at &lt;a href="https://secure.centrix.ca"&gt;&lt;a href="https://secure.centrix.ca"&gt;https://secure.centrix.ca&lt;/a&gt;&lt;/a&gt;. Anyone who knows me knows how much I hate Ruby on Rails, and so I did zero modifications to PotionStore to support Breadcrumb. Someone with less hatred for RoR could likely add the Breadcrumb data to the model in no time, but for my needs, it wasn&amp;#8217;t necessary.&lt;/p&gt;
&lt;p&gt;Upon first launch of NetworkLocation 3.1.4 and higher, Breadcrumb runs and tries its best to determine where the user got NL, and stores that info in NSUserDefaults. When a user clicks &amp;#8220;Buy Now&amp;#8221; in NetworkLocation, the app requests that info from Breadcrumb, and I attach it to the URL that&amp;#8217;s sent to the browser. So what used to be &amp;#8220;https://secure.centrix.ca/?product=nl3&amp;#8221; is now &amp;#8220;https://secure.centrix.ca/?product=nl3&amp;amp;source=Bodega&amp;#8221; where &amp;#8220;Bodega&amp;#8221; is where Breadcrumb has determined NetworkLocation was downloaded from. &lt;/p&gt;
&lt;p&gt;To see results from this, I used &lt;a href="http://splunk.com"&gt;Splunk&lt;/a&gt;. I&amp;#8217;ve &lt;a href="http://rickfillion.tumblr.com/post/537435489/splunk-analytics-done-right"&gt;raved about Splunk before&lt;/a&gt;; if analytics are your thing, you owe it to yourself to try it out. &lt;/p&gt;
&lt;p&gt;I used the advanced charting functionality to have it draw me a pie chart of how users are getting to my store. I used this query:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;source=&amp;#8221;/home/centrix/access-logs/secure.centrix.ca-ssl_log&amp;#8221; AND (&amp;#8220;GET / &amp;#8221; OR &amp;#8220;GET /?&amp;#8221; OR &amp;#8220;product=nl3&amp;amp;source&amp;#8221;)| replace &amp;#8220;__utma*&amp;#8221; with &amp;#8220;From NetworkLocationApp.com&amp;#8221; in uri_query  | chart count by uri_query&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically it looks for the different ways a user could be getting to our store. In the case of when a user goes to our store from the main product page, Google Analytics goes and makes the query string nasty with &amp;#8220;__utma&amp;#8230;.&amp;#8221; so when it sees that it just replaces that with a prettier string. Then it does a summation grouped by uri_query, and makes a chart.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lhpcz7gbc71qa0w2c.png"/&gt;&lt;/p&gt;
&lt;p&gt;So a quarter of people who go to our store get there from our product page. About 8% or so got there with just &amp;#8220;product=nl3&amp;#8221;, so no real useful information attached. 24% came in with source=(null) which means that Breadcrumb wasn&amp;#8217;t able to find any download information. Notice that this is different than source=Unknown. In the case of source=Unknown, Breadcrumb found a matching download, but it wasn&amp;#8217;t from a source it could recognize. Maybe they got it from an email from a friend or something like that. Bodega only recently started writing the necessary information for Breadcrumb to be able to track its downloads, so it&amp;#8217;s quite possible, if not likely, that a good number of those source=(null) people got it from Bodega.&lt;/p&gt;
&lt;p&gt;I added two additional sources to Breadcrumb ontop of the ones it supports natively: NetworkLocationApp, and Centrix. NetworkLocationApp is the source when a user has downloaded NL from &lt;a href="http://NetworkLocationApp.com"&gt;&lt;a href="http://NetworkLocationApp.com"&gt;http://NetworkLocationApp.com&lt;/a&gt;&lt;/a&gt;, and Centrix is the source when a user downloads it from &lt;a href="http://centrix.ca/networklocation/."&gt;http://centrix.ca/networklocation/.&lt;/a&gt; Considering we&amp;#8217;ve stopped linking to centrix.ca/networklocation many years ago, I find it very surprising to see how many downloads are still coming out of it.&lt;/p&gt;
&lt;p&gt;Another interesting point here is that &lt;a href="http://www.macupdate.com/app/mac/23213/networklocation"&gt;MacUpdate&lt;/a&gt; didn&amp;#8217;t make an appearance. Version 3.1.4 got 153 downloads, but not a single one of those downloads generated a hit on the store. 153 isn&amp;#8217;t a large number, so I won&amp;#8217;t make any wild assumptions based on it, but it&amp;#8217;s still interesting.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s how you see how users got to the store which is interesting. But what&amp;#8217;s more interesting is&amp;#8230; who&amp;#8217;s making me money?  I&amp;#8217;ve got a query for that too:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;file&amp;#160;!=&amp;#8221;*printer.png*&amp;#8221; AND (uri_query = &amp;#8220;*product=*&amp;#8221; OR &amp;#8220;/store/order/thankyou&amp;#8221;)  | transaction clientip, useragent maxspan=1h |  where eventcount &amp;gt; 1 AND like(_raw, &amp;#8220;%product=%thankyou%&amp;#8221;) | chart count by uri_query&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I won&amp;#8217;t be posting a graphic of that result cause that&amp;#8217;s a little personal. Some interesting information that comes out of it though: source=Bodega made up a very small slice of hits to the store, it made up a larger slice of final sales. &lt;em&gt;So even though my sales reports in Bodega make it look rather grim, it&amp;#8217;s apparent that being on there and having a promo spot is generating me money.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing this without Splunk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Splunk&amp;#8217;s my tool of choice, but not everyone can go ahead and install something like that on their server and feed it their access logs.&lt;/p&gt;
&lt;p&gt;You could probably get the same information out of Google Analytics if you knew how to use it properly. I&amp;#8217;m not saying it&amp;#8217;d be easy to get, but somehow, probably possible.  &lt;/p&gt;
&lt;p&gt;Some stores already have support for tagging. &lt;a href="http://FastSpring.com"&gt;FastSpring&lt;/a&gt; is a good example. Create your tags, then just send up &amp;amp;source=Tag with the url. They&amp;#8217;ll store that information for you and it should be available in reports.&lt;/p&gt;
&lt;p&gt;As I said earlier, modifying &lt;a href="http://www.potionfactory.com/potionstore"&gt;PotionStore&lt;/a&gt; to support this natively likely wouldn&amp;#8217;t take much work if you&amp;#8217;re a RoR programmer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;I&amp;#8217;m a stats fiend.  Any time I can get more data to let me make objective decisions to help me run my business better, I jump on it. Considering how ridiculously easy it was to add Breadcrumb support to NetworkLocation, I&amp;#8217;ll definitely be adding it to all of my future apps.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/3706026646</link><guid>http://rickfillion.tumblr.com/post/3706026646</guid><pubDate>Mon, 07 Mar 2011 13:34:15 -0600</pubDate></item><item><title>Expectation Management</title><description>&lt;p&gt;I work with a bunch of different teams&amp;#8230; and I think my #1 issue I run into with people is the concept of expectation management. There are a few different definitions of what expectation management is, but here&amp;#8217;s what it boils down to for me: Knowing what&amp;#8217;s expected of you (deliverables), when it&amp;#8217;s due, who needs it, how it affects them, and managing those relationships.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m a big fan of people setting their own deadlines. I always feel more comfortable when I can choose my own (I can add a bit of padding if I feel the need), and so I try to extend this to others whenever possible. I also believe that when people set their own deadlines they&amp;#8217;re more likely to feel pressure to meet them. When I&amp;#8217;m given an unreasonable deadline, the amount of effort I put into reaching it is usually pretty low.  If I set myself an aggressive deadline, I&amp;#8217;ll work like hell to make sure I hit it.&lt;/p&gt;
&lt;p&gt;The deliverables of a project/task are naturally quite important. I find that a lot of people don&amp;#8217;t ask enough questions to really understand what the other one wants.  &amp;#8221;Well they told me what they want..,&amp;#8221; you think. No! They told you what they thought they wanted. Pry deeper, make sure you know with confidence what they&amp;#8217;re expecting at the end of this.&lt;/p&gt;
&lt;p&gt;The what, and by when, are important. But what&amp;#8217;s an order of magnitude more important is managing the relationship.&lt;/p&gt;
&lt;p&gt;Are you ahead of schedule? Confident that you&amp;#8217;ll get done sooner? Tell the person! You&amp;#8217;ll make their day, and they might be able to change other delivery dates in response and get their bigger project done faster because you kicked ass.&lt;/p&gt;
&lt;p&gt;On schedule? Tell the person! It&amp;#8217;ll let the person know that the due date is still tenable and that they shouldn&amp;#8217;t expect delays. They can adjust other tasks accordingly.&lt;/p&gt;
&lt;p&gt;Feeling iffy about that deadline? Tell the person! Even if you&amp;#8217;re not sure that you won&amp;#8217;t hit it, a simple &amp;#8220;Hey, things are taking a little longer than I expected because writing an html rendering engine in assembly turned out to be a little tougher than I anticipated.&amp;#8221; Now they know that if they have some critical task they wanted to start up right afterwards, they might want to consider delaying it. They might say that only part of what you&amp;#8217;re doing is a bottleneck, so maybe if you can focus on getting that part done in time, everything can go ahead as planned. If you bust your ass to hit your deadline, they&amp;#8217;ll appreciate that you made up time; again you end up looking awesome, and all you had to do was hit your own deadline.  &lt;/p&gt;
&lt;p&gt;Blowing the deadline? Tell the person! You should really have told them at the &amp;#8220;feeling iffy&amp;#8221; stage, but hey, shit happens. Telling them before the deadline lets them readjust.  &lt;/p&gt;
&lt;p&gt;Seeing a pattern here? Communication. When I get nothing from a team member, I want to believe that everything is going peachy. When I see a deadline go by and I&amp;#8217;ve not heard from the person and I don&amp;#8217;t have a deliverable in my hand? It makes me think that they don&amp;#8217;t value my time. At this point, I don&amp;#8217;t care that an html renderer is hard to write in assembly. You&amp;#8217;ve failed.&lt;/p&gt;
&lt;p&gt;The frequency of updates depends on the project and its length. Use your best judgement for what&amp;#8217;s an acceptable frequency. I like to go with weekly updates on a large project, personally. Usually in the form of an email that says what I&amp;#8217;ve been up to, and where I&amp;#8217;m heading next in the short term.&lt;/p&gt;
&lt;p&gt;Nearly everything we do is a small part of a bigger goal. The cascading effect of a task getting derailed can sometimes have disastrous results, let alone when it gets compounded. Missing a deadline isn&amp;#8217;t the end of the world if you&amp;#8217;ve managed the other side&amp;#8217;s expectations.  &lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/3326660947</link><guid>http://rickfillion.tumblr.com/post/3326660947</guid><pubDate>Wed, 16 Feb 2011 08:00:07 -0600</pubDate></item><item><title>FogBugz counts in Geckoboard</title><description>&lt;p&gt;I&amp;#8217;ve been playing with &lt;a title="Geckoboard" href="http://www.geckoboard.com/"&gt;Geckoboard&lt;/a&gt; the last few nights since we&amp;#8217;ve been wanting to build something like that at freshcode.  Geckoboard is really neat.  The problem is that apparently we&amp;#8217;ve bet on all of the wrong horses as far as things it connects to.  And so I&amp;#8217;m having to build the glue code that can talk to the services we use, and provide a data feed that Geckoboard can read.&lt;/p&gt;
&lt;p&gt;Tonight&amp;#8217;s task was getting it to connect to FogBugz and get me a count of the number of tickets still open for our upcoming v1.4.0 release of Bodega.  You can see the resulting code here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/819975"&gt;&lt;a href="https://gist.github.com/819975"&gt;https://gist.github.com/819975&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All you have to do is change the couple variables at the top.  Put your search string into $query and it&amp;#8217;ll spit out XML that you can put into a Geckoboard custom widget.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/3211871340</link><guid>http://rickfillion.tumblr.com/post/3211871340</guid><pubDate>Wed, 09 Feb 2011 23:03:43 -0600</pubDate></item><item><title>wild chocolate: 13 Reasons Why Software Is Not Free</title><description>&lt;a href="http://wildchocolate.tumblr.com/post/2943819131/13-reasons-why-software-is-not-free"&gt;wild chocolate: 13 Reasons Why Software Is Not Free&lt;/a&gt;: &lt;p&gt;&lt;a href="http://wildchocolate.tumblr.com/post/2943819131/13-reasons-why-software-is-not-free"&gt;wildchocolate&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lately it seems more and more evident that the general population expects software to be free or at the very least cheap. This is reinforced when companies like Apple, who make a tremendous income off of their hardware, the iTunes store, and many other revenue streams, heavily discount their…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://rickfillion.tumblr.com/post/2989100709</link><guid>http://rickfillion.tumblr.com/post/2989100709</guid><pubDate>Sat, 29 Jan 2011 00:00:24 -0600</pubDate></item><item><title>CoreLocation for Mac is Broken.  </title><description>&lt;p&gt;Sort of surprised that I haven&amp;#8217;t written about this yet, actually&amp;#8230; considering the thing has been a thorn in my side forever.&lt;/p&gt;
&lt;p&gt;In case you&amp;#8217;ve been living under a rock, CoreLocation is Apple&amp;#8217;s framework for finding a user&amp;#8217;s geographical location based on either nearby WiFi networks, or cell radio towers.  It was originally developed for iOS and then ported over to the Mac in 10.6.&lt;/p&gt;
&lt;p&gt;In the case of the Mac, there&amp;#8217;s no way for it to see cell radio towers (yet), so it&amp;#8217;s based strictly off of WiFi networks.  It&amp;#8217;s still surprisingly accurate in most cities.&lt;/p&gt;
&lt;p&gt;The whole process of getting a list visible WiFi networks, sending that up to Apple&amp;#8217;s server, and getting back a location works just fine.  But here&amp;#8217;s the problem&amp;#8230; a typical Location-aware app doesn&amp;#8217;t just ask for a user&amp;#8217;s location once.  It generally wants to know about any updates to a user&amp;#8217;s location.  CoreLocation&amp;#8217;s API is built for this.  It sends multiple messages to the delegate as time goes on to alert it of new or more accurate positioning.&lt;/p&gt;
&lt;p&gt;This by itself isn&amp;#8217;t an issue.  The issue lies in the fact that it&amp;#8217;s locationd&amp;#8217;s (the daemon backing CL) responsibility to figure out when it&amp;#8217;s appropriate to check for a new position.  It&amp;#8217;s a somewhat tricky problem to solve, one which I&amp;#8217;m familiar with because I had to write an implementation of it back when we used Skyhook&amp;#8217;s WPS library instead of CoreLocation as it didn&amp;#8217;t have that functionality.  &lt;/p&gt;

&lt;p&gt;The list of options:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Only when explicitly requested.  Well that works out nicely for one-offs, but not for apps that need new locations reported.&lt;/li&gt;
&lt;li&gt;Every x seconds.  OK so what&amp;#8217;s x?  How far is a Mac going to travel in 1 second?  Probably not too far, considering they need a net connection to do the request, and most ethernet cables aren&amp;#8217;t THAT long&amp;#8230; and WiFi only has so long of a range.  So that&amp;#8217;s too short, and going to be really excessive.  Every 10 seconds?  There must be a better way.&lt;/li&gt;
&lt;li&gt;Upon wake.  How often are you going to travel more than 50m without first putting your Mac to sleep?  But you&amp;#8217;ll probably have to wait a few seconds after wake to do it, since usually no network is available for a while.&lt;/li&gt;
&lt;li&gt;When connecting or disconnecting from a WiFi network.  Since it&amp;#8217;s based on WiFi networks, and we can get notifications when the airport connects/disconnects from a network, that might be a good time to do it.  In the case of disconnecting from a network, you&amp;#8217;ll need an alternate network (wired) to do the request.  And when connecting, you&amp;#8217;ll need to wait for the network to actually be up to do the request.  Better hope there&amp;#8217;s no authentication needed to get onto the network (something web-based; can&amp;#8217;t believe those systems are still out there), cause building around that is another pain.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OK so they all have issues.  Here&amp;#8217;s how I did it:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;When explicitly requested, go and do it.&lt;/li&gt;
&lt;li&gt;When connecting or disconnecting from WiFi, wait for a valid net connection to be available (up to n seconds), and do the request.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This worked fine for the case of &lt;a href="http://networklocationapp.com"&gt;NetworkLocation&lt;/a&gt; and &lt;a href="http://JetLagApp.com/"&gt;Jet Lag&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know what logic Apple uses.  For most users, it seems to work fine.  For some, it&amp;#8217;s a disaster though.  locationd is seemingly in a perpetual loop, constantly redetermining the user&amp;#8217;s location.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why you don&amp;#8217;t want to do this too often&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Getting a list of visible WiFi networks requires that OS X put the Airport card into passive mode to listen on all channels.  When it&amp;#8217;s in passive mode, it can&amp;#8217;t be transmitting data.  Then once it has the list, it has to connect to Apple and transmit its list.  So you&amp;#8217;re essentially shutting down network services, and then doing a network call.  This all happens pretty quickly, so users don&amp;#8217;t tend to notice it.  But when it&amp;#8217;s constantly happening, it starts to become a pain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I know this?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve actually never seen this myself.  My users have, though.  Consistent reports from a small percentage of NetworkLocation users: when they run &lt;a href="http://NetworkLocationApp.com"&gt;NetworkLocation&lt;/a&gt; the audio to their Airport Express speakers stutters.  Or they notice a large amount of network traffic specifically to mac-services.apple.com (god bless users who send me tcpdumps).  We&amp;#8217;re talking many GB of traffic per day here.  For users on metered connections, or who are tethering, that&amp;#8217;s _unacceptable_.  As soon as I get them to turn off Location Services the problem goes away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I know it&amp;#8217;s not just NL misbehaving?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve written a dummy app that we used to send to these users.  All it did was launch a window and register itself with CoreLocation.  That&amp;#8217;s it, that&amp;#8217;s all.  The problem was present.  This wasn&amp;#8217;t necessarily enough to convince some of them, understandably.  The real smoking gun is that if I told them to shut down all apps of ours, but then enable &amp;#8220;Set time zone automatically using current location&amp;#8221; in System Preferences (i.e. &lt;a href="http://JetLagApp.com"&gt;Jet Lag&lt;/a&gt; for Snow Leopard), the problem would come back.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workarounds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t have any good workarounds, just a few bad ones:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Don&amp;#8217;t use CoreLocation.  I tell these users to turn off Location Services under the Security pane of SysPrefs.&lt;/li&gt;
&lt;li&gt;Make your app smart enough to disconnect itself from CoreLocation when not needed, and reconnect later.  So basically, you need your own logic for when to do the scanning.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;NetworkLocation v4 will have much better smarts for this which I&amp;#8217;m hoping will solve the issue for our users.&lt;/p&gt;
&lt;p&gt;Of course, if they&amp;#8217;re using &amp;#8220;Set time zone automatically using current location&amp;#8221; then the workarounds don&amp;#8217;t matter, because that app doesn&amp;#8217;t disconnect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve had an open radar about this since Nov 9, 2009.  &lt;a href="rdar://7377614"&gt;rdar://7377614&lt;/a&gt;  I&amp;#8217;ll be adding a user note to it with a link to this blog post.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/2584233559</link><guid>http://rickfillion.tumblr.com/post/2584233559</guid><pubDate>Mon, 03 Jan 2011 13:24:38 -0600</pubDate></item><item><title>Ahoy GitHub! </title><description>&lt;p&gt;Last year some time I released a bit of code on our site (&lt;a href="http://centrix.ca/code"&gt;&lt;a href="http://centrix.ca/code"&gt;http://centrix.ca/code&lt;/a&gt;&lt;/a&gt;).  The page has gotten quite a few visitors and downloads, but as that code was evolving it was a pain to update the site, and so we just didn&amp;#8217;t.  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve just moved the code over to GitHub under our Oomph organization.  You can find it here: &lt;a href="https://github.com/Oomph"&gt;&lt;a href="https://github.com/Oomph"&gt;https://github.com/Oomph&lt;/a&gt;&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;From now on I&amp;#8217;ll be pushing changes straight to GitHub on those projects and I&amp;#8217;ll be trying to add a few more in the not-too-distant future (Mac MapKit being one, obviously).&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/2571390005</link><guid>http://rickfillion.tumblr.com/post/2571390005</guid><pubDate>Sun, 02 Jan 2011 15:21:01 -0600</pubDate></item><item><title>Taking Cues from iOS Multitasking</title><description>&lt;p&gt;It took &lt;strike&gt;iPhoneOS&lt;/strike&gt; err&amp;#8230; iOS quite a while to get multitasking.  Every geek who&amp;#8217;s had a Windows Mobile device before (guilty right here) has thought &amp;#8220;What can be so hard about including multitasking?&amp;#8221;  And we were right&amp;#8230; technically speaking, adding multitasking isn&amp;#8217;t difficult, iOS supported it from the get-go for a few apps.  But Apple wanted a BETTER multitasking system.  Partially for technical reasons, since iOS doesn&amp;#8217;t support swapping memory (or at least hasn&amp;#8217;t done so yet), they can only run so many programs at once without running out of precious RAM.  And partially, and I think mostly, for non-technical reasons.  A typical multitasking system needs a process manager at one point to let the user manage what&amp;#8217;s running.  iOS has that (double tap the home button), but a normal user never needs to see or use that.  Hell, advanced users probably very rarely ever touch it.  I only use it while testing my software to make sure it behaves when killed.&lt;/p&gt;
&lt;p&gt;I think this was a fantastic move on Apple&amp;#8217;s part.  If only as a showcase of how you can take a fairly complicated task like managing system resources, and automate it to the point where users don&amp;#8217;t need to be involved.  The user doesn&amp;#8217;t need to know or care if an application is still running in the background.  They&amp;#8217;ll probably only notice if the launch time is a little slower sometimes, and that&amp;#8217;s something application developers can work to fix.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d love for more software to take some cues from this.  Here are some examples I can offer up:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chat Tabs&lt;/strong&gt;&amp;#160;: I use Adium to do a lot of my communication.  There are probably 20-25 people that I talk to on a very regular basis.  I never close those tabs in Adium.  Deciding which tabs to leave open and which to close is just not something I want to think about.  Adium logs all of my conversations, so I could close it, and reopen it later without anything lost.  I know that.  But I swear, hitting cmd-w is just too much work.  &amp;#8221;What if Mr Orange wants to talk again in 20 minutes?&amp;#8221;  So I just leave them open until one day I realize I have 50 tabs open and it&amp;#8217;s time to do some major house cleaning.  Adium could very easily tell if it&amp;#8217;s been over a day since my last talk with someone and tidy up after me.  Hell it could build in smarts to determine if statistically I&amp;#8217;m likely talk start talking to that person soon, but that&amp;#8217;d be substantially more work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Browsing Tabs&lt;/strong&gt;&amp;#160;: I don&amp;#8217;t close browser tabs either.  And I&amp;#8217;m a one-browser-window-fullscreen-on-a-22inch-display kind of guy (I know it&amp;#8217;s terrible and inefficient, but when I&amp;#8217;m browsing I don&amp;#8217;t want distractions).  My browsing style leads to tab-hell, too.  I&amp;#8217;ll almost never just click a link on a page.  I cmd-click everything.  Just in case I find another link on that page that I also want to load.  If I&amp;#8217;m _really_ sure that I&amp;#8217;m done with the page, I&amp;#8217;ll close it before going to its offspring (or sometimes I leave the offspring out in tab purgatory for me to find later).  Safari is also my Cocoa document tool of choice.  cmd-tab to safari, cmd-t, tab to get to search field, &amp;#8220;nsstring class reference&amp;#8221;.  I probably have 4 other NSString class references open somewhere in my tabs, but finding them takes longer than that little finger dance so I just keep opening new ones.  &lt;/p&gt;
&lt;p&gt;I see a few things that could be done to help this.  One is better history tracking.  Right now browser histories are brutally basic.  From what I can tell, Safari stores a low quality screenshot of the page, indexes the text, and that&amp;#8217;s about it.  I search through my history to find things fairly frequently and it works, but what I get is just that page.  I don&amp;#8217;t get to the whole browsing tree related to when I was at that page.  So I can&amp;#8217;t go &amp;#8220;back&amp;#8221; to the preceding page.  Having this ability would make me more likely to close tabs as the damage it does is lower.  If I wanted to, I could jump right back to where I was.&lt;/p&gt;
&lt;p&gt;Tab amalgamation.  If I have 3 tabs open to the same NSString documentation page, I probably wouldn&amp;#8217;t be too offended if it decided to fold these together.  I just looked&amp;#8230; I have 4 NSManagedObjectContext doc tabs open, all one beside another.  I&amp;#8217;m not even sure how that happens, but it did.  Haven&amp;#8217;t touched those tabs in probably a week.  If the URLs match, and they haven&amp;#8217;t been touched in over X hours, combine them.&lt;/p&gt;
&lt;p&gt;Automatic tab closing.  With the better-history tracking, I don&amp;#8217;t see why Safari couldn&amp;#8217;t just start closing tabs that I haven&amp;#8217;t touched in a long time.  There&amp;#8217;d be no real harm in doing so.&lt;/p&gt;
&lt;p&gt;I think as developers we need to be more conscious of what we can do to automate tedium for our users.  I think we&amp;#8217;ve come a long way with this, but there&amp;#8217;s something decidedly unsexy about coding house-cleaning routines.  &amp;#8221;Oh the user can figure out when to do that.&amp;#8221;  Well.. they could.  Or we could, and free them to do more important things.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/1563761340</link><guid>http://rickfillion.tumblr.com/post/1563761340</guid><pubDate>Sat, 13 Nov 2010 12:45:07 -0600</pubDate></item><item><title>Written Communication</title><description>&lt;p&gt;I like writing.  I like reading.  It&amp;#8217;s probably my favorite way of communicating with people.  I&amp;#8217;ve been trying to figure out why that is recently, and I think I&amp;#8217;ve come up with some decent reasons.&lt;/p&gt;
&lt;p&gt;The small things: It frees up my ears for music.  Love me my music.  And it generally creates a nice paper trail (the number of times I say &amp;#8220;let me go find that email&amp;#8221; in a day&amp;#8230;).  &lt;/p&gt;
&lt;p&gt;But I think why I like it the most is that it&amp;#8217;s one-way communication.  Send me a long email with the reasoning for something and I&amp;#8217;ll read it all the way through before replying anything.  Whereas talking it over in person will likely get me to start asking questions right off the bat (I play devil&amp;#8217;s advocate/bringer of bad news, all. the. time.).  Same for the inverse.  If I feel something strongly, I like writing it down as the process of writing it down usually allows me to clarify the idea to myself first, and then try to find the holes before sending it off to others.  Instead of verbal-diahrea they get a thought-out and cohesive idea.&lt;/p&gt;
&lt;p&gt;Granted this isn&amp;#8217;t always the best way of doing things.  Sometimes talking can give a tighter feedback mechanism which comes in handy for more creative things&amp;#8230; but how often does that happen? :P&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/1402986549</link><guid>http://rickfillion.tumblr.com/post/1402986549</guid><pubDate>Mon, 25 Oct 2010 20:58:22 -0500</pubDate></item><item><title>Operating System Competition</title><description>&lt;p&gt;I grew up with PCs.  So much so, that I remember at one point thinking motherboards came with DOS installed on them (shut up, I was young! :P).  By the time I became really interested in software the OS wars were largely over, and Windows was the winner.  I knew that Macs were different, and always assumed they were inferior.  I was perfectly happy with my &amp;#8220;re-format every 30 days&amp;#8221; system, writing little apps in Visual Basic.  &lt;/p&gt;
&lt;p&gt;Then one day my world was rocked.  I was shown something different, a world I didn&amp;#8217;t know.  Linux.  Well.. a mostly booting Linux system that would launch X11 then just hang, as was typical back in the day (gotta put something in ~/.xinitrc, yaknow).  That gray/white checkered pattern and its weird cursor.  It&amp;#8217;ll haunt me forever.  I wanted to learn everything about this thing.  The fact that a PC could run something other than an OS provided by Microsoft was a new concept to me.  It took me weeks to get the thing to install correctly on my PC so that I could really play around and learn.  Whoever wrote those early Linux (Red Hat in this case) installers should be taken out back for torturing users the way it did.&lt;/p&gt;
&lt;p&gt;While exploring Linux I discovered other operating systems, like Solaris, BeOS, QNX, and then the hobby OS world with awesome projects like V2_OS, SkyOS, Unununium (which I worked heavily on), MenuetOS, AROS, etc&amp;#8230;  This was well before OS X was released.  I remember reading about NeXTSTEP, and how consistent the raving was&amp;#160;: this thing was amazing, but the company never made money.  I never got BeOS running on any of my systems, not for lack of trying, the thing just didn&amp;#8217;t like me and my machines.  But it was undeniably incredibly cool, again the company had trouble making money with the thing (understandably).  And QNX always seemed to be a pet project or dev kit intro for developers, they clearly had no real interest in trying to get the mass market, even though they had an amazingly easy to use and rock solid OS.&lt;/p&gt;

&lt;p&gt;The war was over when I got there.  Though I likely argued more than a few times that Linux was going to take over Windows on the desktop, it was pretty clear that it would take something pretty big to bring MS down.  Eventually I switched to OS X (oddly enough, for the PowerPC, I hated Intel _that_ much), and discovered how truly awesome that NeXT stuff was via Cocoa.  But I always felt cheated out of experiencing the days of multiple operating systems fighting and constantly one-upping each other.  &lt;/p&gt;
&lt;p&gt;I think I&amp;#8217;m finally getting a second chance at this.  The smartphone and tablet space is becoming a very exciting area for OS development with a lot of interesting players.  Apple&amp;#8217;s got iOS (NeXTSTEP for handhelds).  Palm had WebOS, which seemed pretty cool, but that wasn&amp;#8217;t doing too well.  Now that HP has bought them, there seems to be hope that we&amp;#8217;ll see more WebOS devices.  Google and its partners have Android, which so far has been rather lame due to carriers doing what they do best: screwing over their customers.  But that&amp;#8217;s not Android&amp;#8217;s fault, and I&amp;#8217;m confident that sooner or later we&amp;#8217;ll see really good Android devices.  Microsoft finally went back to the drawing board before creating Windows Phone 7 and that could be interesting.  And now RIM has started showing off their first device running QNX since they bought the company behind it, and that&amp;#8217;s looking pretty slick.  &lt;/p&gt;
&lt;p&gt;We&amp;#8217;re at an interesting point in time for those devices.  The barrier of entry for a new operating system is relatively low.  iOS users will surely laugh at Windows Phone 7 users about the fact that the first version won&amp;#8217;t have copy/paste, but that&amp;#8217;s OK.  I lived a few years without copy/paste on my iPhone and I didn&amp;#8217;t die of embarrassment.  With web apps being as strong and popular as they are, someone who makes an OS that does little more than load up a quality browser has a real chance at success (Hello Google ChromeOS).&lt;/p&gt;
&lt;p&gt;As a developer, all of this excites me.  It means companies are trying new things, they&amp;#8217;re coming up with new development toolkits for developers.  And I really hope that this time there isn&amp;#8217;t one winner, but a whole group of companies that can each have a chunk of the market.  This way we can make document formats king, and not the apps that produce them.  Giving users more flexibility in what device or apps they use.&lt;/p&gt;
&lt;p&gt;For the first time in a very long time, I&amp;#8217;m truly excited to see where operating systems go.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/1208238301</link><guid>http://rickfillion.tumblr.com/post/1208238301</guid><pubDate>Tue, 28 Sep 2010 22:07:17 -0500</pubDate></item><item><title>Pretroducing... MapKit for Mac</title><description>&lt;p&gt;I&amp;#8217;ve been spending bits of time over the last few months working on a little project that I&amp;#8217;ve not told too many people about.  I&amp;#8217;m finally at a point where I&amp;#8217;m ready to talk about it and start showing it.  I&amp;#8217;ve been working on a clean-room re-implementation of iOS&amp;#8217;s MapKit, but for Mac OS X.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s MapKit?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MapKit is a framework Apple provides with iOS that gives developers tools to easily make map based applications.  It powers the Maps application, and just about every app that includes a map on iPhone/iPad.  It integrates with Location Services to show where the user is, and can easily add pins to the map.  It can do a lot more than that, but that&amp;#8217;s the basics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do I mean by clean-room reimplementation?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I looked at the documentation available for the MapKit framework, and built a set of classes with the same names, methods, properties, etc that should work nearly identically to Apple&amp;#8217;s MK* classes (it should be source-compatible).  I&amp;#8217;ve never worked at Apple, nor do I know any developers there, so I&amp;#8217;ve never seen how they actually implemented MapKit.  I have suspicions that mine is built quite differently than theirs though, judging by some of the issues that came up during development.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did I build this?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In an Mac app I&amp;#8217;m building I wanted a Map view, and so I started exploring what kind of interaction I could get out of Google Maps and my ObjC code.  Turns out I could get a lot.  I quickly realized that to make this map view, I&amp;#8217;d end up recreating about half of MapKit, so I thought &amp;#8220;if I&amp;#8217;m going to do half of it, I might as well do it all, and see if I can release that separately.&amp;#8221;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s done so far?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The vast majority of it.  All classes are there, most of them are 100% functional.  All I can think of that I&amp;#8217;m missing are the left/right accessory views on MKAnnotationView callouts, and a few delegate methods on MKMapView never get called (I can&amp;#8217;t decide when to call mapViewWillStartLoadingMap: and friends).  I have an IBPlugin for it to make it nice and easy to use.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s the plan?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My plan is to release this as BSD licensed code.  I&amp;#8217;m hoping that other developers can make us of it&amp;#8230;but my intention is to have this Mac app I&amp;#8217;m working on be the first released app with it included.  At that point I&amp;#8217;ll be making the code available, likely on GitHub for public consumption.  If you&amp;#8217;d like access to it before then (end of year), give me a shout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I&amp;#8230; can I see it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sure, why not.  I recorded a quick little screen cast of it in action.  &lt;a href="http://dl.dropbox.com/u/362964/MapKit.mov"&gt;Have a look&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s based on a WebView and Google Maps V3.  It makes very heavy use of the Objective-C to Javascript scripting bridge that exists with WebKit.  Google Maps doesn&amp;#8217;t let annotations be draggable, so my annotations are actually a mix of overlays and annotations together.  Annotation callouts are drawn using a canvas, and all animations you see are WebKit CSS animations.&lt;/p&gt;</description><link>http://rickfillion.tumblr.com/post/1134987954</link><guid>http://rickfillion.tumblr.com/post/1134987954</guid><pubDate>Thu, 16 Sep 2010 20:33:40 -0500</pubDate></item></channel></rss>
