<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title>Alex R. Young
  </title>
  
  <link href="http://alexyoung.org">
  </link>
  <updated>2012-05-25T01:05:00Z
  </updated>
  <id>http://alexyoung.org
  </id>
  <author>
    <name>Alex R. Young
    </name>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/webdevelopernotes" /><feedburner:info uri="webdevelopernotes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
    <title>Researching for Technical Writing
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/t3qlWvF3G8g/research">
    </link>
    <updated>2012-05-25T01:05:00Z
    </updated>
    <id>http://alexyoung.org/2012/05/25/research
    </id>
    <content type="html">&lt;p&gt;How are technical articles and books written?  It all comes down to research.  Every editor I've worked for has always extolled the importance of research, and a well-researched article is certainly more pleasant to write.&lt;/p&gt;

&lt;p&gt;The following suggestions are based on the methods I employ intuitively, so I may have missed out some important points.  However, I hope it gives readers some ideas on how they can bolster their own technical writing efforts.&lt;/p&gt;

&lt;h3&gt;Reader Competency&lt;/h3&gt;

&lt;p&gt;First, decide who your article is for, and what they already know.  Writing for beginners means drawing on standard documentation, and perhaps putting more creative effort into example code.&lt;/p&gt;

&lt;p&gt;Writing for more advanced developers requires more work.  When targeting readers at this level a huge amount of effort should go into understanding deeper issues.  For example, rather than researching core libraries, I'll research more involved problems such as structuring or scaling large applications.&lt;/p&gt;

&lt;h3&gt;Community&lt;/h3&gt;

&lt;p&gt;The community around a given technology generates a wealth of research material.  Try reading mailing lists, blogs, social networks, and Hacker News/Reddit comments.  This really helps show what areas commonly confuse people.&lt;/p&gt;

&lt;p&gt;When researching &lt;a href="http://dailyjs.com/2012/05/24/windows-and-node-4/"&gt;Windows and Node: Portability&lt;/a&gt;, I found several relevant posts to the &lt;a href="https://groups.google.com/forum/?fromgroups#!forum/nodejs"&gt;nodejs Google Group&lt;/a&gt; by prominent developers in that community.&lt;/p&gt;

&lt;h3&gt;Issues&lt;/h3&gt;

&lt;p&gt;GitHub and similar services provide issue tracking.  Bug reports and feature requests give amazing insights into the problems users have.&lt;/p&gt;

&lt;p&gt;It can even be productive to see how the authors fixed bugs, because it might demonstrate an interesting technique or a weakness of the underlying technologies.&lt;/p&gt;

&lt;h3&gt;Related Projects&lt;/h3&gt;

&lt;p&gt;Don't just look at the core technology that you're covering, but also read about prominent related technologies.&lt;/p&gt;

&lt;p&gt;If I wanted to write a book about Ruby, I wouldn't just research Ruby and its core libraries, I'd also focus on its major open source projects.  Researching the Rails community would give big clues as to how people perceive and use Ruby itself.&lt;/p&gt;

&lt;h3&gt;Source&lt;/h3&gt;

&lt;p&gt;Finally, any time spent looking at the technology in question's source code is time well spent.&lt;/p&gt;

&lt;p&gt;When I write about Node, I always have an editor open with Node's source code in it.  This helps me expand on material in the standard documentation, and also learn techniques straight from the developers who made the technology I'm writing about.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=t3qlWvF3G8g:TFY2J99pgzQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=t3qlWvF3G8g:TFY2J99pgzQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=t3qlWvF3G8g:TFY2J99pgzQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/t3qlWvF3G8g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/05/25/research</feedburner:origLink></entry>
  <entry>
    <title>Saint Spectrum Day
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/41mUfYgSAyE/zx-spectrum">
    </link>
    <updated>2012-04-23T01:04:00Z
    </updated>
    <id>http://alexyoung.org/2012/04/23/zx-spectrum
    </id>
    <content type="html">&lt;p&gt;&lt;img src="http://alexyoung.org/images/spectrum.png" alt="ZX Spectrum 48K" title="" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image from: &lt;a href="http://www.type-invaders.com/sinclair/wallpapers/"&gt;wallpapers for World of Spectrum&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been working as a programmer for 11 years now, and it's partly due to the ZX Spectrum 48K that my dad got me at some point in the 80s.  I wanted to learn to program it, and the fact it booted straight into BASIC encouraged a lot of experimentation.&lt;/p&gt;

&lt;p&gt;Computers don't work like that anymore, but &lt;a href="http://www.raspberrypi.org/"&gt;some people want them to&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;People find it surprising that there was an influential British computer, but the truth is there were many computers that had limited releases in their native territories; some of them used fascinating Russian &lt;a href="http://en.wikipedia.org/wiki/Zilog_Z80"&gt;Zilog Z80&lt;/a&gt; clones and were compatible with Sinclair's machine.&lt;/p&gt;

&lt;p&gt;Looking back, it's easy to think that the 80s saw a more diverse era in terms of home computer hardware.  However, if you consider that the Z80 was actually an improved implementation of Intel's 8080, and was used in everything from the Game Boy to the Amstrad CPC, then it's debatable whether things have really changed in terms of hardware diversity.&lt;/p&gt;

&lt;p&gt;The biggest change in computing since the era of the Spectrum is societal -- we decided to start connecting our computers together on a global scale, and putting connected devices in our pockets.  Now computers really are a canvas for unrestricted creativity.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=41mUfYgSAyE:BEQdi-wmuRI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=41mUfYgSAyE:BEQdi-wmuRI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=41mUfYgSAyE:BEQdi-wmuRI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/41mUfYgSAyE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/04/23/zx-spectrum</feedburner:origLink></entry>
  <entry>
    <title>usevim: For hjkl Wizards
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/A0pfI9MQPa8/use-vim">
    </link>
    <updated>2012-04-02T01:04:00Z
    </updated>
    <id>http://alexyoung.org/2012/04/02/use-vim
    </id>
    <content type="html">&lt;p&gt;&lt;a href="http://usevim.com/"&gt;Usevim&lt;/a&gt; is my new blog all about Vim.  You can follow it on the usual social networks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter: &lt;a href="http://twitter.com/#!/vimnews"&gt;@vimnews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Facebook: &lt;a href="https://www.facebook.com/vimnews"&gt;vimnews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google+: &lt;a href="https://plus.google.com/102329700005777172238"&gt;usevim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feed: &lt;a href="http://feeds.feedburner.com/usevim"&gt;usevim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've been collecting interesting Vim-related links for years, and I've wanted to launch a Vim blog for a long time.&lt;/p&gt;

&lt;p&gt;The format is similar to &lt;a href="http://dailyjs.com/"&gt;DailyJS&lt;/a&gt; -- weekly plugin roundups and lots of original content.  I'm currently publishing every Monday, Wednesday, and Friday.&lt;/p&gt;

&lt;p&gt;If you've got Vim plugins or tips to share, or would like to write a guest post, &lt;a href="http://usevim.com/contact.html"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=A0pfI9MQPa8:PdenzgAV0Hk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=A0pfI9MQPa8:PdenzgAV0Hk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=A0pfI9MQPa8:PdenzgAV0Hk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/A0pfI9MQPa8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/04/02/use-vim</feedburner:origLink></entry>
  <entry>
    <title>The Key to Android Domination
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/yFKD0LS-PPk/the-key-to-android-domination">
    </link>
    <updated>2012-03-20T00:03:00Z
    </updated>
    <id>http://alexyoung.org/2012/03/20/the-key-to-android-domination
    </id>
    <content type="html">&lt;p&gt;Where's Google's Android IDE?  They have good Eclipse support which goes some way to competing with Apple's Xcode, but the experience of developing with Xcode is far more focused and arguably better.&lt;/p&gt;

&lt;p&gt;I don't actually think developing a native Windows, Linux, and Mac OS IDE really fits with Google's approach -- they'd rather give developers the platform then get out of the way by allowing us to use our own tools.  However, there's one huge pain point in iOS development that Google could attack to win over developers: the difficulty of getting &lt;em&gt;your&lt;/em&gt; code running on &lt;em&gt;your&lt;/em&gt; device.&lt;/p&gt;

&lt;h3&gt;The Developer's Experience&lt;/h3&gt;

&lt;p&gt;After downloading several gigabytes, then setting up the necessary certificates, a developer can finally run their first &lt;em&gt;Hello World&lt;/em&gt; application on an iOS device.  This represents a weakness in Apple's approach that could be exploited.&lt;/p&gt;

&lt;p&gt;How?  Well, given that it's unlikely that Google will release a cross-platform IDE themselves, how about creating a web-based IDE?  That might sound like a nightmare to Vim hackers like me, but hear me out.  Imagine if Google had a developer site that ran something as high quality as &lt;a href="http://c9.io/"&gt;Cloud9 IDE&lt;/a&gt; (which has Vim shortcuts), with a &lt;em&gt;built-in Android simulator&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Within minutes developers could run a simple application in the simulator, without even owning a device.  No gigabyte downloads, no confusing certificates.  Google's web-based market can trigger downloads on Android devices, so how about linking devices with the IDE so apps can be sent directly to a device to run it?  A new Android developer with little experience could have a real app that they've made running on a device in minutes.&lt;/p&gt;

&lt;p&gt;This also makes a huge amount of sense given ChromeOS and Chromebooks.&lt;/p&gt;

&lt;h3&gt;Remove the Barriers&lt;/h3&gt;

&lt;p&gt;That's what Apple and Google's goal for developers should be: to let people run code with as few barriers as possible.  I think a robust web-based IDE would play a huge part in this, and the first to deploy it will get a huge win in terms of developer support.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=yFKD0LS-PPk:mpBNSGQxwNc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=yFKD0LS-PPk:mpBNSGQxwNc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=yFKD0LS-PPk:mpBNSGQxwNc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/yFKD0LS-PPk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/03/20/the-key-to-android-domination</feedburner:origLink></entry>
  <entry>
    <title>A vim-friendly Mac Keyboard
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/PEcXS05SXKU/vim-keyboard">
    </link>
    <updated>2012-01-15T00:01:00Z
    </updated>
    <id>http://alexyoung.org/2012/01/15/vim-keyboard
    </id>
    <content type="html">&lt;p&gt;I suspect the ultimate vim keyboard is the &lt;a href="http://elitekeyboards.com/products.php?sub=pfu_keyboards,hhkbpro2&amp;amp;pid=pdkb400b"&gt;Happy Hacking Professional 2&lt;/a&gt;.  The &lt;code&gt;Control&lt;/code&gt; key placement is good for vim, tmux, and screen, and the removal of uncessary arrow and function keys appeals to me.  However, it's $300, so I wondered if it's possible to hack the keyboard I already own into being a little bit more vim-friendly.&lt;/p&gt;

&lt;h3&gt;Swapping Modifier Keys&lt;/h3&gt;

&lt;p&gt;On a standard Apple keyboard the position of &lt;code&gt;Control&lt;/code&gt; sucks.  Fortunately, Apple gives us the ability to swap modifier keys around with no hacking at all.&lt;/p&gt;

&lt;p&gt;Under System Preferences, Keyboard, Modifier Keys..., the &lt;code&gt;Control&lt;/code&gt; and &lt;code&gt;Caps Lock&lt;/code&gt; keys can be switched:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://alexyoung.org/images/mac_modifier_keys.png" alt="Mac keyboard settings" title="" /&gt;&lt;/p&gt;

&lt;p&gt;It only took me a few days to get used to this, and it works well for those of us who type &lt;code&gt;Control&lt;/code&gt; a million times more often than &lt;code&gt;Caps Lock&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Use hjkl Instead of Arrows&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://alexyoung.org/images/hjkl_mac.png" alt="hjkl hacking" title="" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pqrs.org/macosx/keyremap4macbook/index.html"&gt;KeyRemap4Macbook&lt;/a&gt; allows any key to be remapped, and key repeats to be accelerated.  Of interest to us is the 'Vi mode' setting list, and 'Ubiquitous Vim Bindings'.  I selected 'Fn+hjkl to Left/Down/Up/Right' so I can use &lt;code&gt;hjkl&lt;/code&gt; to move the cursor in any application.&lt;/p&gt;

&lt;p&gt;KeyRemap4Macbook requires a reboot after installation, but once it's running the settings can be changed and experimented with at any time.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=PEcXS05SXKU:VFgd6Ce_L8o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=PEcXS05SXKU:VFgd6Ce_L8o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=PEcXS05SXKU:VFgd6Ce_L8o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/PEcXS05SXKU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/01/15/vim-keyboard</feedburner:origLink></entry>
  <entry>
    <title>Using Powerline with Mac OS
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/P0n31omuGBY/using-powerline-with-mac-os">
    </link>
    <updated>2012-01-13T00:01:00Z
    </updated>
    <id>http://alexyoung.org/2012/01/13/using-powerline-with-mac-os
    </id>
    <content type="html">&lt;p&gt;&lt;img src="http://alexyoung.org/images/vim-powerline.png" alt="Powerline, Mac OS Style" title="" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Lokaltog/vim-powerline"&gt;vim-powerline&lt;/a&gt; by Kim Silkebækken is a great plugin, but it's a little bit tricky to get it looking right in Mac OS.  I've tested it in both Snow Leopard and Lion and figured out how to get it working nicely.&lt;/p&gt;

&lt;p&gt;Snow Leopard's Terminal application doesn't support 256 colours, so I started using &lt;a href="http://www.iterm2.com/"&gt;iTerm2&lt;/a&gt; instead.  With a little bit of configuration it's functionality equivalent to Terminal, and offers tonnes of extras.  Lion's Terminal is fine.  Both need to report &lt;code&gt;xterm-256color&lt;/code&gt;, so ensure this is set up in the Preferences pane.
To get the cool UTF-8 fonts you'll need patched fonts.  Nick Quaranto posted some suitable fonts here: &lt;a href="https://gist.github.com/1595572"&gt;vim-powerline patched fonts&lt;/a&gt;.  I like "Menlo" myself.&lt;/p&gt;

&lt;p&gt;Next, read the Powerline documentation.  When the author says &lt;code&gt;set nocompatible&lt;/code&gt; and &lt;code&gt;set laststatus=2&lt;/code&gt; are required he means it, so add those to &lt;code&gt;~/.vimrc&lt;/code&gt;.  I also had to add &lt;code&gt;set t_Co=256&lt;/code&gt; and &lt;code&gt;let g:Powerline_symbols = 'unicode'&lt;/code&gt; (Kim notes that setting it to &lt;code&gt;fancy&lt;/code&gt; will work as well, and make better use of the patched fonts).&lt;/p&gt;

&lt;p&gt;Changing &lt;code&gt;Powerline_symbols&lt;/code&gt; requires the cache to be cleared, so &lt;code&gt;rm /tmp/Powerline.cache&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now your vim should look like Kim's screenshots in the Powerline repository.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=P0n31omuGBY:NIa8KPu1pLg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=P0n31omuGBY:NIa8KPu1pLg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=P0n31omuGBY:NIa8KPu1pLg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/P0n31omuGBY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2012/01/13/using-powerline-with-mac-os</feedburner:origLink></entry>
  <entry>
    <title>Build an IDE with tmux and vim
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/jH0k7M5edgw/build-an-ide-with-tmux-and-vim">
    </link>
    <updated>2011-12-19T00:12:00Z
    </updated>
    <id>http://alexyoung.org/2011/12/19/build-an-ide-with-tmux-and-vim
    </id>
    <content type="html">&lt;p&gt;&lt;img src="http://alexyoung.org/images/vimtmux.png" alt="Screenshot of vim and tmux" title="" /&gt;&lt;/p&gt;

&lt;p&gt;A friend of mine had visited an office where the employees used tmux and vim to edit Ruby projects.  He wanted to know why people would work with the console version of vim, considering the loss of the convenience of mouse input.&lt;/p&gt;

&lt;p&gt;I actually find this a good way to work, for several reasons.  Originally, using console vim forced me to learn vim's motion commands properly.  Combined with touch typing, this opened up a range of powerful ways to jump around files and lines arguably more efficiently than by using a mouse.&lt;/p&gt;

&lt;p&gt;I like to tile terminals alongside my editor.  My web development work usually requires a console for issuing ad-hoc commands, a database console, and a log viewer.  Some of my projects have test suites that run automatically when files change, so I like to be able to see the status of my tests as well.&lt;/p&gt;

&lt;p&gt;There are vim plugins that provide integration with these things, but I feel more comfortable with the vim/tmux combination.  I think it's a visualisation thing.&lt;/p&gt;

&lt;p&gt;By using command-line tools this way, we're effectively building a customised, lightweight IDE.  I also find the idea of using Unix commands in my spare tmux console panes appealing, because it's easy to pipe commands together thereby performing complex scriptable operations without the bloat of an IDE.&lt;/p&gt;

&lt;p&gt;The difference between this approach and a traditional IDE is this interface adapts around my &lt;em&gt;current task&lt;/em&gt;, and is only limited by the thousands of commands and scripting languages that I have installed.  Rather than creating a template of some kind, I create tmux panes and vim split windows as required.  Despite Eclipse and Xcode offering task-focused interfaces, I still feel like they get in the way too much.  Particularly in Xcode, where keyboard shortcuts feel like an afterthought, and my hand is consistently on the mouse.&lt;/p&gt;

&lt;p&gt;Task switching is another benefit.  I'm a freelancer, so in a typical working day I may switch between three or four projects.  By using tmux, I can detach from a session and come back later, keeping me focused on the current task at hand.  I think this is really an advantage of console vim over GUI vim and a collection of terminals, because Eclipse and Xcode attempt to save interface state when closing a project (although the latest Xcode seems to close my split panes all the time).&lt;/p&gt;

&lt;h3&gt;Why People Use &lt;code&gt;hjkl&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;It may seem needlessly awkward or elitist to some, but if you can touch type relatively correctly, vim and tmux (set to using vim's keys) make it easier to keep fingers on home row and off the mouse.&lt;/p&gt;

&lt;p&gt;That's the secret of &lt;code&gt;hjkl&lt;/code&gt; -- people who like it generally touch type correctly.  For those unaccustomed to these keys, try taking it slowly for a few days.  Type deliberately and methodically, making full use of the little fingers.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;hjkl&lt;/code&gt; argument reminds me of trying to convince novice PC gamers to learn &lt;code&gt;wasd&lt;/code&gt; over the arrow keys.  At first &lt;code&gt;wasd&lt;/code&gt; feels less intuitive, but it makes using the keyboard and mouse &lt;em&gt;together&lt;/em&gt; a lot easier.  The advantage becomes apparent when actually trying the alternative in earnest.&lt;/p&gt;

&lt;h3&gt;Configuration Tips&lt;/h3&gt;

&lt;p&gt;I use this in my &lt;code&gt;.tmux.conf&lt;/code&gt;:&lt;/p&gt;

&lt;pre class="prettyprint lang-text"&gt;
set-window-option -g mode-keys vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
&lt;/pre&gt;

&lt;p&gt;This allows me to move around tmux using vim's movement keys.&lt;/p&gt;

&lt;p&gt;If you're struggling to get used to vim's movement keys, try disabling arrow keys for insert mode: &lt;a href="http://jeetworks.org/node/89"&gt;Vim: Making those Arrow Keys Work With You&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're new to vim, it's also worth remembering that it supports ctags.  The &lt;a href="https://github.com/abudden/TagHighlight"&gt;TagHighlight&lt;/a&gt; plugin can dynamically display a panel of tags in a pane for the current buffer.  This is yet another IDE-like feature.&lt;/p&gt;

&lt;h3&gt;Dotfiles&lt;/h3&gt;

&lt;p&gt;Does your IDE's configuration sync between multiple computers?&lt;/p&gt;

&lt;p&gt;I have a private git repository called &lt;code&gt;dotfiles&lt;/code&gt; that has my vim and ctags configuration and plugins.  I wrote a little install script to automatically symbolically link configuration files with the files in my local &lt;code&gt;dotfiles&lt;/code&gt; repository.  When I get a new computer, one of the first things I do is to check out this repository.  When I start editing a project, vim and tmux behave exactly as expected.&lt;/p&gt;

&lt;h3&gt;Copy and Paste&lt;/h3&gt;

&lt;p&gt;I usually copy and paste console output into vim by using tmux's copy and paste commands.  Depending on how tmux is configured, the exact keyboard shortcuts may vary, so it's worth reading &lt;code&gt;man tmux&lt;/code&gt; about how this works.  The default should be &lt;code&gt;ctrl-b [&lt;/code&gt; to enter copy mode, &lt;code&gt;Space&lt;/code&gt; to start making a selection, &lt;code&gt;Enter&lt;/code&gt; to copy the selection, then &lt;code&gt;ctrl-b ]&lt;/code&gt; to paste.&lt;/p&gt;

&lt;h3&gt;Motion Commands&lt;/h3&gt;

&lt;p&gt;To really get efficient with vim, try to always question when a keyboard-heavy operation could have been better served by using the appropriate motion commands.  For example, when I first saw &lt;code&gt;~&lt;/code&gt; (swap case) I thought "that's cute, I'm never going to use that".  I've actually used it three times while editing this post.&lt;/p&gt;

&lt;p&gt;I started to get the hang of motion commands when I noticed more experienced vim users avoid going into insert mode unless necessary.  Keep coming back to vim's help, and you'll be surprised how many ways there are to improve your editing skills.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=jH0k7M5edgw:C9kGHDGOxHk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=jH0k7M5edgw:C9kGHDGOxHk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=jH0k7M5edgw:C9kGHDGOxHk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/jH0k7M5edgw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2011/12/19/build-an-ide-with-tmux-and-vim</feedburner:origLink></entry>
  <entry>
    <title>iOS 5 Redemption: ARC, UIAppearance, Blocks
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/4LTcxCkIxYo/ios-5-redemption">
    </link>
    <updated>2011-12-07T00:12:00Z
    </updated>
    <id>http://alexyoung.org/2011/12/07/ios-5-redemption
    </id>
    <content type="html">&lt;p&gt;iOS 5 redeems iOS development in my eyes through several new features.  There are Objective-C changes, but also new APIs that make common tasks a lot easier.  When Apple released the new SDK, I created a blank project to see what fundamental project organisation changes had been made, and the only major thing I noticed was the addition of Storyboards.&lt;/p&gt;

&lt;p&gt;Unfortunately, Storyboards are not compatible with iOS 4.  It may be possible to create a fork of a project with iOS 4 support that has a different UI, or to somehow conditionally use Storyboards.  However, we all know how much hand-coded interface development is required for real iOS projects, so I can't see myself using Storyboards.&lt;/p&gt;

&lt;h3&gt;Automatic Reference Counting&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Automatic Reference Counting implements automatic memory management for Objective-C objects and blocks, freeing the programmer from the need explicitly insert retains and releases. It does not provide a cycle collector; users must explicitly manage lifetime instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;From&lt;/em&gt;: &lt;a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html"&gt;LLVM: Automatic Reference Counting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When friends tell me they're learning iOS development, the first thing I find myself helping them with is memory management.  Learning where to use &lt;code&gt;retain&lt;/code&gt;, &lt;code&gt;release&lt;/code&gt;, and &lt;code&gt;autorelease&lt;/code&gt; isn't too difficult, but it's sometimes hard for people to realise it's a convention rather than something the compiler will automatically help with.  That has now all changed with Automatic Reference Counting (ARC).&lt;/p&gt;

&lt;p&gt;ARC is a build setting, and once it's enabled properties get new keywords and the compiler will raise errors where the old memory management keywords are used unexpectedly.  Now we can &lt;code&gt;alloc&lt;/code&gt; and initialize objects without worrying about releasing them.  If you work with pure Objective-C (no C data structures) then this is easy and cuts down a lot of code.  It feels &lt;em&gt;wrong&lt;/em&gt; at first, but after a while it's completely natural.&lt;/p&gt;

&lt;p&gt;Be sure to study the notes in &lt;a href="http://developer.apple.com/library/mac/#releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_7.html"&gt;What's New In Mac OS X: Automatic Reference Counting&lt;/a&gt; because it's not quite as simple as throwing away all &lt;code&gt;retain&lt;/code&gt; and &lt;code&gt;release&lt;/code&gt; keywords.  &lt;a href="http://www.learn-cocos2d.com/2011/11/everything-know-about-arc/"&gt;Everything you need to know about automatic reference counting&lt;/a&gt; is also a thorough post on the topic.&lt;/p&gt;

&lt;p&gt;In terms of accessibility, ARC makes iOS a lot easier for new developers.&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;UIAppearance&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;I've always struggled with meeting client expectations in terms of application appearance.  Apple's iOS apps tend to have intricately themed interfaces, and while the default widgets and colours are adequate, corporate branding soon rears its ugly head and forces me to write lots of custom UI code.&lt;/p&gt;

&lt;p&gt;The first tool in my application skinning arsenal was &lt;code&gt;stretchableImageWithLeftCapWidth:topCapHeight:&lt;/code&gt;:&lt;/p&gt;

&lt;pre class="prettyprint lang-objective-c"&gt;
UIImage *buttonImage = [[UIImage imageNamed:@"button.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0];
&lt;/pre&gt;

&lt;p&gt;This makes it possible to create buttons with gradients, shadows, and rounded corners -- anything you can put in a PNG.  &lt;a href="http://idevrecipes.com/2010/12/08/stretchable-images-and-buttons/"&gt;iDev Recipes: Stretchable Images and Buttons&lt;/a&gt; is a good post on this because it includes a diagram showing how images get stretched.&lt;/p&gt;

&lt;p&gt;Skinning buttons isn't enough for most clients.  I think every freelance client I've had has demanded a background image in a &lt;code&gt;UIToolbar&lt;/code&gt;.  Not just a tint, but an image.  I typically subclasses &lt;code&gt;UIToolbar&lt;/code&gt; and change &lt;code&gt;drawRect&lt;/code&gt; to draw an image.  This solution goes against the general wisdom that, if possible, subclassing API classes should be avoided in Objective-C.  Incidentally, there's an interesting on Stack Overflow about this very topic: &lt;a href="http://stackoverflow.com/questions/844199/is-subclassing-in-objective-c-a-bad-practice"&gt;Is subclassing in Objective-C a bad practice?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now have an adequate solution for application-wide skinning through the &lt;code&gt;UIAppearance&lt;/code&gt; protocol.  It's now possible to skin an entire app with very little code:&lt;/p&gt;

&lt;pre class="prettyprint lang-objective-c"&gt;
UIImage *navBarImage = [UIImage imageNamed:@"images/menubar.png"];
[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];

UIImage *barButton = [UIImage imageNamed:@"images/barbutton.png"];
[[UIBarButtonItem appearance] setBackgroundImage:barButton
                                        forState:UIControlStateNormal
                                      barMetrics:UIBarMetricsDefault];

UIImage *backButton = [UIImage imageNamed:@"images/back.png"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButton
                                                  forState:UIControlStateNormal
                                                barMetrics:UIBarMetricsDefault];

UIImage *tabBarBackground = [UIImage imageNamed:@"images/tabbar.png"];
[[UITabBar appearance] setBackgroundImage:tabBarBackground];
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"images/selection-tab.png"]];
&lt;/pre&gt;

&lt;p&gt;Given suitable high quality 24bit PNGs with subtle shadows and textures, your app will now blow your client's mind.&lt;/p&gt;

&lt;h3&gt;Blocks&lt;/h3&gt;

&lt;p&gt;At first I thought blocks were pretty needless, because after years of working with asynchronous APIs in Objective-C I'm comfortable with delegates.  After using blocks in a project I'm now a convert.  I actually write a lot of JavaScript, so I'm a master manipulator of closures, and I feel like some of the same code organisation techniques transition to Objective-C.&lt;/p&gt;

&lt;p&gt;What convinced me was actually something unexpected: &lt;a href="http://parse.com"&gt;Parse&lt;/a&gt;.  Parse is a service aimed at mobile developers that provides a backend that can be used to sync user data.  It can handle user registration, password resets, and arbitrary structured data and files.  While iCloud is great, Parse allows us to sync our data across iOS and Android, and potentially more platforms in the future --  all without having to write a web app.&lt;/p&gt;

&lt;p&gt;Parse's code samples have a button for displaying code that uses blocks or callbacks.  This is an example of block-based code:&lt;/p&gt;

&lt;pre class="prettyprint lang-objective-c"&gt;
[PFUser logInWithUsernameInBackground:@"myname" password:@"mypass"
  block:^(PFUser *user, NSError *error) {
    if (user) {
        // do stuff after successful login.
    } else {
        // the username or password is invalid.
    }
}];
&lt;/pre&gt;

&lt;p&gt;Once the reader understands the block syntax, this code is immediately understandable.  Contrast this to the callback-based code:&lt;/p&gt;

&lt;pre class="prettyprint lang-objective-c"&gt;
// First set up a callback.
- (void)handleUserLogin:(PFUser *)user error:(NSError **)error {
    if(user) {
        // do stuff after successful login.
    } else {
        // the username or password is invalid. 
    }
}

// Then, elsewhere in your code...
[PFUser logInWithUsernameInBackground:@"myname" 
                             password:@"mypass" 
                           withTarget:self
                             selector:@selector(handleUserLogin:error:)];
&lt;/pre&gt;

&lt;p&gt;As Objective-C developers we know the second part of this code is in another method, and that's the key.  Blocks keep related code together.  As long as your block isn't too large, this is easier to follow and therefore potentially easier to maintain.&lt;/p&gt;

&lt;p&gt;Blocks are largely intuitive, but &lt;code&gt;__block&lt;/code&gt; is a syntactical wrinkle that's worth learning properly.  Apple's &lt;a href="http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1"&gt;Blocks and Variables&lt;/a&gt; documentation covers this, but I also found &lt;a href="http://thirdcog.eu/pwcblocks/#objcblocks"&gt;Programming with C Blocks on Apple Devices&lt;/a&gt; useful as well.&lt;/p&gt;

&lt;p&gt;All three of these of these features make iOS development more accessible to newcomers, so if you've been putting off iOS development, now would be a good time to jump aboard.&lt;/p&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=4LTcxCkIxYo:fHARZhL67vY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=4LTcxCkIxYo:fHARZhL67vY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=4LTcxCkIxYo:fHARZhL67vY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/4LTcxCkIxYo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2011/12/07/ios-5-redemption</feedburner:origLink></entry>
  <entry>
    <title>Changing APIs and Package Managers
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/rSdcq4Gyv0Y/api-design">
    </link>
    <updated>2011-10-14T01:10:00Z
    </updated>
    <id>http://alexyoung.org/2011/10/14/api-design
    </id>
    <content type="html">&lt;p&gt;When I started programming there was a real &amp;#8216;if it ain&amp;#8217;t broke&amp;#8230;&amp;#8217; mentality.  At least, I think there was &amp;#8212; this was in the 90s and I connected to the community through magazines, computer shops, and public domain disks (that&amp;#8217;s disks with a &amp;#8216;k&amp;#8217;, as in floppy diskettes).  I learned a lot of BASIC derivatives from magazines, and eventually picked up some books on C.  Then I heard about K&amp;R C at university and flipped through a copy at the library.  I think one of my friends bought a copy, and I was envious because I couldn&amp;#8217;t afford it at the time.&lt;/p&gt;
&lt;p&gt;Then later on I started playing with Ruby, and there seemed to be a huge amount of experimentation and creativity within the community.  I dimly recall trying to work my way through Japanese documentation and giving up, but I came back to it a few years later when a lot of English&amp;#8211;speaking developers had jumped aboard.  The creativity in the Ruby community seemed to solidify when _why became well known and cartoon foxes and meta&amp;#8211;programming were everywhere.&lt;/p&gt;
&lt;p&gt;Then I started working with Rails, and there was a new mentality of constantly refining and changing things, sometimes based purely on aesthetic preferences, but other times to genuinely improve APIs and libraries.&lt;/p&gt;
&lt;p&gt;In contrast to this, I&amp;#8217;ve dabbled with Objective&amp;#8211;C over the years and got paid to write several iPhone apps.  I started taking Objective&amp;#8211;C seriously partly because the iPhone was such a phenomenon, but also because I like C&amp;#8211;like languages.  Apple&amp;#8217;s APIs don&amp;#8217;t change fundamentally, perhaps because they were based on solid principles established by engineers at NeXT in the 80s and 90s.  I&amp;#8217;ve found I&amp;#8217;m extremely happy writing code with events in Objective&amp;#8211;C, and data storage is trivial thanks to Core Data.&lt;/p&gt;
&lt;p&gt;Meanwhile, I&amp;#8217;ve enjoyed building Node apps because I like event&amp;#8211;based code, and JavaScript&amp;#8217;s first class functions suit me as a Lisp hobbyist who never gets paid to write Lisp.  Another reason I enjoy Node is npm&amp;#8217;s move away from system&amp;#8211;wide library installation, which makes dependency management easy.&lt;/p&gt;
&lt;p&gt;Node&amp;#8217;s core developers and prominent library and framework authors seem to be acutely aware of how frustrating API changes are.  In some ways JavaScript and Objective&amp;#8211;C seem to inspire a smaller range of API designs than Ruby &amp;#8212; Ruby libraries will come with anything from a DSL to a simple object that can be called with public methods.  JavaScript library APIs are usually designed around simple objects or chaining, and Objective&amp;#8211;C APIs use a range of design patterns, Apple&amp;#8217;s APIs in particular are focused around patterns that suit GUI development.&lt;/p&gt;
&lt;p&gt;It can be frustrating to work with Rails when API changes create unexpected problems.  The Ruby community has always had a culture of testing, which fits a dynamic language.  Tests are generally part of the development process, so code can be updated to reflect API changes with a manageable cost in terms of additional testing and time.&lt;/p&gt;
&lt;p&gt;API changes can be mitigated by locking down every library to a specific version.  That means mastering a language&amp;#8217;s package manager is now a core skill, rather than something that can be picked up on the job.  It&amp;#8217;s equivalent to the build process in a compiled language.  Don&amp;#8217;t write your &lt;code&gt;Gemfile&lt;/code&gt; or &lt;code&gt;package.json&lt;/code&gt; without putting serious thought into how library versions should be locked down.  Certain contexts and libraries can generally be on the bleeding edge, others should be locked to a specific version.  Also learn the features of your package manager -- I wouldn't like to develop npm modules without knowing about &lt;code&gt;npm link&lt;/code&gt;.&lt;/p&gt;

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=rSdcq4Gyv0Y:0WWTrjtYg4c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=rSdcq4Gyv0Y:0WWTrjtYg4c:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=rSdcq4Gyv0Y:0WWTrjtYg4c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/rSdcq4Gyv0Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2011/10/14/api-design</feedburner:origLink></entry>
  <entry>
    <title>Google+, Privacy and Engineering Consent
    </title>
    <link href="http://feedproxy.google.com/~r/webdevelopernotes/~3/GlIqy_PJdrU/google">
    </link>
    <updated>2011-09-04T01:09:00Z
    </updated>
    <id>http://alexyoung.org/2011/09/04/google
    </id>
    <content type="html">&lt;p&gt;At dConstruct 2011, Don Norman gave a talk entitled &lt;a href="http://2011.dconstruct.org/conference/don-norman"&gt;Emotional Design for the World of Objects&lt;/a&gt; in which he said Google&amp;#8217;s main product is &lt;em&gt;us&lt;/em&gt; and the service they sell is advertising.  The services Google make aren't just a way of getting eyes on adverts, but a way of gathering information about us to improve advertisement targeting.  If this is true, where is the evidence?  And what does it mean for social products like Google+?&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s now possible to &lt;a href="http://googlesystem.blogspot.com/2010/08/google-multiple-sign-in-now-available.html"&gt;link Google accounts together&lt;/a&gt;, which can make the awkward necessity of using several Google accounts more manageable.  I have Google Apps accounts for work and personal use, as well as an obligatory Gmail account for services the Apps accounts can&amp;#8217;t yet access.  I&amp;#8217;ve linked these together to make it easier to switch between them.  Does this mean I&amp;#8217;m now represented as one person internally within Google?&lt;/p&gt;
&lt;p&gt;Google&amp;#8217;s &lt;a href="http://www.google.com/intl/en/privacy/privacy-policy.html"&gt;Privacy Policy&lt;/a&gt; seems to indicate that this could be possible:&lt;/p&gt;
&lt;blockquote&gt;We may combine the information you submit under your account with information from other Google services or third parties in order to provide you with a better experience and to improve the quality of our services.&lt;/blockquote&gt;
&lt;p&gt;This doesn&amp;#8217;t specifically mention linking data between accounts, but implies information may be shared between services.  There&amp;#8217;s actually a page called &lt;a href="http://www.google.com/ads/preferences/"&gt;Ads Preferences&lt;/a&gt; that shows what Google&amp;#8217;s advertising knows about you, based on an anonymous cookie.  According to the &lt;a href="http://www.google.com/privacy/ads/"&gt;associated documentation&lt;/a&gt; consent is required before collecting personally identifying information:&lt;/p&gt;
&lt;blockquote&gt;We will not collect, sell, or share personally identifying information from ad serving cookies without your explicit consent.&lt;/blockquote&gt;
&lt;p&gt;This is interesting, because &amp;#8220;explicit consent&amp;#8221; in our field is something more malleable than it sounds.  What it amounts to is agreeing to terms and conditions, which people do on a daily basis without having to read or understand.  It&amp;#8217;s entirely possible that I&amp;#8217;ve already &lt;em&gt;explicitly&lt;/em&gt; agreed to linking my personal information with Google's anonymous advertising cookies without even realising it.&lt;/p&gt;
&lt;p&gt;This brings to mind two things: &lt;a href="http://en.wikipedia.org/wiki/Manufacturing_Consent"&gt;The Engineering of Consent&lt;/a&gt; and subsequently &lt;a href="http://en.wikipedia.org/wiki/Manufacturing_Consent"&gt;Manufacturing Consent&lt;/a&gt; by Edward S. Herman and Noam Chomsky, and &lt;a href="http://www.newscientist.com/article/mg21128225.800-internet-activist-the-dark-side-of-web-personalisation.html"&gt;Eli Pariser&amp;#8217;s filter bubble&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.thefilterbubble.com/"&gt;The Filter Bubble&lt;/a&gt; is an ongoing argument against personalisation through technologies like Google&amp;#8217;s advertising profiling:&lt;/p&gt;
&lt;blockquote lang="..."&gt;Increasingly we don&amp;#8217;t all see the same internet. We see stories and facts that make it through a membrane of personalised algorithms that surround us [&amp;#8230;] The filter bubble is the personal, unique universe of information that results and that we increasingly live in online.&lt;/blockquote&gt;
&lt;p&gt;Digesting all of these ideas around online advertising and privacy ethics finally leads me to this: &lt;a href="http://www.google.com/support/+/bin/answer.py?answer=1228271"&gt;Your name and Google+ Profiles&lt;/a&gt;.  Google+ demands real names, and accounts have been deleted for using names other than the name on your birth certificate, driving license, and passport.  If Google wanted to be in a position to clearly build accurate profiles of people, account linking and real names would be the way to do it.&lt;/p&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://2011.dconstruct.org/conference/don-norman"&gt;Emotional Design for the World of Objects&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.privacysense.net/different-types-consent/"&gt;Explicit Consent, PrivacySense.net&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/support/+/bin/answer.py?answer=1228271"&gt;Your name and Google+ Profiles&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thefilterbubble.com/"&gt;The Filter Bubble&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Manufacturing_Consent"&gt;Manufacturing Consent: The Political Economy of the Mass Media&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Engineering_of_Consent"&gt;The Engineering of Consent by Edward Bernays&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bbc.co.uk/news/technology-12668552"&gt;New net rules set to make cookies crumble&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.newscientist.com/article/mg21128225.800-internet-activist-the-dark-side-of-web-personalisation.html"&gt;Internet activist: The dark side of web personalisation&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/privacy/ads/"&gt;Google Privacy Center: Advertising and Privacy&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/intl/en/privacy/privacy-policy.html"&gt;Google Privacy Policy&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://googlesystem.blogspot.com/2010/08/google-multiple-sign-in-now-available.html"&gt;Google Multiple Sign-in&lt;/a&gt;
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=GlIqy_PJdrU:d-aacG96c2w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=GlIqy_PJdrU:d-aacG96c2w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/webdevelopernotes?a=GlIqy_PJdrU:d-aacG96c2w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/webdevelopernotes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/webdevelopernotes/~4/GlIqy_PJdrU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://alexyoung.org/2011/09/04/google</feedburner:origLink></entry>
</feed>

