<?xml version="1.0" encoding="UTF-8"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	>
	<title type="text">b i t q u i l l</title>
	<subtitle type="text">Search for Terrestrial Intelligence</subtitle>

	<updated>2016-05-12T19:58:50Z</updated>

	<link rel="alternate" type="text/html" href="http://bitquill.net/blog" />
	<id>http://bitquill.net/blog/feed/atom/</id>
	<link rel="self" type="application/atom+xml" href="http://bitquill.net/blog/feed/atom/" />

	
	<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Week-long hack: ESP8266 touchscreen WiFi light controller and clock]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/esp8266-light-controller-clock/" />

		<id>http://bitquill.net/blog/?p=624</id>
		<updated>2016-05-12T19:24:39Z</updated>
		<published>2015-09-09T17:56:49Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="Arduino" /><category scheme="http://bitquill.net/blog" term="Embedded" /><category scheme="http://bitquill.net/blog" term="ESP8266" /><category scheme="http://bitquill.net/blog" term="Hacks" />
		<summary type="html"><![CDATA[A couple of months ago I picked up cheapÂ WiFi-controlled LED bulbs (oneÂ amongÂ dozensÂ of very similar devices), after seeing them at a friend&#8217;s place. Â This turned out to be an excuse to play with theÂ ESP8266, which has inspired several hacks. I was overall very happy with these bulbs: decent Android and iOS apps and, compared to fancier [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/esp8266-light-controller-clock/"><![CDATA[<p>A couple of months ago I picked up cheapÂ WiFi-controlled LED bulbs (<a title="MagicLight WiFi LED light bulb - Amazon.com" href="http://www.amazon.com/gp/product/B00SIDVZSW">one</a>Â amongÂ dozensÂ of very similar devices), after seeing them at a friend&#8217;s place. Â This turned out to be an excuse to play with theÂ <a title="ESP8266 - Wikipedia" href="https://en.wikipedia.org/wiki/ESP8266">ESP8266</a>, which has inspired <a title="ESP8266 (tag) - Hackaday" href="https://hackaday.com/tag/esp8266/">several hacks</a>.</p>
<p>I was overall very happy with these bulbs: decent Android and iOS apps and, compared to fancier solutions (e.g., Philips Hue or Belkin WeMo), theyÂ do not require any proprietary base stations, and you can&#8217;t beat the price! Â However, switching off the lights before falling asleep involvedÂ hunting for the phone, opening the app, and waiting for it to scan the network; not an ideal user experience. Â I was actually missing our old <a title="X10 (industry standard) - Wikipedia" href="https://en.wikipedia.org/wiki/X10_(industry_standard)">X10</a>Â alarm clock controller (remember those?), so I decided to make one from scratch, because&#8230; why not?</p>
<p>Although the X10 Powerhouse controller&#8217;s faux-wood stylingÂ and 7-segment LED had a certain&#8230; charm, I decided to go more modern and use a touchscreen. Â I also designed a 3D printed enclosure with simple geometric shapes and used it as a further excuse to play with 3D print finishing techniques. Â Here is the final result:</p>
<p><img data-recalc-dims="1" fetchpriority="high" decoding="async" data-attachment-id="631" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/espclock-beautyshot/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?fit=1947%2C1095" data-orig-size="1947,1095" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441719702&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="ESP Clock" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?fit=1024%2C576" class="alignnone wp-image-631" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?resize=768%2C432" alt="ESP Clock" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/espclock-beautyshot.jpg?w=1947 1947w" sizes="(max-width: 768px) 100vw, 768px" /></p>
<p>And here it is in action:</p>
<p><iframe src="https://www.youtube.com/embed/hKBLLkvEEXE" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>If this seems interesting, read on for details. Â The source code for everything is <a title="spapadim/ESPClock - GitHub" href="https://github.com/spapadim/ESPClock">available on GitHub</a>. <strong>Edit:</strong>Â You can also check the <a href="https://hackaday.io/project/7611-diy-chumby-lite">Hackaday.io project page</a> for occasional updates.</p>
<p><span id="more-624"></span></p>
<p><strong>Component selection.</strong>Â There are several boards with the ESP8266, most of them using the ESP-12 module. I decided to go with theÂ <a title="SparkFin ESP8266 Thing - SparkFun" href="https://www.sparkfun.com/products/13231">SparkFun Thing</a>Â (which directly incorporates the ESP chip), as it also includes a LiPo charge controller. Â Perhaps overkill for battery backup, but nice to have. Â If you do use the charge controller, then the price is very reasonable (e.g., anÂ <a title="Adafruit HUZZAH ESP8266 Breakout - Adafruit" href="https://www.adafruit.com/product/2471">Adafruit ESP breakout</a> and <a title="Adafruit Micro Lipo w/MicroUSB Jack - USB LiIon/LiPoly charger - Adafruit" href="https://www.adafruit.com/product/1904">Micro-LiPo</a>Â combo will cost about the same&#8211;although flash is 4x larger and the ESP-12 module is FCC-approved). Also, it&#8217;s a very nice board for experimentation and it&#8217;s become my go-to ESP board: nice header layout, and the easiest to program (tip: instead of fiddling with the DTR jumper on the Thing, just cut your DTR wireÂ and insert a pin header pair: once <code>esptool</code> starts uploading, just pull the pin and.. done!).<!--more--></p>
<p>For the display, modules with a parallel interface were out of the question, since the ESP does not have enough pins. After some googling, I foundÂ <a title="Serial IPS TFT 320x240 with Touchscreen - Digole" href="http://digole.com/index.php?productID=1208">Digole&#8217;s IPS touchscreen</a>, which incorporates a PIC MCU and can connect over UART, I2C, or SPI (selectable via a solder jumper).Â There are several users that really like Digole&#8217;s display modules and, particularly their older models, seem quite popular. The display itself is very nice. Â However, touchscreen support appears to be relatively recent and isn&#8217;t that great (more later). Â It is also a bit on the expensive side, the firmware is not upgradeable (so you&#8217;re basically stuck with whatever version your module comes loaded with &#8212; I got one with an older version that has some bugs with 18-bit color support), and manufacturing quality could have been a bit better (mine had <a href="http://i.imgur.com/FDIPy4Ll.jpg">poor reflow</a>). Â Still, for prototype experimentation, this isn&#8217;t a bad module and the company is generally helpful to customer inquiries.</p>
<p>I also picked up a DS3231 RTC module off of Amazon, but I ended up not using it; periodically synchronizing with an NTP server is more than good enough.</p>
<p><strong>Total cost.</strong>Â  The first version of this device comes to about $45 including everything: SparkFun Thing ($15), touchscreen (highest cost at $21.50), and 500mAh LiPo cell ($8.50 off eBay). However, in retrospect, it could be done for much less:Â <strong>about $13 total (!)</strong>Â if you skip the LiPo (and charge controller), using a $5-6 ESP module instead, and also get a much cheaper ILI9341 touchscreen module (not IPS, but just $7 off eBay; I have one on the way from China). This does not include plastic filament (maybe a dollar?), paint (assuming you have these already, doesn&#8217;t use much), and labor.</p>
<p><strong>3D-printed enclosure.</strong>Â I mocked a couple of profiles in 2D CAD to see what I like, and then did the actual design in OpenSCAD, which is my go-to CAD tool, because&#8230; code! (Who has time for point-and-click? :) Â It&#8217;s a fairly standard affair, with simple geometric shapes, designed in multiple pieces for printing.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png"><img data-recalc-dims="1" decoding="async" data-attachment-id="660" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/openscad/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?fit=1564%2C880" data-orig-size="1564,880" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="openscad" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?fit=1024%2C576" class="alignnone wp-image-660" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?resize=768%2C432" alt="openscad" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/openscad.png?w=1564 1564w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<p>The picture above shows the parts in their printing orientation. The standoffs are conical to eliminate the need for supports (alternatively, I could have printed them as separate parts, but getting them inserted is too fiddly, especially in tight spaces like this). The cylindrical sections (middle right) are support ribs which I ABS-glued to the main enclosure&#8217;s vertices. They serve two purposes. First, to hold the endcaps in place (the ribs are slightly shorter than the enclosure). Second, to provide some extra support (after gluing, rib layers are perpendicular to enclosure layers). Printing them separately may be unnecessary overkill (there is also a version of the enclosure and ribs in one piece, which requires some extra support to print, but not much), but gluing them is easy enough so&#8230; why not.Â The little clip (top right) is for holding the LiPo cell in place, and is also glued inside the main enclosure. Â It&#8217;s printed separately to eliminate the need for supportÂ (and, at the prototyping stage, also make itÂ a little easierÂ to try different battery sizes, without having to re-print the whole thing or do separate test-prints).</p>
<p>One part of the design that does require a lot of support is the opening for the display. Â I entertained the idea of printing the main enclosure in three vertical sections (and gluing them together), but eventually decided against it. Printing that successfully took a bit of trial and error. Â I use both Cura and Slic3r. Â For most parts I used Slic3r (mainly becauseÂ it produces smoother outer perimeters, and also integrates better with Octoprint). Â However, for the life of me, I haven&#8217;t managed to print supports that break off easily. Â Even with the new pillar mode, most parts are fine, except one part somewhere that&#8217;s just too close to the print to separate! Â Cura, on the other hand, always does an excellent job with supports.</p>
<p>Finally, when designing cases like this, one of the (many!) things I like about open-source hardware is that I can download the PCB layout and get precise component positions and dimensions; no calipers and almost-there test prints! Â Sometimes it&#8217;s the little things&#8230;</p>
<p>You will note, however, that there are holes to insert hex nuts, which are visible from the outside and would have been rather ugly (you don&#8217;t see exposed fasteners in &#8220;real&#8221; products). Â Which brings me to the next trick.</p>
<p><strong>Friction welding: dos and don&#8217;ts.</strong>Â  I first heard about friction welding through Make magazine&#8217;s excellent <a title="Skill Builder - Finishing and Post-Processing Your 3D Printed Objects -- Make:" href="http://makezine.com/projects/make-34/skill-builder-finishing-and-post-processing-your-3d-printed-objects/">article on 3D print post-processing</a>Â and since then it has become one of my favorite techniques.Â I&#8217;ve seen a few tutorials on YouTube about friction welding plastics using a rotary tool. Â However, at least the ones I found, seem to be from people who recentlyÂ learned the technique themselves and are excited to share it. Â I wish Make: had placed more emphasis on this (it would have saved me several failed attempts), but <strong>do not skip step 2c (pre-heating the surfaces); this is crucial!</strong>Â  And, no matter what you do, <strong>do not immediately press the spinning, cold filament onto the cold piecesÂ </strong>(as some of these tutorials appear to suggest), since you&#8217;ll most likely gouge them. Â An alternative I&#8217;ve found to pre-heating with a heat gun is to <strong>use friction itself to do the preheating</strong>. Initially, just barely touch the spinning filament onto the plastic surfaces (not on the metal). Â Without applying any pressure, <strong>wait until you see a tiny bit of plastic start flowing</strong>. Â Only then gradually increase the pressure and start moving the filament, to keep a consistent flow. Â Also, if blobs form on the tip of the filament, it&#8217;s best to stop and lightly spin itÂ against some sandpaper to clean them off.</p>
<p><strong>Embedding nuts with friction welding.Â </strong>Using friction welding to embed nuts is a trick I came upon by accident. Â When I was building my <a title="Kossel - RepRapWiki" href="http://reprap.org/wiki/Kossel">Kossel</a>-based printer, I overtighened the screws holding the rods to the effector, stripping the cutouts for the nylocs. Â I was too lazy/impatient to print another effector, so I just quickly filled the gaps using friction welding. Â I&#8217;m still using that effector, which has held the nuts very nicely for over a year (and after havingÂ taken the effector apart several times, to tweak various things).</p>
<p>I now regularly use this technique to also hold magnets and, generally, anything inserted that needs to stay put. Â Superglue is the easiest, but it develops stress cracks and invariably fails over time (and, if you&#8217;re thinking threadlocker, don&#8217;t: it will craze the plastic, especially ABS). Â Next easiest is using a soldering iron to press the nuts/items into the plastic, which is I use very often (I regularly design all my holes undersized and do this anyway). Â However: (i) you can&#8217;t use it on non-metal items; (ii) you can&#8217;t use it on magnets (the necessary heat will demagnetize them); (iii) if you don&#8217;t have a steady hand, you may loosenÂ the hole enough to cause the part to fall out eventually, even if it seems fine at first. Â Friction welding takes a bit more time, but it&#8217;s the best solution I&#8217;ve found so far and it&#8217;s also very easy after just a little bit of Â practice. Â I haven&#8217;t tried threaded inserts yet. The McMaster-Carr &#8220;heat-set inserts for plastics&#8221; (it appears their site does not support direct linking!?)Â that <a href="https://www.youtube.com/watch?v=iGNXHWPFAKo&amp;t=113s">Werner Berry uses</a>Â look really nice and I&#8217;ve been itching to try them, but that&#8217;s another piece of hardware I need to keep around.</p>
<p>Another nice thing is that you can use this trick to embed blind nuts that are not visible from the outside. Â This is a trick that is rather obvious (once you&#8217;ve done all the above :). Â First, insert the nuts (I used the soldering iron) and make sure the surface is flat (lightly file, if necessary):</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="643" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/insert1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?fit=1353%2C1522" data-orig-size="1353,1522" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441436393&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="insert1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?fit=910%2C1024" class="alignnone wp-image-643" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?resize=384%2C432" alt="insert1" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert1.jpg?w=1353 1353w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a>Â <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="642" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/insert2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?fit=1210%2C1361" data-orig-size="1210,1361" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441438722&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="insert2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?fit=910%2C1024" class="alignnone wp-image-642" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?resize=384%2C432" alt="insert2" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert2.jpg?w=1210 1210w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p>Make sure that the fastener axis is oriented properly (if not, adjust). Â Then, fully thread the holes from the outside. Â Use a proper tap (not a screw) to cut threads, especially for finer pitches. Â Do not skip this step (more later).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="641" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/insert3/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?fit=1354%2C1523" data-orig-size="1354,1523" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441436954&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="insert3" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?fit=910%2C1024" class="alignnone wp-image-641" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?resize=384%2C432" alt="insert3" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert3.jpg?w=1354 1354w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a>Â <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="640" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/insert4/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?fit=1350%2C1519" data-orig-size="1350,1519" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441437374&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="insert4" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?fit=910%2C1024" class="alignnone wp-image-640" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?resize=384%2C432" alt="insert4" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/insert4.jpg?w=1350 1350w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p>Finally, apply molten plastic, starting from the outside (i.e., touching the perimeter of the hole, plastic-to-plastic) and working your way towards the center. Â Once you&#8217;re done (if you do it right, you should end up with a very clean-looking plug, without any gouges or streaks), lightly file to make the surface flat.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="645" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/weld1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?fit=1483%2C1668" data-orig-size="1483,1668" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441441886&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="weld1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?fit=910%2C1024" class="alignnone wp-image-645" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?resize=384%2C432" alt="weld1" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld1.jpg?w=1483 1483w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a>Â <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="644" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/weld2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?fit=1519%2C1709" data-orig-size="1519,1709" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441442621&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;125&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="weld2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?fit=910%2C1024" class="alignnone wp-image-644" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?resize=384%2C432" alt="weld2" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/weld2.jpg?w=1519 1519w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p>Done! Now the nuts are not visible from the outside, and you have a very clean finish. Â Additional advantages of this approach: you do not need easy access to the hole from the fastener side (in this enclosure it would have been very difficult to insert the nuts and/or tap the holes from the inside), and you can use a regular taper or plug tap (rather than a bottom tap).</p>
<p><strong>3D-print finishing.</strong>Â Although I often like the surface finish of 3D printed layers, in this case I wanted a smoother, more &#8220;product-like&#8221; finish. Â Some time ago I bought some <a title="XTC-3D High Performance 3D Print Coating - SmoothOn" href="http://www.smooth-on.com/Epoxy-Coatings-XTC/c1397_1429/index.html">XTC-3D</a>Â and this was a good opportunity to play with it a little more. Â Overall, XTC works very well; especially on organic/curved shapes, you&#8217;re pretty much done after applying. Do follow the instructions about applying very thin coats (it <em>will</em> even out, even if it does not look like it at first). Â However, in this case (no pun intended) there were two issues. First, I used an older printer (a Solidoodle 2; my Kossel is not yet set up for long ABS prints) which has significant banding. XTC is good, but it&#8217;s not magic; I did some initial sanding (and cleaning with denatured alcohol) before applying the XTC resin. Â Second, on large flat surfaces, you will get some minor unevenness and some tiny bubbles here and there.Â Light sanding (with a sanding block!) will address most of these issues, but in some places you may need to use a little filler. Â One-part Bondo spot putty is sufficient for this. Â Apply it generously, and after it is dry, sand most of it off (it sands very easily). Â Do wait for it to set, though. Â Especially on thick coats, the manufacturer&#8217;s recommended set time (25 minutes) may not be sufficient; rule of thumb is to wait until it turns light pink <em>everywhere</em> and then wait some more.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="648" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/bondo1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?fit=1396%2C1571" data-orig-size="1396,1571" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441534573&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;40&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="bondo1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?fit=910%2C1024" class="alignnone wp-image-648" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?resize=384%2C432" alt="bondo1" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo1.jpg?w=1396 1396w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a>Â <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="649" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/bondo2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?fit=1721%2C1936" data-orig-size="1721,1936" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441542837&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;50&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="bondo2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?fit=910%2C1024" class="alignnone wp-image-649" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?resize=384%2C432" alt="bondo2" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/bondo2.jpg?w=1721 1721w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p>All things considered, XTC-3D works great (unfortunately, I forgot to take pictures after applying just the XTC-3D). It definitely beats sanding (substantially reducing it), as well as two-part body fillers (which I haven&#8217;t used with prints, but I&#8217;ve used in <a title="Custom-fabricated tweeter pods - bitquill" href="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/">another project</a>Â a long time ago). Â And for smaller surfaces or organic shapes, you&#8217;re pretty much done after applying.</p>
<p><strong>Spray painting.</strong>Â I&#8217;m very new at this; I did it once in the past (again forÂ <a title="Custom-fabricated tweeter pods - bitquill" href="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/">this project</a>) and, surprisingly, it had gone very smoothly. Â I still don&#8217;t know why (maybe too much false confidence?), but it&#8217;s always the <em>second</em> time that gets you burned, isn&#8217;t it? Â To cut the long story short, I learned about the difference between lacquers and enamels (simplifying, the first just dry by evaporation, the second cure by reacting with air), got distracted by paint chemistry (if you&#8217;re curious look, e.g., <a href="http://www.essentialchemicalindustry.org/materials-and-applications/paints.html">here</a> orÂ <a href="http://www.chemistryislife.com/the">here</a>, and if you&#8217;re <em>really</em> curious <a href="http://nzic.org.nz/ChemProcesses/polymers/10D.pdf">try this</a>), and found the following paint compatibility chart, which is worth it&#8217;s weight in gold:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="662" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/paint-compatibility/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?fit=305%2C480" data-orig-size="305,480" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="paint-compatibility" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?fit=191%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?fit=305%2C480" class="alignnone wp-image-662 size-full" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?resize=305%2C480" alt="paint-compatibility" width="305" height="480" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?w=305 305w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint-compatibility.png?resize=191%2C300 191w" sizes="auto, (max-width: 305px) 100vw, 305px" /></a><br />
(original <a href="http://www.rcgroups.com/forums/showthread.php?t=1140128">credit</a> and <a href="http://static.rcgroups.net/forums/attachments/6/3/9/3/8/a2868077-38-comp%20chart.JPG">image</a>)</p>
<p>Furthermore, in the past I had used Krylon, which is not available at big box storesÂ (we have one two blocks from home)Â so I decided to try Rustoleum instead. Â Although people are often happier with Rustoleum (and, these days, they&#8217;re also cheaper), for the life of me I couldn&#8217;t get an even spray with their nozzles. Maybe they work well on large items like chairs and tables, or maybe it&#8217;s my (lack of) technique, but on this small enclosure I couldn&#8217;t get even coverage, and always got spots with too much paint (not enough to cause drips, but enough to affect the surface finish). More importantly, Rustoleum takes forever to dry and, if you&#8217;re doing your spraying in all sorts of weird places with temporary setups (we live in an apartment), that&#8217;s an issue.</p>
<p>So, I wiped it all off (tip perhaps worth sharing: I found that, at least if the paint hasn&#8217;t completely cured, white spirit works well and it doesn&#8217;t attack the plastic at all), went to an auto parts store, and got some Krylon. Â I think their newer non-rotating nozzles spray a bit more like a firehose (just have to live with overspray), but other than that, the second attemptÂ went pretty well.</p>
<p>I chose a satin finish both because I like it, and also because it&#8217;s a bit more forgiving with improper spraying distance (you can err on keeping the nozzle too far from the surface, and it won&#8217;t have an ill effect, within reason). Skipping the intermediate steps (nothing to be proud of :), here is the end result &#8212; not bad for a rookie:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="650" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/paint3/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?fit=1721%2C1936" data-orig-size="1721,1936" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441616936&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="paint3" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?fit=910%2C1024" class="alignnone wp-image-650" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?resize=384%2C432" alt="paint3" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint3.jpg?w=1721 1721w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a> <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="652" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/paint2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?fit=1199%2C1349" data-orig-size="1199,1349" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441616916&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="paint2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?fit=910%2C1024" class="alignnone wp-image-652" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?resize=384%2C432" alt="paint2" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint2.jpg?w=1199 1199w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="653" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/paint1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?fit=1544%2C1737" data-orig-size="1544,1737" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441616909&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="paint1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?fit=910%2C1024" class="alignnone wp-image-653" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?resize=384%2C432" alt="paint1" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint1.jpg?w=1544 1544w" sizes="auto, (max-width: 384px) 100vw, 384px" />Â <img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="651" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/paint4/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?fit=1605%2C1806" data-orig-size="1605,1806" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441616924&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;40&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="paint4" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?fit=910%2C1024" class="alignnone wp-image-651" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?resize=384%2C432" alt="paint4" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/paint4.jpg?w=1605 1605w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p><strong>Putting it together.</strong>Â The last bits were easy: soldering headers on the Thing (whatever fits in the enclosure, some straight and some raised right-angle pins) and on the display module. Â Also, the right-angle JST header soldered onto the Thing wouldn&#8217;t work in this enclosure (the LiPo wire collides with the endcap), so I desoldered it and replaced it with a vertical JST header. Â Finally, I had to solder a wire to the reset pads on the Digole module (the reset signal is not broken out, but it&#8217;s accessible through an unpopulated reset pushbutton).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="654" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/digole/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?fit=1890%2C1063" data-orig-size="1890,1063" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441617000&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="digole" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?fit=1024%2C576" class="alignnone wp-image-654" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?resize=768%2C432" alt="digole" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/digole.jpg?w=1890 1890w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>&nbsp;</p>
<p>After fiddling with the screws (long nose pliers and balldrive Allen keys FTW!) and wires, the mechanical assembly was done &#8212; whewww!</p>
<p><strong>Epic fail(s).</strong>Â So far I&#8217;ve omitted an epic fail from the story. Â The enclosure shown above is actually the second attempt. Â The first one ended up in disaster, all within a couple of hours. Â The first attempt was printed in PLA. Â First fail and lesson: PLA really does melt under the sun, and it takes less than you&#8217;d think. Â I sprayed the endcaps first and temporarily set them down on a cardboard on top of a metalÂ outdoorÂ table under the sun. Â In the few minutes it took me to spray the first coat on the main enclosure, the encaps had seriously warped! Â You can see this in the picture on the left (and that is after I spent half an hour re-shaping them with a temperature-controlled hot air gun at low heat!). Â The second fail was even worse: when I did the first attempt, I did not have an M2 tap, so I decided to use M2 screwsÂ (and oversize tap diameter). Â Unfortunately, this does not cut the threads properly, and the screws still meet substantial resistance. Â Since the nuts will never beÂ <em>perfectly</em> aligned, when inserting the screws from the inside what happened was what you see on the left photo. Doh!</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="656" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/fail1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?fit=1493%2C1680" data-orig-size="1493,1680" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441718954&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;50&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="fail1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?fit=910%2C1024" class="alignnone wp-image-656" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?resize=384%2C432" alt="fail1" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail1.jpg?w=1493 1493w" sizes="auto, (max-width: 384px) 100vw, 384px" />Â <img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="655" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/fail2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?fit=1721%2C1936" data-orig-size="1721,1936" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1441718971&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;50&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="fail2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?fit=910%2C1024" class="alignnone wp-image-655" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?resize=384%2C432" alt="fail2" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/fail2.jpg?w=1721 1721w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p>So, definitely use a tap to properly cut threads (or, make the holes <em>really</em> oversize, and make sure you clean any molten plastic if you use a soldering iron). Furthermore, measuring your fastener lengths twice and hand-tightening them is not a bad idea either.</p>
<p>You may also notice that the finish here is a little glossier; that&#8217;s what happens when you over-apply paint and/or spray from too close.</p>
<p>Finally, to top it all off, I hadn&#8217;t realized that the standoffs for the RTC module where on the wrong side (double-doh!) and when test-fitting it also turned out that the wires I had crimped were a couple of cm too short. Oh well, it had been a while since I had an epic fail like this! :)</p>
<p><strong>Protocol sniffing.</strong>Â On to the software part. Â First thing was to reverse-engineer the WiFi bulbs&#8217; protocol. Â It appears that, although there are several variants of the hardware that look identical, not all of them run the same protocol (e.g., see links in sniffing notes on GitHub). Â I&#8217;m not even sure all are made my the same OEM (FWIW, MAC vendor lookup on my bulbs saysÂ <a href="http://www.hi-flying.com/">Hi-flying Electronics</a>). Of course, none of these protocols are published, but all of them are very similar and quite simple. Â In my case, since I&#8217;m running OpenWRT on our router, I just installed <code>ngrep</code> and sniffed the iOS app&#8217;s traffic. Â <del>I&#8217;m pretty sure it&#8217;s possible to sniff traffic even if you don&#8217;t have access to the router (but I didn&#8217;t have to find out).</del> Â <strong>Edit:</strong> Root access on the router makes sniffing much easier (otherwise you&#8217;ll probably need a sniffer on your tablet/phone).</p>
<p>For on and off commands, I can just copy them verbatim. Â For commands to set color, the structure is easy to figure out. Â First is an opcode byte, followed by RGBW values (the bulbs have both RGB as well as warm-white LEDs, and it seems you can turn on either one or the other), a constant(?), and a checksum byte. Nothing too fancy.</p>
<p>The iOS app uses UDP broadcast for bulb discovery (that protocol is also easy to figure out). Â This step does take some time (and was one of the annoyances with the user experience, since this information is not cached by the iOS app). Â However, after that, all communication happens over TCP. Â To keep things simple, I decided to skip the device discovery step (at least for now), and just assign fixed hostnames/IPs to the bulbs.</p>
<p><strong>Firmware.</strong>Â  The firmware is fairly standard stuff. It&#8217;s written using the <a title="esp8266/Arduino - GitHub" href="https://github.com/esp8266/Arduino">ESP port of Arduino</a> (many thanks, <a title="igrr - GitHub" href="https://github.com/igrr">@igrr</a> et al!), and it currently occupies about 70% of the Thing&#8217;s flash.</p>
<p>First, the display driver and UI code. Touch handling uses a combination of interrupts to detect the first touch, and then polling and debouncing to detect finger down/move/up events, and update the UI accordingly (this is probably the most complex bit here, and it&#8217;s actually pretty simple). Â While at it, I did a <a title="spapadim/Digole - GitHub" href="https://github.com/spapadim/Digole">gratuitous rewrite</a> of the Digole library, inspired by a <a title="PDQ_GFX optimzed AVR LCD graphics - Hackaday.io" href="http://hackaday.io/project/6038">very cool hack</a> I had seen. Â Then NTP client, WiFi bulb client, and a webserver for configuring the device over a web browser. Â Settings are stored in &#8220;EEPROM&#8221; (which, on the ESP, is just a sector of the flash memory). Â The web UI is pretty simple for now:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="657" data-permalink="http://bitquill.net/blog/esp8266-light-controller-clock/web-screen/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?fit=800%2C733" data-orig-size="800,733" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="web-screen" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?fit=300%2C275" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?fit=800%2C733" class="alignnone wp-image-657" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?resize=768%2C704" alt="web-screen" width="768" height="704" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?w=800 800w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/09/web-screen.png?resize=300%2C275 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Arduino on ESP has <a href="https://github.com/esp8266/Arduino/tree/esp8266/hardware/esp8266com/esp8266/libraries">a great set of libraries</a> for networking stuff, which makes all this quite easy! I&#8217;m using basic Bootstrap and Knockout.js to make it look a little pretty. I decided to write a proper HTML5 frontend and a simple REST API (using the excellent <a title="bblanchon/ArduinoJson - GitHub" href="https://github.com/bblanchon/ArduinoJson">ArduinoJson library</a>).Â However, upon first boot, the device has no Internet access. Â If it fails to connect to WiFi, the firmware will switch the device to AP mode, so initial configuration can be done over WiFi. Â Since the flash chip is not large enough to store Bootstrap and Knockout locally, there is a separate, minimal UI (not shown) that uses regular HTML forms (no AJAX) and just allows setting the SSID and password.</p>
<p>One problemÂ (that I eventually worked around, rather than solved) was getting the Digole module to talk back to the ESP. Â I2C was a fail (and it wasted me a couple of days; still not sure if the problem is on the display&#8217;s end or with the Arduino&#8217;s clock stretching implementation, or something else) and SPI I didn&#8217;t really try. I finally got UART to work (except that you <a href="http://www.esp8266.com/viewtopic.php?f=24&amp;t=2822">can&#8217;t turn off</a> the ESP&#8217;s 78Kbaud boot messages, hence the need for accessing the reset signal on the Digole). Â The downside is that now reflashing the firmware is a PITA (I have to fiddle inside the case, to disconnect the display and connect my FTDI), but that happens relatively infrequently (the display stuff is mostly done, and the network stuff I test on a spare Thing first).</p>
<p><strong>Conclusion.</strong>Â After all this, I think the result isÂ not bad for a completely home-made device. Could I have gotten a used Chumby for a comparable price (they go for about <a title="The Chumby Store" href="http://www.thechumbystore.com/">$60 used</a>), or just used an old/cheap Android tablet (and perhaps just 3D print a stand)? Â Aside from the Chumby service&#8217;s <a title="Chumby - History - Wikipedia" href="https://en.wikipedia.org/wiki/Chumby#History">ups and downs</a>&#8230; sure, but where&#8217;s the fun in that? :) Â Also, there is no way to reduce the cost of these alternatives down to $13.</p>
<p>What&#8217;s next? Well, you may have noticed there is a zipcode setting. That&#8217;s for weather information (planning to use OpenWeatherMaps, which returns reasonably-sized responses &#8212; parsing anything more than 1KB, <em>maybe</em> 2KB, is probably a bit iffy). Â Also, a web UI to control the lamps would be nice (the REST API endpoints are there, just need to get around to writing and refactoring the HTML bits). Â Maybe adapt the whole thing to aÂ cheaper display module (as discussed in the beginning; I&#8217;ve already started a port of theÂ ucglib library to the ESP, but need an actual device to finish it). Finally,Â one could perhapsÂ re-write it in Lua (<a title="nodemcu/nodemcu-firmware - GitHub" href="https://github.com/nodemcu/nodemcu-firmware">NodeMCU</a>?) with support for pluggable modules (a-la true Chumby). That probably won&#8217;t be me, though; by that time, I&#8217;m pretty sure a new hack will have &#8220;distracted&#8221; me. :)</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&amp;linkname=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fesp8266-light-controller-clock%2F&#038;title=Week-long%20hack%3A%20ESP8266%20touchscreen%20WiFi%20light%20controller%20and%20clock" data-a2a-url="http://bitquill.net/blog/esp8266-light-controller-clock/" data-a2a-title="Week-long hack: ESP8266 touchscreen WiFi light controller and clock"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/esp8266-light-controller-clock/#comments" thr:count="9" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/esp8266-light-controller-clock/feed/atom/" thr:count="9" />
			<thr:total>9</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Comparing data storage options in Python]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/comparing-data-storage-options-in-python/" />

		<id>http://bitquill.net/blog/?p=504</id>
		<updated>2016-05-12T19:26:53Z</updated>
		<published>2015-07-22T12:49:27Z</published>
		<category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="Python" />
		<summary type="html"><![CDATA[When it comes to numerical computing, I always gave in to the unparalleled convenience of Matlab, which I think is the best IDE for that purpose. Â If your data consists of matrices or vectorsÂ andÂ fits in main memory, it&#8217;s very hard to beat Matlab&#8217;s smooth workflow for interactive analysis and quick iteration. Â Also, with judicious use [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/comparing-data-storage-options-in-python/"><![CDATA[<p>When it comes to numerical computing, I always gave in to the unparalleled convenience of Matlab, which I think is the best IDE for that purpose. Â If your data consists of matrices or vectorsÂ andÂ fits in main memory, it&#8217;s very hard to beat Matlab&#8217;s smooth workflow for interactive analysis and quick iteration. Â Also, with judicious use of MEX, performance is more than good enough. Â However, over the past two years, I&#8217;ve been increasingly using Python (with numpy, matplotlib, scipy, ipython, and scikit-learn), for three reasons: (i) I&#8217;m already a big Python fan; (ii) it&#8217;s open-source hence it&#8217;s easier for others to reuse your code; and (iii) more importantly, it can easily handle non-matrix data types (e.g., text, complex graphs) and has a large collection of libraries for almost anything you can imagine. Â In fact, even when using Matlab, I had a separate set of scripts to collect and/or parse raw data, and then turn it into a matrix. Â Juggling bothÂ Python and Matlab code can get pretty messy, so why not do everything in Python?</p>
<p>Before I continue, let me say that,Â yes, I know Matlab has cell arrays and even objects, but still&#8230; you wouldn&#8217;t really use Matlab for e.g., text processing or web scraping.Â Yes, I know Matlab has distributed computing toolboxes, but I&#8217;m only considering main memory here; these days 256GB RAM is not hard to come by and that&#8217;s good enough for 99% of (non-production) data exploration tasks. Finally, yes, I know you can interface Java to Matlab, but that&#8217;s still two languages and two codebases.</p>
<p>Storing matrix data in Matlab is easy. Â The .MAT format works great, it is pretty efficient, and can be used withÂ almost any language (including Python). Â At the other extreme, arbitrary objects can be stored in Python as pickles (the de-facto PythonÂ standard?), however (i) they are notoriously inefficient (even with cPickle), and (ii) they are not portable. Â I could perhaps live with (ii), but (i) is a problem. Â At some point, I tried out SqlAlchemy (on top of sqlite) which is quite feature-rich, but also quite inefficient, since it does a lot of things I don&#8217;t need. I had expected to pay a performance penalty, but hadn&#8217;t realized how large until measuring it. Â So, I decided to do some quick-n-dirty measurements of various options.</p>
<p><span id="more-504"></span></p>
<p>The goal was to compare Python overheads (due to the interpreted nature of Python, the GIL, etc etc), not raw I/O performance. Â Furthermore, I&#8217;m looking for a simple data storage solution, not for a distributed, fault-tolerant, scalable solution (so DHTs, column stores, etc like memcached, Riak, Redis, HBase, Cassandra, Impala, MongoDB, Neo4j, etc etc etc, are out). Â Also, I&#8217;m looking for something that&#8217;s as &#8220;Pythonic&#8221; as possible and with reasonably mature options (so I left things like LevelDB and Tokyo Cabinet out). Â And, in any case, <strong>this is not meant to be an exhaustive list (or a comprehensive benchmark, for that matter); I had to stop somewhere.</strong></p>
<p>In the end, I ended up comparingÂ the following storage options:</p>
<ul>
<li>sqlite: Load rows as tuples, directly using the sqlite DB-API interface.</li>
<li>sqlite-obj:Â Similar, but also convert loaded tuples into Python objects (one member variable per column).</li>
<li>sqlalchemy-core: Load rows as tuples, using SqlAlchemy core (on top of sqlite) instead of DB-API directly.</li>
<li>sqlalchemy-orm: Use the full-blown ORM and session features from SqlAlchemy (on top of sqlite).</li>
<li>csv: CSV files, manually parsed (file iteration and string split).</li>
<li>csv-numpy: CSV files parsed using the I/O functions in numpy.</li>
<li>cpickle: Store records as tuples, using cPickle.</li>
<li>cpickle-obj: Store records as Python objects (one member variable per column), using cPickle.</li>
<li>zodb: ZOPE object store, using BTrees.</li>
<li>pytables: A library for tabular data built on top of HDF5.</li>
<li>h5py: Another, lower-level library for HDF5 files.</li>
</ul>
<p>Furthermore, I also wanted to get an idea of how easily Python code can be optimized. Â In the past, I&#8217;d hand-coded C extensions when really necessary, I had played a little bith with cython, and I had heard of PyPy (but never tried it). Â So, while at it, I also consideredÂ the following Python implementations and tools:</p>
<ul>
<li>cpython: Â The usual implementation of Python.</li>
<li>cython: Python extension that allows compiling to C extensions; no substantial benefit compared to cpython (at least without investing major effort: I only annotated some of the loop variables, the rest of the code was unmodified), so results are omitted.</li>
<li>pypy: Python JIT compiler; some libraries won&#8217;t run on this, so those are missing from the results.</li>
</ul>
<p>The dataset used was very simple, consisting of five columns/fields of random floating point numbers (so the data are, hopefully, incompressible), with sizes of up to 500M records. Â The dataset size is quite modest, but should be sufficient for the goals stated above (comparing relative Python overheads, not actual disk I/O performance). File sizes (relative to sqlite, again) are shown below. Â For the record, the &#8216;raw&#8217; data (500,000 rec x 5 floats/rec x 8 bytes/float) would have stood at 0.74, same as pytables which has zero overhead (well, 64KB to be exact); sqlite has a 36% overhead. Â ZODB size includes the index, but that&#8217;s just 2.7% of the total (caveat: although records were only added, never deleted, I&#8217;m not familiar with ZODB and didn&#8217;t check if I should still have done any manual garbage collection).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="619" data-permalink="http://bitquill.net/blog/comparing-data-storage-options-in-python/filesizes/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?fit=650%2C244" data-orig-size="650,244" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="filesizes" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?fit=300%2C113" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?fit=650%2C244" class="alignnone wp-image-619" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?resize=460%2C173" alt="filesizes" width="460" height="173" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?w=650 650w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/07/filesizes.png?resize=300%2C113 300w" sizes="auto, (max-width: 460px) 100vw, 460px" /></a></p>
<p>Runs were performed on a machine with an ext4-formatted Samsung EVO850 1TB SSD, Ubuntu 14.04LTS and, FWIW, a Core i7-480K at 3.7GHz. RAM was 64GB and, therefore, the buffercache wasÂ more than large enough to fit all dataset sizes. Â One run was used to warm up the cache, and results shownÂ are from a second run. Â Note that, particularly in this setting (i.e., reading from memory), many (most?) of the libraries appear to beÂ CPU-bound (due to serialization/deserialization and object construction overheads), not I/O-bound. Â I cautiously say &#8220;appear to be&#8221; since this statement is based on eyeballing &#8220;top&#8221; output, rather than any serious profiling.</p>
<p>For full disclosure, here&#8217;sÂ <a href="http://bitquill.net/blog/wp-content/uploads/2015/06/pybench.zip">a dump of theÂ source files and timing data</a>, provided as-isÂ (so, caveat: far from release quality, not intended for reuse,Â really messy, undocumented, etc etcâ€”some bits need to be run manually through an iPython prompt and/or commented-in/commented-out, don&#8217;t ask me which, I don&#8217;t remember :). If, however, anyone finds anything stupid there, please do let me know.</p>
<p>First a sanity check, wall clock time vs. dataset size is perfectly linear, as expected:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="505" data-permalink="http://bitquill.net/blog/comparing-data-storage-options-in-python/wall-time-1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?fit=644%2C464" data-orig-size="644,464" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="wall-time-1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?fit=300%2C216" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?fit=644%2C464" class="alignnone wp-image-505" style="margin-left: 40px;" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?resize=450%2C324" alt="Wall-clock time vs dataset size" width="450" height="324" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?w=644 644w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/wall-time-1.png?resize=300%2C216 300w" sizes="auto, (max-width: 450px) 100vw, 450px" /></a></p>
<p>The next plot shows average wall-clock time (over all dataset sizes) for both cpython and pypy, normalized against that of rawÂ sqlite with cpython:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="510" data-permalink="http://bitquill.net/blog/comparing-data-storage-options-in-python/time-bar-1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?fit=691%2C404" data-orig-size="691,404" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="time-bar-1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?fit=300%2C175" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?fit=691%2C404" class="alignnone wp-image-510" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?resize=480%2C281" alt="time-bar-1" width="480" height="281" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?w=691 691w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-1.png?resize=300%2C175 300w" sizes="auto, (max-width: 480px) 100vw, 480px" /></a></p>
<p>As usual, I procrastinated several weeks before posting any of this. In the meantime, I added a second EVO850 and migrated from ext4 toÂ btrfs with RAID-0 for data and LZO compression. Â Out of curiosity I reran the code. Â While at it, I added ZODB to the mix. Here are the results (cpython only, normalized against sqlite on btrfs):</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="515" data-permalink="http://bitquill.net/blog/comparing-data-storage-options-in-python/time-bar-2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?fit=718%2C404" data-orig-size="718,404" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="time-bar-2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?fit=718%2C404" class="alignnone wp-image-515" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?resize=480%2C270" alt="time-bar-2" width="480" height="270" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?w=718 718w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/time-bar-2.png?resize=300%2C169 300w" sizes="auto, (max-width: 480px) 100vw, 480px" /></a></p>
<p>Pytables is, oddly, faster! Â For completeness, here are the speedups observed with striping across two disks, vs a single disk.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="516" data-permalink="http://bitquill.net/blog/comparing-data-storage-options-in-python/raid-speedup/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?fit=688%2C364" data-orig-size="688,364" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="raid-speedup" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?fit=300%2C159" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?fit=688%2C364" class="alignnone wp-image-516" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?resize=460%2C243" alt="raid-speedup" width="460" height="243" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?w=688 688w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/05/raid-speedup.png?resize=300%2C159 300w" sizes="auto, (max-width: 460px) 100vw, 460px" /></a></p>
<p>Remember that these are (or should be) hot buffercache measurements, so disk I/O bandwidth should not matter, only memory bandwidth. Â Not quite sure what is going on here; I don&#8217;t believe PyTables uses multiple threadsÂ in its C codeÂ (and, even if it did, why would the number of threads depend on the&#8230; RAID level??). Â Maybe some profiling is in order (and, if you have any ideas, please let me know).</p>
<p><strong>Comparing Python implementations.</strong>Â Woah, look at PyPy go! Â When it works, it really works. Â SeeÂ SqlAlchemy go from being 2.5x slower when using the low-level APIs or 25x slower with all the heavyweight ORM machinery, to almost directly competitive with raw sqlite or 6x slower (a 4x speedup), respectively. Â Similarly, manual object re-construction on top of raw sqlite now has negligible overhead. Â However, most libraries unfortunately do not (yet) run on PyPy. Â More importantly, the frameworks I need for data analysis also do not support PyPy (I&#8217;m aware there is a special version of NumPy, but matplotlib, SciPy, etc areÂ still far from being compatible). Â Also, I&#8217;m not quite sure why pickles were noticeably slower with PyPy.</p>
<p><strong>Comparing data formats.</strong> Sqlite is overall the most competitive option. Â This is good; you can never really go wrong with a relational data format, so it should serve as a generalÂ basis. PyTables is also impressively fast (it&#8217;s pretty much the only option that beats raw sqlite, for this simple table of all-floats). Â Finally, I was somewhat surprised that NumPy&#8217;s CSV I/O is that slow (yes, it has to deal with all the funky quotation, escapes, and formatting variations, and CSV text is not exactly a high-performance format, but still&#8230;).</p>
<p>For the time being, I&#8217;ll probably stick with sqlite, but get rid of the SqlAlchemy ORM bits that I&#8217;ve been using (or, perhaps, keep them for small datasets). The nice thing is that I can keep my data files and perhaps look for a better abstraction layer than DB-API, but the sqlite &#8220;core&#8221; itself appears reasonably efficient. Eventually, however, I&#8217;d like to have something like the relationship feature of the ORM (but without all the other heavyweight machinery for sessions, syncing, etc), so I can easily persist graph data, with arbitrary node and edge attributes (FWIW, I currentlyÂ use NetworkX once the data is loaded; I know it&#8217;s slow, but it&#8217;s very Pythonic and convenient, and I rarely resort to iGraph or other libraries, at least so farâ€”but that&#8217;s another story).</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&amp;linkname=Comparing%20data%20storage%20options%20in%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fcomparing-data-storage-options-in-python%2F&#038;title=Comparing%20data%20storage%20options%20in%20Python" data-a2a-url="http://bitquill.net/blog/comparing-data-storage-options-in-python/" data-a2a-title="Comparing data storage options in Python"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/comparing-data-storage-options-in-python/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/comparing-data-storage-options-in-python/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Household hacks with a 3D printer]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/household-hacks-with-a-3d-printer/" />

		<id>http://www.bitquill.net/blog/?p=411</id>
		<updated>2016-05-12T19:28:33Z</updated>
		<published>2015-07-03T18:02:03Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="CAD" /><category scheme="http://bitquill.net/blog" term="Hacks" />
		<summary type="html"><![CDATA[I&#8217;m often asked &#8220;what is aÂ 3D printer good for, isn&#8217;t it just a novelty&#8221;? Â So here are some examples of household hacks, in no particular order. Â I&#8217;ve chosen examples that satisfy two criteria. Â First, it didn&#8217;t take me more than an hour to whip up the CAD model (and, in many cases, it took just [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/household-hacks-with-a-3d-printer/"><![CDATA[<p>I&#8217;m often asked &#8220;what is aÂ 3D printer good for, isn&#8217;t it just a novelty&#8221;? Â So here are some examples of household hacks, in no particular order. Â I&#8217;ve chosen examples that satisfy two criteria. Â First, it didn&#8217;t take me more than an hour to whip up the CAD model (and, in many cases, it took just 10-15 minutes), so it qualifies as a &#8220;quick hack&#8221;. Â Second, it&#8217;s of general household use, so mechanical assemblies, 3D printer parts, etc, were left out. Â Some of these are published on <a title="spapadim's designs - Thingiverse" href="http://www.thingiverse.com/spapadim/designs">Thingiverse</a> (linked from the post headings).</p>
<h4>Eyeglass frame fix</h4>
<p>This is one of my favorites. Â It was one of the quickest to make, but it was usedÂ a lot. Â My mother has her favorite eyeglasses and is loath to change them. Â However, over time, the arm loosened and they would constantly slide down her nose. Tightening the screws didn&#8217;t do anything anymore. So, I quickly designed a clip that slides over the frame, and has a tapered nub to apply pressure to the arm (printed in ABS, so it has some flexibility). Â Guess you could call it an &#8220;eyeglass arm pretensioner attachment&#8221;. Â She&#8217;s been using them for years, and asked for a pack, in case she looses one (printing a set of six takes about 15 minutes; the example in the photo is an early print in black, instead of brown).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="589" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/eyeglass-fix-composite/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?fit=2360%2C1328" data-orig-size="2360,1328" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1376851061&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.28&quot;,&quot;iso&quot;:&quot;640&quot;,&quot;shutter_speed&quot;:&quot;0.066666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="eyeglass-fix-composite" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?fit=1024%2C576" class="alignnone wp-image-589" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?resize=768%2C432" alt="eyeglass-fix-composite" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/eyeglass-fix-composite.jpg?w=2000 2000w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p><span id="more-411"></span></p>
<h4>Â IKEA cheese plate fix</h4>
<p>Moving on to something I was loath to change: an IKEA cheese plate, which IKEA has long since stopped selling in the US (I guess cheese isn&#8217;t such a daily staple here, so it probably didn&#8217;t sell well). Â In fact, I did try to find a replacement, but failed. Â Unfortunately, one of the times it was dropped, one of the handles broke. Â Since it&#8217;s made out of polypropylene, it was impossible to glue. Â So, here&#8217;s what I did: I traced the outline of the handle with a pen on paper, then scanned it, and then digitally traced it using InkScape, and inset the inner long edge (so the cover could fit nicely; see photo inset). Â Saved as DXF, imported into OpenSCAD, and a quick ((scale + extrude) &#8211; extrude) expression gave the CAD model for what you see below (outer shell &#8211; inner volume that slides onto the remaining handle). Printed, and.. perfect fit! Â We still use this.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="590" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/cheeseplate-composite/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?fit=2502%2C1407" data-orig-size="2502,1407" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1435239328&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;40&quot;,&quot;shutter_speed&quot;:&quot;0.0083333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="cheeseplate-composite" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?fit=1024%2C576" class="alignnone wp-image-590" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?resize=768%2C432" alt="cheeseplate-composite" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cheeseplate-composite.jpg?w=2000 2000w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><a title="Customizable replacement clip for folding shopping cart - Thingiverse" href="http://www.thingiverse.com/thing:127776">Shopping cart replacement clip</a></h4>
<p>Long time ago, we bought a folding shopping cart from Amazon. Â These are great, except for one thing: the little plastic clip that holds it in the folded position has a tendency to fallÂ off. Â We finally lost the clip on the way to the supermarket. Â Unfortunately, you can&#8217;t buy just the clip, and without it the cart won&#8217;t stay folded. Â But, with a 3D printer, the solution is easy enough: measure the wire diameter with calipers, then a union of two cylinders and a cuboid, minus two cylinders and another two cuboids for the insertion cutouts, and&#8230; done! Â In the photo, I quickly printed an arrow onÂ a label printer, to indicate the side with the slightly wider cutout (easier to insert/remove, the other one is a very tight fit, in hopes that the replacement won&#8217;t fly offÂ as often). Â Printed in ABS for a little flexibility, works better than the original!</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="584" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/cart-clip1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?fit=768%2C432" data-orig-size="768,432" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cart-clip1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?fit=768%2C432" class="alignnone size-full wp-image-584" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?resize=768%2C432" alt="cart-clip1" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?w=768 768w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/cart-clip1.jpg?resize=300%2C169 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4>Cat door and latch</h4>
<p>We don&#8217;t allow our cat in the bedrooms, but with the doors constantly closed, I sometimes felt like a prisoner. Â So I decided to try making a &#8220;cat barrier door&#8221;. Â I wanted this to fit outside the door proper, and be as minimally invasive to the door frame as possible. I used mosquito net frame extrusions and wire mesh to make the &#8220;door&#8221; (it needed to be strong enough for just a cat, so that was fine). Â I used Japanese double hinges to mount it, and 3D printed clips to hold the hinges to the frame (easy: a difference of two cuboids to make a Î -shaped solid that fits over the frame, and is wide enough for the hinge plates). Â I also needed a latch, but unfortunately I couldn&#8217;t find one that would sit flush enough to the frame. Â So, I designed one: two parts make the casing,Â leavingÂ a hollow channelÂ where a third piece (with the latch tongue) slides up-and-down, tensioned by a small spring. Â A quick spray with teflon lubricant made it slide super-nicely. Â A pair of cheap neodymium magnets (one on the frame, one on the latch) hold the door closed. Â  Works great, strong enough for a cat (but humans did accidentally break it a couple of times; no big deal, you can always hit &#8220;print&#8221; for a replacement).</p>
<p>The barrier door worked fine for the cat for several months. However, once my daughter grew up, she figured out how to open it (but was too young to understand thatÂ she should close it again), so the cat would come in. Â Hence, I have since removed it, and don&#8217;t have any pictures of it mounted. Â Instead, here is a render of the CAD models.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="600" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/hinge-latch-render-annot/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?fit=1744%2C800" data-orig-size="1744,800" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="hinge-latch-render-annot" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?fit=300%2C138" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?fit=1024%2C470" class="alignnone wp-image-600" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?resize=768%2C352" alt="hinge-latch-render-annot" width="768" height="352" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?resize=1024%2C470 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?resize=300%2C138 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/hinge-latch-render-annot.png?w=1744 1744w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><a title="Customizable door hook hanger - Thingiverse" href="http://www.thingiverse.com/thing:102974">Door hanger hooks</a></h4>
<p>We always had hooks over doors, to hang stuff (e.g., towels in the bathroom). Â However, our current apartment has doors which are nice and solid but, unfortunately, much wider than most. Â So none of the hooks we had would fit, and I couldn&#8217;t find anything that would fit in any of the usual places (Target, Home Depot, Amazon, etc). Â So&#8230; I just printed one. Â While at it, I made the CAD model parametric (aka &#8220;customizable&#8221;), so people could easily adapt it to their door (or to other <a href="http://www.thingiverse.com/thing:162934">inventive uses</a>!). Â Although a very simple model (ok, it might have taken a little more than an hour to parameterize it, but not much more), it is also my <a href="http://www.thingiverse.com/thing:102974/#remixes">most remixed</a> design.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="592" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/door-hook/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?fit=768%2C480" data-orig-size="768,480" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="door-hook" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?fit=300%2C188" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?fit=768%2C480" class="alignnone size-full wp-image-592" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?resize=768%2C480" alt="door-hook" width="768" height="480" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?w=768 768w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/door-hook.jpg?resize=300%2C188 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><a title="Clip-on feet for play yard fence (North States Superyard) - Thingiverse" href="http://www.thingiverse.com/thing:110986">Play yard fence legs</a></h4>
<p>When my daughter was really young, we got one of those accordion-style play-yard fences. Â We used it to separate a section of the living room, with a long, straightÂ stretch of the fence. Â Some members of the family were concerned that this longÂ stretch wasÂ too wobbly. Â So, I quickly whipped up these support legs, which tightly clip onto the fence&#8217;s frame. Â Obviously they don&#8217;t provide structural support if someone were to, e.g., climb the fence (just saying&#8230; :), but they did stop the wobble and rattle quite successfully.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="585" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/fence-leg1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?fit=1024%2C576" data-orig-size="1024,576" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="fence-leg1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?fit=1024%2C576" class="alignnone wp-image-585" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?resize=768%2C432" alt="fence-leg1" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?w=1024 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/fence-leg1.jpg?resize=300%2C169 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><a title="IKEA Besta rail stop - Thingiverse" href="http://www.thingiverse.com/thing:152146">IKEA Besta rail stops</a></h4>
<p>An easyÂ &#8220;baby safety hack&#8221;: when my daughter less than a year old, she discovered a game: slamming the IKEA Besta sliding doors. Â In order to prevent her from doing that (and pinching her finger), I quickly measured the aluminium channel dimensions, and made a tab that twists on tightly. Â Took a test print and minor re-iteration to get it tight enough. Â Works great, very unobtrusive.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="586" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/besta-clip/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?fit=1024%2C576" data-orig-size="1024,576" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="besta-clip" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?fit=1024%2C576" class="alignnone wp-image-586" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?resize=768%2C432" alt="besta-clip" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?w=1024 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/besta-clip.jpg?resize=300%2C169 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><a title="Customizable simple door stop (pinch guard) - Thingiverse" href="http://www.thingiverse.com/thing:218233">Door stop pinch guard</a></h4>
<p>Yet another &#8220;baby safety hack&#8221;: A plastic piece that slides into the door lock hole, and has a protrusion long enough to prevent the door from closing. Â That was for when my daughter was a few months older than for the previous hack, and discovered the game of slamming room doors. Â I remember that I actually whipped up this CAD model while holding my daughter on my lap (trying to prevent her from slamming the doors), in something like 10 minutes (later, I added a small hole on the handle, so we could tie a string andÂ hang the thing fromÂ the door frame).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="587" data-permalink="http://bitquill.net/blog/household-hacks-with-a-3d-printer/doorstop2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?fit=1024%2C576" data-orig-size="1024,576" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="doorstop2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?fit=1024%2C576" class="alignnone wp-image-587" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?resize=768%2C432" alt="doorstop2" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?w=1024 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/doorstop2.jpg?resize=300%2C169 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h4><span style="font-size: 1em;">Other things</span></h4>
<p>The above selection is rather random, and far from exhaustive. Â Other quick hacks that come to mind, and not shown above: ethernet switch wall-brackets, embossed name tags for daycare, replacement water bottle cap,Â a customized shape-sorter toy, a slide-on button cover for a Nexus 7 (to prevent babies from hitting the home button and getting upset :), replacement tube guard-cage for a headphone tube amp, etc. I&#8217;m sure there are more that I forget.</p>
<p>Of course, there are also &#8220;hacks&#8221; that either took much longer than a few minutes to design (mostly stuff that needs to fit existing parts tightly, which takes a bit of trial-and-error, with a few test prints and re-iterations), or are relatively special-purpose. Â For example, various enclosures (for, e.g., <a title="Moderately-easy enclosure for Solidoodle - Thingiverse" href="http://www.thingiverse.com/thing:115998">3D printer</a>, <a title="Cubieboard NVR case - Thingiverse" href="http://www.thingiverse.com/thing:151160">home-brew network video recorder</a>,Â <a title="Yet another BusPirate v3.6 case - Thingiverse" href="http://www.thingiverse.com/thing:431167">BusPirate</a>, <a title="Manufacturing @ Home: A rechargeable near-field mic, (almost) from scratch - bitquill.net" href="http://bitquill.net/blog/?p=489">near-field mic</a>),Â <a title="Yet-yet another power supply cover - Thingiverse" href="http://www.thingiverse.com/thing:258715">PSU covers</a>,Â <a title="Porta-Pi Button Panel Cover - Thingiverse" href="http://www.thingiverse.com/thing:334157">button faceplates</a>,Â <a title="Low-profile knob (cabinet, drawer - parametric) - Thingiverse" href="http://www.thingiverse.com/thing:258437">drawer knobs</a>, <a title="Customizable mitre box for extrusions (e.g., OpenBeam) - Thingiverse" href="http://www.thingiverse.com/thing:287740">mitre box</a>, variousÂ <a title="Kossel Rod Jig for OpenBeam - Thingiverse" href="http://www.thingiverse.com/thing:291455">jigs</a>, OpenBeam cable clips, spool rollers and <a title="Customizable solidoodle alternative snap spool holder - Thingiverse" href="http://www.thingiverse.com/thing:91477">holders</a>,Â <a title="Customizable iPhone 5 car dock - Vent / CD - Thingiverse" href="http://www.thingiverse.com/thing:116044">iPhone dock</a> for my car, adjustable clamp-on iPad stand for stationary exercise equipment,Â etc.</p>
<p>Finally, there are a number of things that I did not design myself but I found on the web. Â Some examples that we use all the time are aÂ <a title="Swiss Army style keychain version 2 - Make by spapadim - Thingiverse" href="http://www.thingiverse.com/make:40666">cool &#8220;keychain&#8221;</a>,Â <a title="Universal laptop stand - Make by spapadim - Thingiverse" href="http://www.thingiverse.com/make:51871">laptop stand</a>, <a title="Baby Jogger City Series Extra Bag clip - Thingiverse" href="http://www.thingiverse.com/thing:85143">stroller clips</a>, <a title="Customizable Bag Clip - Thingiverse" href="http://www.thingiverse.com/thing:46290">bag clips</a>, <a title="Customizable solder spool holder - Thingiverse" href="http://www.thingiverse.com/thing:105814">solder spool holder</a>, etc etc. Â Then, we naturally also do plastic toys and trinkets (the &#8220;novelty&#8221; aspect, which has been a hit with my daughter&#8230; those <a title="Squirrel - Make by spapadim - Thingiverse" href="http://www.thingiverse.com/make:102559">cute darn squirrels</a>, for example). And, of course, I <em>had</em> to use the printer to build.. <em>another</em> printer (isn&#8217;t that what everyone with a 3D printer uses it for, sooner or later? :) It&#8217;s a modified <a title="Kossel - RepRapWiki" href="http://reprap.org/wiki/Kossel">Kossel</a>, which has been working great for the last year; perhaps <em>some</em> day I&#8217;ll post about thatÂ &#8220;adventure&#8221;. :)</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&amp;linkname=Household%20hacks%20with%20a%203D%20printer" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fhousehold-hacks-with-a-3d-printer%2F&#038;title=Household%20hacks%20with%20a%203D%20printer" data-a2a-url="http://bitquill.net/blog/household-hacks-with-a-3d-printer/" data-a2a-title="Household hacks with a 3D printer"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/household-hacks-with-a-3d-printer/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/household-hacks-with-a-3d-printer/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Manufacturing @ Home: A rechargeable near-field mic, (almost) from scratch]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/manufacturing-home/" />

		<id>http://bitquill.net/blog/?p=489</id>
		<updated>2016-05-12T19:58:50Z</updated>
		<published>2015-06-24T20:04:12Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="CAD" /><category scheme="http://bitquill.net/blog" term="Hacks" /><category scheme="http://bitquill.net/blog" term="PCB" />
		<summary type="html"><![CDATA[Some time ago I backed the W-Ear kit on Kickstarter. Â Even though they also offer the option of a fully assembled, rechargeable version, I opted for the through-hole kit, which went for much less and also shipped much earlier. Â I was originally planning to just 3D print an enclosure, instead of using an Altoids tin. [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/manufacturing-home/"><![CDATA[<p>Some time ago I backed the <a class="ext-link" title="Wear -- A wearable personal assistive listening device" href="https://www.kickstarter.com/projects/771490867/wear-a-wearable-personal-assistive-hearing-device">W-Ear kit on Kickstarter</a>. Â Even though they also offer the option of a fully assembled, rechargeable version, I opted for the through-hole kit, which went for much less and also shipped much earlier. Â I was originally planning to just 3D print an enclosure, instead of using an Altoids tin. Â However, on a whim, I decided to take this a bit further, because&#8230; why not?</p>
<p><strong>TL;DR:</strong> I went from the PCB on the left, to the device on the right, without ever leaving home. Design files are available <a title="LiPo Controller for W-Ear" href="http://bitquill.net/trac/wiki/Hacks/WEar">here</a>Â (caveat: I&#8217;m not an EE, but I sometimes play one on the web! :).</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-pcb.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone wp-image-551" title="PCB from W-Ear Kickstarter kit" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-pcb.jpg?resize=384%2C432" alt="PCB from W-Ear Kickstarter kit" width="384" height="432" /></a>&nbsp;<a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="555" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-final1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?fit=678%2C762" data-orig-size="678,762" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1435167038&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;2.15&quot;,&quot;iso&quot;:&quot;160&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="wear-final1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?fit=678%2C762" class="alignnone wp-image-555" title="Device in use" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?resize=384%2C432" alt="Device in use" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?w=678 678w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final1.jpg?resize=267%2C300 267w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p><span id="more-489"></span></p>
<p>In addition to the plastic enclosure (designed and 3D printed at home), I also added a boost converter and a LiPo charge controller, so that the device can run off a LiPo battery and can be recharged via a standard micro-USB port. Â These days a computer, the right tools, a fair amount of googling, and some common sense go a long way. MuchÂ of this is possible by standing on the shoulders of open source, both software (e.g., <a href="http://www.openscad.org/">OpenSCAD</a> and <a href="http://slic3r.org/">Slic3r</a>) and hardware (e.g., <a title="Adafruit Industries - GitHub" href="https://github.com/adafruit">Adafruit&#8217;s designs</a>). Â Also, CAD and common data formats make it easy to manufacture components, from circuits, to enclosures, to mechanical assemblies (example of this in another post), with just a few mouse clicks (e.g., with a 3D printer or through online services likeÂ <a href="https://oshpark.com/">OSHPark</a>). Â Just, say, five years ago, very little of this would be as easy as it is today. Â Even Jonathan Jaglom, son of Stratasys&#8217;s chairman and CEO of Makerbot, <a href="https://www.youtube.com/watch?t=276&amp;v=j69gK3OwAUk&amp;t=270">seems to recognize this</a>Â (via <a href="http://hackaday.com/2015/06/16/ask-hackaday-and-adafruit-the-new-ceo-of-makerbot/">Hackaday</a>), although he doesn&#8217;t actually say the &#8220;o&#8221; (for opensource) word.</p>
<p><strong>Measuring things out.</strong> Instead of getting off-the-shelf breakout boards and jamming them in a large enclosure, I decided to streamline everything onto a single PCB, which would fit the overall round shape of the W-Ear.Â First, I needed precise dimensions of the W-Ear PCB. Â Some information (microphone and mounting hole locations) is available on the W-Ear website, but I also needed the board outline and component locations to make the add-on LiPo PCB fit as tightly as possible. Â Therefore, I scanned the W-Ear PCB on a flatbed scanner, and traced the outlines using <a href="https://inkscape.org/en/">Inkscape</a> (an opensource vector drawing application). Â After marking the locations of taller components (capacitors, transistor, and LM386 IC), I also drew the add-on board outline, saved it as DXF, and <a href="http://www.element14.com/community/thread/21171/l/import-dxf-file-in-eagle-pro-620?displayFullThread=true">imported</a> it into <a href="http://www.cadsoftusa.com/eagle-pcb-design-software/">Eagle</a>.</p>
<p><strong>Designing the voltage regulator and charge controller PCB.</strong> Working with the W-Ear PCB imposed some constraints that are somewhat artificial, the most important of which isÂ that supply voltage needs to be 9V. Â The LM386-4 has a minimum supply voltage of 5V, and I also wasn&#8217;t sure if the rest of the microphone array circuit would work properly with anything different. Â A single-cell LiPo supplies about 3.7V, so a voltage converter was necessary. Â I decided to go with the MIC2288, and basically copied the datasheet example circuit (including component placement guidelines, as much as possible).</p>
<p>Next, I needed a charge controller for the LiPo battery. Â Adafruit has several, and I chose <a href="https://github.com/adafruit/MCP73833">one of their older designs</a>, based on theÂ MCP73833 IC. Â Since this is open source hardware, I could download the schematic, tweak it for my needs (e.g., remove a few headers I didn&#8217;t need, change some resistors and thermistors, and switch to an MSOP package so it&#8217;s easier to hand-solder), and then lay out my custom PCB. Â Isn&#8217;t that nice? Â In the meantime, I had chosen a couple of LiPo cells off of EBay, and had them shipped from China. Â Finally, I laid out the PCB, using the traced board outline and leaving empty space for the LiPo.</p>
<p>In the meantime, I also soldered the W-Ear board and printed my charge controller PCB on paper and cut it out, to make sure that the outline was correct and that it would fit snugly around the various components. Â AfterÂ tweaking the outline&#8217;s cutouts by a few fractions of a mm here and there,Â I shipped the design files off to OSHPark, to have a set of three prototype boards made. Â Here are the bare boards (including the add-on fix; see below):</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="557" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-charger-pcb/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?fit=1520%2C855" data-orig-size="1520,855" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1435166822&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="wear-charger-pcb" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?fit=1024%2C576" class="alignnone wp-image-557" title="Bare boards from OSHPark" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?resize=768%2C432" alt="Bare boards from OSHPark" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charger-pcb.jpg?w=1520 1520w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p><strong>Designing the enclosure.</strong> While I was waiting for those to arrive (it takes about 10-14 days), I started designing the 3D printed enclosure, using the actual W-Ear PCB and the paper mockup of my PCB. Â I made the enclosure&#8217;s cAD design parametric (e.g., total height, slack around the board, position and size of microphone, LED, and socket cutouts, etc), so I could easily tweak it. Â A couple of test prints later, I was almost done. Â The enclosure measures 79mm in diameter (basically constrained by the diameter of the W-Ear PCB), and 19.5mm thick, which is significantly thinner than would have been possible with the originally supplied 9V battery.Â  I was actually surprised to realize that the total height is constrained by the electrolytic caps, not by my extra PCB + LiPo &#8220;sandwich&#8221;! Â Much better than I had expected.</p>
<p>One thing that bothered me was the <em>huge</em>Â volume knob that shipped with the W-Ear kit, so I quicklyÂ designed and 3D printed a smaller, nicer-looking one. Finally, somewhere at this point, I placed an order for all the necessary SMD components from DigiKey (these arrive quickly, in just a couple of days).</p>
<p>If you haven&#8217;t worked with 3D printing before, it can be like magic at first, but for me it&#8217;s now almost routine. Â Although there are a number of details in designing a CAD model like this, I&#8217;m glossing over them. Here is a render of the final CAD model for all enclosure pieces:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="543" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-render/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?fit=888%2C500" data-orig-size="888,500" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="wear-render" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?fit=888%2C500" class="alignnone wp-image-543" title="Enclosure CAD model render" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?resize=768%2C432" alt="Enclosure CAD model render" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?w=888 888w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-render.png?resize=300%2C169 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>&nbsp;</p>
<p>PCB mounting standoffs are part of the enclosure, and the tabs on the back cover (tapered, to make them less likely to break) are meant to hold the LiPo cell in place.</p>
<p><strong>Assembly and initial testing.</strong> When everything arrived in the mail, I was ready to put together and test. Â I assembled the charge controller board using hot air reflow soldering. Â If you&#8217;re interested, there are several example videos on YouTube; here is <a title="EEVblog #346 - MLF/QFN SMD Reflow Soldering" href="https://www.youtube.com/watch?v=M_rO6oPVsws">one by Dave Jones</a>, demonstrating on much smaller and trickier (QFN instead of MSOP) components than I used. Â Everything fit together almost perfectly (except for the battery&#8217;s JST connector that protruded by about 0.5mm, which was easy enough to trim). Â The &#8220;measure twice (or thrice, or more), cut once&#8221; mantra paid off, as usual.</p>
<p><strong>Working around ripple issues.</strong>Â  The circuit worked correctly the first time, much to my surprise (can you tell I have no EE training, or anything beyond high-school physics when in comes to circuits &#8212; e.g., see the redundant caps&#8230; :). Â Except for one thing, whichÂ I hadÂ feared: there was too much ripple on the switching regulator&#8217;s output, and the W-Ear requires a very clean power supply. Â After some googling, it seems I had two options: (i) design an appropriate output filter, or (ii) add a linear LDO regulator after the switching regulator. I decided against the first option, for two reasons. Â First, it would probably take too much time (days?) and trial-and-error to get a clue on filter design. Â Second, I wasn&#8217;t entirely sure that, even after all that, I&#8217;d get a passive low-pass filter with components small enough to fit in the enclosure. Â Therefore, I searched DigiKey for an appropriate LDO, and came up with the ADP7102, which has a very high power-supply rejection ratio (PSRR; a term I hadn&#8217;t even heard of before :) and could probably serve as a kind of active filter in this case, I guess. Â It ain&#8217;t cheap, but that wasn&#8217;t a concern, since this is a one-off circuit, mainly for fun.</p>
<p>Getting the PCB done from scratch would cost quite a bit, so I decided to make a tiny add-on board (basically, a breakout for the ADP7102, plus the datasheet-recommended input and output caps), which could be soldered onto the main board with a pin header. Â So, instead of paying $29 for another batch of the entire board, I paid only $1.5. Â SMD components made the add-on small enough to stay below the top of the LiPo battery. Â I designed this tiny board quickly and shipped the files off to OSHPark, once again. Â When the boards came back, I assembled them (hot air reflow again), changed the feedback resistor on the switching regulator to increase itsÂ output voltage by about 0.2-0.3V (to compensate for the dropout), and put everything together. And it actually worked! Â No more hiss and distortion. Â Here&#8217;s what the final assembly looks like:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="537" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-assembly/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?fit=2048%2C1152" data-orig-size="2048,1152" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;5.6&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;DMC-GX1&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1419527122&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;20&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.05&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="wear-assembly" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?fit=300%2C169" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?fit=1024%2C576" class="alignnone wp-image-537" title="Final assembly" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?resize=768%2C432" alt="Final assembly" width="768" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?resize=1024%2C576 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?resize=300%2C169 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-assembly.jpg?w=2048 2048w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Almost everything you see in the picture (except the green printed circuit) was designed and manufactured &#8220;at home&#8221; (or at least without leaving it)! Â Yay for opensource and CAD.</p>
<p>There is one more shortcoming in the design: the switching+linear regulator portion is always enabled, and quiescent current is enough to kill battery within a few days, even if the W-Ear is switched off. Â However, I didn&#8217;t want (or, rather, I was afraid?) to touch the W-Ear circuit in any way (e.g., tapping into it&#8217;s volume potentiometer&#8217;s on-off switch). Â I can live with this anyway.</p>
<p>The finishing touch was a piece of paracord (cut to length, inserted into the enclosure&#8217;s holes for it, then knotted and slightly melted with a lighter to make it stay put), so the finished device could be worn around the neck. Â Mission accomplished!</p>
<p><strong>Conclusion.</strong>Â  This side-project was completed over time during the summer of 2014. If I had to guess how long it would have takenÂ if I&#8217;d worked exclusively on this, I&#8217;d say less than a week (excluding the time waiting for PCBs, but including time spent googling, learning, and collecting all necessary information). Is this a finished product, or even production-ready? Â No, but it&#8217;s a pretty darn convincing prototype (and would have been even more so if I hadn&#8217;t been too lazy to apply a coat of <a href="http://www.smooth-on.com/Epoxy-Coatings-XTC/c1397_1429/index.html">XTC-3D</a>Â and spraypaint; one of these days :).Â More so if you considerÂ that itÂ was done in a short period of time, by someone who has no formal training in design or EE, largely by re-using opensource designs on the web, and relying on freely available tools! Â And all of this without ever leaving home, and withoutÂ any major investments in equipment! Â Not bad.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="566" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-charging/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?fit=1456%2C1638" data-orig-size="1456,1638" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1435175928&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;3.3&quot;,&quot;iso&quot;:&quot;250&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="wear-charging" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?fit=910%2C1024" class="alignnone wp-image-566" title="Device charging (and charge status indicators)" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?resize=384%2C432" alt="Device charging (and charge status indicators)" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?resize=910%2C1024 910w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?resize=267%2C300 267w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-charging.jpg?w=1456 1456w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a>Â <a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="556" data-permalink="http://bitquill.net/blog/manufacturing-home/wear-final2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?fit=667%2C750" data-orig-size="667,750" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad Air&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1435167042&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;2.15&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="wear-final2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?fit=267%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?fit=667%2C750" class="alignnone wp-image-556" title="Device in use" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?resize=384%2C432" alt="Device in use" width="384" height="432" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?w=667 667w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2015/06/wear-final2.jpg?resize=267%2C300 267w" sizes="auto, (max-width: 384px) 100vw, 384px" /></a></p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&amp;linkname=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fmanufacturing-home%2F&#038;title=Manufacturing%20%40%20Home%3A%20A%20rechargeable%20near-field%20mic%2C%20%28almost%29%20from%20scratch" data-a2a-url="http://bitquill.net/blog/manufacturing-home/" data-a2a-title="Manufacturing @ Home: A rechargeable near-field mic, (almost) from scratch"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/manufacturing-home/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/manufacturing-home/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Quick hack: visualizing RBF bandwidth]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/quick-hack-visualizing-rbf-bandwidth/" />

		<id>http://bitquill.net/blog/?p=494</id>
		<updated>2015-05-12T17:27:07Z</updated>
		<published>2015-05-12T17:27:07Z</published>
		<category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="Classification" /><category scheme="http://bitquill.net/blog" term="Hacks" /><category scheme="http://bitquill.net/blog" term="Linear algebra" /><category scheme="http://bitquill.net/blog" term="Machine learning" /><category scheme="http://bitquill.net/blog" term="Python" /><category scheme="http://bitquill.net/blog" term="Teaching" /><category scheme="http://bitquill.net/blog" term="Visualization" />
		<summary type="html"><![CDATA[A few weeks ago, I was explaining the general concepts behind support vector machineÂ classifiers. and kernels. Â The majority of the audience has no background in linear algebra, so I had to rely on a lot of analogies and pictures. Â I had previously introduced the notions of decision function and decision boundary (the zero-crossing of the [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/quick-hack-visualizing-rbf-bandwidth/"><![CDATA[<p>A few weeks ago, I was explaining the general concepts behind <a title="Support Vector Machine - Wikipedia" href="http://en.wikipedia.org/wiki/Support_vector_machine">support vector machine</a>Â classifiers. and <a title="Kernel method - Wikipedia" href="http://en.wikipedia.org/wiki/Kernel_method">kernels</a>. Â The majority of the audience has no background in linear algebra, so I had to rely on a lot of analogies and pictures. Â I had previously introduced the notions of decision function and decision boundary (the zero-crossing of the decision function), and described dot products, projections, and linear equations, as simply as possible.</p>
<p>The overview ofÂ SVMs was centered around the observations that the decision function is, eventually, a weighted additive superposition (linear combination) of evaluations of &#8220;things that behave like projections in a higher-dimensional space via a non-linear mapping&#8221; (kernel functions) over theÂ support vectors (a subset of the training samples, chosen based on the idea of &#8220;fat margins&#8221;).</p>
<p>Most of the explanations and pictures were based on linear functions, but I wanted to give an idea of what these kernels look like, how their &#8220;superposition&#8221; looks like, and how kernel parameters vary the picture (and may relate to overfitting). Â  For that I choseÂ <a title="Radial basis function - Wikipedia" href="http://en.wikipedia.org/wiki/Radial_basis_function" target="_blank">radial basis functions</a>. I found myself doing a lot of handwaving in the process, until I realized that I could whip up an animation. Â Following that class, I had 1.5 hours during another midterm, so I did that (Python with <a title="Matplotlib.org - Main page" href="http://matplotlib.org/">Matplotlib</a> <a title="Matplotlib.org - Animation examples (with code)" href="http://matplotlib.org/1.4.2/examples/animation/index.html">animations</a>, FTW!!). Â The result follows.</p>
<p>Here is how the decision boundary changes as the bandwidth becomes narrower:</p>
<p><iframe loading="lazy" src="https://www.youtube.com/embed/RtajnP3tGsc?rel=0&amp;controls=0&amp;showinfo=0" width="480" height="360" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>For large radii, there are a fewer support vectors and kernel evaluations cover a large swath of the space. Â As the radii shrink, all points become support vectors, and the SVM essentially devolves into a &#8220;table model&#8221; (i.e., the &#8220;model&#8221; is the data, and only the data, with no generalization ability whatsoever).</p>
<p>This decision boundary is the zero-crossing of the decision function, which can also be fully visualized in this case. Â One way to understand this is that the non-linear feature mapping &#8220;deforms&#8221; the 2D-plane into a more complex surface (where, however, we can still talk about &#8220;projections&#8221;, in a way), in such a way that I can still use a plane (z=0) to separate the two classes. Â Here is how that surface changes, again as the bandwidth becomes narrower:</p>
<p><iframe loading="lazy" src="https://www.youtube.com/embed/MxUy7hKIU8c?rel=0&amp;controls=0&amp;showinfo=0" width="480" height="360" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Finally, in order to justify that, for this dataset, a really large radius is the appropriate choice, I ran the same experiments with multiple random subsets of the training data and showed that, for large radii, the decision boundaries are almost the same across all subsets, but for smaller radii, they start to diverge significantly.</p>
<p>Here is theÂ <a href="http://bitquill.net/blog/wp-content/uploads/2015/03/source_py.zip">source code</a>Â I used (warning: this is raw and uncut, no cleanup for release!). Â One of these days (or, at least, by next year&#8217;s class) I&#8217;ll get around to making multiple concurrent, alpha-blended animations for different subsets of the training set, to illustrate the last point better (I used static snapshots instead) and also give a nice visual illustration of model testing and ideas behind cross-validation; of course, feel free to play with the code. ;)</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&amp;linkname=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fquick-hack-visualizing-rbf-bandwidth%2F&#038;title=Quick%20hack%3A%20visualizing%20RBF%20bandwidth" data-a2a-url="http://bitquill.net/blog/quick-hack-visualizing-rbf-bandwidth/" data-a2a-title="Quick hack: visualizing RBF bandwidth"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/quick-hack-visualizing-rbf-bandwidth/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/quick-hack-visualizing-rbf-bandwidth/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Towards laws of the 3D printable design web]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/" />

		<id>http://bitquill.net/blog/?p=424</id>
		<updated>2016-05-12T19:31:08Z</updated>
		<published>2014-06-25T04:54:48Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="Data mining" /><category scheme="http://bitquill.net/blog" term="Social media" /><category scheme="http://bitquill.net/blog" term="Social networks" />
		<summary type="html"><![CDATA[With theÂ explosive growth of 3D printing, and rapid manufacturing at the consumer level in general, physicalÂ objects can be designed and manipulated in a computer. However, like other forms of digital content (e.g., documents, software, music), this is only part of the story: digital representation also enables online sharing and collaboration (as Chris Anderson has pointed [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/"><![CDATA[<p>With theÂ explosive growth of 3D printing, and rapid manufacturing at the consumer level in general, physicalÂ objects can be designed and manipulated in a computer. However, like other forms of digital content (e.g., documents, software, music), this is only part of the story: digital representation also enables online sharing and collaboration (as Chris Anderson has pointed out). A prime example of the potential of all these technologies combined with online sharing and collaboration is the initial design of consumer-grade 3D printers themselvesÂ which, perhaps unsurprisingly, was what <a title="RepRap Project" href="http://reprap.org/wiki/RepRap" target="_blank">many early adopters of the technology used it for</a>. Â Considering that the rest of us is where those early adopters were five or more years ago, the future should be interesting.</p>
<p>Despite hearing about 3D printing daily, very few studies have looked at the digital content of physical things, and the processes that generate it. I collected data some time ago, and started off with <a title="Remix Web Visualization" href="http://bitquill.net/make/remix" target="_blank">this visualization</a>, which <a title="Thingiverse remix graph: visualizing the net of physical things" href="http://bitquill.net/blog/?p=285" target="_blank">I wrote about before</a>. A further initial analysis of the data has some interesting stories to tell.</p>
<p><span id="more-424"></span></p>
<p><em><strong>Exponential growth rates.</strong></em>Â  The total number of things over timeÂ (blue) exhibits an exponential growing, with a compound doubling timeÂ of 6.1 months. Furthermore, if we consider only remixes (green), thenÂ the growth rate far outpaces the overall rate, with a compoundÂ doubling time of 4.6 months. Consequently, the relative ratio of remixes is also growing at an exponential pace (red) and, although obviously this cannot continue forever, there is little evidence that the growth rate of remixing is abating (in fact, after the introduction of the ThingiverseÂ Customizer, which is excluded from this plot, the rate has picked up even further).</p>
<p style="text-align: center;"><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="459" data-permalink="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/thingiverse_growth_log/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?fit=616%2C389" data-orig-size="616,389" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="thingiverse_growth_log" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?fit=300%2C189" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?fit=616%2C389" class="wp-image-459 aligncenter" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?resize=554%2C350" alt="thingiverse_growth_log" width="554" height="350" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?w=616 616w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/thingiverse_growth_log.png?resize=300%2C189 300w" sizes="auto, (max-width: 554px) 100vw, 554px" /></a></p>
<div class="page" title="Page 2">
<div class="layoutArea">
<div class="column">
<p><strong><span style="font-style: italic;">Popularity: views vs. likes vs. makes</span></strong><span style="font-style: italic;"><strong>.</strong>Â Â </span>The following table summarizes the results ofÂ least-squares regression on measures of user actions, showingÂ the top-3 best predictive features (\(p &lt; 0.01\), ranked by \(t\)-test scores) with 95% confidence intervals of the correspondingÂ regression coefficients, as well as the bottom-2 worst features.</p>
</div>
</div>
</div>
<table border="0">
<thead>
<tr>
<th>Variable</th>
<th>Best predictors</th>
<th>Worst predictors</th>
</tr>
</thead>
<tbody>
<tr>
<td>\(\mathit{\#Views}\)</td>
<td>\(\mathit{\#Likes}\!: 43.1\text{&#8211;}44.6, \mathit{\#DLs}\!: 0.35\text{&#8211;}0.38, \mathit{\#Views}&#8217;\!: 0.28\text{&#8211;}0.31\)</td>
<td>\(\mathit{\#Make}&#8217;\, (p=0.48), \mathit{\#Remix}&#8217;\, (p=0.06)\)</td>
</tr>
<tr>
<td>\(\mathit{\#DLs}\)</td>
<td>\(\mathit{\#Likes}\!: 43.1\text{&#8211;}44.6, \mathit{\#DLs}\!: 0.35\text{&#8211;}0.38, \mathit{\#Views}&#8217;\!: 0.28\text{&#8211;}0.31\)</td>
<td>\(\mathit{\#Remix}\, (p=0.66), \mathit{\#Remix}&#8217;\, (p=0.51)\)</td>
</tr>
<tr>
<td>\(\mathit{\#Likes}\)</td>
<td>\(\mathit{\#Views}\!: 0.006, \mathit{\#Make}\!: 2.72\text{&#8211;}2.83, \mathit{\#Likes}&#8217;\!: 0.42\text{&#8211;}0.46\)</td>
<td>\(\mathit{\#Remix}&#8217;\, (p=0.59), Â \mathit{\#DLs}&#8217;\, (p=0.27)\)</td>
</tr>
<tr>
<td>\(\mathit{\#Makes}\)</td>
<td>\(\mathit{\#Likes}\!: 0.074\text{&#8211;}0.077, \mathit{\bf\#Files}\!: -0.13\text{&#8211;}0.11, \mathit{\#Makes}&#8217;\!: 0.28\text{&#8211;}0.33\)</td>
<td>\(\mathit{\#Remix}&#8217;\, (p=0.99), Â \mathit{\#DLs}&#8217;\, (p=0.51)\)</td>
</tr>
<tr>
<td>\(\mathit{\#Remix}\)</td>
<td>\(\mathit{\#Views}\!: 0.0003, \mathit{\bf\#Remix}&#8217;\!: 0.18\text{&#8211;}0.27, \mathit{\bf\#Sources}\!: 0.19\text{&#8211;}0.39\)</td>
<td>\(\mathit{\bf\#Make}&#8217;\, (p=0.71), Â \mathit{\#DLs}\, (p=0.66)\)</td>
</tr>
</tbody>
</table>
<p>The relative incidence of user actions depends on the relative effortÂ required to take those actions. Therefore, we observe that roughlyÂ (order of magnitude) 100 views &#8220;contribute&#8221; one like in our linearÂ models, and roughly 10 likes &#8220;contribute&#8221; a make. The first is notÂ particularly surprising. However, the fact that only 10\(\times\) likesÂ contribute a make seems to suggest that users are actively seekingÂ things, and have the means and motivation to actually <em>print</em>Â things that they have liked.</p>
<p>Another intuitive, in retrospect, observation is that the number ofÂ files has a <em>negative</em> effect on makes. This provides evidenceÂ for the hypothesis that simpler things (consisting of fewer parts) areÂ more likely to be made.</p>
<p><em><strong>Sublinearities and power-laws.</strong></em>Â  The first figure below shows the number of likes vs. makes, and the second figure shows views vs. likes (both smoothed using exponential-size buckets). Â The emerging relationships are thatÂ \(\mathit{\#Likes} \proptoÂ \mathit{\#Makes}^{0.70}\) and \(\mathit{\#Views} \proptoÂ \mathit{\#Likes}^{0.85}\). Â Similar relationships have been observed in other domains. Â However, if we look at remixes vs. makes, no such pattern emerges, which brings us to a last point.</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="462" data-permalink="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/likes-vs-makes-expbucket/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?fit=340%2C265" data-orig-size="340,265" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="likes-vs-makes-expbucket" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?fit=300%2C233" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?fit=340%2C265" class="alignnone wp-image-462" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?resize=238%2C186" alt="likes-vs-makes-expbucket" width="238" height="186" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?w=340 340w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/likes-vs-makes-expbucket.png?resize=300%2C233 300w" sizes="auto, (max-width: 238px) 100vw, 238px" /></a><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="463" data-permalink="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/views-vs-likes-expbucket/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?fit=352%2C265" data-orig-size="352,265" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="views-vs-likes-expbucket" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?fit=352%2C265" class="alignnone wp-image-463" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?resize=246%2C186" alt="views-vs-likes-expbucket" width="246" height="186" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?w=352 352w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/views-vs-likes-expbucket.png?resize=300%2C225 300w" sizes="auto, (max-width: 246px) 100vw, 246px" /></a><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="464" data-permalink="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/remix-vs-makes-expbucket/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?fit=352%2C265" data-orig-size="352,265" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="remix-vs-makes-expbucket" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?fit=352%2C265" class="alignnone wp-image-464" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?resize=246%2C186" alt="remix-vs-makes-expbucket" width="246" height="186" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?w=352 352w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/03/remix-vs-makes-expbucket.png?resize=300%2C225 300w" sizes="auto, (max-width: 246px) 100vw, 246px" /></a></p>
<p><em><strong>Popular vs. Generative.</strong></em> Â Perhaps the most surprising observation is that typical measures of generalÂ popularity have little relation to whether a thing is remixed or not:Â (i) makes are, in fact, the worst predictor of number of remixes (table and last figure above); and (ii) in fact, the number ofÂ remixes is a <em>bad</em> predictor of almost everything, <em>except</em>Â of other remixes (table above). This suggests thatÂ aspects of a design that make it broadly appealing are distinct fromÂ aspects that make it inspiring and, furthermore, agrees with theÂ author&#8217;s personal experience that following remix links is more usefulÂ when looking for ideas, than when looking for utilitarian or funÂ things to print.</p>
<p><em><strong>What next?</strong></em> Â As a &#8220;bonus&#8221;, here is a visualization of the evolution of the largest connected component of the remix graph (with Customizer outputs excluded). Â The last frame is essentially the same data as in our <a title="Remix Network Visualization (CC0)" href="http://bitquill.net/make/remix?cc=0" target="_blank">interactive visualization</a>. Â This video was hacked together using Matplotlib&#8217;s basicÂ animation facilities and layed out using a simple breadth-first traversal of the graph. Â Not as pretty as it canÂ be, but it still shows an interesting picture.</p>
<div style="width: 600px;" class="wp-video"><video class="wp-video-shortcode" id="video-424-1" width="600" height="450" preload="metadata" controls="controls"><source type="video/mp4" src="http://bitquill.net/blog/wp-content/uploads/2014/03/rxg_animation_slower2.mp4?_=1" /><a href="http://bitquill.net/blog/wp-content/uploads/2014/03/rxg_animation_slower2.mp4">http://bitquill.net/blog/wp-content/uploads/2014/03/rxg_animation_slower2.mp4</a></video></div>
<p>&nbsp;</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&amp;linkname=Towards%20laws%20of%20the%203D%20printable%20design%20web" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Ftowards-laws-of-the-3d-printable-design-web%2F&#038;title=Towards%20laws%20of%20the%203D%20printable%20design%20web" data-a2a-url="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/" data-a2a-title="Towards laws of the 3D printable design web"></a></p>]]></content>
		
		<link href="http://bitquill.net/blog/wp-content/uploads/2014/03/rxg_animation_slower2.mp4" rel="enclosure" length="306625" type="" />
			<link rel="replies" type="text/html" href="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/towards-laws-of-the-3d-printable-design-web/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Weekend hack: PortaPi arcade console]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/" />

		<id>http://bitquill.net/blog/?p=480</id>
		<updated>2016-05-12T19:32:29Z</updated>
		<published>2014-06-25T03:57:22Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Hacks" />
		<summary type="html"><![CDATA[Some time last January I decided to back theÂ PortaPiÂ onÂ KickStarter. This is a mini arcade cabinet, that runs several emulators, via the RetroPie project, on a Raspberry Pi. The kit arrived on time, and sometime in May I got around to assembling it. Â Here&#8217;s how it looks: The kit is great out of the box but, [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/"><![CDATA[<p>Some time last January I decided to back theÂ <a title="Porta-Pi Arcade Kit" href="http://www.retrobuiltgames.com/the-build-page/porta-pi-arcade-kit/" target="_blank">PortaPi</a>Â onÂ <a title="Porta-Pi on KickStarter" href="https://www.kickstarter.com/projects/2103217949/porta-pi-arcade-a-diy-mini-arcade-cabinet-for-rasp" target="_blank">KickStarter</a>. This is a mini arcade cabinet, that runs several emulators, via the RetroPie project, on a Raspberry Pi. The kit arrived on time, and sometime in May I got around to assembling it. Â Here&#8217;s how it looks:</p>
<p><a href="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="481" data-permalink="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/portapi/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?fit=769%2C1024" data-orig-size="769,1024" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="portapi" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?fit=225%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?fit=769%2C1024" class="alignnone wp-image-481" src="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?resize=385%2C512" alt="portapi" width="385" height="512" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?w=769 769w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2014/06/portapi.jpg?resize=225%2C300 225w" sizes="auto, (max-width: 385px) 100vw, 385px" /></a></p>
<p>The kit is great out of the box but, of course, I had to add some of my own tweaks. Â <span id="more-480"></span> First was varnishing, to make it look even prettier: pre-stain conditioner, then three coats of Minwax Red Oak stain, and finally four coats of polyurethane. Â Considering this was my second varnishing job ever (and the first in a decade), it went pretty well.</p>
<p>Next, I designed a 3D-printableÂ <a title="Porta-Pi Button Panel Cover (by spapadim)" href="http://www.thingiverse.com/thing:334157" target="_blank">button cover plate</a>Â for the monitor control panel, that sits in a cutout under the marquee and above the monitor. Â Nothing too fancy, but gets the job nicely done and makes the kit look even more clean.</p>
<p>Finally, a minor annoyance was that the Kickstarter version of the kit neededÂ two power supplies: one 12V for the display and audio amp, and another 5V for the Raspberry Pi. Â Furthermore, there was no power switch, so turning the cabinet off meant pulling two wart adaptors from the wall socket (the newer version uses 5V for everything but it still has no power switch, I believe). Â  For some time I had been looking for an excuse to design a microcontroller circuit from scratch, and also play with surface-mount (SMT) components, so I designedÂ a <a href="http://bitquill.net/trac/wiki/Hacks/MCUSwitch" target="_blank">smart power switch</a>Â board and. Got the PCBs made on <a title="OSHPark" href="https://oshpark.com/" target="_blank">OSHPark</a>, wrote the firmware using the Arduino libraries, and flashed the MCU using a <a title="Bus Pirate - DangerousPrototypes" href="http://dangerousprototypes.com/docs/Bus_Pirate" target="_blank">Bus Pirate</a>. Â Given that my PCB design education is 100% from Google, this went pretty well too. Â Now I have a single pushbutton that works ATX-style, and also all power is turned off when the Pi shuts down itself.</p>
<p>While at it, I added a physical volume control button, using the extra GPIO pins available on header P5, plus a simple Python daemon running on the Pi. Â All hardware and software is available <a href="http://bitquill.net/trac/wiki/Hacks/MCUSwitch" target="_blank">here</a>.</p>
<p>Now for some retro gaming (Keystone Kapers, 1941, Arkanoid&#8230; ah, the memories)!</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&amp;linkname=Weekend%20hack%3A%20PortaPi%20arcade%20console" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-portapi-arcade-console%2F&#038;title=Weekend%20hack%3A%20PortaPi%20arcade%20console" data-a2a-url="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/" data-a2a-title="Weekend hack: PortaPi arcade console"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/weekend-hack-portapi-arcade-console/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Weekend hack: surveillance on the cheap]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/" />

		<id>http://www.bitquill.net/blog/?p=398</id>
		<updated>2016-05-12T19:34:29Z</updated>
		<published>2013-09-17T14:51:16Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="Hacks" /><category scheme="http://bitquill.net/blog" term="Linux" />
		<summary type="html"><![CDATA[Some time ago I bought a few Foscam MJPEG cameras and installed them in our apartment, originally for baby monitoring, and I wanted to set up a proper security surveillance system. Â I already have a Netgear ReadyNAS box, so I thought this should be easy. Â However, I soon found out that video surveillance solutions from [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/"><![CDATA[<p>Some time ago I bought a few <a title="Foscam FI8910W - Amazon.com" href="http://www.amazon.com/gp/product/B006ZPWS4U" target="_blank">Foscam MJPEG cameras</a> and installed them in our apartment, originally for baby monitoring, and I wanted to set up a proper security surveillance system. Â I already have a Netgear ReadyNAS box, so I thought this should be easy. Â However, I soon found out that video surveillance solutions from major NAS vendors (e.g., Netgear, QNap, Synology) require per-camera licenses, in the range of $50-60/camera. Â That would be over $200 to enable functionality already present in the device! Â Although this is already an order of magnitude cheaper than hardware from traditional NVR (network video recorder) vendors, it still felt unreasonably high.Â Oh, and Foscam cameras still aren&#8217;t supported by ReadyNAS Surveillance.Â  There used to be a KMotion port for ReadyNAS, but it disappeared around the time Netgear&#8217;s official solution came out on the market. Â Since ReadyNAS is almost Debian (with customizations), I gave installing KMotion from source a shot, but after an afternoon fiddling with custom configurations as well as tweaks for the low-power Atom CPU, I gave up.</p>
<p>Perhaps the NVR industry is ripe for &#8220;disruption&#8221;, but I wasn&#8217;t willing to wait. Last time I did that (for car stereos) was almost three years ago&#8230; and I&#8217;m still waiting. Â Luckily, an NVR is a much simpler build than a custom car stereo (<a title="Adventures in fiberglassing: custom fabricated tweeter pods - bitquill.net" href="http://www.bitquill.net/blog/?p=352">this </a>was enough for me, thank you :). Â There are several low-cost hardware options and <a title="zoneminder.com" href="http://www.zoneminder.com/" target="_blank">ZoneMinder</a>Â is a great open-source surveillance system that was originally built to scratch an itch (the original author&#8217;s power tools were stolen from his garage, and he couldn&#8217;t find any reasonably-priced commercial surveillance solutions he liked). Â Here is what I got after about a day:</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="399" data-permalink="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/cubie-nvr1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?fit=1942%2C1451" data-orig-size="1942,1451" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPad&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1379236909&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.28&quot;,&quot;iso&quot;:&quot;400&quot;,&quot;shutter_speed&quot;:&quot;0.066666666666667&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Cubieboard NVR" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?fit=300%2C224" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?fit=1024%2C765" class="alignnone wp-image-399" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1-1024x765.jpg?resize=737%2C551" alt="Cubieboard NVR" width="737" height="551" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?resize=1024%2C765 1024w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?resize=300%2C224 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/09/cubie-nvr1.jpg?w=1942 1942w" sizes="auto, (max-width: 737px) 100vw, 737px" /></a></p>
<p><span id="more-398"></span></p>
<p>In addition to some familiarity with installing Linux, a 3D printer, andÂ <a title="Cubieboard NVR case - Thingiverse" href="http://www.thingiverse.com/thing:151160" target="_blank">my case design from Thingiverse</a>, you&#8217;ll also need:</p>
<ul>
<li><a title="cubieboard.org" href="http://cubieboard.org/" target="_blank">Cubieboard2</a> (<a title="Cubieboard2 - IO Technologies" href="https://store.iotllc.com/product.php?productid=17" target="_blank">$64.50 from IO Technologies</a>)</li>
<li><a title="Western Digital 500GB WD Blue SATA drive - WD5000LPVX - Amazon.com" href="http://www.amazon.com/gp/product/B00C9TECFO" target="_blank">500GB WD Blue 2.5&#8243; SATA HDD, 500GB</a> ($54.50 on Amazon)</li>
<li>2A 5V USB power adapter (e.g., <a title="AmazonBasics Wall Charger with USB Outlet (2.1 Amp Output) - Amazon.com" href="http://www.amazon.com/gp/product/B005CG2ATQ" target="_blank">this one</a> for $8.50 on Amazon)â€”optional, if you have one already</li>
<li>microSD card (about $6 on Amazon)â€”optional, you can install on built-in NAND</li>
<li>Eight screws</li>
</ul>
<p>Total cost comes to $120 if you have some spare parts around, or about $140 if you get everything and add shipping too.<strong> That&#8217;s about half the price of just software licenses for a NAS box, and an order of magnitude cheaper than NVR boxes in the market.</strong> Â Plus, there&#8217;s CPU cycles to spare, for more cameras, and it leaves the ReadyNAS Atom CPU free to handle its main tasks (file and media serving).</p>
<p>Although I love the Raspberry Pi and already have a couple for various tasks, I went with the Cubieboard since it has a much more powerful CPU (AllWinner A20 dual-core ARM) and built-in SATA, for just $20 more. Â Adding a powered USB hub and SATA-to-USB adaptor to a RasPi would probably have cost more (plus require funky wiring solutions); the Cubieboard was mostly plug-and-play.</p>
<p>The A20 can handle all four cameras in &#8220;modect&#8221; mode (motion detection triggered recording) at 1fps with one alarm zone per camera, without problems. Â The load average can be high (between 0.5 and 1.5) probably due to the continuous I/O, but actual utilization per core seems to peak around 20-25% and is typically in the single digits. Â Not bad at all for a low-power (10W max) single-board computer!</p>
<p>There are several Linux distributions for the Cubieboard (including Android) and the documentation is a bit messy, so I installed Linux a few times before I settled withÂ <a title="cubian.org" href="http://cubian.org/" target="_blank">Cubian</a>Â (basically Debian Wheezy, in the spirit of Raspbian) which is great. Â It can be installed on either an SD card or built-in NAND flash (I went with the former). Â There are already DEBs forÂ <a title="zoneminder.com" href="http://www.zoneminder.com/" target="_blank">ZoneMinder</a>, so this is a fairly standard Linux install. Â The only additional steps were moving data directories for ZoneMinder and MySQL, as well as temporary files and logs (to minimize flash wear), over to the hard drive; seeÂ <a title="Cubieboard NVR case - Instructions - Thingiverse" href="http://www.thingiverse.com/thing:151160/#instructions" target="_blank">brief instructions</a>Â on Thingiverse.</p>
<p>If you have a 3D printer and some basic Linux skills, perhaps this might save you a few hundred to a few thousand dollars. YMMV with other video formats (e.g., H.264 HD cameras).Â  Let me know if it works for you.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&amp;linkname=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fweekend-hack-surveillance-on-the-cheap%2F&#038;title=Weekend%20hack%3A%20surveillance%20on%20the%20cheap" data-a2a-url="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/" data-a2a-title="Weekend hack: surveillance on the cheap"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/weekend-hack-surveillance-on-the-cheap/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Thingiverse remix graph: visualizing the net of physical things]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/" />

		<id>http://www.bitquill.net/blog/?p=285</id>
		<updated>2016-05-12T19:37:55Z</updated>
		<published>2013-06-21T13:34:44Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="3D Printing" /><category scheme="http://bitquill.net/blog" term="Data mining" /><category scheme="http://bitquill.net/blog" term="Hacks" /><category scheme="http://bitquill.net/blog" term="Visualization" />
		<summary type="html"><![CDATA[I recently became a happy owner of a Solidoodle 2 3D printer. This has been the start of a beautiful addiction, but more on the hardware hacking aspects in another post. If you haven&#8217;t heard of it before,Â 3D printingÂ refers to a family of manufacturing methods, originally developed for rapid prototyping, the first of which appeared [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/"><![CDATA[<p>I recently became a happy owner of a <a title="Solidoodle 2" href="http://store.solidoodle.com/index.php?route=product/product&amp;product_id=56" target="_blank">Solidoodle 2</a> 3D printer. This has been the start of a beautiful addiction, but more on the hardware hacking aspects in another post.</p>
<p>If you haven&#8217;t heard of it before,Â <a title="3D printing - Wikipedia" href="http://en.wikipedia.org/wiki/3D_printing" target="_blank">3D printing</a>Â refers to a family of manufacturing methods, originally developed for rapid prototyping, the first of which appeared almost three decades ago. Much like mainframe computers in the 1960s, professional 3D printers cost up to hundred thousands of dollars. Starting with the <a title="reprap.org" href="http://reprap.org/wiki/Main_Page" target="_blank">RepRap</a><a title="RepRap Project - Wikipedia" href="http://en.wikipedia.org/wiki/RepRap_Project" target="_blank"> project</a> a few years ago, home 3D printers are now becoming available, in the few hundred to a couple of thousand dollar price range. Â For now, these are targeted mostly to tinkerers, much closer to an <a title="Altair 8800 - Wikipedia" href="http://en.wikipedia.org/wiki/Altair_8800" target="_blank">Altair</a> or, at best, an <a title="Apple II - Wikiepdia" href="http://en.wikipedia.org/wiki/Apple_ii" target="_blank">Apple II</a>, than a MacBook. Despite the <a title="hat cannot be 3D printed? Time to debunk some myths! - tridimake.com" href="http://www.tridimake.com/2013/04/what-cannot-be-3d-printed.html?spref=tw" target="_blank">hype</a> that currently surrounds 3D printing, empowering average users to turn bits into atoms (and vice versa) will likely have profound effects, similar to those witnessed when content (music, news, books, etc) went digital,Â <a title="MAKERS (book)" href="http://www.makers-revolution.com/" target="_blank">as Chris Anderson eloquently argues</a>Â with his usual, captivating dramatic flair. Personally, I&#8217;m similarly excited about this as I was about &#8220;big data&#8221; (for lack of a better term) around 2006 and mobile around 2008, so I&#8217;ll take this as a good sign. :)</p>
<p><strong>One of the key challenges, however, is finding things to print!</strong> Â This is crucial for 3D printing to really take off. Learning CAD software and successfully designing 3D objects takes substantial, time, effort, and skill. Affordable 3D scanners (like the ones fromÂ <a title="The Matterform 3D scanner - Indiegogo" href="http://www.indiegogo.com/projects/the-matterform-3d-scanner" target="_blank">Matterform</a>,Â <a title="Desktop 3D scanner by CADscan - Kickstarter" href="http://www.kickstarter.com/projects/621838643/desktop-3d-scanner" target="_blank">CADscan</a>, andÂ <a title="MakerBot Digitizer" href="http://store.makerbot.com/digitizer.html" target="_blank">Makerbot</a>) are beginning to appear. However, the most common way to find things is via online sharing of designs.Â <a title="Thingiverse" href="http://www.thingiverse.com/" target="_blank">Thingiverse</a>Â is the most popular online community for &#8220;thing&#8221; sharing. Thingiverse items are freely available (usually under <a title="Creative Commons license - Wikipedia" href="http://en.wikipedia.org/wiki/Creative_Commons_license">Creative Commons licenses</a>), but there is also commercial potential: companies like <a title="Shapeways" href="http://www.shapeways.com/" target="_blank">Shapeways</a>Â offer both manufacturing (using industrial 3D printers and manual post-processing) and marketing services for &#8220;thing&#8221; designs.</p>
<p>I&#8217;ve become a huge fan of Thingiverse. Â You can check outÂ <a title="About spapadim - Thingiverse" href="http://www.thingiverse.com/spapadim/designs" target="_blank">my own user profile</a>Â to find things that I&#8217;ve designed myself, or things that I&#8217;veÂ virtually &#8220;collected&#8221;Â because I thought they were really cool or useful (or both). Thingiverse is run by MakerBot, which manufactures and sells 3D printers, and needs to help people find things to print.<strong> It&#8217;s a social networking site centered around &#8220;thing&#8221; designs.</strong> Consequently, the main entities are <strong><em>people</em></strong> (users) and <em><strong>things</strong></em>, and links/relationships revolve around peopleÂ <em><strong>creating</strong></em> things, people <em><strong>liking</strong></em> things, people downloading and <em><strong>making</strong></em> things, people virtually <em><strong>collecting</strong></em> things, and so on. Other than people-thing relationships, links can also represent people <em><strong>following</strong></em> other people (a-la Twitter or Facebook), and things <em><strong>remixing</strong></em> other things (more on this soon). Each thing also has a number of associated files (polygon meshes for 3D printing, vector paths for lasercutting, original CAD filesâ€”anything that&#8217;s needed to make the thing).</p>
<p><span id="more-285"></span></p>
<p>The data is quite rich and interesting. I chose to start with the remix relationships. When a user uploads a new design, the can optionally enter one or more things that their design &#8220;remixes&#8221;. In a sense, a remix is similar to a citation, and it conflates a few, related meanings. It can indicate an original source of inspiration; e.g., I see a design for 3D printable <a title="Chainmail - Thingiverse" href="http://www.thingiverse.com/thing:8724" target="_blank">chainmail</a> and decide that I could use a similar link shape and pattern to make a <a title="Customizable chain link bracelet - Thingiverse" href="http://www.thingiverse.com/thing:58419" target="_blank">chain link bracelet</a>. Â I could design the bracelent from scratch, using just the chainmail idea, or perhaps I could download the original chainmail CAD files (if their creator made them available) and re-use part of the code/design. Â A remix could also indicate partial relatedness: I download and make a <a title="The MakerBot Replicator - Thingiverse" href="http://www.thingiverse.com/thing:18813" target="_blank">3D printer</a>Â (yes, it&#8217;s possible, if you have the timeâ€”or, in this case, you can buy it instead) and decide to design a <a title="Beefed Up Replicator Extruder Bracket - Thingiverse" href="http://www.thingiverse.com/thing:26880" target="_blank">small improvement</a> to a part. Â Finally, a remix may indicate use of a component library (e.g., for <a title="Write.scad -- Thingiverse" href="http://www.thingiverse.com/thing:16193" target="_blank">embossed text</a>, <a title="Parametric Involute Bevel and Spur Gears - Thingiverse" href="http://www.thingiverse.com/thing:3575" target="_blank">gears</a>, <a title="Arduino OpenSCAD mounting library - Thingiverse" href="http://www.thingiverse.com/thing:64008" target="_blank">electronic components</a>, and much more).</p>
<p>Remix links can also be created automatically by apps. Like any good social networking platform, Thingiverse also has an API for 3rd party apps.Â The most popular Thingiverse app isÂ theÂ <a title="Thingiverse Customizer" href="http://www.thingiverse.com/apps/customizer" target="_blank">Customizer</a>: anyone who can write parametric CAD designs may upload them and allow other users to create custom instances of the general design by choosing specific parameter values (which can be dimensions, angles, text or photos to emboss, etc). Â For example, theÂ <a title="Customizable iPhone Case - Thingiverse" href="http://www.thingiverse.com/thing:40703" target="_blank">customizable iPhone case</a>Â allows you to chose your iPhone model, the case thickness, and the geometric patterns on the back. Â Another popular parametric design is theÂ <a title="WALLY - Wall Plate Customizer - Thingiverse" href="http://www.thingiverse.com/thing:47956" target="_blank">wall plate customizer</a>, which allows you to choose the configuration of various cutouts (for power outlets, switches, Ethernet jacks, etc) and print a custom-fit wallplate. A parametric design is essentially a simple computer program that describes a solid shape (via <a title="Constructive solid geometry - Wikipedia" href="http://en.wikipedia.org/wiki/Constructive_Solid_Geometry" target="_blank">constructive solid geometry</a> and extrusion operators). The Customizer will execute this program and render the solid <a title="Cloud SCAD" href="https://github.com/tbuser/cloudscad" target="_blank">on a server</a>, generating a new thing, which will automatically have a remix link to the original parametric design.</p>
<p>So let&#8217;s get back to the remix relationship. Â While I was waiting for my 3D printer to arrive, I spent some time browsing Thingiverse. Â I noticed that I was frequently following remix hyperlinks to find related things, but following a trail was getting tedious and I was losing track. Â So, I decided to make something that gives a birds eye view of those relationships. What are people creating, and how are they reusing both ideas and their digital representations?Â  Last week I hacked together a visualization (using the absolutely amazingÂ <a title="D3.js - Data Driven Documents" href="http://d3js.org/" target="_blank">D3</a>Â libraries) to begin answering this question. Here is the <a title="Thingiverse Remix Graph (Component 1)" href="http://bitquill.net/make/remix/?cc=0">largest connected component</a> of the remix graph, which consists of about 3,500 things (nodes). If you think about it, its pretty amazing: more than 5% of the things (or at least those in my data) are somehow related to one another. Â It may not seem like much at first, but check out the variety of things and you&#8217;ll see some pretty unexpected relationships (direct or indirect).</p>
<p><a href="http://bitquill.net/make/remix/?cc=0" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="307" data-permalink="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/remix/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?fit=1264%2C806" data-orig-size="1264,806" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Remix graph: largest connected component" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?fit=300%2C191" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?fit=1024%2C652" class="alignnone wp-image-307" style="border: 1px solid #dddddd;" title="Remix graph: largest connected component (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix.png?resize=768%2C490" alt="Remix graph: largest connected component" width="768" height="490" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?w=1264 1264w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?resize=300%2C191 300w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix.png?resize=1024%2C652 1024w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Clicking on the hyperlink or the image above will take you to an interactive visualization (if you&#8217;re on an iPad, you may want to grab your laptop for this component; D3 is pretty darn fast, but 3,500 nodes on an iPad is pushing it a bit :). Â You can click-drag (on a blank area) to pan, and turn your scroll wheel (or two-finger scroll on a touchpad, or pinch on an iPad) to zoom. Nodes in red are things that a site editor/curator chose toÂ <a title="Featured things - Thingiverse" href="http://www.thingiverse.com/featured">feature</a>Â on Thingiverse. Each featured thing is prominently displayed on the site&#8217;s frontpage for about a day. Graph links (edges) are directed and represent remix relationships (from a source thing to a derived thing). Â If you mouse over a node, you&#8217;ll see some basic information in a tooltip, and outgoing links (i.e., links to things inspired or derived from that node) will be highlighted in green, whereas incoming links will be highlighted in orange. You can open the corresponding Thingiverse page to check out a thing by clicking on a graph node. Â Finally, on the right-hand panel you can tweak a few more visualization parameters, or choose another connected component of the remix graph.</p>
<p>Before moving on to other components, a few remarks on the graph above:Â Although cycles are conceivable (I see thing X and it inspires me to remix it into thing Y, then the creator of X sees the remix action in his newsfeed, checks out my thing, and incorporates some of my ideas back into X, adding a remix link annotation in the process), it seems that this is never the case: the remix graph (or at least the fraction in this visualization, which is substantial) is, in practice, a DAG (directed, acyclic graph). Next, many of the large star subgraphs are centered around customizable (parametric) things; for example the large star on the left is the iPhone case (noted above) and it&#8217;s variations. Most of the remixes are simple instances of the parametric design, but some sport more involved modifications (e.g., <a title="Local Motors iPhone 4s case - Thingiverse" href="http://www.thingiverse.com/thing:44301">cases branded with company logos</a>). However not all stars fall in this category. For example, the star graph with many red nodesÂ near the bottom left is centered around a <a title="The head of Stephen Colbert - Thingiverse" href="http://www.thingiverse.com/thing:9104" target="_blank">3D scan of Stephen Colbert</a>, made on the set of the show. This has inspired may remixes, into things like <a title="ColberT-Rex - Thingiverse" href="http://www.thingiverse.com/thing:9348" target="_blank">ColberT-Rex</a>, or <a title="Cowbert - Thingiverse" href="http://www.thingiverse.com/thing:9176" target="_blank">Cowbert</a>. Most of these remixes have one parent node, but some combine more than one 3D model; for example a cross between Colbert and the <a title="Stanford Bunny - Thingiverse" href="http://www.thingiverse.com/thing:3731" target="_blank">Stanford bunny</a> is the <a title="Lepus Colberus (The Colberabbit) - Thingiverse" href="http://www.thingiverse.com/thing:9151" target="_blank">Colberabbit</a>, and a cross between Colbert and an <a title="Bucket O' Octopi - Thingiverse" href="http://www.thingiverse.com/thing:7900" target="_blank">octopus</a> is <a title="Colberthulu - Thingiverse" href="http://www.thingiverse.com/thing:9150" target="_blank">Colberthulu</a>. The original Colbert scan and most of it&#8217;s remixes were featured on Thingiverse&#8217;s frontpage (apparently the site editors are huge Colbert fans?).</p>
<p>So, anyway, how about the other connected components? The distribution of <a title="Connected component sizes (log-rank vs log-count)" href="http://bitquill.net/make/remix/cc-sizes.html">component sizes</a>Â follows a power law (again, click on the image for an interactive plotâ€”singleton components are not included), no surprises here:</p>
<p><a href="http://bitquill.net/make/remix/cc-sizes.html" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="313" data-permalink="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/remix-ccsize/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?fit=705%2C480" data-orig-size="705,480" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Connected component size distribution (log-log)" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?fit=300%2C204" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?fit=705%2C480" class="alignnone wp-image-313" style="border: 1px solid #dddddd;" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?resize=512%2C349" alt="Connected component size distribution (log-log; click for interactive version)" width="512" height="349" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?w=705 705w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-ccsize.png?resize=300%2C204 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></a></p>
<p>Components beyond the giant one are also interesting (as always, click on each image for the interactive visualization). Â For example, the component on the left below consists of things inspired by a 3D-printable chainmail design, which also includes things like link bracelets, etc. Â The component on the rightÂ contains various designs for&#8230; catapults!</p>
<p><a href="http://bitquill.net/make/remix/?cc=11" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="300" data-permalink="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/remix-chainmail12/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?fit=480%2C320" data-orig-size="480,320" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Component 12: Chainmail inspired things" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?fit=300%2C200" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?fit=480%2C320" class="alignnone wp-image-300" style="border: 1px solid #dddddd;" title="Component 12: Chainmail inspired things (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?resize=382%2C255" alt="Component 12: Chainmail inspired things" width="382" height="255" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-chainmail12.png?resize=300%2C200 300w" sizes="auto, (max-width: 382px) 100vw, 382px" /></a><a href="http://bitquill.net/make/remix/?cc=12" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="305" data-permalink="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/remix-catapults13/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?fit=480%2C320" data-orig-size="480,320" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Component 13: Catapults" data-image-description="" data-image-caption="&lt;p&gt;Component 13: Catapults&lt;/p&gt;
" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?fit=300%2C200" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?fit=480%2C320" class="alignnone wp-image-305" style="border: 1px solid #dddddd; margin-left: 1em;" title="Component 13: Catapults (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?resize=382%2C255" alt="Component 13: Catapults" width="382" height="255" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-catapults13.png?resize=300%2C200 300w" sizes="auto, (max-width: 382px) 100vw, 382px" /></a></p>
<p>Some components contain pretty useful stuff, such as the one with items for kid&#8217;s parties (e.g., coasters, cookie cutters) &#8212; on the left. Â Since many people in the community are tinkerers, there are many 3D-printable parts for.. 3D-printers! Â An example is the component on the right, which isÂ centered around the design files for the original MakerBot Replicator, and around it are related items (like covers and other modifications).</p>
<p><a href="http://bitquill.net/make/remix/?cc=22" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" style="border: 1px solid #dddddd;" title="Component 23: Kid's party stuff (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-kidparty23.png?resize=382%2C255" alt="Component 23: Kid's party stuff" width="382" height="255" /></a>Â <a href="http://bitquill.net/make/remix/?cc=17" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" style="border: 1px solid #dddddd; margin-left: 1em;" title="Component 18: MakerBot Replicator (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-replicator18.png?resize=382%2C255" alt="Component 18: MakerBot Replicator" width="382" height="255" /></a></p>
<p>Other components contain cool, geeky things, such as the small but well-featured component on the left, with figures and items from the Star Wars universe (including Darth Vader, as well as Yoda, remixed into a &#8220;gangsta&#8221; and other things). Â Finally, not all components consist of 3D-printable things. Â The component on the right has designs for lasercutting plywood so it can be folded, which was remixed into book covers, Kindle covers, and other things:</p>
<p><a href="http://bitquill.net/make/remix/?cc=16" target="_blank"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone" style="border: 1px solid #dddddd;" title="Component 17: Star Wars (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-starwars17.png?resize=382%2C255" alt="Component 17: Star Wars" width="382" height="255" /></a><a href="http://bitquill.net/make/remix/?cc=33"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="301" data-permalink="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/remix-folding-wood-lasercut34/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?fit=480%2C320" data-orig-size="480,320" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Component 34: Foldable lasercut wood designs" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?fit=300%2C200" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?fit=480%2C320" class="alignnone size-full wp-image-301" style="border: 1px solid #dddddd; margin-left: 1em;" title="Component 34: Foldable lasercut wood designs (click for interactive version)" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?resize=382%2C255" alt="Component 34: Foldable lasercut wood designs" width="382" height="255" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/remix-folding-wood-lasercut34.png?resize=300%2C200 300w" sizes="auto, (max-width: 382px) 100vw, 382px" /></a></p>
<p>All this is just a fraction of what&#8217;s out there. Thingiverse is also growing at an amazing pace: around March when I collected some of this data there were about 60,000 things and now there are over 100,000 things (the latter number is based simply on what appears to be linearly assigned thing IDs). Â That&#8217;s roughly a doubling in four months; the <a title="The rise of 3D printing is exponential -- 3dprinter.net" href="http://www.3dprinter.net/rise-of-3d-printing-exponential">exponential trend</a> is going on strong! Â This is quite impressive given the <a title="How many consumer 3D printers have been sold? - RepRage" href="http://reprage.com/post/35354576225/how-many-consumer-3d-printers-have-been-sold" target="_blank">small (but fast-growing) size of the home 3D printer market</a>.</p>
<p>Visualizing just the remix aspect of the Thingiverse is a start. For example, another thing I found myself doing when browsing Thingiverse is following indirect same-collection links (rather than direct remix links) to find related items. Once I get over gaping at the graph and all the stuff on Thingiverse (some of which I&#8217;ve printed on my Solidoodle), there are a few things to try in terms of data/graph properties as well as in terms of improving the visualization as a tool to browse the Thingiverse and discover interesting and useful things more effectively. If anyone is actually reading this :) and there is something you&#8217;d like to see, please chip in a comment.</p>
<p>Postscript: My favorite cluster among those I spotted in the visualization is probably the one related to Colbert (see above), with the Colberabbit (&#8220;a godless killing machine&#8221;) a particular favorite. Â I&#8217;ll be printing one of those soon. :)</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&amp;linkname=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fthingiverse-remix-graph-visualizing-the-net-of-physical-things%2F&#038;title=Thingiverse%20remix%20graph%3A%20visualizing%20the%20net%20of%20physical%20things" data-a2a-url="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/" data-a2a-title="Thingiverse remix graph: visualizing the net of physical things"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/thingiverse-remix-graph-visualizing-the-net-of-physical-things/feed/atom/" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Adventures in fiberglassing: custom fabricated tweeter pods]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/" />

		<id>http://www.bitquill.net/blog/?p=352</id>
		<updated>2016-05-12T19:39:14Z</updated>
		<published>2013-06-20T15:07:24Z</published>
		<category scheme="http://bitquill.net/blog" term="Make" />
		<summary type="html"><![CDATA[[This project is more than a year old, but I never got around to posting anything earlier.] I generally like to make things (I used to say &#8220;build&#8221; things, but that was misconstrued by some manager/academic types, who apparently have a very different definition of &#8220;to build&#8221;), whether it&#8217;s software, writing, or &#8220;hardware&#8221;. Â I usually [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/"><![CDATA[<p>[This project is more than a year old, but I never got around to posting anything earlier.]</p>
<p>I generally like to make things (I used to say &#8220;build&#8221; things, but that was misconstrued by some manager/academic types, who apparently have a very different definition of &#8220;to build&#8221;), whether it&#8217;s software, writing, or &#8220;hardware&#8221;. Â I usually talk about the first, but I occasionally do the last (much to the dismay of my wife, who has nonetheless been very patient! :). Â I also like to try new things&#8211;I probably care more about the process and experimentation, learning what&#8217;s possible and how to do it, that the final product (which is not to say that I don&#8217;t care about the final product at all, but it get&#8217;s boring pretty quickly for me). So, sometime last year I decided to upgrade my car speakers (I also Dynamat-ted all doors, but I didn&#8217;t take photos of that adventure; one tip, though:: make sure you sit down properly, because after crouching down on tiptoe for almost an entire day, I needed physiotherapy for my heel tendon :) â€”now my Subaru&#8217;s doors sound like a Mercedes when you shut them). However, the new tweeters were much larger than the factory-installed ones, so I took the opportunity (excuse?) to learn fiberglassing and make new tweeter pods.</p>
<p>Let me set the mood by starting with my outfit: I started with the one on the left, but after plenty of PVC dust, fiberglass dust, and acetone fumes, I upgraded to the one on the right. A proper respirator helps a lot, especially if you&#8217;re working indoors. And don&#8217;t skip the safety glasses (even if you&#8217;re wearing vision glasses, as I found out). Â Always take the proper safety precautions.</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="353" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/outfit0/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?fit=480%2C720" data-orig-size="480,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="outfit0" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?fit=200%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?fit=480%2C720" class="alignnone  wp-image-353" alt="outfit0" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?resize=230%2C346" width="230" height="346" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit0.jpg?resize=200%2C300 200w" sizes="auto, (max-width: 230px) 100vw, 230px" /></a> <a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="354" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/outfit/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?fit=480%2C720" data-orig-size="480,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="outfit" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?fit=200%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?fit=480%2C720" class="alignnone  wp-image-354" alt="outfit" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?resize=230%2C346" width="230" height="346" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/outfit.jpg?resize=200%2C300 200w" sizes="auto, (max-width: 230px) 100vw, 230px" /></a></p>
<p><span id="more-352"></span></p>
<p>I did not build the entire sail panel from scratch, of course (didn&#8217;t have a 3D printer back then but, even now that I do, decent 3D scanners are still not cheaply available, although that&#8217;ll hopefully change soon). Â I modified an OEM sail panel (I got the cheap ones, that aren&#8217;t designed to house factory tweeters, since I was going to cut them up anyway). Â The tweeter pod was fabricated from a piece of common PVC pipe. Â Cutting those can be a bit messy, but the Dremel is a fantastic tool. If you&#8217;re thinking of fabricating anything and you&#8217;re going to buy just one tool, it should be a Dremel. Â In fact, just stop reading and go over to Amazon and order one now! [No, Bosch is not paying me for this]</p>
<p>I used a cutting disk for the PVC pipe. Go slow to avoid melting the PVC too much and cut the piece a little longer, then sand off the molten bits of PVC (if any). This will give you a nice, clean edge. Â Make sure to use a sanding block (or put the sandpaper on a flat surface) to get a good edge. Â I used masking tape to mark the cutting path; getting this straight saves you some sanding. Â Also, instead of going completely freehand, I like to put both the tool and pipe on a steady surface, and then just slowly roll the pipe until it touches the disk; makes cutting much easier to control. I also notched one edge with a sanding band (which is what is attached to the tool in the picture on the left), ostensibly to route the wires, but that turned out to be unnecessary.</p>
<p>For the OEM sail panels, I used a cutting bit and did freehand cutting (picture on the right). Â You don&#8217;t need to be terribly precise anyway. Â Make sure you move the tool in the right direction, otherwise cutting will be difficult and the bit may kick back (although, even if you gouge the piece by accident, it&#8217;s not a big deal at this stageâ€”and then you&#8217;ll know which direction to move along :).</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="356" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/pvc-pipe/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="pvc-pipe" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?fit=960%2C720" class="alignnone  wp-image-356" alt="pvc-pipe" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pvc-pipe.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a> <a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="357" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/dremel-cutting/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="dremel-cutting" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?fit=960%2C720" class="alignnone  wp-image-357" alt="dremel-cutting" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/dremel-cutting.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p>The PVC pipe inner diameter turned out to be a tad small, but the Dremel with a sanding band was enough to fix this. Â Again, I put both the tool and pipe on a steady surface, and just rolled the pipe around the spinning band. Â You can also use a prop on the outside part of the pipe, to make sure you get a (relatively) consistent depth, if your hand isn&#8217;t particularly steady (mine isn&#8217;t, but you can always devise a jig or prop to compensate). Â The first picture below shows the original pipe (I used the two scrap pieces for practice) and the thinned down pieces are in the sail panels.</p>
<p>As I mentioned earlier, this does not need to be a precise job, since everything will be covered in fiberglass, eventually. Â However, you want to make sure that the tweeter pods (aka. PVC pipe) are aimed in the right direction. Â You want to go down to your car and test, then use a pen to mark the pipe around the edges where it touches the sail panel hole. Â Then go back and hotglue the pipe temporarily in place. Â This should be strong enough to prevent it from moving, so you can go back to your car again and double-check (and triple-check) the aiming.</p>
<p>It&#8217;s crucial to get this right, as you obviously cannot re-aim later. Â So, measure twice (or more)! Â Also, it helps if your tweeters are already broken in when you do the aiming. Mine were pretty harsh for the first couple of months (to the point that I was wondering how reviews could be so good), but eventually became pretty mellow. Â I did all this just a couple of weeks after using them in temporary mounts (I thought this would be enough to break them in; apparently I was wrong). Â Now I&#8217;m pretty happy with the tweeters&#8217; sound quality, but I would have aimed slightly differently if I had done this later (still not too bad, though). Â So, if you don&#8217;t mind your car looking like a wreck, take your time breaking them in before you do all this.</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" alt="pipe-on-sails-1" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-1.jpg?resize=346%2C259" width="346" height="259" /></a>Â <img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="361" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/pipe-on-sails-2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="pipe-on-sails-2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?fit=960%2C720" class="alignnone  wp-image-361" alt="pipe-on-sails-2" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-2.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="362" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/pipe-on-sails-3/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="pipe-on-sails-3" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?fit=960%2C720" class="alignnone  wp-image-362" alt="pipe-on-sails-3" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-3.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a> <a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="363" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/pipe-on-sails-4/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="pipe-on-sails-4" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?fit=960%2C720" class="alignnone  wp-image-363" alt="pipe-on-sails-4" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/pipe-on-sails-4.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p>Once you have the aiming down, it&#8217;s time to give the sail panel it&#8217;s final shape. Â You do this by stretching something that can absorb the resin over the frame that you&#8217;ve essentialy created. Â A common material for jobs like this is speaker grille cloth, which you can get pretty cheaply on eBay or Amazon. Â Another popular material for bigger surfaces seems to be a fleece blanket. Â However, for this small job, the speaker grille cloth is perfect: it&#8217;s very thin, it&#8217;s quite strong, stretches nicely, and follows the contours well. Â It&#8217;s also pretty absorbent (enough for the glue and resin).</p>
<p>You will need to superglue the cloth on the frame, but you&#8217;ll need activator to make it work. You can usually find a package that has both the cyanoacrylic glue and activator at any hardware store. Â By the way, this works great for any hard-to-bond surfaces (not just speaker cloth on plastic :). Â The bond may not be strong long-term, depending on the materials, but in this case it doesn&#8217;t matter (it&#8217;s pretty good actually). Make sure to stretch the cloth enough to get rid of any kinks. Â The good thing about speaker grille cloth is that it&#8217;s pretty stretchy, so even if you have kinks after you&#8217;ve partially glued some sides, you can still get rid of them by just stretching harder.Â You may need a bit of practice doing all this, as the activator evaporates quickly, but the glue sets almost instantly if it touches it. So, you may want test in which order you apply glue and activator, but it&#8217;s not very difficult to get right after a couple of trials. Â Plus, you can always rip it off, scrape the glue, and start over. Â  Once the bond is good, cut off the excess cloth with a sharp craft knife.</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="364" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/speaker-cloth-1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="speaker-cloth-1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?fit=960%2C720" class="alignnone  wp-image-364" alt="speaker-cloth-1" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-1.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a> <a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="365" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/speaker-cloth-2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="speaker-cloth-2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?fit=960%2C720" class="alignnone  wp-image-365" alt="speaker-cloth-2" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/speaker-cloth-2.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p><span style="font-size: 13px; line-height: 19px;">Now you&#8217;re ready for the actual fiberglassing! Â First, you apply some resin on the speaker grille cloth, without any fiberglass mat. In my case the first layer I applied was too thin (you can clearly see the speaker cloth), so I went for one more layer before the mat. Â You want it to be nice and thick (to fully cover the cloth), but not too thick (you can always sand it down, but resin takes forever to sand by hand if you overdo it).</span></p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="366" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/resin-layer1/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="resin-layer1" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?fit=960%2C720" class="alignnone  wp-image-366" alt="resin-layer1" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer1.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a> <a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="367" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/resin-layer2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="resin-layer2" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?fit=960%2C720" class="alignnone  wp-image-367" alt="resin-layer2" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/resin-layer2.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p>After the first layer has cured, you can move on to the second layer, with the fiberglass mat. Â First, I sanded down the resin a little bit, and cleaned off the wax release agent (apparently resins contain a small amount?). Â Then, place pieces of fiberglass mat and dab them with resin on a paintbrush (I used a cheap $1 paintbrush, 1/2in wideâ€”you may want to pick up a couple of those, resin can set fast, especially when you don&#8217;t know what you&#8217;re doing in the beginning). Â One thing I found out the hard way: don&#8217;t be lazy and use a stick to properly mix the hardener into the resin, not your brush! Â Otherwise, the brush will absorb the hardener (capillary action), which will have two undesirable effects. Â First, the resin on your brush will set and render your brush useless. Â Even worse, the resin that you put on the piece won&#8217;t have enough hardener, and it will take <em>forever</em> to cure.</p>
<p><a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="368" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/first-sanding/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="first-sanding" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?fit=960%2C720" class="alignnone  wp-image-368" alt="first-sanding" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/first-sanding.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a><span style="font-size: 13px; line-height: 19px;">Â </span><a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="369" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/mat-layer3/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="mat-layer3" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?fit=960%2C720" class="alignnone  wp-image-369" alt="mat-layer3" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/mat-layer3.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p>Once the resin sets, one more round of light sanding and cleaning off the release agent. Â If you have excess resin around the pipe edges, you can also use the sanding band on the Dremel to shape it a bit (as I said before, cured resin is pretty hard and large pieces take forever to sand down by hand). Â Take it easy and slow with the Dremel though. Â Also, make sure to wear your respirator (fiberglass dust is particularly fine and gets everywhere).</p>
<p>You can do another mat layer, if you want, although that much strength is probably not needed here. Finally, you&#8217;re ready for filling. I used common Bondo body filler from an automotive shop. Â This thing cures pretty quickly, so make sure you mix just the amount you need. Â In my case, I thought I&#8217;d mix more, but my first batch hardened before I even Â got to the second pod. Admittedly, I was also pretty slow spreading the filler, since it was my first time. However, filler is pretty easy to sand, so go ahead and make a mess (within reason).</p>
<p><a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="370" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/second-sanding/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="second-sanding" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?fit=960%2C720" class="alignnone  wp-image-370" alt="second-sanding" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/second-sanding.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a>Â <a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="371" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/bondo-filler/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="bondo-filler" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?fit=960%2C720" class="alignnone  wp-image-371" alt="bondo-filler" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?resize=346%2C259" width="346" height="259" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/bondo-filler.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 346px) 100vw, 346px" /></a></p>
<p>Once the filler sets, you&#8217;re ready for the final sanding. Â It&#8217;s <em>crucial</em> that you use a sanding block, to get a nice surface shape (don&#8217;t use handheld sanding paper, or you&#8217;ll get a funny surface with grooves etc). Â Do the usual progressively finer grit sanding. Â I also used wet sandpaper at the final stages. Finally, spray paint everything (I used gray primer then black paint that matched the OEM trim). Needless to say, don&#8217;t do this indoors, unless you wantÂ graffiti on your walls (I guess you could use plenty of sheeting and open windows, but it&#8217;s just easier to go outdoors). Â I used a skewer taped to the backside to hold the pieces while spraying. I also covered the foam strips pre-installed on the sail panels with masking tape.Â  Follow instructions on paint bottle for drying times, etc. This was also my first time using canned spray-paint, but no surprises here. Just take it slow and don&#8217;t start spraying too close (you can always move closer and/or spray on more paint, but not the opposite&#8211;however, this is just common sense).</p>
<p>So, after all this, here is the final result. Â The picture on the left shows the OEM sail panel for factory tweeters and my hand-made, fiberglassed sail panels. Â The picture on the right shows the sail panel and tweeter installed. Â If you look closely, you&#8217;ll see some small surface imperfections (I think it&#8217;s because I didn&#8217;t use a sanding block on the last, light pass with fine-grit sandpaper&#8211;it was getting late and I was getting tired and impatient), but not too bad for a first fiberglassing job!</p>
<p><a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="372" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/handmade-vs-oem/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?fit=960%2C720" data-orig-size="960,720" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="handmade-vs-oem" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?fit=960%2C720" class="alignnone  wp-image-372" alt="handmade-vs-oem" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?resize=560%2C420" width="560" height="420" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?w=960 960w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/handmade-vs-oem.jpg?resize=300%2C225 300w" sizes="auto, (max-width: 560px) 100vw, 560px" /></a><span style="font-size: 13px; line-height: 19px;">Â </span><a style="font-size: 13px; line-height: 19px;" href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="373" data-permalink="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/installed/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?fit=720%2C960" data-orig-size="720,960" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="installed" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?fit=225%2C300" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?fit=720%2C960" class="alignnone  wp-image-373" alt="installed" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?resize=315%2C420" width="315" height="420" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?w=720 720w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2013/06/installed.jpg?resize=225%2C300 225w" sizes="auto, (max-width: 315px) 100vw, 315px" /></a></p>
<p>Postscript: Of all places, I got excellent fiberglassing advice at&#8230; an NSF review panel, from a university professor who turned out to be a machinist and body shop worker (maintaining an antique car collection) in his former life! Wow!</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&amp;linkname=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fadventures-in-fiberglassing-custom-fabricated-tweeter-pods%2F&#038;title=Adventures%20in%20fiberglassing%3A%20custom%20fabricated%20tweeter%20pods" data-a2a-url="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/" data-a2a-title="Adventures in fiberglassing: custom fabricated tweeter pods"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/adventures-in-fiberglassing-custom-fabricated-tweeter-pods/feed/atom/" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Expectations of privacy]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/expectations-of-privacy/" />

		<id>http://www.bitquill.net/blog/?p=267</id>
		<updated>2016-05-12T19:40:58Z</updated>
		<published>2013-06-19T21:08:28Z</published>
		<category scheme="http://bitquill.net/blog" term="Other" /><category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="Government" /><category scheme="http://bitquill.net/blog" term="Opinion" /><category scheme="http://bitquill.net/blog" term="Privacy" />
		<summary type="html"><![CDATA[I have stopped worrying what can be inferred about me, because I&#8217;ve accepted the simple fact that, given enough time (data) and resources, anything can be inferred. Consider, as an example, &#8220;location privacy.&#8221; Â A number of approaches rely on adaptively coarsening the detail of reported location (using all sorts of criteria to decide detail, from [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/expectations-of-privacy/"><![CDATA[<p>I have stopped worrying <em>what</em> can be inferred about me, because I&#8217;ve accepted the simple fact that, <strong>given enough time (data) and resources, <em>anything</em> can be inferred.</strong> Consider, as an example, &#8220;location privacy.&#8221; Â A number of approaches rely on adaptively coarsening the detail of reported location (using all sorts of criteria to decide detail, from mobility patterns, to spatial query workload characteristics, etc). Â For example, instead of revealing my exact location, I can reveal my location at a city-block level. In an area like NYC, this would conflate me with hundreds of other people that happen to be on the same block, but a block-level location is still accurate enough to be useful (e.g., for finding nearby shops and restaurants). Â This might work if I&#8217;mÂ reporting my location just once. Â However, if I travel from home to work, then my trajectory over a few days, even at a city-block granularity, is likely sufficient to distinguish me from other people. Â I could perhaps counter this by revealing my location at a city-level or state-level. Â Then a few days worth of data might not be enough to identify me. Â However, I often travel and data over a period of, say, a year, would likely be enough to identify me even if location detail is quite coarse. Â Of course, I could take thingsÂ to the extreme and just reveal that &#8220;I am on planet Earth&#8221;. Â But that&#8217;s the same as not publishing my location, since this fact is true for everyone.</p>
<p><span id="more-267"></span></p>
<p>If it&#8217;s technically possible to infer my identity (given a long enough period of observation, and enough resources and time to piece the various, possibly inaccurate, pieces of information together), someone (with enough patience and resources) will likely do it.Â Therefore, as the amount of data about me tends to infinity (which, on the Internet, it probably does), the fraction that I have to hide in order to maintain my privacy tends to one: <strong>you have long-term privacy only if you never reveal anything</strong>. Â There are various ways of not revealing anything. Â One is toÂ <a title="Google's Schmidt Roasted for Privacy Comments - PCWorld" href="http://www.pcworld.com/article/184446/googles_schmidt_roasted_for_privacy_comments.html" target="_blank">simply not do it</a>. Â Another might be to keep it to yourself and never put it in any digital media. Â Yet another might be encrypting the information.</p>
<p>However, not revealing anything isn&#8217;t really a solution (if a tree falls in the forest and nobody hears it&#8230; the tree has privacy, I guess). Â <strong>There is an alternative, of course: precise access control.</strong> Your privacy can be safeguarded by a <strong>centralized, trusted gatekeeper that controls all access to data</strong>. This leads to <strong>something of a paradox</strong>: guaranteeing privacy (access control) implies zero privacy from the trusted gatekeeper: they (have to) know and control everything. Â Many people are still confused about this. For example, a form of this dichotomy can be seen in peoples&#8217; reactions towards Facebook: on one hand, people complain about giving Facebook complete control and ownership of their data, but they also complain when Facebook essentially gives up that control by making something &#8220;public&#8221; in one way or another. [Note: there is the valid issue of Facebook changing its promises here, but that&#8217;s not my pointâ€”people post certain information on Facebook and not on, say, Twitter or the &#8220;open web&#8221; precisely because they believe that Facebook guarantees them access control which, by the way, is a very tall order, leading to confusion on all sides, as I hope to convince you.]</p>
<p>Although I learned not to worry about <em>what</em> can be inferred about me, I am perhaps somewhat worried about knowingÂ <em>who</em> is accessing my data (and making inferences), and <em>how</em> they are using it. Particularly if this is done by parties that have far more resources and determination than myself. Â However, who uses my information and how is also another piece of information (data) itself. Â Although everything is information, there seems to be an asymmetry: when my information is revealed and used, it may be called &#8220;intelligence&#8221;, but when the information that it was used is revealed, it may be called &#8220;whistleblowing&#8221; or even &#8220;<a title="Edward Snowden hailed as hero, accused of treason â€“ The Guardian" href="http://www.guardian.co.uk/world/blog/2013/jun/10/edward-snowden-revealed-as-nsa-whistleblower-reaction-live" target="_blank">treason</a>&#8220;. Â This asymmetry does not seem to have any technical groundingâ€”one might make valid arguments on political, legal, moral, etc grounds, but not on technical grounds.Â Seen in this context,Â <a title="Mark Zuckerberg - &quot;I want to respond personally...&quot;" href="https://www.facebook.com/zuck/posts/10100828955847631" target="_blank">Zuckerberg&#8217;s calls for &#8220;more transparency&#8221;</a>Â make perfect senseâ€”he&#8217;s calling for less asymmetry.</p>
<p>More generally,Â <strong>privacy does not really seem to be a technical problem</strong>, much like <a title="Digital rights management - Wikipedia" href="http://en.wikipedia.org/wiki/Digital_rights_management">DRM</a> isn&#8217;t really a technical problem. Â That privacy can be guaranteed by technical means seems to be a delusion and, perhaps, a dangerous one, because it gives a false sense of security. Privacy is, for the most part, a social, political and legal problem about <em>how</em> data can be used (any and all data!) and by <em>whom</em>. The apparent technical infeasibility of privacy had led me to believe that people will, eventually, <a title="Sun on Privacy - Wired (1999)" href="http://www.wired.com/politics/law/news/1999/01/17538" target="_blank">get over the idea</a>. After all, privacy is a 200-300 year old concept (at least in the western world; interestingly, Greek did not have a corresponding word until very recently).Â I may have missed something obvious, however: if privacy is attainable via a centralized, trusted gatekeeper, then<strong> perhaps privacy is the &#8220;killer app&#8221; for centralization and &#8220;walled gardens&#8221;</strong>. <strong>&#8220;I want full control over your data&#8221; is tougher to sell than &#8220;I want to protect your privacy&#8221;</strong>.Â Which is why <a title="Google's Eric Schmidt Explains Why The Internet Needs A 'Delete Button' - Business Insider" href="http://www.businessinsider.com/schmidt-internet-needs-a-delete-button-2013-5" target="_blank">Eric Schmidt&#8217;s recent backpedaling</a>Â is somewhat worrying, even if the goal is noble (and there currently isn&#8217;t any evidence to believe otherwise).</p>
<p>I don&#8217;t think there are any (technical) solutions to privacy. Â Also, enforcing transparency is perhaps almost as hard as enforcing privacy, although I have slightly more hope for the formerâ€”but that&#8217;s a separate discussion. Â <strong>Privacy is cat-and-mouse game, much like &#8220;piracy&#8221; and <a title="Digital Rights Management - Shortcomings - Wikipedia" href="http://en.wikipedia.org/wiki/Digital_rights_management#Shortcomings">DRM</a>.</strong> However, our expectations should be tempered by the reality of near-zero-cost transmission, collection, and storage of &#8220;inifinitely&#8221; growing amounts of information, and we should perhaps re-examine existing notions of privacy under this light. I find that many non-technical people are still surprised when I explain the simple example in the opening paragraph, even though they consider it obvious in retrospect.</p>
<p>Personally, I find it safer to just assume that I have no privacy. Saves me the aggravation.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&amp;linkname=Expectations%20of%20privacy" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fexpectations-of-privacy%2F&#038;title=Expectations%20of%20privacy" data-a2a-url="http://bitquill.net/blog/expectations-of-privacy/" data-a2a-title="Expectations of privacy"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/expectations-of-privacy/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/expectations-of-privacy/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[The pesky cousin from Greece]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/the-pesky-cousin-from-greece/" />

		<id>http://www.bitquill.net/blog/?p=210</id>
		<updated>2016-05-12T19:43:11Z</updated>
		<published>2010-02-25T01:46:12Z</published>
		<category scheme="http://bitquill.net/blog" term="Other" /><category scheme="http://bitquill.net/blog" term="Europe" /><category scheme="http://bitquill.net/blog" term="Greece" /><category scheme="http://bitquill.net/blog" term="Opinion" />
		<summary type="html"><![CDATA[I&#8217;m far from an expert in economics, politics, or history; quite the contrary. Â Which is why I try to cast events in more familiar, anthropomorphic terms, and also why such analogies are dangerous. Caveat lectorâ€”now, let&#8217;s get on with the story. There once was a large family, with many brothers, uncles, and cousins spread over [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/the-pesky-cousin-from-greece/"><![CDATA[<p><em> I&#8217;m far from an expert in economics, politics, or history; quite the contrary. Â Which is why I try to cast events in more familiar, anthropomorphic terms, and also why such analogies are dangerous. <span style="font-style: normal;"> Caveat lector</span>â€”now, let&#8217;s get on with the story.</em></p>
<p>There once was a large family, with many brothers, uncles, and cousins spread over many different places.Â Each of them led their own lives. Â The extended family spanned all sorts of lifestyles, from successful businessmen, dignified and well-dressed, to smart but somewhat irresponsible bon viveurs. Â They lived in many different places and they occasionally exchanged gifts and money, some more frequently than others (admittedly, this part is rather weak in its simplicity, but a single analogy can only be taken so far). But they were getting tired of running to Western Union, paying transaction fees, losing money on currency conversions due to volatility in exchange rates, and so on.Â Furthermore, some of the more powerful family members had gotten into nasty feuds (world wars).</p>
<p>So, under the leadership of some of the more powerful siblings (Germany and France) they thought: well, we have enough money to go down to an international bank and open a common family account in a solid currency, say, dollars (they in fact created their own currency and bank, perhaps to avoid associations with existing institutions, but it&#8217;s probably safe to say that they heavily mirrored those of one of the leading siblings). Â Then it will be so much easier to do the same things much more efficiently. Â The richer craftsmen and businessmen among them could send their stuff with <a title="Let the Greeks ruin themselves - Germany and the Euro" href="http://www.economist.com/world/europe/displayStory.cfm?story_id=15549449">less hassle and waste</a> [e.g., paragraph seven], and the poorer ones could gain a bit by wisely using their portion of the funds and an occasional advance withdrawal.</p>
<p>The leading siblings knew how to keep their checkbooks balanced, and it seemed reasonable to assume that these methods were general enough and suitable for everyone. Â So, after opening the family account with all of them as joint holders, they shook hands and simply agreed to use the money wisely, pretty much in the way that had worked well for the richer and more productive ones (<a title="Stability and growth pact - Wikipedia" href="http://en.wikipedia.org/wiki/Stability_and_Growth_Pact">stability and growth pact</a>). Â Once in a while they might briefly meet and agree on some further rules of how the money should be used, but basically each one of them went their way, living the life they always had, managing their portion of the family funds. Â One of the more cynical siblings (England) was a bit skeptical about opening a family account while living their separate lives apart, so it chose to stay out, at least for a while. Â Times were good for several years, but they didn&#8217;t last forever.</p>
<p><span id="more-210"></span></p>
<p>The first to get into trouble would be one of the younger cousins (Greece), who generally <strong>valued time more than money</strong> (he occasionally complains about that himself, but to little effect so far). Using some money from the family account, he did a few renovations to make his home look better and bought some decent clothes. Using the family account to boost his creditworthiness and sporting a sharper new look, he managed to get a credit<strong><span style="font-weight: normal;"> card with a </span>promotional Â 0% APR</strong> (Euro membership). Â He even threw a big party that impressed many (Olympic games). But after a few years, the credit card companies came back asking for payment, and he found himself in <a title="Bond Market Simulation Shows Greece Cursed by Euro - WSJ" href="http://online.wsj.com/article/SB10001424052748704240004575085822250274324.html">deeper trouble</a> than before the good times had begun.</p>
<p>Some of the other relatives had also started getting into trouble, even if not all of them had been as irresponsible. Â But the immediate problem was that cousin. Â What was the family to do? Â Other people had started noticing, and were beginning to have some questions. Â &#8220;<a title="The making of a Euromess - Paul Krugman op-ed in NY Times" href="http://www.nytimes.com/2010/02/15/opinion/15krugman.html">What kind of family are you?</a>&#8221; Â Your cousin deserves what he gets, but did you really think it was that simple to run a family with such a diverse crowd?Â Obviously the little cousin should be taught a lesson and become more mature and responsible. Â But it should also be a lesson that could be repeated on other relatives, if necessary.</p>
<p><strong>One option would be to kick him out (bankruptcy). </strong> It might get him to change his ways (or not), but a homeless relative does not make the family look good, even if he&#8217;s largely responsible for his predicament (which he is, by the way). And what would happen to the other relatives that weren&#8217;t doing that great either? Â A 0% promotional APR cannot last forever, and it&#8217;s not hard to shoot yourself in the foot with it, even if you aren&#8217;t irresponsible. Â Will other relatives head for the door too? Â If they do, will they come back? Â And is it possible to neatly untangle the finances, after decades of using a common account? Â Furthermore, the cousin may start hanging out with &#8220;strangers&#8221;, some of which may be of questionable character (IMF, Russia, etc). In fact, keeping him out of undesirable company might have played a role in inviting him to the extended family account in the first place.</p>
<p><strong>Another option would be to bring him and his family into the home of a richer and more dignified family member,</strong> force him into a suit, grab him by the hand (or neck), and teach him how behave like a grown up under close supervision. But the other members of the household (citizens), who contribute to its finances (pay taxes) and get food and shelter in return (welfare and other benefits) would rightfully protest. &#8220;Who is this noisy, scruffy guy in our home? Â Why do we have to feed him and pay so much attention to him?&#8221; Â The cousin&#8217;s family, who also valued time over moneyÂ (e.g., preferring a relaxing lifestyle on modest means over hard work), was also not very happy. &#8220;I just wish we could go down to the beach and spend 2-3 hours enjoying coffee under the sun like we used to. Â And why is your big cousin telling us what to do anyway?&#8221; Â In addition, it was always likely that other, equally noisy and scruffy distant relatives might show up knocking at the door of the mansion, and demand the same attention. Â This was certainly more than big cousin had signed up for when opening the family bank account.</p>
<p><strong>Then there is a third option, which does not so much focus on teaching a lesson, but on saving face and postponing the worst trouble.</strong> Just give the little cousin a scolding and some pocket money to pay the rent and interest for a few months. Â At least he wouldn&#8217;t be out in the street. Â And, who knows, he might change his ways on his own in the meantime. Â Sweeping the mess under the rug is unlikely (although not provably impossible) that it&#8217;ll lead to any long-term solution, but it&#8217;s the option easiest to swallow by everyone involved.</p>
<p>Anyway, I&#8217;ll stop the anthropomorphic analogies here. Â Using a different analogy, I&#8217;ll add that<strong> tweaking the knobs (fiscal policy targets) and, perhaps, changing batteries (bail-out loans) won&#8217;t do much good in the long run if the machine is basically broken. Â But it&#8217;s hard to fix it if getting down to the cogs and gears that make it work (politics) is taboo</strong>, perhaps even more than it used to be (compare Victor Hugo&#8217;s vision of the &#8220;<a title="United States of Europe - Wikipedia" href="http://en.wikipedia.org/wiki/United_States_of_Europe#19th_century">United States of Europe</a>&#8221; more than a century ago, with the <a title="Treaty of Lisbon (2007) - Wikipedia" href="http://en.wikipedia.org/wiki/Treaty_of_Lisbon">Lisbon treaty</a>).</p>
<p>Although it&#8217;s a rather overloaded term, you can probably call me a technocrat. Â As such, Deng Xiaoping&#8217;s famous quote (&#8220;it doesn&#8217;t matter if it&#8217;s a black cat or a white cat, it&#8217;s a good cat as long as it catches mice&#8221;) is basically appealing. Â Cats competing with each other and against mice sounds like a &#8220;natural&#8221; situation, so it&#8217;s easy to overlook whether it&#8217;s the only possible state of affairs. Â However, Â if they&#8217;re domesticated and not out in the wild, it&#8217;s not hard to imagine the mice and both cats colluding to, basically, take it easy. Sometimes what is &#8220;natural&#8221; should be examined more closely.</p>
<p>Greece is the first to draw wide attention to such questions, but I don&#8217;t think it will be the last, nor is it theÂ <a title="Snake in the tunnel - Wikipedia" href="http://en.wikipedia.org/wiki/Snake_in_the_tunnel">first mishap</a> alongÂ <a title="European Monetary System - Wikipedia" href="http://en.wikipedia.org/wiki/European_Monetary_System">European integration</a>. Â I&#8217;d venture that, unless the EU collapses, everyone will find their place in it. Â <strong>Eventually.</strong></p>
<p>I&#8217;ll finish with an annotated graph (<a title="Î•Î Î&#x2122;Î›ÎŸÎ“Î— (in Greek)" href="http://www.allmedia.gr/Allmedia/_gr/digitalpublications/epilogi/2010-02/EPILOGI_02-2010.html">original source</a> via <a title="Î¤Î¿ Î¬Î³Î¿Ï‚ - metablogging.gr (in Greek)" href="http://metablogging.gr/archives/2641">metablogging.gr</a>, and <a title="Greek public debt - Google Docs (spreadsheet)" href="http://spreadsheets.google.com/ccc?key=0Ajh3Mupk84uIdDlTNEs1cmZSNTFMOG5zU0lJM1FBUVE&amp;hl=en">public Google spreadsheet</a> with subset of the data), showing Greek public debt (central government) as % of GDP over the past 40 years. I&#8217;ll just point out that<strong> 1981 looks like a particularly interesting year</strong>, for various reasons.</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="227" data-permalink="http://bitquill.net/blog/the-pesky-cousin-from-greece/greek_public_debt_annotated_final/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?fit=600%2C404" data-orig-size="600,404" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="greek_public_debt_annotated_final" data-image-description="" data-image-caption="&lt;p&gt;Greek public debt (central government) historical data&lt;/p&gt;
" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?fit=300%2C202" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?fit=600%2C404" class="size-full wp-image-227 alignnone" title="Greek public debt (central government) historical data" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?resize=600%2C404" alt="Greek public debt (central government) historical data" width="600" height="404" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?w=600 600w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2010/02/greek_public_debt_annotated_final.png?resize=300%2C202 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p><strong>Postscript.</strong> It&#8217;s often mentioned that &#8220;Greece has been in default for 50 years during the past two centuries.&#8221; Â This is true; after independence in 1821, Greece was bankrupt starting at the end of the 19th century under <a title="Charilaos Trikoupis - Wikipedia" href="http://en.wikipedia.org/wiki/Charilaos_Trikoupis">Charilaos Trikoupis</a>, and ending after WWII. Â During this period, Greece was involved in <a title="Greek territory - Wikipedia (image)" href="http://en.wikipedia.org/wiki/File:Greekhistory.GIF">a number of wars in the Balkans and Asia Minor, growing and shrinking in size a few times</a>. Obviously, this didn&#8217;t help financial matters, but I don&#8217;t think it bears much similarity to the current situation.</p>
<p>I&#8217;ve also been puzzled somewhat about the role of corruption. Â Obviously, it&#8217;s not good and I&#8217;m not trying to justify it in any way. Â On the other hand, it doesn&#8217;t seem to be the sole cause of trouble, as is often suggested. Â Several East Asian countries (notably China, although it&#8217;s not the first neither the only one) have shown progress despite corruption. I don&#8217;t have an answer, but it seems to me that, when you steal money, it matters where you steal it from. Â If I swipe some cash from my little brother&#8217;s wallet, it will make my brother poorer and angrier, but it probably won&#8217;t bankrupt the household; someone earned that money, even if it wasn&#8217;t me. Â However, if I pocket an advance withdrawal using the credit card our father gave us, it&#8217;ll get everyone in trouble, eventually.</p>
<p>Finally, as for 0% APR credit cards, it&#8217;s rather different if, say, Bill Gates (US) gets one versus if I get one (not that I&#8217;m <em>that</em> irresponsible : ). Â One of us has deeper pockets and that makes a difference on whether we deserve it, on the kind of trouble we can get in, and even on the moral hazards we face. Â As long as the card is used wisely for an appropriate period of time, it isn&#8217;t necessarily bad. Â Any <a title="Trouble in Europe - Brian Lehrer Show - WNYC" href="http://www.wnyc.org/shows/bl/episodes/2010/02/09/segments/149767">comparisons between US and Greece</a> are, at best, premature.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&amp;linkname=The%20pesky%20cousin%20from%20Greece" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fthe-pesky-cousin-from-greece%2F&#038;title=The%20pesky%20cousin%20from%20Greece" data-a2a-url="http://bitquill.net/blog/the-pesky-cousin-from-greece/" data-a2a-title="The pesky cousin from Greece"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/the-pesky-cousin-from-greece/#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/the-pesky-cousin-from-greece/feed/atom/" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Mobile OCR input: &#8220;Fully automatic&#8221; and reality]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/" />

		<id>http://www.bitquill.net/blog/?p=119</id>
		<updated>2016-05-12T19:45:37Z</updated>
		<published>2009-09-01T18:06:08Z</published>
		<category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="Android" /><category scheme="http://bitquill.net/blog" term="Computer Science" /><category scheme="http://bitquill.net/blog" term="Development" /><category scheme="http://bitquill.net/blog" term="Machine learning" /><category scheme="http://bitquill.net/blog" term="Mobile devices" /><category scheme="http://bitquill.net/blog" term="Research" /><category scheme="http://bitquill.net/blog" term="User interfaces" />
		<summary type="html"><![CDATA[Recently I&#8217;ve been toying around withÂ WordSnap OCR (project page, source code, app on Android Market), an app for OCR-based camera input on Android. In the process, I found out a few things about &#8220;smart&#8221; versus &#8220;fast&#8221;. At least in data mining, &#8220;fully automatic&#8221; is an often unquestioned holy grail. Â There are certainly several valid reasons [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/"><![CDATA[<p>Recently I&#8217;ve been toying around withÂ <a title="WordSnap OCR" href="http://www.bitquill.net/trac/wiki/Android/OCR">WordSnap OCR</a> (<a title="WordSnap OCR - Wiki" href="http://www.bitquill.net/trac/wiki/Android/OCR">project page</a>, <a title="WordSnap OCR - Google Code" href="http://code.google.com/p/wordsnap-ocr/source/browse/#svn/trunk">source code</a>, <a title="WordSnap OCR - Cyrket" href="http://www.cyrket.com/package/net.bitquill.ocr">app on Android Market</a>), an app for OCR-based camera input on Android. In the process, I found out a few things about <strong>&#8220;smart&#8221; versus &#8220;fast&#8221;</strong>.</p>
<p>At least in data mining, &#8220;fully automatic&#8221; is an often unquestioned holy grail. Â There are certainly several valid reasons for this, such asÂ if you&#8217;re trying to scan huge collections of books such asÂ <a title="Google Books" href="http://books.google.com/">this</a>, or index images from your daily life like <a title="Evernote" href="http://evernote.com/">this</a>. Â <strong>In this case, you use all the available processing power to make as few errors as possible</strong> (i.e., maximize accuracy).</p>
<p>However, if the user is sitting right in front of your program, watching your algorithms and their output, things are a little different. <strong>No matter how smart your algorithm is, some errors will occur.</strong> This tends to annoy users. In that sense, actively involved users are a liability. However, they can also be an asset: since they&#8217;re sitting there anyway, waiting for results, you may as well get them <em>really</em> involved.<strong> If you have cheap but intelligent labor ready and willing, use it!</strong> The results will be better or, at the very least, no worse. Â <strong>Also, users tend to remember the failures.</strong> So, even if end results were similar <em>on average</em>, allowing users to correct failures as early as possible will make them happier.</p>
<p><strong>Instead of making algorithms as smart as possible, the goal now is to make them as fast as possible, so that they produce near-realtime results that don&#8217;t have to be perfect; they just shouldn&#8217;t be total garbage.Â <span style="font-weight: normal;">When I started playing with the idea for WordSnap, I was thinking how to make the algorithms as smart as possible. Â However, for the reasons above, I soon changed tactics.</span></strong></p>
<p><strong><span style="font-weight: normal;"><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">The rest of this post describes some of the successful design decisions but, Â more importantly, the failures in the balance between &#8220;automatic&#8221; and &#8220;realtime guidance&#8221;.</span><span style="font-weight: normal;"><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">The story begins with the following example image:</span></strong></p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="149" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_original/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Original image" data-image-description="&lt;p&gt;Original grayscale camera image (scaled down to 512&amp;#215;384)&lt;/p&gt;
" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?fit=512%2C384" class="size-full wp-image-149 alignnone" title="Original grayscale image" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?resize=512%2C384" alt="Original image" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_original.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></p>
<p>Incidentally, this image was the inspiration for WordSnap: I wanted to look up &#8220;inimical&#8221; but I was too lazy to type. Also, for the record, WordSnap uses camera preview frames, which are semi-planar YUV data at HVGA resolution (480Ã—320). This image is a downsampled (512Ã—384) full-resolution photograph taken with the G1 camera (2048Ã—1536); most experiments here were performed before WordSnap existed in any usable form. Finally, I should point out that OCR isn&#8217;t really my area; what I describe below is based on common sense rather than knowledge of prior art, although just before writing this post I did try a quick review of the literature.</p>
<p><span id="more-119"></span></p>
<h3>Binarization</h3>
<p>A basic operation for OCR is binarization: mapping grayscale intensities between 0 and 255 to just two values: black (0) and white (1). Â Only then can we start talking about shapes (lines, words, characters, etc). Â One of the most widely used binarization algorithms isÂ <a title="Otsu's method - Wikipedia" href="http://en.wikipedia.org/wiki/Otsu's_method">Otsu&#8217;s method</a>. Â It picks a single, global threshold so that it maximizes the within-class (black/white) variance, or equivalently maximizes the across-class variance. This is very simple to implement, very fast and works well for flatbed scans, which have uniform illumination.</p>
<p><strong>However, camera images are not uniformly illuminated.</strong> The example image may look fine to human eyes, but it turns out that even for this image no global threshold is suitable (click on image for <a title="Global thresholding - Animation" href="http://www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global.gif">animation showing various global thresholds</a>):</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global.gif"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="157" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_bin_global_static/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Binarization with global threshold" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?fit=512%2C384" class="alignnone size-full wp-image-157" title="Binarization with global threshold" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?resize=512%2C384" alt="Binarization with global threshold" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_global_static.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></a></p>
<p>If you looked at the animation carefully, you might have noticed that at some point, at least the word of interest (&#8220;inimical&#8221;) is correctly binarized in this picture. Â However, if the lighting gradient were steeper, this would not be possible. Incidentally, <a title="ZXing - Google COde" href="http://code.google.com/p/zxing/">ZXing</a> uses Otsu&#8217;s method for binarization, because of it is fast. So, if you wondered why barcode scanning sometimes fails, now you know.</p>
<p>So, a slightly smarter approach is needed: instead of using one global threshold,<strong> the threshold should be determined individually for each pixel (i,j)</strong>. A natural threshold t(i,j) is the mean intensity Î¼<sub>w</sub>(i,j) of pixels within a wÃ—w neighborhood around pixel (i,j). Â The key operation here is mean filtering: convolving the original image with aÂ wÃ—w matrix with constant entries 1/w<sup>2</sup>.</p>
<p>The problem is that, using pure Java running on Dalvik, mean filtering is prohibitively slow. Â First, Dalvik is fully interpreted (no JIT, yet). Firthermore, the fact that Java bytes are always signed doesn&#8217;t help: casting to int and masking off the 24 most significant bits almost doubles running time.</p>
<table border="0" cellspacing="3" cellpadding="2">
<tbody>
<tr style="background-color: #dddddd">
<th> Method</th>
<th colspan="3" align="center">Dalvik (msec)</th>
<th colspan="3" align="center">JNI (msec)</th>
<th align="center"> Speedup</th>
</tr>
<tr>
<td>NaÃ¯ve</td>
<td align="right">109,882</td>
<td>Â±</td>
<td>4,813</td>
<td align="right">1,712</td>
<td>Â±</td>
<td>261</td>
<td align="center">64Ã—</td>
</tr>
<tr>
<td>Sliding</td>
<td align="right">2,435</td>
<td>Â±</td>
<td>141</td>
<td align="right">71</td>
<td>Â±</td>
<td>19</td>
<td align="center">34Ã—</td>
</tr>
</tbody>
</table>
<p>JNI to the rescue. The table above shows speedups for two implementations.  The naÃ¯ve approach uses a triple nested loop and has complexity O(w<sup>2</sup>mn), where m and n is the image height and width, respectively (m = 348, n = 512 in this example).  The 1-D equivalent would simply be:</p>
<pre>for i = 0 to N-1:
   s = 0
   for j = max(i-r,0) to min(i+r,N-1):
      s += a[j]</pre>
<p>where w = 2r+1 is the window size. The second implementation updates the sums incrementally, based on the values of adjacent windows. The complexity now is just O(mn). An interesting aside is the relative performance of two implementations for sliding window sums (where w = 2r+1 is the window size).  The first checks border conditions inside each iteration:</p>
<pre>Initialize s = sum(a[0]..a[r])
for i = 1 to N-1:
   if i &gt; r:
      s -= a[i-r-1]
   if i &lt; N-r:
      s += a[i+r]</pre>
<p>The second moves the border condition checks outside the loop which, if you think about it for a second, amounts to:</p>
<pre>Initialize s = sum(a[0]..a[r])
for i = 1 to r:
   s += a[i+r]
for i = r+1 to N-r-1:
   s -= a[i-r-1]
   s += a[i+r]
for i = N-r to N-1:
   s -= a[i-r-1]</pre>
<p>Among these two, the <em>first</em> one is faster, at least on a laptop running Sun&#8217;s JVM with JIT (I didn&#8217;t time Dalvik or JNI).<strong> I&#8217;m guessing that the second one messes loop unrolling</strong>, but I haven&#8217;t checked my guess.</p>
<p>It turns out that there is a very similar approach in the literature, called <em>Sauvola&#8217;s method</em>. Furthermore, there are <a href="http://www.dfki.uni-kl.de/~shafait/papers/Shafait-efficient-binarization-SPIE08.pdf">efficient methods</a> to compute it, using integral images. These are simply the 2-D generalization of partial sums. In 1-D, if partial sums are pre-computed, window sums can be estimated in O(1) time using the simple observation that sum(i&#8230;j) = sum(1..j) &#8211; sum(1..i-1).</p>
<p>Savuola&#8217;s method also computes local variance Ïƒ<sub>w</sub>(i,j), and uses a relative threshold t(i,j) = Î¼<sub>w</sub>(i,j)(1 + Î»Ïƒ<sub>w</sub>(i,j)/127).  <strong>WordSnap uses the global variance and an additive threshold</strong> t(i,j) = Î¼<sub>w</sub>(i,j) + Î»Ïƒ<sub>global</sub>, but after doing a contrast stretch of the original image (i.e., linearly mapping minimum intensity to 0 and maximum to 255).  Doing floating point math or 64-bit integer arithmetic is much more expensive, hence the additive threshold.  Furthermore, WordSnap does not use integral images because the same runtime can be achieved without the need to allocate a large buffer. <strong>Memory allocation on a mobile device is not cheap:</strong> the time needed to allocate a 480Ã—320 buffer of 32-bit integers (about 600KB total) varies significantly depending on how much system memory is available, whether the garbage collector is triggered and so on, but on average it&#8217;s about half a second on the G1. Even though most buffers can be allocated once, <strong>startup time is important</strong> for this application: if it takes more than 2-3 seconds to start scanning, the user might as well have typed the result.</p>
<p>Anyway, here is the final result of locally adaptive thresholding:</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="153" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_bin/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Binarization with local mean filter" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?fit=512%2C384" class="alignnone size-full wp-image-153" title="Binarization with local mean filter" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?resize=512%2C384" alt="Binarization with local mean filter" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></p>
<p><span style="font-family: 'Lucida Grande', Tahoma, Arial, sans-serif; font-weight: bold; font-size: 1em">Conclusion:</span> In this case we needed the slightly smarter approach, so we invested the time to implement it efficiently. WordSnap currently uses a 21Ã—21 neighborhood. Â Altogether, binarization takes under 100ms.</p>
<h3>Skew</h3>
<p>Another problem is that the orientation of the text lines may not be aligned with image edges. Â This is called skew and makes recognition much harder.</p>
<p>Initially, I set out to find a way to correct for skew. Â After a few searches on Google, I came across theÂ <a title="Hough transform - Wikipedia" href="http://en.wikipedia.org/wiki/Hough_transform">Hough transform</a>. Â The idea is simple. Â Sayyou want to detect a curve desribed by a set of parameters. E.g., for a line, those would be distance Ï from origin and slope Î¸. For each black pixel, find the parameter values for all possible curves to which this pixel may belong. For a line, that&#8217;s all anglesÂ Î¸Â from 0 to 180 degrees, and all distances Ï from 0 to sqrt(m<sup>2</sup>+n<sup>2</sup>). Â Then, compute the density distribution of parameter tuples. Â If a line (Ï<sub>0</sub>,Î¸<sub>0</sub>)Â is present in the image, then the parameter density distribution should have a local maximum at (Ï<sub>0</sub>,Î¸<sub>0</sub>).</p>
<p>If we apply this approach to our example image, the first maximum is detected at anÂ angle of 20 degrees. Here is the image counter-rotated by that amount:</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="150" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_bin_rot/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Skew correction" data-image-description="" data-image-caption="&lt;p&gt;After rotating by angle detected using Hough transform&lt;/p&gt;
" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?fit=512%2C384" class="size-full wp-image-150 alignnone" title="Skew correction using Hough transform" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?resize=512%2C384" alt="After rotating by angle detected using Hough transform" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></p>
<p>Success! Â However, computing the Hough transform is too slow! Â Typical implementations bucketize the parameter space. This would require a buffer of about 180Ã—580 32-bit integers (for a 480Ã—320 image), or about 410KB. In addition, it would require trigonometric operations or lookups to find the buckets for each pixel, not to mention counter-rotation. There are obvious optimizations one can try, such as computing histograms at multiple resolutions to progressively prune the parameter space. Â Still, the cost implied by back-of-the envelope calculations put me off from even trying to implement this on the phone. Instead, why not just try to use the users:</p>
<p><a href="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/09/finder.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="181" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/finder/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/09/finder.png?fit=480%2C320" data-orig-size="480,320" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Finder alignment guides" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/09/finder.png?fit=300%2C200" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/09/finder.png?fit=480%2C320" class="alignnone size-full wp-image-181" title="Finder alignment guides" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/09/finder.png?resize=480%2C320" alt="Finder alignment guides" width="480" height="320" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/09/finder.png?w=480 480w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/09/finder.png?resize=300%2C200 300w" sizes="auto, (max-width: 480px) 100vw, 480px" /></a></p>
<p><span style="font-family: 'Lucida Grande', Tahoma, Arial, sans-serif; font-weight: bold; font-size: 1em">Conclusion:</span> Simple approach with help from user wins, and<strong> the computer doesn&#8217;t even have to do <em>anything</em> to solve the problem!</strong> Incidentally, the guideline width is determined by the size of typical newsprint text at the smallest distance that the G1&#8217;s camera can focus.</p>
<h3>Font size</h3>
<p>Next, we need to detect individual words. Â The approach WordSnap uses is to <a title="Dilation - Mathematical morphology - Wikipedia" href="http://en.wikipedia.org/wiki/Mathematical_morphology#Dilation">dilate</a> the binary image with a rectangular structuring element (in the following image, the size 7Ã—7), and then expand a rectangle (shown in green) until it covers the connected component which, presumably, is one word.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="154" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_bin_rot_dilate3/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Dilation with 7&amp;#215;7 rectangle" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?fit=512%2C384" class="alignnone size-full wp-image-154" title="Dilation with 7x7 rectangle" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?resize=512%2C384" alt="Dilation with 7x7 rectangle" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate3.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></p>
<p>However, the size of the structuring element should really depend on the inter-word spacing, which in turn depends on the typeface as well as the distance of the camera from the text. Â For example, if we use a 5Ã—5 element, we would get the following:</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="155" data-permalink="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/skew_bin_rot_dilate2/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?fit=512%2C384" data-orig-size="512,384" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Dilation with 5&amp;#215;5 rectangular element" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?fit=300%2C225" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?fit=512%2C384" class="alignnone size-full wp-image-155" title="Dilation with 5x5 rectangular element" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?resize=512%2C384" alt="Dilation with 5x5 rectangular element" width="512" height="384" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?w=512 512w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/08/skew_bin_rot_dilate2.png?resize=300%2C225 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /></p>
<p>I briefly toyed with two ideas for font size detection. Â The first is to do a Fourier transform. Â Presumably the first spatial frequency mode would correspond to inter-word and/or inter-line spacing and the second mode to inter-character spacing. But that assumes we apply Fourier to a &#8220;large enough&#8221; portion of the image, and things start becoming complicated. Â Not to mention computationally expensive.</p>
<p>The second approach (which also appears to be the most common?) is to to hierarchical grouping. First expand rectangles to cover individual letters (or, sometimes, ligatures), then compute histogram of horizontal distances and re-group into word rectangles, and so on. Â This is also non-trivial.</p>
<p>Instead, WordSnap uses a fixed dilation radius. Â The implementation is optimized to allow near-realtime annotation of the detected word extent. Â This video should give you an idea:<br />
<object width="425" height="344" data="http://www.youtube.com/v/GhUOWbOmn6s&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/GhUOWbOmn6s&amp;hl=en&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /></object></p>
<p><span style="font-family: 'Lucida Grande', Tahoma, Arial, sans-serif; font-weight: bold; font-size: 1em">Conclusion:</span> Simple wins again, but this time we have to do <em>something</em> (and let the user help with the rest). But,<strong> instead of trying to be <em>smart</em> and find the best parameters given the camera position, we try to be <em>fast</em>: fix the parameters and let the user find the camera position that works given the parameters. </strong>WordSnap uses a 5Ã—5 rectangular structuring element, although you can change that to 3Ã—3 or 7Ã—7 in the preferenfces screen. Altogether, word extent detection takes about 150-200ms, although it could be significantly optimized, if necessary, by using only JNI only, instead of a mix of pure Java and JNI calls.</p>
<hr />
<p>I&#8217;m now looking into the possibility of moving OCR into the &#8220;live&#8221; loop: as you move the camera, the phone shows not only the word extent rectangle, but also the recognized word. Â Perhaps as a hyperlink to Google, or along with Google Translate results. Â Then I can justifiably use the buzzword of the day, <strong>&#8220;augmented reality&#8221;</strong>! Â It looks that it might just be possible, but let me get back to you in a week or two.Â Â :)</p>
<p><strong>Postscript:</strong> Some of the papers referenced were pointed out to me by <a title="Hideaki Goto - Homepage" href="http://www.sc.isc.tohoku.ac.jp/~hgot/">Hideaki Goto</a>, who started and maintains <a title="WeOCR - Homepage" href="http://weocr.ocrgrid.org/">WeOCR</a>. Also, skew detection and correction experiments are based on this <a href="http://www.bitquill.net/blog/wp-content/uploads/2009/09/test_skew.txt">quick-n-dirty Python script</a> (needs <a title="OpenCV - Homepage" href="http://opencv.willowgarage.com/wiki/">OpenCV</a> and it ain&#8217;t pretty!). <em>Update (9/2):</em> Fixed really stupid mistake in parametrization of line.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&amp;linkname=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fmobile-ocr-input-fully-automatic-and-reality%2F&#038;title=Mobile%20OCR%20input%3A%20%E2%80%9CFully%20automatic%E2%80%9D%20and%20reality" data-a2a-url="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/" data-a2a-title="Mobile OCR input: “Fully automatic” and reality"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/#comments" thr:count="13" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/mobile-ocr-input-fully-automatic-and-reality/feed/atom/" thr:count="13" />
			<thr:total>13</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[My godfather is a Markov model]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/my-godfather-is-a-markov-model/" />

		<id>http://www.bitquill.net/blog/?p=66</id>
		<updated>2009-05-07T06:31:17Z</updated>
		<published>2009-05-07T06:31:17Z</published>
		<category scheme="http://bitquill.net/blog" term="Life bits" /><category scheme="http://bitquill.net/blog" term="Web" />
		<summary type="html"><![CDATA[Before the memory is completely lost in the dust of time, I&#8217;d like to document how I ended up with this domain name. It all started last summer, when I decided to start a personal site. Of course, both my first and last names were already taken, even in TLDs I&#8217;d never heard of before. [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/my-godfather-is-a-markov-model/"><![CDATA[<p>Before the memory is completely lost in the dust of time, I&#8217;d like to document how I ended up with this domain name. It all started last summer, when I decided to start a personal site. Of course, both my first and last names were already taken, even in TLDs I&#8217;d never heard of before. Â But using my name would have been <em>too</em> easy anyway. Â Challenge is good.</p>
<p>Politically-correct and totally un-sarcastic as I am, I originally wanted to go with some combination of &#8220;principled anarchy&#8221;. Â Now, <em>that</em> was available! Apparently, nobody wanted to touch it with a ten foot pole, not even cybersquatters; which kind of gave me a hint. Â Wouldn&#8217;t want to, say, end up in a three-letter-agency watchlist, at least not while in the US on H1B. Â They might not share my sense of humor.</p>
<p>So, armed with online thesauri, dictionaries, theÂ <a title="Internet Anagram Server / I, Rearrangement Servant" href="http://wordsmith.org/anagram/">internet anagram server</a>, and things like that, I set out on a name quest. Â I don&#8217;t remember anymore what I tried; &#8220;coredump&#8221; (which, in case you didn&#8217;t know, has &#8220;code rump&#8221; as an anagramâ€”still available, if you&#8217;re interested), &#8220;segfault&#8221;, &#8220;brainfart&#8221;, &#8220;farout&#8221;, and pretty much anything else I could think of: all taken. Â  EvenÂ <a title="Top 10 Worst Domain Names - Dreamhost Unofficial Blog" href="http://blog.dreamhosters.com/2006/07/26/top-10-worst-domain-names/">these names</a>Â as well as <a title="20 More Unfortunate Domain Names - Dreamhost Unofficial Blog" href="http://blog.dreamhosters.com/2007/01/26/20-more-unfortunate-domain-names/">these</a>Â are taken (thank god!).</p>
<p>At some point I was naÃ¯ve enough to hope that a Tolkien name would be free. Â No luck of course, anything semi-pronnounceable was taken. Â You&#8217;d have to go as far as, say, Â &#8220;gulduin&#8221; (which, by the way, means &#8220;magic river&#8221; in Elvish) to find something available. Good luck getting people to remember <em>that</em>! Â Oh well, at least I had a reason to actually read some of the Silmarillion; if you&#8217;ve tried this and you&#8217;re not a religiously devoted Tolkien fan, you know what I&#8217;m talking about.</p>
<p>After the first week of searching, I think I even got temporarily banned from Yahoo! whois search. In desperation, I finally turned to one of many domain name generators. Â I asked omniscient Google to give me one and, as always,Â <a title="Domain Name Generator and Search - MakeWords.com" href="http://www.makewords.com/">it obliged</a>. Â By now I had decided that I wanted a name as free of any connotations as possible (say, like Google or Slashdot, not like Facebook or YouTube). Â I went through things like &#8220;fractors&#8221;, &#8220;naphead&#8221;, &#8220;magnarchy&#8221;, &#8220;aniarchy&#8221;, &#8220;mallock&#8221;, &#8220;hexndex&#8221;, &#8220;squilt&#8221;, &#8220;terable&#8221;, and so on.Â It&#8217;s amazing how several weeks of searching in frustration temper one&#8217;s standards of quality.Â Anyway, one day &#8220;bitquill&#8221; popped up: neutral, inoffensive, bland, unusual, and a composite which is short and almost pronnounceable! Â I couldn&#8217;t ask for much more, so I registered it. Â </p>
<p>That, and &#8220;clusterhack&#8221;. Â Sorry. Â I couldn&#8217;t resist.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&amp;linkname=My%20godfather%20is%20a%20Markov%20model" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fmy-godfather-is-a-markov-model%2F&#038;title=My%20godfather%20is%20a%20Markov%20model" data-a2a-url="http://bitquill.net/blog/my-godfather-is-a-markov-model/" data-a2a-title="My godfather is a Markov model"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/my-godfather-is-a-markov-model/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/my-godfather-is-a-markov-model/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Hello Android]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/hello-android/" />

		<id>http://www.bitquill.net/blog/?p=65</id>
		<updated>2016-05-12T19:46:46Z</updated>
		<published>2009-05-06T16:20:05Z</published>
		<category scheme="http://bitquill.net/blog" term="Sci &amp; Tech" /><category scheme="http://bitquill.net/blog" term="Android" /><category scheme="http://bitquill.net/blog" term="Development" />
		<summary type="html"><![CDATA[After blabbering about Android, I decided to get my hands a little dirty and actually write some code. For various reasons, I won&#8217;t describe the app (it was a &#8220;weekend hack&#8221; anyway), but hopefully my first impressions will be clear even without a specific context. Overall, the Android APIs are quite impressive, even though some [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/hello-android/"><![CDATA[<p>After blabbering about Android, I decided to get my hands a little dirty and actually write some code. For various reasons, I won&#8217;t describe the app (it was a &#8220;weekend hack&#8221; anyway), but hopefully my first impressions will be clear even without a specific context.  <span id="more-65"></span></p>
<p>Overall, the Android APIs are quite impressive, even though some edges are still rough. Â It was reasonably easy to get up to speed, even though my prior experience on mobile application frameworks was zero. Â The toughest part was getting used to the heavily event-based programming style, as well as the idea that your code may be interrupted, killed and restarted at any time.</p>
<p><strong>Activity lifecycle.</strong> Although Android supports multitasking and concurrency, on a mobile device with limited memory and no swap it&#8217;s likely that the O/S will have to kill some or all of your tasks to reclaim resources needed by higher-priority, user-visible processes (e.g., an incoming phone call). Â If you have non-persistent or external state, such as open database connections or separate threads that fetch data in the background, things may get a little tricky. Although Android has auxiliary features such as managed cursors and dialogs, you still need to know they exist and use them properly.</p>
<p>However, even things like <a title="Configuration Changes - android.app.Activity Javadoc" href="http://code.google.com/android/reference/android/app/Activity.html#ConfigurationChanges">screen orientation changes</a>Â are handled by terminating and restarting any affected activities. At first, while spending a couple of hours to figure out why my app was crashing when I opened the keyboard, I bitched about this. Apparently, I wasn&#8217;t the only one who was confused. To my surprise, I foundÂ that many Android Market apps crash when the screen is rotated. Â Some Market apps even come with grave-sounding warnings that, e.g., &#8220;the life counter [sic] resets on screen orientation change =/ Will fix for new version.&#8221; Luckily, I also found numerous good posts about orientation changes, such as <a title="Rotational Forces, Part Two - Mark Murphy on AndroidGuys blog" href="http://androidguys.com/?p=2642">this</a> or <a title="Rotational Forces, Part Three - Mark Murphy on AndroidGuys blog" href="http://androidguys.com/?p=2723">this</a>Â (the <a title="Mark Murphy on AndroidGuys" href="http://androidguys.com/?author=20">series by Mark Murphy</a> are pretty good, by the way), as well as aÂ <a title="Faster screen orientation changes - Android Developers Blog" href="http://android-developers.blogspot.com/2009/02/faster-screen-orientation-change.html">post on the official blog</a>.</p>
<p>In retrospect, handling orientation changes in this way is a good thing: it forces app developers to be prepared. After I fixed my code to handle orientation changes gracefully, I found that I was also ready to properly handle other sources of interruption: when an incoming call came as I was testing my app, everything worked out beautifully.</p>
<p>Now, whenever I download an app, I perform the following test: I flip the keyboard open when the app executes a background operation, even if I don&#8217;t need to type anything. Â If the app crashes or gets into an inconsistent state (something that happens surprisingly often), that&#8217;s a strong indication that the code is not very robust.</p>
<p><strong>Event handling.</strong> For APIs that are so heavily event-based, one of my gripes was that some (but not all) event handlers are based on inheritance rather thanÂ <a title="Delegation pattern - Wikipedia" href="http://en.wikipedia.org/wiki/Delegation_pattern">delegation</a>.Â These design choices are probably due toÂ <a title="Prefer virtual over interface - Designing for Performance - Android documentation" href="http://developer.android.com/guide/practices/design/performance.html#prefer_virtual">performance reasons</a>Â that may be specific to Dalvik, the Android VM which is motivated partly forÂ <a title="Dalvik: how Google routed around Sunâ€&#x2122;s IP-based licensing restrictions on Java ME - Stefano's Linotype" href="http://www.betaversion.org/~stefano/linotype/news/110/">non-technical reasons</a>.Â </p>
<p>However, inheritance sometimes complicates things. For example, Android supports managed cursors and dialogs via methods in the base Activity class. On more than one occasion I found that managed threads would also be nice. Â Implementing this requires hooking into the activity lifecycle events (and has, on occasion, been <a title="A Simple [sic] Android App and a Threading Bug - OCIWeb" href="http://www.ociweb.com/jnb/jnbJan2009.html">over-engineered to death</a>). Because there are several Activity subclasses (e.g., ListActivity, PreferenceActivity, etc), there is no simple way to extend them all. If lifecycle events were handled via delegates, it would be possible to implement a background UI thread manager as, say, an activityÂ <a title="Decorator pattern - Wikipedia" href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator</a>Â that can be added to any activity instance. Â </p>
<p>The delegation-based event model was introduced in Java 1.1 preciselyÂ <a title="Java AWT: Delegation Event Model - Sun.com" href="http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/events.html">to address such shortcomings</a>Â of the inheritance-based model. But, being pragmatic about performance on current mobile devices, I should probably not complain too much. Â Still, some API design choices seem a bit arbitrary, perhaps even Microsoft-esque: why would performance be an issue with lifecycle events (which are presumably rare, but handlers use inheritance) but not with click events (which are presumably more frequent, but handlers use delegation)?</p>
<p><strong>Data sync and caching.</strong> Another gripe was the lack of <a title="android.content.AbstractSyncableContentProvider - Git" href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/AbstractSyncableContentProvider.java">syncable content providers</a>, something I&#8217;ve mentioned before. Also, content providers aren&#8217;t really appropriate for network-hosted data. The requirement that content providers use an integer primary key (row ID) is reasonable for local databases and simplifies the APIs, but requires some book-keeping when that&#8217;s not the &#8220;natural&#8221; primary key.</p>
<p>Ideally, I&#8217;d like to see some support for caching remote data on the SD card (which would require gracefully handling card removal, and transparently fetching data either from the cache or the network). Although the core APIs provide all that is necessary to implement this from scratch, it was getting too complicated for my simple &#8220;weekend hack&#8221; app, so I decided to drop it.</p>
<p>I hope that, in the near future, porting web apps to mobile devices will become easier with the support forÂ <a title="Offline web applications - HTML5 (Working Draft) - W3C" href="http://www.w3.org/TR/html5/offline.html">offline applications</a>Â andÂ <a title="Structured client-side storage - HTML5 (Working draft) - W3C" href="http://www.w3.org/TR/html5/structured.html">client-side storage</a>Â in HTML5, as well the proposedÂ <a title="Geolocation API specification (Editor's draft) - W3C" href="http://dev.w3.org/geo/api/spec-source.html">geolocation APIs</a>Â (all of which are alreadyÂ <a title="Gears as a bleeding-edge HTML 5 implementation" href="http://almaer.com/blog/gears-as-a-bleeding-edge-html-5-implementation">part of Google Gears</a>). An application manifest might include &#8220;web activities&#8221;, translating intents into HTTP POST requests, while granting device access permissions to those activities (e.g., see promising hacks such asÂ <a title="OilCan: GreaseMonkey on steroids for Android" href="http://www.jsharkey.org/blog/2008/12/15/oilcan-greasemonkey-on-steroids-for-android/">OilCan</a>). Porting might then involve little more than writing a new stylesheet. Perhaps that&#8217;s where Palm is going with itsÂ <a title="Palm WebOS Developer Site (retrieved 2/24)" href="http://developer.palm.com/">WebOS</a>Â which apparently supports both &#8220;native application&#8221; and &#8220;web application&#8221; models, but information is rather thinÂ at the moment.</p>
<p><strong>Epilogue.</strong>Â My first Android app was an interesting learning experience, not only from a technical standpoint (perhaps more on this in another post).Â I also found that Android is quite stable. I sometimes used my phone for live debugging, forcefully killing threads and processes through ADB. Â Let me put it this way: if it wasn&#8217;t for the RC33 OTA update, my phone would now have an uptime of a few months. For a piece of software that barely existed a year ago, this is impressive.</p>
<p>There is plenty of documentation available, but at times it can take some searching to find the necessary information. Â However, since Android is open-source, it&#8217;s always possible to consult the source code itself (which is fairly well-written and documented).</p>
<p><em><strong>Note:</strong>Â This post was mostly written sometime around February. Since then I had no time to try SDK v1.5, but I believe most points above are still relevant.</em></p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&amp;linkname=Hello%20Android" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fhello-android%2F&#038;title=Hello%20Android" data-a2a-url="http://bitquill.net/blog/hello-android/" data-a2a-title="Hello Android"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/hello-android/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/hello-android/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>spapadim</name>
							<uri>http://bitquill.net/</uri>
						</author>

		<title type="html"><![CDATA[Back again&#8230;]]></title>
		<link rel="alternate" type="text/html" href="http://bitquill.net/blog/back-again/" />

		<id>http://www.bitquill.net/blog/?p=71</id>
		<updated>2016-05-12T19:48:03Z</updated>
		<published>2009-04-07T19:40:59Z</published>
		<category scheme="http://bitquill.net/blog" term="Life bits" /><category scheme="http://bitquill.net/blog" term="Pointless" />
		<summary type="html"><![CDATA[After coming back from Seoul, New York seemed even dinkier thanÂ the last time I returned from a trip. As I was boarding the plane at Incheon, I picked up a copy of the Wall Street Journal (Asian edition).Â I had enough time to read almost all of it, as KAL arrived into Narita early, but Continental [&#8230;]]]></summary>

					<content type="html" xml:base="http://bitquill.net/blog/back-again/"><![CDATA[<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="73" data-permalink="http://bitquill.net/blog/back-again/korea-collage/" data-orig-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?fit=630%2C340" data-orig-size="630,340" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="Seoul &amp;#8211; Collage" data-image-description="" data-image-caption="&lt;p&gt;Seoul&lt;/p&gt;
" data-medium-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?fit=300%2C161" data-large-file="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?fit=630%2C340" class="size-full wp-image-73 alignnone" title="Seoul - Collage" src="https://i0.wp.com/www.bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?resize=630%2C340" alt="Seoul" width="630" height="340" srcset="https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?w=630 630w, https://i0.wp.com/bitquill.net/blog/wp-content/uploads/2009/04/korea-collage.jpg?resize=300%2C161 300w" sizes="auto, (max-width: 630px) 100vw, 630px" /></p>
<p>After coming back from Seoul, New York seemed even dinkier thanÂ <a title="A dog's life - bitquill.net" href="http://www.bitquill.net/blog/?p=45">the last time I returned from a trip</a>. As I was boarding the plane at Incheon, I picked up a copy of the Wall Street Journal (Asian edition).Â I had enough time to read almost all of it, as KAL arrived into Narita early, but Continental was six hours late.Â It might as well have been called &#8220;The GM Journal&#8221;, since about two thirds of the stories were about GM and Chrysler, and how the US government is trying to save them from doom due to chronic mis-management and exorbitant legacy costs. Â </p>
<p>My wife, who has a far more sensitive nose than me, jokes that the first thing you smell upon disembarking the plane is cigarette smoke in Greece, and garlic in Korea. <span id="more-71"></span> Upon arriving at Newark (or any NYC airport, for that matter), even I can smell the mouldy carpets. Â Getting on the subway the next morning, the smell was even worse and the signs of age everywhere. Â I sat down, right across a poster ad by NYC Department of Consumer Affairs that read &#8220;Debt Stress? Â You&#8217;re not alone&#8221;. Â Someone had plastered a makeshift sticker on top, reading &#8220;Kill Your Boss&#8221;. Â After a ride on Metro North, I got into a taxi to work. Â It was one of those Ford relics, with a severely dented right side, a cracked windshield and a barely functioning transmission, but still street-legal. Â As the cab ended up triple-booked and I was the last one to get off, I got a 35-minute scenic tour through backstreets and pothole-riddled roads before finally arriving to the office.</p>
<p>The experience was enough to make me look up the definition of &#8220;<a title="Developing country - Wikipedia" href="http://en.wikipedia.org/wiki/Developing_country">developing country</a>&#8221; in Wikipedia. Honestly, I don&#8217;t get why South Korea is sometimes still listed as such (e.g., in WSJ and, if memory serves me right, in the Economist), while the US isn&#8217;t. Something tells me it&#8217;s more than GM that needs patching up.Â Anyway, welcome back home!</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&amp;linkname=Back%20again%E2%80%A6" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fbitquill.net%2Fblog%2Fback-again%2F&#038;title=Back%20again%E2%80%A6" data-a2a-url="http://bitquill.net/blog/back-again/" data-a2a-title="Back again…"></a></p>]]></content>
		
					<link rel="replies" type="text/html" href="http://bitquill.net/blog/back-again/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="http://bitquill.net/blog/back-again/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
	</feed>
