Tuesday, December 18, 2012


Clutch.io is two projects:

  • Native A/B testing for iOS and Android
  • A toolkit for developing hybrid native/HTML applications for iOS

Sunday, December 2, 2012

Animated GIFs the Hard Way

Python development in Pants

Pants makes the manipulation and distribution of hermetically sealed Python environments painless.

Word wrapping/hyphenation using CSS

Thursday, November 15, 2012

iOS Runtime Headers

iOS Objective-C headers as derived from runtime introspection. Generated using RuntimeBrowser.

Sunday, November 11, 2012


ssh-copy-id installs your public key in a remote machine's authorized_keys. It should be in the contrib of the OpenSSH repository. There are other mirrors.

GPU Accelerated Compositing in Chrome

Background and details on the implementation of hardware-accelerated compositing in Chrome.

Wednesday, November 7, 2012

Sunday, November 4, 2012

Chromium Setup



  1. Visit Chromium Access and get credentials.
  2. Run svn ls --username mihaip@chromium.org svn://svn.chromium.org/chrome/trunk/src and svn ls --username mihaip@chromium.org svn://svn.chromium.org/blink/trunk to verify said credentials.
  3. cd ~/Developer/tools/
  4. svn co http://src.chromium.org/chrome/trunk/tools/depot_tools
  5. cd ../source
  6. mkdir chromium
  7. add ~/Developer/source/chromium to the list of paths that Spotlight excludes
  8. cd chromium
  9. fetch blink
  10. cd src
  11. rm -rf out/Debug
  12. export GYP_GENERATORS="ninja"
  13. export GYP_DEFINES="component=shared_library disable_nacl=1"
  14. ./build/gyp_chromium
  15. ninja -C out/Debug chrome


  1. cd ~/Developer/source/chromium/src
  2. git pull --rebase origin master
  3. export GYP_GENERATORS="ninja"
  4. export GYP_DEFINES="component=shared_library disable_nacl=1"
  5. gclient sync
  6. ninja -C out/Debug chrome

Mailing lists that mihaip@chromium.org was on

If I ever want to re-join:

Thursday, November 1, 2012

Disable +1 buttons in Google Reader

Reload Reader or mark an item as read (so that the command token gets refreshed) and then run the following in the DevTools console:

var xhr = new XMLHttpRequest();
xhr.onload = function() {
xhr.onerror = function() {

var params = '';
function addParam(name, value) {
  if (params) {
    params += '&';
  params += encodeURIComponent(name) + '=' + encodeURIComponent(value);

addParam('T', _COMMAND_TOKEN);
addParam('k', 'item-actions');
addParam('v', '{"plusone-action": false, "share-action": true, "email-action": true, "tags-action": true}');

xhr.open('POST', '/reader/api/0/preference/set');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Once you see 200 printed, you can reload Reader, and the +1 buttons should be gone.

To reset things back to the way they were, change the 'v' value to '{}'.

Sunday, October 14, 2012

Deploying at GitHub

Deploying is a big part of the lives of most GitHub employees. We don't have a release manager and there are no set weekly deploys. Developers and designers are responsible for shipping new stuff themselves as soon as it's ready. This means that deploying needs to be as smooth and safe a process as possible.

The best system we've found so far to provide this flexibility is to have people deploy branches. Changes never get merged to master until they have been verified to work in production from a branch. This means that master is always stable; a safe point that we can roll back to if there's a problem.

Friday, October 12, 2012

codesearch - Indexed regular expression-based search

Code Search is a tool for indexing and then performing regular expression searches over large bodies of source code.

Wednesday, October 10, 2012

Status Boards

Panic's and Cultured Code's.

Hybrid Mobile Apps

Tumblr for iOS: Uses a JSON API and Mustache templates like a mobile site would, but does template evaluation on the native side, with the UIWebView just being used to render the resulting HTML. This makes the absence of a JIT less critical.

LinkedIn: Works around the lack of a good web/native bridge by embedding an extremely lightweight HTTP server in the application itself. The HTTP server exposes native functionality through a very simple REST API that can be consumed in the embedded HTML controls through standard JavaScript HTTP requests.

See also this SXSW panel.

Update on 12/7/2012: Tumblr appears to have changed to being purely native.

Commute Tracker iPhone App

iPhone app that automatically keeps track of your commute and helps you detect patterns. Using geo-fencing, it could keep track of when you leave your designed home/work spots, and then do a continuous GPS track along the way. Once data is gathered, it could be visualized (e.g. by day of week, or by departure time), displayed on a map to show alternate route rates (e.g. Grant Road vs. 85) and with enough smarts, turned into a (local) push notification that tells you which way to go today.

Commute Tracker gets pretty close to this (it's automatic), but it's buggy (I had a 1 second commute), tracks too much (I want to exclude days where I make a grocery store detour) and is on the ugly side. Daily Commute is prettier, but it's too manual, requiring commutes to be started and stopped.

Feed filtering Stream Spigot tool

Build a Stream Spigot tool for filtering of feeds. Unlike Feed Rinse or Yahoo! Pipes, it wouldn't involve taking a feed URL, giving it to the tool, and getting a filtered URL to subscribe to in return. Instead, it would work by connecting to your Google Reader account and then marking matching items as read, so that they don't show up (if using new items only view).

This would have the advantage of not having to re-subscribe when deciding to filter something, benefiting from the regular crawl speed (vs. filtered feed URLs generally having only one subscriber and thus being in the slow crawl bucket) and having item metadata be preserved (though that matters less now that likes and shares are gone).

The filtering could either be done periodically, or for feeds that are PubSubHubbub-enabled, it could be triggered by PSHB pings. It does mean that there is a window during which items that should be filtered our are visible, but the filtering is likely to be cheap enough (get items since the last check, apply a read tag) that it can be done quite frequently.

In addition to the read tag, a "filtered" state tag should also be applied to the items, so that these items can be differentiated during subsequent API calls.

Wednesday, October 3, 2012

App Reload Helper Chrome Extension

To make the Chrome Apps edit-reload cycle faster (especially when there's a build/compilation step), a helper extension could be written. It could reload the app using the management API. More importantly, it could have a custom hook to trigger the re-build/compile step before reloading the app. This could be as simple as an HTTP request to a local server, or something fancier with native messaging once that's available. This could all be triggered via a keyboard command using the commands API.

Chrome Extension Reloader Macro is something along these lines, albeit targeted at extension developers. LiveReload could also be extended to support this use case.

Thursday, August 23, 2012

Code Explorer (Packaged) App

Turn Source Quicklinks into a packaged app. It can use <browser> to embed the Chromium code search and have a custom toolbar that allows switching to SVN history, blame, etc. It can also log recently pulled up docs in a sidebar, support looking up files by name.

Wednesday, July 18, 2012

Credit card reader Chrome extension

The Square card reader converts the magnetic stripe on a credit card to audio. Using the getUserMedia() API from WebRTC, it should be possible to get at that audio data (via WebAudio). mslib is a library for decoding this magnetic stripe data (blog posts with more details). It could be incorporate via NaCl. Rhombus is another project that does this (albeit Java-based).

One possible application is in a Chrome extension that implements payment form filling out by swiping a card.

Saturday, June 16, 2012


Atop is an ASCII full-screen performance monitor that is capable of reporting the activity of all processes (even if processes have finished during the interval), daily logging of system and process activity for long-term analysis, highlighting overloaded system resources by using colors, etc. At regular intervals, it shows system-level activity related to the CPU, memory, swap, disks, and network layers, and for every active process it shows the CPU utilization, the memory growth, priority, username, state, and exit code.

Saturday, June 2, 2012

What are some time-saving tips that every Linux user should know? - Quora

What are some time-saving tips that every Linux user should know?

Thursday, May 24, 2012

Git BBEdit Package

A BBEdit package to make working with Git easier.

Foundation Icons Fonts

Custom icon sets that are stored in a handy web font.

Friday, May 18, 2012

Monday, May 7, 2012


Remote terminal application that allows roaming, supports intermittent connectivity, and provides intelligent local echo and line editing of user keystrokes.

Mosh is a replacement for SSH. It's more robust and responsive, especially over Wi-Fi, cellular, and long-distance links.

Friday, April 27, 2012

Lights Out

iPhone app that lets you put nearby Macs to sleep (discovery can be handled via Bonjour). Unlike iShutdown or Control!, it shouldn't require installing a special daemon on the Mac that's to be controlled. iSleep claims to do this via Remote Login (i.e. ssh), but the reviews seem mixed. If remote Apple events are still possible, then it should be feasible via that. If not (or as an alternative), whatever mechanism Apple Remote Desktop uses could be used here too.

Monday, April 23, 2012

apt-file and finding Ubuntu packages

apt-file can find which packages include a specific file. Ubuntu Packages Search also provides a web UI.

Thursday, April 19, 2012

Freeze inactive background Chrome tabs

In the vein of the Firefox extension Dormancy, build a Chrome extension that frees up resources used by background tabs that haven't been accessed in a while. Using the chrome.tabs.onUpdated event, an LRU list could be maintained. Inactive tabs would have a screenshot taken via chrome.tabs.captureVisibleTab, and the tab would then be navigated to a chrome-extension:// URL that shows that screenshot (thus making all inactive tabs live in the extension's process, instead of separate renderer ones). When the tab is re-selected, history.back() could be used to back to the live page (by using history traversal, form/scroll position restore is invoked, retaining as much of the state as possible).

Optionally, there could be a browser action that displays the total/live/frozen tab count, in the same way that Tab Count does.

Wednesday, April 11, 2012


MVC framework making it easy to write realtime, collaborative applications that run in both Node.js and browsers.

Monday, March 12, 2012

Pretty-print inline diffs in emails

Rietveld (and presumably other code review tools) inline diffs in emails. Even if they don't, they generally have a URL that points at the review. A Gmail gadget could be written that inlines the diffs (if not already inline), and pretty-prints them (with syntax highlighting).

GitHubDiff does something like this for GitHub emails.

Wednesday, March 7, 2012


TodoMVC is a project which offers the same Todo application implemented using MV* concepts in most of the popular JavaScript MV* frameworks of today.

Solutions look and feel the same, have a common simple feature-set and make it easy for you to compare the syntax and structure of different frameworks so you can select the one you feel the most comfortable with.

Monday, March 5, 2012


Google has shut down Code Search and the Social Graph API. Replicating those services outside of Google is hard; they presuppose a scalable, well-oiled crawling/indexing/serving machine. Only Google has been able to release interesting n-gram data (from books too).

Along the same lines, the HTTP Archive tracks 55K URLs (with a goal of 1M by the end of 2012). W3Techs also only looks at the Alexa top 1 million. Presumably this is because crawling is hard. If Foursquare wanted to know how many pages have a link to a foursquare.com URL, would they want to crawl the whole web?

"Aleph" would be an infrastructure company that offers a few services:

  1. Large (billion and up) archive of sites on the internet. This would include not just raw HTML, but the full set of resources necessary to recreate that page (think crawling with headless WebKit and capturing all HTTP requests).
  2. Ability to do quick (semi-interactive) analyses over the crawl data that has been pre-processed (think regular expressions, or Dremel-like queries for attributes).
  3. Ability to run arbitrary MapReduces over the data (see ZeroVM for a way to do this safely).
  4. Ability to import new datasets (whether web-like or not)

For the web index to be useful for some applications, it would need to have a PageRank-like attribute per page to expose importance (and/or a number of visits/traffic).

In theory the Internet Archive has a lot of this data. They make their data available "at no cost to researchers, historians, and scholars," thus their willingness to license is unclear.

As for the name, the Aleph was a MacGuffin-like device from Mona Lisa Overdrive that a large copy of the Internet stored.

Update on 5/7/2012: Blekko appears to offer basic grepping functionality.

Update on 2/24/2013: CommonCrawl is a non-profit with 6 billion pages indexed and available for MapReduce.

Monday, February 27, 2012

The Locker Project

A Locker is a container for personal data, which gives the owner the ability to control how it's protected and shared. It retrieves and consolidates data from multiple sources, to create a single collection of the things you see and do online: the photos you take, the places you visit, the links you share, contact details for the people you communicate with, and much more. It also provides flexible APIs for developers to build rich applications with access to all of this information.

The Locker Project is an open source development effort, permissively licensed, and sponsored by Singly. Singly provides a personal data service based on this technology, and also welcomes its use by anyone for any purpose.

Sunday, February 12, 2012

MVC Framework for Node — Matador

Matador is a clean, organized framework for Node.js architected to suit MVC enthusiasts. It gives you a well-defined development environment with flexible routing, easy controller mappings, and basic request filtering.


CodeRunner: Edit and run code in any programming language with just a single click. Write and test code, run scripts, work with algorithms, or simply experiment with a new coding or scripting language.

Patterns: A simple yet powerful tool for working with regular expressions. Build great patterns quickly and effortlessly with syntax coloring and with matching and replacing occurring in real time.

Monday, February 6, 2012

Building Games with Web Tools



  1. Cloud9 IDE


  1. jswiki
  2. microJS



  1. Noteflight (brief tutorial on how to write music for games)
  2. Sonant Live, a tracker
  3. Aviary Roc, beat sequencer


  1. Aviary Myna


  1. jsfxr


Pixel editors

  1. Tzigla
  2. Pixie
  3. Piq
  4. Draw!
  5. Make Pixel Art
  6. TinySprite

Voxel editors

  1. Cubescape
  2. QBlock

Vector graphics

  1. svg-edit
  2. Aviary Raven


  1. Muro
  2. Sketchpad
  3. Aviary Phoenix
  4. Pixlr


  1. Pinello (requires facebook login)
  2. Recursion Toy
  3. Algorithm Ink


  1. Aviary Peacock, effects/filter editor
  2. Aviary Toucan, palette creation tool
  3. COLOURlovers, palette/color discovery
  4. Adobe Kuler, palette/color discovery

dpup/surface - GitHub

Surface is a JS library intended to help manage single-page applications (or "Ajaxy" apps). It promotes decoupling of components and provides tools for navigating between "screens" and integrating with the browser history.

Sunday, February 5, 2012

PhantomJS and confess.js

PhantomJS provides a headless, yet fully-featured, WebKit browser that can easily be launched off the command-line, and then scripted and manipulated with JavaScript.

confess.js is a small library that uses PhantonJS to make it easy to analyze web pages and apps for various purposes.