<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hopefully Useful</title>
        <link>https://blog.hopefullyuseful.com/</link>
        <description>Recent content on Hopefully Useful</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Mon, 01 Jun 2026 18:35:01 +0800</lastBuildDate><atom:link href="https://blog.hopefullyuseful.com/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>macOS Needs Its Grid Back</title>
        <link>https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/</link>
        <pubDate>Mon, 01 Jun 2026 18:35:01 +0800</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/</guid>
        <description>&lt;img src="https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/picker32.jpg" alt="Featured image of post macOS Needs Its Grid Back" /&gt;&lt;p&gt;Two decades ago I had a better Mac desktop experience than I have today.  I only had a single low res (by todays standards) screen, yet I felt like &lt;a class=&#34;link&#34; href=&#34;https://youtu.be/u1Ds9CeG-VY?t=82&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugh Jackman in Swordfish&lt;/a&gt; - deftly navigating more than nine displays without thinking, muscle and spatial memory working seamlessly together.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TLDR; I built an app to return macOS spaces to its Pre-Lion Grid-enabled Glory.  Read on for the increasingly rare experience of an actual human dropping a bit of nostalgia, the thinking behind &lt;em&gt;why make this&lt;/em&gt; and some issues encountered along the way. Or just download it &lt;a class=&#34;link&#34; href=&#34;https://gridlion.hopefullyuseful.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;2006&#34;&gt;2006
&lt;/h2&gt;&lt;p&gt;Around the time I was &lt;a class=&#34;link&#34; href=&#34;https://blog.hopefullyuseful.com/blog/2014/04/04/the-future-called-30-years-ago/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;experimenting with Japanese toilets&lt;/a&gt;, I was also experimenting with desktop operating systems.  I had spent most of my developer career up to that point using Windows but had begun trying desktop Linux and then macOS after a &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=Gzj723LkRJY&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;popular presentation&lt;/a&gt; enticed me enough to buy a Mac just so I could start using TextMate.&lt;/p&gt;
&lt;p&gt;Textmate (and its revolutionary &lt;a class=&#34;link&#34; href=&#34;https://macromates.com/manual/en/snippets&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;text-snippets&lt;/a&gt;) were the catalyst to my migration but funnily enough I don&amp;rsquo;t remember continuing to use it for very long.  Other editors quickly caught up but I stayed with macOS. My career also moved into iOS development so it wasn&amp;rsquo;t really a choice after that.  In any case one thing from that era did stay with me long term.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/macosxbox-source-internetarchive.jpg&#34;
	width=&#34;3437&#34;
	height=&#34;3024&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/macosxbox-source-internetarchive_hu7910010598583001988.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/macosxbox-source-internetarchive_hu3927562784557663187.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;OSX 10.5 Leopard (image found on Internet Archive)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;113&#34;
		data-flex-basis=&#34;272px&#34;
	
&gt;
&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/virtual-desktops-mac-source-osxdaily.jpg&#34;
	width=&#34;610&#34;
	height=&#34;598&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/virtual-desktops-mac-source-osxdaily_hu13440190737058221225.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/virtual-desktops-mac-source-osxdaily_hu1008910201870808991.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Spaces (image found on OSXDaily archives)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;102&#34;
		data-flex-basis=&#34;244px&#34;
	
&gt;&lt;/p&gt;
&lt;!-- &lt;blockquote&gt;
    &lt;p&gt;&lt;em&gt;Leopard includes an extremely competent virtual desktop implementation in Leopard, appropriately called Spaces. To some, this is a major new feature on the level of Time Machine. To me, it’s a grab bag item, albeit the headliner. Your mileage may vary.&lt;/em&gt;&lt;/p&gt;&lt;span class=&#34;cite&#34;&gt;&lt;span&gt;― &lt;/span&gt;&lt;span&gt;John Siracusa, &lt;/span&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/&#34;&gt;&lt;cite&gt;ArsTechnica&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt; --&gt;
&lt;h2 id=&#34;macos-leopard-spaces&#34;&gt;macOS Leopard Spaces
&lt;/h2&gt;&lt;p&gt;The big OS release in 2006 was macOS 10.5 Leopard.  It had a bunch of feature releases, the most notable probably being Time Machine.  But 20 years on I still don&amp;rsquo;t use nor miss Time Machine. I miss what John Sciracusa&amp;rsquo;s epic review &lt;a class=&#34;link&#34; href=&#34;https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;labelled a grab bag item&lt;/a&gt;. I miss Spaces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=Ni4qee-7NRk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Spaces&lt;/a&gt; introduced virtual desktops to macOS and allowed you to arrange them in a customisable grid&lt;/strong&gt;.  Anyone who has used virtual desktops in this way knows the benefit.  It allows you to treat them like &lt;strong&gt;actual displays in spatial locations&lt;/strong&gt;. I always favoured a 3x3 grid and treated it like I had 9 screens.  Centre screen was my web browser, the screen above my web editor so I could flip back and forth with a single key press. Top left was Xcode, the screen below the iOS simulator.  The other screens had other allocated applications/purposes that I don&amp;rsquo;t exactly remember (mail/itunes/chat etc&amp;hellip;) but the benefits were obvious, &lt;strong&gt;I could move from one screen to another without thinking, it became muscle memory like I was looking at actual separate physical displays&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I found this grid layout so useful I ended up incorporating it into other applications I built, the grid of 16 sequencing screens you could navigate in my &lt;a class=&#34;link&#34; href=&#34;https://apps.apple.com/us/app/easybeats-drum-machine-mpc/id329472198&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drum Machine EasyBeats&lt;/a&gt; was directly inspired by Apple&amp;rsquo;s screens.&lt;/p&gt;
&lt;h2 id=&#34;2011-macos-lion&#34;&gt;2011 macOS Lion
&lt;/h2&gt;&lt;p&gt;With the release of macOS Lion, Apple introduced Mission Control, its new take on virtual desktops that inexplicably &lt;strong&gt;restricted them to a horizontal line only&lt;/strong&gt;.  I remember thinking at first that I just hadn&amp;rsquo;t seen the setting somewhere, Apple wouldn&amp;rsquo;t just &lt;em&gt;completely change how I used my computer&lt;/em&gt; right? right?&lt;/p&gt;
&lt;h2 id=&#34;wrong-so-wrong&#34;&gt;Wrong. So Wrong.
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A single row was/is such a step backwards&lt;/strong&gt;. If I wanted to get to a particular screen via the keyboard I now had to endure sliding horizontally the whole way.  If I remembered the direct keyboard shortcut I could jump directly, but did I leave my browser on screen 7 or 8?  This new layout completely destroyed any hope I had of maintaining spatial memory.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t alone in my frustration.  Alternative solutions popped up but the best of them &lt;em&gt;Total Spaces&lt;/em&gt; caused me weird slowdowns and relied on modifying the system dock which was a no go once that eventually required &lt;a class=&#34;link&#34; href=&#34;https://totalspaces.binaryage.com/sip-details&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bypassing system integrity protection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Over time I gave up, and learned to deal with it.  An iOS developer had little choice in the matter, and later when I moved onto a new chapter with my current employer I had already bought the extra physical screens and well&amp;hellip; just dealt with it :sadface:.&lt;/p&gt;
&lt;h2 id=&#34;but-but-window-managers&#34;&gt;But but window managers&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Right now I know some readers are just shouting at their screen &amp;ldquo;Learn Yabai/Aerospace/whatever&amp;rdquo;.  I&amp;rsquo;ve tried them all and come away realising they are not for me.  I think that its that I don&amp;rsquo;t particularly like &amp;ldquo;windows on a desktop&amp;rdquo; as a concept.  It feels like shuffling between papers on a desk, sure the papers can be organised neatly, but I really just want different workstations where everything is as I left it.  I like macOS &amp;ldquo;fullscreen&amp;rdquo; apps, I sometimes put them in split mode but I really like the concept of dedicated areas for one task only.&lt;/p&gt;
&lt;h2 id=&#34;a-solution-appears&#34;&gt;A Solution Appears
&lt;/h2&gt;&lt;p&gt;Any way like I said, I had learnt to deal with it and merely occasionally complained to my colleagues about maybe moving back to Linux with my next work machine.  That was until a couple of months ago, when I saw that &lt;a class=&#34;link&#34; href=&#34;https://github.com/jurplel/InstantSpaceSwitcher&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;someone had managed to remove the animation&lt;/a&gt; from macOS when you move from one space to another, without needing system edits.  This animation clearly annoyed some people but never really bothered me. However &lt;strong&gt;as soon as I saw a space move without an animation I instantly realised I could solve my complaints&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;passion-still-has-a-place&#34;&gt;Passion still has a place?
&lt;/h2&gt;&lt;p&gt;A common discussion with my tech career aligned friends is, in this new age of LLM code generation, does good software have value?  If anyone can create software by simply describing it, does it (or will it) make sense to try to make paid software anymore?  I think so.  &lt;strong&gt;I think there is still real value in someone really refining something to the best it can be&lt;/strong&gt;, making design decisions about how something should behave.  I no longer make my living as an indie developer, but I did for a long time and I&amp;rsquo;m not sure much of what set a good app apart from the pack has changed.&lt;/p&gt;
&lt;p&gt;Take a look at any of those knockoff games that flood app stores.  Most of the time the problem with them isn&amp;rsquo;t that they aren&amp;rsquo;t original or too simple, &lt;strong&gt;the problem is the person or team that built them doesn&amp;rsquo;t care&lt;/strong&gt;.  Caring is what makes the creator &amp;ldquo;waste&amp;rdquo; time hunting down things that don&amp;rsquo;t quite feel right or worry about performance issues most users will never notice.&lt;/p&gt;
&lt;p&gt;Anyway I &lt;em&gt;really&lt;/em&gt; care about grid based navigation of virtual desktops.&lt;/p&gt;
&lt;h2 id=&#34;control-aint-easy&#34;&gt;Control aint easy
&lt;/h2&gt;&lt;p&gt;I like the idea of a lightweight wrapper around the native spaces, with support for desktops or fullscreen apps.  Just with a grid to navigate.  But there is a reason pretty much all solutions that controlled native spaces died out.  macOS keeps most of the mission control apis locked down.  Its not simply a matter of calling a documented api to add a new desktop, or re-arrange them around.  But the ability to move to a space instantly meant I could just create a model that took the single row native spaces and presented them like a grid.&lt;/p&gt;
&lt;p&gt;So with the help of an LLM I had an ugly but working prototype within a day.  It worked and I was elated, it was instantly something I would have paid money for only days earlier.  But after using it for a couple of days, &lt;strong&gt;I realised I wanted a much more polished tool&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;build-something-real&#34;&gt;Build something real
&lt;/h2&gt;&lt;p&gt;I decided to spend my very limited free time on it.  About a month later I got it to the point where I was pretty happy with it.  I decided to name it GridLion, for no reason other than it&amp;rsquo;s a grid and my issues with macOS Lion I mentioned above. I&amp;rsquo;ve had feedback this name is terrible, which may be right, but I also think that &lt;em&gt;people value names way too much&lt;/em&gt; 😂. Anyway I won&amp;rsquo;t spend a lot of time talking about features implemented etc&amp;hellip; as that&amp;rsquo;s better found over at the &lt;a class=&#34;link&#34; href=&#34;https://gridlion.hopefullyuseful.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;app page&lt;/a&gt;.  Instead I think it is much more interesting to read about roadblocks and unexpected situations.&lt;/p&gt;
&lt;h2 id=&#34;permission-hurdles&#34;&gt;Permission Hurdles
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s funny how you only notice how backwards something is when you are trying to make it easier for others.&lt;/p&gt;
&lt;p&gt;To allow this app to capture global keyboard shortcuts and navigate spaces it needs the macOS &amp;ldquo;Accessibility&amp;rdquo; permission.  This is totally reasonable, I wouldn&amp;rsquo;t want software unbeknownst to me the ability to capture key presses.  But the flow of how this is approved could be done better like it is on iOS.  In iOS if you request a permission, a prompt appears and asks for that permission, if you approve it enables the permission.  Done, pretty easy.  On macOS however its a whole song and dance.  Request permission, user gets a prompt to open accessibility setting or deny.  If they approve, the settings open, then the user has to find the specific little toggle and enable it.  Another security prompt then done. Why isn&amp;rsquo;t this at most 2 prompts?&lt;/p&gt;
&lt;p&gt;Things get worse however if you want small previews of your spaces ( I do, and most people will I suspect ).  This requires enabling the &amp;ldquo;Screen and System Audio Recording&amp;rdquo; permission. Like before a dialog pops up asking for permission, which upon approval then leads to another where again you have to find the correct toggle, switch it on where you have to approve yet another dialog, that this time quits and reopens the app. &lt;em&gt;sigh&lt;/em&gt; The worst bit of all is that should the user have made it past all these hurdles, because Gridlion needs to create previews of &lt;em&gt;non visible windows/screens&lt;/em&gt; you get the scariest dialog yet:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/access.jpg&#34;
	width=&#34;1058&#34;
	height=&#34;498&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/access_hu7635978319266549518.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/access_hu12839662176652400048.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;1&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;212&#34;
		data-flex-basis=&#34;509px&#34;
	
&gt;
&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approve.jpg&#34;
	width=&#34;1670&#34;
	height=&#34;1866&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approve_hu3888039049244601543.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approve_hu14830285450245727737.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;2&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;89&#34;
		data-flex-basis=&#34;214px&#34;
	
&gt;
&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr.jpg&#34;
	width=&#34;1058&#34;
	height=&#34;498&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr_hu15131173904631755252.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr_hu8746265754313499255.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;3&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;212&#34;
		data-flex-basis=&#34;509px&#34;
	
&gt;
&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr2.jpg&#34;
	width=&#34;1670&#34;
	height=&#34;1866&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr2_hu749235225209684146.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/approvesr2_hu18197642627034906077.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;4&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;89&#34;
		data-flex-basis=&#34;214px&#34;
	
&gt;
&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/screenrecording.png&#34;
	width=&#34;582&#34;
	height=&#34;738&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/screenrecording_hu3306243771582889702.png 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/screenrecording_hu6795414130120786859.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Scary dialog for taking a screenshot&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;78&#34;
		data-flex-basis=&#34;189px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Thats last one is a pretty effective dialog.  I even hesitate to click it and I wrote the app 😬.  Its a bit excessive for the tiny space preview snapshots but this is what you get when you are trying to do something that should be integrated in the OS.  &lt;strong&gt;Not much can be done about this except making sure that the app builds trust by never touching the network unless requested&lt;/strong&gt; (update checking if desired and license key validation).&lt;/p&gt;
&lt;p&gt;The app works without that permission, but I think the upgrade is worth it personally.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/iconsonly.jpg&#34;
	width=&#34;1228&#34;
	height=&#34;1070&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/iconsonly_hu346063575215513805.jpg 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/iconsonly_hu12029819971242507099.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Without Previews&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;114&#34;
		data-flex-basis=&#34;275px&#34;
	
&gt; &lt;img src=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/withpreviews.png&#34;
	width=&#34;1228&#34;
	height=&#34;1070&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/withpreviews_hu15166915532302282750.png 480w, https://blog.hopefullyuseful.com/blog/macos-needs-its-grid-back/withpreviews_hu17594009825922385359.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;With Previews&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;114&#34;
		data-flex-basis=&#34;275px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;no-appstore-for-you&#34;&gt;No AppStore for you!
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve only ever sold software through the iOS AppStore.  I started it all up so long ago that I don&amp;rsquo;t remember the hurdles of setting it up.  But since GridLion calls private APIs to get space information it&amp;rsquo;s not permitted on the AppStore.  So I had a quick look around at potential solutions.&lt;/p&gt;
&lt;p&gt;My first instinct was just to setup website that used Stripe apis and included GST for Australian customers.  I am Australian and had done this for a couple of SAAS projects in the past but after being spoilt with the completely hands off nature of various AppStores I was more interested in that sort of service.&lt;/p&gt;
&lt;h2 id=&#34;easy-peasy&#34;&gt;Easy Peasy?
&lt;/h2&gt;&lt;p&gt;Apparently what I wanted was a &lt;em&gt;Merchant of Record&lt;/em&gt;.  Someone to handle purchases, taxes and refunds.  There seems to be three main companies providing this service: Paddle, GumRoad and Lemon Squeezy.  I was attracted to LemonSqueezy due to their &lt;a class=&#34;link&#34; href=&#34;https://docs.lemonsqueezy.com/api/license-api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;License code API&lt;/a&gt;.  Upon purchase they give the customer a license key, and provide methods for activating/deactivating/validating.&lt;/p&gt;
&lt;p&gt;I had naively thought I could just create an account, link my Stripe (I believe Stripe acquired/bought/something them) and be selling in minutes.  &lt;strong&gt;The process however is a bit more drawn out than that&lt;/strong&gt;.  You need to demonstrate to Lemon Squeezy that you are reputable, &lt;em&gt;selling something of actual value/use&lt;/em&gt;.  There was a few screen casts sent and some social media account proof needed.  It was not a problem for me but I could see someone just starting out encountering some roadblocks here.&lt;/p&gt;
&lt;p&gt;In retrospect I fully understand these kind of requirements.  It&amp;rsquo;s easy for someone with good intentions to forget about those out there with bad intentions, and since it&amp;rsquo;s actually LemonSqueezy that deals with the customer ( at least with regards to payments ) they are right to take measures to protect their reputation.&lt;/p&gt;
&lt;p&gt;That said even before approval, you have full access to a test account which meant integrating with the app was really easy to setup and test. This all pretty low risk experiment for me but I must admit that I&amp;rsquo;m looking forward to seeing if this a viable way to sell software outside the app store (Yes yes I know it was this way for decades 😅).&lt;/p&gt;
&lt;h2 id=&#34;llms-dont-care-about-ux&#34;&gt;LLMs don&amp;rsquo;t care about UX
&lt;/h2&gt;&lt;p&gt;I use LLMs all the time in my day job.  I use them as coding assistants and I build products around their services, but this is the first time I&amp;rsquo;ve used them on a personal native app project and I found the experience&amp;hellip; interesting. &lt;strong&gt;LLMs are like super fast ships, you set them off in a certain direction but without a good feedback loop they will go off course.  You plot the GPS for Venice but arrive at &lt;a class=&#34;link&#34; href=&#34;https://www.venetianlasvegas.com/resort/attractions/gondola-rides.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the Venetian&lt;/a&gt;&lt;/strong&gt;, sure it looks the part, but it&amp;rsquo;s not what you wanted.&lt;/p&gt;
&lt;p&gt;Feedback loops depend on the project.  With my day job, I&amp;rsquo;m generally working with concrete targets, correct api results or large dataset queries.  If a plan is well specced, the LLM can often see immediately if a result isn&amp;rsquo;t as desired, then iterate.  The bulk of my time is spent reviewing.&lt;/p&gt;
&lt;p&gt;This project has been very different.  &lt;strong&gt;So much of a user interface is about &lt;em&gt;feel&lt;/em&gt;, so for anything user facing a human has to be in the loop&lt;/strong&gt;.  It has me questioning the actual gains here.  On the one hand, since I haven&amp;rsquo;t really been doing native mac/iOS work for nearly 10 years the LLM has certainly helped me, but at the same time I think me 10 years ago would have made the same app in the same amount of time and gained a lot more insight along the way.&lt;/p&gt;
&lt;h2 id=&#34;it-does-nearly-everything-i-want&#34;&gt;It does &lt;em&gt;&lt;strong&gt;nearly&lt;/strong&gt;&lt;/em&gt; everything I want
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m the number one user so I have attempted to add everything I wanted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy to navigate and rearrange grid of spaces&lt;/li&gt;
&lt;li&gt;Fast/Stable with no slowdowns&lt;/li&gt;
&lt;li&gt;Display specific settings (grid size, hotkeys etc&amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But some things remain.  If you want to move a space from one display to another or a window from one space to another there are no reliable apis for that.  Fortunately since GridLion works with Mission Control, you can just use mission control to do such tasks but it does niggle at me a little bit I can&amp;rsquo;t simply do it myself.&lt;/p&gt;
&lt;p&gt;Lastly the ability to have certain applications always appear in a grid location on load.  This was a feature of the original macOS spaces but perhaps wouldn&amp;rsquo;t even be useful for me anymore.  Setup/Re-arranging is fast and I rarely restart. Also If you look at the screenshots above you&amp;rsquo;ll see that I often have many VSCode windows open and I&amp;rsquo;m not sure how that would have been handled.  In any case I&amp;rsquo;ll probably keep working on a solution in the future.&lt;/p&gt;
&lt;h2 id=&#34;macos-native&#34;&gt;macOS native
&lt;/h2&gt;&lt;p&gt;All this said, I would be very happy if next macOS they announced grid based spaces returning.  &lt;strong&gt;This should be an OS feature again&lt;/strong&gt;.  Until then though feel free to &lt;a class=&#34;link&#34; href=&#34;https://gridlion.hopefullyuseful.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;give GridLion a try&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>About Me</title>
        <link>https://blog.hopefullyuseful.com/about/</link>
        <pubDate>Wed, 27 May 2026 00:00:00 +0800</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/about/</guid>
        <description>&lt;p&gt;Hi I’m Christian Inkster, an experienced software developer and father of two based in Perth, Western Australia.&lt;/p&gt;
&lt;p&gt;This blog is where I write through projects, experiments, and technical frustrations.  I don&amp;rsquo;t update it often, it probably averages out to once every 2 years with some occasional 10 year gaps 😂.&lt;/p&gt;
&lt;h2 id=&#34;career&#34;&gt;Career
&lt;/h2&gt;&lt;p&gt;I’m currently a Principal Software Engineer at &lt;a class=&#34;link&#34; href=&#34;https://soracom.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Soracom&lt;/a&gt;, where I lead engineering work on data platform products for large-scale IoT systems. Before that, I spent years as an independent developer designing, building, and shipping native apps used by millions of people.&lt;/p&gt;
&lt;p&gt;My extensive experience as both an engineering lead and a business owner means &lt;strong&gt;I try to focus on building what is important&lt;/strong&gt;.  I believe as businesses use AI/LLMs to move rapidly, &lt;em&gt;sometimes in the wrong direction&lt;/em&gt; that this mindset is essential.  Where product decisions and engineering knowledge overlap I consider myself strongest with native apps, backend systems, data visualization, developer tooling, and the infrastructure that keeps software fast and reliable.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;20+ years as a professional software developer&lt;/li&gt;
&lt;li&gt;8+ years leading engineering work on IoT platform products&lt;/li&gt;
&lt;li&gt;Team leadership experience across frontend, backend, and full-stack engineers&lt;/li&gt;
&lt;li&gt;Deep native iOS and macOS experience with Objective-C, Swift, and Apple platform APIs&lt;/li&gt;
&lt;li&gt;Backend experience with Go, Node.js, Python, AWS, MySQL, PostgreSQL, NoSQL datastores, Docker, and Kubernetes&lt;/li&gt;
&lt;li&gt;Frontend experience with TypeScript, React, Redux, Angular, and Grafana plugin development&lt;/li&gt;
&lt;li&gt;Experience building secure, schema-aware AI/LLM data tools for multi-tenant Snowflake environments&lt;/li&gt;
&lt;li&gt;Practical focus on performance, observability, reliability, and customer-facing delivery&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;experience&#34;&gt;Experience
&lt;/h2&gt;&lt;h3 id=&#34;soracom-inc&#34;&gt;Soracom Inc.
&lt;/h3&gt;&lt;p&gt;Tokyo, Japan / Remote&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Principal Software Engineer&lt;/strong&gt;&lt;br&gt;
March 2022 - Present&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Platform Team Lead&lt;/strong&gt;&lt;br&gt;
April 2025 - Present&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lead cross-functional engineering teams across frontend, application, and platform development.&lt;/li&gt;
&lt;li&gt;Built horizontally scalable backend systems in Go and AWS for real-time IoT data processing.&lt;/li&gt;
&lt;li&gt;Architected and delivered Grafana-based IoT data visualization platforms serving large-scale device deployments.&lt;/li&gt;
&lt;li&gt;Developed a full schema-aware harness for secure LLM-assisted querying of multi-tenant Snowflake data warehouses, including SQL generation, validation, history, favorites, and workflow-focused UX.&lt;/li&gt;
&lt;li&gt;Identified recurring customer reporting needs and built custom reporting foundations for reusable snapshots, shareable links, cached results, and recurring analysis workflows.&lt;/li&gt;
&lt;li&gt;Improved mission-critical alerting reliability through redundant architecture and stronger monitoring.&lt;/li&gt;
&lt;li&gt;Reduced average console load times from over fifteen seconds to under four seconds through performance optimization and deployment improvements.&lt;/li&gt;
&lt;li&gt;Built high-performance Grafana backend datasources and plugins.&lt;/li&gt;
&lt;li&gt;Improved caching performance with custom Cloudflare Workers, increasing cache hit rate to 95%.&lt;/li&gt;
&lt;li&gt;Created real-time snapshot and public dashboard sharing capabilities for IoT data visualization.&lt;/li&gt;
&lt;li&gt;Mentored engineers and led technical knowledge-sharing sessions across teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Senior Software Engineer&lt;/strong&gt;&lt;br&gt;
March 2018 - March 2022&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team Lead&lt;/strong&gt;&lt;br&gt;
September 2021 - March 2022&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded and modernized Soracom’s user console from a legacy Angular architecture.&lt;/li&gt;
&lt;li&gt;Led frontend development work on responsive design and user experience improvements.&lt;/li&gt;
&lt;li&gt;Built SSO support for multi-user authentication across the Soracom platform.&lt;/li&gt;
&lt;li&gt;Implemented security enhancements including rate limiting, OTP services, and access controls.&lt;/li&gt;
&lt;li&gt;Developed API gateway CORS wildcard support for dynamic subdomain access.&lt;/li&gt;
&lt;li&gt;Created logging and monitoring systems using DataDog and custom metrics.&lt;/li&gt;
&lt;li&gt;Delivered customer-facing features including plot panels for IoT device mapping and data visualization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;husoft-llc&#34;&gt;HUSoft LLC
&lt;/h3&gt;&lt;p&gt;Perth, Australia / Tokyo, Japan&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Founder and Lead Developer&lt;/strong&gt;&lt;br&gt;
2008 - Present&lt;/p&gt;
&lt;p&gt;Personally designed, developed, and shipped multiple App Store-featured apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EasyBeats&lt;/strong&gt;&lt;br&gt;
An iOS drum machine and long-running independent app business. Built a non-blocking, low-latency audio sequencer in C for early iOS devices, with a focus on touch-first interaction and reliable realtime audio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LockIn&lt;/strong&gt;&lt;br&gt;
A cross-platform messaging and scheduling app with calendar integration. Built a horizontally scalable backend in Go on Google App Engine with a NoSQL datastore, a native iOS client, and AngularJS-based Android, web, and desktop versions with a shared codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guitar Chord Pro&lt;/strong&gt;&lt;br&gt;
A guitar app using low-level audio APIs to switch between thousands of chords with minimal latency. Featured by Apple worldwide on launch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MapMap&lt;/strong&gt;&lt;br&gt;
A location sharing app built with React Native and TypeScript, sharing most code across iOS and Android. Built a Go backend on Google App Engine with Firebase realtime database integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoKey&lt;/strong&gt;&lt;br&gt;
A live location sharing app acquired by Secure2go in 2016. Built with Swift, Go, WebSockets, and realtime Google Maps integration.&lt;/p&gt;
&lt;h3 id=&#34;millstream-web-software&#34;&gt;Millstream Web Software
&lt;/h3&gt;&lt;p&gt;Western Australia&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Senior Web Developer&lt;/strong&gt;&lt;br&gt;
2004 - 2008&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Led development of a CMS and ecommerce SaaS product using a LAMP stack, XML, and XSLT.&lt;/li&gt;
&lt;li&gt;Consolidated the codebase into Git repositories and improved deployment processes.&lt;/li&gt;
&lt;li&gt;Built automatic caching and deployment to Amazon CloudFront for better international performance.&lt;/li&gt;
&lt;li&gt;Helped bring in corporate, government, and education sector clients.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;haymarket-print-and-web-services&#34;&gt;Haymarket Print and Web Services
&lt;/h3&gt;&lt;p&gt;Western Australia&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web Developer&lt;/strong&gt;&lt;br&gt;
2001 - 2004&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developed government and school websites using PHP, MySQL, HTML, and CSS.&lt;/li&gt;
&lt;li&gt;Created deployment and server management automation scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;education&#34;&gt;Education
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Bachelor of Computer Science&lt;/strong&gt;&lt;br&gt;
Curtin University, Bentley, Western Australia&lt;br&gt;
1997 - 2000&lt;/p&gt;
&lt;h2 id=&#34;contact&#34;&gt;Contact
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Email: chris&lt;!--.imagine--&gt;tian@hopefully&lt;span style=&#34;display: none;&#34;&gt;dont&lt;/span&gt;useful.com&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/cinkster&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;cinkster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Blog: &lt;a class=&#34;link&#34; href=&#34;https://blog.hopefullyuseful.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hopefully Useful&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Air Con: $1697 for an on/off switch</title>
        <link>https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/</link>
        <pubDate>Wed, 28 Aug 2024 17:00:00 +0800</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/</guid>
        <description>&lt;img src="https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/mainboard.jpg" alt="Featured image of post Air Con: $1697 for an on/off switch" /&gt;&lt;p&gt;&lt;strong&gt;Forcing customers to replace an entire system just because the cheapest component failed might be really profitable&lt;/strong&gt;, I have no idea&amp;hellip; But I do know that it annoyed me enough to make me want to fix it myself. While I understand that what I do next is beyond a large number of Advantage Air customers, in my investigation I found that there seems to be only software choices preventing modern tablets from working with older control systems.  Adding a simple &amp;ldquo;system&amp;rdquo; chooser to their software applications would give solutions to everyone, while the custom POE connector would ensure they still need their hardware.&lt;/p&gt;
&lt;h2 id=&#34;aircon-controller&#34;&gt;Aircon Controller
&lt;/h2&gt;&lt;p&gt;My family had a new home built in 2019. As part of the build package a large ducted reverse cycle (heatpump) air conditioning system was installed.  As it was part of the entire build I am not sure on the specific price of this system but based on other quotes I have seen for a similar sized house I would guess $10k-$12k.  The system has two main parts, the actual Daikin airconditioner and an Advantage Air control box in attic that opens the vents to the various zones. This control system is operated by a cheap POE powered Android tablet on the wall of the living room.&lt;/p&gt;
&lt;p&gt;The Advantage Air e-zone system is an adequate interface that does its job reasonably well, it has the ability to actively monitor temperature and adjust vent opening angles and fan speed to achieve desired temperatures across multiple zones. This combined with the ability to allow remote control via phone apps from anywhere meant &lt;strong&gt;I would have happily recommended this system to anyone&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;control-lost&#34;&gt;Control Lost
&lt;/h2&gt;&lt;p&gt;On Sunday the 18th of August 2024 approximately 6 months past warranty this changed.  The tablet was complaining that “Sorry Google services has stopped”.  I dismissed this message and continued with the task I had intended and turned off the heater.  Later that day I returned home and went to turn the heater on again, only to find that this time the e-zone app itself had died and refused to launch.  I restarted the tablet only to be greeted with a never ending ANDROID loading screen.&lt;/p&gt;
&lt;p&gt;Being a Sunday the next few hours I researched and tried everything I could find to get this tablet working again.  I entered recovery modes both English and Chinese and cleared every setting/partition I could.  There was no visible USB interface on the device so I couldn’t connect it to a computer.  Clearly there was something wrong with the operating system, a “system integrity check” returned multiple errors.&lt;/p&gt;
&lt;h2 id=&#34;disappointing-service&#34;&gt;Disappointing Service
&lt;/h2&gt;&lt;p&gt;I called Advantage Air support the next day and waited for a call back.  Eventually a support agent called and I explained my problem.  One of the first questions I received was on the age of the system.  Once he had established it was out of warranty &lt;strong&gt;it was explained to me that if the tablet was dead I would need a whole new control system for $1245&lt;/strong&gt;.  When I pushed back complaining that I only needed the cheap tablet replaced I received what sounded like a well rehearsed excuse along the lines of “Well technology keeps moving forward and systems aren’t compatible, new phones come out every year”.  I was incredulous, &lt;strong&gt;I&amp;rsquo;m all for smart things, but this is effectively just the on/off switch for my air conditioner&lt;/strong&gt;.  To be clear, the Airconditioner worked fine, the control box worked fine, only the Android tablet had failed.  We ended the call with him offering to send me instructions on how to hard reset the tablet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/recovery.jpeg&#34;
	width=&#34;3024&#34;
	height=&#34;4032&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/recovery_hu12918632069216153079.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/recovery_hu16335612587761864593.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Recovery: System Check Failed&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt; &lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/chinese.jpeg&#34;
	width=&#34;3024&#34;
	height=&#34;4032&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/chinese_hu16529903957547862901.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/chinese_hu17718868437222073798.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Factory recovery menu&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt; &lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/productreview.png&#34;
	width=&#34;1818&#34;
	height=&#34;2012&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/productreview_hu3147721685027291179.png 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/productreview_hu13397316582959955098.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Very common problem&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;90&#34;
		data-flex-basis=&#34;216px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;When the instructions arrived I found they were nothing I hadn’t already tried.  In the meantime I had my hopes buoyed with &lt;a class=&#34;link&#34; href=&#34;https://forums.whirlpool.net.au/thread/3n1jljwq?p=2#r37&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;evidence of people effectively using the latest tablet models&lt;/a&gt; with systems older than mine.  This began a series of back and forth emails between myself and support where I would get increasingly frustrated at their complete refusal to sell me a control tablet and the bullshit excuses that always came along with it.  &lt;strong&gt;I was angry and &lt;a class=&#34;link&#34; href=&#34;https://www.productreview.com.au/listings/advantage-air?sortBy=ratingLowest&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;it is clear that I’m not the only one&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The straw that broke the camels back was when their official quote came through.  &lt;strong&gt;Apparently not only the tablet and control system would need replacing but also the wireless temperature sensors too&lt;/strong&gt;.  This brought the price to $1697.  $1697 so I could turn my heater on again.  This is frankly outrageous and seems almost predatory.  Fortunately it was nearly spring here in Australia, but &lt;strong&gt;in Summer people would pay nearly anything to get the aircon on again&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;ok-ill-fix-it-myself&#34;&gt;Ok I&amp;rsquo;ll fix it myself
&lt;/h2&gt;&lt;p&gt;I now had an angry fire lit.  I was not going to pay this company a cent and became determined to fix/replace their tablet or install another companies system entirely.  &lt;strong&gt;My first step was to rip the tablet off the wall and take it apart&lt;/strong&gt;.  The POE connection wasn’t something I recognised as standard as it was sending 12V and 2V on the middle pins.&lt;/p&gt;
&lt;p&gt;Upon opening the tablet I found a hidden USB port! Connecting this to my computer allowed me to charge the device but no matter what I did, fastboot, recovery, adb sideload mode, everything… it wouldn’t recognise it.  I initially thought this was due to me never enabling “USB Debugging” inside the android interface but I would later realise it was the POE connector.&lt;/p&gt;
&lt;p&gt;After a couple of hours of frustratingly trying to load different firmwares via SDCard (I should state I am a total Android noob and was clumsily doing all of this)  I finally decided to unscrew the main board and see where the extra wires from the POE connector went.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/insidetablet.jpeg&#34;
	width=&#34;4032&#34;
	height=&#34;3024&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/insidetablet_hu14582507760185044323.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/insidetablet_hu10318497328469925549.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Inside the tablet&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt; &lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/usb.jpg&#34;
	width=&#34;3019&#34;
	height=&#34;2585&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/usb_hu16766451404790598658.jpg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/usb_hu3571500084571447256.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;POE to USB connection found!&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;116&#34;
		data-flex-basis=&#34;280px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;AHA 3 wires, connected to USB 5V and data lines!  The first thing I did was cut those datalines and immediately I could see the tablet when I ran &lt;code&gt;fastboot devices&lt;/code&gt;This lead to another couple of hours going down the rabbit hole of trying to use &lt;code&gt;mtktool&lt;/code&gt; to unlock the bootloader.  While it looked promising it would always fail on &lt;code&gt;stage2&lt;/code&gt; what ever that is and did feel hardware related.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In retrospect I wasted way too much time trying to resurrect this clearly broken tablet&lt;/strong&gt;.  For whatever reason (I suspect some sort of storage failure) everyone&amp;rsquo;s tablets die around the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When I finally gave up on the existing tablet, everything started falling into place&lt;/strong&gt;.  The only really unique part of this tablet, hardware wise was the POE adapter.  I could see it served two functions.  First it was wired to replace the battery to allow always on use, and secondly it was a USB device.&lt;/p&gt;
&lt;p&gt;My first instinct was to go buy another cheap android tablet and wire it up exactly as this one was.  But I know next to nothing about circuit boards and my soldering of small components is atrocious.  So my second instinct was to wire this POE connector up to a USB-A plug, connect it to my computer (via a hub, I didn’t trust my wiring at all ) then see if I could detect it.&lt;/p&gt;
&lt;p&gt;I couldn’t detect anything, then realised that maybe it was acting as a host and therefore could only connect to tablets/phones.  I needed an Android tablet or phone.  Fortunately I remembered that I did have an Android tablet, &lt;a class=&#34;link&#34; href=&#34;beercomp.png&#34; &gt;I won a Samsung Galaxy Tab 4 back in 2015 in a Hahn beer competition I entered randomly&lt;/a&gt;.  I had no idea where it was so spent another hour turning the house upside down for this forgotten relic.  My wife asked me what I was doing and when I told her she nonchalantly said “Oh the white one, yeah I saw it in the laundry cupboard a while back, does it even work?”&lt;/p&gt;
&lt;p&gt;I had no idea if it worked or not, but after 5 minutes of charging I saw the lock screen and excitedly attached my terribly soldered connector.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/terrible-soldering.jpeg&#34;
	width=&#34;3024&#34;
	height=&#34;4032&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/terrible-soldering_hu5368250854703282792.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/terrible-soldering_hu13417741372613334431.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;POE to USB connection&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt; &lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/first-connect.jpeg&#34;
	width=&#34;3024&#34;
	height=&#34;4032&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/first-connect_hu13139286892098828596.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/first-connect_hu13758548242967598701.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;First connection attempt&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Whoa! &lt;strong&gt;This was a step forward and also the exact point when I knew my venture would be successful&lt;/strong&gt;.  I am not a hardware/electronics expert, but I am &lt;em&gt;very comfortable&lt;/em&gt; in software.&lt;/p&gt;
&lt;p&gt;The original ezone tablet had been running Android 6.0, this Samsung was still on 5.0 but I didnt think that would cause any issues so I got started on doing what was clearly missing: The required apps.  All ezone apps are available both on the Advantage Air website and the apkpure site.  I only learned of the apkpure site from a post claiming he had been directed to it by a AA tech support person.&lt;/p&gt;
&lt;p&gt;I installed two apps.  The AAService app, which I guessed was the always on “service” and the Ezone “interface” app.  I excitedly connected the poe dongle again:&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;video
    controls
    src=&#34;aaservice-installed.mp4&#34;
    
    
    &gt;
        &lt;p&gt;
            Your browser doesn&#39;t support HTML5 video. Here is a
            &lt;a href=&#34;aaservice-installed.mp4&#34;&gt;link to the video&lt;/a&gt; instead.
        &lt;/p&gt;
    &lt;/video&gt;
&lt;/div&gt;

“Not on AA Hardware”&lt;/p&gt;
&lt;p&gt;Well duh, I didn’t expect it to be THAT easy but it was another roadblock,  I would have to learn how to patch Android apps.  I cut my teeth on Softice in DOS reversing much more complicated software for fun so I wasn’t daunted by this, but I also wasn’t expecting it to be so damn easy.&lt;/p&gt;
&lt;h2 id=&#34;android-app-patching&#34;&gt;Android app patching
&lt;/h2&gt;&lt;p&gt;Thanks to &lt;a class=&#34;link&#34; href=&#34;https://yasoob.me/posts/reverse-engineering-android-apps-apktool/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this article&lt;/a&gt;.  I learned that you can use a tool, er… &lt;code&gt;apktool&lt;/code&gt;  that allows you to not only disassemble an apk into smali ( &lt;a class=&#34;link&#34; href=&#34;https://payatu.com/blog/an-introduction-to-smali/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a kind of Java runtime machine code&lt;/a&gt; ) but &lt;strong&gt;you can make modifications and run the command in reverse &lt;code&gt;apktool b&lt;/code&gt; and it rebuilds it into a runnable app!&lt;/strong&gt;  No need for replacing bytes with a hex editor to stay within bounds etc… lol this seems like magic.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ apktool d app-aaservice2-release-14.116
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cherry on the top is that &lt;strong&gt;you can also use a de-compiler JAXE on an apk that does its best to turn it back into Java&lt;/strong&gt;.  This code wont compile, but it has the exact same structure as the smali code.  So you can identify what you need to modify in the pseudo-java, then make the changes in the smali. I used the &lt;a class=&#34;link&#34; href=&#34;http://www.javadecompilers.com/apk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;awesome hosted version here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So I opened the decompiled java project in VSCode, then one search for &amp;ldquo;AA Hardware&amp;rdquo; and I was here:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* access modifiers changed from: protected */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;onResume&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;onResume&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        f2272e.&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Log.&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;(f2271d, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;onResume&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ServicePleaseReboot.&lt;span style=&#34;color:#a6e22e&#34;&gt;f2283b&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setContentView(R.&lt;span style=&#34;color:#a6e22e&#34;&gt;layout&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;reboot_now&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            e.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;((Activity) &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (f.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            a();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Log.&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;(f2271d, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Not on AA Hardware&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Toast.&lt;span style=&#34;color:#a6e22e&#34;&gt;makeText&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;, R.&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;not_on_aa_hardware_error&lt;/span&gt;, 1).&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            finish();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Excellent, so if &lt;code&gt;f.a()&lt;/code&gt; is false then the &amp;ldquo;Not on AA Hardware&amp;rdquo; error will display and the app will quit.  Following the imports ( I am not a Java person so this caught me out ) I found the &lt;code&gt;f&lt;/code&gt; class was this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; b.a.a.a.i;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* compiled from: GetTabletInfo */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;g&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; i.&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now if you now go to &lt;code&gt;sources/b/a/a/a/i.java&lt;/code&gt; you will find that each one of these is a check against the device &lt;code&gt;Build.MODEL&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;for example i.c() is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; a().&lt;span style=&#34;color:#a6e22e&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eZone&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; a().&lt;span style=&#34;color:#a6e22e&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;e-zone&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; a().&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC7KS-EZ&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; a().&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC7KS6&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; a().&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC7KS6-EZ&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So each of these i.c() i.d() etc… just feature flag functions checking against the model name.  This c() function above is probably named something like &lt;code&gt;isEzone()&lt;/code&gt;. Another might be something like &lt;code&gt;isMyAir4()&lt;/code&gt; or &lt;code&gt;isZone10()&lt;/code&gt; etc&amp;hellip;  So I had two easy options to make this work with my e-Zone controller box.  I could make the i.c() (isEzone()) function always return true, or I could make the a() function always return my old tablet devicename.  In retrospect I think the first option would have worked fine, but at the time I didn&amp;rsquo;t know if the model name was being checked anywhere else so I chose the latter.&lt;/p&gt;
&lt;p&gt;My old tablet&amp;rsquo;s model name was on a sticker on the inside of the case, but looking at the code I saw it needed the &lt;code&gt;-EZ&lt;/code&gt; identifier tagged to end.  So the string I was to return was &amp;ldquo;PIC7KS6-EZ&amp;rdquo;. The original Java function looked like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Build.&lt;span style=&#34;color:#a6e22e&#34;&gt;MODEL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (str.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SM-T113&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MyAir5&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        . &lt;span style=&#34;color:#75715e&#34;&gt;// other if statements overriding Build.MODEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (str.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC8GS8&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MyAir5&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; str; &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;lt;-- I needed to change this to return &amp;#34;PIC7KS6-EZ&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jumping over to &lt;code&gt;sources/b/a/a/a/i.smali&lt;/code&gt; I found the same function, but with the smali code.  I could see the same if statements and the same return str.  I just had to change the return str to return &amp;ldquo;PIC7KS6-EZ&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-smali&#34; data-lang=&#34;smali&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    :cond_4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    const-string v1, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC8GS8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;.line&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    invoke-virtual {v0, v1}, &lt;span style=&#34;color:#66d9ef&#34;&gt;L&lt;/span&gt;java/lang/&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;;-&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;L&lt;/span&gt;java/lang/&lt;span style=&#34;color:#a6e22e&#34;&gt;Object&lt;/span&gt;;)&lt;span style=&#34;color:#66d9ef&#34;&gt;Z&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    move-result v1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    if-eqz v1, :cond_5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    goto :goto_0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    :cond_5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#move-object v2, v0 # &amp;lt;-- this was return str;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    const-string v2, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PIC7KS6-EZ&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# this returning the new string instead
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    :goto_0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return-object v2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;.end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ok modification done time to rebuild it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ apktool b app-aaservice2-release-14.116
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like magic you now have a new apk in the &lt;code&gt;dist&lt;/code&gt; folder.  This apk is unsigned though so I needed to sign it.  I don&amp;rsquo;t do any android work so I had to google what to do, but I ended up creating a key store like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt; -validity &lt;span style=&#34;color:#ae81ff&#34;&gt;10000&lt;/span&gt; -alias my-android-release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I signed the apk with this command&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ../my-release-key.jks -storepass passwordiused dist/app-aaservice2-release-14.116.apk my-android-release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I connected my tablet and tried to install.  Only to be hit with &lt;code&gt;INSTALL_FAILED_DUPLICATE_PERMISSION&lt;/code&gt;.  Turns out this was because I was installing the aaservice app which was requesting the same permissions as the ezone app.  This is fine &lt;em&gt;if they are both signed by the same key&lt;/em&gt; but they were not.  To get things moving I just deleted the ezone app.&lt;/p&gt;
&lt;p&gt;This time I fired up the aaservice app and it worked! I even got a nice notification announcing &amp;ldquo;System connected&amp;rdquo;.  OK Great! I had a working service, now only needed the UI app eZone working.  I did did the exact same &lt;code&gt;apktool d&lt;/code&gt; and &lt;code&gt;JAXE&lt;/code&gt; decompile as before but VSCode didn&amp;rsquo;t find any device strings or &amp;ldquo;Build.MODEL&amp;rdquo; checks. I quickly signed the eZone app with the matching key and installed, hoping that it didn&amp;rsquo;t need any other modifications.  Upon opening it seemed to be attempting to connect but ended up returning an error about an un-recognised system.&lt;/p&gt;
&lt;p&gt;I went back to the decompiled java and realised that actually VSCode&amp;rsquo;s search was just taking a long time, so I restricted the search to the java files.  It didn&amp;rsquo;t take long to find the exact same device checking code.  I made the exact same change to &lt;code&gt;smali/com/air/advantage/w1/k.smali&lt;/code&gt; and rebuilt the apk.  Installed it, connected to the POE and &amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/it-works.jpeg&#34;
	width=&#34;3024&#34;
	height=&#34;4032&#34;
	srcset=&#34;https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/it-works_hu4393131111181304838.jpeg 480w, https://blog.hopefullyuseful.com/blog/advantage-air-ezone-tablet-diy-repair/it-works_hu14442212562343589111.jpeg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;E-Zone running on a normal Android tablet&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-Zone running perfectly on an ancient Samsung Galaxy Tab 4&lt;/strong&gt;.  I was elated.  After I gave up on repairing the original, getting this tablet working took only a few hours and was a hell of a lot of fun.  This tablet is 10+ years old and yet still is much snappier than the junk that came with the system, but if I want to upgrade to something more powerful, say to control my homeassistant etc&amp;hellip; all I need to do is plug it into the usb.  But for turning the AC on and off it is more than enough and I am currently waiting on a nice flush connector to arrive then will mount it on the wall.&lt;/p&gt;
&lt;p&gt;My aircon company (Not Advantage Air) kindly emailed me the next day to let me know that one of their installers had found an old tablet in the back of a van that I could purchase for $400.  Although still outrageously expensive for what it is, had Advantage Air offered this originally I probably would have jumped at it.  Instead I am thankful I had the opportunity to get this working on my own.&lt;/p&gt;
&lt;p&gt;Hopefully this post is useful to someone else in the same situation.  None of this can be done without the original POE connector so it won&amp;rsquo;t help anyone that doesn&amp;rsquo;t already have AA hardware, but if this extremely common tablet failure is the problem you are facing then a little soldering and a new tablet is all you need.&lt;/p&gt;
&lt;h3 id=&#34;followup&#34;&gt;Followup
&lt;/h3&gt;&lt;p&gt;This post is being discussed on &lt;a class=&#34;link&#34; href=&#34;https://news.ycombinator.com/item?id=41386319&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hacker News&lt;/a&gt; which sparked some great comments like this &lt;a class=&#34;link&#34; href=&#34;https://news.ycombinator.com/item?id=41387108&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;one from gstar&lt;/a&gt; who lives in the same city and was working on the same problem:
&lt;blockquote&gt;
    &lt;p&gt;The system uses RS422&amp;hellip;Incidentally, if you root your tablet you can just change the build.MODEL to &amp;ldquo;MyAir5&amp;rdquo; and everything will work on a third party tablet&amp;hellip;&lt;/p&gt;&lt;span class=&#34;cite&#34;&gt;&lt;span&gt;― &lt;/span&gt;&lt;span&gt;gstar, &lt;/span&gt;&lt;a href=&#34;https://news.ycombinator.com/item?id=41387108&#34;&gt;&lt;cite&gt;Hacker News Comment&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a class=&#34;link&#34; href=&#34;https://news.ycombinator.com/item?id=41386319&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt; discussion thread &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gundy/aa_interop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;some HN members have started pooling their resources&lt;/a&gt;&lt;/strong&gt; to document everything Hardware/Protocol/API related.  Visit &lt;a class=&#34;link&#34; href=&#34;https://github.com/gundy/aa_interop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/gundy/aa_interop&lt;/a&gt; for more information.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The Future Called 30 Years Ago</title>
        <link>https://blog.hopefullyuseful.com/blog/2014/04/04/the-future-called-30-years-ago/</link>
        <pubDate>Fri, 04 Apr 2014 00:00:00 +0000</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/2014/04/04/the-future-called-30-years-ago/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/ToiletControls.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Toilet Control Panel in Roppongi&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;japan-circa-2006&#34;&gt;Japan circa 2006
&lt;/h3&gt;&lt;p&gt;I stare at the strange looking symbols with trepidation. Fear mixed with equal doses of excitement, is this the time I finally do it? Yes.&lt;/p&gt;
&lt;p&gt;I gather up the courage and push what I believe to be the start button. There is a whirring noise then nothing, for an excruciating second I think I have made a terrible mistake. Then it happens, a gush of initially cool but then warm water blasts my rear end in surprisingly the correct spot.  The sensation isn&amp;rsquo;t unpleasant but certainly unfamiliar and although I seemed to have correctly started the process, I am soon filled with the fear that I won&amp;rsquo;t be able to stop it.&lt;/p&gt;
&lt;p&gt;I again stare intently at the Japanese characters hoping that one unlocks some forgotten part of my brain that will allow me to decipher the stop mechanism.  The warm water continues to jet relentlessly.  This newness of this experience and the increasing desire to make it end makes me reckless so I just guess and push another button.  The water stops.  I am unreasonably relieved.  This too soon passes.&lt;/p&gt;
&lt;p&gt;Another whirring sound puts me on high alert, the vulnerability of this position cannot be overstated.  Suddenly another blast, this time of warm air.  Although I made a mistake, the urgency to stop a flow of air is less than it was with the water so I take my time analysing the foreign symbols.  A part of my brain unlocks, and I press the stop button.  I&amp;rsquo;d done it, achievement unlocked, the boy became a man yadda yadda. Seven seconds.&lt;/p&gt;
&lt;p&gt;That was my first true experience with a Japanese toilet seat, but my first ever encounter actually occurred nearly 6 years earlier.&lt;/p&gt;
&lt;h2 id=&#34;australia-circa-2000&#34;&gt;Australia circa 2000
&lt;/h2&gt;&lt;p&gt;My girlfriend at the time lived with her brother.  Having recently visited Japan he returned so enamored with their modern bathrooms that he brought home $800 of electronic rear end washing wizardry.&lt;/p&gt;
&lt;p&gt;He spent the next few days wiring it up and adding the necessary plumbing (most seats of this type require power and access to a fresh water tap).  It was a lot of work, for something that at the time I felt was frankly, stupid.&lt;/p&gt;
&lt;p&gt;Although I probably sat on that seat more than a hundred times I never even once considered pushing the buttons.  For whatever reason the idea of using water instead of paper to clean myself repelled me.  When you added the uncomfortable &lt;em&gt;just used&lt;/em&gt; feeling that the electronically heated seat gave, it wasn&amp;rsquo;t my favourite location.&lt;/p&gt;
&lt;p&gt;I write all this to try and convey how disinterested in Japanese washlet toilets I was.  So disinterested that it took 6 years and the pressure of experiencing &lt;em&gt;Japanese Culture&lt;/em&gt; while on holiday for me to finally push the wash button.&lt;/p&gt;
&lt;h2 id=&#34;180&#34;&gt;180°
&lt;/h2&gt;&lt;p&gt;Today the situation is completely different.  For a variety of reasons I ended up spending a large amount of time from that first button push in Japan.  I currently live in Tokyo and although I plan to soon return to Australia, I will never return to &lt;em&gt;normal&lt;/em&gt; toilets.&lt;/p&gt;
&lt;p&gt;So what happened to completely change my opinion on this matter?&lt;/p&gt;
&lt;h2 id=&#34;own-one--learn-the-controls-especially-the-stop-button&#34;&gt;Own one / Learn the controls, especially the Stop button.
&lt;/h2&gt;&lt;p&gt;Most likely when you first experience an washlet toilet you are in not in the comfort of your own home.  With this comes the anxiety that if you do something wrong a very embarrassing situation could ensue.  A Japanese model only adds to this anxiety, as not knowing how to stop it is the main problem.&lt;/p&gt;
&lt;p&gt;When I moved into my apartment I had my own seat to experiment with.  There is often a myriad of controls, for controlling everything you could want.  From Water/Air temperature and pressure through to seat temperature and timing systems.  Knowing that &amp;ldquo;Stop&amp;rdquo; will stop everything is crucial, as it allows you to experiment freely without fear.&lt;/p&gt;
&lt;h2 id=&#34;its-not-just-about-using-less-paper&#34;&gt;It&amp;rsquo;s not just about using less paper.
&lt;/h2&gt;&lt;p&gt;Often I&amp;rsquo;ll read some spiel spouting the environmental benefits of using washlet toilets, claiming that you use substantially less paper.  These claims are often countered by skeptics who argue that in their experience the wash cycle alone was not enough to&amp;hellip; &lt;em&gt;finish the job&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Using such a toilet effectively requires both the wash then the paper approach.  They&amp;rsquo;re not mutually exclusive, it&amp;rsquo;s about getting the best (cleanest) result.  First you blast it down with water, then you dry up with paper.  (&lt;em&gt;side note: I&amp;rsquo;ve found all &amp;ldquo;air dry&amp;rdquo; mechanisms to be far too slow in practice.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;As a friend once explained to me, in those times when you experience the perfect mess free evacuation, a Japanese toilet has little to offer over a normal western one.  It is in tougher times, say the day after a junk food or beer binge where it will come to the fore.  In those more challenging times it can be the difference between feeling refreshed, and immediately desiring a shower.&lt;/p&gt;
&lt;h2 id=&#34;that-warm-seat&#34;&gt;That warm seat.
&lt;/h2&gt;&lt;p&gt;This one is pure preference.  Initially I couldn&amp;rsquo;t escape that uncomfortable &lt;em&gt;just used&lt;/em&gt; sensation.  But you can switch it off, I did that, then during the winter decided to re-enable it.  Being in control of the situation has over time completely changed my perception.  Now it actually feels really uncomfortable if a seat isn&amp;rsquo;t perfectly warm in a cold room.&lt;/p&gt;
&lt;h2 id=&#34;final-word&#34;&gt;Final Word
&lt;/h2&gt;&lt;p&gt;I felt the need to write this down mainly because people often still have a look of disgust whenever it comes up in conversation (quite regularly with visitors from outside Japan).  I too was once blind, but now I see.  I&amp;rsquo;ll trot the regularly used (but no less true for it) example that if you were to get mud on your hand, would you use paper to wipe it off? Or rinse it with water?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a convert and I think if you give it a real shot you probably will be &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=rBI8uCKi2lI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;laughing at Stallone too&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have any comments feel free to add them over at the &lt;a class=&#34;link&#34; href=&#34;https://plus.google.com/103754485972196407241/posts/jV22JgbXAHN&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;corresponding Google+ post&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>I Couldnt Wait for the New Mac Pro</title>
        <link>https://blog.hopefullyuseful.com/blog/2013/08/31/i-couldnt-wait-for-the-new-mac-pro/</link>
        <pubDate>Sat, 31 Aug 2013 00:00:00 +0000</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/2013/08/31/i-couldnt-wait-for-the-new-mac-pro/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;For those of you coming from Hacker News wondering why I need OS X it&amp;rsquo;s because I&amp;rsquo;m an indie developer that makes &lt;a class=&#34;link&#34; href=&#34;http://easybeats.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/Restaurant.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Bathroom of my favourite restaurant &#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure if it was the after the 4th or 5th time my Macbook Air hard crashed rendering in Final Cut Pro that my planned upgrade timing would need to be brought forward.  In any case, the writing was on the wall.  I had been asking too much of the little 11&amp;quot; wonder.  Although I had bought the most powerful configuration available at the time (i7/256GB/4GBRam), rendering 2.7k video was not part of its original job description.&lt;/p&gt;
&lt;p&gt;The majority of my work is done at my standing desk on a large external monitor.  My girlfriend&amp;rsquo;s MacBook Pro 13 had finally finished its slow death so my upgrade path seemed clear.  Give the 11&amp;quot; to said girlfriend and purchase a new desktop.  For trips to a local cafe, take the 11&amp;quot;.&lt;/p&gt;
&lt;p&gt;For new desktop options I basically had 3 choices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mac Mini&lt;/li&gt;
&lt;li&gt;iMac 27&amp;quot;&lt;/li&gt;
&lt;li&gt;New Mac Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Mac Mini was ruled out pretty quickly.  It just wasn&amp;rsquo;t a big enough performance jump over the Air.  If I was going to compromise mobility with a desktop machine I wanted it to be more powerful.&lt;/p&gt;
&lt;p&gt;The 27&amp;quot; iMac was harder to eliminate.  It seems like a great machine, and in retrospect I should have bought one years ago.  But alas I didn&amp;rsquo;t and now I&amp;rsquo;ve reached a point where I&amp;rsquo;ve basically decided that I will never buy a non retina/high dpi display again.  Retina iMacs aren&amp;rsquo;t available yet so that was out.&lt;/p&gt;
&lt;p&gt;Speaking of retina, I should probably also explain why the retina MacBook Pro was not considered.  It&amp;rsquo;s probably the perfect compromise for me, fast yet still portable with a beautiful screen.  Two problems there, one is the screen is not quite big enough for me and two, much like the iPad 3 the graphics hardware doesn&amp;rsquo;t quite match the screen.  Scrolling and animation tasks are jerky or just plain slow.  I can&amp;rsquo;t deal with that in a new machine.  Maybe in a year or two when it can drive its screen and a large external retina smoothly.&lt;/p&gt;
&lt;p&gt;That left me with the upcoming Mac Pro.  The non upgradeable graphics and external only storage expansion did concern me but I still had decided that moving forward, with new external retina displays in mind I could justify what ever price they commanded.&lt;/p&gt;
&lt;p&gt;So it was decided.  New Mac Pro. Will buy.&lt;/p&gt;
&lt;p&gt;Or so I thought.  A couple of months ago a change in circumstances meant my girlfriend&amp;rsquo;s need for my 11&amp;quot; Air went from &amp;ldquo;After you buy a new Mac Pro&amp;rdquo; to &amp;ldquo;Yesterday&amp;rdquo;.  Since the Mac Pro was still months away I had to make a decision.&lt;/p&gt;
&lt;h2 id=&#34;hackintosh&#34;&gt;Hackintosh?
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve had Mac computers in my personal and work life since the 1984 512k.  But working as a web developer from 2000 till 2006 I only owned PC laptop/desktop machines.  In early 2006 after seeing the Ruby on Rails Textmate screen cast I decided I wanted to dabble in OS X again (primarily to use textmate).&lt;/p&gt;
&lt;p&gt;At the time the Hackintosh scene was starting to gain momentum and I was able after a lot of tedious mucking around able to get OS X running on my pimped up &lt;a class=&#34;link&#34; href=&#34;http://www.notebookforums.com/t/113866/how-to-upgrade-your-9300-with-the-ultra-or-7800-photo-guide&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dell Inspiron 9300&lt;/a&gt;.  It ran decently enough for web programming tasks but the lack of hardware supported Quartz graphics and working onboard wifi meant I quickly upgraded to a proper MacBook.&lt;/p&gt;
&lt;p&gt;Fast forward to 2013 and from all reports the Hackintosh scene is much improved, with guides often stating that if you buy the correct compatible hardware the whole install process will go very smoothly.  I didn&amp;rsquo;t really believe these reports (Hackintosh users have a very different understanding of the word &amp;ldquo;smooth&amp;rdquo;). However, seeing as my gaming PC was due for a refresh I figured I could give it a go and if it all went to hell, I&amp;rsquo;d suffer through the pain then move it to that role when the Mac Pro was ready.&lt;/p&gt;
&lt;p&gt;So I headed to what seems to be the ultimate source of all things Hackintosh, &lt;a class=&#34;link&#34; href=&#34;http://www.tonymacx86.com/home.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;www.tonymacx86.com&lt;/a&gt;. This site has a monthly updated guides on several different confirmed working hackintosh builds.  I chose the &amp;ldquo;CustoMac Mini Deluxe&amp;rdquo; as it seemed like the perfect combination of size and power for me.  It was a mini case that also supported a full size video card.  This was important to me because if this system had the possibility of being my main machine I wanted it capable of driving any Retina/HiDPI screens that may appear in the near future.&lt;/p&gt;
&lt;p&gt;I quickly sorted the equivalent parts on Amazon.jp and placed my order:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/AmazonHackintoshOrder.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;My Amazon Order &#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;A few days later it all arrived:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/AmazonDelivery.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;It arrives &#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;putting-it-together&#34;&gt;Putting it together
&lt;/h2&gt;&lt;p&gt;Assembling the components is the same as any other PC build. I&amp;rsquo;ve done this countless times in the past but realise that many people are very apprehensive regarding doing this themselves.  I won&amp;rsquo;t write too much about this but to say, if you have all the right components it&amp;rsquo;s nearly impossible to go wrong.  If you can put together IKEA furniture you can build a computer from OEM parts.&lt;/p&gt;
&lt;p&gt;Installing OS X however is not so simple.  The &amp;ldquo;smooth&amp;rdquo; version in point form:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the AppStore on an actual Mac to download the Mountain Lion installer&lt;/li&gt;
&lt;li&gt;Use &lt;a class=&#34;link&#34; href=&#34;http://www.tonymacx86.com/downloads&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;UniBeast&lt;/a&gt; from tonymacx86.com to build a bootable USB key image of the installer.&lt;/li&gt;
&lt;li&gt;Setup your newly built computers BIOS to match the recommended settings.&lt;/li&gt;
&lt;li&gt;Install OS X using the bootable USB&lt;/li&gt;
&lt;li&gt;Boot into OS X then use &lt;a class=&#34;link&#34; href=&#34;http://www.tonymacx86.com/downloads&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MultiBeast&lt;/a&gt; to fill in the missing drivers and boot loader.&lt;/li&gt;
&lt;li&gt;Reboot &amp;amp; Enjoy OS X&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Steps 1-4 actually were actually straight forward, but that was expected.  Getting a Hackintosh working &lt;em&gt;right&lt;/em&gt; is the hardest bit, and this build was no different.&lt;/p&gt;
&lt;p&gt;My first problem was that after install I could not get OS X to boot using anything but safe mode.  I spent a good couple of hours googling this and could find no solutions.  Eventually a complete reinstall seemed to sort this &lt;em&gt;shrugs&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;working-ish&#34;&gt;Working (ish)
&lt;/h2&gt;&lt;p&gt;After it would boot correctly I ran MultiBeast and about 8 hours after I had started, finally had a working (ish) system.  I say &amp;ldquo;ish&amp;rdquo; because all was not perfect.  Example of problems were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Onboard Wifi didn&amp;rsquo;t work (nor ever will apparently)&lt;/li&gt;
&lt;li&gt;Onboard Bluetooth works, but only after login (meaning no password on startup)&lt;/li&gt;
&lt;li&gt;HDMI audio out is a no show&lt;/li&gt;
&lt;li&gt;USB 3.0 only works with USB 3.0 devices (no backwards compatibility)&lt;/li&gt;
&lt;li&gt;Sleeps fine, just doesn&amp;rsquo;t wake up :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of these some I could live with, some I could not.  WiFi for example I don&amp;rsquo;t need at all, kind of defeats the purpose of my optical fibre internet connection.  Most of the others though, as I used the computer for the following few days, really ate at me.&lt;/p&gt;
&lt;p&gt;A lot of these problems are related to something called a &lt;a class=&#34;link&#34; href=&#34;http://wiki.osx86project.org/wiki/index.php/DSDT&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DSDT file&lt;/a&gt; (Differentiated System Description Table) which you can use to better direct OS X to use the hardware you are giving it.  Tonymacx86.com suggested that the hardware I chose was so compatible that I didn&amp;rsquo;t need this file.  This may have been true to get it to boot, but was certainly not true for full functionality.&lt;/p&gt;
&lt;p&gt;Tonymacx86.com includes a database of these files but the one included for the H77N mother board I had suggested that it fixed nothing except the HDMI audio.  I tried it and it changed nothing on my system so I thought I would just have to live with the problems.&lt;/p&gt;
&lt;h2 id=&#34;salvation&#34;&gt;Salvation
&lt;/h2&gt;&lt;p&gt;That was until I stumbled onto this &lt;a class=&#34;link&#34; href=&#34;http://www.tonymacx86.com/dsdt/99822-gigabyte-dsdt-patch-repository-maciasl-14.html#post608077&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;thread&lt;/a&gt;.  Apparently by creating a clean rip of my own hardware&amp;rsquo;s DSDT file I could then use a tool to apply community supplied patches for my exact hardware.  I was dubious at first because it seemed like a lot of work, but the problems I listed above were annoying me so much I had to try.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/MaciASL.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Patches Patches Patches! &#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;The process involved me booting using no DSDT file at all then using an app called &lt;a class=&#34;link&#34; href=&#34;http://sourceforge.net/projects/maciasl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MaciASL&lt;/a&gt; to rip a clean version of my system description (I could have used Linux or Windows apparently but this seemed easiest).  You then add a couple of online patch repositories and apply the appropriate patches to your vanilla system description file.  Install the file in the correct location (/Extras/DSDT.aml) and reboot.&lt;/p&gt;
&lt;p&gt;Like magic my HDMI audio and USB 3 ports started working. Another issue I had with Ethernet not working with DHCP also was fixed.  If you end up building a similar system I cannot recommend this patch your own dsdt technique enough.&lt;/p&gt;
&lt;p&gt;So a week after starting I had a system that cost me approximately $850 has 4 times the Ram of my previous machine and scores 13000ish on geekbench (32bit).&lt;/p&gt;
&lt;h2 id=&#34;epilogueis-it-worth-it&#34;&gt;Epilogue/Is it worth it?
&lt;/h2&gt;&lt;p&gt;I guess it depends on how much you value your time, and how much you enjoy challenges like this.  I would guess over the last 2 months I have spent probably 3 or 4 full work days building and debugging this system.  We haven&amp;rsquo;t seen pricing for the new Mac Pro&amp;rsquo;s yet so it is hard to compare.  It will no doubt be faster and more expensive.  How much more so in each changes the equation, so I&amp;rsquo;ll just list the pros and cons of the system I built.&lt;/p&gt;
&lt;h3 id=&#34;pros&#34;&gt;Pros:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Price, it can&amp;rsquo;t be beat&lt;/li&gt;
&lt;li&gt;Performance, Final Cut Pro renders smoke my old MacBook.&lt;/li&gt;
&lt;li&gt;Internal Storage (seriously look at the photo below) I&amp;rsquo;m loving having all my drives in one enclosure.&lt;/li&gt;
&lt;li&gt;Ports 2xHDMI 1xDVI 2xGb Ethernet 4xUSB 3 4xUSB 2 SPDif Optical Audio&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cons&#34;&gt;Cons
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Massive&lt;/em&gt;, &lt;em&gt;Massive&lt;/em&gt; pain in the butt to setup compared to a retail Mac.&lt;/li&gt;
&lt;li&gt;Every new OS X system update means &lt;em&gt;the pain&lt;/em&gt; might start again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really don&amp;rsquo;t want to downplay the negative aspects at all.  They are huge.  Huge enough that when the Mac Pro pricing is announced I will be doing the price/performance calculations to determine whether an upgrade is worth my time.  A retina iMac would be a no-brainer, I wouldn&amp;rsquo;t hesitate but I&amp;rsquo;m not hearing any word on those.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/HackintoshInside.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;A fair amount of room! &#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-i-would-do-differently&#34;&gt;What I would do differently
&lt;/h2&gt;&lt;p&gt;I wouldn&amp;rsquo;t do much differently with the exception of the BitFenix case.  As I said at the start I chose this due to the ability to install a full high powered GFX card (for future Retina display use).  But the case turned out to be much &lt;em&gt;much&lt;/em&gt; larger than I had expected.  As you can see in the picture above it has room for a ridiculous number of extra drives.  While I&amp;rsquo;m certainly happy to be using one or two of those slots the potential 9 or whatever is total overkill.  Had I seen &lt;a class=&#34;link&#34; href=&#34;http://www.tonymacx86.com/golden-builds/84975-bitdoctors-minimacpro-build-intel-core-i7-3770-gigabyte-ga-h77n-wifi-hd-4000-16-gb-256-gb-ssd-12.html#post525782&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BitDoctors MiniMacPro build&lt;/a&gt; beforehand I most certainly would have gone a similar route.&lt;/p&gt;
&lt;p&gt;Wow if you actually read this far I applaud you.  I&amp;rsquo;m still new at this blogging stuff so need to definitely work on my post length.&lt;/p&gt;
&lt;p&gt;If you have any comments feel free to add them over at the &lt;a class=&#34;link&#34; href=&#34;https://plus.google.com/103754485972196407241/posts/Ks5WSgveFGk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;corresponding Google+ post&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ios App Promo Video on a Budget</title>
        <link>https://blog.hopefullyuseful.com/blog/2013/07/22/ios-app-promo-video-on-a-budget/</link>
        <pubDate>Mon, 22 Jul 2013 00:00:00 +0000</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/2013/07/22/ios-app-promo-video-on-a-budget/</guid>
        <description>&lt;p&gt;After nearly a year of hard work I finally released &lt;a class=&#34;link&#34; href=&#34;http://easybeats.net/loadiTunes.php?app=easybeatspro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EasyBeats 3 Pro Drum Machine&lt;/a&gt; last week on the AppStore.  A week before releasing the app I put a &lt;a class=&#34;link&#34; href=&#34;http://www.youtube.com/watch?v=ayN8tlkLpeY&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;promo video&lt;/a&gt; of it up on youtube.  It had the desired effect, there was a lot of excitement generated about the app, but there was also a good number of questions asked about the making of the video.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll do my best to cover the process here, but first if you haven&amp;rsquo;t actually seen the video you should probably do so here, I&amp;rsquo;ll wait below.&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/ayN8tlkLpeY&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Ok so how did I make it?&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TLDR:
&lt;/h2&gt;&lt;p&gt;I walked around Higashi-Shinjuku station carrying a GoPro on a monopod looking incredibly shady videoing myself play the same song a hundred times over. Mixed it together using software I had never really used on a computer that barely made it through the process.&lt;/p&gt;
&lt;h2 id=&#34;long-version&#34;&gt;Long Version
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m generally pretty terrible at marketing.  Like a lot of devs I leave it last and don&amp;rsquo;t dedicate any where near enough time towards it.  This is definitely something I&amp;rsquo;m trying to improve.&lt;/p&gt;
&lt;p&gt;One thing I always do though is make promotional/tutorial videos.  My initial thought for a teaser video for EB3 was a setup similar to (find and add link to small budget lightbox promo video setup here), with a well choreographed tutorial that covered all the apps key features.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/budgetlightbox.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;My Tutorial Video Setup &#34;
	
	
&gt;
My tutorial video budget recording center.&lt;/p&gt;
&lt;p&gt;I started on this with good results but quickly realized that although great for teaching users exactly how to do certain tasks it didn&amp;rsquo;t really convey just how easy it was to create something great in those small fractions of free time people have in real situations.&lt;/p&gt;
&lt;h2 id=&#34;a-new-plan&#34;&gt;A new plan
&lt;/h2&gt;&lt;p&gt;My next idea was I would don my snowboarding helmet with my GoPro Hero 3 attached, walk around my neighborhood and make a beat.  With the helmet I could position the camera correctly then have two hands completely free to work the app.  With this setup I could show users just how easy it was to create a beat on their walk to the train, idle time etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;After a small bit of experimentation with this I found two major problems.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The position of the camera on top of my helmet was too high and felt strangely &lt;em&gt;impersonal&lt;/em&gt; for an app demonstration. This resulted in me having to hold the device up much higher than was comfortable and I often would accidentally move out of shot.&lt;/li&gt;
&lt;li&gt;I looked pretty scary and perhaps mentally unstable walking around wearing a black snowboarding helmet.  I wanted to shoot the video walking through my local subway station and possibly on a couple of trains.  This would be difficult or at the very least &lt;em&gt;incredibly&lt;/em&gt; awkward.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ok so helmet cam was out, so again after a bunch of experimenting around the apartment I found that I could get decent results mounting the camera on my monopod, then tucking said monopod under my armpit.&lt;/p&gt;
&lt;h2 id=&#34;unusable-footage&#34;&gt;Unusable Footage
&lt;/h2&gt;&lt;p&gt;So off I set walking around Higashi Shinjuku station filming myself creating different beats from scratch (the beat I ended up using I actually made on my second take).  I still looked ridiculous with the camera pole tucked under my arm but much less so than before.  I was out and about for about an hour and a half before I returned home to check the results.&lt;/p&gt;
&lt;p&gt;This highlighted one of the main problems with using a GoPro for app promo videos.  Although it shoots fantastic 2.7K video (What I filmed in), you have no real idea of the results until you plug it into your computer.  When I got back I found that most of my footage was unusable, due to reflections or general positioning of the shot.  To be fair this is not what the GoPro is designed for, and outdoor action shooting does not require this kind of feedback.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/Reflection.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Unusable GoPro Footage &#34;
	
	
&gt;
A lot of footage looked like this.&lt;/p&gt;
&lt;p&gt;Another problem I experienced as filming novice was &lt;a class=&#34;link&#34; href=&#34;http://www.youtube.com/watch?v=4Go3ksjkoKU&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;fluorescent flicker&lt;/a&gt;.  Any time you shoot video under fluorescent lights you might have to deal with your footage flickering.  This is impossible to remove afterwards and without a viewfinder on a GoPro you won&amp;rsquo;t know till later.  I ended up having to trash a significant number of shots due to this.&lt;/p&gt;
&lt;h2 id=&#34;boring&#34;&gt;Boring
&lt;/h2&gt;&lt;p&gt;A bigger concern however was that although a one take shot of beat being created was informative, it still lacked the excitement a promo video needs.  The video needed multiple cuts and camera angles to stay interesting.  Initially I tried filming from another angle with a spare iPhone but it was near impossible to walk while doing this by myself.&lt;/p&gt;
&lt;p&gt;The lack of good footage I got on the first outing actually caused me to find the solution.  I didn&amp;rsquo;t have any shots long enough so I combined two completely separate shots in Final Cut Pro to at least have something to build on.  I found that the cut between these two shots was coincidentally on a drum hit, this definitely made it more interesting, but the problem was the clips weren&amp;rsquo;t really related.  As such I decided I would again head out and record myself making the same beat again and again in as many different locations and configurations as possible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/Shots.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;A very small sample of the many shots I took &#34;
	
	
&gt;
A very small sample of shots I took.&lt;/p&gt;
&lt;h2 id=&#34;side-benefit&#34;&gt;Side Benefit
&lt;/h2&gt;&lt;p&gt;Now that I was no longer doing the video in one take it gave me a lot more opportunity to show off the other customizable features of EasyBeats 3.  EB3 is usable in both Portrait and Landscape, so I could show that.  EB3 has custom color themes so I could jump between them.  Finally EasyBeats 3 is a universal app available on iPhone, iPod and iPad so the video could now convey all of this without me needing to state it specifically.&lt;/p&gt;
&lt;p&gt;For about 3 hours I walked the streets of Shinjuku filming the app in all the different combinations I could, all the time not knowing what footage would work and what wouldn&amp;rsquo;t.  In terms of positioning the shots I decided to shoot everything in 2.7k because that would later allow me to zoom in without losing quality on my final 1080p export.&lt;/p&gt;
&lt;p&gt;Filming all went fine but I must admit to being pretty self conscious about holding a camera on a pole while riding escalators throught the train station. &lt;a class=&#34;link&#34; href=&#34;http://www.youtube.com/watch?v=yuNUYG7-pew&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Up Skirt filming&lt;/a&gt; is an issue here and I certainly looked suspicious.&lt;/p&gt;
&lt;h2 id=&#34;27k-is-awesome-just-not-on-a-macbook-air-11&#34;&gt;2.7K is Awesome, just not on a Macbook Air 11&amp;quot;
&lt;/h2&gt;&lt;p&gt;At the time my main development machine was a late 2011 Macbook Air with an i7 and 4GB of ram.  For iOS development I used it connected to an external monitor with a separate keyboard and mouse.  It is perfectly capable for most anything an iOS developer could throw at it (with the exception of 3D games I assume).  It has also been fine for me when using iMovie and Final Cut Pro X in 1080P situations.&lt;/p&gt;
&lt;p&gt;2.7K video however, made it cry. Then whimper. Then die.  The only way to resurrect it was a full power off and on.  2.7K video was always going to be slow, I knew that (finder previews stuttered constantly).  But I constantly experienced a problem when trying to render even small sections where all memory would be consumed, followed by the swap file growing up to 90GB, filling my entire SSD, crashing the system.&lt;/p&gt;
&lt;p&gt;Obviously something was seriously wrong and although I found the exact same problem reported in the user forums there was very little in the way of solutions.  Eventually I tried completely duplicating my entire project (including GBs of video) and recreating from scratch. &lt;a class=&#34;link&#34; href=&#34;https://discussions.apple.com/message/22184757#22184757&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;(My Posted solution on Apple forums)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With this problem solved and by &lt;a class=&#34;link&#34; href=&#34;http://support.apple.com/kb/PH12702?viewlocale=en_US&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;using proxy media&lt;/a&gt; you can actually edit 2.7K footage reasonably on a Macbook Air 11&amp;quot;.  It&amp;rsquo;s just not fast so expect a lot of delays.&lt;/p&gt;
&lt;h2 id=&#34;multiple-angle-editor&#34;&gt;Multiple Angle Editor
&lt;/h2&gt;&lt;p&gt;Final Cut Pro X has an awesome multi angle editor for quickly mixing footage from the same event in time.  Basically it automatically aligns all the shots by time stamp so you can easily switch between angles live like a set director.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/AngleEditing.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Angle Editor Setup in Final Cut Pro X &#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Although my footage wasn&amp;rsquo;t all of the same event, I was performing the same song so as long as I synced my footage to my master audio track I could use this.  You can see from the above image that only certain parts of each take were actually usable, so the whole thing behind the scenes is pretty scattered. &lt;a class=&#34;link&#34; href=&#34;http://www.youtube.com/watch?v=kmFmyXWaQHM&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Click here to watch the video I used to learn multi cam editing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With this knowledge I was able to quickly cut between all the footage I had assembled according to the audio track.&lt;/p&gt;
&lt;h2 id=&#34;lack-of-focus&#34;&gt;Lack of Focus
&lt;/h2&gt;&lt;p&gt;Now the video was exciting, with nice cuts in time with the audio track but due to the wide angle lens of the GoPro I found my attention was often distracted away from the app.&lt;/p&gt;
&lt;p&gt;The solution was to blur the background.  I had always planned on doing this when ever peoples faces were visible (&lt;a class=&#34;link&#34; href=&#34;http://en.wikipedia.org/wiki/Google_Street_View_privacy_concerns#Japan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;They&amp;rsquo;re pretty sensitive about that here&lt;/a&gt;).  I used basically the technique shown &lt;a class=&#34;link&#34; href=&#34;http://www.youtube.com/watch?v=qv_Wo5h4o5c&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; with the only difference really being that I inversed the mask.  I also fortunately didn&amp;rsquo;t need tracking as most of my shots the phone stayed in the same position.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.hopefullyuseful.com/images/Blurred.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;A very small sample of the many shots I took &#34;
	
	
&gt;
My fridge is better blurred out, believe me.&lt;/p&gt;
&lt;h2 id=&#34;add-titles-and-a-vignette&#34;&gt;Add Titles and a vignette
&lt;/h2&gt;&lt;p&gt;I wasn&amp;rsquo;t sure if I wanted titles at all at first.  I added them only at the very end and tried to keep them as sparse as possible hoping not to detract from the fact that the music the user was hearing was being made effectively live in front of them.&lt;/p&gt;
&lt;p&gt;I added a slight vignette to make the whole thing look a little more professional.  It took forever on the Macbook Air. Do this last if you are using something similar.&lt;/p&gt;
&lt;h2 id=&#34;quick-note-on-audio&#34;&gt;Quick Note on Audio
&lt;/h2&gt;&lt;p&gt;All audio in my video was recorded in one take on my iPhone with a cable jacked into my computer.  I used Audacity with monitoring on (so I could hear what I was playing) to record to a wav file.  Syncing any audio up to video is really easy with modern software so do it!  I&amp;rsquo;ve seen a few videos that visually seem to have pretty good production values, but then the audio is hissy and terrible and really cheapens the whole thing.&lt;/p&gt;
&lt;h2 id=&#34;total-cost&#34;&gt;Total Cost
&lt;/h2&gt;&lt;p&gt;I already had all of the below so really the only cost to me was time.  It took me about 3 days in total I think but at least 50% of that was spent watching tutorial videos on youtube.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GoPro Hero 3 Black $399&lt;/li&gt;
&lt;li&gt;Final Cut Pro X $299 - Though I think there is a 1 month free trial&lt;/li&gt;
&lt;li&gt;Monopod pole thing $20 from Amazon.jp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So thats what you would need to create exactly what I did, but you could probably get by with just the following.&lt;/p&gt;
&lt;p&gt;Free Option&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 4S or above (I actually use this for all my tutorial videos and the results are great.)&lt;/li&gt;
&lt;li&gt;iMovie (I think the cutting would have been slower but all possible)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lessons-learned-and-final-thoughts&#34;&gt;Lessons learned and final thoughts.
&lt;/h2&gt;&lt;p&gt;Wow for only my second ever blog post this has turned out way too long.  Congratulations if you actually read this far.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can edit video 2.7K video on a Macbook Air 11&amp;quot; it&amp;rsquo;s just not fun.&lt;/li&gt;
&lt;li&gt;I should have bought the &lt;a class=&#34;link&#34; href=&#34;http://gopro.com/camera-accessories/lcd-touch-bacpac&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LCD Backpac&lt;/a&gt; for the GoPro, at $80 it would have been easily worth it.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t use too many &lt;a class=&#34;link&#34; href=&#34;http://support.apple.com/kb/VI288&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;compound clips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;YouTube has so many free tutorials for Final Cut Pro you can become pretty damn proficient in a very short period of time.&lt;/li&gt;
&lt;li&gt;A good product is easy to make a good looking video for.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is probably the key here.  Despite being a novice with this kind of video I found it really quite easy to make the video &amp;ldquo;cool&amp;rdquo;.  This is because &lt;a class=&#34;link&#34; href=&#34;http://easybeats.net&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EasyBeats 3&lt;/a&gt; is a kick ass ridiculously fun application.  Likewise if your app is great, the video part will be easy.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://plus.google.com/u/0/103754485972196407241/posts/2wEfWc1Gq1b&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Leave me a comment via Google+&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Jekyll and Octopress</title>
        <link>https://blog.hopefullyuseful.com/blog/2013/07/21/jekyll-and-octopress/</link>
        <pubDate>Sun, 21 Jul 2013 00:00:00 +0000</pubDate>
        
        <guid>https://blog.hopefullyuseful.com/blog/2013/07/21/jekyll-and-octopress/</guid>
        <description>&lt;p&gt;So I&amp;rsquo;ve decided I should probably blog about things in my life that other people might find interesting.  I&amp;rsquo;ve decided this mainly because I&amp;rsquo;ve noticed that the longer I live in Japan the worse my English skills become.  It could just be a case of getting older but I find myself often struggling for words or expressions that I&amp;rsquo;m sure used to come to me with ease.  Since my Japanese is not getting proportionally better I should probably do something to stem the tide.  Consider this, my umpteenth attempt at actually blogging that something.&lt;/p&gt;
&lt;p&gt;Anyway I have decided to try out this &lt;a class=&#34;link&#34; href=&#34;http://jekyllrb.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jekyll&lt;/a&gt; &lt;a class=&#34;link&#34; href=&#34;http://daringfireball.net/projects/markdown/basics&#34;  title=&#34;Markdown Documentation&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;markdown&lt;/a&gt; based static blog generator.  I subsequently chose &lt;a class=&#34;link&#34; href=&#34;http://octopress.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Octopress&lt;/a&gt; because it came with a theme and bunch of instructions I actually found comprehensible.&lt;/p&gt;
&lt;p&gt;The reason for using markdown is simple.  I would like to keep any blog posts I actually do make readable as text files on my local computer.  Although I know its syntax and general conventions, I&amp;rsquo;ve not actually used it for anything of note and this seems like a good first project.&lt;/p&gt;
&lt;h2 id=&#34;smoothish-sailing&#34;&gt;Smoothish Sailing
&lt;/h2&gt;&lt;p&gt;Apparently Octopress needs a specific version of Ruby.  1.9.3 and the instructions on the website detailed how to get a program called &lt;a class=&#34;link&#34; href=&#34;https://github.com/sstephenson/rbenv&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;rbenv&lt;/a&gt; to manage multiple versions.  I&amp;rsquo;m completely ignorant to all things ruby so I must admit to being really surprised at this.  Why isn&amp;rsquo;t simply the latest stable version the best choice?&lt;/p&gt;
&lt;p&gt;Anyway after installing rbenv I tried to install the recommended version:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MacPro:~ christian$ rbenv install 1.9.3-p0

ERROR: This package must be compiled with GCC, but ruby-build couldn&amp;#39;t
find a suitable `gcc` executable on your system. Please install GCC
and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode
as of version 4.2. Instead, the `gcc` executable is a symlink to
`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,
versions of Ruby older than 1.9.3-p125 are incompatible with
`llvm-gcc`. To build older versions of Ruby you must have the official
GCC compiler installed on your system.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It then detailed how to download the latest version of GCC but I instead decided just to install what looked like the most recent version of 1.9.3&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MacPro:~ christian$ rbenv install 1.9.3-p327
Downloading yaml-0.1.4.tar.gz...
-&amp;gt; http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/christian/.rbenv/versions/1.9.3-p327
...success ensued
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I thought I was home clear at this point but&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MacPro:Blog christian$ cd octopress/
MacPro:octopress christian$ ruby --version
rbenv: version `1.9.3-p194&amp;#39; is not installed
MacPro:octopress christian$ rbenv install 1.9.3-p194
Downloading yaml-0.1.4.tar.gz...
-&amp;gt; http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/christian/.rbenv/versions/1.9.3-p194
...Success 2.0 ensued
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Apparently the version is &lt;em&gt;very&lt;/em&gt; specific.  I&amp;rsquo;m sure all of this could have been avoided by anyone with a lick of ruby or yaml experience but I am a complete newbie with both.&lt;/p&gt;
&lt;h2 id=&#34;seems-pretty-good&#34;&gt;Seems pretty good.
&lt;/h2&gt;&lt;p&gt;Teething problems aside, I quite like the workflow around this system.  I edit a post inside the source/_posts directory with a name of YYYY-MM-DD-titleofpost.markdown and in a terminal I have simply entered the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MacPro:octopress christian$ rake preview
Starting to watch source with Jekyll and Compass. Starting Rack on port 4000
Configuration from /Users/christian/Dropbox/HUS/Projects/Blog/octopress/_config.yml
[2013-07-21 19:59:20] INFO  WEBrick 1.3.1
[2013-07-21 19:59:20] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin12.4.0]
[2013-07-21 19:59:20] INFO  WEBrick::HTTPServer#start: pid=77031 port=4000
Auto-regenerating enabled: source -&amp;gt; public
[2013-07-21 19:59:20] regeneration: 94 files changed
&amp;gt;&amp;gt;&amp;gt; Compass is watching for changes. Press Ctrl-C to Stop.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anytime I make a change this preview server notices it and regenerates.  I&amp;rsquo;ve got plenty of my own hosting so I&amp;rsquo;ll most likely be following Octopress&amp;rsquo; &lt;a class=&#34;link&#34; href=&#34;http://octopress.org/docs/deploying/rsync/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;rsync deployment&lt;/a&gt; instructions.  If this post is actually online then I guess it worked.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
