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

<channel>
	<title>Blog</title>
	<atom:link href="http://antimatter15.com/wp/feed/" rel="self" type="application/rss+xml" />
	<link>http://antimatter15.com/wp</link>
	<description>this title probably isn&#039;t very original</description>
	<lastBuildDate>Wed, 08 May 2013 23:35:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>http://antimatter15.com/wp/</title>
		<link>http://antimatter15.com/wp/2013/04/recoloring-planck-data/</link>
		<comments>http://antimatter15.com/wp/2013/04/recoloring-planck-data/#comments</comments>
		<pubDate>Tue, 30 Apr 2013 13:21:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Planck/WMAP]]></category>
		<category><![CDATA[age]]></category>
		<category><![CDATA[background]]></category>
		<category><![CDATA[blue]]></category>
		<category><![CDATA[colors]]></category>
		<category><![CDATA[continents]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[earth]]></category>
		<category><![CDATA[eurpoeans]]></category>
		<category><![CDATA[evolution]]></category>
		<category><![CDATA[gradients]]></category>
		<category><![CDATA[green]]></category>
		<category><![CDATA[microwave]]></category>
		<category><![CDATA[murrica]]></category>
		<category><![CDATA[old]]></category>
		<category><![CDATA[pizza]]></category>
		<category><![CDATA[planck]]></category>
		<category><![CDATA[pointilism]]></category>
		<category><![CDATA[pointlessism]]></category>
		<category><![CDATA[purple]]></category>
		<category><![CDATA[radiation]]></category>
		<category><![CDATA[red]]></category>
		<category><![CDATA[roygbiv]]></category>
		<category><![CDATA[shiny]]></category>
		<category><![CDATA[stars]]></category>
		<category><![CDATA[universe]]></category>
		<category><![CDATA[vibgyor]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2639</guid>
		<description><![CDATA[The rationale behind this is actually pretty contrived, but one of my friends had an imminent birthday, and I had no idea what kind of present to get her. Incidentally she sent had been working on some project and sent me a copy to look over- a request that I honored by perpetually promising to [...]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://antimatter15.com/wp/wp-content/uploads/2013/05/Recolored-and-Merged-OnWhite-Thumbnail.jpg"><img class="aligncenter  wp-image-2645" alt="Recolored and Merged OnWhite Thumbnail" src="http://antimatter15.com/wp/wp-content/uploads/2013/05/Recolored-and-Merged-OnWhite-Thumbnail.jpg" width="700" height="349" /></a></p>
<p>The rationale behind this is actually pretty contrived, but one of my friends had an imminent birthday, and I had no idea what kind of present to get her. Incidentally she sent had been working on some project and sent me a copy to look over- a request that I honored by perpetually promising to get to it <em>eventually</em>. Sure, it was interesting enough, but several months elapsed and I was beginning to face the fact that I would in all likelihood never actually get to it (kind of like my bottomless Instapaper queue from three years ago)- but that resounding guilt instilled the notion that somehow she liked astrophysics (the paper was something on <a href="http://www.nobelprize.org/nobel_prizes/physics/laureates/2011/">Perlmutter&#8217;s Nobe</a>l). So in the absence of any other good ideas, I decided to get her a giant printout of the classic WMAP CMBR.</p>
<p>Soon after finding a poster for sale off <a href="http://www.zazzle.com/">Zazzle </a>entitled the &#8220;<a href="http://www.zazzle.com/face_of_god_poster-228261263707923223">Face of God</a>&#8221; (a particularly poetic pantheistic epithet), I found out that only a week earlier the European Space Agency had published the results of their <a href="http://apod.nasa.gov/apod/image/1303/">Planck probe</a>- a substantially higher quality rendition of the cosmic microwave background. So the solution would be simple, I&#8217;d just take that new, clearer image and upload it to that poster-printer under some clever title like &#8220;Face of God- <a href="http://www.youtube.com/watch?v=XpaOjMXyJGk">Dove Real Beauty</a><sup>TM</sup>&#8220;, as if the NASA&#8217;s WMAP is some kind of odd <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/GaussianGirl">gaussian girl trope</a>.</p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2013/05/Original-OnWhite-Thumbnail.jpg"><img class="alignright size-medium wp-image-2646" alt="Original OnWhite Thumbnail" src="http://antimatter15.com/wp/wp-content/uploads/2013/05/Original-OnWhite-Thumbnail-300x151.jpg" width="300" height="151" /></a></p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2013/04/ilc_9yr_moll720-300x150.jpg"><img class="alignnone size-full wp-image-2653" alt="ilc_9yr_moll720-300x150" src="http://antimatter15.com/wp/wp-content/uploads/2013/04/ilc_9yr_moll720-300x150.jpg" width="300" height="150" /></a></p>
<p>But the ESA&#8217;s Planck coloring is for some unfathomable reason particularly ugly. Sure it has a kind of crude appeal reminiscent of some kind of yellowed 14th century cartographic map with its tan speckled shades of color, but in general, it&#8217;s just kind of ugly. Maybe it&#8217;s <a href="http://en.wikipedia.org/wiki/Evolution_of_the_eye">five hundred million years of evolution</a> that makes me particularly predisposed to the blue-green aesthetic of leafy flora and the azure sky. Also, for sake of recognizability, the WMAP data has made its fame with that <em>particular</em> coloring, it&#8217;s kind of unreasonable to expect someone to recognize it even after the color scheme has been changed.</p>
<p>The task of recoloring it was actually pretty simple, I just had to locate a legend for the respective graphs- a solid gradient which spans from the cool side to the warm side (the actual range of the data is only ±2mK so there isn&#8217;t in this case a massive difference between cool and warm). After crawling through a handful of scientific publications, it&#8217;s easy enough to find one and take a screenshot.</p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2013/05/wmap.png"><img class="alignnone size-full wp-image-2647" alt="wmap" src="http://antimatter15.com/wp/wp-content/uploads/2013/05/wmap.png" width="160" height="7" /></a><a href="http://antimatter15.com/wp/wp-content/uploads/2013/05/planck-small.png"><img class="alignright size-full wp-image-2648" alt="planck-small" src="http://antimatter15.com/wp/wp-content/uploads/2013/05/planck-small.png" width="256" height="5" /></a></p>
<p>The difference in width is actually a kind of useless distinction, an artifact of the resolution of the paper or image I extracted the gradient from. It&#8217;s kind of interesting because I don&#8217;t really have any idea what the mathematical basis of these gradients are. The WMAP one looks like a simple rainbow so it may just be the colors arranged in progressively increasing wavelength, while the ESA coloring appears to be some kind of linear interpolation between red, white and blue (if the nationalities were inverted, one might be tempted to say murrica).</p>
<p>But once the gradient is established, it becomes the trivial task of mapping the colors of one image to another, something that I kind of hackedly accomplished with a Python script using PIL (It took a minute or so to process the 8 million pixels, but that&#8217;s not really too bad). And then, because the ultimate purpose of my project wasn&#8217;t so much to attain scientific accuracy as feigning it with some kind of better aesthetic, I went to GIMP and superimposed a translucent copy of the WMAP data so the image isn&#8217;t quite so speckled and the larger continental blobs more apparent.</p>
<p><a href="http://www.zazzle.com/recolored_planck_cmbr-228277903548974917">Here is the poster</a> if you want it. And <a href="http://i1.minus.com/iCgy2H2o85YEQ.jpg">the resulting 6.1MB jpeg</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2013/04/recoloring-planck-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hqx.js &#8211; pixel art scaling in the browser</title>
		<link>http://antimatter15.com/wp/2013/03/hqx/</link>
		<comments>http://antimatter15.com/wp/2013/03/hqx/#comments</comments>
		<pubDate>Sun, 31 Mar 2013 22:30:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Multimedia Codecs]]></category>
		<category><![CDATA[bicubic]]></category>
		<category><![CDATA[bilinear]]></category>
		<category><![CDATA[blit]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[chromebook]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[hqx]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[lanzcos]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[nearest-neighbor]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[old]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[pixel]]></category>
		<category><![CDATA[polyfill]]></category>
		<category><![CDATA[retina]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[signals]]></category>
		<category><![CDATA[upconvert]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2620</guid>
		<description><![CDATA[Every once in a while some gadget has the misfortune of epitomizing the next first world problem. I guess right now, this is owning a Retina (or equivalent) laptop, tablet (arguably phone, but most web pages are scaled out so it&#8217;s not that big of a problem) and being irked at the prevalence of badly [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.github.com/hqx.js/"><img class="size-full wp-image-2626 alignnone" alt="Screenshot 2013-03-31 at 5.15.07 PM" src="http://antimatter15.com/wp/wp-content/uploads/2013/03/Screenshot-2013-03-31-at-5.15.07-PM.png" width="565" height="157" /></a></p>
<p>Every once in a while some gadget has the misfortune of epitomizing the next first world problem. I guess right now, this is owning a Retina (or equivalent) laptop, tablet (arguably phone, but most web pages are scaled out so it&#8217;s not that big of a problem) and being irked at the prevalence of badly scaled graphics. So there&#8217;s a new buzzword &#8220;Retina Ready&#8221; for websites, layouts and designs which support higher resolution graphics for devices which support it, often meaning of lots of <a href="http://37signals.com/svn/posts/3271-easy-retina-ready-images-using-scss">new files and new css rules</a>. It&#8217;s this trend of high-pixel-density devices (with devices like the <a href="http://www.apple.com/ipad/">iPad 3</a>, <a href="http://www.apple.com/macbook-pro/">Retina Macbook Pro</a>, <a href="http://www.google.com/nexus/10/">Nexus 10</a> and <a href="http://www.google.com/intl/en/chrome/devices/chromebook-pixel/">Chromebook Pixel</a> - though I for one don&#8217;t currently have any of them, just this old glitchy-albeit-functional first generation Chromebook) that is <a href="https://github.com/twitter/bootstrap/pull/6342">driving people</a> to vector <a href="http://fortawesome.github.com/Font-Awesome/">icon fonts</a>.</p>
<p>But the problem of radical increases in terms of resolution isn&#8217;t a new one. Old <a href="http://en.wikipedia.org/wiki/Video_game_arcade_cabinet#Parts_of_an_arcade_cabinet">arcade games</a> rarely exceeded 260&#215;315, and the <a href="http://en.wikipedia.org/wiki/Game_Boy_Color#Specifications">Game Boy Color</a> had a paltry 160&#215;144. While a few people still nostalgically lug around game cabinets and dig out their dust-covered childhood handheld consoles for nostalgic sneezing fits, most of the old games are now played with emulators running on systems several orders of magnitude more sophisticated in every imaginable aspect. So that arcade monitor that once could engross a childhood (and maybe early manhood) now appears nothing more than a two inch square on a twenty inch monitor. But luckily there is a surprisingly good solution to all of this in the form of algorithms designed in particular for <a href="http://en.wikipedia.org/wiki/Image_scaling#Pixel_art_scaling_algorithms">scaling pixel art</a>.</p>
<p>The most basic form of image scaling that exists is called <strong>nearest-neighbor interpolation</strong>, which is extra simple for retina devices because it means simply growing the size of each pixel by a factor of two along each axis. That leads to things which are blocky, and unless you&#8217;re part of an 8-bit retro-art project with a chiptune soundtrack looks ugly.</p>
<p>The most common form of image scaling borrows a lot from the math and signal processing fields, with names like <strong>bilinear, bicubic, and lanzcos</strong> essentially they treat an image as some kind of composition of sinusoidal parts and try to ideally extrapolate and interpolate such that visible artifacts are marginalized. It&#8217;s all very mathy, but the result is kind of the opposite of nearest-neighbor because it has the tendency to make things blurry and fuzzy.</p>
<p>The thing is that the latter tries to reach some kind of mathematical ideal, because images taken by your friendly neighborhood DSLR-toting amateur (spider-powers optional) are actually samples of real world points of data&#8211; so this mathematical pursuit of purity works out very well. There&#8217;s still the factor-of-four information-theoretic gap that needs to be filled in with best-guesstimates, but there isn&#8217;t really any way to improve the way a photograph is scaled without using a higher-resolution version of said photograph. But most photographs that are taken already are sixteen-megapixel monsters and they usually still look acceptable when upscaled.</p>
<p>The problem arises with pixel art, little icons or buttons which someone painstakingly drew in Photoshop one lazy summer afternoon in the late 90s. They&#8217;re everywhere and each pixel isn&#8217;t captured and encoded by a sampling algorithm of some analog natural phenomona&#8211; each pixel was lovingly crafted and planted by some meticulous artist. There is no underlying analog signal to interpret, it&#8217;s a direct perceptual hookup to the mind of the creator&#8211; and that&#8217;s why bicubic sampling looks especially bad here.</p>
<p>Video games, before 3d graphics engines and math-aware anti-aliasing concerned with murdering <a href="http://en.wikipedia.org/wiki/Jaggies">jaggies</a>, in the old civilized age of <a href="http://en.wikipedia.org/wiki/Bit_blit">bit-blitting</a>, were mostly constructed out of pixel art. Each color in that limited palette was placed there for a reason and could be exploited by specialized algorithms to construct higher-quality upscaled versions which remained sharp. These come with the names <strong>EPX, Scale2x, AdvMAME2x, Eagle, 2×Sal, Super <strong>2×Sal,</strong></strong> <strong>hqx, </strong>and most recently, <strong>Kopf-Lischinksi</strong>. These algorithms could be applied in real time to emulator windows to acceptably scale a game to new sizes while eschewing jagged corners and blurry edges. <em><br />
</em></p>
<p>Anyway the cool thing is that you can probably apply these algorithms in lieu of the nearest-neighbor or bilinear scaling algorithms used by browsers on retina platforms to effortlessly upgrade old sites to shiny and smooth. With a few rough heuristics (detect if an image appears to be a sprite by testing for a limited palette, see if the image is small or a perfect square, detect if it has transparent pixels) this could be packed into a simple script include that website makers could easily inject into their pages to <strong>automagically upconvert old graphics</strong> to new shiny high-resolution ones without having to go through the actual effort of drawing new high resolution graphics and uploading them online. And this could also be packaged as a browser extension so that, once and forever after, <strong>this first-world nuisance shall be no more</strong>.</p>
<p><em>Before setting out to port <a href="https://github.com/Arcnor/hqx-java">hqx-java</a> to <a href="https://github.com/antimatter15/hqx.js">javascript</a>, I actually did some cursory googling to see if it actually had been done before. Midway through writing this post, I found out that it actually had <a href="http://phoboslab.org/log/2010/12/hqx-scaling-in-javascript">been done before</a>, in a better way, so I won&#8217;t even bother linking to my inferior version. But either way the actual goal of this project was the part which was detailed in the last paragraph, that of an embeddable script or browser extension which could heuristically apply pixel-scaling algorithms&#8211; something I probably won&#8217;t bother trying to do until at least after I get my college laptop (which I anticipate will be a Retina Macbook Pro 15&#8243;). Nonetheless, I haven&#8217;t written an actual blog post in almost three months and it&#8217;s the last day of this month, and I guess it&#8217;s better than having you all (though nobody&#8217;s probably going to read this now that Google Reader has died) assume that I&#8217;ve died. Anyway, now I&#8217;m probably going to retroactively publish old blog posts in previous months to fraud continuity.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2013/03/hqx/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Facebook Chat Bot, Turing Completeness</title>
		<link>http://antimatter15.com/wp/2012/12/facebook-chat-bot-turing-completeness/</link>
		<comments>http://antimatter15.com/wp/2012/12/facebook-chat-bot-turing-completeness/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 07:12:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Facebook Bot]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[collatz]]></category>
		<category><![CDATA[completeness]]></category>
		<category><![CDATA[computation]]></category>
		<category><![CDATA[compute]]></category>
		<category><![CDATA[esoteric]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[fire]]></category>
		<category><![CDATA[fringe]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[meta tagging]]></category>
		<category><![CDATA[mittens]]></category>
		<category><![CDATA[mutationobserver]]></category>
		<category><![CDATA[new year]]></category>
		<category><![CDATA[revisionism]]></category>
		<category><![CDATA[tag system]]></category>
		<category><![CDATA[tagging]]></category>
		<category><![CDATA[turing]]></category>
		<category><![CDATA[tv]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2607</guid>
		<description><![CDATA[Okay, so I really want to maintain at least one blog post per month, and here I am, right before New Year&#8217;s with no apocalypse in sight to rapture me away from having to write a blog post. I don&#8217;t have anything particularly interesting ready to share, so here&#8217;s something fun that only took a [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/12/collatz-2.png"><img class="alignright size-full wp-image-2608" alt="" src="http://antimatter15.com/wp/wp-content/uploads/2012/12/collatz-2.png" width="198" height="706" /></a>Okay, so I really want to maintain at least <a href="http://antimatter15.com/wp/2012/08/upcoming-changes/">one blog post per month</a>, and here I am, right before New Year&#8217;s with no apocalypse in sight to rapture me away from having to write a blog post. I don&#8217;t have anything particularly interesting ready to share, so here&#8217;s something fun that only took a few hours.</p>
<p>The rather long <a href="http://en.wikipedia.org/wiki/Bayeux_Tapestry">Bayeux tapestry</a> of an image I have crammed to the right marks the culmination of a series of rather odd tangents. It also serves as a reminder for me to <a href="http://en.wikipedia.org/wiki/Inferno_(Dante)#Overview_and_vestibule_of_Hell">abandon hope</a>, because the shape of the conversation forces whatever post I plan on writing to be verbose enough as to fill all that vertical space so that the actual text here isn&#8217;t dwarfed by the image, which would be aesthetically jarring.</p>
<p>It all started the day before yesterday (I&#8217;m pretty sure it wasn&#8217;t actually then, but this is my abridged timeline and I&#8217;m entitled to indulge in whatever revisionist temptations I have as I&#8217;m writing this at a rather late hour, because 2013 is creeping closer at an uncomfortably fast rate and I still have some finite quantity of homework I haven&#8217;t attempted to start over the course of the past week), when my friend Robert realized that a rather significant portion of my chat responses include &#8220;wat&#8221;, &#8220;walp&#8221;, &#8220;lol&#8221;, &#8220;yeah&#8221;, &#8220;:P&#8221;, &#8220;cool&#8221;. From that, he logically sought to create a naive bayes predictor of me, because, why have a person nod in consent, when you can have a robot which can, to some degree of accuracy, automatically give that nod of assent without bothering a physical human being.</p>
<p>This isn&#8217;t quite the same thing as a traditional chat bot, because traditional chat bots don&#8217;t pretend to be actual people, largely because the state-of-the-art of artificial intelligence is quite a ways off from creating something which can suitably pass a Turing test, and even further away from being able to learn the entire knowledge of a person and provide an intelligent response to every imaginable stimulus. A closer approximation would be that this is a sort of semi-automated chat-macro system, whereby my generally useless responses of agreement are outsourced to a rudimentary script, fully capable of replicating my own rather unhelpful self. And from that it&#8217;s able to try to behave human by replicating a very very narrow subset of activity, deferring to a real human transparently.</p>
<p>It&#8217;s somewhat like how GMail has a <a href="http://support.google.com/mail/bin/answer.py?hl=en&amp;answer=186531">priority inbox</a> feature which uses magical algorithms to separate the wheat from the chaff, diverting your attention away from the less subjectively important emails toward the few which actually matter. Except instead of giving the user ultimate discretion over the emails, this one would simply reply with &#8220;lol&#8221;.</p>
<p>It&#8217;s pretty easy to see any realistic application of this as rare. But I could totally be wrong, and I could be seeing this from totally the wrong angle. It&#8217;s entirely plausible that some subtle variant of this idea is absolutely brilliant, and will serve as the future of networked communication for decades to come. Maybe as email evolves the way of the Dodo, Instant Messaging will become the semi-permanent high-persistence low-immediacy ironic-initialism that <a href="https://medium.com/product-design/d8d4f2300cf3">takes email&#8217;s place</a>, and the  rest of the world becomes burn-on-reading SnapChats. Maybe SnapChat gets combined with lifelogging, and every minute of your life gets divided into four second snippets, and sent to one of your four thousand middle-school friends, so they can bask in the new hyper-intimate super-network, fueled by non-discretionary artificial intelligence filters.</p>
<p>That was Robert&#8217;s end anyway. He went on combing through our accumulated ~30,000 messages with his handy Mathematica trying to identify pertinent features which might probably replace me. On my side of the thing, I started with the userscript which would run on my browser to intercept the messages he sent, process them, and to send out a response, if a suitable automated one existed.</p>
<p>This actually turned out to be slightly more difficult than I had anticipated, for a single reason, and it was and has been the same reason that has bothered me for quite some time. Firing events. I really probably should learn how to use Selenium or something to automate things in a nice and clean way.</p>
<p>And that&#8217;s completely ignoring the five hundred pound trivial solution in the room, which isn&#8217;t to use a 500lb gorilla as a metaphor. Facebook supports XMPP which is a nice open source protocol with a billion implementations and it&#8217;s really not that hard to automate. I mean I&#8217;ve even done it before. <a href="http://antimatter15.com/wp/2012/08/raspberry-pi/">I have a Raspberry Pi</a> after all, and I can use it to run useless services like this, because I&#8217;ve decided that that&#8217;s exactly what a Raspberry Pi is for. But I didn&#8217;t and I have no idea why. C&#8217;est la vie, I guess.</p>
<p>The secret ended up being to Google a bunch of phrases related to keyboard-event-emitting with initializeKeyboardEvent or something of that sort a lot of times and stealing some code from StackOverflow. It took a few tries, but eventually something that worked emerged, and it was cool.</p>
<p>For posterity, this was the code that worked:</p>
<p><script src="https://gist.github.com/4425144.js"></script></p>
<p>But that wasn&#8217;t the end of it. No, now there was a piece of code which could convincingly send a message, but it also had to read messages too. That wasn&#8217;t hard, actually, I just created a MutationObserver object and named it after a<a href="http://fringe.wikia.com/wiki/September"> Fringe character</a>. But then, presumably because Robert&#8217;s code was still training on that 30k message corpus, or something inexplicable, I built a crappy rudimentary thing with four or so simple regular expression based rules.</p>
<p>One of them happened to be that if someone were to send me the message &#8220;lol&#8221;, I would inexplicably respond as well with &#8220;lol&#8221;. This wasn&#8217;t initially a problem because the idea was to create a robotic version of <em>me</em> and <em>only </em>me. But Robert found it cool too so he ran the same script. Problem was, that this meant that if either one of us were to introduce the word &#8220;lol&#8221;, it would spiral nigh perpetually ad nauseam.</p>
<p>Somehow this sparked the idea to implement simple esoteric languages on it. The first one was a simple substitution rule. 0 -&gt; 1, 1 -&gt; 10. And over a few iterations it grew and took up huge amounts of space.</p>
<p>Next up was implementing a <a href="http://en.wikipedia.org/wiki/Tag_system">tag system</a>. I implemented the 2-tag collatz sequence one. The cool thing is that it&#8217;s actually insanely easy to implement. You just take a sequence of symbols, strip the first two, and append the first symbol after you&#8217;ve transformed it according to a certain transformation mapping.</p>
<p>It was interesting as each little computation of this tiny esolang of a chat conversation involved a round trip of hundreds of miles. But each tag was still letters, &#8216;a&#8217;, &#8216;b&#8217;, and &#8216;c&#8217;. And it was getting late, and I thought that maybe it would be nice to hark back at inside-joke/theory of sorts that sparked it all. So I decided that our tags could be, instead of solitary letters, comprise word symbols like &#8220;lol&#8221;, &#8220;d:&#8221; and &#8220;wat&#8221;, which perhaps is a subconscious reference to an old webcomic that I had posted a while ago about a steganographic system built on internet vernacular.</p>
<p>I updated my script, posted it to him, he ran it, and initiated it all by saying &#8220;lol lol lol&#8221;. And from then the line lengths grew and shrank like mountainous terrain, eventually converging on the final state, a solitary &#8220;lol&#8221;. And for some inexplicable reason, some weird quirk of fate, or some deeper underlying truth to the universe, Robert always got the last &#8220;lol&#8221;. When I had tried it with a random initiating code, it would always terminate in some odd number of iterations, leaving me with the lowly penultimate laugh.</p>
<p>It sort of broke after that, and we didn&#8217;t fix it.</p>
<p>Nonetheless, there&#8217;s something incredibly cool about how an idea for something questionably turing-test-worthy can evolve into something turing-complete.</p>
<p>And that&#8217;s a basic summary of how uneventful my winter break has been, incidentally written with exactly 1337 words.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/12/facebook-chat-bot-turing-completeness/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A New Approach to Video Lectures</title>
		<link>http://antimatter15.com/wp/2012/11/a-new-approach-to-video-lectures/</link>
		<comments>http://antimatter15.com/wp/2012/11/a-new-approach-to-video-lectures/#comments</comments>
		<pubDate>Wed, 21 Nov 2012 09:01:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Vectorized]]></category>
		<category><![CDATA[concept]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[khan academy]]></category>
		<category><![CDATA[opencv]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[scratchpad]]></category>
		<category><![CDATA[simplecv]]></category>
		<category><![CDATA[vector]]></category>
		<category><![CDATA[vectorized]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2603</guid>
		<description><![CDATA[At time of writing, a video is being processed by my `v2.py` script, it&#8217;s only eight lines of code thanks to the beautifully terse nature of python and SimpleCV. And since it&#8217;s clearly not operating at the breakneck speed of one frame per second, I don&#8217;t have time to write this README, meaning that I&#8217;m [...]]]></description>
				<content:encoded><![CDATA[<p>At time of writing, a video is being processed by my `v2.py` script, it&#8217;s only eight lines of code thanks to the beautifully terse nature of python and SimpleCV. And since it&#8217;s clearly not operating at the breakneck speed of one frame per second, I don&#8217;t have time to write this README, meaning that I&#8217;m writing this README. But since I haven&#8217;t actually put a description of this project out in writing before, I think it&#8217;s important to start off with an introduction.</p>
<p>It&#8217;s been over a year since I first wrote code for this project. It really dates back to late April 2011. Certainly it wouldn&#8217;t have been possible to write the processor in eight painless lines of python back then, when SimpleCV was considerably in more of an infancy. I&#8217;m pretty sure that puts the pre-production stage of this project in about the range of a usual Hollywood movie production. However, that&#8217;s really quite unusual for me because I don&#8217;t tend to wait to get started on projects often. Or at least, I usually publish something in a somewhat workable state before abandoning it for a year.</p>
<p>However, the fact is that this project has been dormant for more than an entire year. Not necessarily because I lost interest in it, but because it always seemed like a problem harder than I had been comfortable tackling at any given moment. There&#8217;s a sort of paradox that afflicts me, and probably other students (documented by that awesome Calvin and Hobbes comic) where at some point, you find a problem hard enough that it gets perpetually delayed until, of course, the deadline comes up and you end up rushing to finish it in some manner that only poses a vague semblance to the intent.</p>
<p>The basic premise is somewhat simple: videos aren&#8217;t usually the answer. That&#8217;s not to say video isn&#8217;t awesome, because it certainly is. YouTube, Vimeo and others provide an absolutely brilliant service, but those platforms are used for things that they aren&#8217;t particularly well suited for. Video hosting services have to be so absurdly general because there is this need to encompass every single use case in a content-neutral manner.</p>
<p>One particular example is with music, which often gets thrown on YouTube in the absence of somewhere else to stick it. A video hosting site is pretty inadequate, in part because it tries to optimize the wrong kinds of interactions. Having a big player window is useless, having an auto-hiding progress slider and having mediocre playback, playlist and looping interfaces are signs that a certain interface is being used for the wrong kind of content. Contrast this to a service like SoundCloud which is entirely devoted to the interacting with music.</p>
<p>The purpose of this project is somewhat similar. It&#8217;s to experiment with creating an interface for video lectures that goes above, in terms of interactivity and in terms of usability (perhaps even accessibility), what a simple video can do.</p>
<p>So yeah, that&#8217;s the concept that I came up with a year ago. I&#8217;m pretty sure it sounds like a pretty nice premise, but really at this point the old adage of &#8220;execution is everything&#8221; starts to come into play. How exactly is this going to be better than video?</p>
<p>One thing that&#8217;s constantly annoyed me about anything video-related is the little progress slider tracker thing. Even for a short video, I always end up on the wrong spot. YouTube has the little coverflow-esque window which gives little snapshots to help, and Apple has their drag down to do precision adjustment, but in the end the experience is far from optimal. This is especially unsuitable because moreso in lectures than perhaps in any other type of content, you really want to be able to step back and go over some little thing again. Having to risk cognitive derailment just to go over something you don&#8217;t quite get can&#8217;t possibly be good (actually, for long videos in general, it would be a good idea to snap the slider to the nearest camera/scene change which wouldn&#8217;t be hard to find with basic computer vision, since that&#8217;s in general, where I want to go). But for this specific application, the canvas itself makes perhaps the greatest navigatory tool of all. The format is just a perpetually amended canvas with redactions rare, and the most sensible way to navigate is by literally clicking on the region that needs explanation.</p>
<p>But having a linear representation of time is useful for pacing, and to keep track of things when there isn&#8217;t always a clear relationship between the position of the pen and time. A more useful system would have to be something more than just a solid gradient bar crawling across the bottom edge of the screen, because it would also convey where in the content the current step belongs. This is something analogous to the way YouTube shows a strip of snapshots when thumbing through the slider bar, but in a video-lecture setting we have the ability to automatically and intelligently build populate the strip with with specific and useful information.</p>
<p>From this foundation we can imagine looking at the entire lecture in it&#8217;s final end state, except with the handwriting grayed out. The user can simply circle or brush over the regions which might seem less trivial, and the interface could automatically stitch together a customized lecture at just the right pacing, playing back the work correlated with audio annotations. On top of that, the user can interact with the lecture by contributing his or her own annotations or commentary, so that learning isn&#8217;t confined to the course syllabus.</p>
<p>Now, this project, or at least its goals evolved from an idea to vectorize Khan Academy. None of these truly requires a vector input source, in fact many of the ideas would be more useful implemented with raster processing and filters, by virtue of having some possibility of broader application. I think it may actually be easier to do it with the raster method, but I think, if this is possible at all, it&#8217;d be cooler to do it using a vector medium. Even if having a vector source was a prerequisite, it&#8217;d probably be easier to patch up a little scratchpad-esque app to record mouse coordinates and to re-create lectures rather than fiddling with SimpleCV in order to form some semblance of a faithful reproduction of the source.</p>
<p>I&#8217;ve had quite a bit to do in the past few months, and that&#8217;s been reflected in the kind of work I&#8217;m doing. I guess there&#8217;s a sort of prioritization of projects which is going on now, and this is one of those which has perennially sat on the top of the list, unperturbed. I&#8217;ve been busy, and that&#8217;s led to this wretched mentality to avoid anything that would take large amounts of time, and I&#8217;ve been squandering my time on small and largely trivial problems (pun not intended).</p>
<p>At this point, the processing is almost done, I&#8217;d say about 90%, so I don&#8217;t have much time to say anything else. I really want this to work out, but of course, it might not. Whatever happens, It&#8217;s going to be something.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/11/a-new-approach-to-video-lectures/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction to the Pedant</title>
		<link>http://antimatter15.com/wp/2012/10/introduction-to-the-pedant/</link>
		<comments>http://antimatter15.com/wp/2012/10/introduction-to-the-pedant/#comments</comments>
		<pubDate>Sun, 07 Oct 2012 12:08:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Pedant]]></category>
		<category><![CDATA[ar]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[augmented reality]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[cheap]]></category>
		<category><![CDATA[chorded keyboard]]></category>
		<category><![CDATA[foot]]></category>
		<category><![CDATA[pedant]]></category>
		<category><![CDATA[project glass]]></category>
		<category><![CDATA[pun]]></category>
		<category><![CDATA[sixthsense]]></category>
		<category><![CDATA[sparkfun]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2589</guid>
		<description><![CDATA[Recently, I&#8217;ve been racking up on hobbyist electronics components from Sparkfun. Actually, this has been going on for quite a while, and most of that spending was justified by this project, which currently has the working name of the &#8220;pedant&#8221; (which is like at least a three-layered pun). I won&#8217;t say that it&#8217;s my very [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/09/IMG_20120924_231208.jpg"><img class="size-medium wp-image-2590 alignnone" title="IMG_20120924_231208" src="http://antimatter15.com/wp/wp-content/uploads/2012/09/IMG_20120924_231208-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p>Recently, I&#8217;ve been racking up on hobbyist electronics components from <a href="http://sparkfun.com">Sparkfun</a>. Actually, this has been going on for quite a while, and most of that spending was justified by this project, which currently has the working name of the &#8220;pedant&#8221; (which is like at least a three-layered pun). I won&#8217;t say that it&#8217;s my very first foray into building some actual piece of hardware, but it&#8217;s probably the biggest and most original hardware project I&#8217;ve ever attempted.</p>
<p>I probably won&#8217;t be able to sell you on what it <em>is</em>, because it&#8217;s actually quite simple and uninteresting in principle. So instead of selling you on the cynical summary of its functionality, I&#8217;ll gild the concept with buzz words and try my very best to instill the same kind of enthusiasm I have for this project (which might just be because I haven&#8217;t done anything before with e-textiles or other electronics stuff).</p>
<p>The <strong>pedant is my foray into augmented reality, </strong>hopefully that means that it&#8217;s, at least some ways, original. It&#8217;s <strong>cheap</strong>, though actually in retrospect, not nearly as cheap as it <em>should</em> have been. And probably the most interesting aspect is that it skips through the whole perceived evolution of augmented reality from some bulky extremity into something sleek and unobtrusive. That&#8217;s not technically untrue, because the actual device will be fairly bulky, but it would exist in an already considerably bulky device (a shoe), so the <strong>net effect is that it&#8217;s sleek and unobtrusive</strong>.</p>
<p>I can&#8217;t say I was into that whole augmented reality thing before it was hip and cool. I only got interested in it fairly recently, likely due to somewhat high profile forays by Google and others. In mid-to-late 2008, I had just gotten my iPhone and I was <em>deeply</em> attached to it. At one point, I was on a vacation and at one point there was some arbitrary fact which came into question, at which point I pulled out my glorious first generation iPhone with its pristine anodized aluminium backing and loaded an app which searched an offline copy of all the textual content in the English Wikipedia (a concept which I had become so attached with that I ended up making Offline Wiki for the same reasons). And as the question was settled, the new subject of conversation was how incredible it is to keep all the world&#8217;s knowledge in a palm sized device.</p>
<p>But that&#8217;s not just an anecdote about the marvels of technology, it&#8217;s also a sad tale about how distracting it was. Somehow having access to that information allowed whatever <em>pedantic</em> instincts to prevail, shifting the conversation from a meaningful discussion into an artless digital query. And even forgiving that fact, it was slow and distracting, destroying the asynchronous exchange of ideas by creating this handheld bottleneck. Yes, we got an answer, but at what cost?</p>
<p>And I think that is a beautiful way to frame the argument for augmented reality. That whatever reality we have now is already being corrupted by the influence of the virtual world, and that only by willfully acknowledging that they both share the same space, can we start in the right direction of fixing it. That&#8217;s the direction Google&#8217;s Project Glass is headed, and I think that&#8217;s the right way.</p>
<p>The approach taken by the <a href="http://www.pranavmistry.com/projects/sixthsense/">SixthSense</a> project and by Google Glass mainly interacts with the user in a visual manner. And for the latter, there isn&#8217;t any really &#8220;good&#8221; and unobtrusive way to interact with that information. Both of the projects have extremely high output bandwidth (conveying information by projecting it into the user&#8217;s eye in one way or another), but limited input bandwidth and still fairly non-discreet (waving hands around to form shapes and sliding a bar on the frame, respectively). The Pedant takes a different approach by focusing on tactile input and output. This places the project more in the league of people who <a href="http://hackaday.com/2012/05/13/hacking-magnets-into-your-skin/">implant magnets under their skin</a> by hijacking the sense of touch to convey information about the surroundings.</p>
<p>It&#8217;s going to be a tiny device which fits within the dimensions of a shoe insole including an Arduino Pro, a Bluetooth Mate, an Accelerometer, 2000mAh LiPo battery, and three or more vibration motors. By tapping the foot (or by orienting it in slightly different ways) the user can input data in a manner similar to the telegraph. However, nothing necessarily restricts it to being sent through a single &#8220;stream&#8221;, so it could end up more like a chorded telegraph (a la <a href="http://en.wikipedia.org/wiki/Chorded_keyboard">chorded keyboard</a>). The great thing is that with chording, it becomes much more practical to receive information at reasonable rates.</p>
<p>Just like how a cell phone can vibrate to signal that the user has been left a message, the pedant would be used primarily to handle notifications, but rather than indistinguishable general sensations on the thigh, it&#8217;ll portray the type of notifications as well as the content, and the user even has the possibility to respond without changing the environment.</p>
<p>Without weird tactile abstract character sets, the Pedant could be interesting just as a sort of social network where users can feel the presence of other users in their general vicinity. It could monitor the footsteps of all nearby Pedant wearers and as it&#8217;s connected via a cellular data network and a smartphone GPS to trigger the specific vibration motors to evoke an awareness of how fast they&#8217;re walking and what general direction they are. In a sense, a social network of pedometers.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/10/introduction-to-the-pedant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New Host: Bitcable</title>
		<link>http://antimatter15.com/wp/2012/09/bitcable/</link>
		<comments>http://antimatter15.com/wp/2012/09/bitcable/#comments</comments>
		<pubDate>Sun, 30 Sep 2012 15:23:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[bitcable]]></category>
		<category><![CDATA[downtime]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[hostmonster]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sftp]]></category>
		<category><![CDATA[shared]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[uptime]]></category>
		<category><![CDATA[vps]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1744</guid>
		<description><![CDATA[I haven&#8217;t been particularly raving about Hostmonster for the near two years I&#8217;ve been a customer of their&#8217;s, and it&#8217;s time for a change. In the past week, I moved to a new web host. As of this moment, I&#8217;m using Bitcable, specifically the cheapest shared plan plus another discount. I&#8217;ve had my share of gripes [...]]]></description>
				<content:encoded><![CDATA[<h2><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/1LlLi.png"><img class="alignright" title="1LlLi" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/1LlLi-300x218.png" alt="" width="300" height="218" /></a></h2>
<p>I haven&#8217;t been particularly raving about Hostmonster for the near two years I&#8217;ve been a customer of their&#8217;s, and it&#8217;s time for a change. In the past week, I moved to a new web host. As of this moment, I&#8217;m using Bitcable, specifically the cheapest shared plan plus another discount. I&#8217;ve had my share of gripes about the service, but speed and reliability so far have not been among them. I discovered Bitcable through a friend who knew a friend who operated a web host, well, primarily a VPS service. Over a fair amount of begging for a VPS discount, I decided to try out their (I always find it awkward when referring to companies or services as a plural in spite of knowledge that it&#8217;s pretty much a one-man-show, but that makes it all the more impressive) shared plan, since that was analogous whatever I was paying for with Hostmonster. And anyway, for $2/mo, how bad can it get?</p>
<p>That question was a tad misleading, so far, Bitcable&#8217;s pretty awesome. Part of the thing about using a service from a friend-of-a-friend (FOAF, if I ever need to use an acronym later on in this post, but I&#8217;ll keep it here just because it&#8217;s a fun thing to say) is that you can get some pretty good support over some random communication channels. It&#8217;s small enough that he doesn&#8217;t oversell, and the performance really shows through.</p>
<p>I did, however have some issues with the configuration of the server. The first issue is that by default, shared customers don&#8217;t get SFTP access. That&#8217;s pretty annoying because I&#8217;ve recently fallen in love with passwordless login using public keys. I sent an angry support ticket and it was enabled soon enough. But a much more pressing issue was that soon after my migration, there was some long server outage due to some power supply failure (which thankfully, since it took over a month to write this post which is more indicative of the bad state that my blog is in than the host, hasn&#8217;t happened again, I haven&#8217;t noticed a minute of downtime since then and I&#8217;ve set uptime monitors to ensure that).</p>
<p>So yeah, I&#8217;ll be on this host for the foreseeable future.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/09/bitcable/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Whammy: A Real Time Javascript WebM Encoder</title>
		<link>http://antimatter15.com/wp/2012/08/whammy-a-real-time-javascript-webm-encoder/</link>
		<comments>http://antimatter15.com/wp/2012/08/whammy-a-real-time-javascript-webm-encoder/#comments</comments>
		<pubDate>Mon, 20 Aug 2012 02:46:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Multimedia Codecs]]></category>
		<category><![CDATA[Whammy]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[fast]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript webm encoder]]></category>
		<category><![CDATA[not my idea]]></category>
		<category><![CDATA[on2]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vorbis]]></category>
		<category><![CDATA[vp8]]></category>
		<category><![CDATA[webm]]></category>
		<category><![CDATA[weppy]]></category>
		<category><![CDATA[whammy]]></category>
		<category><![CDATA[wheee]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=2569</guid>
		<description><![CDATA[This is sort of a conceptual reversal (or not, this might just be making the description needlessly confusing) of one of my older projects,Weppy. First, what Weppy did was it added support for WebP in browsers which didn&#8217;t support it by converting it into a single-frame video. This is instead predicated on the assumption that [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/screenshot.png"><img class="alignnone size-full wp-image-2570" title="screenshot" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/screenshot.png" alt="" width="486" height="208" /></a></p>
<p>This is sort of a conceptual reversal (or not, this might just be making the description needlessly confusing) of one of my older projects,<a href="https://github.com/antimatter15/weppy">Weppy</a>. First, what Weppy did was it added support for WebP in browsers which didn&#8217;t support it by converting it into a single-frame video. This is instead predicated on the assumption that the browser already has support for WebP (at this point, it means it only works on Chrome since it&#8217;s the only browser which actually supports WebP), not only decoding WebP but encoding it as well.</p>
<p>The cool thing about WebP which was exploited in Weppy is that it&#8217;s actually based on the same codec as WebM, On2&#8242;s VP8. That means the actual image data, when the container formats are ignored, are virtually interchangable. With a catch: it&#8217;s intraframe only.</p>
<p>So it&#8217;s a video encoder in that it generates <code>.webm</code> files which should play in just about any program or device which supports the WebM format. But interframe compression is actually a fairly important thing which could reduce the file size by an order of magnitude or more.</p>
<p>But, there isn&#8217;t too much you can do on the client side in the ways of encoding stuff. And whatever you do, you basically can&#8217;t do interframe compression (aside from some really rudimentary delta encoding). More or less, when your only alternative is to maintain an array of DataURL encoded frames or encoding it (rather slowly) as a <a href="https://github.com/antimatter15/jsgif">GIF</a>, a fast but inefficient WebM encoder stops looking too bad.</p>
<p>This was actually <a href="https://github.com/gengkev">Kevin Geng</a>&#8216;s idea, and he contributed some code too, but in the end most of the code was just leftovers from Weppy.</p>
<h2>Demo</h2>
<p><a href="http://antimatter15.github.com/whammy/clock.html">http://antimatter15.github.com/whammy/clock.html</a></p>
<h2>Basic Usage</h2>
<p>First, let&#8217;s include the JS file. It&#8217;s self contained and basically namespaced, which is pretty good I guess. And it&#8217;s not too big, minified it&#8217;s only about 4KB and gzipped, it&#8217;s under 2KB. That&#8217;s like really really tiny.</p>
<pre><code>&lt;script src="whammy.js"&gt;&lt;/script&gt; </code></pre>
<p>The API isn&#8217;t terrible either (at least, that&#8217;s what I&#8217;d like to hope)</p>
<pre><code>var encoder = new Whammy.Video(15); </code></pre>
<p>That <code>15</code> over there is the frame rate. There&#8217;s a way to set the individual duration of each frame manually, but you can look in the code for that.</p>
<pre><code>encoder.add(context or canvas or dataURL); </code></pre>
<p>Here, you can add a frame, this happens fairly quickly because basically all it&#8217;s doing is running <code>.toDataURL()</code> on the canvas (which isn&#8217;t exactly a speed-demon either, but it&#8217;s acceptable enough most of the time) and plopping the result onto an array (no computation or anything). The actual encoding only happens when you call <code>.compile()</code></p>
<pre><code>var output = encoder.compile(); </code></pre>
<p>Here, output is set to a Blob. In order to get a nice URL which you can use to stick in a <code>&lt;video&gt;</code> element, you need to send it over to<code>createObjectURL</code></p>
<pre><code>var url = (window.webkitURL || window.URL).createObjectURL(output); </code></pre>
<p>And you&#8217;re done. Awesome.</p>
<h2>Documentation</h2>
<p><code>Weppy.fromImageArray(image[], fps)</code> this is a simple function that takes a list of DataURL encoded frames and returns a WebM video. Note that the images have to all be encoded with WebP.</p>
<p><code>new Weppy.Video(optional fps, optional quality)</code> this is the constructor for the main API. quality only applies if you&#8217;re sending in contexts or canvas objects and doesn&#8217;t matter if you&#8217;re sending in encoded stuff</p>
<p><code>.add(canvas or context or dataURL, optional duration)</code> if fps isn&#8217;t specified in the constructor, you can stick a duration (in milliseconds) here.</p>
<h2>Todo</h2>
<p>This pretty much works as well as it possibly could at this point. Maybe one day it should support WebWorkers or something, but unlike the GIF Encoder, it doesn&#8217;t actually require much real computation. So doing that probably wouldn&#8217;t net any performance benefits, especially since it can stitch together a 120-frame animation in like 20 milliseconds already.</p>
<p>But one of the sad things about it is that now it uses Blobs instead of strings, which is great and all except that blobs are actually slower than strings because it still has to do the DataURL conversion from string to Blob. That&#8217;s pretty lame. Firefox supports the canvas toBlob thing, but for some reason Chrome doesn&#8217;t, but eventually it probably might, and that might be useful to add.</p>
<p>Also, if someone ever makes a Javascript Vorbis encoder, it would be nice to integrate that in, since this currently only does the video part, but audio&#8217;s also a pretty big part.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/08/whammy-a-real-time-javascript-webm-encoder/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Upcoming Changes</title>
		<link>http://antimatter15.com/wp/2012/08/upcoming-changes/</link>
		<comments>http://antimatter15.com/wp/2012/08/upcoming-changes/#comments</comments>
		<pubDate>Sat, 18 Aug 2012 17:16:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[bitcable]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[feces]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[mold]]></category>
		<category><![CDATA[need]]></category>
		<category><![CDATA[obama]]></category>
		<category><![CDATA[overhaul]]></category>
		<category><![CDATA[precipitous]]></category>
		<category><![CDATA[trident]]></category>
		<category><![CDATA[trifecta]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1840</guid>
		<description><![CDATA[This post has been hinted at by the past few blog posts, but I guess eventually it has to be written. But the basic gist is that rather than making this the home of random announcements of mostly finished projects, it&#8217;ll be the home of mostly daily (or weekly, whenever significant progress is made) and [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/blog-post-frequency.png"><img class="size-thumbnail wp-image-1832 alignright" title="blog-post-frequency" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/blog-post-frequency-150x150.png" alt="" width="150" height="150" /></a>This post has been hinted at by the past few blog posts, but I guess eventually it has to be written. But the basic gist is that rather than making this the home of random announcements of mostly finished projects, it&#8217;ll be the home of mostly daily (or weekly, whenever significant progress is made) and probably shorter updates on the progress certain projects. That is, the blog is transitioning back into something more like the olden days (circa 2008-ish) but without falling into the trap of using this as an alternative to having commit messages and still supporting the fact I&#8217;m now working on quite a bit more than one project at a time.</p>
<p>The problem is that I can&#8217;t exactly stay true to that because I actually have quite a bit of backlog in terms of stuff I have to write about, stuff which is for the most part done (so it&#8217;s not particularly viable for me to make up progress updates retroactively, and I&#8217;ll probably have to stick with writing a big blog post about it).</p>
<p>This should be the culmination of tons of factors and trends building up for the past year or so. I&#8217;ve always felt that the blog needed to be overhauled eventually (or end up rotting as nothing more than a backup kept in the eternal resting spot which is the Internet Archive, leaching fluids into the soil as bacterium leave the corpse punctured by holes and missing vital organs, a sure sign that I&#8217;m probably going too far into this metaphor, but in the end that&#8217;s the way many of the forums I used to visit have become). But the real spark came in the form of a migration to a new web host, something which I still alas have yet to blog about despite it happening over a week ago.</p>
<p>Those changes are hardly precipitous (however much anyone wants to unveil something in one flash of an instant in order to feign the appearance that everything happened suddenly and approached new heights of grandeur, that never actually happens, and it&#8217;s simply harder to work in that sort of manner &#8211; slow and steady doesn&#8217;t always lose the race). The first part was the change of the web host itself which was actually not exactly planned (I was testing out it, and unexpectedly on a whim cancelled my old web host and migrated over over the course of an afternoon and left the site down for a few hours). The second front at which this evolution occurred was a slight redesign, changing the color scheme a bit, upgrading the theme, reorganizing the categories and menus (this is meant to be chronicled in detail in some other blog post which I have yet to written). And the third and last one (which was meant to be the topic of this blog post) is a change in content.</p>
<p>In summary, three inevitable changes on three different fronts. Content, Frontend, and Backend. All in a not-so-grand gesture to save this blog from decaying into a moldy blob of feces on the internet&#8217;s great sidewalk.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/08/upcoming-changes/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Meta Analytics</title>
		<link>http://antimatter15.com/wp/2012/08/meta-analytics/</link>
		<comments>http://antimatter15.com/wp/2012/08/meta-analytics/#comments</comments>
		<pubDate>Sat, 18 Aug 2012 00:08:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Meta]]></category>
		<category><![CDATA[aliens]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[charts]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[long posts]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[periodic]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[r]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[self aware]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[shiny]]></category>
		<category><![CDATA[skynet]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1745</guid>
		<description><![CDATA[I&#8217;ve been maintaining this blog, or at least the content inside it for about five years now. It&#8217;s been through a handful of incarnations, often paired with significant changes in web hosting. I&#8217;ve had a blog for a little bit longer, but I don&#8217;t think I have the medium figured out. The structure of the [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been maintaining this blog, or at least the content inside it for about five years now. It&#8217;s been through a handful of incarnations, often paired with significant changes in web hosting. I&#8217;ve had a blog for a little bit longer, but I don&#8217;t think I have the medium figured out. The structure of the posts and the style has changed over the past few years, but I can&#8217;t at this point call it evolution, a positive progression. Part of the power which lies in analyzing data is the ability to realize patterns, often at a different scale from human observation (spans of months or years) which are equally if not more insightful.</p>
<p>That&#8217;s been my personal attraction to data science. I&#8217;ve had a couple of personal experiments involving collecting data about my daily activities, my old writing and code in hopes of distilling the changes that I&#8217;m too conceited to admit without the infallible hand of statistics. For nearly two years now, I&#8217;ve logged my entire life within precision of approximately 30 minutes from Google Calendar (or the Calendar app on iPad which syncs to Google Calendar). Actually, the label is slightly off, I quite often dedicate large spans of time to more or less useless labels like &#8220;not productive&#8221;. But this temporal information falls apart in terms of its richness, for my schedule is dictated more so by the mandatory rhythms of school life than the drifting cadence of other behavior.</p>
<p>But I digress. This isn&#8217;t about why I collect data so much as &#8220;I have this data, now what?&#8221;. In this case, I had a hypothesis, a rather simple albeit morbid one at that &#8220;my blog is dying&#8221;. It&#8217;s not hard to see how I&#8217;m coming at the conclusion. I&#8217;m pretty much struggling at this point to meet my goal of one post per month (itself not a particularly difficult goal, but as time has gone on and my posts have become more infrequent, I feel more compelled to write obscenely long posts to compensate, but of course this also leads to big posts sitting there unfinished for long durations losing the sort of one post = one sitting mentality). But before I ramble for too long, I&#8217;ll cut to the chase and answer the question posed at the beginning of this paragraph: &#8220;Graphs.&#8221; (you could imagine those haunting glyphs levitating in the midst of air caught in the invisible grasp of Giorgio A. Tsoukalos, or better yet, I can spare your cognitive abilities by <a href="http://qkme.me/3qj5f6">making it real</a>)</p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/blog-post-frequency.png"><img class="size-full wp-image-1832 alignnone" title="blog-post-frequency" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/blog-post-frequency.png" alt="" width="550" height="450" /></a></p>
<p>Here&#8217;s a pretty little graph I made in R (sorry for the mess on the horizontal axis, and I just realized I have no idea as to how to interpret the dates, I&#8217;m assuming that they&#8217;re linear and it&#8217;s just some odd aliasing issue that makes even-numbered years repeat twice), it&#8217;s a histogram of the dates of posts that I&#8217;ve made to this blog (extracted with a simple Python script and WordPress&#8217;s built-in Export button).You can probably actually tell that the blog&#8217;s demise is quite a long way&#8217;s coming. Every annual peak ends up shallower the following year and the first time <em>gaps</em> have actually existed was this fateful year, 2012.</p>
<p>It&#8217;s actually sort of interesting that these peaks exist, but I can&#8217;t really tell during what months that happened during (since these axes are labeled so terribly, it&#8217;d be nice if I knew some nice interactive graph engine that worked with histograms, something like that cool time series viewer that Google had for Finance for like ever but for histograms, but I guess that just shows how much of a non-scientist I am, to have no idea how to fluently articulate in a statistical or graphical language of my choice).</p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/Word-Count-Plot.png"><img class="size-full wp-image-1833 alignnone" title="Word Count Plot" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/Word-Count-Plot.png" alt="" width="550" height="450" /></a></p>
<p>For more graph fun, here&#8217;s a scatter plot of word lengths as a function of year. I wasn&#8217;t dedicated enough to figure out how to get <a href="http://nltk.org/">NLTK</a> to tell me the <a href="http://en.wikipedia.org/wiki/Gunning_fog_index">Gunning-Fog</a>, <a href="http://en.wikipedia.org/wiki/Flesch%E2%80%93Kincaid_readability_test">Flesch-Kincaid</a> or <a href="http://en.wikipedia.org/wiki/Automated_Readability_Index">ARI</a> value for individual posts, and I doubt that would end up showing anything particularly insightful. But yeah, so here it is. Charts. Charts of words. Note that thing that sticks out clocking in at around 3724 words is my first <a href="http://antimatter15.com/wp/2011/05/uploading-mp3s-to-google-music-beta-from-linux-chrome-os-win-and-mac/">Music Alpha</a> post.</p>
<p>Actually, I won&#8217;t mind that WordPress isn&#8217;t yet self aware (&#8216;ello Skynet) and still sends trackbacks and pings (whatever they are) to me when I link to myself. Seriously, you <em>don&#8217;t actually need to have a self-aware artificial intelligence in order to learn how to not spam me with emails when I&#8217;m quite probably as in super definitely aware of its existence</em>. But anyway, I guess I&#8217;ll stomach the lurching pain of a thousand emails (I&#8217;m using hyperbole here, in case your rudimentary artificial intelligence algorithms can&#8217;t quite distinguish them, but I&#8217;m also pretty sure your algorithms wouldn&#8217;t be able to handle n-th degrees of meta, so this excruciatingly useless parenthetical wouldn&#8217;t be much other than that: excruciatingly useless) and post the last part of the list here.</p>
<p><code><br />
1340133957.0 , 2012-06-19 19:25:57 , 1178 <a href="http://antimatter15.com/wp/2012/06/pinball/">http://antimatter15.com/wp/2012/06/pinball/</a><br />
1333025085.0 , 2012-03-29 12:44:45 , 1302 <a href="http://antimatter15.com/wp/2012/03/musicalpha-v2-0/">http://antimatter15.com/wp/2012/03/musicalpha-v2-0/</a><br />
1293394934.0 , 2010-12-26 20:22:14 , 1409 <a href="http://antimatter15.com/wp/2010/12/drag2up-v2-drag-and-drop-uploading-for-all-sites/">http://antimatter15.com/wp/2010/12/drag2up-v2-drag-and-drop-uploading-for-all-sites/</a><br />
1317686582.0 , 2011-10-04 00:03:02 , 1565 [Haven't actually published this yet, hmm]<br />
1341591648.0 , 2012-07-06 16:20:48 , 2117 <a href="http://antimatter15.com/wp/2012/07/cloudfall-a-text-editor/">http://antimatter15.com/wp/2012/07/cloudfall-a-text-editor/</a><br />
1307064165.0 , 2011-06-03 01:22:45 , 2180 <a href="http://antimatter15.com/wp/2011/06/why-the-chrome-web-store-is-bad-for-the-web/">http://antimatter15.com/wp/2011/06/why-the-chrome-web-store-is-bad-for-the-web/</a><br />
1277922545.0 , 2010-06-30 18:29:05 , 2319 <a href="http://antimatter15.com/wp/2010/06/wave-embed-api/">http://antimatter15.com/wp/2010/06/wave-embed-api/</a><br />
1294958307.0 , 2011-01-13 22:38:27 , 2762 <a href="http://antimatter15.com/wp/2011/01/the-ambiguity-of-open-and-vp8-vs-h-264/">http://antimatter15.com/wp/2011/01/the-ambiguity-of-open-and-vp8-vs-h-264/</a><br />
1308832860.0 , 2011-06-23 12:41:00 , 2872 <a href="http://antimatter15.com/wp/2011/06/samsung-series-5-chromebook/">http://antimatter15.com/wp/2011/06/samsung-series-5-chromebook/</a><br />
1305426252.0 , 2011-05-15 02:24:12 , 3724 <a href="http://antimatter15.com/wp/2011/05/uploading-mp3s-to-google-music-beta-from-linux-chrome-os-win-and-mac/">http://antimatter15.com/wp/2011/05/uploading-mp3s-to-google-music-beta-from-linux-chrome-os-win-and-mac/</a><br />
</code></p>
<p>That list was compiled by the command <code>cat blogtimes.csv | sort -t',' -k3n | tail</code>, and that&#8217;s quite an accomplishment because I had to look up the arguments for the <code>sort</code> command in order to figure that out. Of course, <code>blogtimes.csv</code> is the output of my magical six line python script (which uses BeautifulSoup to extract all the <code>wp:post_date</code>s).</p>
<p>So, with 10 blog posts in that list, every single 8 of them happened after 2011 and 3 of them happened in 2012. Considering that there were 10 things published in 2012 (according to my dataset) and 21 in 2011, that&#8217;s a rather significant fraction of the stuff which has been written recently to be insanely long.</p>
<p>WordPress tells me this post is now at 948 words, so I guess I&#8217;ll add a bit of concluding at the end to push it over the magical power-of-ten barrier, so presumably you should brace for the terrible boom which occurs at this point (oh, what&#8217;s that? I think that&#8217;s my imaginary telephone operator who informs me when I make a factual error, apparently those kinds of booms only happen with waves, and apparently words flowing through word count orders of magnitude don&#8217;t count).</p>
<p>The original title of this post was &#8220;Meta Analytics &amp; Upcoming Changes&#8221;, but in the spirit of the upcoming changes, I&#8217;ve moved the &#8220;Upcoming Changes&#8221; part into its own post (tentatively titled &#8220;Upcoming Changes&#8221;). You can probably at this point guess that &#8220;Upcoming Changes&#8221; involves something to tackle the excessive verbosity and to mitigate the absurdly infrequent posts. This probably doesn&#8217;t sound nearly as heroic to you as it does to me, because I&#8217;m listening to The Avengers soundtrack right now, and &#8220;A Promise&#8221; is pretty dramatic.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/08/meta-analytics/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Swipe Gesture 2 Development</title>
		<link>http://antimatter15.com/wp/2012/08/swipe-gesture-2-development/</link>
		<comments>http://antimatter15.com/wp/2012/08/swipe-gesture-2-development/#comments</comments>
		<pubDate>Fri, 17 Aug 2012 00:26:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Chrome Extensions]]></category>
		<category><![CDATA[Swipe Gesture]]></category>
		<category><![CDATA[acceleration]]></category>
		<category><![CDATA[bootcamp]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[chromebooks]]></category>
		<category><![CDATA[colors]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[designs]]></category>
		<category><![CDATA[distance]]></category>
		<category><![CDATA[kinematics]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[redesign]]></category>
		<category><![CDATA[whitesmoke]]></category>

		<guid isPermaLink="false">http://antimatter15.com/wp/?p=1773</guid>
		<description><![CDATA[So I&#8217;m trying something new, returning to quasi-daily somewhat short updates about the development of whatever I&#8217;m working on rather than withholding everything until something of somewhat acceptable release quality is achieved. I have a blog post about that transition, but I&#8217;m still working on it (as in, writing it is somewhat boring). It&#8217;s probably [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/4WsjX.png"><img class="alignright size-full wp-image-1779" title="4WsjX" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/4WsjX.png" alt="" width="84" height="88" /></a>So I&#8217;m trying something new, returning to quasi-daily somewhat short updates about the development of whatever I&#8217;m working on rather than withholding everything until something of somewhat acceptable release quality is achieved. I have a blog post about that transition, but I&#8217;m still working on it (as in, writing it is somewhat boring). It&#8217;s probably better given my development cycle is quite nonlinear, usually I get something somewhat promising made in the first few days or so and pause for long and possibly indefinite durations doing other stuff in the process. Probably, writing short blog posts about what I have yet to finish will remind me to, well, finish them. Just maybe. But I&#8217;m probably going to have to preface every post that I write with this kind of disclaimer until I actually get that post finished and published so I have something to reference rather than pointing crazily into the air and saying &#8220;oh yeah, it&#8217;s coming, now, someday, maybe.&#8221;.</p>
<p>Starting about yesterday, I started working on the successor to Swipe Gesture. The new version tries to mimic the actual behavior of Chrome on Lion, which I think is really quite cool. Here&#8217;s a <a href="http://www.youtube.com/watch?v=H-LY6-UdtO8">video I found on YouTube</a> which shows how it basically looks like if you aren&#8217;t familiar with it. The first thing to notice that it&#8217;s substantially less trivial, code-wise. No more is it a 30-line software lightweight, but it&#8217;s not <em>too </em>complex and arcane to forbid any kind of comprehension. Now, the simple prototype of its functionality is already nearing 300 lines of code.</p>
<p><a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/Screenshot-from-2012-08-14-111944.png"><img class="size-thumbnail wp-image-1780 alignright" title="Screenshot from 2012-08-14 11:19:44" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/Screenshot-from-2012-08-14-111944-150x150.png" alt="" width="150" height="150" /></a>Another big difference is now it&#8217;s no longer designed strictly for Chromebooks. In fact, one of the reasons for starting this was that I was informed that the kind of functionality might be useful on Macbooks running Windows via Bootcamp. In fact, it&#8217;s meant to be as general as possible, to work on pretty much any kind of platform. And it&#8217;s not even bound strictly to the horizontal axis: the code is meant to work with linear swipes in any direction including diagonally (although some experimentation on my chromebook seems to indicate that swiping at angles isn&#8217;t terribly useful).</p>
<p>The most significant conceptual change is the transition between a speed/acceleration metric to a distance metric. That is, in the old version, an action was triggered when there was a swipe in one direction vigorous enough to be considered. This was a fairly simple way to avoid the problem of distinguishing between a horizontal scroll action and a swipe by not making a distinction. In a sense, cheating. The new version instead does things &#8220;the right way™&#8221; by observing events carefully to determine if a swiping action actually results in scrolling. If that&#8217;s your kind of thing, the technical nitty gritty details have their own <a href="http://antimatter15.com/wp/2012/08/determining-if-a-mousewheel-event-results-in-scroll/">dedicated blog post</a>, so feel free to click through if you&#8217;re interested.</p>
<p>Once it&#8217;s determined that that scroll thing is actually probably a swipe gesture, it renders a nice little arrow in canvas. I considered using a unicode arrow and setting the font to huge, but that didn&#8217;t turn out quite as well as I expected (plus, it makes rotations and interactions with the embedding page CSS a little less predictable).</p>
<p>Also another thing is that it turns out that it&#8217;s a bad idea to set a css transition on something which is meant to hook with mouse or scroll movements because, while this ends up smoothing things out (which is good for mouse wheels because they click to the nearest 120 magical click units) it ends up producing a significant amount of lag and just feels so awkward.<br />
<a href="http://antimatter15.com/wp/wp-content/uploads/2012/08/Swipe2.png"><img class="alignright size-thumbnail wp-image-1796" title="Swipe2" src="http://antimatter15.com/wp/wp-content/uploads/2012/08/Swipe2-150x150.png" alt="" width="150" height="150" /></a><br />
Another thing (since this post is written over the course of several days, and the actual update has already been published at time of writing) is the cool redesign of the Settings page. The first thing to notice is that the settings page for once actually has settings, which is quite an accomplishment by itself. Also, it has a visual refresh that makes it look somewhat bootstrap-esque. That&#8217;s because ever since using Bootstrap in the making of Protobowl (a rather big project that I have yet to blog about), I&#8217;ve pretty much fallen in love with the color <code>whiteSmoke</code>. Partly because it has a name, which means I don&#8217;t have to google it or tattoo it on my arm for a mnemonic&#8217;s sake, and also because it&#8217;s a pretty nice color.</p>
]]></content:encoded>
			<wfw:commentRss>http://antimatter15.com/wp/2012/08/swipe-gesture-2-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.511 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-24 20:49:01 -->

<!-- Compression = gzip -->