<?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:media="http://search.yahoo.com/mrss/" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:idx="urn:atom-extension:indexing" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" idx:index="no" gr:dir="ltr"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="http://www.google.com/reader">Google Reader</generator><id>tag:google.com,2005:reader/user/06786259326823379453/label/PNN</id><title>"PNN" via Noreply in Google Reader</title><gr:continuation>CIaKip-E_6sC</gr:continuation><author><name>Noreply</name></author><updated>2012-11-27T06:07:19Z</updated><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/pivotal-news-network" /><feedburner:info uri="pivotal-news-network" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gr:crawl-timestamp-msec="1353996439201"><id gr:original-id="http://onethingwell.org/post/36600461149">tag:google.com,2005:reader/item/a1f66741668a9bff</id><category term="ios" /><category term="icloud" /><category term="dropbox" /><category term="evernote" /><category term="osx" /><title type="html">Notesdeck is a simple text editor for iOS and OS X that aims to...</title><published>2012-11-26T18:00:22Z</published><updated>2012-11-26T18:00:22Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/lMffvUx9EaM/36600461149" type="text/html" /><summary xml:base="http://onethingwell.org/" type="html">&lt;img src="http://24.media.tumblr.com/tumblr_me3vi54uB21qbsh2yo1_500.png"&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;a href="http://www.notesdeck.com"&gt;Notesdeck&lt;/a&gt; is a simple text editor for iOS and OS X that aims to bridge the gap between storage and synchronisation services.&lt;/p&gt;

&lt;p&gt;Both apps can corral your notes from iCloud, Dropbox, Evernote and Simplenote, with global search across all services and Textexpander support. The OS X version offers a live Markdown preview, and lets you share notes on Squarespace, Tumblr and Twitter.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://click.linksynergy.com/fs-bin/click?id=/MHqF1RKqu8&amp;amp;subid=&amp;amp;offerid=146261.1&amp;amp;type=10&amp;amp;tmpid=3909&amp;amp;u1=notesdeck&amp;amp;RD_PARM1=https%3A%2F%2Fitunes.apple.com%2Fus%2Fapp%2Fnotesdeck-for-evernote-simplenote%2Fid543944910%3Fmt%3D8"&gt;App Store&lt;/a&gt; / &lt;a href="http://click.linksynergy.com/fs-bin/click?id=/MHqF1RKqu8&amp;amp;subid=&amp;amp;offerid=146261.1&amp;amp;type=10&amp;amp;tmpid=3909&amp;amp;u1=notesdeck&amp;amp;RD_PARM1=https%3A%2F%2Fitunes.apple.com%2Fus%2Fapp%2Fnotesdeck-for-dropbox-evernote%2Fid542417173%3Fmt%3D12"&gt;Mac App Store&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/lMffvUx9EaM" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://onethingwell.org/rss"><id>tag:google.com,2005:reader/feed/http://onethingwell.org/rss</id><title type="html">One Thing Well</title><link rel="alternate" href="http://onethingwell.org/" type="text/html" /></source><feedburner:origLink>http://onethingwell.org/post/36600461149</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1337548008094"><id gr:original-id="tag:sf.eater.com,2012://14.401792">tag:google.com,2005:reader/item/47ff7cccfced1777</id><category term="Quicklink" /><category term="Chipotle" /><category term="Expansionwire" /><title type="html">Expansionwire: Multiplying burrito chain Chipotle has plans...</title><published>2012-05-16T19:00:00Z</published><updated>2012-05-16T19:06:19Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/LWr_gHXPYas/_national_chain_chipotle_has.php" type="text/html" /><content xml:base="http://sf.eater.com/" xml:lang="en" type="html">&lt;p&gt;&lt;img alt="chipotle.jpg" src="http://sf.eater.com/uploads/chipotle.jpg" width="150" height="113"&gt;&lt;a href="http://eater.com/archives/2011/06/30/five-fastest-growing-chains.php"&gt;Multiplying&lt;/a&gt; burrito chain &lt;strong&gt;Chipotle&lt;/strong&gt; has plans to add another SoMa location at 109 4th Street soon. This will be their fourth burrito outpost downtown, and Chipotle people say there are &lt;strong&gt;even more undisclosed locations on the way&lt;/strong&gt; in San Francisco. Hey look! &lt;a href="http://www.snagajob.com/job-seeker/jobs/job-details.aspx?postingId=9124027"&gt;There's still time to apply to be a "team member"&lt;/a&gt; too. [Eaterwire] &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/LWr_gHXPYas" height="1" width="1"/&gt;</content><author><name>Eater Intern</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/EaterSF"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/EaterSF</id><title type="html">Eater SF</title><link rel="alternate" href="http://sf.eater.com/" type="text/html" /></source><feedburner:origLink>http://sf.eater.com/archives/2012/05/16/_national_chain_chipotle_has.php</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1331855280926"><id gr:original-id="tag:blog.hasmanythrough.com,2006-02-27:Article/141">tag:google.com,2005:reader/item/75b3fb4fe64213ef</id><category term="architecture" /><title type="html">Shifting to the client again</title><published>2012-03-15T23:33:00Z</published><updated>2012-03-15T23:35:12Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/AFEajrKSsqo/shifting-to-the-client-again" type="text/html" /><content xml:base="http://blog.hasmanythrough.com/" xml:lang="en-US" type="html">&lt;p&gt;This is my take on the current shift to rich, in-browser JavaScript apps.&lt;/p&gt;

&lt;p&gt;Looking back over a few decades, this is the progression of how applications have been built:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;mainframes and dumb terminals&lt;/li&gt;
&lt;li&gt;minicomputers and smart terminals&lt;/li&gt;
&lt;li&gt;networked workstations&lt;/li&gt;
&lt;li&gt;workstations and shared code/data repositories&lt;/li&gt;
&lt;li&gt;web apps and static HTML&lt;/li&gt;
&lt;li&gt;web services and rich browser apps&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Translation: The main body of the application code lives on the:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;server&lt;/li&gt;
&lt;li&gt;server + client&lt;/li&gt;
&lt;li&gt;client&lt;/li&gt;
&lt;li&gt;server + client&lt;/li&gt;
&lt;li&gt;server&lt;/li&gt;
&lt;li&gt;server + client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The server/client pendulum swings back and forth. The next logical step is apps that run on the client using standard services. Just give it a few more years...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/AFEajrKSsqo" height="1" width="1"/&gt;</content><author><name>Josh Susser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/hasmanythrough"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/hasmanythrough</id><title type="html">has_many :through</title><link rel="alternate" href="http://blog.hasmanythrough.com" type="text/html" /></source><feedburner:origLink>http://blog.hasmanythrough.com/2012/3/15/shifting-to-the-client-again</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1330931962130"><id gr:original-id="426227:4867632:15255399">tag:google.com,2005:reader/item/7e8cf239c0bd15c9</id><category term="video" /><title type="html">Grace Hopper to Programmers: Mind Your Nanoseconds!</title><published>2012-03-01T17:21:33Z</published><updated>2012-03-01T17:21:33Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/H9JWWW20_Rc/grace-hopper-to-programmers-mind-your-nanoseconds.html" type="text/html" /><link rel="canonical" href="http://highscalability.com/blog/2012/3/1/grace-hopper-to-programmers-mind-your-nanoseconds.html" /><summary xml:base="http://highscalability.com/blog/" type="html">&lt;p&gt;Computing pioneer &lt;a href="http://en.wikipedia.org/wiki/Grace_Hopper"&gt;Grace Hopper&lt;/a&gt;, &lt;a href="http://web.mit.edu/invent/iow/hopper.html"&gt;inventor of the compiler&lt;/a&gt;, searched for a concrete way to create an intuitive understanding of just how fast is a nanosecond, a billionth of a second, which was the speed of their new computer circuits. As an illustration she settled on the length of wire that is as long as light can travel in one nanosecond. The length is a very portable &lt;a href="http://3.bp.blogspot.com/-zH99SS8Ga0U/Ta36kWgQM0I/AAAAAAAABAs/k6WOz2POw5k/s1600/Nano+hanger.jpg"&gt;11.8 inches&lt;/a&gt;. A microseconds worth of wire is a still portable, but a much bulkier 984 feet. In one millisecond light travels 186 miles, which only Hercules could carry. In today's terms, at a &lt;a href="http://joyfulpublicspeaking.blogspot.com/2011/04/gigahertz-nanoseconds-grace-hopper-and.html"&gt;3.06 GHz clock speed&lt;/a&gt;, there&amp;#39;s .33 nanoseconds between ticks, or 3.73 inches of light travel.&lt;/p&gt;
&lt;p&gt;Understanding the profligate ways of programmers, she suggests that every programmer wear a necklace of a microseconds worth of wire so they know what they are wasting when they throw away microseconds. And if a General is busting your chops about satellite messages taking too long to send, you can bust out your piece of wire and explain there's a lot of nanoseconds between here and there.&lt;/p&gt;
&lt;p&gt;Here's a short, witty, and wise video of her famous nanosecond demonstration. An amazing lady, great innovator, an engaging speaker, and an inspiring teacher.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/JEpsKnWZrJ8" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/adifuinrqm2efsvnrbc1cst0m0/300/250?ca=1&amp;amp;fh=280#http%3A%2F%2Fhighscalability.com%2Fblog%2F2012%2F3%2F1%2Fgrace-hopper-to-programmers-mind-your-nanoseconds.html" width="100%" height="280" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/HighScalability?a=A2-4faQKsMc:0NGl2E4teU8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HighScalability?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/HighScalability?a=A2-4faQKsMc:0NGl2E4teU8:ZMKU6pOd71k"&gt;&lt;img src="http://feeds.feedburner.com/~ff/HighScalability?d=ZMKU6pOd71k" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HighScalability/~4/A2-4faQKsMc" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/H9JWWW20_Rc" height="1" width="1"/&gt;</summary><author><name>Todd Hoff</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/HighScalability"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/HighScalability</id><title type="html">High Scalability</title><link rel="alternate" href="http://highscalability.com/blog/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/HighScalability/~3/A2-4faQKsMc/grace-hopper-to-programmers-mind-your-nanoseconds.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1329201338573"><id gr:original-id="tag:search.twitter.com,2005:169135370812928001">tag:google.com,2005:reader/item/e92f87bcd6fb8d77</id><title type="html">@DreeStewart Pivotal Tracker, mais c&amp;#39;est de la crotte ! les hipsters utilisent sprint.ly ! :D</title><published>2012-02-13T19:06:29Z</published><updated>2012-02-13T19:06:29Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/pGRKCVbndrQ/169135370812928001" type="text/html" /><content xml:base="http://search.twitter.com/search?q=%22pivotal+tracker%22" xml:lang="en-US" type="html">@&lt;a href="http://twitter.com/DreeStewart"&gt;DreeStewart&lt;/a&gt; &lt;em&gt;Pivotal&lt;/em&gt; &lt;em&gt;Tracker&lt;/em&gt;, mais c'est de la crotte ! les hipsters utilisent sprint.ly ! :D&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/pGRKCVbndrQ" height="1" width="1"/&gt;</content><author><name>portemantho (Anthony Maës)</name></author><source gr:stream-id="feed/http://search.twitter.com/search.atom?q=%22pivotal+tracker%22"><id>tag:google.com,2005:reader/feed/http://search.twitter.com/search.atom?q=%22pivotal+tracker%22</id><title type="html">&amp;quot;pivotal tracker&amp;quot; - Twitter Search</title><link rel="alternate" href="http://search.twitter.com/search?q=%22pivotal+tracker%22" type="text/html" /></source><feedburner:origLink>http://twitter.com/portemantho/statuses/169135370812928001</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1327901007322"><id gr:original-id="tag:blogger.com,1999:blog-9238405.post-221047676093181510">tag:google.com,2005:reader/item/86c620a55e8b0fea</id><title type="html">An ode to running a database on bare metal</title><published>2012-01-24T17:03:00Z</published><updated>2012-01-24T17:03:01Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/8Zr66Mcyhb0/ode-to-running-database-on-bare-metal.html" type="text/html" /><link rel="replies" href="http://agiletesting.blogspot.com/feeds/221047676093181510/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="http://www.blogger.com/comment.g?blogID=9238405&amp;postID=221047676093181510" title="13 Comments" type="text/html" /><content xml:base="http://agiletesting.blogspot.com/" type="html">&lt;br&gt;No, my muse is not quite as strong as to inspire me to write an ode, but I still want to emphasize a few points about the goodness of running a database on bare metal.&lt;br&gt;&lt;br&gt;At Evite, we use sharded MySQL for our production database. We designed the current architecture in 2009, when NoSQL was still very much in its infancy, so MySQL seemed a solid choice, a technology that we could at least understand. As I explained &lt;a href="http://agiletesting.blogspot.com/2011/04/lessons-learned-from-deploying.html"&gt;elsewhere&lt;/a&gt;, we do use MySQL in an almost non-relational way, and we sharded from the get-go, with the idea that it's better to scale horizontally than vertically.&lt;br&gt;&lt;br&gt;We initially launched with the database hosted at a data center on a few Dell PE2970 servers, each with 16 GB of RAM and 2 quad-core CPUs. Each server was running 2 MySQL instances. We didn't get a chance to dark launch, but the initial load testing we did showed that we should be OK. However, there is nothing like production traffic to really stress test your infrastructure, and we soon realized that we have an insufficient number of servers for the peak traffic we were expecting towards the end of the year.&lt;br&gt;&lt;br&gt;We decided to scale horizontally in EC2, with one MySQL instance per m1.xlarge EC2 instance. At the time we also engaged Percona and they helped us fine-tune our Percona XtraDB MySQL configuration so we could get the most out of the m1.xlarge horsepower. We managed to scale sufficiently enough for our high season in 2010, although we had plenty of pain points. We chose to use EBS volumes for our database files, because at the time EBS still gave people the illusion of stability and durability. We were very soon confronted with severe performance issues, manifested as very high CPU I/O wait times, which were sometimes so high as to make the instance useless.&lt;br&gt;&lt;br&gt;I described in a &lt;a href="http://agiletesting.blogspot.com/2011/04/lessons-learned-from-deploying.html"&gt;previous post&lt;/a&gt; how proficient we became at failing over from a master that went AWOL to a slave. Our issues with EBS volumes were compounded by the fact that our database access pattern is very write-intensive, and a shared medium such as EBS was far from ideal. Our devops team was constantly on the alert, and it seemed like we were always rebuilding instances and recovering from EC2 instance failures, although the end-user experience was not affected.&lt;br&gt;&lt;br&gt;Long story short, we decided to bring the database back in-house, at the data center, on 'real' bare-metal servers. No virtualization, thanks. The whole process went relatively smoothly. One important point I want to make here is that we already had a year's worth of hard numbers at that point regarding the access patterns to our database, iops/sec, MySQL query types, etc, etc. So it made it easy to do proper capacity planning this time, in the presence of production traffic.&lt;br&gt;&lt;br&gt;We started by buying 2 Dell &lt;a href="http://www.dell.com/us/business/p/poweredge-c2100/pd"&gt;C2100&lt;/a&gt; servers, monster machines, with dual Intel Xeon X5650 processors (for a total of 24 cores), 144 GB RAM, and 12 x 1 TB hard disks out of which we prepared a 6 TB RAID 10 volume which we further divided in LVM logical volumes for specific types of MySQL files.&lt;br&gt;&lt;br&gt;We put 2 MySQL instances on each server, and we engaged &lt;a href="http://www.percona.com/"&gt;Percona&lt;/a&gt; again to help us fine-tune the configuration, this time including not only MySQL, but also the hardware and the OS. They were super helpful to us, as usual. Here are only some of the things they recommended, which we implemented:&lt;br&gt;&lt;ul&gt;&lt;li&gt;set vm.swappiness kernel setting to 0 in /etc/sysctl.conf&lt;/li&gt;&lt;li&gt;set InnoDB flush method to O_DIRECT because we can rely on the RAID controller to do the caching (we also mounted XFS with the nobarrier option in conjunction with this change)&lt;/li&gt;&lt;li&gt;disable MySQL query cache, which uses a global mutex that can cause performance issues when used on a multi-core server&lt;/li&gt;&lt;li&gt;various other optimizations which were dependent on our setup, things like tweaking MySQL configuration options such as key_buffer_size and innodb_io_capacity&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;One important MySQL configuration option that we had to tweak was innodb_buffer_pool_size. If we set it too high, the server could start swapping. If we set it too low, the disk I/O on the server could become too problematic. Since we had 144 GB of RAM and we were running 2 MySQL instances per server, we decided to give each instance 60 GB of RAM. This proved to strike a good balance.&lt;/div&gt;&lt;div&gt;&lt;br&gt;Once the fine-tuning was done, we directed production traffic away from 4 EC2 m1.xlarge instances to 2 x 2 MySQL instances, with each pair running on a C2100. We then sat back and wallowed for a while in the goodness of the I/O numbers we were observing. Basically, the servers were barely working. This is how life should be. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We soon migrated all of our MySQL masters back into the data center. We left the slaves running in EC2 (still one m1.xlarge slave per MySQL master instance), but we changed them from being EBS-backed to using the &lt;a href="http://agiletesting.blogspot.com/2011/05/setting-up-raid-0-across-ephemeral.html"&gt;local ephemeral disk in RAID 0 with LVM&lt;/a&gt;. We look at EC2 in this case as a secondary data center, used only in emergency situations.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;One thing that bit us in our bare-metal setup was....a bare-metal issue around the LSI MegaRAID controllers. I already blogged about the problems we had with the &lt;a href="http://agiletesting.blogspot.com/2011/09/slow-database-check-raid-battery.html"&gt;battery relearning cycle&lt;/a&gt;, and with &lt;a href="http://agiletesting.blogspot.com/2011/10/more-fun-with-lsi-megaraid-controllers.html"&gt;decreased performance in the presence of bad drives&lt;/a&gt;. But these things were easy to fix (again thanks to our friends at Percona for diagnosing these issues correctly in the first place...)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I am happy to report that we went through our high season for 2011 without a glitch in this setup. Our devops team slept much better at night too! One nice thing about having EC2 as a &amp;#39;secondary data center&amp;#39; is that if need be, we can scale out horizontally   by launching more EC2 instances. In fact, we doubled the number of MySQL slave instances for the duration of our high season, with the thought that if we need to, we can double the number of shards at the application layer, and thus scale horizontally that way. We didn&amp;#39;t have to do any tweaking fortunately, but we were able to -- a strategy which would otherwise be hard to pull off if we didn&amp;#39;t have any cloud presence, unless we bought a lot of extra capacity at the data center.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This brings me to one of the points I want to make in this post: &lt;b&gt;it is a very valuable strategy to be able to use the cloud to roll out a new architecture (which you designed from the get-go however to be horizontally scalable) and to gauge its performance in the presence of real production traffic&lt;/b&gt;. You will get less than optimal performance per instance (because of virtualization vs. real hardware) , but since you can scale horizontally, you should be able to sustain the desired level of traffic for your application. You will get hard numbers that will help you do capacity planning and you will be able to bring the database infrastructure back to real hardware if you so wish, like we did. Note that &lt;a href="http://gigaom.com/2010/06/08/how-zynga-survived-farmville/"&gt;Zynga has a similar strategy&lt;/a&gt; -- they roll out new games in EC2 and once they get a handle on how much traffic a game has, they bring it back into the data center (although it looks like they still use a private cloud and not bare metal).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Another point I want to make is that &lt;b&gt;the cloud is not ready yet for write-intensive transactional databases&lt;/b&gt;, mainly because of the very poor I/O performance that you get on virtual instances in the cloud (compounded by shared network storage such as EBS). &lt;a href="http://perfcap.blogspot.com/"&gt;Adrian Cockcroft&lt;/a&gt; will reply that Netflix is doing just fine and they&amp;#39;re exclusively in EC2. I hope they are doing just fine, and I hope his devops team is getting some good sleep at night, but I&amp;#39;m not sure. I need to perhaps qualify my point and say that the cloud is not ready for traditional transactional databases such as MySQL and PostgreSQL, which require manual sharding to be horizontally scalable. If I had to look at redesigning our database architecture today, I&amp;#39;d definitely try out HBase, Riak and maybe Cassandra. The promise there at least is that adding a new node to the cluster in these technologies is much less painful than in the manual sharding and scaling scenario. This still doesn&amp;#39;t guarantee that you won&amp;#39;t end up paying for a lot of instances to compensate for poor individual I/O per instance. Maybe a cloud vendor like Joyent with their &lt;a href="http://www.joyent.com/products/smartmachines/"&gt;SmartMachines&lt;/a&gt; will make a difference in this area (in fact, it is on our TODO list to test out their &lt;a href="http://wiki.joyent.com/display/smart/Joyent+Percona+SmartMachine"&gt;Percona SmartMachine&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Note however that there&amp;#39;s something to be said about using good ol&amp;#39; RDBMS technologies. Ryan Mack says this in a &lt;a href="http://www.facebook.com/note.php?note_id=10150468255628920"&gt;Facebook Engineering post&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;i&gt;&amp;quot;After a few discussions we decided to build on four of our core technologies: &lt;a href="https://www.facebook.com/MySQLatFacebook"&gt;MySQL/InnoDB&lt;/a&gt; for storage and replication, Multifeed (the technology that powers News Feed) for ranking, Thrift for communications, and memcached for caching. &lt;b&gt;We chose well-understood technologies so we could better predict capacity needs and rely on our existing monitoring and operational tool kits&lt;/b&gt;."&lt;/i&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The emphasis on the last sentence is mine. It's the operational aspect of a new architecture that will kill you first. With a well understood architecture, at least you have a chance to tame it.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Yet another point I&amp;#39;d like to make is: &lt;b&gt;do not base your disaster recovery strategy in EC2 around EBS volumes&lt;/b&gt;, especially if you have a write-intensive database. It's not worth the performance loss, and most of all it's not worth the severe and unpredictable fluctuation in performance. It works much better in our experience to turn the ephemeral disks of an m1.xlarge EC2 instance into a RAID 0 array and put LVM on top of that, and use it for storing the various MySQL file types. We are then able to do LVM snapshots of that volume, and upload the snapshots to S3. To build a new slave, we can restore the snapshot from S3, then catch up the replication with the master. Works fine.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;There you have it. An ode in prose to running your database on bare metal. Try it, you may sleep better at night!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/8Zr66Mcyhb0" height="1" width="1"/&gt;</content><author><name>Grig Gheorghiu</name></author><source gr:stream-id="feed/http://agiletesting.blogspot.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://agiletesting.blogspot.com/feeds/posts/default</id><title type="html">Agile Testing</title><link rel="alternate" href="http://agiletesting.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://agiletesting.blogspot.com/2012/01/ode-to-running-database-on-bare-metal.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1327086279549"><id gr:original-id="tag:blog.hasmanythrough.com,2006-02-27:Article/140">tag:google.com,2005:reader/item/b8ebf2acbd594c7b</id><category term="activerecord" /><category term="associations" /><category term="rails" /><title type="html">Modularized Association Methods in Rails 3.2</title><published>2012-01-20T19:03:07Z</published><updated>2012-01-21T01:33:06Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/zd3yt_6DiCA/modularized-association-methods-in-rails-3-2" type="text/html" /><content xml:base="http://blog.hasmanythrough.com/" xml:lang="en-US" type="html">&lt;p&gt;Happy Friday! It's Rails 3.2 day! The &lt;a href="http://weblog.rubyonrails.org/2012/1/20/rails-3-2-0-faster-dev-mode-routing-explain-queries-tagged-logger-store"&gt;official release announcement&lt;/a&gt; mentions a few of the big changes, but I'd like to take a moment to highlight a relatively &lt;a href="https://github.com/rails/rails/pull/3636"&gt;small change&lt;/a&gt; I was responsible for, one that I hope may make your life a little easier.&lt;/p&gt;

&lt;p&gt;From the ActiveRecord &lt;a href="https://github.com/rails/rails/blob/712b0b99a273c49fb4fad48ae61b4ce252ec0562/activerecord/CHANGELOG.md"&gt;CHANGELOG&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Generated association methods are created within a separate module to allow overriding and
composition using `super`. For a class named `MyModel`, the module is named
`MyModel::GeneratedFeatureMethods`. It is included into the model class immediately after
the `generated_attributes_methods` module defined in ActiveModel, so association methods
override attribute methods of the same name. *Josh Susser*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The point of this change is to allow more flexibility in working with associations in your model classes. When you define an association, ActiveRecord automagically generates some methods for you to work with the association. For example, a &lt;code&gt;has_many :patches&lt;/code&gt; association generates the methods &lt;code&gt;patches&lt;/code&gt; and &lt;code&gt;patches=&lt;/code&gt; (and a few others).&lt;/p&gt;

&lt;p&gt;Previously, those association methods were inserted directly into your model class. This change moves those methods into their own module which is then included in your model class. Your model gets the same methods through inheritance, but also gets to override those methods and still call them using &lt;code&gt;super&lt;/code&gt;. Let's take a look at two ways this makes things easier for you.&lt;/p&gt;

&lt;p&gt;Sometimes you want to replace the standard generated association methods. That's always been easy to do simply by defining new methods in your model class. The only wrinkle was that you had to make sure you defined your method &lt;em&gt;after&lt;/em&gt; you set up the association, or calling &lt;code&gt;has_many&lt;/code&gt; would overwrite your method, since last writer wins. That was usually not a problem, but sometimes plugins or other monkey patching extensions could add an association after your model's class was defined, which wouldn't give you a chance to add your method afterwards. With this change, you don't have to worry about those order dependencies anymore. Since those methods are generated in their own module, the order doesn't matter. This is a pretty small issue all told and I doubt it affected many people, but it's still worth mentioning.&lt;/p&gt;

&lt;p&gt;The real reason for this change is being able to compose your own methods with the standard generated methods. Before this change, you'd have to use &lt;code&gt;alias_method_chain&lt;/code&gt; or some other fancy footwork to layer your own logic on top of the standard association functionality. Either that or you'd have to somehow duplicate the standard behavior in your own method. Ick. Now you can compose methods using inheritance and &lt;code&gt;super&lt;/code&gt;, the way Alan Kay intended you to. Here's the example from the docs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Car &amp;lt; ActiveRecord::Base
  belongs_to :owner
  belongs_to :old_owner

  def owner=(new_owner)
    self.old_owner = self.owner
    super
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you're familiar with ActiveRecord it's probably fairly obvious what's going on there, but I'll spell it out for the new kids. When you define the &lt;code&gt;belongs_to :owner&lt;/code&gt; association, that generates a standard &lt;code&gt;owner=&lt;/code&gt; method, and puts it in the module named &lt;code&gt;Car::GeneratedFeatureMethods&lt;/code&gt;, which is the closest ancestor of class &lt;code&gt;Car&lt;/code&gt;. If you're curious what this looks like, fire up the rails console and type &lt;code&gt;Car.ancestors&lt;/code&gt; to see the class's inheritance chain. (Or use your own app and model, since that will be much easier than making up a new app just to see that one thing.)&lt;/p&gt;

&lt;p&gt;In this Car class, you can see that changing owners keeps track of the old owner, so the new owner knows who to call when he can't figure out how to open the trunk. The generated &lt;code&gt;owner=&lt;/code&gt; method does a fair amount of stuff including managing counter caches, running callbacks, setting inverse associations, etc. Skipping that could break a number of things, so after saving the old owner, you also want to run the generated method. Since it's in a module that Car inherits from, you only have to call &lt;code&gt;super&lt;/code&gt; to get that to run. No muss, no fuss!&lt;/p&gt;

&lt;p&gt;One more step towards simpler OOP in Rails! Thanks to my fellow Ruby Rogues &lt;a href="http://about.avdi.org/"&gt;Avdi Grimm&lt;/a&gt; and &lt;a href="http://blog.grayproductions.net/"&gt;James Edward Gray II&lt;/a&gt; for complaining about the old state of things enough to motivate me to finally go fix this.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/zd3yt_6DiCA" height="1" width="1"/&gt;</content><author><name>Josh Susser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/hasmanythrough"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/hasmanythrough</id><title type="html">has_many :through</title><link rel="alternate" href="http://blog.hasmanythrough.com" type="text/html" /></source><feedburner:origLink>http://blog.hasmanythrough.com/2012/1/20/modularized-association-methods-in-rails-3-2</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1327013045930"><id gr:original-id="http://www.schneier.com/blog/archives/2012/01/the_onion_on_fa.html">tag:google.com,2005:reader/item/e7ea297dde6a98fa</id><title type="html">&lt;i&gt;The Onion&lt;/i&gt; on Facebook</title><published>2012-01-19T19:02:09Z</published><updated>2012-01-19T19:02:09Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/ex9iS8P1kMk/the_onion_on_fa.html" type="text/html" /><summary xml:base="http://www.schneier.com/blog/" type="html">&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=ZJ380SHZvYU"&gt;Funny&lt;/a&gt; news video on Facebook and the CIA.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/ex9iS8P1kMk" height="1" width="1"/&gt;</summary><author><name>schneier</name></author><source gr:stream-id="feed/http://www.schneier.com/blog/index.rdf"><id>tag:google.com,2005:reader/feed/http://www.schneier.com/blog/index.rdf</id><title type="html">Schneier on Security</title><link rel="alternate" href="http://www.schneier.com/blog/" type="text/html" /></source><feedburner:origLink>http://www.schneier.com/blog/archives/2012/01/the_onion_on_fa.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1326990516930"><id gr:original-id="http://www.schneier.com/blog/archives/2012/01/using_false_ala.html">tag:google.com,2005:reader/item/f2bb5b96a818be16</id><title type="html">Using False Alarms to Disable Security</title><published>2012-01-19T12:36:38Z</published><updated>2012-01-19T12:36:38Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/u4NOnlpKk5k/using_false_ala.html" type="text/html" /><summary xml:base="http://www.schneier.com/blog/" type="html">&lt;p&gt;I wrote about &lt;a href="http://www.cbc.ca/news/arts/story/2012/01/09/greece-art-theft-picasso-mondrian.html"&gt;this technique&lt;/a&gt; in &lt;a href="http://www.schneier.com/book-beyondfear.html"&gt;&lt;i&gt;Beyond Fear&lt;/i&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;Beginning Sunday evening, the robbers intentionally set off the gallery's alarm system several times without entering the building, according to police.

&lt;p&gt;The security staffers on duty, who investigated and found no disturbances, subsequently disabled at least one alarm. The burglars then entered through a balcony door.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/u4NOnlpKk5k" height="1" width="1"/&gt;</summary><author><name>schneier</name></author><source gr:stream-id="feed/http://www.schneier.com/blog/index.rdf"><id>tag:google.com,2005:reader/feed/http://www.schneier.com/blog/index.rdf</id><title type="html">Schneier on Security</title><link rel="alternate" href="http://www.schneier.com/blog/" type="text/html" /></source><feedburner:origLink>http://www.schneier.com/blog/archives/2012/01/using_false_ala.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1326782146916"><id gr:original-id="http://techcrunch.com/?p=483250">tag:google.com,2005:reader/item/69433a348066e20d</id><category term="TC" /><category term="cloudflare" /><title type="html">CloudFlare Builds ‘Stop Censorship’ App, Lets Sites Easily “Black Out” Against SOPA</title><published>2012-01-17T00:08:41Z</published><updated>2012-01-17T00:08:41Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/3kBuekya-4k/" type="text/html" /><link rel="canonical" href="http://techcrunch.com/2012/01/16/cloudflare-builds-stop-censorship-app-lets-sites-easily-black-out-against-sopa/" /><content xml:base="http://techcrunch.com/" type="html">&lt;img width="100" height="70" src="http://tctechcrunch2011.files.wordpress.com/2012/01/screen-shot-2012-01-16-at-3-36-28-pm.png?w=100&amp;amp;h=70&amp;amp;crop=1" alt="Screen Shot 2012-01-16 at 3.36.28 PM" title="Screen Shot 2012-01-16 at 3.36.28 PM" style="float:left;margin:0 10px 7px 0"&gt;&lt;p&gt;Whatever position you may take on SOPA, or on &lt;a href="http://www.techmeme.com/120116/p47#a120116p47"&gt;whether or not sites should black out against SOPA&lt;/a&gt; (Yes it has come to this), the issue has reached a boiling point today with sites like Wikipedia and Reddit pledging to blackout on Wednesday in order to further raise awareness of the measure’s pitfalls.&lt;/p&gt;
&lt;p&gt;Because SOPA and PIPA threaten the existence of sites that link to copyright infringing content (like Twitter, Wikipedia, Facebook and every other site on the Internet) the bills — which are currently stalled in Congress — have sparked a massive online backlash.&lt;/p&gt;
&lt;p&gt;In addition to Reddit, Wikipedia and &lt;a href="http://www.icanhascheezburger.com/"&gt;Icanhazcheezburger&lt;/a&gt;, Web security startup &lt;a href="http://www.cloudflare.com"&gt;CloudFlare &lt;/a&gt;has thrown its large hat into the anti-SOPA ring, with the &lt;a href="https://www.cloudflare.com/apps/stop_censorship"&gt;“CloudFlare Stop Censorship” &lt;/a&gt;app — which essentially &lt;a href="http://www.avc.com/a_vc/2012/01/i-want-avc-to-go-dark-on-the-18th.html"&gt;solves investor Fred Wilson’s problem&lt;/a&gt; of not knowing exactly how to black out. As of 4pm PST, anyone who uses CloudFlare can download the app with one click from the CloudFlare App Marketplace (and those who don’t &lt;a href="http://mikesofaer.github.com/stop_censorship/"&gt;can grab the code from Github here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;“We thought it was an effective way to reach a mass audience and raise awareness about the dangers of a law like SOPA/PIPA,” CloudFlare founder Matthew Prince told me, “We see more than 25 billion page views per month for more than 400 million unique visitors. To give you some sense, that’s more page views than &lt;a href="http://Amazon.com/"&gt;Amazon.com&lt;/a&gt;, Twitter, Wikipedia, Zynga, and AOL — &lt;em&gt;combined&lt;/em&gt;. 400 million uniques is about 25% of the Internet’s entire population.”&lt;/p&gt;
&lt;p&gt;Prince spent most of the weekend making sure that everything was in working order and that use of the app wouldn’t affect site search ranking.&lt;/p&gt;
&lt;p&gt;Prince plans to keep the app available for the next month or so until the threat of SOPA has passed, he tells me, “I’m a recovering lawyer and still teach Internet &amp;amp; Technology law, so this is a subject I’ve been following closely and understand the real risks of. I’m pretty excited we’re helping make it easy for sites that want to participate in Wednesday’s blackout to do so.”&lt;/p&gt;
&lt;br&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tctechcrunch2011.wordpress.com/483250/"&gt;&lt;/a&gt; &lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/v7tfagih50mrtjprksjv4s1ftk/300/250?ca=1&amp;amp;fh=280#http%3A%2F%2Ftechcrunch.com%2F2012%2F01%2F16%2Fcloudflare-builds-stop-censorship-app-lets-sites-easily-black-out-against-sopa%2F" width="100%" height="280" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:2mJPEYqXBVI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?d=2mJPEYqXBVI" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?i=QZ_CZVjCCxo:Dj-aYX1GQnc:-BTjWOF_DHI" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?i=QZ_CZVjCCxo:Dj-aYX1GQnc:D7DqB2pKExk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Techcrunch?a=QZ_CZVjCCxo:Dj-aYX1GQnc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Techcrunch?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Techcrunch/~4/QZ_CZVjCCxo" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/3kBuekya-4k" height="1" width="1"/&gt;</content><author><name>Alexia Tsotsis</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/Techcrunch"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/Techcrunch</id><title type="html">TechCrunch</title><link rel="alternate" href="http://techcrunch.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/Techcrunch/~3/QZ_CZVjCCxo/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1326085581190"><id gr:original-id="http://blogs.splunk.com/?p=5995">tag:google.com,2005:reader/item/968f373cb61d765f</id><category term="Tips &amp; Tricks" /><title type="html">Splunk and Chef</title><published>2012-01-04T19:31:11Z</published><updated>2012-01-04T19:31:11Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/WqHKXffwsbk/" type="text/html" /><content xml:base="http://blogs.splunk.com/" type="html">&lt;p&gt;For those of you that run Chef in your Splunk environment, or are thinking of doing it, I have some great news.  There is now an open source code base on github.   Big thanks to Bryan Brandau and Aaron Peterson for working on this!   Here is the official tweet and link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/#!/agent462/status/154640900566433792"&gt;https://twitter.com/#!/agent462/status/154640900566433792&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bestbuycom/splunk_cookbook"&gt;https://github.com/bestbuycom/splunk_cookbook&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/WqHKXffwsbk" height="1" width="1"/&gt;</content><author><name>Simeon Yep</name></author><source gr:stream-id="feed/http://blogs.splunk.com/feed/"><id>tag:google.com,2005:reader/feed/http://blogs.splunk.com/feed/</id><title type="html">Splunk Blogs</title><link rel="alternate" href="http://blogs.splunk.com" type="text/html" /></source><feedburner:origLink>http://blogs.splunk.com/2012/01/04/splunk-and-chef/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1325695145488"><id gr:original-id="tag:blog.hasmanythrough.com,2006-02-27:Article/139">tag:google.com,2005:reader/item/6f3c9c702c8bdf82</id><category term="jargon" /><category term="programming" /><title type="html">Yak Shaving</title><published>2012-01-04T16:23:22Z</published><updated>2012-01-04T16:23:22Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/5v6Hc0txPvc/yak-shaving" type="text/html" /><content xml:base="http://blog.hasmanythrough.com/" xml:lang="en-US" type="html">&lt;p&gt;As coders, most of us are not only familiar with the term &lt;a href="http://en.wiktionary.org/wiki/yak_shaving"&gt;yak shaving&lt;/a&gt;, but spend many of our days doing nothing but. I often struggle to explain to non-technical folks what I actually spend my time doing when I'm working and what it feels like. This is the most accessible explanation I can come up with.&lt;/p&gt;

&lt;p&gt;Say you want to go see a movie with your friend Joe. You can't get away with leaving the house when the kitchen is such a mess, so you have to load and run the dishwasher before you go. Unfortunately you're out of detergent, which means you have to run to the store to pick some up. You want to ride your bike or it will take too long to get to the store. But your bike's front tire is kind of low, so you have to pump it up first. However, your roommate borrowed your tire pump and you don't know where it is, so you have to go find your roommate and ask him about it. He's over at a neighbor's place having band practice, but it's just a short walk. When you get there they are in the middle of practice so you have to wait for a few minutes. The only place to sit is on that ratty old sofa, right next to the drummer's sister, Monica, who will only let you sit there on the condition you smoke a joint with her. But before you can do that you have to dig around in the seat cushions to find the lighter she just realized she lost. You manage to find the lighter, and before too long you are smoking out with Monica. The band finishes the number and your roommate comes over to see what's up. You take another hit off the joint and say "Hey, we should order a pizza."&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/5v6Hc0txPvc" height="1" width="1"/&gt;</content><author><name>Josh Susser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/hasmanythrough"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/hasmanythrough</id><title type="html">has_many :through</title><link rel="alternate" href="http://blog.hasmanythrough.com" type="text/html" /></source><feedburner:origLink>http://blog.hasmanythrough.com/2012/1/4/yak-shaving</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1322804750559"><id gr:original-id="tag:blog.hasmanythrough.com,2006-02-27:Article/138">tag:google.com,2005:reader/item/d5549b8e15e44b1d</id><category term="ruby" /><title type="html">I heard you liked files</title><published>2011-12-02T05:35:41Z</published><updated>2011-12-02T17:32:43Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/kEqSTdKz_D4/i-heard-you-liked-files" type="text/html" /><content xml:base="http://blog.hasmanythrough.com/" xml:lang="en-US" type="html">&lt;p&gt;I was going to try and be clever and do a funny riff on this whole subject, but I just can't manage it. Here's the thing. Makefile was a dumb name for a file when Stuart Feldman wrote the make utility in 1977, but you have to forgive him because file systems were quite limited back then and filenames could only be a few characters long. The pattern was &lt;code&gt;&amp;lt;filename.ext&amp;gt;&lt;/code&gt; - 8 chars for the name, 3 for the extension. I guess config.make wouldn't fit, config.mak looked weird, so Makefile it was.&lt;/p&gt;

&lt;p&gt;Now we have no excuse. At all.&lt;/p&gt;

&lt;p&gt;I respect and adore Jim Weirich, but I hope he feels at least a little shame for inflicting "Rakefile" on us all. That name choice seems to have set the stage for a proliferation of copycats. Now we have an ever-growing assortment of files that helpfully tell us they are files right there in the file name. Because something siting in a directory in the file system might be something else, like maybe a turnip or a bad hair day. Capfile, Gemfile, Assetfile, Vagrantfile, Guardfile...&lt;/p&gt;

&lt;p&gt;You may ask: &lt;em&gt;What's the problem? Why should anyone care about a cute little naming convention that continues a tradition going back over 30 years?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It may not be a huge deal, but there are a couple issues with this. All of these file formats are actually a variation on a well-accepted language: Ruby. But with a name that omits the standard &lt;code&gt;.rb&lt;/code&gt; extension, language-aware tools have no chance to help us out. Syntax highlighting? Nope. Will awk search those files for you? No way. Will RubyMine figure out the structure of the code in those files? Forget it. OK, you can add those files to all your tools' configurations, then you're good to go. Until someone creates a new Crapfile and you have to go through and update all those configurations again.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just because your configuration file's contents are written in a DSL does not mean you should pretend it's not Ruby anymore.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I urge every maintainer of a project that uses a name like Crapfile for the configuration file to move toward using a name that is compatible with language-aware tools. If you can't think of a name yourself, allow me to suggest this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;filename.sub(/file$/, '_config.rb').downcase
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; It has been pointed out to me that RubyMine actually does a pretty good job of dealing with these file names. Not perfect, but pretty good. Anyway, I don't want to come off as bashing RubyMine (I'm spending more time with it now and it's starting to grow on me), so substitute vim or emacs or TextMate or your most-hated editor instead.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/kEqSTdKz_D4" height="1" width="1"/&gt;</content><author><name>Josh Susser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/hasmanythrough"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/hasmanythrough</id><title type="html">has_many :through</title><link rel="alternate" href="http://blog.hasmanythrough.com" type="text/html" /></source><feedburner:origLink>http://blog.hasmanythrough.com/2011/12/1/i-heard-you-liked-files</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1321838134416"><id gr:original-id="http://www.webkitbits.com/post/12843171197">tag:google.com,2005:reader/item/9e70d41fe9d0eb3a</id><category term="device" /><category term="api" /><category term="compass" /><category term="ios" /><title type="html">Taking a new device API for a spin</title><published>2011-11-15T18:50:05Z</published><updated>2011-11-15T18:50:05Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/CMUmAlYMC18/12843171197" type="text/html" /><link rel="canonical" href="http://www.webkitbits.com/post/12843171197" /><summary xml:base="http://www.webkitbits.com/" type="html">&lt;a href="http://tripleodeon.com/2011/10/taking-a-new-device-api-for-a-spin/"&gt;Taking a new device API for a spin&lt;/a&gt;: &lt;p&gt;James Pearce finds a sweet new API for the iPhone’s compass, and takes it for a test drive, in iOS5.&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.webkitbits.com/~ff/Webkitbits?a=XqHDNq9Zw1s:0Xxs8y-QAPw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Webkitbits?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.webkitbits.com/~ff/Webkitbits?a=XqHDNq9Zw1s:0Xxs8y-QAPw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Webkitbits?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.webkitbits.com/~ff/Webkitbits?a=XqHDNq9Zw1s:0Xxs8y-QAPw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Webkitbits?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.webkitbits.com/~ff/Webkitbits?a=XqHDNq9Zw1s:0Xxs8y-QAPw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Webkitbits?i=XqHDNq9Zw1s:0Xxs8y-QAPw:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/CMUmAlYMC18" height="1" width="1"/&gt;</summary><author><name>9-bits</name></author><source gr:stream-id="feed/http://feeds.webkitbits.com/Webkitbits"><id>tag:google.com,2005:reader/feed/http://feeds.webkitbits.com/Webkitbits</id><title type="html">WebKitbits</title><link rel="alternate" href="http://www.webkitbits.com/" type="text/html" /></source><feedburner:origLink>http://feeds.webkitbits.com/~r/Webkitbits/~3/XqHDNq9Zw1s/12843171197</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1321600182889"><id gr:original-id="http://xkcd.com/979/">tag:google.com,2005:reader/item/6e58fc66df429bbd</id><title type="html">Wisdom of the Ancients</title><published>2011-11-18T05:00:00Z</published><updated>2011-11-18T05:00:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/C33SOdGPabs/" type="text/html" /><summary xml:base="http://xkcd.com/" type="html">&lt;img src="http://imgs.xkcd.com/comics/wisdom_of_the_ancients.png" title="All long help threads should have a sticky globally-editable post at the top saying &amp;#39;DEAR PEOPLE FROM THE FUTURE: Here&amp;#39;s what we&amp;#39;ve figured out so far ...&amp;#39;" alt="All long help threads should have a sticky globally-editable post at the top saying &amp;#39;DEAR PEOPLE FROM THE FUTURE: Here&amp;#39;s what we&amp;#39;ve figured out so far ...&amp;#39;"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/C33SOdGPabs" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://xkcd.com/rss.xml"><id>tag:google.com,2005:reader/feed/http://xkcd.com/rss.xml</id><title type="html">xkcd.com</title><link rel="alternate" href="http://xkcd.com/" type="text/html" /></source><feedburner:origLink>http://xkcd.com/979/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320516361979"><id gr:original-id="http://therumpus.net/?p=91050">tag:google.com,2005:reader/item/52f0a4390ea201e7</id><category term="art" /><category term="rumpus original" /><title type="html">Meanwhile,  6th and Mission</title><published>2011-11-04T16:20:33Z</published><updated>2011-11-04T16:20:33Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/wxqAi21_WH4/" type="text/html" /><content xml:base="http://therumpus.net/" type="html">&lt;p&gt;&lt;a href="http://therumpus.net/2011/11/meanwhile-6th-and-mission/"&gt;&lt;img src="http://farm7.static.flickr.com/6228/6312064931_a925543773_o.jpg" alt="" width="303" height="222"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Amazing artist &lt;a href="http://therumpus.net/sections/wendy-macnaughton-featured-comics/"&gt;Wendy MacNaughton&lt;/a&gt; illustrates &lt;a href="http://therumpus.net/2011/11/meanwhile-6th-and-mission/"&gt;the worlds of 6th and Mission, as well as 5th and Mission (but mostly 6th)&lt;/a&gt;, in San Francisco, CA. &lt;a href="http://therumpus.net/2011/11/meanwhile-6th-and-mission/"&gt;…more&lt;/a&gt;&lt;br&gt;&lt;h3&gt;Related Posts:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;No related posts…&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/wxqAi21_WH4" height="1" width="1"/&gt;</content><author><name>The Rumpus</name></author><source gr:stream-id="feed/http://therumpus.net/feed/"><id>tag:google.com,2005:reader/feed/http://therumpus.net/feed/</id><title type="html">The Rumpus.net</title><link rel="alternate" href="http://therumpus.net" type="text/html" /></source><feedburner:origLink>http://therumpus.net/2011/11/meanwhile-6th-and-mission-2/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320330670914"><id gr:original-id="http://jimhighsmith.com/?p=1142">tag:google.com,2005:reader/item/039006c32a7840d8</id><category term="Adaptive Leadership" /><category term="Leadership" /><category term="Performance &amp; Governance" /><category term="Quality" /><category term="Speed-to-Value" /><title type="html">Velocity is Killing Agility!</title><published>2011-11-02T13:53:11Z</published><updated>2011-11-02T13:53:11Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/jT2B6h6_gyU/" type="text/html" /><link rel="canonical" href="http://jimhighsmith.com/2011/11/02/velocity-is-killing-agility/" /><content xml:base="http://jimhighsmith.com/" type="html">&lt;p&gt;&lt;a href="http://jimhighsmith.com/2011/11/02/velocity-is-killing-agility/software_engine/" rel="attachment wp-att-1145"&gt;&lt;img title="Software_engine" src="http://jimhighsmith.com/wpress/wp-content/uploads/2011/11/Software_engine-300x120.jpg" alt="" width="300" height="120"&gt;&lt;/a&gt;As I talk with companies around the world it’s clear that a significant number of them are still mired in the productivity, efficiency, and optimization mud. It’s easy to spot them because they are often maniacal about measuring velocity—team velocity, velocity across teams, rolling up velocity to an organizational level or even velocity per developer (yuck). Velocity is thereby killing agility. It’s the ultimate in applying a reasonable tool for the wrong reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Velocity is increasingly being used as a productivity measure (not the capacity calibration measure that it was intended to be) that focuses too much attention on the volume of story points delivered.&lt;/li&gt;
&lt;li&gt;Focusing on volume detracts from the quality of the customer experience delivered and investing enough in the delivery engine (technical quality).&lt;/li&gt;
&lt;li&gt;Giving the product owner/manager complete priority control makes the problem worse—we have gone from customer focus to customer control that further skews the balance of investing in new features versus the delivery engine.&lt;/li&gt;
&lt;li&gt;Particularly for those parts of the business for which high responsiveness (a deployment cycle time of days or weeks) is critical, investment in the delivery engine is as critical as investing in new features.&lt;/li&gt;
&lt;li&gt;Management needs to allocate resources between features and engine work and then create a product ownership team consisting of the product owner and technical leader to do feature prioritization.&lt;/li&gt;
&lt;li&gt;Value (value points) and cycle time metrics will help balance the detrimental effects of velocity measures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over emphasis on velocity causes problems because of its wide used as a productivity measure. The proper use of velocity is as a calibration tool, a way to help do capacity-based planning, as Kent Beck describes in &lt;em&gt;&lt;a href="http://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=sr_1_3?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320239118&amp;amp;sr=1-3"&gt;Extreme Programming: Embrace Change&lt;/a&gt;&lt;/em&gt;. Productivity measures in general &lt;a href="http://martinfowler.com/bliki/CannotMeasureProductivity.html"&gt;make little sense in knowledge work&lt;/a&gt;—but that’s fodder for another blog. Velocity is also a seductive measure because it’s easy to calculate. Even though story-points per iteration are calculated on the basis of releasable features, velocity at its core is about effort.&lt;/p&gt;
&lt;p&gt;While Agile teams try to focus on delivering high value features, they get side-tracked by reporting on productivity. Time after time I hear about comments from managers or product owners, “Your velocity fell from 24 last iteration to 21 this time, what’s wrong? Let’s get it back up, or go even higher.” In this scenario velocity has moved from a useful calibration tool (what is our capacity for the next iteration?) to a performance (productivity) measurement tool. This means that two things are short-changed: the quality of the customer experience (quantity of features over customer experience) and improving the delivery engine (technical quality).&lt;/p&gt;
&lt;p&gt;Agility is the ability to both create and respond to change in order to prosper in a turbulent business environment. It means we have to build and sustain a continuous value delivery engine, not one that bangs out many features the first release and then rapidly declines in ability thereafter. The ultimate expression of agility from a software perspective is continuous delivery and deployment. Our goal should not be productivity, but to “Design and deploy a great customer experience quickly—again and again over time.” In order to respond to business, technology, and competitor turbulence in the market we have to focus on delivering a superior customer experience, building new features, and improving the delivery engine that allows us to deliver quickly each and every release cycle.&lt;/p&gt;
&lt;p&gt;Compounding the problem, the Agile movement has focused on high levels of customer involvement—basically a good thing—but we’ve gone too far. A large number of Agilists decry that they can’t get organizations to focus on technical practices—but why should that be a surprise when we encourage product managers/owners to make all the priority decisions and then measure performance using velocity?  We have overcompensated for the lack of customer focus in traditional methodologies—by giving control of prioritization to the product owner/manager. The tendency has been to lump all work under the heading of “customer-facing” stories and assume we can convince product owners to agree to all the technical engine work that needs to be done. This is an over-correction from traditional projects in which months of technical work preceded any customer facing work (which was an even worse problem).&lt;/p&gt;
&lt;p&gt;Product managers/owners understand prioritizing customer experience work, but they are generally not incented nor understand the technical engine work to be done. We need to create a product ownership team consisting of the product owner and a technical leader (which may include a quality assurance lead). Product owners are the customers of today while technical and quality leaders are the customers of tomorrow.&lt;/p&gt;
&lt;p&gt;Imagine our software delivery engine as a high-powered jet engine in a fighter aircraft. What if we fail to perform adequate maintenance on that engine—it gets gunked up. What if we don’t periodically re-build parts of the engine? In software delivery we gum up the engine by: ignoring technical debt, delaying refactorings, disregarding automated testing, under-investing in continuous integration tools and processes, and in accepting long deployment cycles. These things are often considered “technical niceties” rather than keeping the engine running at optimum capacity.&lt;/p&gt;
&lt;p&gt;In Don Reinertsen’s book, &lt;em&gt;&lt;a href="http://www.amazon.com/Principles-Product-Development-Flow-Generation/dp/1935401009/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320238338&amp;amp;sr=1-1"&gt;The Principles of Product Development Flow&lt;/a&gt;&lt;/em&gt;, he suggests the formula: Cycle time / Value added time = 1 / (1 – Utilization). Therefore, when teams optimize their process for velocity, they increase the amount of waste in the delivery process, and increase cycle time. Conversely, when teams optimize for cycle time, utilization (and thus velocity) goes down. There has to be a balance.&lt;/p&gt;
&lt;p&gt;Business has moved from a world of periodic change to one of continuous change. In parallel to this, software development is evolving from project work (deliver software in a big batch and then maintain it) to one that is product oriented (deliver software in continuous releases). In order to drive behavior in the right direction we need to incorporate measures like value, delivery cycle time and technical quality metrics into our performance criteria. We need to calculate feature “value” points as well as feature “effort” points (story points). Cycle time can be an excellent measure because it depends on the software delivery engine working well, and, it’s a measure business customers understand. When we say, “Do we want new features or quality (or technical debt reduction, etc.)” it’s easy for product owners/customers to say, “of course new features.” Instead we need to say, “How do we need to balance new feature delivery with cycle time reduction?” [Note: Cost of Delay, per Don Reinertsen’s book, can also be a useful metric.]&lt;/p&gt;
&lt;p&gt;This blog should not be interpreted as anti-velocity; it still has a place for capacity planning. The problem is the weight given to velocity and turning it into a productivity measure. Because it is easy to measure, we measure it. But even more important is measuring things like feature value, feature delivery cycle time, and quality measures (defects, technical debt, etc.). Delivering high-value features to customers should be paramount, but the focus should not be one-time delivery, but continuous delivery. The debate is not features or quality; it’s balancing delivering features quickly today with increasing our ability to delivery features quickly tomorrow—over and over again. Business responsiveness is a capability, not a one-time event. Supporting that ongoing need for business responsiveness requires a high-powered, well-oiled software responsiveness engine.&lt;/p&gt;
&lt;p&gt;Note: Thanks to Martin Fowler, Jez Humble, and Ken Collier for their comments and ideas on this article.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AgileImagineering/~4/yfI-AcMgfqY" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/jT2B6h6_gyU" height="1" width="1"/&gt;</content><author><name>Jim</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/AgileImagineering"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/AgileImagineering</id><title type="html">Jim Highsmith</title><link rel="alternate" href="http://jimhighsmith.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/AgileImagineering/~3/yfI-AcMgfqY/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320330036607"><id gr:original-id="http://apple.slashdot.org/story/11/11/02/0619226/free-games-dominate-top-grossing-game-list-on-app-store?utm_source=rss1.0mainlinkanon&amp;utm_medium=feed">tag:google.com,2005:reader/item/2d0046d054cc5547</id><category term="business" /><title type="html">'Free' Games Dominate Top-Grossing Game List On App Store</title><published>2011-11-02T07:33:00Z</published><updated>2011-11-02T07:33:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/3i0FoQg3JT0/free-games-dominate-top-grossing-game-list-on-app-store" type="text/html" /><link rel="canonical" href="http://apple.slashdot.org/story/11/11/02/0619226/free-games-dominate-top-grossing-game-list-on-app-store?utm_source=rss1.0mainlinkanon&amp;utm_medium=feed" /><summary xml:base="http://slashdot.org/" type="html">&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~at/SmkYeJHnxl2VNCQecnBv41KcP3U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~at/SmkYeJHnxl2VNCQecnBv41KcP3U/0/di" border="0" ismap&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://feedads.g.doubleclick.net/~at/SmkYeJHnxl2VNCQecnBv41KcP3U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~at/SmkYeJHnxl2VNCQecnBv41KcP3U/1/di" border="0" ismap&gt;&lt;/a&gt;&lt;/p&gt;An anonymous reader writes "Why are there so many free games listed in the top 10 grossing games over in Apple's App Store? Because some feature exorbitant in-app purchase fees for virtual items. Quoting ZDNet: 'Developing "free" games aimed specifically at children, and then bundling ridiculously priced in-app purchases inside those "free" games feels scammy to me. Sure, it's not illegal, and it's not against Apple's developer terms and conditions, but Apple is a company that prides itself in protecting users from harm. Most of the game developers do make an attempt to warn users that the game "changes real money for additional in-app content" but it's a lame attempt. It's easily missed, and kids aren't going to read it anyway.'"&lt;p&gt;&lt;a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fapple.slashdot.org%2Fstory%2F11%2F11%2F02%2F0619226%2Ffree-games-dominate-top-grossing-game-list-on-app-store%3Futm_source%3Dslashdot%26utm_medium%3Dfacebook" title="Share on Facebook"&gt;&lt;img src="http://a.fsdn.com/sd/facebook_icon_large.png"&gt;&lt;/a&gt;
   
      &lt;a href="http://twitter.com/home?status=&amp;#39;Free&amp;#39;+Games+Dominate+Top-Grossing+Game+List+On+App+Store%3A+http%3A%2F%2Fbit.ly%2FvxsF7Y" title="Share on Twitter"&gt;&lt;img src="http://a.fsdn.com/sd/twitter_icon_large.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://apple.slashdot.org/story/11/11/02/0619226/free-games-dominate-top-grossing-game-list-on-app-store?utm_source=rss1.0moreanon&amp;amp;utm_medium=feed"&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;&lt;iframe src="http://slashdot.org/slashdot-it.pl?op=discuss&amp;amp;id=2504946&amp;amp;smallembed=1" style="height:300px;width:100%;border:none"&gt;&lt;/iframe&gt;&lt;img src="http://feeds.feedburner.com/~r/Slashdot/slashdot/~4/MaaH-snvz9E" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/3i0FoQg3JT0" height="1" width="1"/&gt;</summary><author><name>Soulskill</name></author><source gr:stream-id="feed/http://rss.slashdot.org/Slashdot/slashdot"><id>tag:google.com,2005:reader/feed/http://rss.slashdot.org/Slashdot/slashdot</id><title type="html">Slashdot</title><link rel="alternate" href="http://slashdot.org/" type="text/html" /></source><feedburner:origLink>http://rss.slashdot.org/~r/Slashdot/slashdot/~3/MaaH-snvz9E/free-games-dominate-top-grossing-game-list-on-app-store</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320206614384"><id gr:original-id="http://www.exampler.com/blog/2011/10/31/using-functional-style-in-a-ruby-webapp/">tag:google.com,2005:reader/item/b75b03c5ecdeb895</id><category term="ruby" /><category term="programming" /><category term="clojure" /><title type="html">Using functional style in a Ruby webapp</title><published>2011-10-31T06:54:45Z</published><updated>2011-10-31T06:54:45Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/6G8RFhzuBmY/" type="text/html" /><content xml:base="http://www.exampler.com/blog" type="html">&lt;p&gt;&lt;b&gt;Motivation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Consider a Ruby backend that communicates with its frontend via JSON. It sends (and perhaps receives) strings like this:&lt;/p&gt;

&lt;p&gt;Let’s suppose it also communicates with a relational database. A simple translation of query results into Ruby looks like this:&lt;/p&gt;

&lt;p&gt;(I’m using the &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt; gem to talk to Postgres.)&lt;/p&gt;
&lt;p&gt;On the face of it, it seems odd for our code to receive dumb hashes and arrays, laboriously turn them into model objects with rich behavior, fling some messages at them to transform their state, and then convert the resulting object graph back into dumb hashes and arrays. There are strong historical reasons for that choice—see &lt;a href="http://martinfowler.com/"&gt;Fowler&lt;/a&gt;’s &lt;i&gt;&lt;a href="http://martinfowler.com/books.html#eaa"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt;&lt;/i&gt;—but I’m starting to wonder if it’s as clear a &lt;i&gt;default&lt;/i&gt; choice as it used to be. Perhaps a functional approach could work well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
Functional programs focus on the flow of data through code, rather than on objects with changing state. The former seems more of a match for a typical webapp.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
It’s common in functional languages to lean toward a few core datatypes—like hashes and arrays—that are operated on by a wealth of functions. We could skip the conversion step into objects. Rather than having to deal with the &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;leaky abstraction&lt;/a&gt; of an object-relational mapping layer, we’d embrace the nature of our data.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seems plausible, I’ve been thinking. However, I’ve never been wildly good at understanding the problems of an approach just &lt;a href="http://incanter.org/images/misc/hammock-driven-dev.png"&gt;by thinking about it&lt;/a&gt;. It’s more efficient for me to learn by doing. So I’ve decided to &lt;a href="http://martinfowler.com/bliki/StranglerApplication.html"&gt;strangle&lt;/a&gt; an application whose communication with its database is, um, labored.  &lt;/p&gt;
&lt;p&gt;I’m going to concentrate on two things: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
&lt;i&gt;Structuring the code&lt;/i&gt;. More than a year of work on &lt;a href="https://github.com/marick/Midje"&gt;Midje&lt;/a&gt; has left me still unhappy about the organization of its code, despite my using &lt;a href="http://www.raggedclown.com/"&gt;Kevin Lawrence&lt;/a&gt;’s &lt;a href="http://www.exampler.com/old-blog/2005/06/16/"&gt;guideline&lt;/a&gt;: if you have trouble finding a piece of code, move it to where you first looked. I have some hope that Ruby’s structuring tools (classes, modules, &lt;code&gt;include&lt;/code&gt;, etc.) will be useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;i&gt;Dependencies&lt;/i&gt;. As you’ll see, I’ll be writing code with a lot of &lt;a href="http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling.aspx"&gt;temporal coupling&lt;/a&gt;. Is that and &lt;a href="http://en.wikipedia.org/wiki/Coupling_(computer_programming)#Types_of_coupling"&gt;other kinds of coupling&lt;/a&gt; dooming me to a &lt;a href="http://en.wikipedia.org/wiki/Intertwingularity"&gt;deeply intertwingled&lt;/a&gt; mess that I can’t change safely or quickly?
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post is about where I stand so far, after adding just one new feature.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;A path through the app&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/marick/critter4us"&gt;Critter4us&lt;/a&gt; is an app that’s used to reserve teaching animals at the University of Illinois vet school. Reserving animals is like reserving meeting rooms, but with some different business rules. For example, Boombird the horse doesn’t care if students practice bandaging on him every day. However, it would be inhumane to practice giving him injections every day, so that can be done at most twice a week. &lt;/p&gt;
&lt;p&gt;The story I’ve been working on is one that makes a copy of an existing reservation but with a new “timeslice” (something like “January 1st through 3d, in the mornings”). Ideally, the same animals will be assigned to the copy, but that’s not always possible. If someone else has already reserved the animal for an overlapping timeslice, a new animal has to be found. Or if a procedure (like giving injections) would be within an animal’s “blackout period”, a new animal has to be found for it. For historical reasons, the reservation is made without the unusable animals and the user is alerted to edit it to add new ones.&lt;/p&gt;
&lt;p&gt;Here’s the heart of the code for the feature:&lt;/p&gt;

&lt;p&gt;The rest of this post will explain how that works and how it’s in a functional style. When I mention classes, I’ll link to the source.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;FullReservation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The object model for the old program starts with a &lt;i&gt;reservation&lt;/i&gt;, which contains information like “Who made the reservation?” and “For when?”. It also contains zero or more &lt;i&gt;groups&lt;/i&gt;, each of which contains zero or more &lt;i&gt;uses&lt;/i&gt;. A use links an animal to a procedure to be performed on it. I defined the class structure first, then mapped it onto a database schema, deliberately deferring any worries about efficiency:&lt;/p&gt;

&lt;p&gt;The object-to-relational mapping library (&lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;) let me work with the data in a way that hid (”unflattened”) the table structure:&lt;/p&gt;

&lt;p&gt;The existence of three tables is made somewhat implicit.&lt;/p&gt;
&lt;p&gt;I’m replacing that old &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/strangled-src/model/reservation.rb"&gt;Reservation&lt;/a&gt;&lt;/code&gt; object with a new &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt;. In &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt;, I chose instead to make them explicit:&lt;/p&gt;

&lt;p&gt;That notation is awkward to type and it doesn’t lend itself to the &lt;a href="http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html"&gt;Symbol#to_proc hack&lt;/a&gt;, so I follow Javascript by allowing dot notation as a pun for key lookup:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Namespacing&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I’m supposedly doing this in a functional style, and the very first thing I’ve done is make a class? What’s up with that?&lt;/p&gt;
&lt;p&gt;I have two reasons. First, I think having the order of function application flow left to right fits the (Western-language-speaker) perception that time flows from left to right and from top to bottom. That makes this:&lt;/p&gt;

&lt;p&gt;… easier to read than this:&lt;/p&gt;

&lt;p&gt;The second reason is namespacing. You’ll shortly see that everything is built on top of an immutable, lazy &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; object. A &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; just collects those methods that wouldn’t make sense for anything but a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; being treated as a reservation. It’s about avoiding name collisions more than about modeling the world.&lt;/p&gt;
&lt;p&gt;Inheritance gives me nested namespaces, something I dearly wish I had in Clojure. For example, there are a variety of functions that apply to &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;es&lt;/code&gt; that represent database tables, but are irrelevant to other ones. That code is contained in &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt;’s superclass, &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/db_hash.rb"&gt;DBHash&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Actually: not quite. The text of the code is found in three different modules that are &lt;code&gt;included&lt;/code&gt; into &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/db_hash.rb"&gt;DBHash&lt;/a&gt;&lt;/code&gt;. I expect to do a lot of mixing-and-matching to create namespaces for particular &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/db_hash.rb"&gt;DBHash&lt;/a&gt;&lt;/code&gt; classes and even particular objects (via &lt;code&gt;extend&lt;/code&gt;). &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Extracting a FunctionalTimeslice from a FullReservation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;reservations&lt;/code&gt; table, there are three columns devoted to “when is the reservation for?” They are &lt;code&gt;:first_date&lt;/code&gt;, &lt;code&gt;:last_date&lt;/code&gt;, and &lt;code&gt;:time_bits&lt;/code&gt;. (The first two are Date objects; the last represents the set &lt;code&gt;{morning, afternoon, evening}&lt;/code&gt;. In a proper object-oriented design, you’d expect a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; to &lt;a href="https://github.com/marick/critter4us/blob/functional/strangled-src/model/reservation.rb#L78"&gt;contain&lt;/a&gt; a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/strangled-src/model/timeslice.rb"&gt;Timeslice&lt;/a&gt;&lt;/code&gt; that in turn contains those three values and some timeslice-specific methods as well. I chose to handle such sub-objects differently. Instead of asking a reservation for its timeslice, you make a timeslice from a reservation using setlike operations.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; has an &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L70"&gt;only&lt;/a&gt;&lt;/code&gt; method that produces a smaller &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; containing &lt;i&gt;only&lt;/i&gt; the named key-value pairs. So this is a timeslice:&lt;/p&gt;

&lt;p&gt;I give the timeslice access to a timeslice-specific namespace by wrapping it in a class: &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Adding a new Timeslice to Full Reservation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It’s often said that code without mutable state is easier to reason about. I don’t personally find that as big a deal as other people do, but I’ve gotten used to immutability from my Clojure programming. So &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; disallows messages like this:&lt;/p&gt;

&lt;p&gt;The equivalent of assigning a value to a key is done by merging it and creating a new &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;. The equivalent of deleting a key is done by making a copy of &lt;/code&gt;&lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; without the given key. At the moment, this implementation is grossly space-inefficient. Eventually, I’ll port it over to &lt;a href="http://www.harukizaemon.com/"&gt;Simon Harris&lt;/a&gt;’s &lt;a href="https://github.com/harukizaemon/hamster"&gt;Hamster&lt;/a&gt;, which implements structure sharing and other optimization techniques. I’m even thinking I might port his code to C.&lt;/p&gt;
&lt;p&gt;Here’s the way to change a reservation’s date:&lt;/p&gt;

&lt;p&gt;A few notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
&lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L35"&gt;change_within&lt;/a&gt;&lt;/code&gt; is a way of “merging” into a nested hash. It’s the equivalent of this:&lt;/p&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Remember that, here, &lt;code&gt;timeslice&lt;/code&gt; is a three-key hash, not an object.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
I’m also removing the &lt;code&gt;id&lt;/code&gt; to remind myself that the reservation produced here no longer corresponds to one in the database.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Working with disallowed animals&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Any time a reservation is made, it disallows some animals (because they’re now in use) and may disallow some animal/procedure pairs (because of rules about how frequently a procedure can be performed). That information is calculated once and stored in Postgres tables named &lt;code&gt;excluded_because_in_use&lt;/code&gt; and &lt;code&gt;excluded_because_of_blackout_period&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The code to look up which animals are in use during a timeslice is factored into three pieces. Inlined, it would look like this:&lt;/p&gt;

&lt;p&gt;(&lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L87"&gt;Fall&lt;/a&gt;&lt;/code&gt; turns an array of hashes into an array of &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHashes&lt;/a&gt;&lt;/code&gt;.) &lt;/p&gt;
&lt;p&gt;Because that code doesn’t refer to a reservation at all, it seems reasonable to put it in the &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/functional_timeslice.rb"&gt;FunctionalTimeslice&lt;/a&gt;&lt;/code&gt; namespace.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; can use the list of animal ids to prune out its uses:&lt;/p&gt;

&lt;p&gt;That’s all easy enough, but the contract with the user is that she’ll see a list of names of animals that couldn’t be included in the reservation. Getting that list is easy enough, given that we have ready access to the rejected uses. Here’s the code, with changes to the previous version highlighted:&lt;/p&gt;

&lt;p&gt;That’s fine, but what do we do with the value named by &lt;code&gt;___animals_already_in_use___&lt;/code&gt;? I’d hate to return it along with the new version of the reservation because its caller would have to look like this:&lt;/p&gt;

&lt;p&gt;I’d rather avoid names for intermediate steps in the creation of the reservation copy. I want the various versions to flow anonymously through a chain of functions so that I need only name the original and the final copy. (&lt;code&gt;original&lt;/code&gt; and &lt;code&gt;copy&lt;/code&gt; would be better names than &lt;code&gt;reservation&lt;/code&gt; and &lt;code&gt;new_reservation&lt;/code&gt;, it occurs to me, but I’m not going to go back now and change all these gists.)&lt;/p&gt;
&lt;p&gt;That suggests slamming the animal list into the next version of the reservation, like this:&lt;/p&gt;

&lt;p&gt;That kind of creeps me out, and it exacerbates temporal coupling. Nevertheless, it lets the caller &lt;i&gt;look nice&lt;/i&gt;, which might mean something. (If mathematicians can go on about elegance, why can’t I?) I hope my tests will loudly tell me when coupling causes a change to function X to break function Y.  &lt;/p&gt;
&lt;p&gt;&lt;b&gt;as_saved&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The last step of creating the copied reservation is oddly named:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;as_saved?&lt;/i&gt; This is a stylistic affectation that I’m not sure is a good idea. What I’m trying to imply is that the &lt;i&gt;main&lt;/i&gt; thing this function does is create a new &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; with a bit of extra data, namely &lt;code&gt;data.id&lt;/code&gt;, merged in. (The id needs to be sent off to the front end.) The fact that the id is created by changing persistent state somewhere is just an implementation detail. It could just as well be that every possible reservation always already exists somewhere as a big immutable pool, so &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb#L67"&gt;as_saved&lt;/a&gt;&lt;/code&gt; just does a lookup to find the matching id.&lt;/p&gt;
&lt;p&gt;(Which, it again occurs to me too late, perhaps makes as_saved a name that, strictly, reveals too much about the implementation.)&lt;/p&gt;
&lt;p&gt;(Interestingly, I understand that the human immune system works roughly like the silly implementation above: you’re born with some &lt;a href="http://en.wikipedia.org/wiki/Antibody#Immunoglobulin_diversity"&gt;10 billion different antibodies&lt;/a&gt; and the response to infection (mostly) involves finding the useful ones, not creating new ones that match the foreign agent.)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;code&gt;only&lt;/code&gt; and the nature of classes&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;After the as-it-appears-in-the-database &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; is created, the pieces that the frontend code care about are extracted and returned to the controller code, which turns them into JSON:&lt;/p&gt;

&lt;p&gt;But something creepy is going on here. What’s the type of the result of &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L70"&gt;only&lt;/a&gt;&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;How can anyone possibly believe that the two-element hash, containing nothing about the reservation in question (but only about the difference between it and its original) is a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt;?  &lt;/p&gt;
&lt;p&gt;For a time, I considered changing &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L70"&gt;only&lt;/a&gt;&lt;/code&gt; to produce a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt;, rather than (as it does) an object of the same class as the receiver of the method. Then I smacked myself and reminded myself that I’m using classes to identify namespaces, not &lt;a href="http://plato.stanford.edu/entries/natural-kinds/"&gt;natural kinds&lt;/a&gt;. Saying that the result of &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L70"&gt;only&lt;/a&gt;&lt;/code&gt; “is a” &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; would be absurd. But it’s less absurd to say that (1) we started with a hash, (2) the functions in the namespace &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; applied to it, (3) we derived a second hash from the first, so (4) it’s probably a good guess that the same namespace will be also useful for the second hash.&lt;/p&gt;
&lt;p&gt;That is, it’s all about conservation of work. If I stripped every result of &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb#L70"&gt;only&lt;/a&gt;&lt;/code&gt; down to a bare &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt;, I’d sometimes have to add a namespace back. By not stripping it, sure, I may get irrelevant functions in the easily-accessible namespace, but I can just ignore them.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Laziness&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I chose the name &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; not just because &lt;code&gt;Reservation&lt;/code&gt; was already taken. It’s because a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; contains all the values that can possibly be relevant to a reservation. But some HTTP requests only care about the reservation’s id. Some only care about some of the data (like the timeslice). Only a few care about the uses and the groups.&lt;/p&gt;
&lt;p&gt;Laziness of the sort implemented in Clojure and Haskell seems a nice match for this. When a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; key is assigned a block/lambda, it doesn’t treat that as a value. Rather, the &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/functional/functional_hash.rb"&gt;FunctionalHash&lt;/a&gt;&lt;/code&gt; runs that block to calculate the value when the key is dereferenced. After that, the value is cached (and is immutable, just like any other value).&lt;/p&gt;
&lt;p&gt;So consider these two steps from our controller:&lt;/p&gt;

&lt;p&gt;We create a new reservation by saving a modified reservation to disk. That gives us a new row in the &lt;code&gt;reservations&lt;/code&gt; table, some new rows in the &lt;code&gt;groups&lt;/code&gt; table, and some new rows in the &lt;code&gt;uses&lt;/code&gt; table. But nothing of the &lt;code&gt;groups&lt;/code&gt; or &lt;code&gt;uses&lt;/code&gt; is used from then on, so it would be a waste to populate the &lt;code&gt;new_reservation&lt;/code&gt; with them. How is that avoided? By creating a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; like this:&lt;/p&gt;

&lt;p&gt;The uses and groups and even the row in the &lt;code&gt;:reservations&lt;/code&gt; table are only loaded when they’re needed, so it costs little to use a &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; for everything. With this structure, I’m trying to gain more control than an object-to-relational mapping library gives me, while still freeing myself from the micromanagement of loading. Time will tell if that works.&lt;/p&gt;
&lt;p&gt;(Note: I stash the original &lt;code&gt;id&lt;/code&gt; that led to the &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; in &lt;code&gt;:starting_id&lt;/code&gt;. Part of the motivation was to allow a completely fresh &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt; to return its id without going to the database at all, and another part was to retain the original id even after later changes made it no longer an index into the reservation contents. This dual purpose makes the code confused, I think.)&lt;/p&gt;
&lt;p&gt;(Note: Postgres supports the SQL &lt;a href="http://www.postgresql.org/docs/8.3/interactive/sql-insert.html"&gt;RETURNING&lt;/a&gt; extension. So it’d be relatively easy to fully populate a saved &lt;code&gt;&lt;a href="https://github.com/marick/critter4us/blob/functional/src/db/full_reservation.rb"&gt;FullReservation&lt;/a&gt;&lt;/code&gt;. I’ve used RETURNING several times, but always later discarded it for one reason or another.)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The grand conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I’ve always hated end-of-talk or end-of-post summations. So I don’t really have one here, except that this approach feels promising, I want to continue trying it, I’d like to hear your comments (sorry about the antiquated blog software), and I’d especially like to hear what happens if you try out this approach.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/6G8RFhzuBmY" height="1" width="1"/&gt;</content><author><name>Brian Marick</name></author><source gr:stream-id="feed/http://www.exampler.com/blog/feed"><id>tag:google.com,2005:reader/feed/http://www.exampler.com/blog/feed</id><title type="html">Exploration Through Example</title><link rel="alternate" href="http://www.exampler.com/blog" type="text/html" /></source><feedburner:origLink>http://www.exampler.com/blog/2011/10/31/using-functional-style-in-a-ruby-webapp/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320157426776"><id gr:original-id="http://rdegges.com/on-programming-deadlines">tag:google.com,2005:reader/item/b8c98c7180bcafa9</id><title type="html">On Programming Deadlines</title><published>2011-06-23T23:47:00Z</published><updated>2011-06-23T23:47:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/2DXS169AkXQ/on-programming-deadlines" type="text/html" /><link rel="canonical" href="http://rdegges.com/on-programming-deadlines" /><summary xml:base="http://rdegges.com/" type="html">&lt;p&gt;
	&lt;p&gt;There are a lot of differences between programming, and programming professionally. The most notorious of which, is deadlines.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Deadlines&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When you're writing code for yourself, you can spend as much (or as little time) on it as you please--but when you're writing code for &lt;em&gt;other&lt;/em&gt; people, you've got only a limited amount of time and resources to get the job done. In my experience, this typically leads to one of two situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You've got to extend the deadline to finish the job properly.&lt;/li&gt;
&lt;li&gt;You've got to write some dirty hacks to finish the job.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you've ever done professional programming, you know what I mean. Very few projects are agile enough to allow for both sufficient time and resources to get the job done. This leads to tough decisions for programmers.&lt;/p&gt;
&lt;p&gt;No self-respecting programmer wants to deliver sub-par code; but it's difficult to consistently deliver high-quality code when dealing with time obligations, especially in professional environments where you're dealing with non-engineers who don't necessarily understand the concept of technical debt.&lt;/p&gt;
&lt;p&gt;Luckily, there are some guidelines you can follow to help minimize the amount of hackery you have to do when writing code on a deadline. They aren't necessarily quick-fixes, but can certainly be helpful to anyone who needs to consistently push out top-notch code, day after day.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Rule 1: Setup Continuous Deployment Before Writing ANY Code&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is a tip I picked up from &lt;a href="http://www.amazon.com/gp/product/020161622X/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=020161622X" title="The Pragmatic Programmer"&gt;The Pragmatic Programmer&lt;/a&gt; book (definitely required reading for any programmer). Always, and I mean always, setup your continuous deployment system before writing code.&lt;/p&gt;
&lt;p&gt;What do I mean by continuous deployment? Well, before you start coding your project, you should have a system set up that lets you deploy your project code into production (and preferably staging and development environments as well). This way, as you write your code, you'll have the peace of mind that comes with knowing your project can be deployed at any moment.&lt;/p&gt;
&lt;p&gt;In a lot of programming workflows, this can save tons of development time. Instead of scp'ing your project to some testing environment (or worse, coding directly on a live server), you can just push your code to your preferred source control system, and let your continuous deployment system take care of the rest. It may not seem like much of a time saver--but if you consider the amount of time it takes, day after day, to copy your code over and do testing manually, it can quickly add up and save hours of time each month.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Rule 2: Write Tests First&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you've never heard of test-driven development (TDD), please read the &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" title="test-driven development"&gt;wikipedia article&lt;/a&gt; on it immediately. If someone is paying you to write software, and you've got a deadline, then you need to be practicing TDD at all times.&lt;/p&gt;
&lt;p&gt;The basic concept of test-driven development is that before writing project code, you write a simple piece of code that tests your hypothetical project code for desired behavior. For example, let's say your project requires you to write a function that adds two numbers, and returns the sum of these numbers. Before writing that piece of code, you should write a test function, &lt;em&gt;test_add_two_numbers&lt;/em&gt;, that calls your &lt;em&gt;add_two_numbers&lt;/em&gt; function with various inputs, and verifies through assertions that the results you get back are proper.&lt;/p&gt;
&lt;p&gt;This may seem like a bit of a hassle, but it has numerous benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing tests first help you clarify your application architecture.&lt;/li&gt;
&lt;li&gt;You have the peace of mind that comes with knowing your code is operational.&lt;/li&gt;
&lt;li&gt;You're able to easily refactor parts of your project without worrying about breaking code.&lt;/li&gt;
&lt;li&gt;You can avoid releasing low-quality code, and tarnishing your reputation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing tests certainly takes time and effort, but can save time in the long run by avoiding emergency bug-fixes, system crashes, etc. Especially when you're on tight deadlines, you don't want the added stress and worry of buggy code.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Rule 3: Be Transparent&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Transparency can be difficult to achieve (depending on your work environment), but can be greatly beneficial.&lt;/p&gt;
&lt;p&gt;In order to be transparent, you need to make sure that you have a clear line of communication with the clients receiving your code. You need to keep them updated reguarly as to what is being worked on, and how far along progress is. Bonus points if you can continuously deploy your code to a staging system where clients can view the unfinished project and see how it is changing day after day.&lt;/p&gt;
&lt;p&gt;If you're able to maintain transparency with your boss(es), they're much more likely to be understanding if deadlines need to be pushed back. Non-engineers often don't understand software development, and view it as a black-box art. By maintaing clear communication and transparency with your clients, and getting them involved in the process, they'll be more understanding of your work, and they'll feel happier about the product they're getting developed.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Rule 4: Maintain Daily TODO Lists&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Time management is definitely out of the scope of this article, but I will mention that maintaining a daily TODO list is one of the best things you can do as a programmer to ensure things are progressing forward at all times.&lt;/p&gt;
&lt;p&gt;Software development is an immensely complex task. It requires years of practice, patience, and discipline to become a good programmer, and you are never finished learning. When writing software on a deadline, more often than not, you're writing a complex system. In order to keep your head clear, and allow you the maximum amount of programming power, you should maintain a daily TODO list consisting of each individual task that needs to be accomplished (code-wise) in the day.&lt;/p&gt;
&lt;p&gt;Don't make overly vague TODO items such as "debug sound problem", really think it through, and write out the full task in numerous steps. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write a unit test for the load_soundfile function that checks to see if mp3s are playable.&lt;/li&gt;
&lt;li&gt;Write a unit test for the load_soundfile function that checks to see if wav files crash when loading.&lt;/li&gt;
&lt;li&gt;Create new feature branch, design_update, to hold the new web design templates.&lt;/li&gt;
&lt;li&gt;Update style.css using the new web design templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having a clear list of actionable items gives you the power to focus on a single task at a time, without having to balance 100 or so next-steps in your head. Writing software is complex enough already, don't make your life more difficult!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Rule 5: Do the Right Thing&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There will undoubtedly be circumstances that arise which make you nervous and uncomfortable. Did you procrastinate yesterday and skip writing the unit tests for your new features? When these situations arise, don't go with your instinct. Instead--do the right thing.&lt;/p&gt;
&lt;p&gt;Whether you need to double back and revisit some old code, write some more test cases, or even delay a deadline--do it. As a professional engineer, it's your job to deliver working code consistently, even if that means you've got to make tough choices.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-large"&gt;Conclusion&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Being a software developer is no easy task. Our world is filled with constant challenge and hardship, and only our discipline and preparedness can help us push through the hard times, and prosper in the good times. Always use your best judgement, and beat the deadlines by using steadfast engineering practices, and never giving in to anything less.&lt;/p&gt;
&lt;p&gt;You can do it.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/on-programming-deadlines"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/on-programming-deadlines#comment"&gt;Leave a comment  »&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/dIRUvGLBsF4" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/2DXS169AkXQ" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/rdegges"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/rdegges</id><title type="html">Randall Degges</title><link rel="alternate" href="http://rdegges.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/rdegges/~3/dIRUvGLBsF4/on-programming-deadlines</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320119554034"><id gr:original-id="http://www.markhneedham.com/blog/?p=3772">tag:google.com,2005:reader/item/35f8824325e0c0ac</id><category term="Scala" /><title type="html">Scala: Option.isDefined as the new null check</title><published>2011-11-01T00:58:45Z</published><updated>2011-11-01T00:58:45Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/C4r-H4KCuYA/" type="text/html" /><link rel="canonical" href="http://www.markhneedham.com/blog/2011/11/01/scala-option-isdefined-as-the-new-null-check/" /><content xml:base="http://www.markhneedham.com/blog" type="html">&lt;p&gt;One cool thing about using Scala on my current project is that we don’t have nulls anywhere in our code, instead when something may or may not be there we make use of the Option type.&lt;/p&gt;
&lt;p&gt;Unfortunately what we’ve (heavily contributed by me) ended up with in our code base is repeated use of the &lt;cite&gt;&lt;a href="http://www.scala-lang.org/api/rc/scala/Option.html"&gt;isDefined&lt;/a&gt;&lt;/cite&gt; method whenever we want to make a decision depending on whether or not the option is populated.&lt;/p&gt;
&lt;p&gt;For example the following is quite common:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#0000ff;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;class&lt;/span&gt; Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; bar&lt;span style="color:#000080"&gt;:&lt;/span&gt;String&lt;span style="color:#f78811"&gt;)&lt;/span&gt;
&lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; foo &lt;span style="color:#000080"&gt;:&lt;/span&gt; Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#6666ff"&gt;&amp;quot;mark&amp;quot;&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; bar &lt;span style="color:#000080"&gt;=&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#f78811"&gt;(&lt;/span&gt;foo.&lt;span style="color:#000000"&gt;isDefined&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt; Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;foo.&lt;span style="color:#000000"&gt;get&lt;/span&gt;.&lt;span style="color:#000000"&gt;bar&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;else&lt;/span&gt; None
bar&lt;span style="color:#000080"&gt;:&lt;/span&gt; Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;String&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;mark&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can actually get rid of the if statement by making use of &lt;cite&gt;collect&lt;/cite&gt; instead:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; bar &lt;span style="color:#000080"&gt;=&lt;/span&gt; foo.&lt;span style="color:#000000"&gt;collect&lt;/span&gt; &lt;span style="color:#f78811"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;case&lt;/span&gt; f &lt;span style="color:#000080"&gt;=&amp;gt;&lt;/span&gt; f.&lt;span style="color:#000000"&gt;bar&lt;/span&gt; &lt;span style="color:#f78811"&gt;}&lt;/span&gt; 
bar&lt;span style="color:#000080"&gt;:&lt;/span&gt; Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;String&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;mark&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if foo is &lt;cite&gt;None&lt;/cite&gt;:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; foo &lt;span style="color:#000080"&gt;:&lt;/span&gt; Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; None
&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; bar &lt;span style="color:#000080"&gt;=&lt;/span&gt; foo.&lt;span style="color:#000000"&gt;collect&lt;/span&gt; &lt;span style="color:#f78811"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;case&lt;/span&gt; f &lt;span style="color:#000080"&gt;=&amp;gt;&lt;/span&gt; f.&lt;span style="color:#000000"&gt;bar&lt;/span&gt; &lt;span style="color:#f78811"&gt;}&lt;/span&gt; 
bar&lt;span style="color:#000080"&gt;:&lt;/span&gt; Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;String&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; None&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The code is now simpler and as long as you understand &lt;cite&gt;collect&lt;/cite&gt; then it’s easier to understand as well.&lt;/p&gt;
&lt;p&gt;Another quite common example would be something like this:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#0000ff;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;class&lt;/span&gt; Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; bar&lt;span style="color:#000080"&gt;:&lt;/span&gt;Option&lt;span style="color:#f78811"&gt;[&lt;/span&gt;String&lt;span style="color:#f78811"&gt;]&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;val&lt;/span&gt; foos &lt;span style="color:#000080"&gt;=&lt;/span&gt; List&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#6666ff"&gt;&amp;quot;mark&amp;quot;&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;, Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;None&lt;span style="color:#f78811"&gt;)&lt;/span&gt;, Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#6666ff"&gt;&amp;quot;needham&amp;quot;&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;
foos&lt;span style="color:#000080"&gt;:&lt;/span&gt; List&lt;span style="color:#f78811"&gt;[&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; List&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;mark&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;, Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;None&lt;span style="color:#f78811"&gt;)&lt;/span&gt;, Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;needham&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000080"&gt;&amp;gt;&lt;/span&gt; foos.&lt;span style="color:#000000"&gt;filter&lt;/span&gt;&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#000080"&gt;_&lt;/span&gt;.&lt;span style="color:#000000"&gt;bar&lt;/span&gt;.&lt;span style="color:#000000"&gt;isDefined&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;.&lt;span style="color:#000000"&gt;map&lt;/span&gt;&lt;span style="color:#f78811"&gt;(&lt;/span&gt;&lt;span style="color:#000080"&gt;_&lt;/span&gt;.&lt;span style="color:#000000"&gt;bar&lt;/span&gt;.&lt;span style="color:#000000"&gt;get&lt;/span&gt; + &lt;span style="color:#6666ff"&gt;&amp;quot; awesome&amp;quot;&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt;
res23&lt;span style="color:#000080"&gt;:&lt;/span&gt; List&lt;span style="color:#f78811"&gt;[&lt;/span&gt;java.&lt;span style="color:#000000"&gt;lang&lt;/span&gt;.&lt;span style="color:#000000"&gt;String&lt;/span&gt;&lt;span style="color:#f78811"&gt;]&lt;/span&gt; &lt;span style="color:#000080"&gt;=&lt;/span&gt; List&lt;span style="color:#f78811"&gt;(&lt;/span&gt;mark awesome, needham awesome&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Which we can simplify down to:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;foos.&lt;span style="color:#000000"&gt;collect&lt;/span&gt; &lt;span style="color:#f78811"&gt;{&lt;/span&gt; &lt;span style="color:#0000ff;font-weight:bold"&gt;case&lt;/span&gt; Foo&lt;span style="color:#f78811"&gt;(&lt;/span&gt;Some&lt;span style="color:#f78811"&gt;(&lt;/span&gt;bar&lt;span style="color:#f78811"&gt;)&lt;/span&gt;&lt;span style="color:#f78811"&gt;)&lt;/span&gt; &lt;span style="color:#000080"&gt;=&amp;gt;&lt;/span&gt; bar + &lt;span style="color:#6666ff"&gt;&amp;quot; awesome&amp;quot;&lt;/span&gt; &lt;span style="color:#f78811"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When I was playing around with F# a couple of years ago I learnt that wherever possible I should try and keep chaining functions together rather than breaking the code up into conditionals and I think the same applies here.&lt;/p&gt;
&lt;p&gt;There are loads of methods available on &lt;cite&gt;&lt;a href="http://www.scala-lang.org/api/rc/scala/collection/TraversableLike.html"&gt;TraversableLike&lt;/a&gt;&lt;/cite&gt; to help us achieve this.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/yZzW7FL75ZE" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/C4r-H4KCuYA" height="1" width="1"/&gt;</content><author><name>Mark Needham</name></author><source gr:stream-id="feed/http://feeds2.feedburner.com/MarkNeedham"><id>tag:google.com,2005:reader/feed/http://feeds2.feedburner.com/MarkNeedham</id><title type="html">Mark Needham</title><link rel="alternate" href="http://www.markhneedham.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/yZzW7FL75ZE/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320032957061"><id gr:original-id="http://prog21.dadgum.com/115.html">tag:google.com,2005:reader/item/a49192a79add006e</id><title type="html">Starting in the Middle</title><published>2011-10-24T06:00:00Z</published><updated>2011-10-24T06:00:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/CYiR72nP0vM/115.html" type="text/html" /><content xml:base="http://prog21.dadgum.com/" type="html">&lt;div&gt;When I start on a personal project, I&amp;#39;m bright-eyed and optimistic. I&amp;#39;ve got an idea in my head, and all I need to do is implement it. Wait, before I can begin working on the good stuff there are some foundational underpinnings that don&amp;#39;t yet exist. I work on those for a while, then I get back to main task...until I again realize that there are other, lower-level libraries that I need to write first.
&lt;br&gt;&lt;br&gt;Now I&amp;#39;m worried, because I&amp;#39;m building all this stuff, but I&amp;#39;m no closer to seeing results. I charge ahead and write one-off routines and do whatever it takes to get a working version one-point-oh. Then I hear the creaks and groans of impending code collapse. I shift my focus to architecture and move things to separate modules, refactor, sweep out dark corners, and eventually I&amp;#39;m back to thinking about the real problem. It&amp;#39;s only a short respite. As the code gets larger and more complex, I find myself having to wear my software engineering hat more and more of the time, and that&amp;#39;s no fun.
&lt;br&gt;&lt;br&gt;That&amp;#39;s the story sometimes, anyway. When using functional programming languages I take a different approach: I pick an interesting little bit that&amp;#39;s right in the middle of the problem and start working on it. I don&amp;#39;t build up a foundation needed to support the solution. I don&amp;#39;t think about how it integrates into the whole. There&amp;#39;s a huge win here that should be the selling point of functional programming: you can build large programs without worrying about architecture.
&lt;br&gt;&lt;br&gt;Okay, sure, that architecture dodge isn&amp;#39;t &lt;i&gt;entirely&lt;/i&gt; true, but it&amp;#39;s dramatic enough that I&amp;#39;m surprised functional programming isn&amp;#39;t the obvious choice for anyone writing &amp;quot;So you want to learn to program?&amp;quot; tutorials. Or at least that it isn&amp;#39;t the focus of &amp;quot;Why Functional Programming is Great&amp;quot; essays. If nothing else, it&amp;#39;s a more compelling hook than currying or type systems.
&lt;br&gt;&lt;br&gt;How can starting a project in the middle possibly work? By writing symbolic code that lets me put off as many design decisions as possible. If I&amp;#39;m writing the &amp;quot;move entity&amp;quot; function for a &lt;a href="http://prog21.dadgum.com/23.html"&gt;video game&lt;/a&gt;, the standard approach is to directly modify a structure or object representing that entity. It&amp;#39;s much easier to return a description of the change, like &lt;tt&gt;{new_ypos, 76}&lt;/tt&gt; or &lt;tt&gt;{new_color, red}&lt;/tt&gt;. (Those are both Erlang tuples.) That avoids the whole issue of how to rebuild what may be a complex, nested data structure with a couple of new values.
&lt;br&gt;&lt;br&gt;If I want to multiply the matrices M and N, the result is &lt;tt&gt;{&amp;#39;*&amp;#39;, M, N}&lt;/tt&gt;. (This is another Erlang tuple. The single quotes around the asterisk mean that it&amp;#39;s an atom--a symbol in Lisp or Scheme. Those quotes are only necessary if the atom isn&amp;#39;t alphanumeric.) The function to transpose a matrix returns &lt;tt&gt;{transpose, M}&lt;/tt&gt;.
&lt;br&gt;&lt;br&gt;It looks like the essential work is being dodged, but it depends what you&amp;#39;re after. I can write code and see at a glance that it gives the right result. I can use those functions to create more interesting situations and learn about the problem. If I find my understanding of the problem is wrong, and I need to back up, that&amp;#39;s okay. It&amp;#39;s more than okay: it&amp;#39;s great! Maybe it turns out that I don&amp;#39;t need to multiply matrices after all, so I didn&amp;#39;t waste time writing a multiply routine. Maybe the transpose function is always called with a parameter of &lt;tt&gt;{transpose, Something}&lt;/tt&gt;, so the two transpositions cancel out and there&amp;#39;s no need to do anything.
&lt;br&gt;&lt;br&gt;At some point I have to stop living this fantasy and do something useful with these abstract descriptions. Hopefully by that time my experiments in symbolic programming have better defined both the problem and the solution, and I won&amp;#39;t need to spend as much time thinking about boring things like architecture.
&lt;br&gt;&lt;br&gt;(If you liked this, you might enjoy &lt;a href="http://prog21.dadgum.com/66.html"&gt;Living Inside Your Own Black Box&lt;/a&gt;.)
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/CYiR72nP0vM" height="1" width="1"/&gt;</content><author><name>James Hague</name></author><source gr:stream-id="feed/http://prog21.dadgum.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://prog21.dadgum.com/atom.xml</id><title type="html">Programming in the 21st Century</title><link rel="alternate" href="http://prog21.dadgum.com/" type="text/html" /></source><feedburner:origLink>http://prog21.dadgum.com/115.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320032789689"><id gr:original-id="http://prog21.dadgum.com/116.html">tag:google.com,2005:reader/item/932d6c19f2f9260e</id><title type="html">Things That Turbo Pascal is Smaller Than</title><published>2011-10-30T06:00:00Z</published><updated>2011-10-30T06:00:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/s8Gm3nYzrz0/116.html" type="text/html" /><content xml:base="http://prog21.dadgum.com/" type="html">&lt;div&gt;Turbo Pascal 3 for MS-DOS was released in September 1986. Being version 3, there were lesser releases prior to it and flashier ones after, but 3 was a solid representation of the Turbo Pascal experience: a full Pascal compiler, including extensions that it made it practical for commercial use, tightly integrated with an editor. And the whole thing was lightning fast, orders of magnitude faster at building projects than Microsoft&amp;#39;s compilers.
&lt;br&gt;&lt;br&gt;The entire Turbo Pascal 3.02 executable--the compiler and IDE--was 39,731 bytes. How does that stack up in 2011 terms? Here are some things that Turbo Pascal is smaller than, as of October 30, 2011:
&lt;br&gt;&lt;br&gt;The minified version of jquery 1.6 (90,518 bytes).
&lt;br&gt;&lt;br&gt;The yahoo.com home page (219,583 bytes).
&lt;br&gt;&lt;br&gt;The image of the white iPhone 4S at apple.com (190,157 bytes).
&lt;br&gt;&lt;br&gt;&lt;tt&gt;zlib.h&lt;/tt&gt; in the Mac OS X Lion SDK (80,504 bytes).
&lt;br&gt;&lt;br&gt;The &lt;tt&gt;touch&lt;/tt&gt; command under OS X Lion (44,016 bytes).
&lt;br&gt;&lt;br&gt;Various vim quick reference cards as PDFs. (&lt;a href="http://simpletutorials.com/tutorials/vim/vimquick.pdf"&gt;This one&lt;/a&gt; is 47,508 bytes.)
&lt;br&gt;&lt;br&gt;The compiled code for the Erlang R14B02 parser (&lt;tt&gt;erl_parse.beam&lt;/tt&gt;, 286,324 bytes).
&lt;br&gt;&lt;br&gt;The Wikipedia page for C++ (214,251 bytes).
&lt;br&gt;&lt;br&gt;(If you liked this, you might like &lt;a href="http://prog21.dadgum.com/45.html"&gt;A Personal History of Compilation Speed&lt;/a&gt;.)
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/s8Gm3nYzrz0" height="1" width="1"/&gt;</content><author><name>James Hague</name></author><source gr:stream-id="feed/http://prog21.dadgum.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://prog21.dadgum.com/atom.xml</id><title type="html">Programming in the 21st Century</title><link rel="alternate" href="http://prog21.dadgum.com/" type="text/html" /></source><feedburner:origLink>http://prog21.dadgum.com/116.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320029692835"><id gr:original-id="">tag:google.com,2005:reader/item/ae29420d686136d8</id><title type="html">The Internet Archive</title><published>2011-10-31T02:54:52Z</published><updated>2011-10-31T02:54:52Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/Wc1Boq_6puw/" type="text/html" /><link rel="related" href="http://www.jwz.org/blog" title="jwz" /><content xml:base="http://www.jwz.org/blog/2011/10/the-internet-archive/" type="html">&lt;blockquote&gt;Shared by  sconover 
&lt;br&gt;
" they are also constructing a terracotta army of avatars of their long-term employees"&lt;/blockquote&gt;
Earlier this week, &lt;a href="http://www.textfiles.com/"&gt;Jason Scott&lt;/a&gt; was kind enough to give me a tour of &lt;a href="http://www.archive.org/"&gt;The Internet Archive&lt;/a&gt;. They do amazing, important work, and I've been a huge fan for many years, but I hadn't visited before.&lt;p&gt;Their San Francisco presence is housed in a former Christian Science church, lending it a certain gravitas.  Their enormous conference room not only has racks of drives sitting at the back, but also has a working pipe organ!  (Make your own series of tubes joke here.)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="center"&gt; &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/001.html" rel="thumb"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/001-thumb.jpg" width="133" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/002.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/002-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/003.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/003-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/004.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/004-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/007.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/007-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt; &lt;/div&gt;&lt;p&gt;Inexplicably, they are also constructing a terracotta army of avatars of their long-term employees.  I assume these are to protect Brewster in the afterlife.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="center"&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/005.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/005-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/006.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/006-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt; &lt;/div&gt;&lt;p&gt;The racks of drives are just kind of scattered all over the place, climate control provided opening windows.  Each &lt;a href="http://en.wikipedia.org/wiki/Blinkenlights"&gt;blinkenlight&lt;/a&gt; is a 2TB drive.  They have mirrors all over the world, so I gather it's a "use the cheapest thing possible and have a zillion backups" kind of scenario.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="center"&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/008.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/008-thumb.jpg" width="133" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/009.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/009-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/010.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/010-thumb.jpg" width="133" height="200" vspace="2" border="1"&gt;&lt;/a&gt; &lt;/div&gt;&lt;p&gt;The book-scanning operation is pretty sweet.  There's an angled backplate with a correspondingly-angled piece of glass that hinges down over it to hold the pages flat, and a pair of Canon 5D Mk 2 cameras pointing at each page.  Apparently once you get into the rhythm of it, you can scan an entire book in 8 minutes.  Volunteers and interns: cheaper than robots!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="center"&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/011.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/011-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/012.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/012-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt; &lt;/div&gt;&lt;p&gt;Random libraries (and individuals) around the world ship them crates of books, they scan them, and ship them back.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div align="center"&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/013.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/013-thumb.jpg" width="133" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/014.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/014-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;  &lt;a href="http://www.jwz.org/photos/2011-10-24-internetarchive/015.html"&gt;&lt;img src="http://www.jwz.org/photos/2011-10-24-internetarchive/015-thumb.jpg" width="300" height="200" vspace="2" border="1"&gt;&lt;/a&gt;   &lt;/div&gt; &lt;p&gt;&lt;a href="http://www.jwz.org/blog/2011/09/archive-team-a-distributed-preservation-of-service-attack/"&gt;Previously&lt;/a&gt;, &lt;a href="http://www.jwz.org/blog/2011/07/an-important-message-about-floppy-disks/"&gt;previously&lt;/a&gt;, &lt;a href="http://www.jwz.org/blog/2011/06/the-internet-archive-is-now-archiving-physical-books-as-well/"&gt;previously&lt;/a&gt;, &lt;a href="http://www.jwz.org/blog/2003/09/the-wayback-machine-has-a-search-engine-now/"&gt;previously&lt;/a&gt;, &lt;a href="http://www.jwz.org/blog/2002/09/how-sad/"&gt;previously&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/Wc1Boq_6puw" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">" they are also constructing a terracotta army of avatars of their long-term employees"</content><author gr:user-id="03957709134162206848" gr:profile-id="105157679830352599621"><name>sconover</name></author></gr:annotation><source gr:stream-id="user/03957709134162206848/source/com.google/link"><id>tag:google.com,2005:reader/user/03957709134162206848/source/com.google/link</id><title type="html">jwz</title><link rel="alternate" href="http://www.jwz.org/blog" type="text/html" /></source><feedburner:origLink>http://www.jwz.org/blog/2011/10/the-internet-archive/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320019943072"><id gr:original-id="http://infovore.org/archives/2011/10/30/links-for-october-30th-3/">tag:google.com,2005:reader/item/5743ccb49ea9feaa</id><category term="delicious" /><category term="brilliant" /><category term="procs" /><category term="programming" /><category term="rubymanor" /><category term="tomstuart" /><title type="html">Links for October 30th</title><published>2011-10-30T22:00:15Z</published><updated>2011-10-30T22:00:15Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/dyB11LzK2OY/" type="text/html" /><link rel="canonical" href="http://infovore.org/archives/2011/10/30/links-for-october-30th-3/" /><content xml:base="http://infovore.org/" type="html">&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="http://speakerdeck.com/u/tomstuart/p/programming-with-nothing"&gt;Programming With Nothing // Speaker Deck&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;The highlight of Ruby Manor: Tom Stuart&amp;#39;s completely brilliant explanations of programming with nothing but Procs: making them, calling them, and nothing else. He made it fun, informative, and the right amount of mental.&lt;/div&gt;
&lt;div&gt;(tags: &lt;a href="http://pinboard.in/u:infovore/t:programming"&gt;programming&lt;/a&gt; &lt;a href="http://pinboard.in/u:infovore/t:procs"&gt;procs&lt;/a&gt; &lt;a href="http://pinboard.in/u:infovore/t:tomstuart"&gt;tomstuart&lt;/a&gt; &lt;a href="http://pinboard.in/u:infovore/t:rubymanor"&gt;rubymanor&lt;/a&gt; &lt;a href="http://pinboard.in/u:infovore/t:brilliant"&gt;brilliant&lt;/a&gt; )&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/dyB11LzK2OY" height="1" width="1"/&gt;</content><author><name>delicious</name></author><source gr:stream-id="feed/http://infovore.org/feed/rss/"><id>tag:google.com,2005:reader/feed/http://infovore.org/feed/rss/</id><title type="html">Infovore</title><link rel="alternate" href="http://infovore.org" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/infovoredotorg/~3/I-b7ugAIwKU/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320012535808"><id gr:original-id="">tag:google.com,2005:reader/item/91675dd2c96009fc</id><title type="html">Metagames: Games About Games</title><published>2011-10-30T22:08:55Z</published><updated>2011-10-30T22:08:55Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/oJJ5DZQHN0Q/" type="text/html" /><link rel="related" href="http://waxy.org/" title="Waxy.org" /><content xml:base="http://waxy.org/2011/02/metagames_games_about_games/" type="html">&lt;blockquote&gt;Shared by  sconover 
&lt;br&gt;
Andy Baio's collection of Metagames is brilliant, don't miss it.&lt;/blockquote&gt;
&lt;p&gt;Over the last few years, I've been collecting examples of metagames — not the strategy of &lt;a href="http://en.wikipedia.org/wiki/Metagaming"&gt;metagaming&lt;/a&gt;, but playable games about videogames.  Most of these, like Desert Bus or Quest for the Crown, are one-joke games for a quick laugh.  Others, like Cow Clicker and Upgrade Complete, are playable critiques of game mechanics.  Some are even (gasp!) fun.&lt;/p&gt;

&lt;p&gt;Since I couldn't find an exhaustive list (this &lt;a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/DeconstructionGame"&gt;TV Tropes guide&lt;/a&gt; to "Deconstruction Games" is the closest), I thought I'd try to pull one together  along with some gameplay videos.  &lt;/p&gt;

&lt;p&gt;This is just a starting point, please post your additions in the comments or email me and I'll add them in.  Note: I've tried to stay away from specific game parodies (like &lt;a href="http://en.wikipedia.org/wiki/Pong_Kombat"&gt;Pong Kombat&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Pyst"&gt;Pyst&lt;/a&gt;), and stick to games that comment on game design, mechanics, or culture.&lt;br&gt;
&lt;/p&gt;&lt;a href="http://waxy.org/2011/02/metagames_games_about_games/"&gt;Continue reading...&lt;/a&gt; 
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/oJJ5DZQHN0Q" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Andy Baio's collection of Metagames is brilliant, don't miss it.</content><author gr:user-id="03957709134162206848" gr:profile-id="105157679830352599621"><name>sconover</name></author></gr:annotation><source gr:stream-id="user/03957709134162206848/source/com.google/link"><id>tag:google.com,2005:reader/user/03957709134162206848/source/com.google/link</id><title type="html">Waxy.org</title><link rel="alternate" href="http://waxy.org/" type="text/html" /></source><feedburner:origLink>http://waxy.org/2011/02/metagames_games_about_games/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1320011018445"><id gr:original-id="tag:typepad.com,2003:post-6a00d83451b2c969e20162fc04cf81970d">tag:google.com,2005:reader/item/7eafd9f28cc06737</id><category term="hacking education" /><category term="Web/Tech" /><title type="html">Program Or Be Programmed</title><published>2011-10-30T12:22:51Z</published><updated>2011-10-30T12:22:51Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/9KZmPAvx6uw/program-or-be-programmed.html" type="text/html" /><link rel="canonical" href="http://www.avc.com/a_vc/2011/10/program-or-be-programmed.html" /><content xml:base="http://www.avc.com/a_vc/" type="html">&lt;div&gt;&lt;p&gt;On Thursday night I gave a talk at &lt;a href="http://www.poly.edu/"&gt;NYU Poly&lt;/a&gt; and in the Q&amp;amp;A a young man asked me for advice for &amp;quot;those who aren&amp;#39;t technical&amp;quot;. I said he should try to get technical. The next morning I met with a bunch of &lt;a href="http://mitsloan.mit.edu/"&gt;Sloan Business School&lt;/a&gt; students doing a trek through NYC. A young woman asked me the same question. I gave her the same answer.&lt;/p&gt;
&lt;p&gt;I don't mean that everyone should become a software engineer. I do mean that everyone should understand software engineering (or whatever technical subject/industry you want to work in). I don't speak French fluently. But when I go to France, I know enough French to speak it badly until the person on the receiving end changes the language to English.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/#!/dens"&gt;Dennis Crowley&lt;/a&gt; claims to be a terrible programmer. And yet he and &lt;a href="https://twitter.com/#!/naveen"&gt;Naveen&lt;/a&gt; built the first version of Foursquare together. Their third team member was &lt;a href="https://twitter.com/#!/harryh"&gt;Harry&lt;/a&gt; and Harry's first job was to rewrite all of Dennis' code. Dennis is the kind of technical I'm talking about. Learn how to hack something together so that you can get people interested in your idea, your project, your startup. If you can do that, then you have a better chance of success.&lt;/p&gt;
&lt;p&gt;Another great reason to "get technical" is so that you can work better with technical people. If you understand at least some of what they are doing, if you can look at their work product (the code) and understand what it is doing, if you can pick up a ticket and contribute when time is tight, then you will be seen as part of the team. And that is critical.&lt;/p&gt;
&lt;p&gt;All of this is a big reason for our most recent investment, in &lt;a href="http://www.codecademy.com/"&gt;Codecademy&lt;/a&gt;. Codecademy wants to be the online resource for people who want to learn to code. What you see there now is basically a prototype. And yet somewhere between 500,000 and 1mm people have started learning javascript using the prototype. They are clearly on to something.&lt;/p&gt;
&lt;p&gt;I haven't written code professionally in twenty-five years. The last application I built was a custom app for my mother in law's company. She ran her business on it for twenty years. I wrote simulation software for a company building ships for the US Navy. And I wrote software that ran data acquisition for a lab at MIT. I was never a great programmer. I was a hacker. But I do understand the basic concepts, I can build something. I think most everyone can get to the place I got to and I'd encourage everyone to try.&lt;/p&gt;
&lt;p&gt;Our partner &lt;a href="https://twitter.com/#!/aweissman"&gt;Andy&lt;/a&gt; wrote a great post on the USV blog &lt;a href="http://www.usv.com/2011/10/codecademy.php"&gt;announcing our investment in Codecademy&lt;/a&gt;. He wrapped up his post with a quote from &lt;a href="https://twitter.com/#!/rushkoff"&gt;Douglas Rushkoff&lt;/a&gt;. It's where I got the title of this post from and it says it well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;When human beings acquired language, we learned not just how to listen but how to speak. When we gained literacy, we learned not just how to read but how to write. And as we move into an increasingly digital reality, we must learn not just how to use programs but how to make them. In the emerging, highly programmed landscape ahead, you will either create the software or you will be the software. It's really that simple: Program, or be programmed.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:QF3NFAd80Ic"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?i=eqCShkmSl-4:cMkH3oedB2A:QF3NFAd80Ic" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:iLyGD4w1c3U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=iLyGD4w1c3U" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?i=eqCShkmSl-4:cMkH3oedB2A:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?i=eqCShkmSl-4:cMkH3oedB2A:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?i=eqCShkmSl-4:cMkH3oedB2A:KwTdNBX3Jqk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:c2c20Nhstd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?i=eqCShkmSl-4:cMkH3oedB2A:c2c20Nhstd0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:m6Kt5AT5DWs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=m6Kt5AT5DWs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:DLYy-l-dIDg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=DLYy-l-dIDg" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AVc?a=eqCShkmSl-4:cMkH3oedB2A:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AVc?d=YwkR-u9nhCs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AVc/~4/eqCShkmSl-4" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/9KZmPAvx6uw" height="1" width="1"/&gt;</content><author><name>Fred</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/avc"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/avc</id><title type="html">A VC</title><link rel="alternate" href="http://www.avc.com/a_vc/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/AVc/~3/eqCShkmSl-4/program-or-be-programmed.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319938568548"><id gr:original-id="http://alexch.tumblr.com/post/12078671414">tag:google.com,2005:reader/item/29017e87c491a139</id><title type="html">"As a service grows in popularity, alpha users outlive their usefulness. The core users that helped..."</title><published>2011-10-29T17:14:20Z</published><updated>2011-10-29T17:14:20Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/-gT4YMa_3CI/12078671414" type="text/html" /><summary xml:base="http://alexch.tumblr.com/" type="html">“&lt;p&gt;As a service grows in popularity, alpha users outlive their usefulness. The core users that helped build a service by word-of-mouth often find themselves dwarfed in numbers by people with very different needs.&lt;/p&gt;

&lt;p&gt;Take the recently-announced changes to Google Reader, for instance. Reader is the most widely-used and deeply-loved feed reader ever made, steamrolling over several startups in the mid-2000s in the process. Any startup would be thrilled to have their devoted audience; within Google, Reader seems like a distraction.&lt;/p&gt;

&lt;p&gt;Last week, the Reader team announced the removal of all of its social features, used by a relatively small but rabid fanbase.&lt;/p&gt;

&lt;p&gt;Courtney Stanton, a Boston-based product manager, called Google Reader “the best social network created so far” in a passionate rant on her blog. “For me, this is the destruction of the only online space I truly give a shit about.”&lt;/p&gt;

&lt;p&gt;There’s no easy solution. Should a company be expected to maintain features indefinitely because a tiny fraction of their base loves them? There are tangible costs to maintaining old code, and fringe features can clutter an interface, making user experience worse for those that don’t use them.&lt;/p&gt;

&lt;p&gt;For those people, removing features is more than an inconvenience. It shatters an entire community. But, ultimately, their usage is a rounding error in the overall product activity.&lt;/p&gt;”&lt;br&gt;&lt;br&gt; - &lt;em&gt;&lt;a href="http://waxy.org/2011/10/google_kills_its_other_plus/"&gt;Google Kills Its Other Plus, and How to Bring It Back - Waxy.org&lt;/a&gt;&lt;/em&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/-gT4YMa_3CI" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://alexch.tumblr.com/rss"><id>tag:google.com,2005:reader/feed/http://alexch.tumblr.com/rss</id><title type="html">alexch&amp;#39;s almanac</title><link rel="alternate" href="http://alexch.tumblr.com/" type="text/html" /></source><feedburner:origLink>http://alexch.tumblr.com/post/12078671414</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319830663226"><id gr:original-id="http://thestallmandialogues.com/post/11995578293">tag:google.com,2005:reader/item/6ffbba3d06090805</id><title type="html">Photo</title><published>2011-10-27T17:29:43Z</published><updated>2011-10-27T17:29:43Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/nPxWKgdSG-4/11995578293" type="text/html" /><summary xml:base="http://thestallmandialogues.com/" type="html">&lt;img src="http://25.media.tumblr.com/tumblr_ltqj9jpH8F1r5a45ro1_400.png"&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/nPxWKgdSG-4" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://thestallmandialogues.com/rss"><id>tag:google.com,2005:reader/feed/http://thestallmandialogues.com/rss</id><title type="html">The Stallman Dialogues</title><link rel="alternate" href="http://thestallmandialogues.com/" type="text/html" /></source><feedburner:origLink>http://thestallmandialogues.com/post/11995578293</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319830626306"><id gr:original-id="http://thestallmandialogues.com/post/12004372224">tag:google.com,2005:reader/item/9f1ad00fb96852fa</id><title type="html">Photo</title><published>2011-10-27T21:37:42Z</published><updated>2011-10-27T21:37:42Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/lcKTZenC2hk/12004372224" type="text/html" /><summary xml:base="http://thestallmandialogues.com/" type="html">&lt;img src="http://24.media.tumblr.com/tumblr_ltququoPoE1r5a45ro1_500.png"&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/lcKTZenC2hk" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://thestallmandialogues.com/rss"><id>tag:google.com,2005:reader/feed/http://thestallmandialogues.com/rss</id><title type="html">The Stallman Dialogues</title><link rel="alternate" href="http://thestallmandialogues.com/" type="text/html" /></source><feedburner:origLink>http://thestallmandialogues.com/post/12004372224</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319766371037"><id gr:original-id="http://www.techdirt.com/articles/20111027/00083116531/e-parasites-bill-end-internet-as-we-know-it.shtml">tag:google.com,2005:reader/item/d27b4b8d70bf350a</id><title type="html">E-PARASITE Bill: 'The End Of The Internet As We Know It'</title><published>2011-10-27T15:32:00Z</published><updated>2011-10-27T15:32:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/5_Xpu-sJnrw/e-parasites-bill-end-internet-as-we-know-it.shtml" type="text/html" /><summary xml:base="http://www.techdirt.com/" type="html">We already wrote about the &lt;a href="http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasite-act-would-create-great-firewall-america.shtml"&gt;ridiculously bad E-PARASITE bill&lt;/a&gt; (the Enforcing and Protecting American Rights Against Sites Intent on Theft and Exploitation Act), but having now had a chance go to through the full bill a few more times, there are even more bad things in there that I missed on the first read-through.  Now I understand why Rep. Zoe Lofgren's first reaction to this bill was to say that "this would mean the end of the Internet as we know it."
&lt;br&gt;&lt;br&gt;
She's right.  The more you look at the details, the more you realize how this bill is an astounding wishlist of everything that the legacy entertainment gatekeepers have wanted in the law for decades and were unable to get.  It effectively dismantles the DMCA's safe harbors, what's left of the Sony Betamax decision, puts massive liability on tons of US-based websites, and will lead to widespread blocking of websites and services based solely on accusations of some infringement.  It's hard to overstate just how bad this bill is.
&lt;br&gt;&lt;br&gt;
And, while its mechanisms are similar to the way China's Great Firewall works (by putting liability on service providers if they fail to block sites), it's even worse than that.  At least the Chinese Great Firewall is determined by government talking points.  The E-PARASITE bill allows for a massive private right of action that effectively lets any copyright holder take action against sites they don't like.  (Oh, and the bill is being called both the Stop Online Piracy Act (SOPA) and E-PARASITE (which covers the PROTECT IP-like parts of the bill, SOPA refers to the larger bill that also includes the felony streaming part).
&lt;br&gt;&lt;br&gt;
Some of the key problems with the bill, beyond what we discussed yesterday:
&lt;ul&gt;
&lt;li&gt;While supporters of the bill &lt;i&gt;still&lt;/i&gt; continue to insist that this bill is only targeted at foreign infringers, &lt;b&gt;that's false&lt;/b&gt;.  Part of the bill focuses on foreign infringers -- the part that allows the Attorney General to kill websites.  But the private right of action section has no such restriction.  Instead, it allows copyright holders to effectively kill any site they'd like.  You have to dig down into the details to see this, but let's pull out the key sections to see.  The act, in section 104, defines sites that are "dedicated to the theft of US property" as including any "US-directed site" that:
&lt;blockquote&gt;&lt;i&gt;
is taking, or has taken deliberate actions to avoid confirming a high probability of the use of the U.S.-directed site to carry out acts that constitute a violation of section 501 or 1201 of title 17, United States Code; 
&lt;/i&gt;&lt;/blockquote&gt;
If that sounds massively confusing, you're right.  But what it's saying, in the most twisted language possible, is that if it's probable that a site used in the US (note no restriction to just foreign sites here) can be used to infringe, and that site fails to take some sort of action against the "high probability" that the site can be used to infringe, then it can be declared dedicated to the theft of US property.  This turns both the DMCA safe harbors and the Supreme Court's Sony Betamax ruling completely on their heads.  In effect, it appears to be saying that if you choose not to self-police your site for infringement -- i.e., putting up filters, or proactively monitoring content for infringement -- you can be declared in violation of the law... at which point a court can order all ad networks and payment processors to automatically stop doing business with you.
&lt;br&gt;&lt;br&gt;
Think of all the sites this could effect.  Twitter, Facebook, YouTube, Tumblr, SoundCloud, Ebay, Flickr, Wikipedia, Craigslist, Wordpress -- basically any site that has any user-generated content.  If they don't proactively filter or monitor their content, they could be at risk of a claim that they took "deliberate actions to avoid confirming a high probability" that their sites could be used to infringe... and thus they could be subject to an action by a private party that strips them of both ad revenue and the ability to process any payments. 
&lt;br&gt;&lt;br&gt;
Remember how Monster Cable -- massive &lt;a href="http://www.techdirt.com/articles/20111005/08134716207/monster-cable-blames-rogue-sites-rather-than-its-own-business-practices-stealing-good-will.shtml"&gt;supporters&lt;/a&gt; of this bill -- declared both &lt;a href="http://www.techdirt.com/articles/20111005/10082416208/monster-cable-claims-ebay-craigslist-costco-sears-are-rogue-sites.shtml"&gt;Craigslist and eBay&lt;/a&gt; as being dedicated to infringement?  Under this bill, a company like Monster could take action against those sites, putting a tremendous burden on them.&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;The definitional problems don't stop there.  Separate from the ridiculous definition above, this act would also declare a site "dedicated to theft of U.S. property," if it is "primarily designed" in a way that "engages in, enables, or facilitates" a violation of copyright law.  Those last two points are ridiculously broad.  "Enables" infringement? "Facilitates"?  That's practically the entire internet.  The primary design of YouTube, Twitter, Facebook, etc. all "enable" or "facilitate" infringement.&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;While some reporters claimed that the "private right of action" was taken out of this bill, or even "softened," nothing could be further from the truth.  The details show that the private right of action is significantly worse in this bill.  What changed is that in PROTECT IP, private copyright holders could go to court to force payment processors and ad networks to stop dealing with sites they accuse.  Under E-PARASITE, before they go to court, they first have to send a notification, very similar to a DMCA takedown notice.   But, of course, as we've seen with the DMCA, while it's "voluntary" to comply, if you don't comply you lose safe harbors -- so nearly everyone complies.  That means this private right of action almost certainly will lead to ad networks and payment processors cutting off any site they receive a notification on -- no matter how legitimate.  And, while the bill does allow for a counternotification process, unlike the DMCA, there is no requirement that the payment processors and ad networks restore service to anyone who files a counternotice, after a given period of time (absent a lawsuit).  In other words: a copyright holder could issue a bogus claim that a site is dedicated to infringement, and the payment processor and ad network could pull the plug on the site... and even if a counternotice is filed, those services have no obligation to bring back service.
&lt;br&gt;&lt;br&gt;
Again, using our Monster Cable example, it could force all payment processors to no longer allow payments on Craigslist or eBay, and even if those sites filed counternotices, the service providers would be under no obligation to turn those things back on.  And just think of the massive, irreparable harm if legitimate sites lose both the ability to accept payments and to have ads for just a few days?  And while there is liability for those who file false notices, as we've seen with the DMCA, such provisions are rarely, if ever, enforced -- and generally are interpreted to only apply in cases of extreme misrepresentation.&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;As noted above, the private right of action establishes an astoundingly broad new standard for what's considered infringing.  Beyond user-generated content sites, pretty much any cloud computing service can be deemed "dedicated to the theft of US property," if they choose not to filter and monitor the content being sent through the cloud.  Any of the online locker services are in serious trouble if this bill becomes law.  Amazon's and Google's music services would have to monitor your uploads and try to stop infringement to avoid liability.  Box.net and Dropbox would likely have to monitor what files you're storing to avoid liability.  It's honestly that insane.&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;Supporters of the bill, beyond falsely claiming that it's just focused on foreign sites, are also claiming that this bill &lt;a href="http://www.networkworld.com/news/2011/102611-new-bill-would-target-websites-252437.html?hpg1=bn"&gt;does not target such sites&lt;/a&gt;.  An aide to the House Judiciary Committee, who supports the bill, claimed, "Sites that host user content -- like YouTube, Facebook and Twitter -- have nothing to be concerned about under this bill."  But that's demonstrably false.  Perhaps this aide is unaware that Viacom is still in the middle of a $1 billion lawsuit claiming that YouTube was dedicated to infringement.  Under the definitions in this bill, YouTube would absolutely have been liable, and likely would have been shut down years ago.  In fact, Viacom never would have had to sue.  It would have just made use of the notification process, and kept any and all advertising and payment processing from the site... and voila, dead YouTube, without the benefit of a judge reviewing the case (and, need we remind the House Judiciary Committee, that so far the judge has sided with YouTube?).&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;The bill would be red meat to any foreign government that censors its internet.  China, Iran, Saudi Arabia are going to love this.  The mechanisms for censorship are quite similar.  Under E-PARASITE, service providers have to proactively block to prevent liability.  China's Great Firewall works the exact same way: by threatening ISPs with liability if they don't block content harmful to Chinese citizens.  Replace harmful to Chinese citizens with "a high probability" of being used for infringement... and you've got E-PARASITE.&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;Another change between this bill and the Senate's PROTECT IP is that this bill calls out "search engines" more directly, rather than "information location tools," as in the Senate bill.  While that may seem to be narrower, the definition of a search engine is ridiculously broad (of course).  
&lt;blockquote&gt;&lt;i&gt;
The term ‘‘Internet search engine’’ means a service made available via the Internet that searches, crawls, categorizes, or indexes information or Web sites available elsewhere on the Internet and on the basis of a user query or selection that consists of terms, concepts, categories, questions, or other data returns to the user a means, such as a hyperlinked list of Uniform Resource Locators, of locating, viewing, or downloading such information or data available on the Internet relating to such query or selection.
&lt;/i&gt;&lt;/blockquote&gt;
Under this definition, Techdirt could be declared a search engine under this law.  After all, we take "questions" and queries from readers, and often return stories that link elsewhere on the internet.  Yikes!&lt;/li&gt;
&lt;br&gt;&lt;br&gt;
&lt;li&gt;As highlighted above, there are all sorts of definitional problems with the bill.  And you can tell how insane things get with definitions when the authors of this bill even go so far as to define the word "including."  I'm not joking:
&lt;blockquote&gt;&lt;i&gt;
INCLUDING.--The term "including" means including, but not limited to.
&lt;/i&gt;&lt;/blockquote&gt;
This is the kind of mess we're dealing with.&lt;/li&gt;
&lt;/ul&gt;
About the only good thing is that the insanity and out-and-out censorship and hindering of the internet that this bill provides appears to have scared off co-sponsors of the bill.  Despite a massive lobbying effort from the US Chamber of Commerce and the MPAA (among some others), Rep. Lamar Smith was only able to wrangle up eleven co-sponsors.  For a bill of this nature, this is woefully low.  Even more surprising is that they couldn't even get Rep. Mel Watt to co-sponsor the bill, despite being the ranking Democrat on the IP subcommittee of the House Judiciary Committee.  Instead, they had to settle for Howard Berman, the Representative from Disney.  In other words, it appears that many Congressional reps have heard the massive concerns of the public, technologists, entrepreneurs, investors, artists, human rights activists, and many others who are quite afraid of how this bill will break the internet.  And that means that it can only help to continue to speak out and reach out to your representatives about how awful this bill is, and how much harm it would do.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.techdirt.com/articles/20111027/00083116531/e-parasites-bill-end-internet-as-we-know-it.shtml"&gt;Permalink&lt;/a&gt; | &lt;a href="http://www.techdirt.com/articles/20111027/00083116531/e-parasites-bill-end-internet-as-we-know-it.shtml#comments"&gt;Comments&lt;/a&gt; | &lt;a href="http://www.techdirt.com/articles/20111027/00083116531/e-parasites-bill-end-internet-as-we-know-it.shtml?op=sharethis"&gt;Email This Story&lt;/a&gt;&lt;br&gt;
 &lt;br style="clear:both"&gt;
&lt;br style="clear:both"&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=8b74778eda09133380afce1738fb3763&amp;amp;p=1"&gt;&lt;img alt="" style="border:0" border="0" src="http://ads.pheedo.com/img.phdo?s=8b74778eda09133380afce1738fb3763&amp;amp;p=1"&gt;&lt;/a&gt;
&lt;img alt="" height="0" width="0" border="0" src="http://segment-pixel.invitemedia.com/pixel?code=TechBiz&amp;amp;partnerID=167&amp;amp;key=segment"&gt;&lt;img alt="" height="0" width="0" border="0" src="http://insight.adsrvr.org/track/evnt/?ct=0:8pyu3gz&amp;amp;adv=wouzn4v&amp;amp;fmt=3"&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/techdirt/feed?a=5_Xpu-sJnrw:u6YhOjzw6-o:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/techdirt/feed?i=5_Xpu-sJnrw:u6YhOjzw6-o:D7DqB2pKExk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/techdirt/feed?a=5_Xpu-sJnrw:u6YhOjzw6-o:c-S6u7MTCTE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/techdirt/feed?d=c-S6u7MTCTE" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/techdirt/feed/~4/5_Xpu-sJnrw" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/5_Xpu-sJnrw" height="1" width="1"/&gt;</summary><author><name>Mike Masnick</name></author><source gr:stream-id="feed/http://www.techdirt.com/techdirt_rss.xml"><id>tag:google.com,2005:reader/feed/http://www.techdirt.com/techdirt_rss.xml</id><title type="html">Techdirt.</title><link rel="alternate" href="http://www.techdirt.com/" type="text/html" /></source><feedburner:origLink>http://www.techdirt.com/articles/20111027/00083116531/e-parasites-bill-end-internet-as-we-know-it.shtml</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319686625036"><id gr:original-id="http://www.waxy.org/links/archive/2011/10/index.shtml#079524">tag:google.com,2005:reader/item/e0a09bed9cc40307</id><title type="html">Richard Stallman's list of requests when speaking</title><published>2011-10-27T00:09:43Z</published><updated>2011-10-27T00:09:43Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/y4CNe-VAVTg/007647.html" type="text/html" /><summary xml:base="http://www.waxy.org/links/" type="html">includes preferences for room temperature, egg yolks, folk dances, and why not to buy him a parrot; I find this man fascinating  &lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/y4CNe-VAVTg" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://waxy.org/links/index.xml"><id>tag:google.com,2005:reader/feed/http://waxy.org/links/index.xml</id><title type="html">Waxy.org Links</title><link rel="alternate" href="http://www.waxy.org/links/" type="text/html" /></source><feedburner:origLink>https://secure.mysociety.org/admin/lists/pipermail/developers-public/2011-October/007647.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319685243355"><id gr:original-id="http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml">tag:google.com,2005:reader/item/cfa0d07b8e40b1ab</id><title type="html">PROTECT IP Renamed E-PARASITES Act; Would Create The Great Firewall Of America</title><published>2011-10-26T19:35:17Z</published><updated>2011-10-26T19:35:17Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/OtcayLNuzzc/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml" type="text/html" /><summary xml:base="http://www.techdirt.com/" type="html">As was &lt;a href="http://www.techdirt.com/articles/20111025/08343716500/house-trying-to-rush-through-its-version-protect-ip-tech-industry-asks-why.shtml"&gt;unfortunately expected&lt;/a&gt;, the House version of PROTECT IP has been released (embedded below) and it's &lt;i&gt;ridiculously bad&lt;/i&gt;.  Despite promises from Rep. Goodlatte, there has been no serious effort to fix the problems of the Senate bill, and it's clear that absolutely no attention was paid to the significant concerns of the tech industry, legal professionals, investors and entrepreneurs.  There are no two ways around this simple fact: this is an attempt to build the Great Firewall of America.  The bill would require service providers to block access to certain websites, very much contrary to US official positions on censorship and internet freedom, and almost certainly in violation of the First Amendment.
&lt;br&gt;&lt;br&gt;
Oh, and because PROTECT IP wasn't enough of a misleading and idiotic name, the House has upped the ante.  The new bill is called: "the Enforcing and Protecting American Rights Against Sites Intent on Theft and Exploitation Act" or the E-PARASITE Act (though, they also say you can call it the "Stopping Online Piracy Act").  
&lt;br&gt;&lt;br&gt;
The bill is big, and has a bunch of problems.  First off, it &lt;i&gt;massively&lt;/i&gt; expands the sites that will be covered by the law.  The Senate version at least tried to limit the targets of the law (but not the impact of the law) on sites that were "dedicated to infringing activities" with no other significant purposes (already ridiculously broad), the new one just targets "foreign infringing sites" and "has only limited purpose or use other than" infringement.  They're also including  an "inducement" claim not found elsewhere in US regulations -- and which greatly expands what is meant by inducement.  The bill effectively takes what the entertainment industry &lt;i&gt;wanted&lt;/i&gt; the Supreme Court to say in Grokster (which it did not say) and puts it into US law.  In other words, any foreign site declared by the Attorney General to be "inducing" infringement, with a very broad definition of inducing, can now be censored by the US.  With no adversarial hearing.  Hello, Great Firewall of America.
&lt;br&gt;&lt;br&gt;
And while defenders of this bill will insist it's only designed to target truly infringing sites, let's just recall a small list of sites and technologies the industry has insisted were all about infringement in the past: the player piano, the radio, the television, the photocopier, the phonograph, cable tv, the vcr, the mp3 player, the DVR, online video hosting sites like YouTube and more.  All of these things turned out to be huge boons for the industry.  And yet, with a law like this in place, the old industry gets to kill off technologies they don't understand.  Scary stuff.
&lt;br&gt;&lt;br&gt;
And it's not just foreign sites impacted by this law (despite what supporters would have you believe).  It appears to expand who would have to take on the entire burdens of enforcing this blacklist -- broadly naming "service providers" as defined in the DMCA.  That's significant, because a big part of this bill is to undermine and strip away the safe harbors of the DMCA.  The DMCA set up an important balance that gave online service providers freedom from liability if they pulled down content upon notification.  This new bill provides a massive and ridiculous burden: allowing the Attorney General to create an internet blacklist that all service providers will need to block access to:
&lt;blockquote&gt;&lt;i&gt;
A service provider
 shall take technically feasible and reasonable measures designed to prevent access
 by its subscribers located within the
 United States to the foreign infringing site
 (or portion thereof) that is subject to the
 order, including measures designed to prevent the domain name of the foreign infringing site (or portion thereof) from resolving to that domain name’s Internet Protocol address. Such actions shall be taken as expeditiously as possible, but in any case within 5 days after being served with a copy of the order, or within such time as the court may order.
&lt;/i&gt;&lt;/blockquote&gt;
On top of that, the bill says any attempt to get around such blocks can lead to liability.  Would this put liability on things like MAFIAAfire?  It sure sounds like it:
&lt;blockquote&gt;&lt;i&gt;
To ensure compliance with orders issued pursuant to this section, the Attorney General may bring an action for injunctive relief....
&lt;br&gt;&lt;br&gt;
against any entity that knowingly
and willfully provides or offers to provide a product or service designed or marketed
 for the circumvention or bypassing of
 measures described in paragraph (2) and
 taken in response to a court order issued
 pursuant to this subsection, to enjoin such
 entity from interfering with the order by
 continuing to provide or offer to provide
 such product or service.
&lt;/i&gt;&lt;/blockquote&gt;

  While the text of the bill insists that nothing in it takes away the DMCA's safe harbors, once again this is a claim without the facts to back it up.  A large part of the bill is an effective attempt to strip away the DMCA's safe harbors.
&lt;br&gt;&lt;br&gt;
The only &lt;i&gt;extraordinarily minor&lt;/i&gt; change against the interests of the entertainment industry is that the bill ever so slightly changes the "private right to action," which allows individual copyright holders to take action under this bill.  This was a big problem in the old bill, and the only requirement here is that prior to making use of this private right to action, copyright holders have to provide "notice" to payment processors and ad providers.  But then those service providers are expected to take action anyway, or face liability.  So all this really does is take the court out of the process, and make it even easier for copyright holders to effectively kill off sites they don't like.
&lt;br&gt;&lt;br&gt;
Think about this for a second: think how many bogus DMCA takedown notices are sent by copyright holders to take down content they don't like.  With this new bill, should it become law, those same copyright holders will be able to cut off advertising and payment processing to such sites.  Without court review. 
&lt;br&gt;&lt;br&gt;
And... because this bill wasn't already ridiculously bad enough, it &lt;b&gt;also&lt;/b&gt; lumps in a House version of the &lt;a href="http://www.techdirt.com/search.php?q=s.978&amp;amp;eid=&amp;amp;tid=&amp;amp;aid=&amp;amp;searchin=stories"&gt;felony streaming bill&lt;/a&gt; that will make huge swaths of Americans felons for streaming content online.
&lt;br&gt;&lt;br&gt;
This bill is an abomination and an insult to the Constitution.  It's unfortunate that Rep. Lamar Smith thinks this is worth introducing in its current state, and anyone who signs on to co-sponsor is effectively supporting mass censorship of the internet in the US, as well as the criminalization of huge numbers of Americans -- while putting a huge burden on the one part of the economy that actually is creating jobs.  All because a few legacy companies in the entertainment industry refuse to adapt.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml"&gt;Permalink&lt;/a&gt; | &lt;a href="http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml#comments"&gt;Comments&lt;/a&gt; | &lt;a href="http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml?op=sharethis"&gt;Email This Story&lt;/a&gt;&lt;br&gt;
 &lt;br style="clear:both"&gt;
&lt;br style="clear:both"&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=cd80b150c797e3641447d6469d78a408&amp;amp;p=1"&gt;&lt;img alt="" style="border:0" border="0" src="http://ads.pheedo.com/img.phdo?s=cd80b150c797e3641447d6469d78a408&amp;amp;p=1"&gt;&lt;/a&gt;
&lt;img alt="" height="0" width="0" border="0" src="http://segment-pixel.invitemedia.com/pixel?code=TechBiz&amp;amp;partnerID=167&amp;amp;key=segment"&gt;&lt;img alt="" height="0" width="0" border="0" src="http://insight.adsrvr.org/track/evnt/?ct=0:8pyu3gz&amp;amp;adv=wouzn4v&amp;amp;fmt=3"&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/techdirt/feed?a=OtcayLNuzzc:hs4XFxPvDss:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/techdirt/feed?i=OtcayLNuzzc:hs4XFxPvDss:D7DqB2pKExk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/techdirt/feed?a=OtcayLNuzzc:hs4XFxPvDss:c-S6u7MTCTE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/techdirt/feed?d=c-S6u7MTCTE" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/techdirt/feed/~4/OtcayLNuzzc" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/OtcayLNuzzc" height="1" width="1"/&gt;</summary><author><name>Mike Masnick</name></author><source gr:stream-id="feed/http://www.techdirt.com/techdirt_rss.xml"><id>tag:google.com,2005:reader/feed/http://www.techdirt.com/techdirt_rss.xml</id><title type="html">Techdirt.</title><link rel="alternate" href="http://www.techdirt.com/" type="text/html" /></source><feedburner:origLink>http://www.techdirt.com/articles/20111026/12130616523/protect-ip-renamed-e-parasites-act-would-create-great-firewall-america.shtml</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319660239055"><id gr:original-id="http://labnotes.org/?p=1627">tag:google.com,2005:reader/item/fdd4b356d6606627</id><category term="general" scheme="http://labnotes.org" /><title type="html">Rounded Corners 298 – Venn piagram</title><published>2011-10-25T16:00:20Z</published><updated>2011-10-24T02:18:27Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/8jyEy30W-hQ/" type="text/html" /><link rel="replies" href="http://labnotes.org/2011/10/25/rounded-corners-298-%E2%80%93-venn-piagram/#comments" type="text/html" /><link rel="replies" href="http://labnotes.org/2011/10/25/rounded-corners-298-%E2%80%93-venn-piagram/feed/atom/" type="application/atom+xml" /><content xml:base="http://labnotes.org/2011/10/25/rounded-corners-298-%E2%80%93-venn-piagram/" xml:lang="en" type="html">&lt;p style="text-align:center"&gt;&lt;a href="http://flowingdata.com/2011/10/21/the-venn-piagram/"&gt;&lt;img title="The Venn Piagram" src="http://flowingdata.com/wp-content/uploads/2011/10/Venn-piagram-625x466.jpg" alt="" width="375" height="280"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Callbacks&lt;/strong&gt; &lt;a href="http://addyosmani.com/blog/jquery-1-7s-callbacks-feature-demystified/"&gt;$.Callbacks is a new feature coming in jQuery 1.7&lt;/a&gt; that will make it easier to chain and manage callbacks. Not to mention, dead easy to do pub/sub on the client side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sweet &lt;/strong&gt;&lt;a href="http://sugarjs.com/"&gt;Sugar.js 1.0&lt;/a&gt; is finally out, adding data locales, Object.watch, string interpolation &lt;a href="http://blog.sugarjs.com/post/11704397561/v1-0-date-locales-and-much-more"&gt;and much more&lt;/a&gt;. Guaranteed to make your JS development full of win.’&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live coding &lt;/strong&gt;&lt;a href="http://cykod.github.com/CoderDeck/"&gt;CoderDeck&lt;/a&gt; lets you create live-coding presentations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tricky&lt;/strong&gt; &lt;a href="http://www.lifehack.org/articles/technology/lifehacks-ios-5-tips-and-tricks-guide.html?utm_source=feedburner"&gt;iOS 5 tips &amp;amp; tricks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ugly secrets&lt;/strong&gt; &lt;a href="http://www.troyhunt.com/2011/10/secret-ios-business-what-you-dont-know.html"&gt;iOS secrets&lt;/a&gt;: what you don’t know the app you’re running is doing in the background.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Partial&lt;/strong&gt; &lt;a href="http://www.forbes.com/sites/forbeswomanfiles/2011/10/14/women-who-ask-do-get-ahead-but-men-dont-have-to/"&gt;Fortune on the gender disparity&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“The issue isn’t that women don’t ask. Maybe it’s that men don’t have to.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/8jyEy30W-hQ" height="1" width="1"/&gt;</content><author><name>Assaf</name></author><source gr:stream-id="feed/http://blog.labnotes.org/feed/atom/"><id>tag:google.com,2005:reader/feed/http://blog.labnotes.org/feed/atom/</id><title type="html">Labnotes</title><link rel="alternate" href="http://labnotes.org/" type="text/html" /></source><feedburner:origLink>http://labnotes.org/2011/10/25/rounded-corners-298-%E2%80%93-venn-piagram/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319659765946"><id gr:original-id="http://news.killscreendaily.com/post/11949136979">tag:google.com,2005:reader/item/e28f3b73bbf2713e</id><category term="gaming" /><category term="new york times" /><category term="angry birds" /><category term="steve jobs" /><title type="html">And the award for "Angry Birds-related Correction of the Year" goes to...</title><published>2011-10-26T14:00:06Z</published><updated>2011-10-26T14:00:06Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/lhseHH4UE5g/11949136979" type="text/html" /><summary xml:base="http://killscreendaily.com/" type="html">&lt;p&gt;&lt;img src="http://fc05.deviantart.net/fs71/i/2010/321/a/1/angry_birds_by_ijul-d332s5v.jpg" width="640"&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;New York Times&lt;/em&gt;! With the following note in their review of Walter Isaacson’s &lt;em&gt;Steve Jobs&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An earlier version of this article incorrectly stated the premise of “Angry Birds,” a popular iPhone game. In the game, slingshots are used to launch birds to destroy pigs and their fortresses, not to shoot down the birds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just goes to show you even the Grey Lady still might be &lt;a href="http://www.rovio.com/index.php?page=angry-birds---frequently-asked-questions-faq"&gt;running off Blackberry&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;-Drew Millard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://www.nytimes.com/2011/10/22/books/steve-jobs-by-walter-isaacson-review.html/"&gt;via&lt;/a&gt;] [&lt;a href="http://www.nytimes.com/2011/10/22/books/steve-jobs-by-walter-isaacson-review.html/"&gt;image&lt;/a&gt;]&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/lhseHH4UE5g" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://news.killscreendaily.com/rss"><id>tag:google.com,2005:reader/feed/http://news.killscreendaily.com/rss</id><title type="html">Kill Screen Daily</title><link rel="alternate" href="http://killscreendaily.com/" type="text/html" /></source><feedburner:origLink>http://news.killscreendaily.com/post/11949136979</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319609671354"><id gr:original-id="http://alexch.tumblr.com/post/11911350761">tag:google.com,2005:reader/item/8a9da75aea8c0992</id><title type="html">Francis Cleary - Google  - Probably my biggest fear with moving from Reader to Plus is…</title><published>2011-10-25T16:50:50Z</published><updated>2011-10-25T16:50:50Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/49VgQpNt9So/11911350761" type="text/html" /><summary xml:base="http://alexch.tumblr.com/" type="html">&lt;a href="https://plus.google.com/u/0/110805491250386698039/posts/UkTTmfKBuGC"&gt;Francis Cleary - Google  - Probably my biggest fear with moving from Reader to Plus is…&lt;/a&gt;: &lt;p&gt;&lt;span&gt;Google Reader &lt;s&gt;is&lt;/s&gt; was the best &lt;strong&gt;asynchronous&lt;/strong&gt; social network ever made. It’s the closest thing to a party that 25 people, all on totally different schedules, can swing. &lt;br&gt;&lt;br&gt;“Now” didn’t matter. “Who” barely mattered. Sharing 3,000 items a month or 30? Didn’t matter.&lt;br&gt;&lt;br&gt;Reader, somehow, some way, became the best possible way for people who can’t stand talking about themselves to communicate with each other.&lt;br&gt;&lt;br&gt;Even if every Reader feature made it to Plus — and shit no they haven’t, and it doesn’t look like they will — &lt;strong&gt;the entire concept, culture and process is completely different.&lt;/strong&gt; You can’t remotely replicate the closed, tight, context- and content-first communities of Reader in Plus. You can’t efficiently or effectively share, excerpt, annotate or discuss a 3,500-word longform news article on Plus &lt;em&gt;alone&lt;/em&gt;without opening at least two other tabs.&lt;br&gt;&lt;br&gt;You can’t sit back with a drink and catch up on discussions that don’t have to be carried on &lt;strong&gt;right fucking now or they’re gone forever&lt;/strong&gt; in Plus.&lt;br&gt;&lt;br&gt;Reader did it so, so well. It was an ugly motherfucker. It broke early and often, it never joined the API craze even as its never-documented and barely acknowledged reverse-engineered API went on to power who only knows how many web and mobile apps. It was held together for months, if not years, by one or two developers whose names are maybe even lost to history now.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[excerpt from &lt;a href="https://plus.google.com/u/0/110805491250386698039/posts/UkTTmfKBuGC%5D"&gt;https://plus.google.com/u/0/110805491250386698039/posts/UkTTmfKBuGC]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/49VgQpNt9So" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://alexch.tumblr.com/rss"><id>tag:google.com,2005:reader/feed/http://alexch.tumblr.com/rss</id><title type="html">alexch&amp;#39;s almanac</title><link rel="alternate" href="http://alexch.tumblr.com/" type="text/html" /></source><feedburner:origLink>http://alexch.tumblr.com/post/11911350761</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319609370252"><id gr:original-id="">tag:google.com,2005:reader/item/e2a06a76f7aada7d</id><title type="html">The World Is Surprisingly Angry About the End of Google Reader - Technology - The Atlantic Wire</title><published>2011-10-26T06:09:30Z</published><updated>2011-10-26T06:09:30Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/G-r6uepdV14/" type="text/html" /><link rel="related" href="http://www.theatlanticwire.com/" title="www.theatlanticwire.com" /><content xml:base="http://www.theatlanticwire.com/technology/2011/10/world-surprisingly-angry-about-end-google-reader/44109/" type="html">&lt;blockquote&gt;Shared by  Laine 
&lt;br&gt;
!!!!!!!!!!!!!!!!&lt;/blockquote&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
		&lt;/div&gt;
		
		&lt;div&gt;
			
			
			&lt;p&gt;
	The &lt;a href="http://www.theatlanticwire.com/technology/2011/10/how-survive-switch-google-reader-google/44069/"&gt;demise of Google Reader's share features&lt;/a&gt; is affecting everyone from RSS-junkies to Iranian freedom fighters, and many of them are very displeased. Google Reader itself is very much alive and well, and in fact, the RSS reader will soon sport a slick-looking redesign. However, at some point this week, the ability to follow, friend and share links within Reader will cease to exist, as Google pushes people to use Google+ for those kinds of things. Along with it, the myriad communities that depended on Reader for years for everything from meeting new people to organizing protests will just have to figure something else out. It turns out Google wasn&amp;#39;t so bad at social networks, after all.&lt;/p&gt;
&lt;p&gt;
	Displeased is actually not a strong enough word to describe these sentiment. These people are pissed, and they're fighting back. (There are &lt;a href="https://www.facebook.com/event.php?eid=236228939769149"&gt;already protests planned&lt;/a&gt; outside of Google offices and &lt;a href="https://docs.google.com/spreadsheet/viewform?hl=en_US&amp;amp;formkey=dE16SFVla3JFZ1lwTkxGRWN2SkZtb2c6MA#gid=0"&gt;a petition&lt;/a&gt;--using Google Docs, of course--to save Reader's social features.) The dissenters divide into two camps: Iranians and the Sharebros.&lt;/p&gt;
&lt;h3 style="color:red"&gt;
	Iran&lt;/h3&gt;
&lt;p&gt;
	You've undoubtedly heard a lot about how the Iranian protests of 2009 were driven by Twitter. They were, and the government responded immediately, imposing firewalls and other censorship measures in an effort to quash the uprising. Ultimately, pretty much every single social network was banned in Iran over the past couple of years, leaving Iranians without a free speech forum--except Google Reader. As an Iranian blogger who goes by Amir &lt;a href="http://www.amirhm.com/2011/10/why-google-reader-gooder-matters-for-us.html"&gt;explains&lt;/a&gt;, "Google Reader is not in a separated domain (like any other Google product) and thanks to https protocol, it is hard to filter by government." Amir and other Iranians are worried that Google+, which lives in a subdomain that could be more easily blocked, will suffer the same fate as the other social networks:&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		Popularity map for Google Reader shows that Google Reader is the &lt;a href="http://www.appappeal.com/maps/google-reader/"&gt;1st popular website in Iran&lt;/a&gt;, despite the fact that many users which are using VPN or proxies and are not counted! Then it makes sense why Google Reader matters for Iranian and why integrating it with Google+ will makes it like any already available and banned website like facebook!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	Alan Green, the Google programmer saddled with breaking the bad news on the company's official blog, has received nearly 500 comments &lt;a href="https://plus.google.com/113760695441101959932/posts/Yxj9MquTddH"&gt;on his Google+ post announcing the changes&lt;/a&gt;, many of them from angry Iranians who believe their freedom of speech is in jeopardy. He hasn't responded to a single one.&lt;/p&gt;
&lt;h3 style="color:red"&gt;
	The Sharebros&lt;/h3&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.theatlanticwire.com/img/upload/2011/10/25/2145_.png" style="float:right;width:300px;height:377px"&gt;Sharebros &lt;a href="http://googlereaderlexicon.wikispaces.com/A+Sharebro+Primer"&gt;identify themselves&lt;/a&gt; simply as &amp;quot;person(s) whom one is following and followed by on Google Reader (as formally recognized by &lt;a href="https://plus.google.com/111567061469336027617/posts/HufdiCBvacv" rel="nofollow"&gt;a Google Reader founder&lt;/a&gt;)," but their devotion to Reader is uncanny. Like more well known online communities like Reddit or 4chan, they've developed their own &lt;a href="http://googlereaderlexicon.wikispaces.com/A+Glossary+of+Hashtags+and+Abbreviations"&gt;glossary of hashtags&lt;/a&gt; and &lt;a href="http://googlereaderlexicon.wikispaces.com/A+Treasury+of+Pictograms"&gt;lexicon of pictograms&lt;/a&gt;. ( &lt;strong&gt;-_-&lt;/strong&gt;  denotes &amp;quot;dissatisfaction or defeat.&amp;quot;) The community doesn&amp;#39;t just exist online, either. They have #sharebro parties, and many of them say they&amp;#39;ve met some of their closest friends via Google Reader. At least one Sharebro met his wife.&lt;/p&gt;
&lt;p&gt;
	We talked to a number of Sharebros about the changes, and their arguments against axing the social features were about half as compelling as their stories about how Google Reader changed their lives. Richard Berger told The Atlantic Wire about how he ditched email and now primarily communicates with his mother via Google Reader. "Reader is the best way to share and discover content on the internet, period," says Richard.&lt;/p&gt;
&lt;p&gt;
	Another, Stu Watson formed a band, No Sky God, with his friend James who he met through Google Reader. They just put out a 12" record featuring Nat Baldwin, the bassist from Dirty Projectors. "James and I would likely have never met without Reader," Stu wrote in an email, "but more importantly the social aspects of Reader allowed us to get to know each other in a more intimate and ultimately meaningful way than if we had, say, just been Facebook friends or something." Stu tells us that people in the Sharebro sphere are already working on &lt;a href="https://plus.google.com/110805491250386698039/posts/J2S3ua7Bpe9"&gt;coding their own Reader replacement&lt;/a&gt;--they don't want to use Google+.&lt;/p&gt;
&lt;p&gt;
	The most compelling Sharebro story comes from Ramey Moore. &lt;a href="http://www.google.com/support/forum/p/reader/thread?tid=08e63a1af9829a1c&amp;amp;hl=en"&gt;In a Reader forum post&lt;/a&gt;, Ramey tells the story about how he and his wife, who&amp;#39;s expecting a child soon, &amp;quot;first met at a #sharebro event, scheduled and organized solely through Reader.&amp;quot; The (long) post concludes: &lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		I am 100% certain that even if someone at Google cares or commiserates with me that nothing will change. … Basically, this is a panegyric. An elegy. A final funeral oration. A fuck you to those who want to kill something that works and try to build a Frankenstein's Monster that will probably choke to death on its own blood. Reader works as is, this move is just a sad attempt to jump-start an already failed Buzz 2.0.&lt;br&gt;
		&lt;br&gt;
		That's it, I'm done. If anyone cares I'm going to be trying to imagine how to delete G+.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	At least one protest organized by Sharebros is &lt;a href="https://www.facebook.com/event.php?eid=236228939769149"&gt;scheduled to gather tomorrow at Google's DC headquarters&lt;/a&gt;. Meanwhile, the petition to save Reader's social features has gathered &lt;a href="http://www.bdkeller.com/2011/10/save-google-reader/"&gt;thousands of signatures&lt;/a&gt;. And despite all the backlash from their most devoted users, the Google Reader teams has yet to respond. We reached out for a response and haven't heard back.&lt;/p&gt;


			
			&lt;p&gt;
	Want to add to this story? Let us know &lt;a href="http://www.theatlanticwire.com/technology/2011/10/world-surprisingly-angry-about-end-google-reader/44109/#dsq-content" title="Comment on this article" name="&amp;amp;lpos=add-to-story"&gt;in comments&lt;/a&gt;
		or send an email to the author at 
		&lt;a href="mailto:aestes@theatlantic.com" title="Email Adam Clark Estes" name="&amp;amp;lpos=add-to-story"&gt;aestes@theatlantic.com&lt;/a&gt;.
	
	You can share ideas for stories on the &lt;a href="http://www.theatlanticwire.com/open-wire/" title="Comment on Open Wire" name="&amp;amp;lpos=add-to-story"&gt;Open Wire&lt;/a&gt;.

	
		
		&lt;/p&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/G-r6uepdV14" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">!!!!!!!!!!!!!!!!</content><author gr:user-id="06812956098685403800" gr:profile-id="100062754769807096045"><name>Laine</name></author></gr:annotation><source gr:stream-id="user/06812956098685403800/source/com.google/link"><id>tag:google.com,2005:reader/user/06812956098685403800/source/com.google/link</id><title type="html">www.theatlanticwire.com</title><link rel="alternate" href="http://www.theatlanticwire.com/" type="text/html" /></source><feedburner:origLink>http://www.theatlanticwire.com/technology/2011/10/world-surprisingly-angry-about-end-google-reader/44109/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319609241325"><id gr:original-id="">tag:google.com,2005:reader/item/400ad65be5257b7e</id><title type="html">Google Reader Is Dying: Will You Cope By Protesting, Perhaps?</title><published>2011-10-26T06:07:21Z</published><updated>2011-10-26T06:07:21Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/uIJ1iMDNkj4/" type="text/html" /><link rel="related" href="http://www.washingtoncitypaper.com/blogs/citydesk" title="City Desk" /><content xml:base="http://www.washingtoncitypaper.com/blogs/citydesk/2011/10/25/google-reader-is-dying-will-you-cope-by-protesting-perhaps/" type="html">&lt;blockquote&gt;Shared by  Jim 
&lt;br&gt;
#OccupyGoogleReader&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="attachment wp-att-82268" href="http://www.washingtoncitypaper.com/blogs/citydesk/2011/10/25/google-reader-is-dying-will-you-cope-by-protesting-perhaps/google-reader/"&gt;&lt;img title="google reader" src="http://www.washingtoncitypaper.com/blogs/citydesk/files/2011/10/google-reader-300x98.jpg" alt="" width="300" height="98"&gt;&lt;/a&gt;I mentioned this yesterday, but despite plans to &lt;a href="http://www.forbes.com/sites/erikkain/2011/10/20/big-changes-coming-to-google-reader/"&gt;change its functionality and integrate it into Google +&lt;/a&gt;, Google Reader—an RSS feed reader—is alive and well for lots of people. Including, apparently, folks in Iran. &lt;a href="http://techcrunch.com/2011/10/25/iranians-upset-over-google-reader-changes/"&gt;Tech Crunch takes note&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;According &lt;a href="http://www.amirhm.com/2011/10/why-google-reader-gooder-matters-for-us.html"&gt;to a blog post&lt;/a&gt; now making its way around the Web, Google Reader served the Iranian community as a way to get uncensored, unfiltered news outside of government control. And now, that may be over.&lt;/p&gt;
&lt;p&gt;As explained by &lt;strong&gt;Amir &lt;/strong&gt;on &lt;a href="http://www.amirhm.com/2011/10/why-google-reader-gooder-matters-for-us.html"&gt;Amirhm.com&lt;/a&gt;, Google Reader is not a separate domain (i.e., it’s available at www.google.com/reader) and it’s available behind a secure URL beginning &lt;em&gt;https&lt;/em&gt;. This setup makes it hard for the government to directly block and filter Reader, even though many other social services, including Twitter, Facebook, FriendFeed, YouTube, Tumblr, Flickr and Picasa, are routinely banned in Iran, a country that’s &lt;a href="http://www.readwriteweb.com/archives/iran_officially_worst_online_oppressor.php"&gt;ranked&lt;/a&gt; as the world’s worst oppressor of online freedoms.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;My own usage of Google Reader is mainly as a social network where I share and discuss articles (and, who am I kidding, &lt;a href="http://buzzworthy.mtv.com/2011/10/07/beyonce-countdown-video-gif/"&gt;gifs of &lt;strong&gt;Beyonce&lt;/strong&gt;&lt;/a&gt;) with a small group of witty friends. And while I don't need Reader to access unfiltered news, it's really nice to have a relatively private place to share content with friends. In the last two months, my most frequent interaction with Google + has been reading the daily notifications that 10+ men I've never heard of have added me to one of their circles.&lt;/p&gt;
&lt;p&gt;As one pal put it, "I don't want the creepy dudes who add me on Google Plus to know which celebrity gossip articles I am reading!"&lt;/p&gt;
&lt;p&gt;I'm managing to console myself with the reminder that change and the internet go hand in hand, and it's entirely possible that G+ will make it easy to share and we'll all end up loving it more than anything else that's come before.&lt;/p&gt;
&lt;p&gt;But if you still have a case of #&lt;a href="http://www.urbandictionary.com/define.php?term=First+World+Problems"&gt;firstworldproblems&lt;/a&gt;, there's going to be a Google Reader protest at the company's D.C. offices at 1101 New York Ave. NW tomorrow from 12:30 to 4:30 p.m. And while I don't quite get the point of protesting, &lt;a href="https://www.facebook.com/event.php?eid=236228939769149"&gt;the organizers explain it thus&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Google has decided – without any user consultation – to kill our beloved Google Reader, and force us all to use G+ in its stead. Without any of the functionality that made Reader so useful transferring over to make G+ work for us.&lt;/p&gt;
&lt;p&gt;In doing so, they are destroying all the features that makes Google Reader so great, and destroying a thriving community of dedicated and loyal followers.&lt;/p&gt;
&lt;p&gt;We are the demographic that Google needs the most, and we need to let them know what they are losing, and what changes they need to make to this plan to win us back.&lt;/p&gt;
&lt;p&gt;Join us for this peaceful protest outside Google's DC Headquarters, and let our voice be heard.&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/uIJ1iMDNkj4" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">#OccupyGoogleReader</content><author gr:user-id="10854278639342739081" gr:profile-id="104429996685532321304"><name>Jim</name></author></gr:annotation><source gr:stream-id="user/10854278639342739081/source/com.google/link"><id>tag:google.com,2005:reader/user/10854278639342739081/source/com.google/link</id><title type="html">City Desk</title><link rel="alternate" href="http://www.washingtoncitypaper.com/blogs/citydesk" type="text/html" /></source><feedburner:origLink>http://www.washingtoncitypaper.com/blogs/citydesk/2011/10/25/google-reader-is-dying-will-you-cope-by-protesting-perhaps/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319609234605"><id gr:original-id="">tag:google.com,2005:reader/item/cfc3b7b13513e7a1</id><title type="html">n9w5n.jpg</title><published>2011-10-26T06:07:14Z</published><updated>2011-10-26T06:07:14Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/fmTtqf3-EAY/n9w5n.jpg" type="text/html" /><link rel="related" href="http://i.imgur.com/" title="i.imgur.com" /><content xml:base="http://i.imgur.com/n9w5n.jpg" type="html">&lt;blockquote&gt;Shared by  Jim 
&lt;br&gt;
For Courtney!&lt;/blockquote&gt;
&lt;img src="http://i.imgur.com/n9w5n.jpg"&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/fmTtqf3-EAY" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">For Courtney!</content><author gr:user-id="10854278639342739081" gr:profile-id="104429996685532321304"><name>Jim</name></author></gr:annotation><source gr:stream-id="user/10854278639342739081/source/com.google/link"><id>tag:google.com,2005:reader/user/10854278639342739081/source/com.google/link</id><title type="html">i.imgur.com</title><link rel="alternate" href="http://i.imgur.com/" type="text/html" /></source><feedburner:origLink>http://i.imgur.com/n9w5n.jpg</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319600451309"><id gr:original-id="">tag:google.com,2005:reader/item/6e384edba4da2c60</id><title type="html">InfoQ: Presentation: Simple Made Easy http://t.co/ysXznKHv</title><published>2011-10-26T03:40:51Z</published><updated>2011-10-26T03:40:51Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/EalTJiu9VE0/127122660449722368" type="text/html" /><link rel="related" href="http://twitter.com/InfoQ" title="Twitter / InfoQ" /><content xml:base="http://twitter.com/InfoQ/statuses/127122660449722368" type="html">&lt;blockquote&gt;Shared by  sconover 
&lt;br&gt;
Simplicity &amp;gt; testing. Simplicity &amp;gt; ability to reason through. Simplicity &amp;gt; agile.&lt;br&gt;&lt;br&gt;If you bring to bear a tool that's easy to use, to make a big ball of mud, because it's easy, you've failed - you've failed in the most profound sense of failure. The failure is total and inescapable.&lt;br&gt;&lt;br&gt;Taking time to make things simple in the face of economic pressures takes courage.&lt;br&gt;&lt;br&gt;IOW if you write code then this talk is a must-watch.&lt;/blockquote&gt;
InfoQ: Presentation:  Simple Made Easy http://t.co/ysXznKHv
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/EalTJiu9VE0" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Simplicity &amp;gt; testing. Simplicity &amp;gt; ability to reason through. Simplicity &amp;gt; agile.&lt;br&gt;&lt;br&gt;If you bring to bear a tool that's easy to use, to make a big ball of mud, because it's easy, you've failed - you've failed in the most profound sense of failure. The failure is total and inescapable.&lt;br&gt;&lt;br&gt;Taking time to make things simple in the face of economic pressures takes courage.&lt;br&gt;&lt;br&gt;IOW if you write code then this talk is a must-watch.</content><author gr:user-id="03957709134162206848" gr:profile-id="105157679830352599621"><name>sconover</name></author></gr:annotation><source gr:stream-id="user/03957709134162206848/source/com.google/link"><id>tag:google.com,2005:reader/user/03957709134162206848/source/com.google/link</id><title type="html">Twitter / InfoQ</title><link rel="alternate" href="http://twitter.com/InfoQ" type="text/html" /></source><feedburner:origLink>http://twitter.com/InfoQ/statuses/127122660449722368</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319513038734"><id gr:original-id="http://zachholman.com/posts/slide-design-for-developers">tag:google.com,2005:reader/item/6a515d24b0aaa8af</id><title type="html">Slide Design for Developers</title><published>2011-10-24T07:00:00Z</published><updated>2011-10-24T07:00:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/GVfav2c-bO0/slide-design-for-developers" type="text/html" /><link rel="canonical" href="http://zachholman.com/posts/slide-design-for-developers" /><content xml:base="http://zachholman.com/" type="html">&lt;p&gt;So I gave this talk called &lt;a href="http://zachholman.com/talk/how-github-uses-github-to-build-github"&gt;How GitHub Uses GitHub to Build GitHub&lt;/a&gt;.
Someone submitted my slides to Hacker News, where it stayed at #1 for most of
the day.&lt;/p&gt;

&lt;p&gt;This was pretty strange to me at first.&lt;/p&gt;

&lt;p&gt;My slides are not designed for people who didn&amp;#39;t see the talk in person.
They&amp;#39;re designed to support my words, not some online audience. What&amp;#39;s more,
many commented that they found the &lt;em&gt;design of the slides&lt;/em&gt; to be noteworthy.
I&amp;#39;m expressly &lt;em&gt;not&lt;/em&gt; a designer.&lt;/p&gt;

&lt;p&gt;Working on your slide design pays off for the audience in front of you and for
the audience online reading your slides later. I learned a lot designing this
talk, and I think it can be helpful for you, too.&lt;/p&gt;

&lt;h2&gt;Colors&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBQI/color.png" width="650" height="200"&gt;&lt;/p&gt;

&lt;p&gt;Color is the very first thing people will notice. It should also be the very
first thing you think about.&lt;/p&gt;

&lt;p&gt;Head to a color site like &lt;a href="http://www.colourlovers.com"&gt;Colour Lovers&lt;/a&gt; and find a palette you like.
Pick colors with a lot of contrast- it gives you a lot of flexibility with
text, backgrounds, and objects. In my GitHub talk, I have around four colors I
use frequently, and 8-10 total (lighter green to augment a darker green,
lighter blue for my dark blue, and so on).&lt;/p&gt;

&lt;h2&gt;Size&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BAsT/fuck.png" width="650" height="300"&gt;&lt;/p&gt;

&lt;p&gt;Make your text huge. And then get rid of half of the words and make it huger.
Almost all of the presentations I&amp;#39;ve ever seen at every conference screws this
up.&lt;/p&gt;

&lt;p&gt;Most of my text in my entire deck is at least 90pt. Usually I  like to sit
around 150pt, with spikes up to 300pt or more. You cannot get large enough.&lt;/p&gt;

&lt;p&gt;For the curious, I use &lt;a href="http://www.yanone.de/typedesign/kaffeesatz"&gt;Yanone Kaffeesatz&lt;/a&gt; as the typeface for both my
slide deck and the headings on my blog.&lt;/p&gt;

&lt;p&gt;One of my favorite tweets from my New Orleans talk said &amp;quot;Great slide design- I
was way in the back and could read every single word!&amp;quot; Forget the people in
front of you: &lt;strong&gt;design for people three rooms away from you&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Words as Shapes&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBqo/shape.png" width="650" height="300"&gt;&lt;/p&gt;

&lt;p&gt;I took one design class in college. One of the most fascinating assignments
they gave us was a study of shape: you get one letter, in one typeface… do
something with it. The idea was that the severe limitation forced you to be
creative with duplication, rotation, scale, alignment, and whitespace. It
opened my mind to a lot of possibilities I hadn&amp;#39;t thought before. &lt;strong&gt;Letters
themselves can be part of the design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Slides give you the same opportunity. The easiest way to make your slides
visually interesting is to play around with the physical &lt;em&gt;shape&lt;/em&gt; of the letters
that constitute the word. Line things up. Don&amp;#39;t line things up. Shift things
around. Worry about pixels. Almost every single slide in my talk is a different
font size, since I want things to work off of previous words, lines, and so on.
Text sizes of 94.5 points are not uncommon in my deck. They create a much more
interesting visual than throwing a random bullet point on-screen.&lt;/p&gt;

&lt;h2&gt;Repetition&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBN2/repeat.png" width="650" height="300"&gt;&lt;/p&gt;

&lt;p&gt;Humans love repetition. It&amp;#39;s one of the tricks used in lots of disciplines. The
best jazz soloists are capable of starting a melody, repeating it, and then
playing with it after the audience has identified with the repetition. The best
storytellers will repeat the same line throughout a story to build a sense of
familiarity, of excitement. Slides are no different.&lt;/p&gt;

&lt;p&gt;Steve Jobs did this often. Before moving onto the next product announcement,
he&amp;#39;d spend thirty seconds and go over the same information he just presented.
It&amp;#39;s a very simple way of keeping things memorable for your audience. I make
this explicit by giving recap sections big green stamps in the upper corner
saying &amp;quot;RECAP&amp;quot;. I also giving the start of each section of my talk bright
orange backgrounds with colorful, bold text. Simple reiteration is important.&lt;/p&gt;

&lt;p&gt;Simple reiteration is important.&lt;/p&gt;

&lt;h2&gt;Worry about it&lt;/h2&gt;

&lt;p&gt;A good set of slides won&amp;#39;t magically make your talk great. But a great talk is
really hurt by terrible slides. Spend some time thinking about your slides. Put
yourself in your audience&amp;#39;s shoes: is this readable? Is this interesting?
Should I pay attention, or should I get my laptop out and hack until lunch?&lt;/p&gt;

&lt;p&gt;I&amp;#39;m certainly not a designer, but it&amp;#39;s really remarkable how little design you
need to put yourself far ahead of most talks. Huge text. Consistent colors.
Less words. Worry about those, and it will already put you far ahead of the
pack.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7EQIY77hz8w" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/GVfav2c-bO0" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/holman"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/holman</id><title type="html">Zach Holman</title><link rel="alternate" href="http://zachholman.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/holman/~3/7EQIY77hz8w/slide-design-for-developers</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319512947742"><id gr:original-id="http://twitter.com/littleidea/statuses/128657438323904512">tag:google.com,2005:reader/item/e51a4d34732da7be</id><title type="html">littleidea: I predicted Groupon would crater before it was cool.</title><published>2011-10-25T02:21:38Z</published><updated>2011-10-25T02:21:38Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/v-ek3moY_vc/128657438323904512" type="text/html" /><summary xml:base="http://twitter.com/littleidea" type="html">littleidea: I predicted Groupon would crater before it was cool.&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/v-ek3moY_vc" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://twitter.com/statuses/user_timeline/14079705.rss"><id>tag:google.com,2005:reader/feed/http://twitter.com/statuses/user_timeline/14079705.rss</id><title type="html">Twitter / littleidea</title><link rel="alternate" href="http://twitter.com/littleidea" type="text/html" /></source><feedburner:origLink>http://twitter.com/littleidea/statuses/128657438323904512</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319512898366"><id gr:original-id="http://blog.bl00cyb.org/?p=287">tag:google.com,2005:reader/item/90179e2cf4efb8e2</id><category term="personal" /><category term="farewell" /><category term="greader" /><title type="html">Farewell, Dear Reader</title><published>2011-10-24T23:30:08Z</published><updated>2011-10-24T23:30:08Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/U6jIZnrCqtQ/" type="text/html" /><content xml:base="http://blog.bl00cyb.org/" type="html">&lt;p&gt;My favorite social forum has been Google Reader for a good couple few years now. Honest discussion, silly trolling, and safe exploration have been its key features to me. I remember forcing myself to notice how seamlessly they integrated the comments feature, how it became an intrinsic part of my life easily in exactly the way puberty didn’t. We talked gender, culture, ideals, memes, and love. I saw romances unfold and collapse, revolutions half start and dissolve or evolve, friendships be shaken and cemented.&lt;/p&gt;
&lt;p&gt;It was a safe place because I could say who had access to my shares and comments, but also see how “outsiders” interacted on the shares of dear friends. It was intellectual and thought-provoking because it was based on content, not social exchanges. It introduced people dear to my Tribe in a way that was based around shared ideals and interactive thoughts, not popularity or witticisms. And most of all, it was a way to normalize my friendships and emotional connection during constant travel. I always knew, no matter what timezone I was in, that someone had shared something, commented on someone else’s shares, and would have the consistency in character and access that geography and timezones made cognitively dissonent otherwise.&lt;br&gt;
&lt;img title="Babies" src="http://farm7.static.flickr.com/6101/6274790935_70d14ca01b_b.jpg" alt="" width="903" height="533"&gt;&lt;br&gt;
I’ve laughed at the persistent humor and intelligence of friends left in other geographies. I’ve seen and cherished the exploration and shift of gender, sexuality, and relationships of tender souls. I’ve learned about fashion and pleating and nails, things I never would have cared about but now find fascinating. I’ve trolled about Juggalos and claimed BUNK. This medium has allowed me the closeness of connection, the vulnerabilities, and the rejoicing that closely approximate real life. To someone whose “local” is geographically distributed, this has meant the world to me. It let me determine how public I was, and that is a rare and beautiful thing. And now, in yet one more place, my friendships and thoughts have become a commodity.&lt;/p&gt;
&lt;p&gt;Apparently the same usability exists to people on G+, with &lt;a href="http://kirbybits.wordpress.com/2011/10/21/wherein-i-try-to-explain-why-google-reader-is-the-best-social-network-created-so-far/"&gt;some changes to make people “click” more&lt;/a&gt; instead of delving deep into the content, assessing, and responding. It’s more public, more based on how many followers you have. As someone who is fairly well-followed, I will be clear that the only way I can be as awesome as I am is because of my core group of dear friends. My dear friends who, as cristobat (of course a sharebro) says, “you don’t have to be cool around.” My dear friends who I can share a post about disaster response next to an image one of my kinks next to an article about cyborgs and their only response it to comment honestly about each in a way which honors, questions, and builds upon those aspects of my Self.&lt;/p&gt;
&lt;p&gt;I can’t join G+ because I have an odd name, and risk losing acces to the other tools of theirs I use. Yes, they’re allowing pseudonyms soon, but there will be several weeks at least in the interim. Google, why are you succumbing to a broken system of “clickiness” instead of standing up for the very real, very dear exchanges that occur on your established tool? It’s like a city cutting taxes by removing the arts. Sure, it benefits a few people in the short term, but the long term societal effects are disastrous. I thought you would be better than that. I guess I was wrong. A strong and informed community would have been more beneficial to you in the long run than any capitalistic metrics of potential consumers ever would.&lt;/p&gt;
&lt;p&gt;I &lt;a href="http://www.flickr.com/photos/willowbl00/sets/72157627839484467/with/6275315866/"&gt;uploaded screencaps&lt;/a&gt; of some of my favorite GReader exchanges. You have to be a friend on Flickr to see them, because they are sensitive. Ping me if you don’t have access and think you should. You can also see the &lt;a href="http://googlereaderlexicon.wikispaces.com/"&gt;Lexicon&lt;/a&gt; for an index of ways we’ve interacted and might one day interact again in the future.&lt;/p&gt;
&lt;p&gt;Farewell, Dear Reader. It’s been great.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/U6jIZnrCqtQ" height="1" width="1"/&gt;</content><author><name>bl00</name></author><source gr:stream-id="feed/http://blog.bl00cyb.org/feed/"><id>tag:google.com,2005:reader/feed/http://blog.bl00cyb.org/feed/</id><title type="html">willowbl00</title><link rel="alternate" href="http://blog.bl00cyb.org" type="text/html" /></source><feedburner:origLink>http://blog.bl00cyb.org/2011/10/farewell-dear-reader/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319510100452"><id gr:original-id="http://alexch.tumblr.com/post/11868074433">tag:google.com,2005:reader/item/37e43168081fe390</id><title type="html">Why I Love and How I Use Google Reader</title><published>2011-10-24T16:46:00Z</published><updated>2011-10-24T16:46:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/oBvr-3cSePU/11868074433" type="text/html" /><summary xml:base="http://alexch.tumblr.com/" type="html">&lt;p&gt;TL;DR: How would you feel if Google announced they were cleaning up Gmail’s UI, and oh by the way, they’re also “retiring” some key features you use every day? I know, right?!? &lt;a href="http://googlereader.blogspot.com/2011/10/upcoming-changes-to-reader-new-look-new.html%20%20"&gt;Now read this&lt;/a&gt; and imagine it said…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“&lt;span&gt;Many of Gmail’s social features will soon be available via Google+, so in a week’s time we’ll be retiring things like replying, forwarding and filters inside of Gmail.”&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You should sign the petition:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheet/viewform?hl=en_US&amp;amp;formkey=dE16SFVla3JFZ1lwTkxGRWN2SkZtb2c6MA#gid=0"&gt;https://docs.google.com/spreadsheet/viewform?hl=en_US&amp;amp;formkey=dE16SFVla3JFZ1lwTkxGRWN2SkZtb2c6MA#gid=0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why all the hubbub?&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The comments at &lt;a href="http://techcrunch.com/2011/10/20/google-reader-getting-overhauled-removing-your-friends"&gt;this TechCrunch article&lt;/a&gt; are pretty articulate&lt;/li&gt;
&lt;li&gt;So is the intro to &lt;a href="http://googlereaderlexicon.wikispaces.com"&gt;&lt;a href="http://googlereaderlexicon.wikispaces.com"&gt;http://googlereaderlexicon.wikispaces.com&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Francis Cleary breaks it all down in &lt;a title="Francis Cleary on G+ vs. Google Reader" href="https://plus.google.com/u/0/110805491250386698039/posts/UkTTmfKBuGC"&gt;his Google+ post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="purity and danger on google reader" href="http://purityanddanger.blogspot.com/2010/10/google-reader.html"&gt;Dolly said it all&lt;/a&gt; a year ago&lt;/li&gt;
&lt;li&gt;And I think I do an OK job later in this post&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Two post-apocalyptic communities have sprouted up: &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://groups.google.com/group/google-reader-diaspora"&gt;https://groups.google.com/group/google-reader-diaspora&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googlereaderlexicon.wikispaces.com/"&gt;http://googlereaderlexicon.wikispaces.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;More links:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.forbes.com/sites/erikkain/2011/10/21/the-unsocial-network-why-google-is-wrong-to-kill-off-google-reader/"&gt;http://www.forbes.com/sites/erikkain/2011/10/21/the-unsocial-network-why-google-is-wrong-to-kill-off-google-reader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.forbes.com/sites/erikkain/2011/10/20/big-changes-coming-to-google-reader/"&gt;http://www.forbes.com/sites/erikkain/2011/10/20/big-changes-coming-to-google-reader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theincidentaleconomist.com/wordpress/our-beloved-google-reader-is-changing/"&gt;http://theincidentaleconomist.com/wordpress/our-beloved-google-reader-is-changing/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://notes.kateva.org/2011/10/google-reader-this-is-going-to-hurt.html"&gt;http://notes.kateva.org/2011/10/google-reader-this-is-going-to-hurt.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.extremetech.com/computing/101011-6-google-reader-replacements"&gt;http://www.extremetech.com/computing/101011-6-google-reader-replacements&lt;/a&gt; — none of which are social, or even attempt “Comment View”&lt;/li&gt;
&lt;li&gt;“Why Google Matters To Us Iranians”: &lt;a href="http://www.amirhm.com/2011/10/why-google-reader-gooder-matters-for-us.html"&gt;http://www.amirhm.com/2011/10/why-google-reader-gooder-matters-for-us.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Protest in Washington DC this Wed at the Google HQ to save Google Reader: https://www.facebook.com/event.php?eid=236228939769149&lt;/li&gt;
&lt;li&gt;Metafilter is on the scene: http://www.metafilter.com/108709/Dont-change-my-Google-Reader-backlash&lt;/li&gt;
&lt;li&gt;and Francis Cleary breaks it all down: https://plus.google.com/u/0/110805491250386698039/posts/UkTTmfKBuGC&lt;/li&gt;
&lt;li&gt;RWW: “World’s Youngest Leading Social Network Eats World’s Last Major RSS Reader: Google Reader Gets Plussed”: http://www.readwriteweb.com/archives/worlds_youngest_leading_social_network_eats_worlds.php&lt;/li&gt;
&lt;li&gt;Not much in this one but I love the title: “For me, this is the destruction of the only online space I truly give a shit about”: http://robertodealmeida.wordpress.com/2011/10/25/for-me-this-is-the-destruction-of-the-only-online-space-i-truly-give-a-shit-about/&lt;/li&gt;
&lt;li&gt;a somewhat technical perspective about the impact on the RSS reader ecosystem: http://inessential.com/2011/10/24/google_reader_and_mac_ios_rss_readers_th&lt;/li&gt;
&lt;li&gt;and here’s an RSS app developer making a pragmatic, but sad decision: http://nick.typepad.com/blog/2011/10/what-the-upcoming-google-reader-changes-mean-for-feeddemon.html : ”Google will continue to support those features in its API even after they disappear from Reader’s UI. But at some point (I don’t know when yet) they will cease to function, and you’ll be unable to share articles in FeedDemon or follow the shared articles of other users. Before that happens, I’ll release a new version of FeedDemon that removes those features.”&lt;/li&gt;
&lt;li&gt;and don’t forget to sign the petition by @brettkeller (now &amp;gt;4000 signers): http://bit.ly/GoogleReaderPetition&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.forbes.com/sites/erikkain/2011/10/23/dont-be-evil-a-better-way-to-integrate-google-reader-and-google-plus/"&gt;http://www.forbes.com/sites/erikkain/2011/10/23/dont-be-evil-a-better-way-to-integrate-google-reader-and-google-plus/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.didyoulearnanything.net/2011/10/23/save-google-reader/"&gt;http://www.didyoulearnanything.net/2011/10/23/save-google-reader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://purityanddanger.blogspot.com/2010/10/google-reader.html"&gt;http://purityanddanger.blogspot.com/2010/10/google-reader.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlanticwire.com/technology/2011/10/world-surprisingly-angry-about-end-google-reader/44109/"&gt;http://www.theatlanticwire.com/technology/2011/10/world-surprisingly-angry-about-end-google-reader/44109/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bdkeller.com/2011/10/save-google-reader/"&gt;http://www.bdkeller.com/2011/10/save-google-reader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://techcrunch.com/2011/10/25/iranians-upset-over-google-reader-changes/?utm_source=twitterfeed&amp;amp;utm_medium=twitter"&gt;http://techcrunch.com/2011/10/25/iranians-upset-over-google-reader-changes/?utm_source=twitterfeed&amp;amp;utm_medium=twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.bl00cyb.org/2011/10/farewell-dear-reader/"&gt;http://blog.bl00cyb.org/2011/10/farewell-dear-reader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://journaloftheory.com/2011/10/23/theory-google-is-maiming-the-world%E2%80%99s-only-respectable-social-network-reader-1000/"&gt;http://journaloftheory.com/2011/10/23/theory-google-is-maiming-the-world%E2%80%99s-only-respectable-social-network-reader-1000/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Some Google support threads to weigh in at:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.google.com/support/forum/p/reader/thread?tid=3ae360cc3912946f"&gt;http://www.google.com/support/forum/p/reader/thread?tid=3ae360cc3912946f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(my comments are around &lt;a href="http://www.google.com/support/forum/p/reader/thread?tid=3ae360cc3912946f&amp;amp;hl=en&amp;amp;start=80"&gt;http://www.google.com/support/forum/p/reader/thread?tid=3ae360cc3912946f&amp;amp;hl=en&amp;amp;start=80&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/support/forum/p/reader/thread?tid=08e63a1af9829a1c&amp;amp;hl=en&amp;amp;fid=08e63a1af9829a1c0004afe7a8378fc2"&gt;http://www.google.com/support/forum/p/reader/thread?tid=08e63a1af9829a1c&amp;amp;hl=en&amp;amp;fid=08e63a1af9829a1c0004afe7a8378fc2&lt;/a&gt; “Why is Reader being castrated?” (my preferred term is “neutered”)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Alan Green’s Google Plus id:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://plus.google.com/113760695441101959932/posts"&gt;https://plus.google.com/113760695441101959932/posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/113760695441101959932/posts/Yxj9MquTddH"&gt;https://plus.google.com/113760695441101959932/posts/Yxj9MquTddH&lt;/a&gt; where he closed comments, after hundreds of scared/sad/angry comments from Iranians who use Reader since their government blocks Facebook and Plus&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;My thoughts (which I reserve the right to update at will):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Without “Comment View” Google Reader is just an ugly way to read blogs. I want to read *articles* not entire blog feeds. Which articles? Those selected for me by my friends. Which friends? Those I discovered through their Reader comments.&lt;/p&gt;
&lt;p&gt;Here’s how we use Reader: mostly we open Comment View and read only the articles Noted or Commented by our friends. Then we read our own feeds of blogs, and if we find something we like, we share it. We share it because *&lt;strong&gt;we want to know what our friends think&lt;/strong&gt;* about it. In fact those comments are usually the most important thing, so we &lt;strong&gt;open Comment View&lt;/strong&gt; the next time we use Reader.&lt;/p&gt;
&lt;p&gt;All that is going bye-bye. Or unless I see a mockup or preview or usability flowchart to the contrary, I must assume so.&lt;/p&gt;
&lt;p&gt;Reader is my second inbox. GMail is my first. All the rest (Twitter, Facebook, Plus) are mere streams; raging torrents into which I occasionally dip a toe.&lt;/p&gt;
&lt;p&gt;When I post something on my Tumblr blog — usually a quote or a short comment — I’m pretty sure nobody will see it. When I then *share* that post on Reader, I’m doing so because I *know* a few dozen of my actual friends *will actually read it*, because it’s important to me and I’ve chosen to *Share* it, not just post it.&lt;/p&gt;
&lt;p&gt;The genesis of Plus was an attempt to clone Facebook mixed with an overreaction to the privacy sh-tstorm of Buzz, which in turn was an attempt to clone Twitter. They have no idea how people use Reader — it’s a curated feed *producer* and *aggregator* and reader, with built in comment threads and friend discovery — so I expect they have no idea how to migrate features to a totally different product with different goals and users. &lt;/p&gt;
&lt;p&gt;Does Plus emit RSS per user? Does it emit an aggregate RSS feed of a given circle? &lt;/p&gt;
&lt;p&gt;What about my “Awesome” list, containing the blogs *and friends’ feeds* I know I must read, as opposed to the hundreds of others I subscribe to for when I have time?&lt;/p&gt;
&lt;p&gt;What about Shift-S to share? If I have to click on “Send To”, then wait for a menu, then scan it for a “Plus” icon, then click that, then whoops, now I have to select some circles… well, then I probably just won’t.&lt;/p&gt;
&lt;p&gt;Plus, G+ Circles are pointing in the wrong direction for a social feed mediator. I publish to *topics*, not to *people*. Who has time to curate a list of lists of hundreds of subscribers? And why not let them decide? That’s one reason why Twitter’s Follow model works — you have a public face, whom anyone can subscribe to, and optionally a private face, where you have to approve.&lt;/p&gt;
&lt;p&gt;I would also add that Reader has at least partially solved the Annotation Problem that has bedeviled the Web since at least 1996. Many startups have been sacrificed upon that altar.&lt;/p&gt;
&lt;p&gt;And in response to my several friends who have suggested “just move to another RSS reader,” let me sadly point out that there is no alternative. Reader’s raw feature set is just not available elsewhere, but more importantly, the ecosystem of identity and users provided by Google is something only a Yahoo or a Facebook could provide. And they haven’t. And it’s not just me that would have to move — it’s going to be a diaspora.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;A non-sharebro friend asks:  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;Aren’t there other social reading apps?  Why try to save Reader?  Why&lt;br&gt;not just use some other social reading app?&lt;br&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br&gt;&lt;span&gt;Because Reader has (a) the single signon of your Google ID, (b) the trust that Google has built that it’s a safe place to put your data, and (c) a community that has built customs and lore over many years. &lt;/span&gt;(b) is particularly galling since this move betrays that trust.&lt;/p&gt;
&lt;p&gt;And btw every one of my sharebros is looking for “just some other social reading app” and there is none, at least none that work anywhere close.&lt;/p&gt;
&lt;p&gt;—-&lt;/p&gt;
&lt;p&gt;Update: I just thought of the term “Stepford Wifing” (instead of “maim” or “neuter” or “castrate” or “eviscerate” or “zombify” or “plussize” or “clicky clicky”) to describe what they’re doing to Reader — but they’re all pretty apt.&lt;/p&gt;
&lt;p&gt;Look here, Google, we’re not against people using G+. Some of us already do. But we want integration through the back end, not a forced relocation. All you need to do to fix Google Reader is:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;make it prettier (duh)&lt;/li&gt;
&lt;li&gt;rename “People You Follow” to “Shares” and move it down with the other subscriptions, but on the top of the list&lt;/li&gt;
&lt;li&gt;make a “G+ Integration” setting that turns a Reader shared item into a G+ post&lt;/li&gt;
&lt;li&gt;sync the comments back and forth between G+ and Reader items you shared&lt;/li&gt;
&lt;li&gt;allow people to subscribe to friends’ G+ feeds inside reader as RSS, just like we already can with Twitter feeds&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That last especially would enable Reader to become a gateway to G+, allowing people to switch over at their own pace.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/oBvr-3cSePU" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://alexch.tumblr.com/rss"><id>tag:google.com,2005:reader/feed/http://alexch.tumblr.com/rss</id><title type="html">alexch&amp;#39;s almanac</title><link rel="alternate" href="http://alexch.tumblr.com/" type="text/html" /></source><feedburner:origLink>http://alexch.tumblr.com/post/11868074433</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319510004622"><id gr:original-id="7193">tag:google.com,2005:reader/item/f986cf48db822489</id><category term="CodeSOD" /><title type="html">CodeSOD: The Query of Despair</title><published>2011-10-24T13:00:00Z</published><updated>2011-10-24T13:00:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/KdXI-iyq18w/The-Query-of-Despair.aspx" type="text/html" /><summary xml:base="http://thedailywtf.com/" type="html">&lt;p&gt;&lt;b&gt;Jeroen&lt;/b&gt;&amp;#39;s colleague had the misfortune of being assigned to debug an intermittent, unspecified error in the one of the oldest of the legacy applications. &amp;quot;The good news is that I&amp;#39;ve isolated it to a database query,&amp;quot; he told Jeroen, &amp;quot;the bad news is that I&amp;#39;ve isolated it to a database query.&amp;quot;&lt;/p&gt;
&lt;p&gt;Knowing that his colleague wasn't a big fan of databases, Jeroen offered his assistance. In response, he received the following image.&lt;/p&gt;
&lt;p style="margin-left:40px"&gt;&lt;img alt="" src="http://img.thedailywtf.com/images/201110/query.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;I don&amp;#39;t think anyone can help me,&amp;quot; the his colleague wrote.&lt;/p&gt;&lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/iboioueglnmiqal0k0nsmcvarc/300/250#http%3A%2F%2Fthedailywtf.com%2FArticles%2FThe-Query-of-Despair.aspx" width="100%" height="250" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://syndication.thedailywtf.com/~ff/TheDailyWtf?a=KdXI-iyq18w:g14CDGpOLcg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheDailyWtf?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheDailyWtf/~4/KdXI-iyq18w" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/KdXI-iyq18w" height="1" width="1"/&gt;</summary><author><name>Alex Papadimoulis</name></author><source gr:stream-id="feed/http://syndication.thedailywtf.com/TheDailyWtf"><id>tag:google.com,2005:reader/feed/http://syndication.thedailywtf.com/TheDailyWtf</id><title type="html">The Daily WTF</title><link rel="alternate" href="http://thedailywtf.com/" type="text/html" /></source><feedburner:origLink>http://thedailywtf.com/Articles/The-Query-of-Despair.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319509944310"><id gr:original-id="">tag:google.com,2005:reader/item/8d516c9dc799b2af</id><title type="html">Anonymous takes down darknet child porn site on Tor network</title><published>2011-10-25T02:32:24Z</published><updated>2011-10-25T02:32:24Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/tVtVRek62vM/anonymous-takes-down-darknet-child-porn-site-on-tor-network.ars" type="text/html" /><link rel="related" href="http://arstechnica.com/" title="arstechnica.com" /><content xml:base="http://arstechnica.com/business/news/2011/10/anonymous-takes-down-darknet-child-porn-site-on-tor-network.ars?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss" type="html">&lt;blockquote&gt;Shared by  Alex Chaffee 
&lt;br&gt;
"Anonymous’ hackers were able to exploit the PHP site with a SQL injection attack and extract the user database before launching a denial of service attack. “The server was using hardened PHP with escaping,” Anonymous said in its statement. “We were able to bypass it with with UTF-16 ASCII encoding.”"&lt;/blockquote&gt;
&lt;div&gt;&lt;span&gt;By &lt;a rel="author" href="http://arstechnica.com/author/sean-gallagher/"&gt;Sean Gallagher&lt;/a&gt;
&lt;/span&gt; | &lt;span&gt;&lt;span&gt;&lt;span&gt;Published &lt;/span&gt; &lt;abbr&gt;11 minutes ago&lt;/abbr&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
        
      &lt;div style="width:640px"&gt;  
  &lt;img width="640" src="http://static.arstechnica.net/assets/2011/10/new_york_comic_con-23-4ea462e-intro-thumb-640xauto-26969.jpg" alt="Anonymous takes down darknet child porn site on Tor network"&gt; 
  
  &lt;/div&gt;

        &lt;div&gt;          
        
        &lt;p&gt;Pedophiles connecting to a concealed child pornography site got an unwelcome surprise last week, courtesy of the hacktivist group Anonymous. Lolita City, a child pornography site run on over a concealed “&lt;a href="http://arstechnica.com/old/content/2006/08/7502.ars"&gt;darkne&lt;/a&gt;t,” has been taken down by Anonymous members, and account details of 1,589 users from the site’s database were posted as evidence. &lt;/p&gt;&lt;p&gt;The takedown is part of Anonymous’ &lt;a href="http://youtu.be/aFuJp_zPIlU"&gt;Operation Darknet&lt;/a&gt;, an anti-child-pornography effort aimed at thwarting child pornographers operating on on the &lt;a href="https://www.torproject.org/about/overview.html.en"&gt;Tor network&lt;/a&gt;. Anonymous’ attack was focused on a hosting service called Freedom Hosting, which the group claims was the largest host of child pornography on Tor’s anonymized network. “By taking down Freedom Hosting, we are eliminating 40+ child pornography websites,” Anonymous claimed &lt;a href="http://pastebin.com/T1LHnzEW"&gt;in its statement&lt;/a&gt;. “Among these is Lolita City, one of the largest child pornography websites to date, containing more than 100GB of child pornography.”&lt;/p&gt;&lt;p&gt;Based
 on a secure networking technology originally developed by the
 US Navy, Tor routes traffic through a collection of volunteer
 servers scattered across the Internet, making monitoring of
 what is being viewed or where communications are coming from
 difficult. The Tor network also hosts a private “dark”
 top-level domain, .onion (which is not an official TLD), via its &lt;a href="https://www.torproject.org/docs/hidden-services.html.en"&gt;Hidden
 Service Protocol&lt;/a&gt;; these sites are visible only to Tor
 users or those using a Tor gateway such as &lt;a href="http://tor2web.org"&gt;tor2web.org&lt;/a&gt;.&lt;/p&gt;
 &lt;p&gt; Because
 of its anonymity, Tor is widely used by individuals and groups seeking to communicate without being surveilled by authorities, employers, or eavesdroppers watching packets on
 public WiFi networks, as well as those wishing to visit websites anonymously without having their IP address recorded. According to the Tor Project’s own metrics, the service has
 recently been averaging over 400,000 users per day. &lt;/p&gt;
 &lt;p&gt; The
 Tor network was &lt;a href="http://www.readwriteweb.com/hack/2011/01/egypt-tor-use-skyrocketing-as.php"&gt;heavily
 used in Egypt&lt;/a&gt; earlier this year by dissidents to get
 around the Mubarak regime’s Internet shut-down, and is used by
 &lt;a href="http://translate.google.com/translate?hl=en&amp;amp;sl=ar&amp;amp;u=http://anonymoussyria.blogspot.com/2011/07/tor.html&amp;amp;ei=UESkTrOnO4La0QHN4PnIBQ&amp;amp;sa=X&amp;amp;oi=translate&amp;amp;ct=result&amp;amp;resnum=2&amp;amp;ved=0CCQQ7gEwAQ&amp;amp;prev=/search?q=tor+syria&amp;amp;hl=en&amp;amp;client=safari&amp;amp;rls=en&amp;amp;prmd=imvns"&gt;bloggers
 in Syria&lt;/a&gt; to communicate with the outside world. The
 network is also used by some who want to publish other sorts
 of material and conceal themselves from prying eyes, including
 pirated movie and software torrent publishers (which has made some Tor server providers the target of &lt;a href="https://www.torservers.net/wiki/abuse/dmca?redirect=1"&gt;DMCA takedown notices&lt;/a&gt;). It&amp;#39;s also attracted child
 pornographers and the pedophiles who are their customers.  &lt;/p&gt;
 &lt;p&gt; However,
 as revealed last December, &lt;a href="http://arstechnica.com/tech-policy/news/2010/12/flaws-in-tor-anonymity-network-spotlighted.ars"&gt;the
 anonymity offered by Tor isn’t foolproof.&lt;/a&gt; While the IP
 addresses of sites on the Tor network are concealed, they have
 a digital fingerprint that can be used to identify services
 hosted from a single location, and track visits to that site.
 And while it blocks some services that are typically used for
 denial of service attacks and other hacks within the Tor
 networks, such as UDP, .onion sites remain just as vulnerable
 to hacking as sites on the open Internet. &lt;/p&gt;
 &lt;p&gt;The
 Anonymous operation against Lolita City began on October 14,
 when members discovered links to child pornography on a .onion
 site called The Hidden Wiki. According to the group’s
 statement, Anonymous members removed the links, but they were
 reposted by a site administrator. Anonymous then moved to shut
 down the site with a denial of service attack. Additionally,
 the hackers matched the digital fingerprints of links on the
 site to Freedom Hosting. After sending a message demanding
 that the hosting service remove the content, Anonymous’
 hackers were able to exploit the PHP site with a SQL injection
 attack and extract the user database before launching a denial
 of service attack. “The server was using hardened PHP with
 escaping,” Anonymous said in its statement. “We were able to
 bypass it with with UTF-16 ASCII encoding.”&lt;/p&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/tVtVRek62vM" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">"Anonymous’ hackers were able to exploit the PHP site with a SQL injection attack and extract the user database before launching a denial of service attack. “The server was using hardened PHP with escaping,” Anonymous said in its statement. “We were able to bypass it with with UTF-16 ASCII encoding.”"</content><author gr:user-id="15504357426492542506" gr:profile-id="107397735779828096052"><name>Alex Chaffee</name></author></gr:annotation><source gr:stream-id="user/15504357426492542506/source/com.google/link"><id>tag:google.com,2005:reader/user/15504357426492542506/source/com.google/link</id><title type="html">arstechnica.com</title><link rel="alternate" href="http://arstechnica.com/" type="text/html" /></source><feedburner:origLink>http://arstechnica.com/business/news/2011/10/anonymous-takes-down-darknet-child-porn-site-on-tor-network.ars?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319503680506"><id gr:original-id="">tag:google.com,2005:reader/item/eb24627d25c8cb0e</id><title type="html">Anonymous doxes Bank of America CEO</title><published>2011-10-25T00:48:00Z</published><updated>2011-10-25T00:48:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/0_e6UbZaT0k/anonymous-leaks-bank-of-america-ceos-personal-contact-info.ars" type="text/html" /><link rel="related" href="http://arstechnica.com/index.php" title="Ars Technica" /><content xml:base="http://feeds.arstechnica.com/~r/arstechnica/everything/~3/rWCT-QoVYYs/anonymous-leaks-bank-of-america-ceos-personal-contact-info.ars" type="html">&lt;blockquote&gt;Shared by  Nick Novitski 
&lt;br&gt;
I'm in favor of dox becoming common language.&lt;/blockquote&gt;
&lt;a href="http://arstechnica.com/tech-policy/news/2011/10/anonymous-leaks-bank-of-america-ceos-personal-contact-info.ars?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=rss"&gt;
  &lt;img vspace="4" hspace="4" border="0" align="right" width="230" height="129" src="http://static.arstechnica.net/brief_icons_new/tech-policy-brief.png"&gt;
  &lt;/a&gt;

		        
    &lt;p&gt;Anonymous&amp;#39; “CabinCr3w” group has upped its information warfare efforts in support of the Occupy Wall Street movement by publishing the personal contact information of Bank of America CEO Brian Moynihan, including his personal phone number, on &lt;a href="http://tumblr.com/ZGRLpwB2BBq3"&gt;its Tumblr blog&lt;/a&gt;.  Moynihan is just the latest target in an ongoing campaign to embarrass financial sector CEOs.  &lt;/p&gt;
&lt;p&gt;Last week, the group published the personal information of CitiGroup CEO Vikram S. Pandit (such as his wife’s name, his address and the value of his home, his personal cell phone number, and details of lawsuits he is listed as a defendant in), as well as those of Project Veritas’s James O’Keefe (including contact information for his probation officer). Other targets have included Goldman Sachs chairman Lloyd Blankfien. The CabinCr3w group of Anonymous has also been involved in the hacking activities targeting the &lt;a href="http://arstechnica.com/tech-policy/news/2011/08/did-bart-pull-a-mubarak-in-san-francisco.ars"&gt;Bay Area Rapid Transit District&lt;/a&gt; after BART shut down cell phone access to riders.&lt;/p&gt;
&lt;p&gt;Last week, Anonymous hackers also &lt;a href="http://pastebin.com/qDGLvDns"&gt;leaked data from the International Association of Chiefs of Police&lt;/a&gt;, the Boston Police Patrolmen’s Association, and two Alabama law enforcement organizations as part of a protest against police brutality corresponding with the IACP’s annual conference in Chicago. Some of the data, including Social Security numbers, has been taken down.&lt;/p&gt;    
        
    


      &lt;p&gt;&lt;a href="http://arstechnica.com/tech-policy/news/2011/10/anonymous-leaks-bank-of-america-ceos-personal-contact-info.ars?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=rss&amp;amp;comments=1#comments-bar"&gt;Read the comments on this post&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/p5t6ra2auo51hja7iblc9aiftc/300/250?ca=1&amp;amp;fh=280#http%3A%2F%2Farstechnica.com%2Ftech-policy%2Fnews%2F2011%2F10%2Fanonymous-leaks-bank-of-america-ceos-personal-contact-info.ars%3Futm_source%3Drss%26utm_medium%3Drss%26utm_campaign%3Drss" width="100%" height="280" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arstechnica/everything/~4/rWCT-QoVYYs" height="1" width="1"&gt;
&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/0_e6UbZaT0k" height="1" width="1"/&gt;</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">I'm in favor of dox becoming common language.</content><author gr:user-id="03356622724316192218" gr:profile-id="112075464466318478870"><name>Nick Novitski</name></author></gr:annotation><source gr:stream-id="user/03356622724316192218/source/com.google/link"><id>tag:google.com,2005:reader/user/03356622724316192218/source/com.google/link</id><title type="html">Ars Technica</title><link rel="alternate" href="http://arstechnica.com/index.php" type="text/html" /></source><feedburner:origLink>http://feeds.arstechnica.com/~r/arstechnica/everything/~3/rWCT-QoVYYs/anonymous-leaks-bank-of-america-ceos-personal-contact-info.ars</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319432569989"><id gr:original-id="tag:blogs.harvardbusiness.org,2007-03-31:126.10190">tag:google.com,2005:reader/item/89ad2658588db52a</id><category term="Apple" scheme="http://www.sixapart.com/ns/types#category" /><category term="Boards" scheme="http://www.sixapart.com/ns/types#category" /><category term="Leadership" scheme="http://www.sixapart.com/ns/types#category" /><title type="html">Steve Jobs and the Purpose of the Corporation</title><published>2011-10-12T16:46:00Z</published><updated>2011-10-13T21:32:39Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/Ti6Q2b0ubYc/steve_jobs_and_the_purpose_of.html" type="text/html" /><link rel="canonical" href="http://blogs.hbr.org/cs/2011/10/steve_jobs_and_the_purpose_of.html" /><content xml:base="http://blogs.hbr.org/cs/" xml:lang="en" type="html">&lt;p&gt;In the torrent of commentary following Steve Jobs&amp;#39; death, few have noted that his career and his company say something profound in the endless debate about the purpose of the corporation. Apple existed to &amp;quot;delight customers&amp;quot; first — benefits to other stakeholders, including shareholders, followed.&lt;/p&gt;

&lt;p&gt;For more than a quarter century, the mantra, of course, has been that corporations' primary focus should be on shareholders and the primary goal should be to "maximize shareholder value." The famous &lt;a href="http://academic.research.microsoft.com/Paper/1253757.aspx"&gt;Michael Jensen and William Meckling article &lt;/a&gt;in 1976 argued that the solution to the principal-agency problem — business leaders advance their own interests not those of shareowners — was to make the goal of the corporation the highest return to shareholders and to align shareholders and business leaders through stock options grants.&lt;/p&gt;

&lt;p&gt;Although many business people and business school professors would still say that maximizing shareholder value should be the goal of the corporation, there have also been many critics over the years. Among the questions they raise: shareholder value over what time frame? Does stock price accurately reflect intrinsic value? How does the concept help business people make critical trade-offs between short and long term or between competing, legitimate concerns of stakeholders — employees, suppliers, customers and shareowners? &lt;/p&gt;

&lt;p&gt;One of the most recent and most trenchant critiques comes from &lt;a href="http://rogerlmartin.com/about/bio/"&gt;Roger Martin&lt;/a&gt;, dean of the Rotman School of Management at the University of Toronto, in his book &lt;em&gt;&lt;a href="http://rogerlmartin.com/library/books/fixing-the-game/"&gt;Fixing the Game &lt;/a&gt;&lt;/em&gt;(Harvard Business Review Press 2011). 	In essence, Martin argues that agency theory and the goal of maximizing "shareholder value" have had significant and harmful side effects. Pressures from institutional investors for stock price increases, as well as stock-based compensation for executives, have led many business leaders to manage to  the "expectations market" of the public stock exchanges. This in turn has led to narrow short-termism, accounting manipulation, cutting of ethical and legal corners, failures to invest in the long-term, and to the financial crisis. (For my co-authored account of problems raised by the rising power, and new types of, institutional investors see &lt;a href="http://millstein.som.yale.edu/sites/millstein.som.yale.edu/files/80235_CED_WEB.pdf"&gt;"Are Institutional Investors Part of the Problem or Part of the Solution."&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;Martin argues that, instead, the primary purpose of the corporation should be a return to management in the "real market," not the "expectations market," and that this means "customers are the focus, and the central task of companies is to find ever better ways of serving them." Martin's manifesto is: "We must shift the focus of companies back to the customer and away from shareholder value. In other words, we must turn our attention back to the real market and away from the expectations market. &lt;em&gt;This shift necessitates a fundamental change in our prevailing theory of the firm&lt;/em&gt;." (Emphasis mine.) Martin cites Thomas Edison and Henry Ford as people who created customer value through "innovations in products, services and business models.&lt;/p&gt;

&lt;p&gt;And, of course, Steve Jobs. Without repeating the hundreds of thousands of words written about Jobs and Apple since his death, there can be no question that his deep commitment was to make innovative, robust and beautiful products that delighted customers. He took the time necessary to meet his own exacting standards. He spent extra funds to ensure that the product was right (replacing plastic with glass on the iPhone, for example). He believed deeply in his own capacity to define new products that customers didn't even know they wanted, in the process overturning other real markets in, for example, personal computers, music, cell phones, tablet computing and animated movies.&lt;/p&gt;

&lt;p&gt;At least in my view, there can also be no question that Jobs was not focused on shareholders or taking short-cuts or short-term actions to maximize shareholder value.   Apple has paid no dividends since 1995. It hasn't used leverage. It holds $76 billion in cash with nary a thought of a buy-back. It is hard to argue that fundamental business decisions were driven by stock options (although there is the issue of options back-dating in the debit column).&lt;/p&gt;

&lt;p&gt;Obviously, Apple shareholders have done just fine, with Apple and ExxonMobil today changing places back and forth as the U.S. company with the highest market cap. Yet this has been a long process of product design, introduction and success. Ten years ago, Apple was not even in the top 100 U.S. companies by market cap ($7B then; around $340B now). And dramatic increases have occurred in the last five years as the suite of Apple products gained popularity (with share price quadrupling in that period). &lt;/p&gt;

&lt;p&gt;But this is at it should be. Those, like Roger Martin, who argue that the purpose of the company should be to create goods and services that serve important customer needs — and to do so with efficiency, risk management and integrity — would further say that the long term shareholder value will follow, as it has in Apple&amp;#39;s case.&lt;/p&gt;

&lt;p&gt;So, as people reflect on &lt;a href="http://blogs.hbr.org/cs/2011/10/how_good_was_steve_jobs_really.html"&gt;Steve Jobs' legacy&lt;/a&gt;, surely one fundamental issue should be his attitude toward corporate purpose — with his devotion to customers, not shareholders, and his ability to withstand short-term pressures in the name of product excellence. As he enters the pantheon of great business leaders, it is hard to argue against his vision of the purpose of the corporation, given his remarkable success in carrying it out.  Future debates on this fundamental subject must put Jobs&amp;#39; conception at center stage.&lt;br&gt;
&lt;/p&gt;
      
   &lt;div&gt;
&lt;a href="http://feeds.harvardbusiness.org/~ff/harvardbusiness?a=Xxz3SXVMvFE:wTyHhAI2ww4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harvardbusiness?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.harvardbusiness.org/~ff/harvardbusiness?a=Xxz3SXVMvFE:wTyHhAI2ww4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harvardbusiness?d=bcOpcFrp8Mo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harvardbusiness/~4/Xxz3SXVMvFE" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/Ti6Q2b0ubYc" height="1" width="1"/&gt;</content><author><name>Ben W. Heineman, Jr.</name></author><source gr:stream-id="feed/http://feeds.harvardbusiness.org/harvardbusiness/"><id>tag:google.com,2005:reader/feed/http://feeds.harvardbusiness.org/harvardbusiness/</id><title type="html">HBR.org</title><link rel="alternate" href="http://blogs.hbr.org/" type="text/html" /></source><feedburner:origLink>http://feeds.harvardbusiness.org/~r/harvardbusiness/~3/Xxz3SXVMvFE/steve_jobs_and_the_purpose_of.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319431842166"><id gr:original-id="http://www.dadhacker.com/blog/?p=1585">tag:google.com,2005:reader/item/f5fcf8e0e4aa2e07</id><category term="Uncategorized" /><title type="html">Bad Timing</title><published>2011-10-24T04:35:57Z</published><updated>2011-10-24T04:35:57Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/mArmDcGCCWc/" type="text/html" /><content xml:base="http://www.dadhacker.com/blog" type="html">&lt;p&gt;A cow-orker of mine once bragged about the DateTime class he’d written.  “It’s fantastic,” he said, “It handles dates from 10,000 BC to 10K AD, down to the millisecond. It does all the correct calendar conversions.  It knows about September, 1752. We don’t have to worry about our time API now.” He left the company a couple months later, and we shipped and started getting bugs from customers.&lt;/p&gt;
&lt;p&gt;Most of the features he’d written were great on paper, but he’d never written effective unit tests. The code had a bottleneck that funneled everything through Unix time functions. Nothing prior to 1970 worked, nor anything past the Day of Armageddon in 2038. There was code to handle leap years, but it failed every 100 years.&lt;/p&gt;
&lt;p&gt;I rolled up my sleeves and got into it. It was surprisingly hard to get it right. I spent about two weeks writing unit tests and making the thing work as advertised. Our start-up had a really neat smart messaging protocol with date/time as a basic type — we figured that since so many of our customers were getting it wrong, that we’d get it right and leverage that as a feature.&lt;/p&gt;
&lt;p&gt;Something about “Those whom the Gods destroy they first make proud,” right. This is a class of problem that everyone knows is trivial. “Of course I know how to do this,” you probably think to yourself, “This is trivial, I can just code this thing up and have an early lunch.” &lt;em&gt;Trivial&lt;/em&gt; is the most dangerous word in all of computerdom, it’s a misprounciation of “Evil”. Your blood should run cold if you hear it spoken out loud, because the Gods will be listening carefully and taking notes on how to screw you if they ever hear you say it.&lt;/p&gt;
&lt;p&gt;When you deal with time, you have a number of choices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the range of times you handle? Computer-era scale? Human (historical) scale? Geologic scale? Ridiculous death of the universe ranges, when protons have decayed, all galaxy-sized black holes have utterly evaporated and even Twinkies have gone a little stale?&lt;/li&gt;
&lt;li&gt;What resolution do you need? Particle accelerators probably need jillionths of femtoseconds, for instance. Computer-scale times are probably on the order of hundreds of nanoseconds. Human-perceptible and most real-time processing can be done in milliseconds. Geologists don’t give a shit about a stretch of time less than a hundred thousand years.&lt;/li&gt;
&lt;li&gt;What about daylight savings time? Time zones? Leap seconds? All the people who get this stuff wrong in the real world?&lt;/li&gt;
&lt;li&gt;Do you need the ability to compare times? (This becomes an issue when you deal with some other time formats, for instance OLE uses floating point numbers, days since some epoch, and fractions of a day, and so representing 10AM exactly is impossible).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s just time; we’re not even getting into “date” issues like calendars, or holidays. Holidays are serial nightmares on roller skates.&lt;/p&gt;
&lt;p&gt;I believe that most programmers (including this one) do not really understand time. It gets worse, though, when you have to deal with a hardware clock that was designed by a hardware engineer who not only did not understand time, but also failed to devise a way to reliably extract it from the circuit he designed.&lt;/p&gt;
&lt;p&gt;“You set the Freeze register and wait, then read the value.”&lt;/p&gt;
&lt;p&gt;“How long do I wait?”&lt;/p&gt;
&lt;p&gt;“Um . . . about, well, a &lt;em&gt;while&lt;/em&gt;.”&lt;/p&gt;
&lt;p&gt;“How long is a &lt;em&gt;while&lt;/em&gt;, given that this is the hardware that’s supposed to be telling me how much time is passing?”&lt;/p&gt;
&lt;p&gt;“I guess you can just delay or something.”&lt;/p&gt;
&lt;p&gt;So one of us is going to Hell because we have to turn off interrupts and spin for half an eternity, just to find out what time it isn’t any more. That tick you were interested in? Sorry, it happened while we were busy waiting for some moron of a flip-flop to make up its mind. See you last year.&lt;/p&gt;
&lt;p&gt;Recommended reading: &lt;a href="http://www.amazon.com/Calendrical-Calculations-Nachum-Dershowitz/dp/0521702380"&gt;Calendrical Calculations&lt;/a&gt;. This is a really great treatment of time and calendars, and if you are writing any code in this area you should definitely read the first few chapters and then crawl under a desk and quiver, wondering how anybody gets this stuff right, ever.&lt;/p&gt;
&lt;p&gt;Oh, and personal to &lt;em&gt;you-know-who-you-are&lt;/em&gt;: I hope you are writing some bloody unit tests now. Right? Okay?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/mArmDcGCCWc" height="1" width="1"/&gt;</content><author><name>landon</name></author><source gr:stream-id="feed/http://www.dadhacker.com/blog/?feed=rss2"><id>tag:google.com,2005:reader/feed/http://www.dadhacker.com/blog/?feed=rss2</id><title type="html">Dadhacker</title><link rel="alternate" href="http://www.dadhacker.com/blog" type="text/html" /></source><feedburner:origLink>http://www.dadhacker.com/blog/?p=1585</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319426311144"><id gr:original-id="http://labnotes.org/?p=1624">tag:google.com,2005:reader/item/e19aeab17cd0bc00</id><category term="general" scheme="http://labnotes.org" /><title type="html">Rounded Corners 296 – Don’t bother using git blame. It was you.</title><published>2011-10-24T02:15:03Z</published><updated>2011-10-24T02:15:03Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/pivotal-news-network/~3/uTRtmPpLBM0/" type="text/html" /><link rel="replies" href="http://labnotes.org/2011/10/23/rounded-corners-296-%E2%80%93-dont-bother-using-git-blame-it-was-you/#comments" type="text/html" /><link rel="replies" href="http://labnotes.org/2011/10/23/rounded-corners-296-%E2%80%93-dont-bother-using-git-blame-it-was-you/feed/atom/" type="application/atom+xml" /><content xml:base="http://labnotes.org/2011/10/23/rounded-corners-296-%E2%80%93-dont-bother-using-git-blame-it-was-you/" xml:lang="en" type="html">&lt;p&gt;&lt;a href="http://instagr.am/p/P7rAH/"&gt;&lt;img title="How to make decisions" src="http://distillery.s3.amazonaws.com/media/2011/10/12/f4ee0c8f5faf4452a82fc3ef45e523af_7.jpg" alt="" width="367" height="367"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Streaming&lt;/strong&gt; &lt;a href="http://siriux.net/2011/10/current-state-of-node-js-websocket-modules/"&gt;Current state of Node.js WebSocket modules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Resque way&lt;/strong&gt; &lt;a href="http://www.engineyard.com/blog/2011/the-resque-way/"&gt;Lots of good info about Resque&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UNIX power&lt;/strong&gt; Oh, the &lt;a href="http://danielmiessler.com/study/lsof/"&gt;cool things you can do with lsof&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measure&lt;/strong&gt;&lt;a href="http://aq.iriscouch.com/swinger/_design/swinger/index.html#/preso/aq-mdd/display/1"&gt; Metrics and you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go fast&lt;/strong&gt; Speeding things up using &lt;a href="http://fennb.com/microcaching-speed-your-app-up-250x-with-no-n"&gt;Nginx and microcaching&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QotD &lt;/strong&gt;&lt;a href="https://twitter.com/#!/locks/status/127206420553805824"&gt;Ricardo Mendes&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Ricardo’s Law: don’t bother using git blame. it was you.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/pivotal-news-network/~4/uTRtmPpLBM0" height="1" width="1"/&gt;</content><author><name>Assaf</name></author><source gr:stream-id="feed/http://blog.labnotes.org/feed/atom/"><id>tag:google.com,2005:reader/feed/http://blog.labnotes.org/feed/atom/</id><title type="html">Labnotes</title><link rel="alternate" href="http://labnotes.org/" type="text/html" /></source><feedburner:origLink>http://labnotes.org/2011/10/23/rounded-corners-296-%E2%80%93-dont-bother-using-git-blame-it-was-you/</feedburner:origLink></entry></feed>
