<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codethink &#187; banter</title>
	<atom:link href="https://codethink.no-ip.org/posts/banter/feed" rel="self" type="application/rss+xml" />
	<link>https://codethink.no-ip.org</link>
	<description>A blog about coding, life, and other arbitrary topics</description>
	<lastBuildDate>Sun, 15 Mar 2026 21:30:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.29</generator>
	<item>
		<title>It&#8217;s music appreciation day :)</title>
		<link>https://codethink.no-ip.org/archives/1696</link>
		<comments>https://codethink.no-ip.org/archives/1696#comments</comments>
		<pubDate>Sun, 15 Mar 2026 21:30:15 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>

		<guid isPermaLink="false">https://codethink.no-ip.org/?p=1696</guid>
		<description><![CDATA[]]></description>
				<content:encoded><![CDATA[<p><iframe width="640" height="360" src="https://www.youtube.com/embed/g13lxyvguDw?list=RDg13lxyvguDw" title="Soen - Antagonist (Official Audio)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1696/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>And we&#8217;re back&#8230;</title>
		<link>https://codethink.no-ip.org/archives/1690</link>
		<comments>https://codethink.no-ip.org/archives/1690#comments</comments>
		<pubDate>Sat, 03 Jul 2021 05:10:24 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[operating systems]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=1690</guid>
		<description><![CDATA[Some things I&#8217;ve learned recently-ish, over the past couple years or so: Don&#8217;t assume that SSD&#8217;s won&#8217;t/can&#8217;t fail. When buying an SSD, check what controller it uses and then get on Google to see how many data recovery providers claim &#8230; <a href="https://codethink.no-ip.org/archives/1690">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Some things I&#8217;ve learned recently-ish, over the past couple years or so:</p>
<ol>
<li>Don&#8217;t assume that SSD&#8217;s won&#8217;t/can&#8217;t fail.</li>
<li>When buying an SSD, check what controller it uses and then get on Google to see how many data recovery providers claim to support that controller; if you find one or less, buy something else.</li>
<li>Or even better, RAID and/or back up SSD&#8217;s just like you would HDD&#8217;s.</li>
<li>In the event of failure, an idle, unpowered SSD can retain its contents for a year or so at least with no degradation (YMMV/don&#8217;t test this on any data you care about!).</li>
<li>People will eventually figure out how to recover your data, if you give them enough money.</li>
<li>Making a filesystem dump of an old Windows install bootable again is probably easier now than it&#8217;s ever been.</li>
<li>Making an old Windows install (or installer) work with USB3.x and NVMe is nigh impossible.</li>
<li>With enough old hardware, several rounds of &#8220;musical SSD&#8221;, Windows 10 installation media, and sufficient masochism, it can be done.</li>
<li>Manually bootstrapping a GPT partition is also possible.</li>
<li>Not everyone is courteous enough to warn you when they suggest running commands that will immediately and irreversibly remove all partitions from a disk.</li>
<li>Windows no longer seems to care how many times you swap your install between completely different computers.</li>
<li>When USPS says &#8220;7-10 business days&#8221; what they really mean is &#8220;3-4 weeks, if you&#8217;re lucky&#8221;.</li>
</ol>
<p>Anyhow, major props to ACE Data Recovery for figuring out how to restore data from dead Sandforce drives.  And also to Recovery Force, for pointing me in their direction.</p>
<p>Normally scheduled programming of &#8220;mostly nothing much&#8221; should be resuming shortly.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1690/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On the 2016 Election</title>
		<link>https://codethink.no-ip.org/archives/1554</link>
		<comments>https://codethink.no-ip.org/archives/1554#comments</comments>
		<pubDate>Sat, 12 Nov 2016 14:18:46 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[politics]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=1554</guid>
		<description><![CDATA[What can I say that hasn&#8217;t been said already? So I&#8217;ll just encourage anyone who&#8217;s opposed to the idea of a Donald Trump presidency to join the millions that have already signed this petition: www.change.org/p/electoral-college-electors-electoral-college-make-hillary-clinton-president-on-december-19 It may have only a &#8230; <a href="https://codethink.no-ip.org/archives/1554">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2016/11/tyrant.png" rel="lightbox[1554]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2016/11/tyrant.png" alt="tyrant" width="798" height="724" class="aligncenter size-full wp-image-1555" /></a></p>
<p>What can I say that hasn&#8217;t been said already?  So I&#8217;ll just encourage anyone who&#8217;s opposed to the idea of a Donald Trump presidency to join the millions that have already signed this petition:</p>
<ul>
<li><a href="https://www.change.org/p/electoral-college-electors-electoral-college-make-hillary-clinton-president-on-december-19" target="_blank">www.change.org/p/electoral-college-electors-electoral-college-make-hillary-clinton-president-on-december-19</a></li>
</ul>
<p>It may have only a snowball&#8217;s chance in hell of actually accomplishing anything, but at least it lets you add your voice to the thunderous chorus of opposition.  And not because Hillary won the popular vote.  Or because Trump is a racist, a sexist, a self-confessed serial abuser of women, and an all-around abhorrent example of a human being.  Those are valid issues, but they&#8217;re not what&#8217;s important here.</p>
<p>What&#8217;s important is that Donald Trump openly campaigned on a platform that falls somewhere in between tyranny and full-blown fascism, with campaign promises that have included (among other things):</p>
<ul>
<li>Jailing political opponents</li>
<li>Removing legal protections for free speech and the free press, so that journalists can be sued, silenced, and suppressed</li>
<li>Banning a religion</li>
<li>Racial profiling and subjecting minorities to police search/frisking without probable cause</li>
<li>Forcibly deporting millions of people, many of whom have been living peacefully in the U.S. for years</li>
<li>Torturing suspected terrorists</li>
<li>Murdering civilians (including women and children) when they have ties to suspected terrorists</li>
</ul>
<p>And a government that tramples over peoples&#8217; inalienable rights like that is exactly the sort of thing that the founding fathers sought to prevent.  </p>
<p>The ideals of the founding fathers were freedom, tolerance, and equal rights and protection for all.  Their single greatest fear was institutional tyranny.  They established the electoral college as a guard against that possibility.   Or, as James Madison put it in the Federalist Papers, to stop &#8220;a number of citizens whether amounting to a majority or minority of the whole, who are united and actuated by some common impulse of passion, or of interest, adverse to the rights of other citizens, or to the permanent and aggregate interests of the community&#8221; from taking over the government.  Sounds a lot like what&#8217;s going on with Trump, doesn&#8217;t it?</p>
<p>It would be proper for the electoral college to block a Donald Trump presidency.  Trump clearly and unequivocally promised to rule as a tyrant if he was elected.  The policies he campaigned on and promised to deliver are &#8220;adverse to the rights of other citizens&#8221; and against the &#8220;permanent and aggregate interests of the community&#8221;.  So yes, sign the petition and see what happens.</p>
<p>And in the meantime: denounce, rebuke and repudiate.  Protest (peacefully!).  Speak out against racism, intolerance, and baseless fears.  Defend those least able to defend themselves.  Oppose tyranny in all of its forms.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1554/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cleaning Out My Closet &#8211; My Last Days at iApps</title>
		<link>https://codethink.no-ip.org/archives/1176</link>
		<comments>https://codethink.no-ip.org/archives/1176#comments</comments>
		<pubDate>Fri, 19 Dec 2014 07:29:58 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[fair-work]]></category>
		<category><![CDATA[iapps]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=1176</guid>
		<description><![CDATA[Introduction For anyone stumbling across this, I was employed as a senior-level Software Architect at iApps Pty Ltd from November 2010 to October 2013. By the time I left, I had climbed to &#8216;Chief Architect&#8216; status. And it&#8217;s time for &#8230; <a href="https://codethink.no-ip.org/archives/1176">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h3><b>Introduction</b></h3>
<p>For anyone stumbling across this, I was employed as a senior-level Software Architect at <a href="http://www.iapps.net.au/" target="_blank">iApps Pty Ltd</a> from November 2010 to October 2013.  By the time I left, I had climbed to &#8216;<a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iApps_chief_architect_letter_and_description.pdf" target="_blank">Chief Architect</a>&#8216; status.  And it&#8217;s time for the truth surrounding my departure from this company to be heard.</p>
<p>Let it be known that all of the information presented here is factual, and that I can prove every single statement made.  Further let it be known that I am providing this information not with malicious intent, but to protect my own reputation and to clear up any inaccurate or incomplete tellings of this story that may have been circulated.  If my reputation is to be tarnished, then let it be tarnished by nothing but truth.</p>
<p>And to my former employer, I say the following:  Everything on this page is true, and you know it.  If you genuinely feel otherwise, by all means feel free to skip the threatening letters and head straight to the courts to commence proceedings against me for defamation.  But remember, <a href="http://www.austlii.edu.au/au/legis/qld/consol_act/da200599/s25.html" target="_blank">it&#8217;s not defamation if it&#8217;s true</a>.  It&#8217;s not even defamation if it&#8217;s <i><a href="http://www.austlii.edu.au/au/legis/qld/consol_act/da200599/s26.html" target="_blank">mostly true</a></i>.  Also remember that I&#8217;m still standing strong, unscathed, on the side of truth, transparency, and fairness.  These are <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/TheFettered" target="_blank">my principles</a>; I will fight to defend them.  All things considered, I think you&#8217;d be best off publicly acknowledging your past mistakes, expressing contrition for them, and taking your lumps.  There&#8217;s a comments section below you may use for this purpose if you&#8217;re so inclined.  But that&#8217;s entirely your decision. </p>
<h3><b>The facts of the matter</b></h3>
<p>This will be a bit dry and boring.  As noted, I am simply stating the documented, provable facts of the situation; not providing a narrative.  I invite you to color in your own narrative to go along with the facts as you read.  Anyways:</p>
<style>
.spaceList li{
    padding-bottom: 10px;
}
</style>
<blockquote><ol class="spaceList">
<li>On or around 22 November 2010 I commenced employment at iApps Pty Ltd as a senior-level IT professional.</li>
<li>The <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/MA000065.pdf" target="_blank">Professional Employees Award</a> specifies the minimum terms of my employment with iApps Pty Ltd, although I was unaware of this at the time (having just migrated to Australia in September 2010, and not possessing any familiarity with the local employment laws).</li>
<li>The salary I was offered was substantially below the minimum wage for my position.  Again I did not discover this until much later.  At the time, I knew the offer was low, but not below-minimum-wage low.</li>
<li>I was told on multiple occasions, both before and after commencing employment with iApps Pty Ltd, that I would receive shareholding in the company.  This enticement was a critical factor in my decision to accept iApps Pty Ltd&#8217;s offer of employment, and is commonplace when dealing with startup companies.  Startups usually provide early or important employees with generous amounts of equity to compensate for the difference between an employee&#8217;s salary and their <a href="http://www.glassdoor.com.au/Salaries/australia-it-architect-salary-SRCH_IL.0,9_IN16_KO10,22.htm" target="_blank">market rate</a>.</li>
<li>No written document regarding my shareholding in iApps Pty Ltd was ever presented to me, nor were any specific details (allocation, vesting, cliff, etc.) ever clarified.  Though I did ask for these things.  Repeatedly.</li>
<li>Over the course of my employment, iApps Pty Ltd often expected myself and other employees to put in uncompensated overtime.</li>
<li>Although both the Professional Employees Award and the iApps employment contract required annual (or more frequent) reviews, no such reviews took place.  One manager did attempt employee reviews, but her efforts were disregarded by higher-level management.  This becomes relevant later on, around point #30.</li>
<li>On 4 October 2013 management issued a directive requiring all employees to take 12 annual leave days to cover a shutdown from 16/12/2013 to 3/1/2014 (inclusive); the directive required anyone with less than 12 days accrued to take the time as unpaid leave.  For me, this was essentially the last straw.</li>
<li>I started researching Australian employment law and discovered that Fair Work guidelines don&#8217;t allow mandatory unpaid leave unless expressly permitted by an award contract.  I notified iApps Pty Ltd, and the directive was modified.</li>
<li>I continued my research to determine what an &#8220;award contract&#8221; is, and <b>finally</b> discovered the <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/MA000065.pdf" target="_blank">Professional Employees Award</a> and determined that it applied to me.  I was shocked, and then appalled, to say the least.</li>
<li>From the Professional Employees Award I worked out that I had been underpaid since commencing my employment with iApps, and not by any small amount.</li>
<li>On 15 October 2013 I informed iApps management of the underpayment, and included a claim for repayment of the underpaid wages.</li>
<li>Also on the same day, I informed other similarly-classed employees of the Professional Employees Award so that they could check their own records.  I requested that they temporarily refrain from submitting their own claims so that I could take the worst of the fallout from management.  However, another employee had also been significantly underpaid and chose to submit his own claim.</li>
<li>On 16 October 2013, I was called into a meeting with iApps management.  I requested the presence of the other employee who had submitted a claim.  That request was denied, and I attended the meeting, in a small room, behind a closed door, with myself and three iApps managers.  The other employee was eventually brought into the meeting, after a couple of hours.</li>
<li>iApps management professed a general unfamiliarity with the Professional Employees Award and Fair Work policies.</li>
<li>In relation to the above; the employment contract I signed in 2010 makes reference to &#8220;the Fair Work Act 2009&#8243; and an &#8220;associated Modern Award&#8221;.  It does not specifically identify the Professional Employees Award.</li>
<li>In relation to the above; the employment contract I signed in 2010 included a section titled &#8220;Schedule 2 &#8211; Fair Work Australia Information Statement&#8221;.  The entire content of this section is &#8220;See attachment.&#8221;.  I do not recall if any such attachment was provided to me.</li>
<li>In relation to the above; on 13 December 2012, a prospective employee sent to iApps management an e-mail that included the Professional Employees Award as an attachment, and a detailed discussion of its relevance.  The initial offer from iApps to this employee included a salary component that was significantly below the minimum award rate.  This prospect was hired and was paid the required wage.</li>
<li>iApps management attempted to convince me that I had violated company confidentiality policies by informing other employees of the Professional Employees Award (note that the award <b>requires</b> that copies of the award be made available to employees) and engaging in discussions about compensation.</li>
<li>Ultimately, both myself and the other employee were given the same ultimatum; we could 1) retract our claims, or 2) agree that we would accept equity in the company (the same equity that had already been promised to us by iApps, and still not delivered or even properly specified) in lieu of the wages claimed; and in either case continuing to work for below the legal minimum wage.  If we did not agree to either of those options, management stated that they would immediately liquidate the company and that we would receive nothing.  We were given until the next morning to decide.</li>
<li>I took the subsequent day off to seek legal advice, conduct further research, and evaluate my options.  The other employee involved did the same.</li>
<li>I returned to the office on 18 October 2013, and was directed to attend another meeting with the same three iApps managers.  I requested the presence of the other impacted employee, but the request was again denied.  I was threatened with summary dismissal if I did not attend without him.  I attended the meeting.</li>
<li>iApps management did not discuss the ultimatum that had been issued or ask if I accepted (though I would not have).  Instead I was declared redundant on 18 October 2013 and asked to work out my notice period.</li>
<li>In relation to the above; while in the process of declaring me redundant iApps management stated that there was &#8220;no redundancy&#8221; for the skillset I possessed.</li>
<li>In relation to the above; on 16 October 2013 iApps management had also stated that there was &#8220;no redundancy&#8221; for myself or my skillset.</li>
<li>In relation to the above; iApps was actively advertising for candidates with a similar skillset at the time, and did continue advertising and performing interviews after my departure.</li>
<li>As part of my redundancy, I was asked to accept an offer to repay an unspecified amount of underpaid wages in small monthly installments.  iApps claimed it would need &#8220;weeks&#8221; to determine the actual amount owed.  I did not accept this offer, and we continued discussing terms.</li>
<li>In relation to the above; I had an HR professional review the facts surrounding my employment and compose a spreadsheet detailing the underpayments, the total amount underpaid, and how that amount was calculated.  I provided this spreadsheet to iApps to speed the process along.  iApps did not use it.</li>
<li>iApps management asserted that in seeking to recover the underpaid wages I was &#8220;cashing out&#8221; the shareholding that had been promised to me, and that I would therefore not receive any shares.  I did not accept this assertion.</li>
<li>iApps management asserted that my position in the company was that of &#8220;Software Developer&#8221; and not &#8220;Chief Architect&#8221;.  I did not accept this assertion, took it as a personal affront, and demanded <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/Apology.pdf" target="_blank">an apology</a>.</li>
<li>Although I continued working at iApps Pty Ltd for two weeks after alerting them of my underpayment, the wages I received on 25 October 2013 (and the entitlements paid out thereafter) showed that no adjustments had been made to raise my salary.
<li>Due to the above issues and other assertions that caused me to believe that iApps was not negotiating in good faith, on 29 October 2013 I informed iApps that I found their latest offer unacceptable, that I considered their actions a fundamental breach of my employment contract and held the agreement &#8220;null and void&#8221; (though probably &#8220;repudiated and terminated&#8221; is the correct parlance), and that I would bring the matter before Fair Work Australia.  I then walked out of that office, and never returned.</li>
<li>I proceeded shortly thereafter to initiate proceedings with the Fair Work Commission, citing the circumstances surrounding my redundancy, the manner in which iApps management had handled our dispute, multiple violations of the terms of the Professional Employees Award (minimum wage and uncompensated overtime, among others), and the nonexistent shareholding.</li>
<li>As part of the above proceedings, I expressed concern that two other iApps Pty Ltd employees (other than the employee who had also submitted his own claim) might also be underpaid.  Both were eventually dismissed, one within hours of when I raised my concerns.</li>
<li>On 5 November 2013, I received a nice letter (<a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_001.jpg" target="_blank" rel="lightbox[1176]">page 1</a>, <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_002.jpg" target="_blank" rel="lightbox[1176]">page 2</a>, <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_003.jpg" target="_blank" rel="lightbox[1176]">page 3</a>) from iApps Pty Ltd alleging some $200,000 in damages for claims that were primarily inaccurate or overstated.  My response was essentially &#8220;Bring it&#8221;, but in far more words than that.  iApps did not bring it.</li>
<li>We went before the Fair Work Commission:<br />
&nbsp;<br />
<a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/1410796_568482270911_1543733540_o.jpg" rel="lightbox[1176]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/1410796_568482270911_1543733540_o-943x1024.jpg" alt="1410796_568482270911_1543733540_o" width="640" height="694" class="aligncenter size-large wp-image-1278" /></a></p>
<p>And we <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/Roth_v_iApps_settlement_signed.pdf" target="_blank">came to terms</a> (Addendum 1:  <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/disputed_software.png" title="Covered Software" target="_blank" rel="lightbox[1176]">Covered Software</a>).  Terms that iApps Pty Ltd would ultimately breach.</li>
<li>iApps Pty Ltd failed to pay the final installment that was due on 30 November 2014.</li>
<li>On 4 December 2014 I advised iApps that I had not received payment (and received no reply).</li>
<li>On 5 December 2014, I again advised iApps that I had not received payment (and received no reply).</li>
<li>iApps Pty Ltd failed to remedy their non-payment within the 7 days allowed by our settlement terms.</li>
<li>On 11 December 2014 I notified iApps Pty Ltd that I acknowledged their repudiation of the deed of settlement, was executing my <a href="http://www.claytonutz.com/publications/newsletters/litigation_and_dispute_resolution_insights/20090709/its_over_when_and_how_can_you_terminate_a_contract.page" target="_blank">Common Law right to terminate</a> the agreement, and holding any ongoing obligations that it may have placed upon me as at an end.</li>
<li>In relation to the above;  on 11 December 2014 I did not refer to the previous attempts at providing notice.  However, I shortly received a response from iApps management insisting that they had had e-mail problems and that this was the first message they had received from me on the subject, and chastising me for not calling them instead.  I maintained my termination of the settlement.</li>
<li>In relation to the above; on 29 October 2013 I had advised iApps management that I would only communicate with them in writing, by e-mail.  At no point did I retract or modify this.</li>
<li>In our subsequent discussions on the matter, iApps agreed to undertake repayment of the amount outstanding, owed as damages stemming from their repudiation of the settlement and its termination, and did submit payment.</li>
<li>I do not personally seek anything further from iApps Pty Ltd, other than perhaps a public acknowledgement of the above facts, an equally public apology for them, and a public retraction of any disparaging remarks made about me or my colleagues to my current employer or to anybody else in 2013 or at any time thereafter.</li>
<li>Australia has very awesome workplace laws, entitlements, and protections.  And unfortunately it does need to have those things thanks to employers who think they can do the wrong thing and get away with it.  That&#8217;s not a fact but my honest opinion, stated on a matter of public policy/interest.  Workplace protections are important.  The Fair Work Act 2009 and the various Award contracts are good things, and should never be undermined.</li>
</ol>
</blockquote>
<h3><b>Response</b></h3>
<p>Now, to respond to the allegations leveled against me in that letter (<a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_001.jpg" target="_blank" rel="lightbox[1176]">page 1</a>, <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_002.jpg" target="_blank" rel="lightbox[1176]">page 2</a>, <a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/iapps_letter_003.jpg" target="_blank" rel="lightbox[1176]">page 3</a>) I received.  I was held harmless for anything and everything alleged in there, but still.  Let&#8217;s finish setting the record straight.</p>
<p>Yes, I did seek (and attain) employment with a former client of the company.  This occurred after iApps delivered its ultimatum, making it abundantly clear that iApps either could not or would not honor the minimum terms of my employment contract.  Why should I then show any further consideration towards an agreement that the other side was clearly unwilling or unable to uphold?  Because they got me to sign a piece of paper using promises of a shareholding that was never delivered?  Both of those questions are rhetorical.  </p>
<p>Yes, I did walk out on the 29th of October, 2013.  As clause 13.3 of the Professional Employees Award gives me every right to do when declared redundant.  And which I likely was entitled to do regardless, as iApps wasn&#8217;t meeting the terms of my employment contract and had demonstrated a clear and persistent unwillingness to do so.  The 29th is also my wedding anniversary, so now I have two things to celebrate on that day.</p>
<p>I did contact IBM/Avnet, but only to inform that them I was no longer employed at iApps and to request that they remove the association with iApps Pty Ltd from my personal profile in their system.  If iApps&#8217;s reputation was damaged by the fact that I didn&#8217;t work there anymore&#8230;then maybe they shouldn&#8217;t have tried so hard to drive me away.</p>
<p>And I did erase my <i>personal</i> information from my workstation.  Think things like Internet cookies/persistent logins, stored passwords to e-mail accounts and websites, chat logs, locally cached e-mails, browser history, and the like.  All things that are of no value to my former employer, and all things that they have no business using before or after my departure.  All of the actual work I did was checked in to SVN, and I did nothing to harm it.  My conduct was professional, up until the very end.</p>
<p>However, I did leave behind a nice custom wallpaper, and configure the machine to play some <a href="https://www.youtube.com/watch?v=n8dFlaIcX80#t=104" target="_blank">awesome music</a> at login.  And to run a script that would set the playback volume to an enjoyable level while simultaneously disabling the system volume controls.  It was all good clean fun, caused no harm to the computer, and would take any halfway experienced system admin no more than a couple of minutes to disable.  I understand it caused a welcome distraction:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/14173_566873130641_1818653677_n.jpg" rel="lightbox[1176]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/12/14173_566873130641_1818653677_n.jpg" alt="14173_566873130641_1818653677_n" width="720" height="960" class="aligncenter size-full wp-image-1242" /></a></p>
<p>Anyways, back on topic.</p>
<p>No, I did not make &#8220;spurious&#8221; statements and allegations about iApps to damage their reputation or business.  I said nothing untrue, and only discussed my situation in the context of seeking advice and evidence, protecting myself and my colleague(s) from the aggressive and intimidating tactics being used against us, and asserting my rights under Australian law.  And besides, wanting to have a good reputation doesn&#8217;t mean you can do shady things and then assert that nobody can talk about them because they&#8217;re shady and will make you look bad.  That&#8217;s absurd.</p>
<p>And $200,000 in damages?  Fat chance.  Though after three years on an iApps-level salary, that&#8217;s probably about how much income <i>I</i> missed out on while I was foolishly waiting around for them to make good on their promises of shareholding in the company.  I ran my finances backwards waiting on iApps, and when I&#8217;d finally had as much as I could stand and demanded nothing more than what I had been promised and was legally entitled to, all they did was try to throw me under the bus. </p>
<h3><b>Consequences</b></h3>
<p>A number of things fall away as a natural consequence of iApps&#8217;s repudiation of our settlement and its subsequent termination by my choice (or to use the legal parlance, by my acceptance of their repudiation).  Most important among these various things being terms clause 6, which shrouded all of the above events in secrecy, and terms clause 5, which was so broadly constructed that it made it nearly impossible for me to say anything at all about iApps Pty Ltd, ever.</p>
<p>The value of free speech and the right to free expression should never be discounted lightly.  Free speech is important.  Free speech is what keeps the tyrants in this world at bay.  Without it, we are lost.</p>
<p>I miscalculated gravely when I signed away my right to speak freely.  And it feels ever so good to have it back.  </p>
<p><img src="https://codethink.no-ip.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<h3><b>Acknowledgements</b></h3>
<p>To those current and former iApps staff members who assisted me in gathering evidence and building my case, I thank you.  </p>
<p>You helped me stand up to an adversary intent on ruining me, and an adversary who likely did their level best to bully and intimidate you as well; your support is appreciated and shall not be forgotten.</p>
<h3><b>In closing</b></h3>
<p>Now I don&#8217;t usually go for rap, but considering the circumstances I feel this is unavoidably obligatory.  Set the volume on your speakers to &#8216;righteous&#8217;, and enjoy:</p>
<p><iframe width="600" height="400" src="//www.youtube.com/embed/L-RZs8FCZVw" frameborder="0" allowfullscreen></iframe><br />
<center><i>What hurts me the most is you won&#8217;t admit you [were] wrong.</i></center></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1176/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ultimaker 2 Tips an Tricks</title>
		<link>https://codethink.no-ip.org/archives/1138</link>
		<comments>https://codethink.no-ip.org/archives/1138#comments</comments>
		<pubDate>Sat, 20 Sep 2014 06:56:29 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[3d-printing]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[ultimaker]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=1138</guid>
		<description><![CDATA[3d printing is a delicate affair. It relies upon very precisely controlling at least a dozen different variables. When everything is in perfect balance, awesome things can happen: But allow even one parameter to drift too far out of line, &#8230; <a href="https://codethink.no-ip.org/archives/1138">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>3d printing is a delicate affair.  It relies upon very precisely controlling at least a dozen different variables.  When everything is in perfect balance, awesome things can happen:</p>

<a href='https://codethink.no-ip.org/archives/1138/dsc00615_crop'><img width="179" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00615_crop-179x200.jpg" class="attachment-thumbnail" alt="DSC00615_crop" /></a>
<a href='https://codethink.no-ip.org/archives/1138/dsc00660_crop'><img width="200" height="161" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00660_crop-200x161.jpg" class="attachment-thumbnail" alt="DSC00660_crop" /></a>
<a href='https://codethink.no-ip.org/archives/1138/dsc00554_crop'><img width="200" height="198" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00554_crop-200x198.jpg" class="attachment-thumbnail" alt="DSC00554_crop" /></a>
<a href='https://codethink.no-ip.org/archives/1138/dsc00625_crop'><img width="200" height="128" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00625_crop-200x128.jpg" class="attachment-thumbnail" alt="DSC00625_crop" /></a>

<p>But allow even one parameter to drift too far out of line, and all you&#8217;re likely to end up with is a tangled mess of plastic:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00567_crop.jpg" rel="lightbox[1138]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/DSC00567_crop.jpg" alt="" title="DSC00567_crop" class="aligncenter size-full wp-image-1142" /></a></p>
<p>Here are a few things that I&#8217;ve found can help at avoiding the tangled mess of plastic:</p>
<p><b>Glue &#8211; Use it sparingly, if at all</b></p>
<p>The Ultimaker manual recommends applying a thin layer of glue to the buildplate before starting a print.  And yes, glue can help your print stick to the buildplate better, and it can be used to compensate for minor buildplate leveling issues that can&#8217;t be corrected in any other way.  </p>
<p>The problem with glue is that it seems to accelerate the rate at which residue accumulates inside of the Ultimaker&#8217;s nozzle, leading to more frequent clogs and extrusion issues.  It can also cause parts to stick <i>too well</i>, making removal a pain.  In most cases, glue is completely unnecessary:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/adhesion_test.jpg" rel="lightbox[1138]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/09/adhesion_test-1200x675.jpg" alt="" title="adhesion_test" width="640" height="360" class="aligncenter size-large wp-image-1144" /></a></p>
<p>That part was printed directly onto the glass buildplate, and despite the very small contact area it stuck to the buildplate for the duration of the print.  If you&#8217;ve leveled your buildplate properly, you should have no problems printing small and medium-sized parts directly on the glass.</p>
<p>For larger prints that make contact with large swaths of the buildplate, a small amount of glue can be useful in dealing with any minor adhesion issues that you encounter.  I recommend printing the first few layers, then checking to see if there are any spots where the filament has come unstuck from the buildplate, and canceling the print, applying a small amount of glue just to the problem areas, and then restarting (or if you check and find no problem areas, just let the print run with no glue at all!).  </p>
<p>If you see a large number of problem areas when starting a larger print, it&#8217;s better to relevel your buildplate than it is to try and solve the problem by covering the entire thing in glue.  </p>
<p><b>Buildplate Leveling &#8211; The third screw</b></p>
<p>When leveling the buildplate, the wizard will point out the two front screws that you can turn to fine-tune your level.  What it won&#8217;t tell you is that there&#8217;s actually a third screw you can adjust, as well.  This screw is located <i>underneath</i> the build plate and towards the back (and in the center).  </p>
<p>This screw adjusts the rear-center height, and can be very useful if you&#8217;ve just reassembled your printhead and now find that you can&#8217;t level things properly because one notch of height adjustment (through the printer&#8217;s wizard interface) moves from &#8216;a bit too low&#8217; to &#8216;a bit too high&#8217;.  By turning the third screw, you can dial in the middle ground between &#8216;a bit too low&#8217; and &#8216;a bit too high&#8217; and get your buildplate leveled correctly.</p>
<p>Oh, and since it&#8217;s not immediately obvious what affect adjusting the screws has, <b>tightening</b> a buildplate screw will <b>lower</b> the glass plate and <b>increase</b> the distance between the nozzle and the glass.  Loosening will have the opposite effect.</p>
<p><b>Buildplate Leveling &#8211; The wizard only works once</b></p>
<p>The wizard that walks you through the buildplate leveling process is helpful; <i>but only until your first successful leveling attempt</i>.  The problem is that the wizard will tell you to adjust the buildplate screws in order to level it out.  But if you&#8217;ve already done this (and confirmed the result) then <i>your buildplate is level and playing with the screws will only make it worse!</i>  </p>
<p>Once you&#8217;ve successfully leveled your buildplate the first time, it&#8217;s not going to drift out of level and the only thing you should ever need to adjust again is its offset height relative to the printhead.  That&#8217;s the first and the fourth step in the leveling wizard and something you&#8217;ll want to do if/when you disassemble and reassemble your printhead, as the nozzle height is likely to change slightly when you do so.  </p>
<p>So if your buildplate is already level, and you need to adjust the height using the leveling wizard, the only thing you want to worry about is step 1 (or step 4).  The other steps you should just click through without touching anything.  If you find you need to adjust the third screw in order to dial in the correct height, you should also adjust the other two screws by <i>exactly the same amount</i> to ensure that everything stays nice and level.  </p>
<p>And in terms of getting to your first successful level, the wizard&#8217;s suggestion of using a piece of paper will get you pretty close.  But the best way I&#8217;ve found to fine-tune things further is to start printing a <a href="https://www.youmagine.com/designs/25-item-display-case" target="_blank">large object</a> and adjust the buildplate screws as the first layer is printing.  </p>
<p>If you notice that the first layer seems too thin in some areas, then you&#8217;ll want to <b>tighten</b> the nearest buildplate screw to lower the glass a bit.  And if you notice that parts of the first layer are too thick and/or not sticking to the buildplate, then you should <b>loosen</b> the nearest buildplate screw to raise the glass in that area.</p>
<p><b>The Nozzle &#8211; Clean it often</b></p>
<p>When printing residue can build up in the nozzle, resulting in underextrusion and clogs if left unchecked.  And residue buildup can be difficult or impossible to actually see, as even if the nozzle itself seems clear there can still be enough residue stuck around the sides to cause problems with a print.  This can complicate troubleshooting, as a number of other issues can cause the same sort of problems with a print making it all too easy to blame a different component for a problem that&#8217;s actually being caused by a dirty nozzle.</p>
<p>So it&#8217;s best to take a few minutes to clean out the nozzle every once in awhile.  For instance, when changing filaments or whenever else you decide to remove the filament from the printer.  The best way to clean the nozzle is to follow the steps described in the following PDF document:</p>
<p><a href="https://www.ultimaker.com/spree/uploads/113/original/Ultimaker_2_Atomic_Method.pdf" target="_blank">https://www.ultimaker.com/spree/uploads/113/original/Ultimaker_2_Atomic_Method.pdf</a></p>
<p>Once you&#8217;ve gotten used to it, it should only take a few minutes to step through the cleaning process, and you&#8217;ll have ruled out a common but hard-to-spot cause of printing issues.</p>
<p><b>Hardware &#8211; The stock parts are good enough&#8230;</b></p>
<p>&#8230;good enough for printing better parts for your Ultimaker.</p>
<p>Seriously, there&#8217;s nothing wrong with the Ultimaker 2&#8217;s stock parts, but other people have been designing and sharing alternative versions that work better in most cases.  For example, I&#8217;m currently using:</p>
<ul>
<li>Venkel&#8217;s <a href="https://www.youmagine.com/designs/ultimaker-2-fan-mount-dual--2" target="_blank">fan mount</a></li>
<li>IRobertI&#8217;s <a href="https://www.youmagine.com/designs/alternative-um2-feeder-version-two" target="_blank">feeder system</a></li>
<li>My own <a href="https://www.youmagine.com/designs/um2-quick-swap-filament-mount" target="_blank">filament mount</a></li>
</ul>
<p>With that setup, I get better prints, easier maintenance/troubleshooting, and more flexibility than what&#8217;s offered by the Ultimaker 2&#8217;s stock hardware.  If you get a printer like the Ultimaker 2, one of the first things to do with it is print out some better replacement parts for it.</p>
<p>And whenever printing replacement parts out of plastic, always keep a second copy on hand in case the first one breaks, or has a run-in with the hot nozzle and melts, or whatever.  Having a spare always available is worth the few hours that it takes to print.</p>
<p><b>Tuning &#8211; Extrusion rate isn&#8217;t everything</b></p>
<p>There&#8217;s a <a href="http://umforum.ultimaker.com/index.php?/topic/4586-can-your-um2-printer-achieve-10mm3s-test-it-here/" target="_blank">test print you can do</a> to measure your printer&#8217;s extrusion rate.  Despite much of the discussion surrounding the subject, however, there&#8217;s a lots more to getting a good print than optimizing the extrusion rate.  </p>
<p>With the right parts, it&#8217;s actually fairly easy to get a successful extrusion-rate test.  You can just dial down the tension on the feeder to the point where it will never skip backwards, and blow through perfect print after perfect print of the extrusion test.  And then try to print an actual object that requires some <a href="http://brazenartifice.wordpress.com/2011/12/30/retraction-huh-what-is-it-good-for/" target="_blank">retraction</a>, and watch how fast your printer sands down the filament and jams.</p>
<p>What I&#8217;ve found is that better results can be achieved by tuning the printer to the speed you&#8217;ll actually be printing at.  The extrusion test goes up to 10mm<sup>3</sup>/sec, but unless you&#8217;re printing very low-quality, high-speed parts then you&#8217;re not going to come close to that extrusion rate in practice.  I personally never print above about 5-6mm<sup>3</sup>/sec, and find that I get the best results by increasing the feeder tension until the extrusion test fails around the 7-8mm<sup>3</sup>/sec mark.  </p>
<p>That gives adequate extrusion for my prints, and also helps to ensure that the filament doesn&#8217;t just get sanded down to nothing on prints that make heavy use of retraction.  It pays to work out what extrusion rate you actually need, and then tune your printer to that amount instead of just trying to tune for the highest possible extrusion rate.  A successful 3d print requires more than just extruding plastic as fast as possible.</p>
<p><b>Printing &#8211; Use your ears</b></p>
<p>The Ultimaker 2 is a very quiet printer when everything is working well.  And when it&#8217;s not working well, you can usually hear it.</p>
<p>The most common issue is underextrusion during a print, which can usually be heard in the form of loud and distinct ticking sounds from the feeder.  An occasional tick isn&#8217;t usually a problem, but if you&#8217;re getting multiple loud ticks in a row it&#8217;s time to intervene if you want you print to succeed.  </p>
<p>If you&#8217;re fortunate, the cause of the issue will be something simple, like a snag on your filament spool.  Usually unspooling a bit of filament to get past the snag will solve this issue.  If the ticking has gone on for awhile, however, you may find that you filament has been ground down/deformed a bit (especially if your feeder is tuned too aggressively).  </p>
<p>If the deformation isn&#8217;t too severe, you may be able to clear the issue by gently pushing the filament through the feeder until the deformed bit is past the feeder wheel (and blowing/brushing off any filament dust that&#8217;s accumulated within the feeder).  If you&#8217;re unable to do that, then you&#8217;ll likely have to cancel and restart the print.  </p>
<p>In any case, if you&#8217;re attentive to the sounds your printer is making, you can generally catch underextrusion issues early enough to fix the problem and rescue the print.</p>
<p><b>Maintenance &#8211; User serviceable parts inside</b></p>
<p>The Ultimaker 2 is entirely open-source, and designed so that the end-user can repair, maintain, and modify it easily.  Don&#8217;t be afraid to take it apart, modify it, and put it back together.  As complicated as it can be to get all the variables lined up for a successful print, the machine itself is quite robust.  You can&#8217;t really break it unless you try.  </p>
<p>Which is good, because otherwise I&#8217;d probably have broken mine a few times over by now.  </p>
<p>And yes, you can drag the printhead around to get better access at the parts on it.  Just make sure you turn the printer off first!  It will stay where you left it when you turn the printer back on.</p>
<p>Should all else fail, there&#8217;s also a very supportive <a href="http://umforum.ultimaker.com/" target="_blank">user community</a> that will help you sort out any issues you come across.  Just pop in with a picture or two, and wait for the free advice to start rolling in.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1138/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ultimaker 2 &#8211; First week and initial impressions</title>
		<link>https://codethink.no-ip.org/archives/1115</link>
		<comments>https://codethink.no-ip.org/archives/1115#comments</comments>
		<pubDate>Fri, 08 Aug 2014 08:01:34 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[3d-printing]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=1115</guid>
		<description><![CDATA[Long story short, I decided it was time to pick up a 3d printer. I&#8217;m not normally one to jump on the bandwagon or become an early adopter for the sake of being an early adopter, but I&#8217;ve heard enough &#8230; <a href="https://codethink.no-ip.org/archives/1115">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Long story short, I decided it was time to pick up a 3d printer.  I&#8217;m not normally one to jump on the bandwagon or become an early adopter for the sake of being an early adopter, but I&#8217;ve heard enough on the subject to be convinced that 3d printing is not just another fad.  It&#8217;s legitimately useful, and developed to the point where it&#8217;s not unreasonable to start getting involved.  </p>
<p>So after several days of research I decided that I&#8217;d order an <a href="https://www.ultimaker.com/pages/our-printers/ultimaker-2" target="_blank">Ultimaker 2</a>, straight from the Netherlands.  I very nearly got a <a href="http://formlabs.com/products/form-1-plus/" target="_blank">Form 1+</a> as I think that stereolithography is a vastly superior approach when compared to <a href="http://en.wikipedia.org/wiki/Fused_deposition_modeling" target="_blank">FDM</a>.  Ultimately, however, I was left with too many reasons stacked up against the Form 1+ (and of course, the frequent <a href="http://3d-printers.toptenreviews.com/ultimaker-review.html" target="_blank">positive reviews of the Ultimaker</a> didn&#8217;t hurt, either):</p>
<ul>
<li>Multiple <a href="http://forum.formlabs.com/t/adjusting-the-galvos-for-better-accuracy-success/810/8" target="_blank">reports</a> from <a href="http://kelsorj.wordpress.com/" target="_blank">early users</a> showing <a href="http://exploreideasdaily.wordpress.com/2013/07/12/episode-2-form1-calibration-strikes-back/" target="_blank">poor printer accuracy</a>.</li>
<li>Smaller build volume compared to the Ultimaker (and most other 3d printers).</li>
<li>A time-consuming, messy, and smelly <a href="https://www.youtube.com/watch?v=D05Y_OUDzfI" target="_blank">finishing process</a>.</li>
<li>Proprietary design with no/few user-serviceable parts inside.</li>
<li>Very costly resin.</li>
<li>Shipping logistics and costs with getting the printer to Australia.</li>
<li>A slightly higher base cost.</li>
</ul>
<p>That first point was actually a huge issue for me (what good is a 3d printer if it can&#8217;t print, <b>accurately</b>, in 3d?).  I even contacted FormLabs Support to see if perhaps the Form 1+ had solved the accuracy issues and what their official calibration tolerances were when shipping a printer.  Unfortunately all they could tell me was that the Form 1+ would be &#8220;more accurate&#8221; than the Form 1, and that they did not yet have any formally established tolerances as far as printer accuracy is concerned.  That&#8217;s just not good enough.  So an Ultimaker 2 is was.</p>
<p>The printer arrived last week, and I&#8217;m fairly impressed with it so far.  It&#8217;s very easy to use, and comes with everything you need to get started.  </p>
<p>After walking through the calibration wizard that runs the first time the printer is powered on, my test print came out with some minor issues:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/first_print.jpg" rel="lightbox[1115]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/first_print-755x1024.jpg" alt="" title="UM2 First Print" width="640" height="868" class="aligncenter size-large wp-image-1117" /></a></p>
<p>As you can see, half of the print looked pretty good, but the other half looked kind of melty.  After asking around a bit I determined that this happened due to the geometry of the Ultimaker&#8217;s printhead and cooling assembly.  The printer comes with a single extruder installed, and with space already allocated for installing a second extruder as a future upgrade.  The two extruder nozzles are positioned to be installed side-by-side, in line with the cooling assembly.  What this means is that the Ultimaker 2&#8217;s cooling setup is actually asymmetrical, with one fan being significantly closer to the extruder nozzle than the other.  This causes uneven cooling, and melty-looking results on the side that has the cooling fan further away from the nozzle.  </p>
<p>This may sound like a fairly serious issue, but it&#8217;s actually an easy problem to solve.  I was able to eliminate the asymmetrical cooling problem by printing out a custom cooling assembly (freely available; I used the &#8216;V06&#8242; design found <a href="https://www.youmagine.com/designs/ultimaker-2-fan-mount-dual--2" target="_blank">here</a>) and replacing the stock assembly with it.  My next print showed an immediate improvement:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/reprint.jpg" rel="lightbox[1115]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/reprint-1200x863.jpg" alt="" title="UM2 Reprint with better cooling" width="640" height="460" class="aligncenter size-large wp-image-1119" /></a></p>
<p>So&#8230;the 3d printer can 3d print its own upgrades, fixes, and replacement parts.  Soon we&#8217;ll have 3d printers spitting out improved versions of themselves, and all the companies selling these devices will be out of business.  In any case, with the improved cooling assembly installed I&#8217;ve had success printing many things, from cups (watertight, but not dishwasher safe), to rubbish bins (a cup that&#8217;s accidentally scaled up too much makes a rubbish bin), to <a href="http://www.thingiverse.com/thing:23685" target="_blank">annoying cube puzzles</a>, to custom-designed <a href="https://www.youmagine.com/designs/dji-phantom-landing-skid" target="_blank">modifications for the drone</a>:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/modified_drone.jpg" rel="lightbox[1115]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/08/modified_drone-1200x774.jpg" alt="" title="DJI Phantom w/ 3d-printed landing skids" width="640" height="412" class="aligncenter size-large wp-image-1121" /></a></p>
<p>In general it&#8217;s quite easy to print things.  It&#8217;s pretty much just load up the part in <a href="http://software.ultimaker.com/" target="_blank">Cura</a>, transfer to SD card, and go.  Cura is fairly easy to use, although some of the more advanced options could use a bit more documentation.  My only major complaint about Cura is that in my opinion it&#8217;s overly aggressive about automatically retriggering expensive computations (toolpath and model updates) and brings my laptop to its knees as a result.  However, Cura is <a href="https://github.com/daid/Cura" target="_blank">open-source</a>, and with a few hours of tinkering I was able to create a patched version that <a href="http://umforum.ultimaker.com/index.php?/topic/6794-feature-request-disable-automatic-toolpath-computation/page-2" target="_blank">disables the expensive computations</a> until the user says it&#8217;s okay.</p>
<p>In the end, the only real issue I see with the printer comes back to the cooling problem that I encountered on the initial print.  If the printer is going to ship with a single extruder installed, then the cooling assembly that ships with it should be optimized for use with a single extruder.  The dual-extruder shroud could easily be included as part of the upgrade kit for installing the second extruder.  Taking it even further, however, what I really think what Ultimaker should do is redesign the printhead assembly by rotating the extruder nozzle locations 90 degrees from their current positions.  That would put them in-line with each other but perpendicular to the fans, making them equidistant from the cooling source.  It would also allow the same cooling assembly to be used with both single- and dual-extruder setups.  Perhaps this is something they&#8217;ll consider for the Ultimaker 3.  Or the Ultimaker 2+, if they follow the naming conventions that other companies seem to be using.</p>
<p>So overall the Ultimaker 2 is shaping up to be a very capable machine that&#8217;s simple and straightforward to use.  I still think stereolithography is how we&#8217;ll end up printing things in the future, but the Ultimaker has shown me that there&#8217;s actually quite a bit that can be done with FDM.  </p>
<p>Oh, and the accuracy?  It&#8217;s spot on, on all axes.  If I tell it to print a 1cmx1cmx1cm cube, that&#8217;s exactly what I get.  Interlocking parts with relatively small (~1mm) features can be printed with ease.  So no issues there.  </p>
<p>Overall score:  9.0 / 10.0.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/1115/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Employee Equity and Startups &#8211; A Primer</title>
		<link>https://codethink.no-ip.org/archives/930</link>
		<comments>https://codethink.no-ip.org/archives/930#comments</comments>
		<pubDate>Sat, 25 Jan 2014 11:30:26 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[editorial]]></category>
		<category><![CDATA[equity]]></category>
		<category><![CDATA[fair-work]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=930</guid>
		<description><![CDATA[Anyone who takes a job with a startup should be well educated with respect to matters related to employee equity, both to make sure they understand the risks they are taking on and to ensure that they do not wind &#8230; <a href="https://codethink.no-ip.org/archives/930">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Anyone who takes a job with a startup should be well educated with respect to matters related to employee equity, both to make sure they understand the risks they are taking on and to ensure that they do not wind up in a tricky situation with respect to taxes.  In an ideal world startup companies would clearly and correctly explain all of these issues to each of their employees/prospective employees.  </p>
<p>However some of them don&#8217;t or can&#8217;t, and unfortunately some will even deliberately feed bullshit information on the subject to their employees in order to avoid having to actually make good upon their promises of equity.  So for the benefit of anyone who has unanswered questions on the subject of employee equity I am providing this article.</p>
<p>Be aware that I am not a lawyer, and do not claim to be.  However I have worked with several startup companies and seen the employment contracts and equity agreements used by several others (startups and established firms alike), and invested a significant amount of my time in researching this subject.  I think that makes me qualified to speak on it.  I&#8217;m also not a liar, a bully, or a manipulator, and that ought to count for some measure of credibility as well.  If that statement seems out of place to you, feel free to ignore it.  Those who should know it to be true and relevant, will.  And naturally you are free and encouraged to do your own research and to check the references I&#8217;ve used.</p>
<p>Anyhow, all equity agreements vary somewhat as far as the specific wording used.  Some features, however, are essentially universal.  These are the <b>allocation</b>, a <b>vesting schedule</b>, and a <b>cliff</b>.  Many agreements will also include some verbiage around the subject of <b>dilution</b>, what happens if the company is purchased or goes public, and similar topics.</p>
<p>There will be more on all of those shortly, but first let&#8217;s discuss a couple of common misconceptions that are related to this subject.</p>
<p><b>Common Misconceptions</b><br />
There are a number of myths about employee equity and compensation that you may find perpetuated at the less ethical startup companies.  A couple of these are debunked here.</p>
<p><b>Equity is the &#8220;prize at the end of the race&#8221;</b>.  False.  The value that the equity takes on over time is the prize at the end of the race.  The equity itself is your incentive to run the race as hard as possible.  Because that&#8217;s the only way your equity will ever have value.  And it only works if you are allocated the equity before you start running.  The fact of the matter is that you want to be allocated your equity when it is still worthless.  If you wait for the company to become successful you&#8217;ll be stuck in one of two undesirable situations.  Either 1) you will get hit with a massive tax bill when you finally do receive your equity that will probably force you to immediately sell off a significant chunk of it (which can be very difficult unless the company has gone public), or 2) you will be forced to take your equity in the form of options instead of as shares.  Note that option #2 means that your equity will have <b>zero</b> value when you finally do get it (that&#8217;s the only legal way around the tax issue), unless your employer back-dates the grant date for you.  And do note that back-dating options may be illegal.  If your employer thinks you should run hard <b>before</b> they allocate you any equity, you should run all right; run away from your employer as fast as you can!</p>
<p><b>Market rate is lower at a startup</b>.  False.  There&#8217;s only one market, and only one market rate.  Regional fluctuations exist, naturally, but even those are diminishing as distributed teams, telecommuting, and similar practices become more widespread.  In any event, a startup does not get a discount on the prevailing market rate simply for being a startup.  Wages are virtually always lower at startups, because employees are allocated large chunks of equity to make up for the difference between market rate and what they are actually being paid.  If a startup does not give this equity to its employees, then it has no excuse for offering any employee a below-market-rate salary.  A correct reiteration of the original assertion would be &#8220;your cash wage is lower at a startup because you have been issued equity to account for the difference between your cash wage and your market rate&#8221;.  If your employer says it any other way, that should be a red flag that something isn&#8217;t right.  Doubly so if they say it in any other way in defense of not giving employees equity or of not paying employees the full market rate.  </p>
<p>If you are unsure about the fair market rate for the job you perform, I encourage you to do some research on <a href="http://glassdoor.com" target="_blank">Glassdoor.com</a>.  For instance, here is the going rate for a <a href="http://www.glassdoor.com.au/Salaries/australia-technical-architect-salary-SRCH_IL.0,9_IN16_KO10,29.htm" target="_blank">technical architect in Australia</a>.  Here are some others:</p>
<ul>
<li><a href="http://www.glassdoor.com.au/Salaries/australia-creative-director-salary-SRCH_IL.0,9_IN16_KO10,27.htm" target="_blank">Creative director in Australia</a></li>
<li><a href="http://www.glassdoor.com.au/Salaries/australia-graphic-design-salary-SRCH_IL.0,9_IN16_KO10,24.htm" target="_blank">Graphic designer in Australia</a></li>
<li><a href="http://www.glassdoor.com.au/Salaries/australia-project-manager-salary-SRCH_IL.0,9_IN16_KO10,25.htm" target="_blank">Project manager in Australia</a></li>
<li><a href="http://www.glassdoor.com.au/Salaries/australia-human-resources-salary-SRCH_IL.0,9_IN16_KO10,25.htm" target="_blank">Human resources manager in Australia</a></li>
<li><a href="http://www.glassdoor.com.au/Salaries/india-ios-developer-salary-SRCH_IL.0,5_IN115_KO6,19.htm" target="_blank">iOS developer in India</a></li>
</ul>
<p>Glassdoor is full of useful information.  But it&#8217;s time to move on with the rest of the article.  </p>
<p><b>Allocation</b><br />
With equity agreements, the <b>allocation</b> is simply the amount of equity that a person is being granted.  This may be specified as a total number of shares (at an established/well-organized startup) or as a percentage of the company (at a fledgling/less organized startup which has not set up a pool of shares yet).  Either approach is fine, although when shares are used you should be sure to ask your employer what the total size of the share pool is, since obviously receiving 10,000 shares out of a pool of 100,000 is quite different than receiving 10,000 shares out of a pool of 100,000,000.  </p>
<p>The bottom line with any allocation is that you should be able to work out what portion of the business, as a percentage of the company, that you are being granted.  This is useful for answering questions like &#8216;if the company is sold tomorrow for $1 billion, how much of that would I get?&#8217; ($10 million per each percent allocated). There is no &#8220;standard&#8221; allocation, however your allocation should be appropriate to 1) your amount of experience/expertise, 2) the importance of your role to the company, 3) your market rate and the amount of salary sacrifice you take on, and 4) how early (or late) you joined the startup.  Depending upon these factors, allocations may be anywhere from 1% to 20%, with exceptions made in exceptional cases.  </p>
<p>When joining a startup company early in its life and/or at a significant salary sacrifice you should be reticent about accepting any offer that is below 1% of the company.  Never sell yourself short; if you&#8217;re going to be working for a fraction of your normal/market rate you deserve to have full confidence that you will win big if/when the company is successful.  Otherwise you are just wasting your time.</p>
<p><b>Vesting / Buyback</b><br />
The <b>allocation</b> specifies how much of the company you get.  However, you will virtually never receive your full allocation up front (and if you are offered such a deal and aren&#8217;t a founder/co-founder, it&#8217;s a sure sign that the company you&#8217;re working with is very inexperienced in these matters; you should do the right thing, and let them know that they really ought to be using a vesting schedule).  The reason for this is simple.  If the entire allocation is &#8216;paid&#8217; immediately, an employee can join a company, resign the next day, and walk with their entire allocation.  That&#8217;s very bad for business, for obvious reasons.  </p>
<p>To solve this problem, you will typically receive incremental portions of your allocation over time.  Should you leave the company (due to resignation or any other reason), provisions in your equity agreement will only permit you to retain those incremental portions that you received up to your final date of employment.  That portion is referred to as the <b>vested</b> shares (or vested equity, if working off a percentage).  </p>
<p>In essence, vested shares are the shares that the employee now owns, while <b>unvested</b> shares are shares which have been allocated to the employee but not actually handed over to them yet (the employee will get them eventually if they stay with the company, but doesn&#8217;t own them yet).  Unvested shares gradually convert to vested shares based upon the <b>vesting schedule</b>.  A vesting schedule will specify a timeframe over which vesting occurs, and at what increments unvested shares will convert to vested shares. </p>
<p>A typical vesting schedule will specify a timeframe of 4 years (this is basically industry-standard), with the allocation vesting in equal increments across that span of time.  Increments are usually handled on a monthly or quarterly basis, although half-yearly and yearly increments are sometimes used.  So for instance, if an employee is given 4% of the company and has a 4 year vesting schedule with quarterly increments, they will receive 1% of the company per year they remain employed, at a rate of 0.25% per quarter.  Usually a vesting schedule will not prorate partial increments (i.e. if your last day of employment falls in between two increments, you will not usually receive vested shares for the partially completed increment).</p>
<p><b>Buyback</b> is a feature unique to Australia (or at least, not seen in the U.S.; it&#8217;s possible other countries use similar provisions).  In the U.S. a tax loophole exists (known as an s83(b) election) that allows the recipient(s) of equity to avoid owing tax on it incrementally as it vests.  An equivalent loophole does not exist under Australian tax law, and so some companies will use a buyback provision to work around this fact for their employees.  </p>
<p>Buyback works almost like an inverse of the standard vesting schedule.  Instead of the allocation being held by the employer and then incrementally transferred to the employee as it vests, under a buyback arrangement the employee will receive the entire allocation up front and the employer will retain a right to buy back a portion of the allocation from the employee for some nominal (close to zero) value.  This buyback right diminishes incrementally, such that at the end of the vesting term it has been reduced to zero and the employee now has full control over their shares.  Separate provisions will generally prevent the employee from freely trading any shares that are still subject to buyback, typically by the employer retaining <a href="http://en.wikipedia.org/wiki/Right_of_first_refusal" target="_blank">right of first refusal</a> over any such shares, or other prohibitions on trading.  </p>
<p>Recent changes to the tax code in Australia may have removed some or all of the taxation benefits associated with buyback provisions, so they may be less common now than in the past.  </p>
<p><b>Cliff</b><br />
The simplest possible <b>vesting schedule</b> will convert unvested shares to vested shares in equal increments across the entire vesting timeframe.  Few businesses will use that approach, however, again due to the (entirely legitimate) desire to prevent people who stay with the company only a short while from walking away with chunks of equity.  To mitigate that possibility, most startups will include a <b>cliff</b> in their equity agreements.</p>
<p>A cliff is essentially a modification of the vesting schedule to delay the vesting of some portion of shares until some timeframe has elapsed.  For instance, a cliff may specify that no shares shall vest until an employee has been with the company for a total of six months, at which point any shares that would have normally vested during that timeframe (as specified in the vesting schedule) will vest all at once.  </p>
<p>So if our employee from the previous example (who was granted a 4% allocation vested quarterly over 4 years) is also subject to a six month cliff and resigns after five months, they will not be able to take any equity with them.  Similarly, if they instead resign after 7 months they will have satisfied the cliff, and be entitled to take their first two quarters&#8217; worth of equity (0.5% of the company) with them.</p>
<p>Typical cliff durations range from six months to 2 years.  Some startups may not use a cliff at all, and you should be wary of accepting any cliff that is more than a year or so in duration.  Also note that a cliff may have tax implications (particularly when the cliff timeframe is longer than one year in duration), as it causes you to receive a larger block of equity all at once.  When an equity agreement involves options rather than shares (i.e. when joining an established company instead of a startup), a cliff is not typically used as the allocation is generally much smaller and its real/immediate value is significantly less than when dealing directly with shares.</p>
<p><b>Dilution</b><br />
Shares in a company don&#8217;t appear out of thin air.  As new <b>allocations</b> are granted, the equity being allocated to the new employee needs to come from somewhere.  This necessarily means taking some portion of equity away from at least one existing shareholder (or out of a preallocated pool, if one exists).  When this happens, it is referred to as <b>dilution</b>.</p>
<p>Dilution is a relatively straightforward subject in and of itself, but failure to understand it can lead to disaster.  For instance, let&#8217;s say that Alice and Bob are co-founders at a startup, and that Alice holds 80% of the equity and Bob holds the remaining 20%.  If a new employee is allocated a 10% stake in the company, the following scenarios are possible; 1) all shares dilute equally, meaning that Alice&#8217;s holding will be reduced to 72% and Bob&#8217;s will reduce to 18%, 2) only Alice&#8217;s shares will dilute, meaning that she is left with 70% and Bob retains his entire 20%, or 3) only Bob&#8217;s shares will dilute, meaning that he is left with only 10% while Alice keeps her entire 80%.  In all cases the new employee ends up with 10%, at least until the next employee comes along.  Note that a 4th scenario is also possible, in which the company maintains a pool of unallocated shares to cover new hires coming on board; this effectively prevents dilution, at least until the pool is exhausted.</p>
<p>It should be apparent from those example scenarios that being the only person with dilutable shares is a bad idea.  As <a href="http://www.imdb.com/title/tt1285016/?ref_=fn_al_tt_1" target="_blank">The Social Network</a> so entertainingly underscores, if you are the only person with dilutable shares you will quickly see your equity evaporate.  Note that in scenario #3 Bob lost a full 50% of his original allocation due to a single new employee coming onboard.  It would not take many more hires to reduce Bob&#8217;s shareholding to essentially nothing. </p>
<p>When dealing with an equity agreement that is specified in terms of shares (i.e. with an established/well-organized startup), the terms of the agreement should state whether the shares allocated are Common (which they will be 99% of the time), Preferred, or any other special type.  Any special dilution rules that apply should be mentioned, although it is always wise to ask about how many different classes of shares the company has issued, and about whether or not any class of shares has preferential treatment with respect to dilution.  In the vast majority of cases, all shares will simply dilute equally.  </p>
<p>Conversely, if your equity agreement is specified in terms of a percentage of the company (i.e. with a new or disorganized startup) you should ensure that your percentage is specified as being non-dilutable until such time as proper shares are allocated.  This provides incentive for the business to allocate actual shares swiftly, and protects you from any number of shady behind-the-scenes things that might be done when dealing with a dilutable percentage.</p>
<p>Generally speaking, it is fair and commonplace for everyone&#8217;s shares to dilute equally once shares have been allocated.  Prior to that point, it is fair and commonplace for only the founders&#8217; holdings to dilute up until the moment when actual shares are allocated.  If your equity agreement is significantly different than this, think twice.  And if it tries to make you the only person with dilutable equity, run.</p>
<p><b>Options vs. Shares</b><br />
Depending upon where the company is at the time you join it, your equity agreement may deal either in <b>options</b> or <b>shares</b> (if your equity agreement deals in terms of a percentage of the company, expect your portion of the company to be delivered to you as shares).  Shares are quite simple, and the norm when dealing with an early-stage startup.  Each share has a value that is determined by the company&#8217;s net-worth/market cap, and the value of an allocation is simply the share value multiplied by the number of shares.  Simple.</p>
<p>The problem with shares is that they have a real value at the time they are allocated, and this means that share allocations are taxable as income (though note that when a <b>vesting schedule</b> is used your shares will be taxable as they vest and not when they are allocated).  This can cause some very significant issues.  For instance one share of Google is currently worth <a href="https://www.google.com/finance?q=NASDAQ:GOOG&#038;sa=X&#038;ei=D57kUp29Kc_slAWljoHwAg&#038;ved=0CCoQ2AEwAA" target="_blank">a little better than $1,100</a>.  If Google were to give 500 shares to an employee, that employee would owe taxes on some $550,000+ in income, probably forcing them to sell 30-40% of their shares just to cover the tax bill. </p>
<p>The way around this tax issue is to use <b>options</b>.  An option is not a share; instead it is the right to purchase a share at a set price at some time in the future.  The price associated with an option is generally (unless the company has back-dated the option) the market price on the date the option is issued.  This means that when options are granted they have zero real value, which solves the tax problem nicely and is why established companies use options in their equity agreements almost exclusively.  It also means that unless back-dating is involved, options are completely worthless when you receive them.</p>
<p>To return to our previous example, Google could issue an employee options on 500 shares, granting them the right to purchase those 500 shares now or in the future for $1,100/share.  The options have no immediate value (the employee can get 500 shares of Google, but only by paying $550,000 for them; the same as buying them on the open market).  If the value of Google increases to, say $2,200/share, at that point the employee can buy 500 shares for $1,100/share, and then immediately turn around and sell them for $2,200/share, netting a $550,000 profit (which is taxable as capital gains).  So options only attain value if the company&#8217;s share price continues to rise.  If it remains the same or goes down, the options remain completely worthless.</p>
<p>If you&#8217;re joining a newly founded startup, you <b>do not</b> want to receive options unless the strike-price is fixed on or against your hire date (meaning that it is <= $0.01/share, since the startup should be close to worthless when you join).  You should be offered shares in the company.  If you are not then that's a good indication that you should seek other opportunities elsewhere.

<b>Words are Trivial</b><br />
Now that&#8217;s all a fair bit to take in.  And this is a good moment to underscore the importance of always getting a written equity agreement from your employer.  Verbal agreements are notoriously unreliable and subject to differences in interpretation and perspective.  Particularly when dealing with subjects like vesting and dilution that are extremely nuanced and virtually impossible to adequately capture in a verbal agreement.  </p>
<p>If the startup company you are working with will not provide a written equity agreement, or fails to provide one in a timely fashion, that&#8217;s a strong indication that you should seek another employer.  There is little reason for a startup company to not provide written equity agreements, unless the managers of the startup company simply do not intend to actually give anybody any equity (some people just don&#8217;t like to share; but thankfully their actions make them easy to spot).  And you really don&#8217;t want to end up working at startups like that.</p>
<p>If your employer cannot tell you (in exact terms) your <b>allocation</b>, your <b>vesting schedule</b>, your current vesting status, or exactly what will happen in the event of an acquisition, resignation, or termination, they haven&#8217;t given you a real equity agreement!</p>
<p><b>Example Equity Agreements</b><br />
For reference, I have included a some example equity agreements here.  All are real agreements that have been used in practice, although any identifying information has been obliterated.  Note that although some are far more verbose than others, all agreements cover essentially the same subjects.</p>

<a href='https://codethink.no-ip.org/archives/930/aus-equity-agreement-1'><img width="200" height="84" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/aus-equity-agreement-1-200x84.png" class="attachment-thumbnail" alt="Example 1 - Short and Sweet" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-1'><img width="154" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-1-154x200.png" class="attachment-thumbnail" alt="Example 2" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-2-1'><img width="139" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-2.1-139x200.png" class="attachment-thumbnail" alt="Example 3, Page 1" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-2-2'><img width="139" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-2.2-139x200.png" class="attachment-thumbnail" alt="Example 3, Page 2" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-2-3'><img width="139" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-2.3-139x200.png" class="attachment-thumbnail" alt="Example 3, Page 3" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-2-4'><img width="139" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-2.4-139x200.png" class="attachment-thumbnail" alt="Example 3, Page 4" /></a>
<a href='https://codethink.no-ip.org/archives/930/us-equity-agreement-2-5'><img width="139" height="200" src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2014/01/us-equity-agreement-2.5-139x200.png" class="attachment-thumbnail" alt="Example 3, Page 5" /></a>

<p>The equity agreement that you get from your employer should be reasonably similar to these agreements.  You should be able to easily pick out the <b>allocation</b> and the <b>vesting schedule</b>.  If you cannot, be wary.  Or if you have only a verbal equity agreement from your employer, be triply wary.</p>
<p><b>Thought Exercise</b><br />
Now let&#8217;s consider a hypothetical example company, Transnational Application Production Services.  At this company, employees are routinely offered salaries that are significantly below prevailing market rates.  The typical &#8220;discount&#8221; is in the range of 50-75% off of market rate, which means that some employees are even asked to accept offers that are below the legal minimum wage.  In exchange for this salary sacrifice, employees are offered equity in the company as part of their compensation.  However, this offer of equity is only ever stated verbally, and although several employees request written equity agreements both before and after signing their employment contracts, no written equity agreements are ever provided by Transnational Application Production Services.  Nor does the company provide any statements relating to <b>vesting schedules</b>, <b>allocation</b> size, or other issues typically covered in an equity agreement.  </p>
<p>Can you guess what happens if/when an employee leaves the company?  Do you think they will get to take any portion of the equity that was promised to them when they leave?  If you answered &#8216;<i>absolutely not</i>&#8216;, you are probably correct.  In a normal startup company, every employee would have a document the specifies their <b>cliff</b> terms (if any), and what happens should they leave the company before or after the <b>cliff</b> period has elapsed.  An Transnational Application Production Services employee has none of those things; and since their equity agreement relies upon a verbal contract, it would be very difficult for them to ever prove otherwise.  <b><i>A verbal contract is about as good as having no contract at all</i></b>.</p>
<p>However, let&#8217;s say that we&#8217;re wrong, and that Transnational Application Production Services agrees to make good on its verbal promises of equity.  Can you work out how much equity the employee will receive?  If you answered &#8216;<i>absolutely not</i>&#8216; again, you are most definitely correct.  Because the verbal agreement from Transnational Application Production Services never specified an <b>allocation</b> or a <b>vesting schedule</b>, there&#8217;s absolutely no way of knowing how much equity a given employee should or will receive, or how much equity they possess at any given point in time.  Without a written agreement, <b><i>everything is left up to the whim of Transnational Application Production Services</i></b>.  </p>
<p>Contrast that with a standard startup company, in which each employee&#8217;s contract specifies an <b>allocation</b> and <b>vesting</b> terms.  This makes the task of determining how much equity a departing employee gets to take with them trivial, since it&#8217;s all there in black and white.  By not having a written equity agreement, employees at Transnational Application Production Services are exposed to a significantly larger amount of risk than their counterparts at virtually any other startup.  One hopes that the hypothetical management at Transnational Application Production Services would at least take the time to explain this <b>extra</b> risk to employees as part of their hiring talks.  Though you may use your own imagination to decide whether or not that happens in our hypothetical world.</p>
<p>&#8216;<i>But surely there&#8217;s an upside</i>&#8216;, you say.  And that&#8217;s a reasonable thought.  Taking on increased risk is supposed to result in increased rewards, after all.  But unfortunately no, that&#8217;s not how it works in this case.  Because no <b>allocation</b> has been specified, each employee&#8217;s rewards have been left entirely up to the whim of Transnational Application Production Services and its management.  There&#8217;s no minimum amount of equity that an employee at Transnational Application Production Services can count on getting.  There&#8217;s no maximum amount either, but that&#8217;s not an added benefit because the same case exists at every other startup.  Having an <b>allocation</b> specified does not preclude management from allocating additional equity to people it feels deserve it, it simply provides a minimum amount that every employee can be confident that they will get.  </p>
<p>So employees at Transnational Application Production Services are taking on <b>more</b> risk than their counterparts at other startup companies.  While at the same time they have <b>less</b> certainty about how much of a reward they will receive.  <b><i>There is no upside; the employee loses on both counts</i></b>.</p>
<p>Things are quite a mess over at Transnational Application Production Services.  Our hypothetical company is most definitely not a shining example of how real companies should be run.  If Transnational Application Production Services reminds you of your own employer, <b><i>you&#8217;d be wise to start seriously seeking out other options</i></b>.</p>
<p>Of course, it&#8217;s entirely possible that the management at Transnational Application Production Services is simply uninformed about how to best handle equity allocations, as it is a startup company after all.  It&#8217;s important to always give people the benefit of the doubt.  </p>
<p>However, imagine that at our hypothetical company multiple employees have raised the issue of getting written equity agreements in place.  And that some of them have even gone so far as to discuss the very issues covered above with their employer.  And that our hypothetical company has made repeated promises with respect to getting together a written agreement but not delivered upon a single one.  And that at Transnational Application Production Services the only person who has been given an actual <b>allocation</b> is a manager who takes home a six figure income while his colleagues work on below-minimum-wage salaries, while simultaneously and routinely asserting that everyone is being paid market rate and that there&#8217;s no money available for pay increases.  And that those employees on below-minimum-wage salaries have repeatedly brought up the issue of their low rate of pay.  And that the only employees to successfully petition for a legal wage were the ones who pointed out that their wage was in fact illegal.  And that all of this has gone on <b><i>for years with no corrections being made</i></b>.  </p>
<p>A certain pattern of inequity begins to emerge at our hypothetical company.  Will this pattern of inequity exist at every startup company that doesn&#8217;t provide written equity agreements?  No, probably not.  But the lack of one should be a red flag that you may be working at Transnational Application Production Services.  And <b><i>that is not a company that you want to work for</i></b>.</p>
<p>Ignorance is understandable, if deplorable (and also 100% correctable).  Deliberately taking advantage of people, on the other hand, is just plain despicable.  Companies which operate like our hypothetical Transnational Application Production Services are taking advantage of their employees and wasting everyone&#8217;s time.  The company is getting work at a significantly discounted rate, and not providing anything whatsoever in return.  &#8216;Thievery&#8217; and &#8216;exploitation&#8217; are words that come to mind.  </p>
<p>Our hypothetical startup is about as bad as they come.  We should all be grateful that such companies rarely exist in the real world.  </p>
<p>This example further underscores the importance of always getting a <b>written</b> equity agreement that specifies your <b>allocation</b>, <b>vesting schedule</b>, and <b>cliff</b> whenever dealing with a real-world company.  </p>
<p><b>Random Quote</b><br />
<i>No matter how you spend your life, your wit will defend you more often than a sword.  Keep it sharp!</i></p>
<p><b>Disclaimer</b><br />
All characters, companies and events in this blog&#8211;even those based on real people&#8211;are entirely fictional.  All celebrity voices are impersonated&#8230;poorly.  The preceding blog post contains useful information and due to its content should be read by most people.  But not the elderly, people with heart conditions, or CEO&#8217;s of disreputable startup companies.</p>
<p><b>References</b></p>
<ul>
<li><a href="http://www.foundersworkbench.com/hiring/83b-memorandum/" target="_blank">Founders Workbench &#8211; U.S. s83(b) Elections (income tax loophole)</a></li>
<li><a href="http://kevindavis.com.au/secondpages/workinprogress/Buybacks_Tax_Change_Consequences-5-9-2012.pdf" target="_blank">Kevin Davis &#8211; Australia Buyback Tax Changes ca. 2012</a></li>
<li><a href="http://new.livestream.com/Skillsharelive/MBAMondays/videos/490550" target="_blank">Skillshare Seminar &#8211; Employee Equity and Dilution</a></li>
<li><a href="http://fromlittlethings.co/2012/10/30/vesting-schedules-equity-shares-and-loans-to-founders/" target="_blank">From Little Things &#8211; Vesting, Equity, and Buyback in Australia</a></li>
<li><a href="http://epublications.bond.edu.au/cgi/viewcontent.cgi?article=1020&#038;context=cgej" target="_blank">Bond University &#8211; Options and Options Backdating</a></li>
<li><a href="http://en.wikipedia.org/wiki/Vesting#Ownership_in_startup_companies" target="_blank">Wikipedia &#8211; Equity Vesting in Startups</a></li>
<li><a href="http://en.wikipedia.org/wiki/Employee_stock_options" target="_blank">Wikipedia &#8211; Stock Options</a></li>
<li><a href="http://en.wikipedia.org/wiki/Options_backdating" target="_blank">Wikipedia &#8211; Options Backdating</a></li>
<li>Personal Experience &#8211; Priceless</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/930/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[iOS] Jira Mobile Connect</title>
		<link>https://codethink.no-ip.org/archives/788</link>
		<comments>https://codethink.no-ip.org/archives/788#comments</comments>
		<pubDate>Fri, 04 Nov 2011 06:48:08 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=788</guid>
		<description><![CDATA[Not long ago Atlassian released version 1.0 (now up to 1.0.7) of their Jira Mobile Connect plugin. This is a plugin for Jira (obviously) that aims to simplify testing, error-reporting, and feedback collection/management for iOS applications. Assuming that you are &#8230; <a href="https://codethink.no-ip.org/archives/788">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Not long ago Atlassian released version 1.0 (now up to 1.0.7) of their <a href="https://plugins.atlassian.com/plugin/details/322837" target="_blank">Jira Mobile Connect plugin</a>.  This is a plugin for Jira (obviously) that aims to simplify testing, error-reporting, and feedback collection/management for iOS applications.  Assuming that you are doing iOS software development and have a Jira server instance running (which you really should if you are doing any nontrivial amount of development work of any variety) then using this plugin in your apps is really a no-brainer.  Jira Mobile Connect includes a number of very cool features, such as the ability for users to attach annotated screenshots/images to their feedback reports, to record audio to attach with their feedback, and even to chat back and forth with the developer(s) working on their issue/ticket .  And of course it does basic crash logging and reporting, as well. </p>
<p>Previously if you wanted a free/open-source crash reporting framework for iOS your options were basically limited to <a href="http://quincykit.net/server.html" target="_blank">QuincyKit</a>, which is a serviceable but basic solution.  Sadly, the backing architecture used by the QuincyKit server is not well designed and scales very poorly with the number of crash reports in the system.  Once you have around 5,000 you&#8217;ll notice the server slowing down significantly, and go much beyond 10,000 that and the system grinds to an unusable halt.  With a day or so of database and code refactoring, these scalability issues can be resolved, creating a system performant enough to track millions of error logs or more.  But that&#8217;s a subject for another time.  The point for today is that despite its basic level of functionality and flawed server architecture, there are a few key areas in which QuincyKit blows the default implementation of Jira Mobile Connect out of the water:</p>
<ol>
<li>Automatic grouping of crash reports.</li>
<li>Automatic symbolication of error logs.</li>
</ol>
<p>If you have any experience whatsoever with supporting multiple high-volume iOS applications you will instantly realize that these are features that you want.  They might even be features that you want more than annotated screenshots, audio feedback, user chat, or seamless integration with Jira and all the awesomeness that Jira brings.  In short, Jira Mobile Connect&#8217;s lack of support for these two key features may cause serious developers to pass it over in favor of other solutions.  </p>
<p>Without grouping every single crash will be creating a new ticket in Jira that you need to track and resolve.  Multiple instances of the same crash will have to be manually flagged as duplicates within Jira.  And without symbolication trying to actually map back from an error log to the line of code that caused it is an exercise in futility, or at best, tedium.</p>
<p>In any case, rather than abandon the excellent potential shown by Jira Mobile Connect I decided that instead I would attempt to patch it up and add the missing features myself.  It&#8217;s all open-source code, after-all, and if the tangled mess of PHP that is QuincyKit server can provide these features then they can&#8217;t be that difficult to implement.  Unfortunately I had to change too many files in too many different places to show the code here, but if you want the short version of it I was able to implement both grouping and symbolication, and you&#8217;re welcome to view the complete diffs on bitbucket:</p>
<p><a href="https://bitbucket.org/aroth_iapps/jiraconnect-ios-iapps/compare/..atlassian/jiraconnect-ios" target="_blank">https://bitbucket.org/aroth_iapps/jiraconnect-ios-iapps/compare/..atlassian/jiraconnect-ios</a> (client/native iOS code)<br />
<a href="https://bitbucket.org/aroth_iapps/jiraconnect-jiraplugin-iapps/compare/..atlassian/jiraconnect-jiraplugin" target="_blank">https://bitbucket.org/aroth_iapps/jiraconnect-jiraplugin-iapps/compare/..atlassian/jiraconnect-jiraplugin</a> (server/Java code)</p>
<p>One interesting side-effect of adding groups was that it became possible for multiple client UID&#8217;s to be associated with a single Jira ticket.  This had an important implication for feedback notifications/chat in that the reference implementation allowed only a single UID to be associated with each Jira ticket.  Since the UID is used for determining what notifications/updates to send to the native client, this restricted update notifications to a single user per ticket.  Not too useful if you have a common crash that thousands of users have experienced.  The implementation above extends the data model to allow multiple UID&#8217;s to be stored against a single Jira ticket, allowing each UID to be updated when new feedback is posted by the developer on a ticket.  In essence, implementing grouping also required the implementation of group feedback/chat.</p>
<p>There is one caveat with my server implementation, in that it assumes the existence of the &#8216;<em>symbolicatecrash</em>&#8216; utility on the system&#8217;s runtime <em>PATH</em>.  This means that it will only work if your Jira server is hosted on a Mac, with the proper XCode developer tools installed (and with your application&#8217;s .app and .dSYM files copied to the local filesystem).  This is of course a requirement regardless if you want automatic symbolication to work on any sort of system; somewhere there needs to be a Mac with &#8216;<em>symbolicatecrash</em>&#8216; available.  In any case, it is a fairly simple matter to either turn this off or otherwise make it more intelligent, if your Jira server is incapable of running &#8216;<em>symbolicatecrash</em>&#8216;.</p>
<p>Also note that the native iOS code has been restructured to build a universal iOS framework as opposed to an architecture-specific static library.  This is done using Karl Stenerud&#8217;s excellent <a href="https://github.com/kstenerud/iOS-Universal-Framework" target="_blank">XCode4 Project Template</a>.  You will need to install this template in order to actually build the modified code.  Or you can just refactor it back to build a static library again, but why would you want to do that?</p>
<p>When using the iOS framework, be aware that you will need to set the &#8216;-<em>all_load</em>&#8216; linker flag and also include all the images and nibs in the framework&#8217;s &#8216;<em>/Resources</em>&#8216; folder as part of your build.  You will probably also want to include the &#8216;<em>JMCLocalizable.strings</em>&#8216; file in the same folder as well, to provide proper text and labels on Jira Mobile Connect&#8217;s UI elements.</p>
<p>Regardless, if you do a lot of iOS development and are already using Jira (like you should be) then I encourage you to check this out.  This is the Jira Mobile Connect plugin, now with automatic grouping and error log symbolication.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/788/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Natural Scrolling Isn&#8217;t</title>
		<link>https://codethink.no-ip.org/archives/736</link>
		<comments>https://codethink.no-ip.org/archives/736#comments</comments>
		<pubDate>Sat, 23 Jul 2011 07:50:05 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>
		<category><![CDATA[operating systems]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[scrolling]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=736</guid>
		<description><![CDATA[Mac users and other developers such as myself who have no choice but to use a Mac for certain projects will already know what I&#8217;m talking about. For everyone else, however, the newest version of OS X includes a most &#8230; <a href="https://codethink.no-ip.org/archives/736">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Mac users and other developers such as myself who have no choice but to use a Mac for certain projects will already know what I&#8217;m talking about.  For everyone else, however, the <a href="http://en.wikipedia.org/wiki/Mac_OS_X_Lion" target="_blank">newest version of OS X</a> includes a most bizarre feature, called &#8220;natural scrolling&#8221;.  Despite its innocuous-sounding name, this feature (which ships enabled by default) breaks the interface to the OS by inverting the direction content scrolls when using the mouse-wheel.  </p>
<p>Apple&#8217;s explanation (and seemingly, justification) for this atrocity of a feature is that &#8220;content should move in the same directions as your finger&#8221;.  Now that&#8217;s all well and good, except for one thing; <em>there is no &#8220;finger&#8221; when using a mouse</em>.  Touch- and mouse-driven are distinct input paradigms.  </p>
<p>Apple is correct in that in a touch-driven system content should indeed track in the same direction as the user&#8217;s finger moves.  If a hypothetical touch-based interface were ever released which scrolled content in the opposite direction of the user&#8217;s finger, then people would say that it was broken.  And rightly so.  Moving content in the same direction as the touch is the intuitive operating mode of a touch interface.</p>
<p>Similarly, moving content in the opposite direction of the scroll (or more accurately, moving the scrollbar in the direction of the scroll) is the intuitive operating mode for a mouse-driven interface.  And it follows that Apple&#8217;s mouse-driven interface in Lion is just as broken as that hypothetical touch-driven interface would be.  By Apple&#8217;s logic scrollbars themselves should also be inverted, tracking from the bottom of the scrollbar to the top as the content scrolls from top to bottom.  Confused yet?  Apple&#8217;s blunder here is that they have conflated mouse-driven input with touch-driven input, without bothering to translate properly between the two.  </p>
<p>As an interesting aside, a comparable analog to touch-style scrolling does exist in the mouse-driven paradigm; the drag operation.  You&#8217;ve probably seen it in things like Adobe PDF documents, and it can also be observed on any scrollbar. In the drag operation you choose an anchor-point, and then that anchor point moves in the same direction that you move, and it all intuitively makes sense. The problem with scrolling using a scroll-wheel is that it has no anchor point from the user&#8217;s point of view (they have done nothing to nominate one, and the UI does nothing to indicate that one has been chosen).  In the mouse-driven paradigm, scrolling is a distinct operation from dragging, and by conflating the two Apple has broken their interface.  At least until they start incorporating a touch-screen into every computer they sell.</p>
<p>If Apple&#8217;s position is to be taken seriously, then we must accept that the current cursor position must always represent where the user&#8217;s &#8220;finger&#8221; is.  There&#8217;s one major problem with that, however.  With a mouse and cursor, the cursor never leaves the screen.  And if the user&#8217;s finger is in constant contact with the screen, then why should there be a separate scroll operation at all?  It would logically follow (since mouse-driven == touch-driven and cursor == finger in Apple&#8217;s world) that since a touch-point exists, and since it is moving, the content (all of it, everywhere) should simply scroll whenever I move the mouse (all the time, everywhere).  But of course that is nonsense, and so is Apple&#8217;s &#8220;natural scrolling&#8221; mouse behavior.  The mouse cursor is not a finger, it does not represent a finger, and its location is not where your finger is touching.  Mouse-driven and touch-driven are different modes of operation, with different intuitive behaviors.</p>
<p>Thankfully, you can <a href="http://www.pcworld.com/businesscenter/article/236182/revert_os_x_lions_page_scrolling_to_the_old_direction.html" target="_blank">turn off &#8220;natural&#8221; scrolling</a> and rid your OS of its nonsense.  I&#8217;ll be happy to turn it back on when my mouse is replaced with a touch-screen display, but until that day comes you can forget about it.  Apple, please stop trying to convince me that moving my mouse cursor around the screen is supposed to be the same thing as dragging my finger all over a touch screen.  It isn&#8217;t, and I&#8217;m not stupid enough to be convinced that it is.</p>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/736/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Webcomix 1.0!</title>
		<link>https://codethink.no-ip.org/archives/594</link>
		<comments>https://codethink.no-ip.org/archives/594#comments</comments>
		<pubDate>Sun, 01 May 2011 00:58:55 +0000</pubDate>
		<dc:creator><![CDATA[aroth]]></dc:creator>
				<category><![CDATA[banter]]></category>

		<guid isPermaLink="false">http://codethink.no-ip.org/wordpress/?p=594</guid>
		<description><![CDATA[It has been a little less than 1.5 months since the Webcomix beta was announced, and I think the project has finally matured to the point where it need no longer be considered a beta. During this time the number &#8230; <a href="https://codethink.no-ip.org/archives/594">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>It has been a little less than 1.5 months since the <a href="http://codethink.no-ip.org/wordpress/archives/511">Webcomix beta was announced</a>, and I think the project has finally matured to the point where it need no longer be considered a beta.  During this time the number of supported comics was more than doubled, the comic-selection UI has been completely reworked, features that weren&#8217;t working quite right at the start of the beta have been fixed, and a number of new features have been added, such as live thumbnails, Facebook integration, and more.  </p>
<p>Most importantly, the original architecture and caching hierarchy have been validated as capable of efficiently managing requests for a large number of comics pulled from several distinct data-sources, and the API verified as sufficient for creating complex comic-centric applications.  Overall I am fairly pleased with the current state of the project, and thus I give you:</p>
<p><a href="http://codethink.no-ip.org/wordpress/wp-content/uploads/2011/05/Webcomix-1.0.jpg" rel="lightbox[594]"><img src="http://codethink.no-ip.org/wordpress/wp-content/uploads/2011/05/Webcomix-1.0-1200x725.jpg" alt="Webcomix 1.0" title="Webcomix 1.0" width="640" height="386" class="aligncenter size-large wp-image-599" /></a><br />
<center><a href="http://webcomix.no-ip.org" target="_blank" style="position: relative; top: -50px; padding: 0; margin: 0; padding-bottom: -40px; margin-bottom: -40px;">Webcomix 1.0</a></center></p>
<div style="position: relative; top: -60px;">Of course, the non-beta status does not mean that development on the project is stopping, or that Webcomix is free of bugs and issues.  Neither of those is true, and you should expect to see periodic updates taking place to roll out new content and features and to fix and/or improve existing features and behavior.  Next up is twitter integration and a simple caching improvement to reduce the amount of time it takes to determine what links should display below a comic.  Then perhaps a re-examining of how the Facebook integration is currently working and some fixes for some minor/difficult to trigger bugs, followed by a steady roll-out of new content and features.</p>
<p>Anyways, if you missed it before then I invite you to take a look at <a href="http://webcomix.no-ip.org" target="_blank">Webcomix</a>.  All you have to do is sit back, read some comics, and enjoy.</div>
]]></content:encoded>
			<wfw:commentRss>https://codethink.no-ip.org/archives/594/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
