<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
   <channel>
      <title>All Yang's Subscriptions</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=0tn5f2MV3RGk8DsIYEsBXw</link>
      <pubDate>Tue, 24 Nov 2009 01:30:59 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Facebook Tips: How do I find and &quot;fan&quot; a Page?</title>
         <link>http://blog.facebook.com/blog.php?post=185405397130</link>
         <description>&lt;i&gt;The following is part of our series, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=113716697130&quot;&gt;Facebook Tips&lt;/a&gt;, which answers some of the most commonly asked questions about using Facebook. While we hope the tips we share on the blog will be informative, remember that we are unable to answer individual questions here. We'll always direct you to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/help.php&quot;&gt;Help Center&lt;/a&gt; for additional information about the topics we cover.&lt;/i&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
In the same way that profiles on Facebook help you connect with friends, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/pages&quot;&gt;Facebook Pages&lt;/a&gt; allow you to interact with and stay up-to-date on your favorite public figures, organizations and businesses. When you become a fan of a Page, you are connecting with that organization or public figure and will begin seeing status updates, photos, videos and other posts from the Page.&lt;br&gt;
&lt;br&gt;
All of the posts from Pages will appear in your home page just as they would from your friends. You can get access to videos from your favorite band, chat live with your favorite celebrity, or even get a sneak peek of new products being launched by your favorite brand through Facebook Pages.&lt;br&gt;
&lt;br&gt;
There are several ways to find and become a fan of your favorite Page:&lt;br&gt;
&lt;ol&gt;&lt;li&gt;Type the name of the celebrity, artist, brand or organization in the Search box in the upper-right corner of any page on Facebook. From the results page, select the the Pages filter in the left-side menu to show only Page results. Click the &quot;Become a Fan&quot; link next to the Page name and posts from that Page will begin appearing on your home page. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;If you already know the web address, or URL, of the Page you want, simply type it in the address bar of your web browser. For instance, to find Vin Diesel on Facebook, you can navigate directly to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/VinDiesel&quot;&gt;www.facebook.com/VinDiesel&lt;/a&gt;. From there, select the &quot;Become a Fan&quot; button next to the Page's name. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;You also can become a fan of a Page that you discover from your friends' recent connections. For example, if you see a News Feed story about your friend becoming a fan of the iTunes Page, you can connect with it by clicking the &quot;Become a Fan&quot; link within the story or click on the name of the Page to check it out further.&lt;/li&gt;&lt;/ol&gt;Once you're a fan of a Page, it is listed on your profile and is included in the list of Pages you're a fan of that's viewable to &quot;everyone&quot; unless you have changed your &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/privacy/?ref=blog#/privacy/?view=search&quot;&gt;Search&lt;/a&gt;&quot; privacy settings.&lt;br&gt;
&lt;br&gt;
Remember that you always have the option to remove yourself as a fan of any Page if you want to stop receiving updates or no longer want to be connected. Go to the Page and click on the link &quot;Remove me from Fans&quot; at the bottom of the left-side menu.&lt;br&gt;
&lt;br&gt;
Check out the nearly 1.4 million active Pages on Facebook at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/pages&quot;&gt;www.facebook.com/pages&lt;/a&gt; to start connecting and interacting with your favorite celebrities, political leaders, media outlets, non-profit organizations, TV shows, musicians, and much more. &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Morin, who works on Facebook's user operations team specializing in Pages, just became a fan of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/ibissboutique&quot;&gt;Ibiss Boutique&lt;/a&gt;.&lt;/i&gt;</description>
         <author>Morin Cynthia Oluwole</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/c1fd0576848d840e</guid>
         <pubDate>Mon, 23 Nov 2009 11:11:05 -0800</pubDate>
      </item>
      <item>
         <title>The Mass Animation of a Hollywood Short</title>
         <link>http://blog.facebook.com/blog.php?post=182576587130</link>
         <description>&lt;i&gt;Yair Landau is the former president of Sony Pictures Digital and the director of a new animated short opening today called &quot;Live Music.&quot; We asked Landau to share the story behind Live Music's creation as the first production from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/massanimation&quot;&gt;Mass Animation,&lt;/a&gt; a worldwide crowdsourcing of animation on Facebook done in partnership with Intel, Dell, Autodesk and Reel FX Entertainment.&lt;/i&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;
When moviegoers sit down in select theaters tonight to see the opening of the new animated feature &quot;Planet 51,&quot; they first will be greeted with a 5-minute, computer-animated short that resulted from the collaboration on Facebook of 58,000 people from 101 countries. Set in a musical instrument shop, the short &quot;Live Music &quot; tells the story of Riff, a rock 'n' roll guitar, who falls in love to the wrong song but ends up with Vanessa, the classical violin of his dreams. &lt;br&gt;
&lt;br&gt;
What makes this short unique is that it is the first result from an ambitious project called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/massanimation&quot;&gt;Mass Animation&lt;/a&gt; to collaboratively create animation on Facebook. Started in August 2008, Mass Animation enabled animators from around the globe to join the creative process from anywhere. They could animate with tools and models provided through Mass Animation, submit and view them through an application on Facebook and vote on the best animated shots. In the end, 51 animators' shots were selected for inclusion in &quot;Live Music.&quot; &lt;br&gt;
&lt;br&gt;
As someone who's been involved in moviemaking for 19 years, I was passionate about Mass Animation because I realized it could open the animation process to a wider array of creative people. The premiere of &quot;Live Music&quot; marks a milestone for animated film because it shows that you can have an impact on the creative process no matter where you live in the world. Social media—and specifically Facebook in this project—enabled us to connect with animators we never would have reached before. &lt;br&gt;
&lt;br&gt;
As participating animator Cyrus Cords put it, &quot;In the middle of Minnesota opportunities like this don't happen.&quot; &lt;br&gt;
&lt;br&gt;
The selected animators hailed form 17 different countries—ranging from Australia, Brazil and Russia to India, Kazakhstan and the U.S. —were between the ages of 14 and 48, and were composed of over 20 percent women. &lt;br&gt;
&lt;br&gt;
Animator Gregory Naud of Belgium said he found the experience motivating. &quot;It's cool to be part of a big international project,&quot; he said. &quot;For those who don't have the chance to work in USA, for example, it was a great opportunity.&quot; &lt;br&gt;
&lt;br&gt;
I hope you'll be as inspired by the short as we were in creating it through mass collaboration on Facebook. Take your own peak behind-the-scenes of its production by checking out the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/massanimation&quot;&gt;Mass Animation Facebook Page&lt;/a&gt; and watching the video below. Don't forget to download &quot;Live Music&quot; today from iTunes and for your mobile from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.myxer.com&quot;&gt;Myxer&lt;/a&gt; to watch the full short.&lt;br&gt;
&lt;br&gt;
&lt;iframe class=&quot;embeddedvideo&quot; src=&quot;http://www.youtube.com/v/Ch8AUe12ytE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot; width=&quot;425&quot; height=&quot;344&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/iframe&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Yair is stoked about the release of &quot;Live Music&quot; and grateful to all the talented people who made it happen.&lt;/i&gt; &lt;br&gt;</description>
         <author>Yair Landau</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e0538fa0aed9f9bb</guid>
         <pubDate>Fri, 20 Nov 2009 10:10:12 -0800</pubDate>
      </item>
      <item>
         <title>Facebook Engineering Bootcamp</title>
         <link>http://www.facebook.com/note.php?note_id=177577963919</link>
         <author>Facebook Engineering</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e56ab69806a01495</guid>
         <pubDate>Thu, 19 Nov 2009 16:51:53 -0800</pubDate>
      </item>
      <item>
         <title>Optimizing asset bundling and serving with Rails</title>
         <link>http://github.com/blog/551-optimizing-asset-bundling-and-serving-with-rails</link>
         <description>&lt;p&gt;We spend a lot of time optimizing the front end experience at GitHub. With that said, our asset (css, javascript, images) packaging and serving has evolved to be the best setup I've seen out of any web application I've worked on in my life.&lt;/p&gt; &lt;p&gt;Originally, I was going to package what we have up into a plugin, but realized that much of our asset packaging is specific our particular app architecture and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/blog/470-deployment-script-spring-cleaning&quot;&gt;choice of deployment strategy&lt;/a&gt;. If you haven't read up on our deployment recipe &lt;strong&gt;&lt;em&gt;read it now&lt;/em&gt;&lt;/strong&gt;. I cannot stress enough how awesome it is to have 14 second no downtime deploys. In any case, you can find the relevant asset bundling code in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gist.github.com/238291&quot;&gt;this gist&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Benefits of our asset bundling&lt;/h3&gt; &lt;ul&gt;
&lt;li&gt;Users never have to wait while the server generates bundle caches, ever. With default Rails bundling, each time you deploy, each request until your server generates the bundle has to wait for the bundle to finish. This makes your site pause for about 30s after each deploy.&lt;/li&gt;
&lt;li&gt;We can use slower asset minifiers (such as YUI or Google Closure) without consequence to our users.&lt;/li&gt;
&lt;li&gt;Adding new stylesheets or javascripts is as easy as creating the file. No need to worry about including a new file in every layout file.&lt;/li&gt;
&lt;li&gt;Because we base our ASSET_ID off our git modified date, we can deploy code updates without forcing users to lose their css/js cache.&lt;/li&gt;
&lt;li&gt;We take full advantage of image caching with SSL while eliminating the unauthenticated mixed content warnings some browsers throw.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Our asset bundling is comprised of several different pieces:&lt;/p&gt; &lt;ol&gt;
&lt;li&gt;A particular css &amp;amp; js file structure&lt;/li&gt;
&lt;li&gt;Rails helpers to include css &amp;amp; js bundles in production and the corresponding files in development.&lt;/li&gt;
&lt;li&gt;A rake task to bundle and minify css &amp;amp; javascript as well as the accompanying changes to deploy.rb to make it happen on deploy&lt;/li&gt;
&lt;li&gt;Tweaks to our Rails environment to use smart ASSET_ID and asset servers&lt;/li&gt;
&lt;/ol&gt; &lt;h3&gt;CSS &amp;amp; JS file layout&lt;/h3&gt; &lt;p&gt;Our file layout for CSS &amp;amp; JS is detailed in the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gist.github.com/238291#file__readme.md&quot;&gt;README&lt;/a&gt; for Javascript, but roughly resembles something like this:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;public/javascripts
|-- README.md
|-- admin
| |-- date.js
| `-- datePicker.js
|-- common
| |-- application.js
| |-- jquery.facebox.js
| `-- jquery.relatize_date.js
|-- dev
| |-- jquery-1.3.2.js
| `-- jquery-ui-1.5.3.js
|-- gist
| `-- application.js
|-- github
| |-- _plugins
| | |-- jquery.autocomplete.js
| | `-- jquery.truncate.js
| |-- application.js
| |-- blob.js
| |-- commit.js
`-- rogue |-- farbtastic.js |-- iui.js `-- s3_upload.js
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;I like this layout because:&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;It allows me to namespace specific files to specific layouts (gist, github.com, iPhone, admin-only layouts, etc) &lt;strong&gt;and&lt;/strong&gt; share files between apps (common).&lt;/li&gt;
&lt;li&gt;I can lay out files however I want within each of these namespaces, and reorganize them at will.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Some might say that relying on including everything is bad practice -- but remember that web-based javascript is almost exclusively onDOMReady or later. That means that there is no dependency order problems. If you run into dependency order issues, you're writing javascript wrong.&lt;/p&gt; &lt;h3&gt;Rails Helpers&lt;/h3&gt; &lt;p&gt;To help with this new bundle strategy, I've created some Rails helpers to replace your standard &lt;code&gt;stylesheet_link_tag&lt;/code&gt; and &lt;code&gt;javascript_include_tag&lt;/code&gt;. Because of the way we bundle files, it was necessary to use custom helpers. As an added benefit, these helpers are much more robust than the standard Rails helpers.&lt;/p&gt; &lt;p&gt;Here's the code:&lt;/p&gt; &lt;p&gt;Our &lt;code&gt;application.html.erb&lt;/code&gt; now looks something like this:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;%= javascript_dev ['jquery-1.3.2', &quot;#{http_protocol}://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;] %&amp;gt;
&amp;lt;%= javascript_bundle 'common', 'github' %&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This includes jQuery and all javascript files under &lt;code&gt;public/javascripts/common&lt;/code&gt; and &lt;code&gt;public/javascripts/github&lt;/code&gt; (recursively). Super simple and we probably won't need to change this for a very long time. We just add files to the relevant directories and they get included magically.&lt;/p&gt; &lt;p&gt;For pages that have heavy javascript load, you can still use the regular &lt;code&gt;javascript_include_tag&lt;/code&gt; to include these files (we keep them under the &lt;code&gt;public/javascripts/rogue&lt;/code&gt; directory).&lt;/p&gt; &lt;h3&gt;Bundle rake &amp;amp; deploy tasks&lt;/h3&gt; &lt;p&gt;The &lt;code&gt;javascript_bundle&lt;/code&gt; and &lt;code&gt;stylesheet_bundle&lt;/code&gt; helpers both assume that in production mode, there'll be a corresponding bundle file. Since we are proactively generating these files, you need to create these manually on each deploy.&lt;/p&gt; &lt;p&gt;Throw this into &lt;code&gt;lib/tasks/bundle.rake&lt;/code&gt; &lt;strong&gt;&lt;em&gt;and the corresponding YUI &amp;amp; Closure jars&lt;/em&gt;&lt;/strong&gt; and then run &lt;code&gt;rake bundle:all&lt;/code&gt; to generate your javascript. You can customize this to use the minifying package of your choice.&lt;/p&gt; &lt;p&gt;To make sure this gets run on deploy, you can add this to your deploy.rb:&lt;/p&gt; &lt;h3&gt;Tweaks to production.rb&lt;/h3&gt; &lt;p&gt;The last step in optimizing your asset bundling for deploys is to tweak your production.rb config file to make asset serving a bit smarter. The relevant bits in our file are:&lt;/p&gt; &lt;p&gt;There's three important things going on here.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;First—&lt;/strong&gt; If you hit a page using SSL, we serve all assets through SSL. If you're on Safari, we send all CSS &amp;amp; images non-ssl since Safari doesn't have a mixed content warning.&lt;/p&gt; &lt;p&gt;It is of note that many people &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://37signals.com/svn/posts/1431-mixed-content-warning-how-i-loathe-thee&quot;&gt;suggest serving CSS &amp;amp; images non-ssl to Firefox&lt;/a&gt;. This was good practice when Firefox 2.0 was standard, but now that Firefox 3.0 is standard (and obeys cache-control:public as it should) there is no need for this hack. Firefox does have a mixed content warning (albeit not as prominent as IE), so I choose to use SSL.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Second—&lt;/strong&gt; We're serving assets out of 4 different servers. This fakes browsers into downloading things faster and is generally good practice.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Third—&lt;/strong&gt; We're hitting the git repo on the server (note our deployment setup) and getting a sha of the last changes to the &lt;code&gt;public/stylesheets&lt;/code&gt; and &lt;code&gt;public/javascripts&lt;/code&gt; directory. We use that sha as the ASSET_ID (the bit that gets tacked on after css/js files as ?sha-here).&lt;/p&gt; &lt;p&gt;This means that if we deploy a change that only affects &lt;code&gt;app/application.rb&lt;/code&gt; we don't interrupt our user's cache of the javascripts and stylesheets.&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;What all of this adds up to is that our deploys have almost no frontend consequence unless they intend to (changing css/js). This is &lt;strong&gt;huge&lt;/strong&gt; for a site that does dozens of deploys a day. All browser caches remain the same and there isn't any downtime while we bundle up assets. It also means we're not afraid to deploy changes that may only affect one line of code and some minor feature.&lt;/p&gt; &lt;p&gt;All of this is not to say there isn't room for improvement in our stack. I'm still tracking down some SSL bugs, and always trying to cut down on the total CSS, javascript and image load we deliver on every page.&lt;/p&gt;</description>
         <author>kneath</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e1f5f4b8e0ceffe2</guid>
         <pubDate>Thu, 19 Nov 2009 12:30:47 -0800</pubDate>
      </item>
      <item>
         <title>Multiple file gist improvements</title>
         <link>http://github.com/blog/550-multiple-file-gist-improvements</link>
         <description>&lt;p&gt;We've always had the ability to embed multiple file gists:&lt;/p&gt; &lt;p&gt;But today we added the ability to embed specific files in a multi-file gist!&lt;/p&gt; &lt;p&gt;We also added permalinks next to each file name so you can hard link to specific files &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gist.github.com/238498#file_second_file.js&quot;&gt;like so&lt;/a&gt;&lt;/p&gt; &lt;center&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/gist__238498_-_GitHub-20091118-184615.jpg&quot;&gt;&lt;/center&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</description>
         <author>kneath</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b5e9b27615be8b46</guid>
         <pubDate>Wed, 18 Nov 2009 16:11:04 -0800</pubDate>
      </item>
      <item>
         <title>Building a Better Photo Uploader</title>
         <link>http://www.facebook.com/note.php?note_id=178492968919</link>
         <author>Facebook Engineering</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/1e73ca8d6ac6fc5c</guid>
         <pubDate>Wed, 18 Nov 2009 20:19:39 -0800</pubDate>
      </item>
      <item>
         <title>New Privacy Policy Adopted</title>
         <link>http://blog.facebook.com/blog.php?post=181160577130</link>
         <description>On Nov. 5, we wrapped up a week-long notice and comment period for a proposed revision to our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=167389372130&quot;&gt;privacy policy&lt;/a&gt;. This was a continuation of our ongoing effort to run Facebook in an open and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=56566967130&quot;&gt;transparent&lt;/a&gt; way. The goals of the revised policy were to make it more accessible and easier to understand.&lt;br&gt;
&lt;br&gt;
We've spent the last week reviewing each and every one of your comments. While a lot of people participated, the total number of people commenting did not reach the threshold of 7,000 that makes a vote necessary according to our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/terms.php?&quot;&gt;Statement of Rights and Responsibilities&lt;/a&gt;. Because of this — and the fact that many of the comments were positive — we've decided to adopt the revised policy. We'll be posting it in English, French, Italian, German and Spanish soon. &lt;br&gt;
&lt;br&gt;
In the coming weeks and months, we plan to build on the progress we've already made in making the document more accessible by also adding definitions of key terms, screen shots of important pages and informational &quot;learn more&quot; videos. We think these visual resources will make it even easier to understand how privacy works on Facebook.&lt;br&gt;
&lt;br&gt;
We received excellent feedback from many of you over the course of the week, and the number of fans for the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/fbsitegovernance&quot;&gt;Facebook Site Governance Page&lt;/a&gt; more than doubled. Overall, you supported the proposed changes. For example:&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Most of you liked that we removed more complicated technical and legal terms and replaced them with simpler language that everyone can understand. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;You preferred the structure of the new document, which provides key points at the beginning and easy links to jump to the different sections. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;A few of you asked for a redline version so you could compare the proposed revision to our current policy and see exactly what's changed. We weren't able to provide one this time because the policy was completely rewritten, but we think it's a great idea and are committed to doing it for future proposed changes to our governing documents.&lt;/li&gt;&lt;/ul&gt;As always, thanks for taking part in this important process. We're glad to have so many interested and engaged people using Facebook. Stay tuned for future updates by becoming a fan of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/fbsitegovernance&quot;&gt;Facebook Site Governance Page&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Michael, Facebook's deputy general counsel for intellectual property, product and regulatory affairs, is grateful for your feedback.&lt;/i&gt;</description>
         <author>Michael Richter</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3711a97c79d59e41</guid>
         <pubDate>Tue, 17 Nov 2009 17:21:11 -0800</pubDate>
      </item>
      <item>
         <title>Xbox Connects with Facebook</title>
         <link>http://blog.facebook.com/blog.php?post=180558067130</link>
         <description>Games are more fun when played with friends, which is why they are among the most popular activities on Facebook. We're excited that beginning today the social game experience is coming to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.xbox.com/en-US/live/features/facebook.htm&quot;&gt;Xbox Live&lt;/a&gt;, so now you can play Xbox games with your Facebook friends.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
More and more services are integrating with Facebook to make it easy for you to connect with friends wherever you are — including websites like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.digg.com&quot;&gt;Digg&lt;/a&gt;, devices like the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/apps/application.php?id=6628568379&quot;&gt;iPhone&lt;/a&gt; and desktop applications like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.apple.com/ilife/iphoto/&quot;&gt;iPhoto&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
The Xbox Facebook integration allows you to take part in some of the most popular activities on Facebook directly from your living room on your television. With Facebook for Xbox, you can update your status, browse updates from your friends and view photos on the big screen. You also can link your Facebook profile to your Xbox Gamertag to find your Facebook friends and connect with them on Xbox Live. It's never been easier to discover friends you never even knew played Xbox.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Keep in mind that Xbox will respect the privacy you set on Facebook, so you can control who sees your activity. The new Facebook for Xbox can be added to your Xbox 360 through a system update now. &lt;br&gt;
&lt;br&gt;
As social gaming continues to grow, we look forward to people playing games with their friends on consoles, mobile phones, the Web and their desktops.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Gareth is on his Xbox viewing recent photos and playing games with his Facebook friends, all from his television.&lt;/i&gt;</description>
         <author>Gareth Davis</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/088a6a7c85aaef52</guid>
         <pubDate>Tue, 17 Nov 2009 11:54:37 -0800</pubDate>
      </item>
      <item>
         <title>GitHub Meetup SF: RubyConf Edition</title>
         <link>http://github.com/blog/549-github-meetup-sf-rubyconf-edition</link>
         <description>&lt;p&gt;In SF for RubyConf? Join us this Thursday the 19th at Zeitgeist &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://is.gd/4WwTL&quot;&gt;(map)&lt;/a&gt; starting at 9pm!&lt;/p&gt;
&lt;p&gt;Zeitgeist has pitchers and ample outside seating, so bring a jacket. Also: &lt;strong&gt;cash only&lt;/strong&gt;.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://is.gd/4WwTL&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20091116-xmyg7bbb7a2njng71qn8r33bts.png&quot;&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Coming from the conference? Take &lt;span&gt;BART&lt;/span&gt; to the 16th st Mission stop then walk North on Valencia &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://is.gd/4Wx1B&quot;&gt;(map)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;</description>
         <author>defunkt</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b94c2d4016a09b73</guid>
         <pubDate>Mon, 16 Nov 2009 12:26:25 -0800</pubDate>
      </item>
      <item>
         <title>How to Bullyproof Yourself on Facebook</title>
         <link>http://blog.facebook.com/blog.php?post=180189707130</link>
         <description>In October, we called attention to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=166700102130&quot;&gt;National Crime Prevention Month&lt;/a&gt; in the United States to raise awareness about cyberbullying. This week is National Anti-Bullying Week in the United Kingdom, and we've teamed up with media outlets BBC Radio 1, BBC 1Xtra, and other sites like Bebo, Habbo, MSN, MySpace and YouTube to address this important issue again. While only a small fraction of people will ever experience abusive behavior on Facebook, we're committed to promoting an environment where everyone can connect and share comfortably.&lt;br&gt;
&lt;br&gt;
For more information on how to handle bullies, check out the BBC's new &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/BBCbullyproof&quot;&gt;Facebook Page&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.bbc.co.uk/bullyproof&quot;&gt;website&lt;/a&gt;. You can show your support for the &quot;bullyproof&quot; movement and receive a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/BBCbullyproof#/BBCbullyproof?v=app_178751180979&quot;&gt;free badge&lt;/a&gt; to post on your Wall or send to a friend.&lt;br&gt;
&lt;br&gt;
We want to ensure that people understand how to address cyberbullying if it occurs on Facebook, so here are some useful tips from our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/safety&quot;&gt;Help Center&lt;/a&gt;: &lt;br&gt;
&lt;br&gt;
&lt;b&gt;Accept Friend Requests from People You Know&lt;/b&gt;&lt;br&gt;
In order to prevent harassment from strangers, be careful to accept friend requests only from people you know in real life and remember to report any messages or profiles that look suspicious. Facebook is based on a real-name culture, and fake profiles are regularly disabled when they're reported to us. Only confirmed friends can post to your Wall or contact you via Facebook Chat, so if you're worried that someone will make inappropriate posts or send offensive messages, just ignore that person's friend request.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Use the Block Feature&lt;/b&gt;&lt;br&gt;
A block prevents specific people from viewing your profile. When you use this feature, any ties you currently have with them will be broken, and they won't be able to contact you through Facebook. You can block another user by listing his or her name in the &quot;Block People&quot; box at the bottom of your &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/group.php?gid=87450478120#/privacy/?ref=blog&quot;&gt;Privacy Settings&lt;/a&gt; page. &lt;br&gt;
&lt;br&gt;
&lt;b&gt;Report Abusive Behavior&lt;/b&gt; &lt;br&gt;
The most efficient way to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=144628037130&quot;&gt;report abuse&lt;/a&gt; is to do it in the same place it occurs on Facebook. For example, if you receive a harassing message in your Inbox from someone who is not your Facebook friend, you can report it by clicking on the &quot;Report&quot; link next to the sender's name as you are reading the message. If you receive an harassing message from a Facebook friend, you should remove that person as a friend and report the message. Reporting a message will automatically add the sender to your Block list. You can also use the &quot;Report/Block person&quot; link that appears at the bottom of the abusive user's profile. Reports are confidential and the user being reported does not know about the report. After a report is submitted, we will investigate the issue and make a determination as to whether or not the content should remain on the site based on our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/terms.php&quot;&gt;Statement of Rights and Responsibilities&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Customize Your Privacy Settings&lt;/b&gt;&lt;br&gt;
Facebook offers granular privacy settings that allow you to customize what information you share and with whom. By customizing the settings on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/group.php?gid=87450478120#/privacy/?ref=blog&quot;&gt;Privacy Settings&lt;/a&gt; page, you can control who views your information, dictate who can find you in searches, and see your Wall, profile and photos, among other things.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Respond to Abusers in the Right Way&lt;/b&gt;&lt;br&gt;
Cyberbullies often seek a reaction from the people they harass. When they fail to get one, they often will give up. Rather than respond to a bully via an Inbox message, a Wall post or Facebook Chat, you can delete offensive posts from your Wall or messages from your Inbox and then use the Block or Report functions to resolve the issue. To delete an offensive Wall post, select the &quot;Remove&quot; button that appears in the upper right-hand corner. To delete a message from Inbox, simply click the &quot;Delete&quot; button at the top of the message. Only confirmed friends can post to your Wall or send you a message through Chat. If you are receiving posts and Chat messages you don't like, you should consider removing the sender from your friends list.&lt;br&gt;
&lt;br&gt;
Protecting our users is a top priority for Facebook, and we're proud to be a part of this year's Anti-Bullying Week efforts in the UK.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Richard, Facebook's European Director of Public Policy, is a fan of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/BBCbullyproof&quot;&gt;BBC bullyproof Page&lt;/a&gt; on Facebook.&lt;/i&gt;</description>
         <author>Richard Allan</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/06f5df712d8b7331</guid>
         <pubDate>Mon, 16 Nov 2009 11:40:51 -0800</pubDate>
      </item>
      <item>
         <title>GitHub Meetup London</title>
         <link>http://github.com/blog/548-github-meetup-london</link>
         <description>&lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;http://theroyalgeorgewc2.co.uk/images/home5.jpg&quot;&gt;&lt;/div&gt;
&lt;p&gt;It’s the last stop on our Europe tour and we’re capping things off with an evening at the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://theroyalgeorgewc2.co.uk/&quot;&gt;Royal George&lt;/a&gt; near Soho in London at 19:00 on Monday the 16th. PJ, Scott, and I will be in attendance along with (if the rumors are true) a ton of local developers and tech luminaries from the greater London area. This is a meetup you will not want to miss!&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;small&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Royal+George+near+london&amp;amp;ie=UTF8&amp;amp;hq=Royal+George&amp;amp;hnear=London,+UK&amp;amp;ll=51.530106,-0.122051&amp;amp;spn=0.055333,0.181274&amp;amp;z=13&amp;amp;iwloc=A&amp;amp;cid=4414905488058032507&quot; style=&quot;color:#0000FF;text-align:left;&quot;&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
         <author>mojombo</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bba537bbe30ea333</guid>
         <pubDate>Sun, 15 Nov 2009 17:55:36 -0800</pubDate>
      </item>
      <item>
         <title>Parents Have Rules to Follow Online, Too</title>
         <link>http://blog.facebook.jp/blog.php?post=177371932130</link>
         <description>&lt;i&gt;Liz Perle is the Editor-in-Chief of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/commonsensemedia&quot;&gt;Common Sense Media&lt;/a&gt;, a nonprofit organization that is dedicated to improving the media and entertainment lives of kids and families. The organization believes that parents should have a choice and a voice about the media their kids consume. We've asked Liz to share some common sense tips for parents as they navigate technology and the web with their kids.&lt;/i&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Where do kids learn about good online behavior? From each other, perhaps. Maybe from a teacher. But parents have a big role to play in making sure their kids use the incredible technologies at their fingertips in responsible ways. For parents, that means not only talking the talk, but walking the walk.&lt;br&gt;
&lt;br&gt;
It's really up to parents to explain the basics of online safety and stress the importance of guarding privacy in a world where something shared with one friend online can quickly spread to a vast audience of many others. Parents should be sure their kids understand that anything and everything that people post online can be altered, copied, pasted and sent around to a gazillion friends of friends in an instant. &lt;br&gt;
&lt;br&gt;
It's a parent's job to make sure kids understand that everything they do online leaves a &quot;digital footprint&quot; — the idea that once something is shared online, it's really almost impossible to take it back. Just ask my son about the Halloween photo of him that he thought was so funny in 8th grade. Two years later, it's resurfaced. Let's just say it's not doing much for his dating life.&lt;br&gt; &lt;br&gt;
But what about the parent's side of the equation? Kids learn from their parents, not just from what their parents say but also from what they do. It turns out that parents have as much to do with their kids' online behaviors as their kids do. &lt;br&gt;
&lt;br&gt;
At Common Sense Media, we're dedicated to helping kids and families get the most out the powerful digital technologies that run through the center of our lives. Some of this involves helping kids learn responsible behavior, but kids are only half the story. Parents also have some &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.commonsensemedia.org/rules-road-parents-digital-age&quot;&gt;Rules of the Road&lt;/a&gt;&quot; they should be following:&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Model good behavior&lt;/b&gt;. If you're on your phones at dinner or during family events, why should your kids listen to you when you tell them to turn their phones off? &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Pay attention&lt;/b&gt;. Know what your kids are doing online. For instance, talk to your kids about whether or not they're comfortable letting you &quot;friend&quot; them on social networks — many will be. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Impart your values&lt;/b&gt;. Right and wrong extends to all areas of life, whether it's online or through a mobile device. Cheating, lying, being cruel — they're all non-starters, no matter where you are. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Establish limits&lt;/b&gt;. There's really a right time and place for everything. Set guidelines for when it's acceptable to use the phone, download videos and surf the web.&lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Encourage balance&lt;/b&gt;. The Internet opens doors to new worlds. Encourage your kids to explore their own offline world as well, particularly when there is no cell phone or Internet service available.&lt;/li&gt; &lt;br&gt;
&lt;li&gt;&lt;b&gt;Make kids accountable&lt;/b&gt;. Let your kids know that having access to technology is a privilege. Let's make sure they earn it. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Explain what's at stake&lt;/b&gt;. Let them know that what might seem acceptable today can be embarrassing tomorrow. &lt;/li&gt; &lt;br&gt;
&lt;li&gt;&lt;b&gt;Do your homework&lt;/b&gt;. Get familiar with the websites and services your kids use and the type of content they're downloading. Armed with knowledge, you can find ways to use technology to say &quot;yes&quot; more often. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Don't be techno-phobic&lt;/b&gt;. Don't be afraid of technology. Learn to text, send a mobile photo, set up a Facebook profile, upload a video. Or have your kids show you how. It's impossible to guide what you don't understand. Not only that, but think of all the anxiety you can avoid by knowing how things work. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Lighten up, embrace their world and enjoy the possibilities together&lt;/b&gt;. No parents want a digital divide in their relationships with their kids. It's up to you to join the fun and help your kids seize the potential. &lt;/li&gt;&lt;/ol&gt;&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Liz wants to help parents create positive experiences for their kids with the articles and topics available on Common Sense Media's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.commonsensemedia.org/advice-for-parents&quot;&gt;website&lt;/a&gt;.&lt;/i&gt;&lt;br&gt;</description>
         <author>Liz Perle</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/eaa0bf82cab1e173</guid>
         <pubDate>Thu, 12 Nov 2009 14:30:56 -0800</pubDate>
      </item>
      <item>
         <title>Stay Tuned: TV on Facebook</title>
         <link>http://blog.facebook.jp/blog.php?post=173065077130</link>
         <description>&lt;i&gt;The following is part of our series on different ways you can use Facebook to connect with public figures and organizations around the world. Read the previous blog post in this series &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=99634242130&quot;&gt;here&lt;/a&gt;.&lt;/i&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
From reality television to prime-time dramas, I admit it, I can be a bit television-obsessed. I often find myself spending an evening after a long day's work catching up on my favorite television shows. Unfortunately, a busy schedule can prevent even the most devoted fan from catching key plot lines and dramatic twists. Luckily, I can keep up to date on my favorite shows with my friends on Facebook, so I never miss a beat. &lt;br&gt;
&lt;br&gt;
&lt;b&gt;Watching Online&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
Every September, there are a dozen new television shows that I want to check out, but I only have so much time to tune in each night. One of my favorite websites, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/hulu&quot;&gt;Hulu&lt;/a&gt;, streams TV shows directly on its Facebook Page using the application &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/hulu#/hulu?v=app_264760470695&quot;&gt;Watch Now&lt;/a&gt;. This way, I can watch full episodes of the hottest fall shows whenever I want, including &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/home.php#/House?ref=search&amp;amp;sid=19800843.1742027165..1&quot;&gt;House&lt;/a&gt;,&quot; one of my favorite medical dramas on Fox. My friends can see how far along I am in the current season of diagnostic mysteries when I share the episode to my Facebook profile.&lt;br&gt;
&lt;br&gt;
I also am discovering funny clips that I've missed thanks to my friends. I first heard of the popular joke from NBC's workplace comedy &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/home.php#/theofficenbc?ref=blog&quot;&gt;The Office&lt;/a&gt;&quot; about a social networking site called &quot;Book Face&quot; because a colleague shared the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://apps.facebook.com/the-office-premiere/?_fb_fromhash=eced1c22b350c3e209ce142017406544&quot;&gt;Hulu clip&lt;/a&gt; on his profile.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Teasers&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
Sometimes the best part of my day is when one of my favorite shows posts a new teaser for an upcoming episode on their Facebook Page. &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/search/?q=gossip%20girl#/GossipGirl?ref=search&amp;amp;sid=19800843.3041011240..1&quot;&gt;Gossip Gir&lt;/a&gt;l,&quot; the CW drama about young Manhattan elites, airs on Monday nights and then posts video and photo previews for upcoming episodes on Tuesdays. The week of waiting to watch the next episode of gossip among Serena, Nate, Chuck and Blair is more bearable when I can see fashions from &quot;Gossip Girl&quot; shared directly on my home page in the meantime. &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Wednesdays are equally interesting when the Fox musical comedy &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/Glee&quot;&gt;Glee&lt;/a&gt;&quot; posts clips from the night's upcoming episode paired with introductions from all of my favorite cast members. Sometimes the show even includes clips of its ever-popular musical numbers like this rendition of &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/video/video.php?v=1266428182150&quot;&gt;Keep Holding On&lt;/a&gt;.&quot; &lt;br&gt;
&lt;br&gt;
Then there are times when my friends share their favorite TV shows with me on Facebook. For instance, one friend posted that she had seen the future in the &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/FlashForward&quot;&gt;FlashForward Experience&lt;/a&gt;.&quot; It piqued my curiosity, and when I visited the show's Facebook Page, I was directed to a Facebook &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=41735647130&quot;&gt;Connect&lt;/a&gt;-enabled website where I was suddenly immersed in the ABC show's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.flashforwardexperience.com/&quot;&gt;trailer&lt;/a&gt;. The site uses the viewer's Facebook photos to create an individualized video after that viewer grants permission . The trailer asks, &quot;Where were you on September 24?&quot; I am definitely looking forward to the answer when I tune into the new science-fiction series. &lt;br&gt;
&lt;br&gt;
&lt;b&gt;New Favorites&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
Although my television schedule is busy with old favorites, I always have room for a new show. Those can be the most surprising. Several of my friends became a fan of the Travel Channel's competitive eating show, &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/search/?q=man%20v.%20food#/ManVFood?ref=search&amp;amp;sid=19800843.630613317..1&quot;&gt;Man v. Food&lt;/a&gt;,&quot; through an ad they saw on Facebook with the challenge, &quot;5 lb burger, 4 peppers, 25 min.&quot; This, I had to see for myself. &lt;br&gt;
&lt;br&gt;
I've also seen friends become fans of the new ABC sitcom &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/ModernFamily&quot;&gt;Modern Family&lt;/a&gt;.&quot; The show highlights its &quot;Favorite Modern Moments&quot; in a photo album on its Facebook Page. I laughed out loud at this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/photo.php?pid=4374069&amp;amp;id=130577231135&quot;&gt;photo&lt;/a&gt; and immediately tuned in through the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://abc.go.com/shows/modernfamily&quot;&gt;ABC.com link&lt;/a&gt; I found on Facebook.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Annie, an associate on Facebook's communications team, can't wait to see tomorrow's TV line-up on Facebook today.&lt;/i&gt;</description>
         <author>Annie Ta</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d9954ec18582896d</guid>
         <pubDate>Fri, 06 Nov 2009 12:32:27 -0800</pubDate>
      </item>
      <item>
         <title>Get Educated on Facebook</title>
         <link>http://blog.facebook.jp/blog.php?post=171666882130</link>
         <description>As a recent college graduate, I use Facebook to keep up with the latest news from my alma mater, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/pomonacollege&quot;&gt;Pomona College&lt;/a&gt;, in Claremont, Calif. For instance, I learned about a happy hour for young alumni via a status update, and I saw photos of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/JohnKrasinski&quot;&gt;John Krasinski&lt;/a&gt;, who plays &quot;Jim&quot; in &quot;The Office,&quot; on his recent visit to campus. &lt;br&gt;
&lt;br&gt; &lt;br&gt;
&lt;br&gt;
Pomona isn't the only college utilizing Pages. In fact, in addition to colleges and universities, a number of academic groups are now on the site. We also recently launched a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/pages/Facebook-in-Education/191921000271?ref=blog&quot;&gt;Facebook in Education Page&lt;/a&gt; on the site as a resource for teachers, professors, administrators, counselors and others who work in academia. &lt;br&gt;
&lt;br&gt;
Here are a few other interesting examples of how educators are using Facebook to connect.&lt;br&gt;
&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/tamu&quot;&gt;Texas A&amp;amp;M University&lt;/a&gt; has connected with nearly 150,000 people through their Facebook Page. They share highlights from the latest Aggie win on the football field, exclusive interviews with the university President and admissions information.&lt;br&gt;
&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/stanford&quot;&gt;Stanford University&lt;/a&gt; uses their Facebook Page to host open office hours for people to connect with professors and luminaries. They solicit questions on the Page and post responses in a series of videos. You can see the most recent edition &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/video/video.php?v=641600260773&quot;&gt;here&lt;/a&gt; with Provost John Etchemendy.&lt;br&gt;
&lt;br&gt;
High schools from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/gobells&quot;&gt;San Jose, Calif.&lt;/a&gt; to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/seminolehs&quot;&gt;Sanford, Fla.&lt;/a&gt; also are using Facebook to organize student and alumni events, generate support and excitement around upcoming games and keep their local communities informed about school activities.&lt;br&gt;
&lt;br&gt;
Svein Arber, a high school teacher in San Francisco, Calif., created a Facebook &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/group.php?gid=24723897662&quot;&gt;group&lt;/a&gt; to connect with his Advanced Placement (AP) literature class. Over the course of the year, students write posts on the group's discussion board to analyze the narration style in Phillip Roth's &quot;American Pastoral&quot; and debate whether a character in Albert Camus' &quot;The Stranger&quot; is fundamentally good or evil. Svein also uses the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/events.php?ref=blog&quot;&gt;Events feature&lt;/a&gt; to remind students of due dates for assignments. &quot;It's been very positive,&quot; he said. &quot;I'm able to reach my students where they live.&quot;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Other teachers are encouraging students to use Facebook to collaborate with peers across the globe. For example, two high school students from the Loudoun Academy of Science in Sterling, Va. are studying the positive qualities of maggots in collaboration with two students in Singapore, more than 9,000 miles away. One student, Joanne Guidry, told &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.washingtonpost.com/wp-dyn/content/article/2009/06/23/AR2009062303440.html&quot;&gt;The Washington Post,&lt;/a&gt; &quot;When we talk on Facebook, you can't tell they are halfway around the world.&quot; &lt;br&gt;
&lt;br&gt;
There also are Facebook applications like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/inigral&quot;&gt;Schools&lt;/a&gt;, which help students before they even step foot on campus, during school and after they graduate. Incoming students can contact admissions offices and engage with their peers. Current students can get help with homework from classmates and plan club meetings, while graduates can locate other alumni and organize reunions. You already can find schools like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://apps.facebook.com/arizona_state/registration/new&quot;&gt;Arizona State University&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/spartans.msu&quot;&gt;Michigan State University&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/apps/application.php?id=113390213419&amp;amp;ref=search&amp;amp;sid=19800843.2763451079..1&quot;&gt;Becker College&lt;/a&gt; through the Schools application.&lt;br&gt;
&lt;br&gt;
The &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://apps.facebook.com/cramster/&quot;&gt;Courses application&lt;/a&gt; allows educators and students to view class rosters and manage their schedules, while the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://apps.facebook.com/flashcard/&quot;&gt;Flashcards application&lt;/a&gt; keeps students language skills fresh by allowing them to to study spelling, French vocabulary and much more.&lt;br&gt;
&lt;br&gt;
Now, that's some A+ work. Be sure to check out the recently launched &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/pages/Facebook-in-Education/191921000271?ref=blog&quot;&gt;Facebook in Education Page&lt;/a&gt; for even more tips on using the Facebook in the classroom, stories about educators and answers to frequently asked questions about Facebook and academia. We would love for you to share your own experiences, as well.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Julie, a specialist on Facebook's user operations team, is moving to Ireland to put her teaching skills to work in Facebook's Dublin office.&lt;/i&gt;</description>
         <author>Julie Trescott</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e166996768417d40</guid>
         <pubDate>Thu, 05 Nov 2009 10:12:39 -0800</pubDate>
      </item>
      <item>
         <title>Facebook Tips: How Do I Change My Email Notifications?</title>
         <link>http://blog.facebook.jp/blog.php?post=171619937130</link>
         <description>&lt;i&gt;The following is part of our series, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.facebook.com/blog.php?post=113716697130&quot;&gt;Facebook Tips&lt;/a&gt;, which answers some of the most commonly asked questions about using Facebook. While we hope the tips we share on the blog will be informative, remember that we are unable to answer individual questions here. We'll always direct you to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/help.php&quot;&gt;Help Center&lt;/a&gt; for additional information about the topics we cover.&lt;/i&gt;&lt;br&gt; &lt;br&gt;
&lt;br&gt;
You don't have to be logged in to Facebook to get the latest updates from friends. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/editaccount.php?notifications&quot;&gt;Email notifications&lt;/a&gt; allow you to know when people interact with you on the site, whether through Wall posts, comments, tagged photos or friend requests. Similar to the notifications you see in the lower right hand corner on Facebook, email notifications let you know what's happening even when you aren't logged in.&lt;br&gt;
&lt;br&gt;
You can manage email notifications by selecting the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://register.facebook.com/editaccount.php?ref=blog&quot;&gt;&quot;Settings&quot; link&lt;/a&gt; in the upper right hand corner of any page. From the Notifications tab, you can choose which actions you want to generate emails. For example, if you want to be notified by email each time someone writes on your Wall or receive weekly email digests about your friends' upcoming birthdays, just check the boxes next to these options. If you'd rather not be notified when people poke you or comment on your photos, just leave those boxes unchecked.&lt;br&gt;
&lt;br&gt;
To change the email address associated with your account, select the &quot;Settings&quot; tab. You'll then see your current email address and can select &quot;change&quot; to add or delete addresses. Your Facebook email notifications will only be sent to the address you designate as your &quot;Contact Email,&quot; so also be sure this information is accurate.&lt;br&gt; &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Melody, a specialist in Facebook user operations, has three new email notifications.&lt;/i&gt;</description>
         <author>Melody Quintana</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/4a6e33712be30216</guid>
         <pubDate>Wed, 04 Nov 2009 10:40:48 -0800</pubDate>
      </item>
      <item>
         <title>Parents Have Rules to Follow Online, Too</title>
         <link>http://blog.facebook.com/blog.php?post=177371932130</link>
         <description>&lt;i&gt;Liz Perle is the Editor-in-Chief of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.facebook.com/commonsensemedia&quot;&gt;Common Sense Media&lt;/a&gt;, a nonprofit organization that is dedicated to improving the media and entertainment lives of kids and families. The organization believes that parents should have a choice and a voice about the media their kids consume. We've asked Liz to share some common sense tips for parents as they navigate technology and the web with their kids.&lt;/i&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Where do kids learn about good online behavior? From each other, perhaps. Maybe from a teacher. But parents have a big role to play in making sure their kids use the incredible technologies at their fingertips in responsible ways. For parents, that means not only talking the talk, but walking the walk.&lt;br&gt;
&lt;br&gt;
It's really up to parents to explain the basics of online safety and stress the importance of guarding privacy in a world where something shared with one friend online can quickly spread to a vast audience of many others. Parents should be sure their kids understand that anything and everything that people post online can be altered, copied, pasted and sent around to a gazillion friends of friends in an instant. &lt;br&gt;
&lt;br&gt;
It's a parent's job to make sure kids understand that everything they do online leaves a &quot;digital footprint&quot; — the idea that once something is shared online, it's really almost impossible to take it back. Just ask my son about the Halloween photo of him that he thought was so funny in 8th grade. Two years later, it's resurfaced. Let's just say it's not doing much for his dating life.&lt;br&gt; &lt;br&gt;
But what about the parent's side of the equation? Kids learn from their parents, not just from what their parents say but also from what they do. It turns out that parents have as much to do with their kids' online behaviors as their kids do. &lt;br&gt;
&lt;br&gt;
At Common Sense Media, we're dedicated to helping kids and families get the most out the powerful digital technologies that run through the center of our lives. Some of this involves helping kids learn responsible behavior, but kids are only half the story. Parents also have some &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.commonsensemedia.org/rules-road-parents-digital-age&quot;&gt;Rules of the Road&lt;/a&gt;&quot; they should be following:&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Model good behavior&lt;/b&gt;. If you're on your phones at dinner or during family events, why should your kids listen to you when you tell them to turn their phones off? &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Pay attention&lt;/b&gt;. Know what your kids are doing online. For instance, talk to your kids about whether or not they're comfortable letting you &quot;friend&quot; them on social networks — many will be. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Impart your values&lt;/b&gt;. Right and wrong extends to all areas of life, whether it's online or through a mobile device. Cheating, lying, being cruel — they're all non-starters, no matter where you are. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Establish limits&lt;/b&gt;. There's really a right time and place for everything. Set guidelines for when it's acceptable to use the phone, download videos and surf the web.&lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Encourage balance&lt;/b&gt;. The Internet opens doors to new worlds. Encourage your kids to explore their own offline world as well, particularly when there is no cell phone or Internet service available.&lt;/li&gt; &lt;br&gt;
&lt;li&gt;&lt;b&gt;Make kids accountable&lt;/b&gt;. Let your kids know that having access to technology is a privilege. Let's make sure they earn it. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Explain what's at stake&lt;/b&gt;. Let them know that what might seem acceptable today can be embarrassing tomorrow. &lt;/li&gt; &lt;br&gt;
&lt;li&gt;&lt;b&gt;Do your homework&lt;/b&gt;. Get familiar with the websites and services your kids use and the type of content they're downloading. Armed with knowledge, you can find ways to use technology to say &quot;yes&quot; more often. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Don't be techno-phobic&lt;/b&gt;. Don't be afraid of technology. Learn to text, send a mobile photo, set up a Facebook profile, upload a video. Or have your kids show you how. It's impossible to guide what you don't understand. Not only that, but think of all the anxiety you can avoid by knowing how things work. &lt;/li&gt;&lt;br&gt;
&lt;li&gt;&lt;b&gt;Lighten up, embrace their world and enjoy the possibilities together&lt;/b&gt;. No parents want a digital divide in their relationships with their kids. It's up to you to join the fun and help your kids seize the potential. &lt;/li&gt;&lt;/ol&gt;&lt;br&gt;
&lt;br&gt;
&lt;i&gt;Liz wants to help parents create positive experiences for their kids with the articles and topics available on Common Sense Media's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.commonsensemedia.org/advice-for-parents&quot;&gt;website&lt;/a&gt;.&lt;/i&gt;&lt;br&gt;</description>
         <author>Liz Perle</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/93bc3b2aa12b2516</guid>
         <pubDate>Thu, 12 Nov 2009 14:30:56 -0800</pubDate>
      </item>
      <item>
         <title>GitHub Meetup Oslo, Norway</title>
         <link>http://github.com/blog/547-github-meetup-oslo-norway</link>
         <description>&lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20091111-bir68bb7kn76kdpdtr1988m1yr.png&quot;&gt;&lt;/div&gt;
&lt;p&gt;Continuing our tour of Europe, PJ, and Scott, and I will be in Oslo on Friday the 13th and we’d like to invite you to join us at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gloriaflames.no/&quot;&gt;Gloria Flames&lt;/a&gt; at 20:30 for drinks and good times. We’re rolling through Oslo specifically to meet the locals, so don’t disappoint us! I’ll be wearing a “fork you” tshirt so I’ll be easy to identify. See you there!&lt;/p&gt;
&lt;p&gt;If for some reason we need to change venues, check our twitter accounts “mojombo”, “pjhyett”, and “chacon” for updates.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;small&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maps.google.com/maps?client=safari&amp;amp;oe=UTF-8&amp;amp;ie=UTF8&amp;amp;q=%22gloria+flames%22+oslo&amp;amp;fb=1&amp;amp;hq=%22gloria+flames%22&amp;amp;hnear=oslo&amp;amp;ei=1w_6SuuAG93TOP69hIcP&amp;amp;ved=0CBAQpQY&amp;amp;hl=en&amp;amp;view=map&amp;amp;cid=16559423027679171250&amp;amp;iwloc=A&amp;amp;ll=59.91291,10.761501&amp;amp;spn=0.006295,0.006295&amp;amp;source=embed&quot; style=&quot;color:#0000FF;text-align:left;&quot;&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
         <author>mojombo</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e4e7f64856593d6f</guid>
         <pubDate>Tue, 10 Nov 2009 17:19:44 -0800</pubDate>
      </item>
      <item>
         <title>GitHub Rebase #30</title>
         <link>http://github.com/blog/546-github-rebase-30</link>
         <description>&lt;p&gt;This is the second of many themed Rebases to come…our first was the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rebase.github.com/22.html&quot;&gt;book edition&lt;/a&gt;. In related news, the column has also been going on for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rebase.github.com/archive.html&quot;&gt;over a year&lt;/a&gt; now! If you’ve got ideas for projects to feature or themes, don’t be afraid to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rebase.github.com/howto.html&quot;&gt;message me.&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gitshorty.net/&quot;&gt;&lt;img src=&quot;http://cloud.github.com/downloads/rebase/rebase.github.com/gitshorty.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Featured Project&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/nddrylliog/ooc&quot;&gt;ooc&lt;/a&gt; is a statically typed, object oriented language with some functional programming hints that’s growing up right here on GitHub. The compiler is currently written in Java, and it boils down to C99 so it can run anywhere. Grab the zip from the Downloads section or clone away and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ooc-lang.org/setup&quot;&gt;set it up&lt;/a&gt;. The language has some &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ooc-lang.org/&quot;&gt;neat features&lt;/a&gt;: everyone’s favorite generic types, a clean &lt;code&gt;import&lt;/code&gt;/&lt;code&gt;use&lt;/code&gt; system that makes Ruby’s &lt;code&gt;require&lt;/code&gt; look like yesterday’s news, and the &lt;code&gt;cover&lt;/code&gt; keyword that allows for some really neat abstractions over types and clean interfacing with other C code. If you’re a language geek or need a breath of fresh air, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ooc-lang.org/docs/&quot;&gt;check it out&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Notably New Projects&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/nddrylliog/rock&quot;&gt;rock&lt;/a&gt; is an ooc compiler written in ooc, of course. This has some great examples of quite complex ooc code and aims to replace the Java compiler.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/kuzux/ooc-sqlite3&quot;&gt;ooc-sqlite3&lt;/a&gt; is an &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.sqlite.org/&quot;&gt;SQLite&lt;/a&gt; driver that’s also just getting off the ground, but it’s starting to pick up some steam. Next stop: a web framework!&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/nddrylliog/woot&quot;&gt;woot&lt;/a&gt; is ooc’s first unit testing system, and is headed towards a bright future since it’ll be used to test ooc itself. This dogfood is tasty!&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/OneSadCookie/ooc-glew&quot;&gt;ooc-glew&lt;/a&gt; uses &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://glew.sourceforge.net/&quot;&gt;&lt;span&gt;GLEW&lt;/span&gt;&lt;/a&gt; to open up the power of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.opengl.org/&quot;&gt;OpenGL&lt;/a&gt; to ooc. There’s also a little Ruby magic baked in to generate the bindings since there’s a lot of functions.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/eagle2com/Stirling3d&quot;&gt;Stirling3D&lt;/a&gt; is also for the graphically minded. This project is a graphics/physics engine that also hooks into OpenGL and is starting to render some neat stuff.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/fredreichbier/ooc-yajl&quot;&gt;ooc-yajl&lt;/a&gt; is a set of bindings to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://lloyd.github.com/yajl/&quot;&gt;yajl&lt;/a&gt;, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rebase.github.com/21.html&quot;&gt;former featured project&lt;/a&gt; that is a lightning fast &lt;span&gt;JSON&lt;/span&gt; parsing library. It’s also a neat example of how easy it is to hook into C libraries and how the &lt;code&gt;.use&lt;/code&gt; files work.&lt;/p&gt;</description>
         <author>qrush</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f3c6b90a771985c4</guid>
         <pubDate>Tue, 10 Nov 2009 06:23:12 -0800</pubDate>
      </item>
      <item>
         <title>Recent UI updates to GitHub</title>
         <link>http://github.com/blog/545-recent-ui-updates-to-github</link>
         <description>&lt;p&gt;On my first day at GitHub, I asked the crew what they wanted to me to do around here. Their response was something along the lines of &quot;make GitHub sexy&quot; Now that we've been rolling out steady UI updates for about a month, I thought I'd take some time and go over what all I've been working on.&lt;/p&gt; &lt;p&gt;I previously covered the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/blog/513-new-repository-lists-on-your-dashboard&quot;&gt;updated dashboard repository lists&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/blog/523-gist-improvements&quot;&gt;gist improvements&lt;/a&gt;, but I haven't had a chance to go over the new userbox, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/kneath&quot;&gt;profile pages&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/account&quot;&gt;account pages&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/dashboard&quot;&gt;dashboard headers&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/skitched-57-20091108-173421.jpg&quot; alt=&quot;New userbox&quot;&gt;&lt;/p&gt; &lt;p&gt;The new userbox was rolled out to solve a problem we had -- people with long usernames were breaking the UI, forcing links into the next line. I also took the time to reorganize the navigation and spruce up the look &amp;amp; feel.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/skitched-58-20091108-173443.jpg&quot; alt=&quot;New profile pages&quot;&gt;&lt;/p&gt; &lt;p&gt;The new profile pages were one of the first purely cosmetic updates to the site. You'll notice a new style of page header being rolled out. This header does have some functional benefits -- but they're subtle. On pages that are yours, you'll notice a slight yellow highlight. This isn't terribly useful right now, but as we roll out new features you'll see why I'm going this route.&lt;/p&gt; &lt;p&gt;I was also testing out the waters with this page. GitHub has an extremely particular and vocal audience that doesn't represent the typical web user. I wanted to make sure that the general reaction was positive. Judging from the twitter updates and in-person feedback I've gotten, people seem to like the changes -- so you'll see more of this style around the site in the future.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/skitched-59-2-20091109-111602.jpg&quot; alt=&quot;New Account Settings Pages&quot;&gt;&lt;/p&gt; &lt;p&gt;Along with the new profile pages, we also rolled out updated account settings pages. Previously, you had to edit your profile information in-place on the profile page, but now it's grouped with the rest of your settings.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/skitched-60-20091108-173516.jpg&quot; alt=&quot;New billing page&quot;&gt;&lt;/p&gt; &lt;p&gt;Previously all of the billing information was crammed into a little grey box in the upper right of the account settings page. With the updated account settings page I decided to create a dedicated billing page. This page shows your plan usage in an easier to access manner and (hopefully) makes it easier to upgrade to paid accounts! :)&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://share.kyleneath.com/captures/skitched-61-20091108-173545.jpg&quot; alt=&quot;New dashboard headers&quot;&gt;&lt;/p&gt; &lt;p&gt;The last update we've rolled out are new-style dashboard headers. The reason for these aren't entirely obvious right now -- but in time they will become a lot more useful. I realize these new headers do push down the repository lists by about 60px, but it was a compromise that I decided to make to give us room for the future.&lt;/p&gt; &lt;p&gt;Hopefully you guys are enjoying the evolution of the GitHub interface, I've been having a blast watch the feedback pour in after each push.&lt;/p&gt;</description>
         <author>kneath</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/54c9dda81828663e</guid>
         <pubDate>Sun, 08 Nov 2009 17:33:36 -0800</pubDate>
      </item>
      <item>
         <title>GitHub Meetup Poznań, Poland</title>
         <link>http://github.com/blog/544-github-meetup-pozna%C5%84-poland</link>
         <description>&lt;p&gt;Tom, PJ, and Scott will be hanging out at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://moodclub.pl&quot;&gt;&lt;span&gt;MOOD&lt;/span&gt; Club&lt;/a&gt; at 21:30 tonight (Saturday) in Poznań, Poland following the first day of the RuPy Conference. If you’re local or in town for the conference, come by and say hi!&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;http://moodclub.pl/UserFiles//File/OpenCzerwiec2008/080627_Poznan_Mood_004.JPG&quot;&gt;&lt;/div&gt;</description>
         <author>mojombo</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/c393042e710763a9</guid>
         <pubDate>Sat, 07 Nov 2009 09:06:04 -0800</pubDate>
      </item>
      <item>
         <title>Decertifying &quot;Terrorist&quot; Pilots</title>
         <link>http://www.schneier.com/blog/archives/2009/11/decertifying_te.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/61a6e4e511209383</guid>
         <pubDate>Mon, 23 Nov 2009 12:36:46 -0800</pubDate>
      </item>
      <item>
         <title>Al Qaeda Secret Code Broken</title>
         <link>http://www.schneier.com/blog/archives/2009/11/al_qaeda_secret.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/80bc526501c4d8ad</guid>
         <pubDate>Mon, 23 Nov 2009 05:24:28 -0800</pubDate>
      </item>
      <item>
         <title>Quickpost: SelectMyParent or Playing With the Windows Process Tree</title>
         <link>http://blog.didierstevens.com/2009/11/22/quickpost-selectmyparent-or-playing-with-the-windows-process-tree/</link>
         <description>&lt;div&gt;&lt;br&gt;&lt;p&gt;I read something very interesting in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.wintellect.com/BookInformation.aspx?ASIN=0735624240&quot;&gt;“Windows via C/C++”&lt;/a&gt; today: starting with Windows Vista, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx&quot;&gt;CreateProcess&lt;/a&gt; can start a program where you specify the parent process! This is something forensic investigators must be aware of when they analyse processes running on a Windows machine.&lt;/p&gt;
&lt;p&gt;Normally the parent process of a new process is the process that created the new process (via CreateProcess). But when using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/en-us/library/ms686329%28VS.85%29.aspx&quot;&gt;STARTUPINFOEX&lt;/a&gt; with the right &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/en-us/library/ms683481%28VS.85%29.aspx&quot;&gt;LPPROC_THREAD_ATTRIBUTE_LIST&lt;/a&gt; to create a process, you can arbitrarely specify the parent process, provided you have the rights (i.e. it’s your process or you have debug rights).&lt;/p&gt;
&lt;p&gt;I developed a small tool to start a program while specifying its parent process: SelectMyParent. Here I use it to start notepad as a child of lsass.exe:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091122-211535&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091122-211535.png?w=601&amp;amp;h=140&quot; alt=&quot;&quot; width=&quot;601&quot; height=&quot;140&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091122-211621&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091122-211621.png?w=619&amp;amp;h=99&quot; alt=&quot;&quot; width=&quot;619&quot; height=&quot;99&quot;&gt;&lt;/p&gt;
&lt;p&gt;2 remarks about this example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;to make lsass.exe a parent process, you need to use SelectMyParent with admin rights and elevate its rights (Run as administrator)&lt;/li&gt;
&lt;li&gt;the notepad process takes over the parent process’ account: NT AUTHORITY&amp;#92;SYSTEM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I don’t know how one can detect that a process’ parent is not the process that created it, because a process has no access to its extended startup info (only to its startup info). And it is the extended startup info that contains the attribute list with the handle to the parent process.&lt;/p&gt;
&lt;p&gt;SelectMyParent version 0.0.0.1 is available &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.didierstevens.com/files/software/SelectMyParent_v0_0_0_1.zip&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.didierstevens.com/2007/11/01/announcing-quickposts/&quot;&gt;Quickpost info&lt;/a&gt;
&lt;p&gt; &lt;/p&gt;
&lt;hr&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/didierstevens.wordpress.com/1860/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/didierstevens.wordpress.com/1860/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/didierstevens.wordpress.com/1860/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/didierstevens.wordpress.com/1860/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/didierstevens.wordpress.com/1860/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/didierstevens.wordpress.com/1860/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/didierstevens.wordpress.com/1860/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/didierstevens.wordpress.com/1860/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/didierstevens.wordpress.com/1860/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/didierstevens.wordpress.com/1860/&quot;&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.didierstevens.com&amp;amp;blog=264765&amp;amp;post=1860&amp;amp;subd=didierstevens&amp;amp;ref=&amp;amp;feed=1&quot;&gt;&lt;/div&gt;</description>
         <author>Didier Stevens</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7a8f70da0963476d</guid>
         <pubDate>Sun, 22 Nov 2009 12:36:53 -0800</pubDate>
         <media:group>
            <media:content url=""/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091122-211535.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091122-211621.png"/>
         </media:group>
      </item>
      <item>
         <title>Best of Application Security (Friday, Nov. 20)</title>
         <link>http://feedproxy.google.com/~r/JeremiahGrossman/~3/Bq9EjE4FYds/best-of-application-security-friday-nov_20.html</link>
         <description>Ten of Application Security industry's coolest, most interesting, important, and entertaining links from the past week -- in no particular order. Regularly released until year end. Then the Best of Application Security 2009 will be selected!&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.securityninja.co.uk/owasp-top-ten-2010-and-the-principles-of-secure-development&quot;&gt;OWASP Top Ten 2010 and The Principles of Secure Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.theregister.co.uk/2009/11/20/internet_explorer_security_flaw/&quot;&gt;Major IE8 flaw makes 'safe' sites unsafe&lt;/a&gt; &amp;amp; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities/&quot;&gt;NoScript author's response&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ha.ckers.org/blog/20091118/dns-rebinding-for-scraping-and-spamming&quot;&gt;DNS Rebinding for Scraping and Spamming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pmelson.blogspot.com/2009/11/reversing-javascript-shellcode-step-by.html&quot;&gt;Reversing JavaScript Shellcode: A Step By Step How-To &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.room362.com/blog/2009/11/19/brute-forcing-compatibility.html&quot;&gt;Brute-Forcing Compatibility &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=7606f801-70c5-49ca-a18c-91d4ed725833&amp;amp;displaylang=en&quot;&gt;Preventing Security Development Errors: Lessons Learned at Windows Live by Using ASP.NET MVC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.owasp.org/index.php/Board_member&quot;&gt;OWASP Board - Election Results &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.ivanristic.com/2009/11/announcing-modsecurity-handbook.html&quot;&gt;Announcing ModSecurity Handbook &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://i8jesus.com/?p=96&quot;&gt;ESAPI Web Application Firewall released! &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jtmelton.com/2009/01/03/the-owasp-top-ten-and-esapi/&quot;&gt;OWASP Top Ten and ESAPI&lt;/a&gt; &amp;amp; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jtmelton.com/2009/01/12/the-owasp-top-ten-and-esapi-part-2-cross-site-scripting-xss/&quot;&gt;Part 2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;br&gt;&lt;hr&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.whitehatsec.com/&quot;&gt;WhiteHat Security&lt;/a&gt; is a leading provider of website security services. &lt;br&gt;&lt;hr&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13756280-6997201052225711014?l=jeremiahgrossman.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Jeremiah Grossman</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/ad26175ad6f479f0</guid>
         <pubDate>Fri, 20 Nov 2009 10:52:00 -0800</pubDate>
      </item>
      <item>
         <title>Friday Squid Blogging: New Squid Discovered</title>
         <link>http://www.schneier.com/blog/archives/2009/11/friday_squid_bl_209.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3c46370097992f64</guid>
         <pubDate>Fri, 20 Nov 2009 14:57:09 -0800</pubDate>
      </item>
      <item>
         <title>Interview with Me</title>
         <link>http://www.schneier.com/blog/archives/2009/11/interview_with_15.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7503018fff73f68c</guid>
         <pubDate>Fri, 20 Nov 2009 11:21:14 -0800</pubDate>
      </item>
      <item>
         <title>FailBlog on Security</title>
         <link>http://www.schneier.com/blog/archives/2009/11/failblog_on_sec.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/990542e90a2b321a</guid>
         <pubDate>Fri, 20 Nov 2009 09:11:19 -0800</pubDate>
      </item>
      <item>
         <title>Hex-Rays Plugin Contest</title>
         <link>http://hexblog.com/2009/11/hexrays_plugin_contest.html</link>
         <description>&lt;p&gt;We are glad to announce the results of our first plugin contest! For the contest rules, please check this page:&lt;/p&gt; &lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hex-rays.com/contest.shtml&quot;&gt;http://www.hex-rays.com/contest.shtml&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Or you may directly go to the contest results and check out some cool plugins:&lt;/p&gt; &lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hex-rays.com/contest2009&quot;&gt;http://www.hex-rays.com/contest2009&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It was our first contest, but we are happy with the results and will repeat it in the near future.&lt;br&gt;
Have fun!&lt;/p&gt;</description>
         <author>Ilfak Guilfanov</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a6452da0c80e4bba</guid>
         <pubDate>Fri, 20 Nov 2009 06:42:45 -0800</pubDate>
      </item>
      <item>
         <title>Denial-of-Service Attack Against CALEA</title>
         <link>http://www.schneier.com/blog/archives/2009/11/denial-of-servi.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/01b2f9c46893a2e9</guid>
         <pubDate>Fri, 20 Nov 2009 04:11:17 -0800</pubDate>
      </item>
      <item>
         <title>Update: bpmtk with hook-createprocess.dll</title>
         <link>http://blog.didierstevens.com/2009/11/19/update-bpmtk-with-hook-createprocess-dll/</link>
         <description>&lt;div&gt;&lt;br&gt;&lt;p&gt;There are no real changes in this new version of bpmtk, only a new DLL (hook-createprocess.dll) was added. You can use this DLL to protect your Windows machine from getting infected by the current malicious documents found in-the-wild.&lt;/p&gt;
&lt;p&gt;You can download bpmtk version 0.1.6.0 &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.didierstevens.com/files/software/bpmtk_V0_1_6_0.zip&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hook-createprocess.dll is a DLL that patches the process into which it is loaded to prevent it from creating new processes. It does this by patching the Import Address Table of kernel32.dll for ntdll.dll to hook API functions NtCreateProcessEx, NtCreateProcess and NtCreateUserProcess.&lt;br&gt;
Calls to these functions are intercepted and not passed on to the original functions. Instead, a code is returned indicating that the operation was blocked. The result is that functions in kernel32 used to create new processes fail (like WinExec) and hence that the patched process can’t create new processes.&lt;br&gt;
This is all it takes to block most shellcode found in malicious documents like PDF malware. Shellcode like this does the following:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-01&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-01.png?w=656&amp;amp;h=260&quot; alt=&quot;&quot; width=&quot;656&quot; height=&quot;260&quot;&gt;&lt;br&gt;
Of course, since this protective measure is taken by patching the process, shellcode could undo this patching and bypass our protection. Or it could use the ntdll API and not be hindered by our patch. But actual malware found in-the-wild doesn’t do this (not talking about targeted attacks) and is thus prevented from executing the trojan it just downloaded or extracted from the PDF document.&lt;/p&gt;
&lt;p&gt;If you want better protection, you’ll have to use something that works at the level of the kernel, like sandboxing software.&lt;/p&gt;
&lt;p&gt;However, this patch comes with some drawbacks, because it also blocks bening new processes. For example, the update function of Adobe Acrobat requires the creation of a new process. To reenable the creation of processes, you have to unload hook-createprocess.dll (unloading removes the hooks). bpmtk has a function to unload DLLs from a process (reject).&lt;/p&gt;
&lt;p&gt;There are a couple of trick to load this DLL with the program you want to protect. I’ll describe a generic method in an upcoming post, but now I want to explain it for a specific program.&lt;br&gt;
Programs have a list of DLLs they need for their execution. We will use a PE-file editor to add our hook-createprocess.dll to this list. hook-createprocess.dll exports a dummy function (_Dummy) just so you can add to the imports table of an executable. We will use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.woodmann.net/collaborative/tools/index.php/LordPE&quot;&gt;LordPE&lt;/a&gt; to add hook-createprocess.dll with _Dummy to Adobe Reader:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-195802&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-195802.png?w=653&amp;amp;h=301&quot; alt=&quot;&quot; width=&quot;653&quot; height=&quot;301&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-195846&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-195846.png?w=626&amp;amp;h=496&quot; alt=&quot;&quot; width=&quot;626&quot; height=&quot;496&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-203031&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-203031.png?w=560&amp;amp;h=268&quot; alt=&quot;&quot; width=&quot;560&quot; height=&quot;268&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-200145&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-200145.png?w=446&amp;amp;h=421&quot; alt=&quot;&quot; width=&quot;446&quot; height=&quot;421&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click the Import table:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-200229&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-200229.png?w=644&amp;amp;h=308&quot; alt=&quot;&quot; width=&quot;644&quot; height=&quot;308&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-200412&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-200412.png?w=358&amp;amp;h=203&quot; alt=&quot;&quot; width=&quot;358&quot; height=&quot;203&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-200422&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-200422.png?w=358&amp;amp;h=203&quot; alt=&quot;&quot; width=&quot;358&quot; height=&quot;203&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;20091119-200442&quot; src=&quot;http://didierstevens.files.wordpress.com/2009/11/20091119-200442.png?w=644&amp;amp;h=308&quot; alt=&quot;&quot; width=&quot;644&quot; height=&quot;308&quot;&gt;&lt;/p&gt;
&lt;p&gt;And don’t forget to save…&lt;/p&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/didierstevens.wordpress.com/1841/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/didierstevens.wordpress.com/1841/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/didierstevens.wordpress.com/1841/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/didierstevens.wordpress.com/1841/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/didierstevens.wordpress.com/1841/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/didierstevens.wordpress.com/1841/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/didierstevens.wordpress.com/1841/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/didierstevens.wordpress.com/1841/&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/didierstevens.wordpress.com/1841/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/didierstevens.wordpress.com/1841/&quot;&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.didierstevens.com&amp;amp;blog=264765&amp;amp;post=1841&amp;amp;subd=didierstevens&amp;amp;ref=&amp;amp;feed=1&quot;&gt;&lt;/div&gt;</description>
         <author>Didier Stevens</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6a3762d6df02f86f</guid>
         <pubDate>Thu, 19 Nov 2009 11:32:34 -0800</pubDate>
         <media:group>
            <media:content url=""/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-01.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-195802.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-195846.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-203031.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-200145.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-200229.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-200412.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-200422.png"/>
         </media:group>
         <media:group>
            <media:content url="http://didierstevens.files.wordpress.com/2009/11/20091119-200442.png"/>
         </media:group>
      </item>
      <item>
         <title>A Taxonomy of Social Networking Data</title>
         <link>http://www.schneier.com/blog/archives/2009/11/a_taxonomy_of_s.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a910528e5ff6dee4</guid>
         <pubDate>Thu, 19 Nov 2009 10:51:17 -0800</pubDate>
      </item>
      <item>
         <title>Stabbing People with Stuff You Can Get Through Airport Security</title>
         <link>http://www.schneier.com/blog/archives/2009/11/stabbing_people.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/62582f2cef74a887</guid>
         <pubDate>Thu, 19 Nov 2009 05:10:41 -0800</pubDate>
      </item>
      <item>
         <title>How Smart are Islamic Terrorists?</title>
         <link>http://www.schneier.com/blog/archives/2009/11/how_smart_are_i.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/89adaebffd458322</guid>
         <pubDate>Wed, 18 Nov 2009 11:45:32 -0800</pubDate>
      </item>
      <item>
         <title>Quantum Ghost Imaging</title>
         <link>http://www.schneier.com/blog/archives/2009/11/quantum_ghost_i.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6e8d2a03673c6a14</guid>
         <pubDate>Wed, 18 Nov 2009 04:22:26 -0800</pubDate>
      </item>
      <item>
         <title>Secret Knock Lock</title>
         <link>http://www.schneier.com/blog/archives/2009/11/secret_knock_lo.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/65a73e557affd7c6</guid>
         <pubDate>Tue, 17 Nov 2009 12:00:25 -0800</pubDate>
      </item>
      <item>
         <title>vsftpd-2.2.2 released</title>
         <link>http://scarybeastsecurity.blogspot.com/2009/11/vsftpd-222-released.html</link>
         <description>Just a quick note that I released vsftpd-2.2.2.&lt;br&gt;Most significantly, a regression was fixed in the inbuilt listener. Heavily loaded sites could see a session get booted out just after the initial connect. If you saw &quot;500 OOPS: child died&quot;, that was probably this.&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://vsftpd.beasts.org/&quot;&gt;http://vsftpd.beasts.org/&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3024470480937744884-4067892559216946529?l=scarybeastsecurity.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Chris</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/c20fbf5eb907b77b</guid>
         <pubDate>Tue, 17 Nov 2009 12:42:00 -0800</pubDate>
      </item>
      <item>
         <title>A Useful Side-Effect of Misplaced Fear</title>
         <link>http://www.schneier.com/blog/archives/2009/11/a_useful_side-e.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/143fe8d615ef1eec</guid>
         <pubDate>Tue, 17 Nov 2009 03:58:07 -0800</pubDate>
      </item>
      <item>
         <title>Page2RSS Monitored Page: Stefan Savage</title>
         <link>http://page2rss.com/page?url=cseweb.ucsd.edu/~savage/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/aab2fbfbc7b93d56</guid>
         <pubDate>Mon, 16 Nov 2009 14:53:25 -0800</pubDate>
      </item>
      <item>
         <title>Anti-Malware Detection and the Original Trojan Horse</title>
         <link>http://www.schneier.com/blog/archives/2009/11/anti-malware_de.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a3e9d5107c172124</guid>
         <pubDate>Mon, 16 Nov 2009 11:09:45 -0800</pubDate>
      </item>
      <item>
         <title>Public Reactions to Terrorist Threats</title>
         <link>http://www.schneier.com/blog/archives/2009/11/public_reaction.html</link>
         <author>schneier</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bda3469af1ef3695</guid>
         <pubDate>Mon, 16 Nov 2009 04:39:11 -0800</pubDate>
      </item>
      <item>
         <title>Special LAMBDA meeting – Brent Yorgey</title>
         <link>http://www.ittc.ku.edu/csdlblog/?p=20</link>
         <description>&lt;p&gt;Brent Yorgey (former editor on HWN, PhD student from the Programming Languages Group at the University of Pennsylvania) will be visiting KU on Tuesday. He will be talking at 1pm.&lt;/p&gt;
&lt;p&gt;Title: Random testing and beyond with combinatorial species&lt;br&gt;
Time: 1pm&lt;br&gt;
Place: ITTC (conference room TBD).&lt;/p&gt;
&lt;p&gt;Abstract:&lt;/p&gt;
&lt;p&gt; How can we perform effective random testing of functions involving recursive data types? What about functions involving recursive data types and constrained (type class) polymorphism? Can we extend our programming languages with mechanisms for declaring and computing with data types whose subparts are not completely ordered (e.g. bags or cycles)? These are just a few of the questions we may be able to answer using the theory of combinatorial species, which deserves to be much better known in the functional programming community. I will focus on test case generation for recursive data types as a case study, using it to build some intuition for combinatorial species and the magic of generating functions. I will then hint at some other applications of combinatorial species and directions for further research.&lt;/p&gt;
&lt;p&gt;Brent’s web page: http://www.cis.upenn.edu/~byorgey/&lt;/p&gt;</description>
         <author>Andy Gill</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/9ed170807311ff3b</guid>
         <pubDate>Mon, 23 Nov 2009 09:11:45 -0800</pubDate>
      </item>
      <item>
         <title>David Kravets on ACTA</title>
         <link>http://blog.lexspoon.org/2009/11/david-kravets-on-acta.html</link>
         <description>David Kravets writes in Wired that he is not real happy with ACTA, especially with the way it's being developed:&lt;br&gt;&lt;blockquote&gt;Dan Glickman, the MPAA’s chairman, informs lawmakers that millions of film-related jobs are in peril because of internet piracy. Simply put, those who don’t back the proposed Anti-Counterfeiting and Trade Agreement don’t support intellectual property rights, he wrote.&lt;br&gt;&lt;br&gt;“Opponents of ACTA are either indifferent to this situation, or actively hostile toward efforts to improve copyright enforcement worldwide,” Glickman wrote.&lt;br&gt;&lt;br&gt;That’s an insultingly black-and-white viewpoint. It’s also not an accurate description of the treaty’s critics.&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;I am not hostile to intellectual property in general, but I oppose ACTA. I simply think we should take it as a constraint that we not give up basic liberties like being able to copy a CD for a friend. I don't think we necessarily have to protect incumbents as technology improves, but in this case copyrights can still be protected and made profitable. For example, we could loosen copyright but tighten rights on public performance.&lt;br&gt;&lt;br&gt;&lt;p&gt;More fundamentally, this issue should be discussed in public, and with representation by people trying to devise a better way. The ACTA negotiations appear to be between two groups of people: national officials and current copyright holders. I expect the first group is offering police work, the second group taxes, and they'll close the deal once they've agreed on how much of each.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5479191305093780981-1873889413958850909?l=blog.lexspoon.org&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Lex Spoon</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/0d9c465e3dc829b4</guid>
         <pubDate>Mon, 23 Nov 2009 05:47:00 -0800</pubDate>
      </item>
      <item>
         <title>Adding automatic semicolon insertion to a Javascript parser</title>
         <link>http://langexplr.blogspot.com/2009/11/adding-automatic-semicolon-insertion-to.html</link>
         <description>A couple of weeks ago I wrote a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://langexplr.blogspot.com/2009/10/parsing-javascript-using-newspeak.html&quot;&gt;blog post&lt;/a&gt; about a Javascript parser written using the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://newspeaklanguage.org/&quot;&gt;Newspeak&lt;/a&gt; parsing combinators. As mentioned in that post, no semicolon insertion was supported. This post shows how the feature was added.&lt;br&gt;&lt;br&gt;&lt;h4&gt;Automatic semicolon insertion&lt;/h4&gt;&lt;br&gt;&lt;br&gt;As detailed in section 7.9 of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.co.cr/url?q=http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&amp;amp;ei=9XYKS9OwGMmztge1zfGuCg&amp;amp;sa=X&amp;amp;oi=nshc&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;ved=0CAgQzgQoAA&amp;amp;usg=AFQjCNHo6znh-7fu96Ap1ioZYtIbaPBaMg&quot;&gt;ECMA 262 document[PDF]&lt;/a&gt;, in Javascript you can use newline as statement separator in some scenarios. For example a semicolon is &quot;implicitly inserted&quot; if expression-statements are separated by line terminators:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&lt;br&gt;if (condition) {&lt;br&gt; print(&quot;A&quot;)&lt;br&gt; print(&quot;B&quot;)&lt;br&gt;}&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;This code snippet is equivalent to:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&lt;br&gt;if (condition) {&lt;br&gt; print(&quot;A&quot;);&lt;br&gt; print(&quot;B&quot;);&lt;br&gt;}&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;h4&gt;Solution&lt;/h4&gt;&lt;br&gt;&lt;br&gt;In the a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://langexplr.blogspot.com/2009/10/parsing-javascript-using-newspeak.html&quot;&gt;original post&lt;/a&gt; about the parser, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ongiantsshoulders.blogspot.com/&quot;&gt;espin&lt;/a&gt; pointed me out to a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.vpri.org/pdf/tr2007003_ometa.pdf&quot;&gt;paper[PDF]&lt;/a&gt; by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.tinlizzie.org/~awarth/&quot;&gt;A. Warth&lt;/a&gt; that mentions how the semicolon insertion problem was solved in a Javascript parser written in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tinlizzie.org/ometa/&quot;&gt;OMeta&lt;/a&gt;. The solution presented is this post is based on the one from the paper.&lt;br&gt;&lt;br&gt;&lt;br&gt;I wanted to isolate the code that performs this function. So in order to add this functionality I created a subclass that overrides the productions that get involved in this process. This way we can have both a parser with and without the feature. Here's the code:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&lt;br&gt;class JSGrammarWithSemicolonInsertion = JSGrammar (&lt;br&gt;&lt;span&gt;&quot;Parser features that add automatic semicolon insertion&quot;&lt;/span&gt;&lt;br&gt;|&lt;br&gt; &lt;br&gt; specialStatementTermination = ((( cr | lf ) not &amp;amp; whitespace ) star,&lt;br&gt; (semicolon | comment | lf | cr | (peek: $})) ) &lt;br&gt; wrapper: [ :ws :terminator | | t | t:: Token new. t token: $;. t].&lt;br&gt;&lt;br&gt; returnStatement = return, (specialStatementTermination | &lt;br&gt; (expression , specialStatementTermination)).&lt;br&gt;&lt;br&gt; breakStatement = break, (specialStatementTermination | &lt;br&gt; (identifier , specialStatementTermination)). &lt;br&gt;&lt;br&gt; continueStatement = continue, (specialStatementTermination | &lt;br&gt; (identifier , specialStatementTermination)). &lt;br&gt;&lt;br&gt; whitespaceNoEOL = (( cr | lf ) not &amp;amp; whitespace ) star,&lt;br&gt; (((peek: (Character cr)) | (peek: (Character lf))) not) .&lt;br&gt;&lt;br&gt; throwStatement = throw, whitespaceNoEOL , expression , specialStatementTermination. &lt;br&gt;&lt;br&gt; expressionStatement = (((function | leftbrace) not) &amp;amp; expression), specialStatementTermination.&lt;br&gt;&lt;br&gt; variableStatement = var, variableDeclarationList, specialStatementTermination.&lt;br&gt;| &lt;br&gt;)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;The result of parsing the following code:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&lt;br&gt;&lt;span&gt;var&lt;/span&gt; x = 0&lt;br&gt;&lt;span&gt;while&lt;/span&gt; (&lt;span&gt;true&lt;/span&gt;) {&lt;br&gt; x++&lt;br&gt; document.write(x)&lt;br&gt; &lt;span&gt;if&lt;/span&gt; ( x &amp;gt; 10)&lt;br&gt; &lt;span&gt;break&lt;/span&gt;&lt;br&gt; else &lt;span&gt;continue&lt;/span&gt;&lt;br&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;... is presented using the utility created for the previous post:&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_qePSufqunG4/Swp2ra6iDGI/AAAAAAAAAPg/EuEP_lKqoUI/s1600/nwsjsparsingsci1.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:330px;height:400px;&quot; src=&quot;http://4.bp.blogspot.com/_qePSufqunG4/Swp2ra6iDGI/AAAAAAAAAPg/EuEP_lKqoUI/s400/nwsjsparsingsci1.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Code for this post is available &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/ldfallas/newspeakexperiments/tree/master/jsparser/&quot;&gt;here&lt;/a&gt;.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8273201239805322932-8164506257701673619?l=langexplr.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Luis Diego Fallas</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/42716e7136f8b4c8</guid>
         <pubDate>Mon, 23 Nov 2009 04:03:00 -0800</pubDate>
      </item>
      <item>
         <title>David Pollak is happy about using Scala</title>
         <link>http://blog.lexspoon.org/2009/11/david-pollak-is-happy-about-using-scala.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.lostlake.org/index.php?/archives/97-Happy-3rd-Anniversay.html&quot;&gt;David Pollak is happy about using Scala:&lt;/a&gt;&lt;br&gt;&lt;blockquote&gt;&lt;br&gt;I've been a JVM guy since '96, so finding a language that was as on the JVM was a plus for me. I was looking for a statically typed language with high performance, but with the syntactic economy of Ruby. I bounced around a couple of language listing sites and found Scala. Three years ago, I fell in total love with Scala. That love continues today.&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;I can't say I blame him.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5479191305093780981-8946537975523951882?l=blog.lexspoon.org&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Lex Spoon</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/aada78b0fe221e80</guid>
         <pubDate>Fri, 20 Nov 2009 17:17:00 -0800</pubDate>
      </item>
      <item>
         <title>Dehydra Testsuite Passes on GCC 4.5</title>
         <link>http://blog.mozilla.com/tglek/2009/11/20/dehydra-testsuite-passes-on-gcc-4-5/</link>
         <description>&lt;p&gt;I spent couple of days fixing the remaining test-suite failures on GCC 4.5 trunk for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://developer.mozilla.org/En/Dehydra&quot;&gt;Dehydra&lt;/a&gt;. Since the last time I looked into this, GCC went from crashing all over the place to only crashing if I did something bad. It was nice to discover that as a result of switching to 4.5 Dehydra users will get saner .isExplicit behavior and more precise location info.&lt;/p&gt;
&lt;p&gt;Treehydra will take more work due to me &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=510190&quot;&gt;misunderstanding&lt;/a&gt; GTY annotations.&lt;/p&gt;
&lt;p&gt;By the way, I am really grateful for all of the people who contributed GCC 4.5 fixes so far. You guys have been a big help in getting Dehydra testsuite to 100% on 4.5. Looks like I will meet my goals to finish De+Treehydra by the end of the year in time for GCC 4.5 release and my “Introducing Dehydra to the Developer World”-type talk at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.lca2010.org.nz/programme/schedule/view_talk/50151?day=thursday&quot;&gt;LinuxConf.au.nz 2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Startup&lt;/strong&gt;&lt;br&gt;
I reduced my focus on startup speed at the moment to catch up on Dehydra. I plan to work on reducing xpconnect overhead during startup next, ie more of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=512584&quot;&gt;this bug&lt;/a&gt;.&lt;/p&gt;</description>
         <author>tglek</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/63d5ac32d86348bf</guid>
         <pubDate>Fri, 20 Nov 2009 16:24:04 -0800</pubDate>
      </item>
      <item>
         <title>A list is an odd creature, take 2</title>
         <link>http://wadler.blogspot.com/2009/11/list-is-odd-creature-take-2.html</link>
         <description>A second entry, from Timothy Abraham.&lt;blockquote&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_cvcVu6XSdag/SwZ_94afYUI/AAAAAAAAAD4/vLIFsmmqglw/s1600/list+snake.png&quot;&gt;&lt;img style=&quot;float:right;margin:0 0 10px 10px;width:400px;height:225px;&quot; src=&quot;http://3.bp.blogspot.com/_cvcVu6XSdag/SwZ_94afYUI/AAAAAAAAAD4/vLIFsmmqglw/s400/list+snake.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;I have created this animal which represents a list, it's a snake whose tail consists of heads, in the end you'll see that the snake releases air with the empty list in it, this symbolizes the empty list, because the empty list is like air it is something but it is also nothing.&lt;/blockquote&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9757377-4479694070723319902?l=wadler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Philip Wadler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/38f75a4d77b3e0a8</guid>
         <pubDate>Fri, 20 Nov 2009 03:38:00 -0800</pubDate>
      </item>
      <item>
         <title>Go Channels</title>
         <link>http://www.airs.com/blog/archives/275</link>
         <description>&lt;p&gt;Since the first thing I liked about Go is channels, I’ll talk some more about them.&lt;/p&gt;
&lt;p&gt;IA channel can transmit a value of a specific type. That is, a channel value of type &lt;code&gt;chan T&lt;/code&gt; can transmit any value of type &lt;code&gt;T&lt;/code&gt;. This is not much of a restriction, as the type &lt;code&gt;interface {}&lt;/code&gt; can be used to match any value at all.&lt;/p&gt;
&lt;p&gt;There are two different kinds of channels: buffered and unbuffered. Unbuffered ones are the default. An unbuffered channel provides synchronous transmission of a value from a sender to a receiver. This means that if you try to send a value on the channel, and nothing is receiving from the channel, then you will block until there is a receiver. Similarly, if you try to receive and nothing is sending, you will block until there is a sender (which is pretty obvious). In other words, an unbuffered channel serves as a synchronization point between two goroutines. This is the key point of the Go memory model, which more or less amounts to saying that if you receive a value on a channel, then you will see all the writes made by the sender of the channel.&lt;/p&gt;
&lt;p&gt;Buffered channels are more straightforward: if you write a value to the channel, it simply goes into the buffer. If there isn’t room, you want until there is room.&lt;/p&gt;
&lt;p&gt;Implementing the above is fairly straightforward. However, there is another aspect to channels in Go: the select statement. The select statement permits a program to wait until some operation on a channel can proceed. It can list an arbitrary number of channels to wait for, and for each channel it can indicate whether it wants to wait to send a value or to receive a value. Implementing this efficiently is at the heart of the goroutine scheduling mechanism. For example, one interesting case is when one goroutine is selecting to write to an unbuffered channel while another goroutine is selecting to read from the channel. The scheduler must get both goroutines to synch up and transmit the value.&lt;/p&gt;
&lt;p&gt;In gccgo I currently use a thread for each goroutine, although this will have to change at some point. In order to implement select, each unbuffered channel has a linked list of select statements that are waiting for the channel to be available. When a new select statement comes along such that a send and a receive are linked, and the new select statements picks that operation to run, it has to wake up the other select such that it is forced to use the new channel. This can fail due to race conditions if there is a third select statement involved, in which case the first select has to restart. This was all a huge headache to get working, and I completely rewrote all the select code three times.&lt;/p&gt;</description>
         <author>Ian Lance Taylor</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d9990b9d626dfb38</guid>
         <pubDate>Thu, 19 Nov 2009 23:02:02 -0800</pubDate>
      </item>
      <item>
         <title>Go Channels</title>
         <link>http://www.airs.com/blog/archives/275</link>
         <description>&lt;p&gt;Since the first thing I liked about Go is channels, I’ll talk some more about them.&lt;/p&gt;
&lt;p&gt;IA channel can transmit a value of a specific type. That is, a channel value of type &lt;code&gt;chan T&lt;/code&gt; can transmit any value of type &lt;code&gt;T&lt;/code&gt;. This is not much of a restriction, as the type &lt;code&gt;interface {}&lt;/code&gt; can be used to match any value at all.&lt;/p&gt;
&lt;p&gt;There are two different kinds of channels: buffered and unbuffered. Unbuffered ones are the default. An unbuffered channel provides synchronous transmission of a value from a sender to a receiver. This means that if you try to send a value on the channel, and nothing is receiving from the channel, then you will block until there is a receiver. Similarly, if you try to receive and nothing is sending, you will block until there is a sender (which is pretty obvious). In other words, an unbuffered channel serves as a synchronization point between two goroutines. This is the key point of the Go memory model, which more or less amounts to saying that if you receive a value on a channel, then you will see all the writes made by the sender of the channel.&lt;/p&gt;
&lt;p&gt;Buffered channels are more straightforward: if you write a value to the channel, it simply goes into the buffer. If there isn’t room, you want until there is room.&lt;/p&gt;
&lt;p&gt;Implementing the above is fairly straightforward. However, there is another aspect to channels in Go: the select statement. The select statement permits a program to wait until some operation on a channel can proceed. It can list an arbitrary number of channels to wait for, and for each channel it can indicate whether it wants to wait to send a value or to receive a value. Implementing this efficiently is at the heart of the goroutine scheduling mechanism. For example, one interesting case is when one goroutine is selecting to write to an unbuffered channel while another goroutine is selecting to read from the channel. The scheduler must get both goroutines to synch up and transmit the value.&lt;/p&gt;
&lt;p&gt;In gccgo I currently use a thread for each goroutine, although this will have to change at some point. In order to implement select, each unbuffered channel has a linked list of select statements that are waiting for the channel to be available. When a new select statement comes along such that a send and a receive are linked, and the new select statements picks that operation to run, it has to wake up the other select such that it is forced to use the new channel. This can fail due to race conditions if there is a third select statement involved, in which case the first select has to restart. This was all a huge headache to get working, and I completely rewrote all the select code three times.&lt;/p&gt;</description>
         <author>Ian Lance Taylor</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/49132afc9e9e0c4b</guid>
         <pubDate>Thu, 19 Nov 2009 23:02:02 -0800</pubDate>
      </item>
      <item>
         <title>“Elements of Programming” Study Group</title>
         <link>http://cpp-next.com/archive/2009/11/%e2%80%9celements-of-programming%e2%80%9d-study-group/</link>
         <author>Dave Abrahams</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/0d6f3dba85bbb063</guid>
         <pubDate>Thu, 19 Nov 2009 13:41:25 -0800</pubDate>
      </item>
      <item>
         <title>Easy File System Path Manipulation in C#</title>
         <link>http://higherlogics.blogspot.com/2009/11/easy-file-system-path-manipulation-in-c.html</link>
         <description>I came across &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hackage.haskell.org/package/pathtype&quot;&gt;this type-safe module for handling file paths&lt;/a&gt; in the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.reddit.com/r/haskell/comments/a4cav/pathtype_typesafe_replacement_for_systemfilepath/&quot;&gt;Haskell subreddit&lt;/a&gt; this week, and thought it look kind of neat. Handling paths as strings, even with System.IO.Path always bugged me.&lt;br&gt;&lt;br&gt;So I &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sasa.svn.sourceforge.net/viewvc/sasa/trunk/Sasa/IO/Paths.cs?view=markup&quot;&gt;created a close C# equivalent of the Haskell type&lt;/a&gt; and added it to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sourceforge.net/projects/sasa/&quot;&gt;Sasa library&lt;/a&gt;, to be available in the upcoming v0.9.3 release:&lt;br&gt;&lt;pre&gt;public struct FsPath : IEnumerable&amp;lt;string&amp;gt;, IEnumerable&lt;br&gt;{&lt;br&gt; public FsPath(IEnumerable&amp;lt;string&amp;gt; parts);&lt;br&gt; public FsPath(string path);&lt;br&gt;&lt;br&gt; public static FsPath operator /(FsPath path1, FsPath path2);&lt;br&gt; public static FsPath operator /(FsPath path, IEnumerable&amp;lt;string&amp;gt; parts);&lt;br&gt; public static FsPath operator /(FsPath path, string part);&lt;br&gt; public static FsPath operator /(FsPath path, string[] parts);&lt;br&gt; public static FsPath operator /(IEnumerable&amp;lt;string&amp;gt; parts, FsPath path);&lt;br&gt; public static FsPath operator /(string part, FsPath path);&lt;br&gt; public static FsPath operator /(string[] parts, FsPath path);&lt;br&gt; public static implicit operator FsPath(string path);&lt;br&gt;&lt;br&gt; public FsPath Combine(FsPath file);&lt;br&gt; public IEnumerator&amp;lt;string&amp;gt; GetEnumerator();&lt;br&gt; public static FsPath Root(string root);&lt;br&gt; public override string ToString();&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;The above is just the interface, minus the comments which you can see at the above svn link. This struct tracks path components for you and C#'s operator overloading lets you specify paths declaratively without worrying about combining paths with proper separator characters, etc.:&lt;br&gt;&lt;pre&gt;FsPath root = &quot;/foo/bar&quot;;&lt;br&gt;var baz = root / &quot;blam&quot; / &quot;baz&quot;;&lt;br&gt;var etc = FsPath.Root(&quot;/etc/&quot;);&lt;br&gt;var passwd = etc / &quot;passwd&quot;;&lt;/pre&gt;&lt;br&gt;The library will generate path strings using the platform's directory separator.&lt;br&gt;&lt;br&gt;One significant departure from the Haskell library is the lack of phantom types used to distinguish the various combinations of relative/absolute and file/directory paths. C# can express these same constraints, but I intentionally left them out for two reasons:&lt;br&gt;&lt;ol&gt;&lt;li&gt;The type safety provided by the file/directory phantom type is rather limited, since it's only an alleged file/directory path; you have to consult the file system to determine whether the alleged type is actually true. The only minor advantage to specifying this in a path type, is as a form of documentation to users of your library that you expect a file path in a particular method, and not a directory path. I could be convinced to add it for this reason.&lt;/li&gt;&lt;br&gt;&lt;li&gt;The relative/absolute phantom type seems a bit useless to me, though the reason may be less obvious to others. IMO, the set of file and directory info classes should not have GetParent() or support &quot;..&quot; directory navigation operations, nor should they support static privilege escalation operations like File.GetAbsolutePath() which ambiently converts a string into an authority on a file/directory, since this inhibits subsystem isolation; without GetParent() or privilege escalation functions, any subsystem you hand a directory object is automatically chroot jailed to operate only in that directory. This has long been known to the capability-security community, and is how they structure all of their IO libraries (see &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/joe-e/&quot;&gt;Joe-E&lt;/a&gt; and the E programming language). Thus, in a capability-secure file system library, all paths are relative paths interpreted relative to a given directory object. As a result, FsPath also strips all &quot;.&quot; and resolve all &quot;..&quot; to within the provided path to supply this isolation.&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;It goes without saying that .NET does not currently handle files and directories this way, but I plan to handle this eventually as well. FsPath will play a significant role in ensuring that paths cannot escape the chroot jail.&lt;br&gt;&lt;br&gt;As an interim step along that path, the FsPath interface is a good first step.&lt;br&gt;&lt;br&gt;[Edit: the reddit thread for this post has &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.reddit.com/r/programming/comments/a5wl0/easy_file_system_path_manipulation_in_c/&quot;&gt;some good discussion&lt;/a&gt;.]&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2744072865491516720-193889219313572269?l=higherlogics.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Sandro Magi</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/cd8e856163283846</guid>
         <pubDate>Wed, 18 Nov 2009 19:39:00 -0800</pubDate>
      </item>
      <item>
         <title>Three Kinds of Concept Maps</title>
         <link>http://cpp-next.com/archive/2009/11/three-kinds-of-concept-maps/</link>
         <author>Doug Gregor</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/5e30dfcd0da2eefa</guid>
         <pubDate>Wed, 18 Nov 2009 08:45:37 -0800</pubDate>
      </item>
      <item>
         <title>Visualizing Empires Decline</title>
         <link>http://wadler.blogspot.com/2009/11/visualizing-empires-decline.html</link>
         <description>&lt;iframe class=&quot;embeddedvideo&quot; src=&quot;http://vimeo.com/moogaloop.swf?clip_id=6437816&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; width=&quot;400&quot; height=&quot;225&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/iframe&gt;&lt;p&gt;An elegant animation by Pedro M Cruz. Spotted via Boing Boing.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9757377-7714412474006897811?l=wadler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Philip Wadler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6860e4ef05244637</guid>
         <pubDate>Wed, 18 Nov 2009 03:24:00 -0800</pubDate>
      </item>
      <item>
         <title>Ditto</title>
         <link>http://wadler.blogspot.com/2009/11/ditto.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://photos-c.ak.fbcdn.net/hphotos-ak-snc3/hs004.snc3/11161_1271074613262_1121787758_1937707_7583229_n.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:500px;height:375px;&quot; src=&quot;http://photos-c.ak.fbcdn.net/hphotos-ak-snc3/hs004.snc3/11161_1271074613262_1121787758_1937707_7583229_n.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;A new Internet meme.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9757377-8058690732509525225?l=wadler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Philip Wadler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6511a4969a124487</guid>
         <pubDate>Wed, 18 Nov 2009 01:41:00 -0800</pubDate>
      </item>
      <item>
         <title>Guide :: Heading for Deprecation: &lt;tt&gt;export&lt;/tt&gt;, Exception Specification and &lt;tt&gt;register&lt;/tt&gt;</title>
         <link>http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=459</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/32af28fc23ac0fe7</guid>
         <pubDate>Wed, 18 Nov 2009 02:19:26 -0800</pubDate>
      </item>
      <item>
         <title>A list is an odd creature</title>
         <link>http://wadler.blogspot.com/2009/11/list-is-odd-creature.html</link>
         <description>I mentioned to my first-year students that a list is an odd creature: it has only a head and a tail, where the tail is itself a creature with only a head and a tail, and so on. I challenged them to produce a picture, and Saulius Lukauskas came up with this:&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_cvcVu6XSdag/SwLtchkl5FI/AAAAAAAAADw/E8tXvc-c1dE/s1600/shark.png&quot;&gt;&lt;img style=&quot;float:right;margin:0 10px 10px 0;width:268px;height:400px;&quot; src=&quot;http://4.bp.blogspot.com/_cvcVu6XSdag/SwLtchkl5FI/AAAAAAAAADw/E8tXvc-c1dE/s400/shark.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;blockquote&gt;I have just remembered your request for a picture of a creature, with lots of heads and a tail.&lt;br&gt;&lt;br&gt;The closest to this I was able to come up is a shark eating another shark eating ... etc.&lt;br&gt;&lt;br&gt;Let's think of shark's head as an element in the list. This way one could think of &quot;:&quot; as shark teeth 'connecting' to other shark (Cons even look like a mark from a bite!). Then the head of the smaller shark is the head of new list, and the tail of the list is the bigger shark.&lt;br&gt;&lt;br&gt;If we assume that water is [], then it also works in the bottom case with no elements in the list (no sharks) - only water. And water swallows the shark up to it's head so this also work (shark : []).&lt;/blockquote&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9757377-7754634748825518056?l=wadler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Philip Wadler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/50a032991ca9c2b9</guid>
         <pubDate>Tue, 17 Nov 2009 02:44:00 -0800</pubDate>
      </item>
      <item>
         <title>Mandelbulb</title>
         <link>http://wadler.blogspot.com/2009/11/mandelbub.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mandelbulb.s3.amazonaws.com/q85/Power8side-cut-green-small.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:884px;height:549px;&quot; src=&quot;http://mandelbulb.s3.amazonaws.com/q85/Power8side-cut-green-small.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;The quest for the 3D-analogue of the Mandelbrot curve, with some remarkable photos. Passed on by my colleague Bob Fisher, who knew of my work with students on interactive application, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://homepages.inf.ed.ac.uk/wadler/mandelbrot-maps/mmaps.html&quot;&gt;Mandelbrot Maps&lt;/a&gt;. Thanks, Bob!&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9757377-4568478425836219282?l=wadler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Philip Wadler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3309dd99fac0d264</guid>
         <pubDate>Tue, 17 Nov 2009 02:34:00 -0800</pubDate>
      </item>
      <item>
         <title>Extensible, Statically Typed Pratt Parser in C#</title>
         <link>http://higherlogics.blogspot.com/2009/11/extensible-statically-typed-pratt.html</link>
         <description>I just completed a statically typed Pratt-style single-state extensible lexer+parser, otherwise known as a top-down operator precedence parser, for the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sf.net/projects/sasa/&quot;&gt;Sasa library&lt;/a&gt;. The implementation is available in the Sasa.Parsing dll, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sasa.svn.sourceforge.net/viewvc/sasa/trunk/Sasa.Parsing/Pratt/PrattParser.cs?view=markup&quot;&gt;under Sasa.Parsing.Pratt&lt;/a&gt;. Two simple arithmetic calculators are available in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://sasa.svn.sourceforge.net/viewvc/sasa/trunk/Build/Tests/ParsingTests.cs?view=markup&quot;&gt;the unit tests&lt;/a&gt;.&lt;br&gt;&lt;br&gt;This implementation is novel in two ways: &lt;br&gt;&lt;ol&gt;&lt;li&gt;Aside from an alleged &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dmitry-kazakov.de/ada/components.htm#Parsers_etc&quot;&gt;implementation in Ada&lt;/a&gt;, this is the only statically typed Pratt parser I'm aware of.&lt;/li&gt;&lt;br&gt;&lt;li&gt;Pratt parsers typically require a pre-tokenized input before parsing semantic tokens, but I've eliminated this step by using the symbol definitions to drive a longest-match priority-based lexer.&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;Symbols by default match themselves, but you can optionally provide a scanning function used to match arbitrary string patterns. The symbol selected for the current position of the input is the symbol that matches the longest substring. If two symbols match equally, then the symbol with higher precedence is selected.&lt;br&gt;&lt;br&gt;The design was heavily influenced by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://effbot.org/zone/tdop-index.htm&quot;&gt;this Python implementation&lt;/a&gt;, though numerous departures were made to restore static typing and integrate lexing. In particular, symbols and semantic tokens are separate, where symbols are used primarily during lexing, and construct the appropriate semantic tokens on match.&lt;br&gt;&lt;br&gt;Here is a simple arithmetic calculator:&lt;br&gt;&lt;pre&gt;class Calculator : PrattParser&amp;lt;int&amp;gt;&lt;br&gt;{&lt;br&gt; public Calculator()&lt;br&gt; {&lt;br&gt; Infix(&quot;+&quot;, 10, Add); Infix(&quot;-&quot;, 10, Sub);&lt;br&gt; Infix(&quot;*&quot;, 20, Mul); Infix(&quot;/&quot;, 20, Div);&lt;br&gt; InfixR(&quot;^&quot;, 30, Pow); Postfix(&quot;!&quot;, 30, Fact);&lt;br&gt; Prefix(&quot;-&quot;, 100, Neg); Prefix(&quot;+&quot;, 100, Pos);&lt;br&gt;&lt;br&gt; // grouping symbols, ie. &quot;(_)&quot;&lt;br&gt; Group(&quot;(&quot;, &quot;)&quot;, int.MaxValue);&lt;br&gt;&lt;br&gt; // provide a predicate to identify valid literals&lt;br&gt; Match(&quot;(digit)&quot;, char.IsDigit, 1, Int);&lt;br&gt;&lt;br&gt; // ignore whitespace&lt;br&gt; SkipWhile(char.IsWhiteSpace);&lt;br&gt; }&lt;br&gt;&lt;br&gt; int Int(string lit) { return int.Parse(lit); }&lt;br&gt; int Add(int lhs, int rhs) { return lhs + rhs; }&lt;br&gt; int Sub(int lhs, int rhs) { return lhs - rhs; }&lt;br&gt; int Mul(int lhs, int rhs) { return lhs * rhs; }&lt;br&gt; int Div(int lhs, int rhs) { return lhs / rhs; }&lt;br&gt; int Pow(int lhs, int rhs) { return (int)Math.Pow(lhs, rhs); }&lt;br&gt; int Neg(int arg) { return -arg; }&lt;br&gt; int Pos(int arg) { return arg; }&lt;br&gt; int Fact(int arg)&lt;br&gt; {&lt;br&gt; return arg == 0 || arg == 1 ? 1 : arg * Fact(arg - 1);&lt;br&gt; }&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;The above is a simplified version of the calculators used in the unit tests. You can clearly see the definition of left and right-associative infix operators, and postfix operators. The numbers are precedence levels, and the delegates are the semantic actions associated with each token type.&lt;br&gt;&lt;br&gt;There are pre-defined functions for creating left and right-associative infix, prefix, postfix, and both prefix and infix ternary operators -- prefix ternary is a simple &quot;if _ then _ else _&quot;, infix ternary is like C's ternary operation, &quot;_ ? _ : _&quot;. You are not constrained to these symbol types however, as you can define arbitrary character sequences as symbols and parse the results at your whim.&lt;br&gt;&lt;br&gt;Adding variable binding to the above calculator requires a few extensions to support lexically scoped environments, but the parser requires only the following two extensions:&lt;br&gt;&lt;pre&gt;// symbol for identifiers, ie. variable names&lt;br&gt;Match(&quot;(ident)&quot;, char.IsLetter, 0,&lt;br&gt; name =&amp;gt; new Var { Name = name });&lt;br&gt;// let binding, ie. &quot;let x = 1 in x&quot;, is a&lt;br&gt;// prefix-ternary operator&lt;br&gt;TernaryPrefix(&quot;let&quot;, &quot;=&quot;, &quot;in&quot;, 90, Let);&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&quot;let&quot; is not matched as an identifier because the &quot;let&quot; symbol has a higher precedence. Parser definitions with ambiguous parses thus require some care to resolve the ambiguity either via match length or precedence relationships.&lt;br&gt;&lt;br&gt;There are two popular choices when it comes to parsing: parser generator tools and parser combinator libraries. I've never liked generators personally, as they require a separate language and entirely separate tools to define and process the grammar thus increasing the learning and maintenance curve.&lt;br&gt;&lt;br&gt;I actually like parser combinators, and there are now good techniques for supporting arbitrary left recursion in grammars (see Packrat parsing in OMeta). However, handling operator precedence often involves a series of complex extensions to the otherwise simple recursive descent, or it requires the parsed results to maintain all operator and grouping information so a post-processing phase can readjust the parse tree to reflect the proper priorities. The post-processing phase typically uses a shunting yard or Pratt-style operator precedence algorithm to resolve precedence, so why not just build the parser itself directly on Pratt parsing?&lt;br&gt;&lt;br&gt;Unlike parser-combinator libraries, of which I've built a few, Pratt parsers natively support arbitrary operator precedence and are efficient as they require no backtracking. Pratt parsers are also Turing-complete, because the semantic actions can perform arbitrary computations on the parser input. Turing completeness carries both benefits and costs of course, but the single-state nature of Pratt parsers keeps it manageable. The &quot;single state&quot; of the parser is simply the current token matched from the input.&lt;br&gt;&lt;br&gt;For example, if prefix-ternary operators weren't already available, you could simply define one like so:&lt;br&gt;&lt;pre&gt;// &quot;let&quot; is a prefix symbol on a name&lt;br&gt;var let = Prefix(&quot;let&quot;, 90, x =&amp;gt;&lt;br&gt;{&lt;br&gt; // lexer matched &quot;let&quot; prefix operator on x&lt;br&gt; // argument, a variable name&lt;br&gt; Advance(&quot;=&quot;); // advance past the &quot;=&quot;&lt;br&gt; var xValue = Parse(0); // parse the value to bind to x&lt;br&gt; Advance(&quot;in&quot;); // advance past the &quot;in&quot;&lt;br&gt; var body = Parse(0); // parse the let expression body&lt;br&gt; // return a Let expression node&lt;br&gt; return new Let{ Variable = x, Value = xValue, Body = body};&lt;br&gt;});&lt;br&gt;// declare the other symbols involved for the lexer&lt;br&gt;// but they have no associated semantic action&lt;br&gt;Symbol(&quot;=&quot;);&lt;br&gt;Symbol(&quot;in&quot;);&lt;br&gt;&lt;/pre&gt;&lt;br&gt;The above builds on &quot;Prefix&quot;, but you could break this down even further as in Pratt's original paper and define arbitrary symbol behaviour by providing a scanning function, &quot;left denotation&quot;, and &quot;null denotation&quot;, and so on.&lt;br&gt;&lt;br&gt;To define a parser, you need only inherit from Sasa.Parsing.Pratt.PrattParser, provide the semantic type T, and override the constructor for your parser to define your symbol table. The only downside is that each parser instance is monolithic and not thread-safe, so it can only parse one input at a time. There is no limit to how many parsers you can create however.&lt;br&gt;&lt;br&gt;Pratt parsing is simple, compact, and efficient, so I hope it finds more widespread use, particularly now that there is a statically typed implementation for a popular language.&lt;br&gt;&lt;br&gt;[Edit: the PrattParser will be available in the upcoming v0.9.3 release of the Sasa class library.]&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2744072865491516720-298516607488080647?l=higherlogics.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Sandro Magi</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/2b4a611dd2670ec0</guid>
         <pubDate>Mon, 16 Nov 2009 06:41:00 -0800</pubDate>
      </item>
      <item>
         <title>Go</title>
         <link>http://www.airs.com/blog/archives/273</link>
         <description>&lt;p&gt;I heard about the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://golang.org/&quot;&gt;Go programming language&lt;/a&gt; in May 2008 and was immediately interested. I spent a couple of weeks writing a preliminary gcc frontend for Go. I’ve been working on it ever since, with just a few interruptions here and there. It’s a relief that this work is finally out there.&lt;/p&gt;
&lt;p&gt;Both the language and the frontend are still explicitly experimental. So I was quite surprised by how much reaction it got. I was expecting just a few people to actually try it. Instead, I’ve basically spent all my time since Tuesday responding to comments on IRC and on the public mailing list.&lt;/p&gt;
&lt;p&gt;Anyhow, what attracted me to the language is something I’ve written about in the past, namely multicore programming. Go provides cheap threads built into the language (they’re called goroutines) and it provides cheap communication between the threads, via channels. I won’t describe them in detail in this post, but I think that making these the easy mechanisms for multi-core, as opposed to making locks easy, greatly encourages correctness.&lt;/p&gt;
&lt;p&gt;Go has a simple philosophy for multicore, which is “Do not communicate by sharing memory; instead, share memory by communicating.” What this means is that when you want two threads to share some data structure, you should do it by using explicit communication between the threads handing off ownership. You should not do it by having them both modify shared memory. Of course this only works if they have some way to communicate, which is what Go provides via channels. The point is that communication can be used to make it clear who is free to modify the data structure, and strict adherence to this approach eliminates race conditions.&lt;/p&gt;
&lt;p&gt;It’s far too early to tell whether Go will catch on, but I certainly hope that even if it doesn’t, the basic ideas in the language will become part of programming’s standard tools for multicore.&lt;/p&gt;
&lt;p&gt;There is of course more to the language than multicore, and I plan to write a few more notes about it as a I find time between mailing list replies.&lt;/p&gt;</description>
         <author>Ian Lance Taylor</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f88b004cc72f2626</guid>
         <pubDate>Sun, 15 Nov 2009 22:40:46 -0800</pubDate>
      </item>
      <item>
         <title>Go</title>
         <link>http://www.airs.com/blog/archives/273</link>
         <description>&lt;p&gt;I heard about the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://golang.org/&quot;&gt;Go programming language&lt;/a&gt; in May 2008 and was immediately interested. I spent a couple of weeks writing a preliminary gcc frontend for Go. I’ve been working on it ever since, with just a few interruptions here and there. It’s a relief that this work is finally out there.&lt;/p&gt;
&lt;p&gt;Both the language and the frontend are still explicitly experimental. So I was quite surprised by how much reaction it got. I was expecting just a few people to actually try it. Instead, I’ve basically spent all my time since Tuesday responding to comments on IRC and on the public mailing list.&lt;/p&gt;
&lt;p&gt;Anyhow, what attracted me to the language is something I’ve written about in the past, namely multicore programming. Go provides cheap threads built into the language (they’re called goroutines) and it provides cheap communication between the threads, via channels. I won’t describe them in detail in this post, but I think that making these the easy mechanisms for multi-core, as opposed to making locks easy, greatly encourages correctness.&lt;/p&gt;
&lt;p&gt;Go has a simple philosophy for multicore, which is “Do not communicate by sharing memory; instead, share memory by communicating.” What this means is that when you want two threads to share some data structure, you should do it by using explicit communication between the threads handing off ownership. You should not do it by having them both modify shared memory. Of course this only works if they have some way to communicate, which is what Go provides via channels. The point is that communication can be used to make it clear who is free to modify the data structure, and strict adherence to this approach eliminates race conditions.&lt;/p&gt;
&lt;p&gt;It’s far too early to tell whether Go will catch on, but I certainly hope that even if it doesn’t, the basic ideas in the language will become part of programming’s standard tools for multicore.&lt;/p&gt;
&lt;p&gt;There is of course more to the language than multicore, and I plan to write a few more notes about it as a I find time between mailing list replies.&lt;/p&gt;</description>
         <author>Ian Lance Taylor</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/8910e0ed8aff1513</guid>
         <pubDate>Sun, 15 Nov 2009 22:40:46 -0800</pubDate>
      </item>
      <item>
         <title>NEPLS submission</title>
         <link>http://alarmingdevelopment.org/?p=345</link>
         <description>&lt;p&gt;I submitted the following to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.nepls.org/&quot;&gt;NEPLS&lt;/a&gt;:&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Co-action&lt;br&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Co-action is a new form of synchronous reactive programming. From the programmer’s point of view, all actions take place simultaneously, and all interdependencies between actions are resolved instantaneously. Eliminating execution order avoids many of the complexities and pitfalls of imperative programming. What is novel is that co-action also supports an imperative model of state, with a heap of dynamically allocated objects pointing to one another, and assignment through pointer variables. Other forms of declarative programming either eliminate pointers or fall back to explicitly ordering execution. Co-action attempts to combine the best of both declarative and imperative programming.&lt;/p&gt;
&lt;p&gt;Declarative languages avoid pointers for good reason: to determine a correct execution order, data flow dependencies must be known, but pointer aliasing makes that undecidable at compile time. Co-action instead finds a correct execution order at run time by monitoring program execution and doing rollbacks to backtrack. The undecidable problem at compile time is converted into a search problem at run time. Co-actions are in a sense the dual of transactions, combining synchronous actions instead of isolating asynchronous actions, and parallelizing instead of serializing.&lt;/p&gt;
&lt;p&gt;To better study and communicate these ideas, I have defined a small formal calculus. The correctness criterion of an execution order is &lt;em&gt;coherence&lt;/em&gt;: every field is written at most once, and prior to any reads. The completeness theorem states that if a coherent execution order exists, then the co-action execution algorithm will find it. As of this writing I have been unable to prove completeness, and am seeking advice.&lt;/p&gt;</description>
         <author>Jonathan Edwards</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d9ec60307d5c9394</guid>
         <pubDate>Sun, 15 Nov 2009 16:36:31 -0800</pubDate>
      </item>
      <item>
         <title>Hadoop World: Hadoop + Vertica from Omer Trajman</title>
         <link>http://www.cloudera.com/blog/2009/11/23/hadoop-world-hadoop-vertica-from-omer-trajman/</link>
         <description>&lt;p&gt;Today’s Hadoop World talk comes from Omer Trajman at Vertica. He goes into detail about how Hadoop complements Vertica’s column-oriented analytic database. Our thanks to Omer — and stay tuned for more!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
         <author>alex</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/16440722474a7ffb</guid>
         <pubDate>Mon, 23 Nov 2009 15:00:42 -0800</pubDate>
      </item>
      <item>
         <title>Comments on a fabricated press release quote</title>
         <link>http://feedproxy.google.com/~r/dbms2/feed/~3/kRjzmyZucf8/</link>
         <description>&lt;p style=&quot;margin-bottom:0in;&quot;&gt;My clients at Kickfire put out a press release last week quoting me as saying things I neither said nor believe. The press release is about a “Queen For A Day” kind of contest announced way back in April, in which users were invited to submit stories of their data warehouse problems, with the biggest sob stories winning free Kickfire appliances. The fabricated “quote” reads:&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;em&gt;As we went through the contest entries in detail, it was readily apparent that today’s data warehousing solutions are either massively expensive or non-existent,” said Curt Monash, Founder of Monash Research. “Clearly, there is major dual-market opportunity for a product such as the Kickfire appliance that can not only provide an affordable data warehousing solution to small companies; but can also target larger companies that have made an initial investment in high-end solutions, yet still need to add some affordable query processing power in other areas of the organization.”&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;In reality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I spent a few minutes reviewing summaries of eight stories selected by Kickfire from the entrants, and emailed comments back to Kickfire about them. I have no further role to play in the contest.&lt;/li&gt;
&lt;li&gt;The part of the “quote” that slams Kickfire’s competitors is not reflective of my views.&lt;/li&gt;
&lt;li&gt;The “market opportunity” is in line with the positioning I’ve encouraged Kickfire to adopt. A good shorthand for it is the “Sybase IQ market.” In essence I see Kickfire as an interesting Sybase IQ alternative. But Sybase IQ is a formidable competitor, and there are many other competitors as well. This is hardly an untapped market ripe for Kickfire’s plucking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;I’m satisfied that this is all a case of lousy marketing execution – something &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/10/18/kickfire-capacity-and-pricing/&quot;&gt;Kickfire has a history of&lt;/a&gt; — rather than deliberate deception. Kickfire has recently turned over its VP of Marketing (twice) and PR resource (at least once). Scott Humphrey, Kickfire’s new outside PR guy, says he was incorrectly told by his predecessor that the press release and quote in question had been approved, and put it out without fact-checking. I believe him. I hope Kickfire CEO Bruce Armstrong will be able to add stronger marketing leadership soon. Bruce seems aware of the need, and is making reasonable marketing strategy decisions himself in the mean time, so there’s some basis for optimism.&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;And by the way – &lt;strong&gt;I don’t let vendors write press release quotes for me &lt;/strong&gt;&lt;span&gt;anyway. I let them edit in precise product names and so on, but otherwise the words are mine. The last occasion on which I recall bending this policy was inadvertent and over a year ago, when Greenplum emailed something to me — which was genuinely similar to my opinion — while I was on the phone with Aster at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2008/08/25/mapreduce-sound-bites/&quot;&gt;a particularly frenzied time&lt;/a&gt;, and I didn’t immediately realize the words weren’t my own. &lt;/span&gt;&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/dbms2/feed/~4/kRjzmyZucf8&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>Curt Monash</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/9d04dad941e42a26</guid>
         <pubDate>Mon, 23 Nov 2009 13:54:03 -0800</pubDate>
      </item>
      <item>
         <title>Recursive CTE’s: PostgreSQL</title>
         <link>http://explainextended.com/2009/11/23/recursive-ctes-postgresql/</link>
         <description>&lt;p&gt;In the previous article on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/&quot;&gt;recursive &lt;strong&gt;CTE&lt;/strong&gt;’s in &lt;strong&gt;SQL Server&lt;/strong&gt;&lt;/a&gt; I demonstrated that they are not really set-based.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL Server&lt;/strong&gt; implements the recursive &lt;strong&gt;CTE&lt;/strong&gt;’s syntax, but forbids all operations that do not distribute over &lt;code&gt;UNION ALL&lt;/code&gt;, and each recursive step sees only a single record from the previous step.&lt;/p&gt;
&lt;p&gt;Now, let’s check the same operations in &lt;strong&gt;PostgreSQL 8.4&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To do this, we well write a query that selects only the very first branch of a tree: that is, each item would be the first child of its parent. To do this, we should select the item that would be the first child of the root, the select the first child of that item etc.&lt;/p&gt;
&lt;p&gt;This is a set-based operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;’s &lt;code&gt;CONNECT BY&lt;/code&gt; syntax, despite being set-based, offers some limited set-based capabilities: you can use &lt;code&gt;ORDER SIBLINGS BY&lt;/code&gt; clause to define the order in which the siblings are returned. However, this would require some additional work to efficiently return only the first branch.&lt;/p&gt;
&lt;p&gt;In a true set-based system, this is much more simple.&lt;/p&gt;
&lt;p&gt;Let’s create a sample table:&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;
CREATE TABLE t_recursive ( id INT NOT NULL PRIMARY KEY, parent INT NOT NULL, orderer INT NOT NULL, data VARCHAR(100) NOT NULL ); CREATE INDEX ix_recursive_parent_orderer ON t_recursive (parent, orderer); SELECT SETSEED(0.20091123); INSERT
INTO t_recursive
SELECT s, (s - 1) / 5, FLOOR(RANDOM() * 10000), 'Item ' || s
FROM generate_series(1, 1000000) s;
&lt;/pre&gt;
&lt;p&gt;This table contains &lt;strong&gt;1,000,000&lt;/strong&gt; records and implements an &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/&quot;&gt;adjacency tree hierarchy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each item has at most &lt;strong&gt;5&lt;/strong&gt; children and a randomly filled column, &lt;code&gt;orderer&lt;/code&gt;, which defines its order along its siblings.&lt;/p&gt;
&lt;p&gt;Now, let’s try to make a query that would select the first branch, the order being defined by the value provided in &lt;code&gt;orderer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To do this, we should make the anchor step to return the first child of the root item, and the recursive steps to return the first child of the previously returned item.&lt;/p&gt;
&lt;p&gt;To return the first child of a given parent in the &lt;code&gt;orderer&lt;/code&gt; order, we can use &lt;strong&gt;PostgreSQL&lt;/strong&gt;’s &lt;code&gt;DISTINCT ON&lt;/code&gt; functionality.&lt;/p&gt;
&lt;p&gt;This is the same as &lt;code&gt;DISTINCT&lt;/code&gt;, but can return the whole row rather than a column &lt;code&gt;DISTINCT&lt;/code&gt; is being applied to.&lt;/p&gt;
&lt;p&gt;If two rows share the value of the column &lt;code&gt;DISTINCT ON&lt;/code&gt; is being applied to, only one of the rows will be returned. Which row will it be is defined by the &lt;code&gt;ORDER BY&lt;/code&gt; clause.&lt;/p&gt;
&lt;p&gt;This solves the problems like &lt;q&gt;return a single row that holds group-wise maximum&lt;/q&gt;.&lt;/p&gt;
&lt;p&gt;This query:&lt;/p&gt;
&lt;pre&gt;
SELECT DISTINCT ON (parent) *
FROM t_recursive
ORDER BY parent, orderer
&lt;/pre&gt;
&lt;p&gt;is the same as this one:&lt;/p&gt;
&lt;pre&gt;
SELECT (q.r).*
FROM ( SELECT r, ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY orderer) AS rn FROM t_recursive r ) q
WHERE rn = 1
&lt;/pre&gt;
&lt;p&gt;, but more legible and in some cases more efficient.&lt;/p&gt;
&lt;p&gt;To apply this clause to the task we need, we should just use &lt;code&gt;DISTINCT ON (parent)&lt;/code&gt; in both anchor and recursive parts:&lt;/p&gt;
&lt;pre&gt;
WITH RECURSIVE rows AS ( SELECT * FROM ( SELECT DISTINCT ON (parent) * FROM t_recursive WHERE parent = 0 ORDER BY parent, orderer ) q UNION ALL SELECT * FROM ( SELECT DISTINCT ON (c.parent) c.* FROM rows r JOIN t_recursive c ON c.parent = r.id ORDER BY c.parent, c.orderer ) q2 )
SELECT *
FROM rows
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;parent&lt;/th&gt;
&lt;th&gt;orderer&lt;/th&gt;
&lt;th&gt;data&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1686&lt;/td&gt;
&lt;td&gt;Item 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3370&lt;/td&gt;
&lt;td&gt;Item 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;Item 98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;492&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;1762&lt;/td&gt;
&lt;td&gt;Item 492&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2464&lt;/td&gt;
&lt;td&gt;492&lt;/td&gt;
&lt;td&gt;2295&lt;/td&gt;
&lt;td&gt;Item 2464&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12322&lt;/td&gt;
&lt;td&gt;2464&lt;/td&gt;
&lt;td&gt;2050&lt;/td&gt;
&lt;td&gt;Item 12322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61614&lt;/td&gt;
&lt;td&gt;12322&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;td&gt;Item 61614&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;308074&lt;/td&gt;
&lt;td&gt;61614&lt;/td&gt;
&lt;td&gt;1925&lt;/td&gt;
&lt;td&gt;Item 308074&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;8 rows fetched in 0.0004s (0.0042s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre&gt;
CTE Scan on rows (cost=3188.19..3207.83 rows=982 width=230) CTE rows -&amp;gt; Recursive Union (cost=0.00..3188.19 rows=982 width=230) -&amp;gt; Unique (cost=0.00..15.46 rows=2 width=23) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive (cost=0.00..15.45 rows=5 width=23) Index Cond: (parent = 0) -&amp;gt; Unique (cost=313.84..314.33 rows=98 width=23) -&amp;gt; Sort (cost=313.84..314.08 rows=98 width=23) Sort Key: c.parent, c.orderer -&amp;gt; Nested Loop (cost=0.00..310.60 rows=98 width=23) -&amp;gt; WorkTable Scan on rows r (cost=0.00..0.40 rows=20 width=4) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive c (cost=0.00..15.45 rows=5 width=23) Index Cond: (c.parent = r.id)
&lt;/pre&gt;
&lt;p&gt;This gives us a single branch containing just the records we need: each one being the first child of its parent.&lt;/p&gt;
&lt;p&gt;Now, what if we wanted to return a list of records, each being the &lt;em&gt;second&lt;/em&gt; child to its parent?&lt;/p&gt;
&lt;p&gt;Since each recursive part takes only one record as an input (and returns one record as an output), we can just replace &lt;code&gt;DISTINCT ON&lt;/code&gt; (which returns the first child of each group) with a &lt;code&gt;OFFSET 1 LIMIT 1&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
WITH RECURSIVE rows AS ( SELECT * FROM ( SELECT * FROM t_recursive WHERE parent = 0 ORDER BY orderer OFFSET 1 LIMIT 1 ) q UNION ALL SELECT * FROM ( SELECT c.* FROM rows r JOIN t_recursive c ON c.parent = r.id ORDER BY c.orderer OFFSET 1 LIMIT 1 ) q2 )
SELECT *
FROM rows
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;parent&lt;/th&gt;
&lt;th&gt;orderer&lt;/th&gt;
&lt;th&gt;data&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2540&lt;/td&gt;
&lt;td&gt;Item 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3405&lt;/td&gt;
&lt;td&gt;Item 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2884&lt;/td&gt;
&lt;td&gt;Item 33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;3084&lt;/td&gt;
&lt;td&gt;Item 166&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;833&lt;/td&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;td&gt;1848&lt;/td&gt;
&lt;td&gt;Item 833&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4169&lt;/td&gt;
&lt;td&gt;833&lt;/td&gt;
&lt;td&gt;993&lt;/td&gt;
&lt;td&gt;Item 4169&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20850&lt;/td&gt;
&lt;td&gt;4169&lt;/td&gt;
&lt;td&gt;3126&lt;/td&gt;
&lt;td&gt;Item 20850&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104251&lt;/td&gt;
&lt;td&gt;20850&lt;/td&gt;
&lt;td&gt;3021&lt;/td&gt;
&lt;td&gt;Item 104251&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;521256&lt;/td&gt;
&lt;td&gt;104251&lt;/td&gt;
&lt;td&gt;5492&lt;/td&gt;
&lt;td&gt;Item 521256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;9 rows fetched in 0.0005s (0.0043s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre&gt;
CTE Scan on rows (cost=1564.44..1564.66 rows=11 width=230) CTE rows -&amp;gt; Recursive Union (cost=3.09..1564.44 rows=11 width=230) -&amp;gt; Limit (cost=3.09..6.18 rows=1 width=23) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive (cost=0.00..15.45 rows=5 width=23) Index Cond: (parent = 0) -&amp;gt; Limit (cost=155.79..155.79 rows=1 width=23) -&amp;gt; Sort (cost=155.79..155.91 rows=49 width=23) Sort Key: c.orderer -&amp;gt; Nested Loop (cost=0.00..155.30 rows=49 width=23) -&amp;gt; WorkTable Scan on rows r (cost=0.00..0.20 rows=10 width=4) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive c (cost=0.00..15.45 rows=5 width=23) Index Cond: (c.parent = r.id)
&lt;/pre&gt;
&lt;p&gt;This query returns a whole branch of the items that are second children to their parents.&lt;/p&gt;
&lt;p&gt;Both these queries are available in &lt;strong&gt;SQL Server 2005&lt;/strong&gt;: despite the fact they do not distribute over &lt;code&gt;UNION ALL&lt;/code&gt;, they can be rewritten using a &lt;code&gt;ROW_NUMBER()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As was shown in the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/&quot;&gt;previous article&lt;/a&gt;, for some strange reason, &lt;strong&gt;SQL Server 2005&lt;/strong&gt; does not forbid this clause, but rather implements it in the incorrect way. This, however, allows writing the query we’re after.&lt;/p&gt;
&lt;p&gt;Now, let’s make a query that would recursively return the first &lt;em&gt;two children&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This requires a set-based solution, since first two children can come from different parents.&lt;/p&gt;
&lt;p&gt;A grandchild that is third to its grandfather won’t count, even if it was a first child to the first child of the grandfather.&lt;/p&gt;
&lt;p&gt;A first child to the third child of the grandfather won’t count either, even if it was the first grandchild to its grandfather.&lt;/p&gt;
&lt;p&gt;To do this right, on each step the query should accept &lt;strong&gt;2&lt;/strong&gt; items, return &lt;strong&gt;2&lt;/strong&gt; items and process the items accepted &lt;em&gt;at once&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is also easy in a true set-based recursive &lt;strong&gt;CTE&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;
WITH RECURSIVE rows AS ( SELECT * FROM ( SELECT * FROM t_recursive r WHERE parent = 0 ORDER BY orderer LIMIT 2 ) q UNION ALL SELECT * FROM ( SELECT c.* FROM rows r JOIN t_recursive c ON c.parent = r.id ORDER BY c.orderer LIMIT 2 ) q )
SELECT *
FROM rows r
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;parent&lt;/th&gt;
&lt;th&gt;orderer&lt;/th&gt;
&lt;th&gt;data&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1686&lt;/td&gt;
&lt;td&gt;Item 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2540&lt;/td&gt;
&lt;td&gt;Item 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2181&lt;/td&gt;
&lt;td&gt;Item 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3370&lt;/td&gt;
&lt;td&gt;Item 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;Item 98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;1351&lt;/td&gt;
&lt;td&gt;Item 99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;497&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;1245&lt;/td&gt;
&lt;td&gt;Item 497&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;496&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;1255&lt;/td&gt;
&lt;td&gt;Item 496&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2486&lt;/td&gt;
&lt;td&gt;497&lt;/td&gt;
&lt;td&gt;205&lt;/td&gt;
&lt;td&gt;Item 2486&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2484&lt;/td&gt;
&lt;td&gt;496&lt;/td&gt;
&lt;td&gt;362&lt;/td&gt;
&lt;td&gt;Item 2484&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12431&lt;/td&gt;
&lt;td&gt;2486&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;Item 12431&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12423&lt;/td&gt;
&lt;td&gt;2484&lt;/td&gt;
&lt;td&gt;311&lt;/td&gt;
&lt;td&gt;Item 12423&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62119&lt;/td&gt;
&lt;td&gt;12423&lt;/td&gt;
&lt;td&gt;1113&lt;/td&gt;
&lt;td&gt;Item 62119&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62120&lt;/td&gt;
&lt;td&gt;12423&lt;/td&gt;
&lt;td&gt;1121&lt;/td&gt;
&lt;td&gt;Item 62120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;310602&lt;/td&gt;
&lt;td&gt;62120&lt;/td&gt;
&lt;td&gt;341&lt;/td&gt;
&lt;td&gt;Item 310602&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;310605&lt;/td&gt;
&lt;td&gt;62120&lt;/td&gt;
&lt;td&gt;468&lt;/td&gt;
&lt;td&gt;Item 310605&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;16 rows fetched in 0.0007s (0.0043s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre&gt;
CTE Scan on rows r (cost=3122.65..3123.09 rows=22 width=230) CTE rows -&amp;gt; Recursive Union (cost=0.00..3122.65 rows=22 width=230) -&amp;gt; Limit (cost=0.00..6.18 rows=2 width=23) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive r (cost=0.00..15.45 rows=5 width=23) Index Cond: (parent = 0) -&amp;gt; Limit (cost=311.58..311.58 rows=2 width=23) -&amp;gt; Sort (cost=311.58..311.82 rows=98 width=23) Sort Key: c.orderer -&amp;gt; Nested Loop (cost=0.00..310.60 rows=98 width=23) -&amp;gt; WorkTable Scan on rows r (cost=0.00..0.40 rows=20 width=4) -&amp;gt; Index Scan using ix_recursive_parent_orderer on t_recursive c (cost=0.00..15.45 rows=5 width=23) Index Cond: (c.parent = r.id)
&lt;/pre&gt;
&lt;p&gt;This query takes all children of the previous set and returns the first two of their descendants.&lt;/p&gt;
&lt;p&gt;We see that &lt;strong&gt;PostgreSQL&lt;/strong&gt;, unlike &lt;strong&gt;SQL Server&lt;/strong&gt;, implements the recursive &lt;strong&gt;CTE&lt;/strong&gt;’s in truly set-based way.&lt;/p&gt;
&lt;p&gt;The recursive part of the query can accept a set on input, return a set on output and do the set-based operations on the set received.&lt;/p&gt;</description>
         <author>Quassnoi</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/1bc5a55f9ebe1a18</guid>
         <pubDate>Mon, 23 Nov 2009 12:00:24 -0800</pubDate>
      </item>
      <item>
         <title>Big Data on Grids or on Clouds?</title>
         <link>http://highscalability.com/blog/2009/11/23/big-data-on-grids-or-on-clouds.html</link>
         <author>Pawel Plaszczak</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3ddec147ffc9337c</guid>
         <pubDate>Mon, 23 Nov 2009 07:23:46 -0800</pubDate>
      </item>
      <item>
         <title>Battling Anti-NOSQL Trolls</title>
         <link>http://pl.atyp.us/wordpress/?p=2506</link>
         <description>&lt;p&gt;Originally from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.snailinaturtleneck.com/blog/?p=174&quot;&gt;Snail in a Turtleneck&lt;/a&gt;, who deserves all the credit for a cool name and a good post.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I have a Twitter feed for the term “nosql” and every day I get tweets like:&lt;/p&gt;
&lt;p&gt; “What moron came up with #nosql? you’re all fired!”&lt;br&gt;
…&lt;br&gt;
I hope I meet someone who says this to me someday, though, so I can say: “Boy, what a good point! If only Google and Yahoo and LinkedIn and Twitter and the thousands of other high-traffic websites had listened to you. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I see a lot of this stuff too, though in real life rather than Twitter. There are at least three points I almost always have to make when one of these trolls pops up.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We already know it’s more about ACID than SQL. Not only is such a “critique” unoriginal, but it’s irrelevant as well because it really doesn’t change anything about the relationship between traditional vs. non-traditional databases.&lt;/li&gt;
&lt;li&gt;“Not Only SQL” isn’t about saying our flavor should be the only one. It’s about rejecting that attitude from the ACID grognards.&lt;/li&gt;
&lt;li&gt;The CAP Theorem and its practical application are real, not just things that only exist in a few caffeine-addled newbies’ heads . The theorem itself was presented by a respected academic in an ACM keynote. Since then it has been the subject of formal proof by other academics, while the value of its application has been empirically demonstrated by everyone from Amazon to Yahoo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those three points are usually sufficient to stun the trolls into silence, even if expecting them to grow up and admit their error or apologize for their rudeness is unrealistic. Now, if only I could find a similar deterrent for the “cloud is just grid” trolls.&lt;/p&gt;</description>
         <author>Jeff Darcy</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/151144eadda2ea75</guid>
         <pubDate>Mon, 23 Nov 2009 06:30:00 -0800</pubDate>
      </item>
      <item>
         <title>Boston Big Data Summit keynote outline</title>
         <link>http://feedproxy.google.com/~r/dbms2/feed/~3/rEdK1QgSgEM/</link>
         <description>&lt;p style=&quot;margin-bottom:0in;&quot;&gt;Last month, Bob Zurek asked me to give a talk on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/10/09/presentations-upcoming/&quot;&gt;“Big Data”, where “big” is anything from a few terabytes on up&lt;/a&gt;, then moderate a panel on cloud computing. We agreed that I could talk just from notes, without slides. So, since I have them typed up, I’m posting them below.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;The top two points from Q&amp;amp;A probably were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Big Data and the cloud actually have relatively little to do with each other,&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/10/30/aster-data-application-server-ncluster/&quot;&gt;a few exceptions&lt;/a&gt; notwithstanding, especially if the data is in a shared-nothing DBMS (as opposed to, say, a MapReduce-oriented file cluster). Two principal reasons are:
&lt;ul&gt;
&lt;li&gt;Redistributing data from node to node is a little slow, undermining some of the elasticity benefits of the cloud.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/05/29/sneakernet-to-the-cloud/&quot;&gt;Getting data into the cloud in the first place is a lot slow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The NoSQL movement is a lot like the Ron Paul campaign&lt;/strong&gt; — it consists of people who are dissatisfied with the status quo, whose dissatisfaction has a lot to do with insufficient liberty and/or excessive expenditure, and who otherwise don’t have a whole lot in common with each other.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;Anyhow, here are my notes for the talk, edited in just a couple of places for readability or linkage.&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Quick introduction&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Big Data vs. cloud&lt;/li&gt;
&lt;li&gt;How big is Big Data?&lt;/li&gt;
&lt;li&gt;At the low end of that range, there’s little you can’t do with conventional technology if you have:
&lt;ul&gt;
&lt;li&gt;An unlimited budget for hardware&lt;/li&gt;
&lt;li&gt;An unlimited budget for software&lt;/li&gt;
&lt;li&gt;An unlimited budget for people, especially Oracle DBAs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Big Data in OLTP&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hard-core OLTP
&lt;ul&gt;
&lt;li&gt;Focus of DBMS technology for a long-time&lt;/li&gt;
&lt;li&gt;Big budgets because each transaction has significant value&lt;/li&gt;
&lt;li&gt;Tough to get users to change technologies&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lighter-weight OLTP
&lt;ul&gt;
&lt;li&gt;Classic example = web companies
&lt;ul&gt;
&lt;li&gt;Big ones — retail-oriented ones (eBay, Amazon) partially excepted — &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/05/11/facebook-hadoop-and-hive/&quot;&gt;rolled their own technology stacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reluctant to give money to anybody
&lt;ul&gt;
&lt;li&gt;Open source, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Difficulty finding market
&lt;ul&gt;
&lt;li&gt;Product vs. feature
&lt;ul&gt;
&lt;li&gt;Clustering/HA/DR/whatever&lt;/li&gt;
&lt;li&gt;Ditto cloud enablement&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;True products haven’t found much traction yet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Analytic Big Data use cases&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kinds of data for analytics
&lt;ul&gt;
&lt;li&gt;More of same != big&lt;/li&gt;
&lt;li&gt;More detail and/or new kinds
&lt;ul&gt;
&lt;li&gt;Complete data sets&lt;/li&gt;
&lt;li&gt;Transactions&lt;/li&gt;
&lt;li&gt;Call details&lt;/li&gt;
&lt;li&gt;Tick/trade history&lt;/li&gt;
&lt;li&gt;Web clickstreams&lt;/li&gt;
&lt;li&gt;Network event logs&lt;/li&gt;
&lt;li&gt;Other machine-generated data&lt;/li&gt;
&lt;li&gt;CAM bottom line
&lt;ul&gt;
&lt;li&gt;Anything human-generated should and will be retained in its entirety&lt;/li&gt;
&lt;li&gt;Quantities of machine-generated data retained should and will grow roughly in line w/ computing cost reductions (Moore’s Law, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Analytic uses of Big Data
&lt;ul&gt;
&lt;li&gt;Analytics is mainly about three things
&lt;ul&gt;
&lt;li&gt;Problem detection&lt;/li&gt;
&lt;li&gt;Customer relationship improvement
&lt;ul&gt;
&lt;li&gt;(Those overlap when the customer relationship is bad)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Financial statements on steroids&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Main kinds of analytics
&lt;ul&gt;
&lt;li&gt;What BI vendors traditionally sell
&lt;ul&gt;
&lt;li&gt;General reporting and dashboards&lt;/li&gt;
&lt;li&gt;Ad-hoc query (now driven from those reports and dashboards)&lt;/li&gt;
&lt;li&gt;Planning (allegedly integrated with BI)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Research
&lt;ul&gt;
&lt;li&gt;Ad hoc relational query (worth mentioning twice because it drives so much of the market)&lt;/li&gt;
&lt;li&gt;Data mining&lt;/li&gt;
&lt;li&gt;Most web search and web mining&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Operational/near-real-time&lt;/li&gt;
&lt;li&gt;Archiving/compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What gets Big?
&lt;ul&gt;
&lt;li&gt;Mainly research and archiving&lt;/li&gt;
&lt;li&gt;But when reporting or operational get Big, you have really interesting computing problems&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Technology issues and trends&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moore’s Law
&lt;ul&gt;
&lt;li&gt;CPUs — All about cores, hence parallelism is key&lt;/li&gt;
&lt;li&gt;RAM&lt;/li&gt;
&lt;li&gt;SSDs – hence replace disks&lt;/li&gt;
&lt;li&gt;Sensors – hence generate lots more data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kryder’s Law
&lt;ul&gt;
&lt;li&gt;But &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2005/11/13/breaking-the-disk-speed-barrier/&quot;&gt;rotational speeds up only 12.5X since Eisenhower Administration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hence solid-state memory (or RAM) will soon take over&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In the mean time, I/O bottlenecks have had to beaten
&lt;ul&gt;
&lt;li&gt;Hence sequential scans&lt;/li&gt;
&lt;li&gt;Hence &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2007/03/26/index-light-mpp-data-warehouse-appliances/&quot;&gt;index-light&lt;/a&gt; architectures&lt;/li&gt;
&lt;li&gt;Hence columnar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DBMS “overhead”
&lt;ul&gt;
&lt;li&gt;Raw license and maintenance fees – software increasing fraction of total&lt;/li&gt;
&lt;li&gt;OLTP vestiges – locking and all that&lt;/li&gt;
&lt;li&gt;DBAs
&lt;ul&gt;
&lt;li&gt;People costs = huge fraction of total&lt;/li&gt;
&lt;li&gt;Index-lightness addresses&lt;/li&gt;
&lt;li&gt;So does appliance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Many people don’t really know how to write SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configuration
&lt;ul&gt;
&lt;li&gt;Appliance/tightly-balanced
&lt;ul&gt;
&lt;li&gt;Netezza&lt;/li&gt;
&lt;li&gt;Teradata earlier&lt;/li&gt;
&lt;li&gt;Greenplum/Sun&lt;/li&gt;
&lt;li&gt;Oracle&lt;/li&gt;
&lt;li&gt;IBM&lt;/li&gt;
&lt;li&gt;Microsoft/Madison&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Commodity/do what you want
&lt;ul&gt;
&lt;li&gt;Vertica&lt;/li&gt;
&lt;li&gt;Greenplum now&lt;/li&gt;
&lt;li&gt;Infobright, Aster and others&lt;/li&gt;
&lt;li&gt;MapReduce-oriented file systems&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/10/25/data-warehouse-balanced-hardware-configuration/&quot;&gt;Extreme rigidity is silly&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/10/25/teradata-hardware-strategy-and-tactics/&quot;&gt;Teradata, Oracle have both signaled moving to more modularity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big driver of that = heterogeneous storage
&lt;ul&gt;
&lt;li&gt;Cheap disk&lt;/li&gt;
&lt;li&gt;Expensive disk&lt;/li&gt;
&lt;li&gt;Solid-state&lt;/li&gt;
&lt;li&gt;RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;CPU/storage ratio is even more of a driver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Theoretically defensible ways to segment the market&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/09/10/analytic-speed-latency/&quot;&gt;Latency requirements&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;High availability and low latency go together&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Query types
&lt;ul&gt;
&lt;li&gt;Simultaneous users for same&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Database size&lt;/li&gt;
&lt;li&gt;Budget&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-bottom:0in;&quot;&gt;&lt;strong&gt;Actual segments right now&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dbms2.com/2009/08/24/teradatas-active-enterprise-data-warehouse-story/&quot;&gt;Utter ADW/EDW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Data mart
&lt;ul&gt;
&lt;li&gt;Size&lt;/li&gt;
&lt;li&gt;Naturally columnar vs. naturally row-based&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Operational/frontline&lt;/li&gt;
&lt;li&gt;Less dramatic/smaller EDW&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/dbms2/feed/~4/rEdK1QgSgEM&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>Curt Monash</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e47a3fa25ecd8cb2</guid>
         <pubDate>Sun, 22 Nov 2009 22:25:50 -0800</pubDate>
      </item>
      <item>
         <title>Is Sandia National Lab's Red Sky Really Able to Deliver a PUE of 1.035?</title>
         <link>http://perspectives.mvdirona.com/2009/11/22/IsSandiaNationalLabsRedSkyReallyAbleToDeliverAPUEOf1035.aspx</link>
         <author>James Hamilton</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7400221ede31330c</guid>
         <pubDate>Sun, 22 Nov 2009 08:30:19 -0800</pubDate>
      </item>
      <item>
         <title>MySQL Performance Blog was down today</title>
         <link>http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/</link>
         <description>&lt;p&gt;MySQL Performance Blog (and percona.com too) were down today because the switch in our rack died completely. It took a while to fix it using secondary switch we had. Provider was not willing to do it as remote hands so I had to drive to the data center to fix it.&lt;/p&gt;
&lt;p&gt;We got number of calls and messages from the customers and friends about web site going down so we probably have to invest into getting infrastructure more redundant – currently we were quite cheap and a lot of servers have single network card (so you can’t use trunking to eliminate switch as single point of failure).&lt;/p&gt;
&lt;p&gt;The customer case management systems were not affected by this outage.&lt;/p&gt; &lt;hr noshade style=&quot;margin:0;height:1px;&quot;&gt; &lt;p&gt;Entry posted by peter | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/#comments&quot;&gt;No comment&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Add to: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/&amp;amp;title=MySQL%20Performance%20Blog%20was%20down%20today&quot; title=&quot;Bookmark this post on del.icio.us&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png&quot; alt=&quot;delicious&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/&amp;amp;title=MySQL%20Performance%20Blog%20was%20down%20today&quot; title=&quot;Digg this post on Digg.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png&quot; alt=&quot;digg&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/&amp;amp;title=MySQL%20Performance%20Blog%20was%20down%20today&quot; title=&quot;Submit this post on reddit.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png&quot; alt=&quot;reddit&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/&amp;amp;T=MySQL%20Performance%20Blog%20was%20down%20today&quot; title=&quot;Vote for this article on Netscape&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif&quot; alt=&quot;netscape&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2009/11/21/mysql-performance-blog-was-down-today/&amp;amp;title=MySQL%20Performance%20Blog%20was%20down%20today&quot; title=&quot;Add to Google Bookmarks&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png&quot; alt=&quot;Google Bookmarks&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <author>peter</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/cd6044147d20c744</guid>
         <pubDate>Sat, 21 Nov 2009 22:16:07 -0800</pubDate>
      </item>
      <item>
         <title>The future of the data center is green: Takeaways from WiredRE data center event</title>
         <link>http://blog.backblaze.com/2009/11/20/the-future-of-the-data-center-is-green-takeaways-from-wiredre-data-center-event/</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://blog.backblaze.com/wp-content/uploads/2009/11/blog-green-datacenter.jpg&quot; alt=&quot;Green Datacenter&quot;&gt;&lt;/p&gt;
&lt;p&gt;What do Google providing search, Coca-Cola operating its systems to track inventory, and Backblaze backing up your data have in common? The computers that handle all of this live in data centers. And those data centers use power - lots of it.&lt;/p&gt;
&lt;p&gt;In the U.S. alone there are over 20,000 data centers - each of which houses thousands or tens of thousands of servers. Combined, these data centers make up 3% of all U.S. energy consumption (not just electricity) - more than the entire domestic air fleet.&lt;/p&gt;
&lt;p&gt;So when I went to an event on Wednesday called:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.wiredre.com/colocation-data-center-real-estate/2009/10/data-center-dilemma-cloud-colocation-data-center-seminars/&quot;&gt;THE TRUTH ABOUT THE FUTURE OF THE DATA CENTER:&lt;br&gt;
CLOUD, COLOCATION, &amp;amp; DATA CENTER REAL ESTATE&lt;/a&gt;&lt;br&gt;
it should be no surprise that the focus was on power, power, power.&lt;/p&gt;
&lt;p&gt;And lest you think this is people getting wrapped up in the green movement or just jumping on a marketing trend - let me dissuade you. Datacenters in the U.S. spend $23 billion a year on electricity according to KC Mares of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://megawattconsulting.com/&quot;&gt;MegaWatt Consulting&lt;/a&gt;. In fact, electricity can often cost over 50% of the purchase price of a server over it’s lifetime. Minor improvements can have massive implications not only on global warming but also company bottom lines.&lt;/p&gt;
&lt;p&gt;KC provided a fascinating overview of innovations and experiments that operators of data centers and the companies building out large server deployments are pursuing. Some examples:&lt;/p&gt;
&lt;p&gt;* &lt;em&gt;VFDs&lt;/em&gt; - variable frequency drives to adjust the speed of blower fans that adjust to need rather than spinning at a constant rate.&lt;br&gt;
* &lt;em&gt;Natural cooling&lt;/em&gt; - using outside air and fans rather than air-conditioning to keep data centers cool; it turns out most servers are perfectly happy running at temperatures much higher than what data centers attempt to keep them at.&lt;br&gt;
* &lt;em&gt;Shorter cooling region&lt;/em&gt;s - having air flow almost directly around a server in the process of cooling it rather than through the entire building; shorter distances mean less air friction and less energy spent moving it around.&lt;br&gt;
* &lt;em&gt;Eliminating UPS systems&lt;/em&gt; - getting rid of the backup power systems and assuming servers will go down…and having backup servers or data centers instead.&lt;br&gt;
* &lt;em&gt;Using 480 volts&lt;/em&gt; - higher voltage means lower amperage and thus less heat loss and higher efficiency. More of today’s server systems are capable of handling this voltage.&lt;br&gt;
* &lt;em&gt;Higher efficiency power supplies&lt;/em&gt; - switching to 90% efficient power supplies on servers rather than using 70% or 80% ones; these are more expensive upfront but can still pay off fairly quickly. &lt;/p&gt;
&lt;p&gt;A number of these items pay for themselves in a couple months and then generate savings ongoing from then on. KC has a variety of information on his site and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://megawattconsulting.com/blog/&quot;&gt;blog&lt;/a&gt;.
&lt;/p&gt;</description>
         <author>Gleb Budman</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/cf4edfd4c8218e88</guid>
         <pubDate>Fri, 20 Nov 2009 15:50:06 -0800</pubDate>
      </item>
      <item>
         <title>Why SHMConfig is off by default</title>
         <link>http://mjg59.livejournal.com/118588.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/9fd1eb67123cb6ab</guid>
         <pubDate>Fri, 20 Nov 2009 08:56:40 -0800</pubDate>
      </item>
      <item>
         <title>[$] Fedora 12 and unprivileged package installation</title>
         <link>http://lwn.net/Articles/362771/rss</link>
         <author>jake</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/cf6aa69e1c34999f</guid>
         <pubDate>Fri, 20 Nov 2009 13:28:15 -0800</pubDate>
      </item>
      <item>
         <title>Paul McCullagh answers your questions about PBXT</title>
         <link>http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/</link>
         <description>&lt;p&gt;&lt;em&gt;Following on from our earlier announcement, Paul McCullagh has responded with the answers to your questions – as well as a few I gathered from other Percona folks, and attendees of OpenSQL Camp. Thank you Paul!&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;What’s the “ideal” use case for the PBXT engine, and how does it compare in performance? When would I use PBXT instead of a storage engine like MyISAM, InnoDB or XtraDB?&lt;/h3&gt;
&lt;p&gt;Unfortunately it is not possible to point to a specific category of applications and say, “PBXT will be better here, so try it”. PBXT is a general purpose transactional storage engine, designed to perform well on a broad range of tasks, much like InnoDB. However, PBXT’s log-based architecture makes performance characteristics different to both MyISAM and InnoDB/XtraDB. Tests show that PBXT’s performance is similar to InnoDB but, depending on your database designed and the application, it can be faster.&lt;/p&gt;
&lt;p&gt;PBXT is a community project and, of course, we depend on users trying it out. In the long run, this will determine to what extent we are able to continue to develop and improve the engine. So, despite this rather vague answer, we are hoping that more people try it out, and work with us to improve the engine as necessary. My thanks to all who are already doing this! &lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot;&gt; &lt;/p&gt;
&lt;h3&gt;I think I remember reports that PBXT (at an early stage) out performed InnoDB with INSERTS and UPDATES (but not SELECTS). That would make PBXT very interesting for non-SELECT-intensive applications (finance, production management etc.) in my opinion. Is this the case, and do you have any recent benchmarks available?&lt;/h3&gt;
&lt;p&gt;This is no longer necessarily the case. For example a test (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mysqlha.blogspot.com/2009/03/pbxt-is-fast-no-kidding.html&quot;&gt;http://mysqlha.blogspot.com/2009/03/pbxt-is-fast-no-kidding.html&lt;/a&gt;) by Mark Callaghan shows that PBXT can actually out perform InnoDB with SELECTs under circumstances.&lt;/p&gt;
&lt;p&gt;The implementation of full-durability has changed the performance characteristics of PBXT from “MyISAM-like” to more InnoDB-like. Originally PBXT was conceived as an engine that would be somewhere between MyISAM and InnoDB in both performance and features. The early version of PBXT was not fully durable (equivalent to innodb_flush_log_at_trx_commit=2).&lt;/p&gt;
&lt;p&gt;A major change was completed at the beginning of last year with the implementation of full-durability. In doing this it was important to keep the log-based architecture which was the reason for the high write performance of earlier versions.&lt;/p&gt;
&lt;p&gt;Traditional transactional implementations suffer from the problem that a backlog of asynchronous writes accumulate until it swamps the engine. There has been a lot of work on both InnoDB and XtraDB to solve this problem. The key words here are fuzzy and adaptive checkpointing (the former, originally implementation by Heiki for InnoDB, and the latter, an excellent addition to XtraDB).&lt;/p&gt;
&lt;p&gt;Both methods improve the management of the asynchronous writes. The idea behind the log-based solution, on the other hand, is to avoid the accumulating a backlog of asynchronous writes, but writing synchronously.&lt;/p&gt;
&lt;p&gt;Although write performance is comparable with InnoDB, I am not entirely convinced that PBXT’s implementation of the log-based I/O is optimal at this stage. This is ongoing work for PBXT 1.5.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Morgan notes: As well as Adaptive Checkpointing, Oracle has also been working on Adaptive Flushing for the InnoDB Plugin. The engine being ’swamped’ problem that Paul is referring to is best described visually – see &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.mysqlperformanceblog.com/2008/11/13/adaptive-checkpointing/&quot;&gt;this post&lt;/a&gt; for more info.&lt;/i&gt;&lt;/p&gt;
&lt;h3&gt;What were the hard decisions or trade-offs that you had to make when designing PBXT?&lt;/h3&gt;
&lt;p&gt;If you read the white paper from 2006 (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://primebase.org/download/pbxt_white_paper.pdf&quot;&gt;http://primebase.org/download/pbxt_white_paper.pdf&lt;/a&gt;) you will notice that the original design was uncompromisingly MVCC-based. Some of this has been changed to make PBXT more InnoDB-like, but other principles have remained.&lt;/p&gt;
&lt;p&gt;Pure-MVCC does not do any locking. Read locks are not required because each transaction effectively gets its own snapshot of the database. And write locks are not acquired when updating. Instead, the application can hit a “optimistic lock error” if a record is updated by another user.&lt;/p&gt;
&lt;p&gt;Now PBXT does acquire locks for 2 reasons: to support SELECT FOR UPDATE, and to avoid optimistic locking errors. This makes PBXT’s behavior identical to InnoDB in REPEATABLE READ mode.&lt;/p&gt;
&lt;p&gt;On the other hand, there are currently no plans to implement InnoDB style “gap locking”. Gap locking effectively involves locking rows that do not exist. This, in turn, means that PBXT transactions are not SERIALIZABLE. A result of this is that statement-based replication is not supported by the engine.&lt;/p&gt;
&lt;p&gt;Another hard decision was not to implement clustered indexes which I mentioned in more details later.&lt;/p&gt;
&lt;h3&gt;How does online backup work in PBXT, and is incremental backup possible?&lt;/h3&gt;
&lt;p&gt;A recent version of PBXT (1.0.09) supports the MySQL Backup API which was originally implemented in MySQL 6.0. This feature is now scheduled for an upcoming version of MySQL 5.4.&lt;/p&gt;
&lt;p&gt;The Backup API makes it possible to pull a consistent snapshot of an entire database even when tables use different engine types. The API does not yet support incremental backup, but this is planned.&lt;/p&gt;
&lt;p&gt;Internally this feature is implemented by PBXT using an MVCC-based consistent snapshot.&lt;/p&gt;
&lt;h3&gt;Does PBXT have a maintenance thread like InnoDB’s main thread?&lt;/h3&gt;
&lt;p&gt;PBXT has several system threads, that are responsible for various maintenance tasks. The most important of these are the “Writer”, the “Sweeper” and the “Checkpointer”;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; The Writer transfers data from the transaction log to the database table files. This task runs constantly and is the main source of asynchronous I/O in the engine.&lt;/li&gt;
&lt;li&gt; The Sweeper is a thread unique to the PBXT architecture. It’s job is to clean up after a transaction. Basically it recognizes which record versions are no longer needed and deletes them from the database.&lt;/li&gt;
&lt;li&gt; The Checkpointer flushes the data written by the Writer to disk. It is also responsible for writing consistent snapshots of the index files to disk. The frequency of checkpoints, as with other engines like InnoDB, determines the recovery time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Does PBXT support clustered indexes?&lt;/h3&gt;
&lt;p&gt;No, currently it does not. This is one of the original design decisions (as raised by a previous question). Two things contributed to this decision:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Supporting clustered indexes would have made the implementation of PBXT more complicated than I would have liked. My goal was to make PBXT as simple as possible, so that it is easy to maintain the code and add features.&lt;/li&gt;
&lt;li&gt; I believe clustered indexes are becoming less relevant with the rise of Solid State technology. As random read access times decrease clustering of data will become less and less important.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What is the page size in PBXT, and can it be tuned?&lt;/h3&gt;
&lt;p&gt;PBXT uses 16K pages for the index data and (approximately) 32K pages for the table data. Both sizes can be set using compile time switches. However, if the index page size is changed, then the indices need to be rebuilt, which can be done by REPAIR TABLE. The table data page size does not require a rebuild because a page of records in the table is just a group of records (not an actual fixed length page).&lt;/p&gt;
&lt;h3&gt;Are there any differences in the PBXT implementation of MVCC that might surprise experienced InnoDB DBAs? Also – In MVCC does it keep the versions in indexes, and can PBXT use MVCC for index scans?&lt;/h3&gt;
&lt;p&gt;If you are using InnoDB in REPEATABLE READ mode, then there is essentially no difference in the isolation paradigm between the two engines.&lt;/p&gt;
&lt;p&gt;REPEATABLE READ is often preferred over SERIALIZABLE mode because it allows a greater degree of concurrency while still providing the necessary transaction isolation. So I do not consider the lack of serializability as a serious deficit in the engine. And, fortunately MySQL 5.1. supports row-based replication which makes it possible to do replication while using REPEATABLE READ.&lt;/p&gt;
&lt;p&gt;PBXT does use MVCC to do index scans. Basically this means that all types of SELECTs can be done without locking.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Morgan notes: Indexes not using MVCC is one of the main differences in the Falcon storage engine.&lt;/i&gt;&lt;/p&gt;
&lt;h3&gt;PBXT supports row-level locking and foreign keys. Does this create any additional locking overhead that we should be aware of?&lt;/h3&gt;
&lt;p&gt;Firstly, PBXT does not acquire read locks. A normal SELECT does not lock at all. In addition, an UPDATE or DELETE only acquires a temporary row-lock. This lock is released when the row is updated or deleted because the MVCC system can detect that a row has been changed (and is therefore write locked).&lt;/p&gt;
&lt;p&gt;This means that PBXT does not normally need to maintain long lists of row-level locks. This is also the case when a foreign key leads to cascading operations which can affect thousands of rows.&lt;/p&gt;
&lt;p&gt;The only case you need to be aware of is SELECT FOR UPDATE. This operation acquires and holds a row-level lock for each row returned by the SELECT. These locks are all stored in RAM. The format is quite compact (especially when row IDs are consecutive) but this can become an issue if millions of rows are selected in this manner.&lt;/p&gt;
&lt;p&gt;I should also mention that the consequence of this is that SELECT … LOCK IN SHARE MODE is currently not supported.&lt;/p&gt;
&lt;h3&gt;When I evaluate a storage engine my key acceptance criteria are things like backup, concurrency, ACID compliance and crash recovery. As a storage engine developer, what other criteria do you think I should be adding?&lt;/h3&gt;
&lt;p&gt;Yes, I think you have mentioned the most important criteria. What I can add to this list are 3 things that make developing a storage engine extremely demanding: performance, stability and data integrity.&lt;/p&gt;
&lt;p&gt;Of course, as a DBA or database user these aspects are so basic that they are taken for granted.&lt;/p&gt;
&lt;p&gt;But engine developers need to keep performance, stability and data integrity in mind constantly. The problem is, they compete with each other: increasing performance often causes instabilities that then have to be fixed. How to optimize the program without compromising data integrity is a constant question.&lt;/p&gt;
&lt;p&gt;Relative to maintaining performance, stability and data integrity, adding features to an engine is easy. So I would say that these are the criteria that concern a developer the most.&lt;/p&gt;
&lt;h3&gt;MySQL supports a “pluggable storage engine API”, but it seems that not all the storage engine vendors are able to keep all their code at that layer (Infobright had to make major changes to MySQL itself). What war stories can you report on in plugging into MySQL?&lt;/h3&gt;
&lt;p&gt;Unfortunately the “war” continues. I have already received several e-mails that PBXT does not compile with the recently released MySQL 5.1.41!&lt;/p&gt;
&lt;p&gt;Any dot release can lead to this problem, and I think PBXT is fairly moderate with its integration into MySQL.&lt;/p&gt;
&lt;p&gt;My main advantage: I have been able to avoid modifying any part of MySQL to make the engine work. This means that PBXT runs with the standard MySQL/MariaDB distribution.&lt;/p&gt;
&lt;p&gt;But this has required quite a bit of creative work, in other words, hacks.&lt;/p&gt;
&lt;p&gt;One of the main problems has been running into global locks when calling back into MySQL to do things like open a table, create a session structure (THD) or create a .frm file.&lt;/p&gt;
&lt;p&gt;One extreme example of this is PBXT recovery. When MySQL calls the engine “init” method on startup it is holding the global LOCK_plugin lock. In init, the engine needs to do recovery. In PBXT’s case this means opening tables (reading a .frm file), which requires creating a THD. The code to create a THD in turn tries to acquire LOCK_plugin!&lt;/p&gt;
&lt;p&gt;Unfortunately a thread hangs if it tries to acquire the same mutex twice, so this just does not work!&lt;/p&gt;
&lt;p&gt;We went through quite a few iterations (MySQL code was also changing during the development of 5.1) before we came up with the current solution: create a background thread to do recovery asynchronously. So the thread can wait for the LOCK_plugin to be unlocked before it continues.&lt;/p&gt;
&lt;p&gt;The affect is that the init function returns quickly, but the first queries that access PBXT tables may hang waiting for recovery to complete.&lt;/p&gt;
&lt;h3&gt;PBXT seems to have very few configuration parameters. Was this an intentional design decision, and do you see it creating opportunities for you in organizations with less internal IT-expertise?&lt;/h3&gt;
&lt;p&gt;No, this is not by design.&lt;/p&gt;
&lt;p&gt;While I try to only add tuning parameters that are absolutely necessary, PBXT is not specifically designed to be self-tuning, because I believe that is a very hard problem to solve in general.&lt;/p&gt;
&lt;p&gt;Tuning parameters are often added to an engine in response to performance problems in particular configurations. This is not necessarily a bad thing because it provides DBA’s with the tools they need.&lt;/p&gt;
&lt;p&gt;My goal for PBXT in this regard is twofold:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I hope that most installations can get away with setting a minimum of tuning parameters, in particular, just the cache values.&lt;/li&gt;
&lt;li&gt;On the other hand, I aim to provide expert tuning parameters for installations that need to extract maximum performance from the hardware. This work is ongoing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;i&gt;Morgan notes: There are more in InnoDB/XtraDB now than there were three years ago. This is probably something that emerges over time as we get to understand more about an engine.&lt;/i&gt;&lt;/p&gt; &lt;hr noshade style=&quot;margin:0;height:1px;&quot;&gt; &lt;p&gt;Entry posted by Morgan Tocker | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/#comments&quot;&gt;No comment&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Add to: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/&amp;amp;title=Paul%20McCullagh%20answers%20your%20questions%20about%20PBXT&quot; title=&quot;Bookmark this post on del.icio.us&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png&quot; alt=&quot;delicious&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/&amp;amp;title=Paul%20McCullagh%20answers%20your%20questions%20about%20PBXT&quot; title=&quot;Digg this post on Digg.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png&quot; alt=&quot;digg&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/&amp;amp;title=Paul%20McCullagh%20answers%20your%20questions%20about%20PBXT&quot; title=&quot;Submit this post on reddit.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png&quot; alt=&quot;reddit&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/&amp;amp;T=Paul%20McCullagh%20answers%20your%20questions%20about%20PBXT&quot; title=&quot;Vote for this article on Netscape&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif&quot; alt=&quot;netscape&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2009/11/20/paul-mccullagh-answers-your-questions-about-pbxt/&amp;amp;title=Paul%20McCullagh%20answers%20your%20questions%20about%20PBXT&quot; title=&quot;Add to Google Bookmarks&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png&quot; alt=&quot;Google Bookmarks&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <author>Morgan Tocker</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/ba296927e7154724</guid>
         <pubDate>Fri, 20 Nov 2009 11:29:55 -0800</pubDate>
      </item>
      <item>
         <title>Hadoop World: Hadoop + Clojure from Stuart Sierra and Tim Dysinger</title>
         <link>http://www.cloudera.com/blog/2009/11/20/hadoop-world-hadoop-clojure-from-stuart-sierra-and-tim-dysinger/</link>
         <description>&lt;p&gt;Today’s Hadoop World talk comes from Stuart Sierra at Columbia University and Tim Dysinger at Sonian Networks. Unfortunately Tim couldn’t make the talk, so Stuart covered for him. Stuart goes into detail about how Hadoop can be used with Clojure, a neat and new language implemented on the Java Virtual Machine (JVM). Tim, Stuart, thank you! We’ll be posting more of the Hadoop World talks in the weeks to come.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
         <author>alex</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/fa619f82838fbd10</guid>
         <pubDate>Fri, 20 Nov 2009 08:00:22 -0800</pubDate>
      </item>
      <item>
         <title>ACM Symposium on Cloud Computing</title>
         <link>http://perspectives.mvdirona.com/2009/11/20/ACMSymposiumOnCloudComputing.aspx</link>
         <author>James Hamilton</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e232245b3eba4cae</guid>
         <pubDate>Fri, 20 Nov 2009 06:24:30 -0800</pubDate>
      </item>
      <item>
         <title>Rare evil MySQL Bug</title>
         <link>http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/</link>
         <description>&lt;p&gt;There is the rare bug which I ran into every so often. Last time I’ve seen it about 3 years ago on MySQL 4.1 and I hoped it is long fixed since… but it looks like it is not. I now get to see MySQL 5.4.2 in the funny state.&lt;/p&gt;
&lt;p&gt;When you see bug happening you would see MySQL log flooded with error messages like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
091119 23:03:34 [ERROR] Error in accept: Resource temporarily unavailable&lt;br&gt;
091119 23:03:34 [ERROR] Error in accept: Resource temporarily unavailable&lt;br&gt;
091119 23:03:34 [ERROR] Error in accept: Resource temporarily unavailable&lt;br&gt;
091119 23:03:34 [ERROR] Error in accept: Resource temporarily unavailable
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;filling out disk space&lt;/p&gt;
&lt;p&gt;Depending on the case you may be able to connect to MySQL through Unix Socket or TCP/IP or neither.&lt;br&gt;
It also looks like there is a correlation between having a lot of tables and such condition.&lt;/p&gt;
&lt;p&gt;Previously I was unlucky with seeing this issue in production so we had to restart MySQL quickly currently I have a test MySQL showing some behavior.&lt;/p&gt;
&lt;p&gt;Here is what strace tells me:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
[percona@test9 msb_5_4_2]$ strace -f -p 19229&lt;br&gt;
Process 19229 attached with 23 threads – interrupt to quit&lt;br&gt;
[pid 19286] rt_sigtimedwait([HUP QUIT ALRM TERM TSTP], &lt;br&gt;
[pid 19285] futex(0×165962ec, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19284] select(0, NULL, NULL, NULL, {0, 765000} &lt;br&gt;
[pid 19283] select(0, NULL, NULL, NULL, {0, 412000} &lt;br&gt;
[pid 19248] futex(0×1781193c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19247] futex(0×178118bc, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19246] futex(0×1781183c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19245] futex(0×178117bc, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19244] futex(0×1781173c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19232] futex(0×1781113c, FUTEX_WAIT_PRIVATE, 165, NULL &lt;br&gt;
[pid 19229] accept(16392, &lt;br&gt;
[pid 19241] futex(0×178115bc, FUTEX_WAIT_PRIVATE, 319, NULL &lt;br&gt;
[pid 19243] futex(0×178116bc, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19242] futex(0×1781163c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19240] futex(0×1781153c, FUTEX_WAIT_PRIVATE, 3, NULL &lt;br&gt;
[pid 19239] futex(0×178114bc, FUTEX_WAIT_PRIVATE, 7, NULL &lt;br&gt;
[pid 19238] futex(0×1781143c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19237] futex(0×178113bc, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19236] futex(0×1781133c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19235] futex(0×178112bc, FUTEX_WAIT_PRIVATE, 7, NULL &lt;br&gt;
[pid 19234] futex(0×1781123c, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19233] futex(0×178111bc, FUTEX_WAIT_PRIVATE, 207, NULL &lt;br&gt;
[pid 19231] futex(0×178110bc, FUTEX_WAIT_PRIVATE, 1, NULL &lt;br&gt;
[pid 19229] &amp;lt;... accept resumed&amp;gt; 0×7fffffac70b0, [18423225245113516048]) = -1 EAGAIN (Resource temporarily unavailable)&lt;br&gt;
[pid 19229] accept(16392, 0×7fffffac70b0, [18423225245113516048]) = -1 EAGAIN (Resource temporarily unavailable)&lt;br&gt;
[pid 19229] accept(16392, 0×7fffffac70b0, [18423225245113516048]) = -1 EAGAIN (Resource temporarily unavailable)&lt;br&gt;
[pid 19229] accept(16392, 0×7fffffac70b0, [18423225245113516048]) = -1 EAGAIN (Resource temporarily unavailable)&lt;br&gt;
[pid 19229] fcntl(16392, F_SETFL, O_RDWR) = 0&lt;br&gt;
[pid 19229] fcntl(16392, F_SETFL, O_RDWR) = 0&lt;br&gt;
[pid 19229] select(16394, [1025 1040 1042 1044&lt;br&gt;
....&lt;br&gt;
8 9709 9714 9716 9717 15368 15369], NULL, NULL, NULL*** buffer overflow detected ***: strace terminated&lt;br&gt;
======= Backtrace: =========&lt;br&gt;
/lib64/libc.so.6(__chk_fail+0×2f)[0x35f36e6aff]&lt;br&gt;
/lib64/libc.so.6[0x35f36e5ad3]&lt;br&gt;
strace[0x408b60]
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So as you can see accept gets pretty high socket number – probably because of large innodb_open_files I tested with in this case – which all can be used during recovery.&lt;/p&gt;
&lt;p&gt;Note the process gets accept on the socket to fail with EAGAIN (which is not well described in the manual) and later getting call to select call with 16384 sockets. This does not seems to be the healthy number to work with SELECT call and It is quite possible something goes wrong because of it.&lt;/p&gt;
&lt;p&gt;If you have any ideas why could be going wrong in this case.&lt;/p&gt; &lt;hr noshade style=&quot;margin:0;height:1px;&quot;&gt; &lt;p&gt;Entry posted by peter | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/#comments&quot;&gt;7 comments&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Add to: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/&amp;amp;title=Rare%20evil%20MySQL%20Bug&quot; title=&quot;Bookmark this post on del.icio.us&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png&quot; alt=&quot;delicious&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/&amp;amp;title=Rare%20evil%20MySQL%20Bug&quot; title=&quot;Digg this post on Digg.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png&quot; alt=&quot;digg&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/&amp;amp;title=Rare%20evil%20MySQL%20Bug&quot; title=&quot;Submit this post on reddit.com&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png&quot; alt=&quot;reddit&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/&amp;amp;T=Rare%20evil%20MySQL%20Bug&quot; title=&quot;Vote for this article on Netscape&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif&quot; alt=&quot;netscape&quot;&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/&amp;amp;title=Rare%20evil%20MySQL%20Bug&quot; title=&quot;Add to Google Bookmarks&quot;&gt;&lt;img src=&quot;http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png&quot; alt=&quot;Google Bookmarks&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <author>peter</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a90fe3b8feb656a5</guid>
         <pubDate>Thu, 19 Nov 2009 23:21:09 -0800</pubDate>
      </item>
      <item>
         <title>Hadoop World: Protein Alignment from Paul Brown</title>
         <link>http://www.cloudera.com/blog/2009/11/19/hadoop-world-protein-alignment-from-paul-brown/</link>
         <description>&lt;p&gt;Today’s Hadoop World talk comes from Paul Brown at Booz Allen. He goes into detail about how Hadoop is used for bioinformatics and protein alignment. Our thanks to Paul — and stay tuned for more!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
         <author>alex</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/663c01d41ec5cbc6</guid>
         <pubDate>Thu, 19 Nov 2009 13:00:49 -0800</pubDate>
      </item>
      <item>
         <title>Sigh.</title>
         <link>http://mjg59.livejournal.com/118358.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a7e5c1278efa0508</guid>
         <pubDate>Thu, 19 Nov 2009 12:32:10 -0800</pubDate>
      </item>
      <item>
         <title>10 eBay Secrets for Planet Wide Scaling</title>
         <link>http://highscalability.com/blog/2009/11/17/10-ebay-secrets-for-planet-wide-scaling.html</link>
         <author>Todd Hoff</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/67c56d3e0ee8876e</guid>
         <pubDate>Tue, 17 Nov 2009 11:27:33 -0800</pubDate>
      </item>
      <item>
         <title>You Will Be Assimilated</title>
         <link>http://pl.atyp.us/wordpress/?p=2500</link>
         <description>&lt;p&gt;I have to admit that part of my general antipathy toward Java is a form of envy. Don’t get all excited, Java fans; it’s only a small part, and “envy” might not even be the right word. The Java language certainly has its flaws, as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jwz.org/doc/java.html&quot;&gt;others&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.guild.net/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.html&quot;&gt;have&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://warp.povusers.org/grrr/java.html&quot;&gt;written&lt;/a&gt;, but every language has flaws and I could probably forgive Java’s. The Java programming environment – the vast array of libraries and frameworks and IDEs and other crutches, seems more flawed and less forgiveable. The Java culture, with its at-best-misleading claims of “write once run everywhere” and “as fast as C” and its endless swirl of enthusiasm for patterns and “agile” and every other fad to come along, is worse still. What’s worst of all is the way all of these things get bundled together. Both the dependency structure and the culture seem to preclude picking out and benefiting from the good bits while leaving the bad bits behind. I’ve yet to meet a Java programmer who even seemed to try. To be a Java programmer, it seems, means to dive headlong into the entire Java ocean and leave anything else behind. That kind of enforced isolation from the broader world is a defining characteristic of cults, by the way.&lt;/p&gt;
&lt;p&gt;So why do I care, and why do I admit to envy? Because there is some cool stuff that happens in the Java world. For example, I recently came across &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.headwaysoftware.com/products/structure101/index.php&quot;&gt;Structure101&lt;/a&gt;. Please, go read what they have to say about architecture extraction and enforcement, and especially about complexity debt. Set aside twenty minutes or so and watch the videos. Their analysis of the problems that occur in large-scale software development rings very true to me, and I think they’ve created an awesome tool to help address those problems. So what’s the problem? If you go to their “versions and pricing” page, you’ll see it’s only for Java. Both the problem and the solution are completely language-independent, but their implementation is Java-specific. I don’t blame Headway for this, or the other vendors (e.g. for static code analysis tools) I’ve seen make the same decision. I’m sure their choice is based on rational analysis of the market. I’d love to be able to use such tools. I can’t, hence the admission of envy. I resent the Java cultists for that, not because Java itself has no value but because of the opportunity cost they’ve imposed on the entire industry. Those grapes aren’t sour. I’m sure they’re very sweet, which is exactly why putting a fence around them is so offensive. Because of the “all or nothing” nature of the Java world, lots of cool things that could benefit the broader programming community – from C to Python to Erlang to Clojure – never will. Theirs is a fundamentally selfish “come play in my sandbox or we won’t play at all” kind of attitude. It’s very similar to the “any kind of database you want as long as its ACID and relational” attitude I’ve also &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pl.atyp.us/wordpress/?p=2471&quot;&gt;written about lately&lt;/a&gt;, and quite antithetical to the UNIX/Linux/open-source way of making tools that do their own jobs well and combine well with other tools to do larger jobs.&lt;/p&gt;
&lt;p&gt;Java is the Borg of the computing world.&lt;/p&gt;</description>
         <author>Jeff Darcy</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/fc659cf955e3153b</guid>
         <pubDate>Thu, 19 Nov 2009 06:19:41 -0800</pubDate>
      </item>
      <item>
         <title>SQL Server: are the recursive CTE’s really set-based?</title>
         <link>http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/</link>
         <description>&lt;p&gt;Answering questions asked on the site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Karl&lt;/strong&gt; asks:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I’ve read your article about &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/09/28/adjacency-list-vs-nested-sets-oracle/&quot;&gt;adjacency lists vs. nested sets in Oracle&lt;/a&gt;. A nice explanation, thanks.&lt;/p&gt;
&lt;p&gt;You write that recursive operations are row-based in &lt;strong&gt;Oracle&lt;/strong&gt; and set-based in &lt;strong&gt;SQL Server&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Which approach is better in your opinion?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;First, a quick reminder for those who have no idea what’s this all about.&lt;/p&gt;
&lt;p&gt;Recursive queries are useful to build the hierarchy trees, traverse graphs, generate arbitrary rowsets etc. Usually this involves joining a set with itself an arbitrary number of times.&lt;/p&gt;
&lt;p&gt;A recursive query is usually defined by the &lt;strong&gt;anchor part&lt;/strong&gt; (the initial rowset, or the base of recursion) and the &lt;strong&gt;recursive part&lt;/strong&gt; (some operation over the previous resultset).&lt;/p&gt;
&lt;p&gt;This is same as with the plain recursion: take some initial data as a parameter, modify it in some way and then pass the result of the modification as a new parameter to the same function.&lt;/p&gt;
&lt;p&gt;Since &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/07/12/double-thinking-in-sql/&quot;&gt;SQL operates with sets&lt;/a&gt;, the input and the output if this function should also be the sets. And here is the main differences between the approaches used by &lt;strong&gt;Oracle&lt;/strong&gt; on one side, and &lt;strong&gt;SQL Server&lt;/strong&gt;, &lt;strong&gt;PostgreSQL&lt;/strong&gt; and some more systems on the other side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt; uses &lt;code&gt;CONNECT BY&lt;/code&gt; approach, while &lt;strong&gt;SQL Server&lt;/strong&gt; uses &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/2009/09/25/adjacency-list-vs-nested-sets-sql-server/&quot;&gt;recursive &lt;strong&gt;CTE&lt;/strong&gt;&lt;/a&gt; approach.&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;CONNECT BY&lt;/h3&gt;
&lt;p&gt;A hierarchical query using a &lt;code&gt;CONNECT BY&lt;/code&gt; clause looks like this:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable
START WITH start_with_condition
CONNECT BY connect_by_condition (PRIOR mytable)
&lt;/pre&gt;
&lt;p&gt;This query uses two clauses: &lt;code&gt;START WITH&lt;/code&gt; defines the anchor part, while &lt;code&gt;CONNECT BY&lt;/code&gt; defines the recursive parts.&lt;/p&gt;
&lt;p&gt;It’s an analog of this query:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable m1
CROSS APPLY ( SELECT m1.* UNION ALL SELECT * FROM mytable m2 CROSS APPLY ( SELECT m2.* UNION ALL SELECT * FROM mytable m3 CROSS APPLY ( SELECT m3.* UNION ALL … ) WHERE connect_by_condition(m2.*) ) WHERE connect_by_condition(m1.*) )
WHERE start_with_condition
&lt;/pre&gt;
&lt;p&gt;On each iteration, exactly one record from the previous table is used. Each innermost query can use the values of only one record of the outermost set.&lt;/p&gt;
&lt;p&gt;Here’s an example rowset:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;and a query over this rowset:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable
START WITH parent IS NULL
CONNECT BY parent = PRIOR id
&lt;/pre&gt;
&lt;p&gt;The anchor part consists of two rows:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;, but they are not returned as is. After a row had been returned, the recursive part is being applied &lt;strong&gt;to the row&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot;&gt;Recursive condition applied: &lt;code&gt;parent = 1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot;&gt;Recursive condition applied: &lt;code&gt;parent = 2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As you can see, the recursive step can only take the value of &lt;strong&gt;a single previous record as an input&lt;/strong&gt;, while producing &lt;strong&gt;a resultset as an output&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The recursive steps are applied to each record independently.&lt;/p&gt;
&lt;div&gt;
&lt;code&gt;CONNECT BY&lt;/code&gt; recursion takes &lt;strong&gt;a single record&lt;/strong&gt; as input and returns &lt;strong&gt;a set&lt;/strong&gt; as an output. It is scalar by nature.
&lt;/div&gt;
&lt;h3&gt;Recursive CTE&lt;/h3&gt;
&lt;p&gt;A recursive &lt;strong&gt;CTE&lt;/strong&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition UNION ALL SELECT * FROM set_operation(mytable, rows) )
SELECT *
FROM rows
&lt;/pre&gt;
&lt;p&gt;It’s the same as the following:&lt;/p&gt;
&lt;pre&gt;
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition ), rows2 AS ( SELECT * FROM set_operation(mytable, rows) ), rows3 AS ( SELECT * FROM set_operation(mytable, rows2) ), …
SELECT *
FROM rows
UNION ALL
SELECT *
FROM rows2
UNION ALL
SELECT *
FROM rows3
UNION ALL
…
&lt;/pre&gt;
&lt;p&gt;A &lt;code&gt;set_operation&lt;/code&gt; can be any set operation: a &lt;code&gt;JOIN&lt;/code&gt;, a &lt;code&gt;UNION&lt;/code&gt;, an &lt;code&gt;EXCEPT&lt;/code&gt;, whatever. It may involve any number of other tables, functions, in other words everything — as long as it’s result (also a set, of course) has the same number and datatypes of columns as the anchor part does.&lt;/p&gt;
&lt;p&gt;Here’s the example on the same sample data:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;, but with a new query:&lt;/p&gt;
&lt;pre&gt;
WITH rows AS ( SELECT * FROM mytable UNION ALL SELECT mytable.* FROM rows JOIN mytable ON mytable.parent = rows.id )
SELECT *
FROM rows
&lt;/pre&gt;
&lt;p&gt;The anchor part is the same:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;and, unlike the &lt;strong&gt;CONNECT BY&lt;/strong&gt;, it is returned at once. The recursive part is only applied when the previous resultset is known, and it’s applied to the resultset as a whole:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot;&gt;Recursive part: a &lt;code&gt;JOIN&lt;/code&gt; with &lt;code&gt;(1, 2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;, which yields all records of the original table (though not in the tree order)&lt;/p&gt;
&lt;div&gt;
&lt;strong&gt;CTE&lt;/strong&gt; recursion takes &lt;strong&gt;a set&lt;/strong&gt; on input and returns &lt;strong&gt;a set&lt;/strong&gt; on output. It is set-based by nature.
&lt;/div&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;From this, two importation conclusions can be drawn.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CONNECT BY&lt;/code&gt; approach splits the sets returned by the recursion and applies the recursion to each individual record. This is less powerful, since a record is just a special case of a set, but the results naturally come out in the recursion order.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CTE&lt;/strong&gt; approach allows the recursion to process the set returned on the previous step as a whole. This is more powerful, since a set is a general case of a record, but it takes some extra effort to sort the resultset in the tree order had the need arose.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything that can be done using a &lt;code&gt;CONNECT BY&lt;/code&gt; approach can be done with a recursive &lt;strong&gt;CTE&lt;/strong&gt; as well, but not vice versa. That’s why it’s safe to say that recursive &lt;strong&gt;CTE&lt;/strong&gt; approach is more powerful.&lt;/p&gt;
&lt;p&gt;However, what’s good in theory, is not always as good in implementation.&lt;/p&gt;
&lt;h3&gt;SQL Server’s implementation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;SQL Server&lt;/strong&gt; uses recursive &lt;strong&gt;CTE&lt;/strong&gt; approach which is set based and more powerful. But &lt;strong&gt;SQL Server&lt;/strong&gt; places some limitations on what you can use in the recursive part of the &lt;strong&gt;CTE&lt;/strong&gt;. And severe limitations they are. You cannot use aggregates, cannot use &lt;code&gt;OUTER JOINs&lt;/code&gt;, cannot use &lt;code&gt;TOP&lt;/code&gt;. Here’s the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://technet.microsoft.com/en-us/library/ms175972.aspx&quot;&gt;complete list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What’s the reason behind that?&lt;/p&gt;
&lt;p&gt;Let’s see again the analogs of these two approaches:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CONNECT BY&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
SELECT current_result.*
FROM previous_result
CROSS APPLY ( SELECT previous_result.* UNION ALL SELECT * FROM mytable WHERE condition(previous_result.*) ) AS current_result
&lt;/pre&gt;
&lt;p&gt;Recursive &lt;strong&gt;CTE&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;
SELECT previous_result.*
FROM previous_result
UNION ALL
SELECT current_result.*
FROM set_operation(previous_result, mytable) AS current_result
&lt;/pre&gt;
&lt;p&gt;The former query can always be rewritten as a latter:&lt;/p&gt;
&lt;pre&gt;
SELECT previous_result.*
FROM previous_result
UNION ALL
SELECT current_result.*
FROM previous_result
JOIN mytable
ON condition(previous_result)
&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;CROSS APPLY&lt;/code&gt;, each row of the previous is returned, then the scalar &lt;code&gt;condition&lt;/code&gt; which returns &lt;strong&gt;true&lt;/strong&gt; or &lt;strong&gt;false&lt;/strong&gt; is checked for each row of &lt;code&gt;mytable&lt;/code&gt; and current row of the &lt;code&gt;previous_result&lt;/code&gt;. This can be rewritten as a &lt;code&gt;JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The reverse is not always true.&lt;/p&gt;
&lt;p&gt;Under which conditions it is possible for a recursive &lt;strong&gt;CTE&lt;/strong&gt; query to be rewritten as a &lt;code&gt;CROSS APPLY&lt;/code&gt; query?&lt;/p&gt;
&lt;p&gt;For this to be possible, the &lt;code&gt;set_operation&lt;/code&gt; used in the second query should &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Distributivity&quot;&gt;distribute&lt;/a&gt; over the &lt;code&gt;UNION ALL&lt;/code&gt; operation.&lt;/p&gt;
&lt;p&gt;What does it mean?&lt;/p&gt;
&lt;p&gt;The distributivity is a well-known concept in algebra.&lt;/p&gt;
&lt;p&gt;For instance, the multiplication is &lt;em&gt;distributed&lt;/em&gt; over addition, this means that &lt;code&gt;x × (y + z) = (x × y) + (x × z)&lt;/code&gt; is always true.&lt;/p&gt;
&lt;p&gt;But further generalization, power, does not distribute over multiplication. The following condition: &lt;code&gt;x ^ (y × z) = (x ^ y) × (x ^ z)&lt;/code&gt; does not always hold.&lt;/p&gt;
&lt;p&gt;In other words, distributivity means that the order of operations is not important. You can add the results of multiplication just as well as multiply the results of addition, the final result will always be the same.&lt;/p&gt;
&lt;p&gt;This was arithmetics, but concept of distributivity can be applied to relational algebra just as well. A set operation distributes over &lt;code&gt;UNION ALL&lt;/code&gt; if the following condition always holds:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;set_operation(A UNION ALL B, C) = set_operation(A, C) UNION ALL set_operation(B, C)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It’s easy to see that if the condition above is true, the two approaches to the recursion become the same.&lt;/p&gt;
&lt;p&gt;Indeed, the operation over the &lt;code&gt;UNION ALL&lt;/code&gt; is the same as the &lt;code&gt;UNION ALL&lt;/code&gt; over the operations, which is the same as the operation applied to each record of the &lt;code&gt;previous_result&lt;/code&gt;. And the latter is exactly what &lt;code&gt;CROSS APPLY&lt;/code&gt; does: applies an operation to each record of the set and returns the resultsing sets combined together (as if with &lt;code&gt;UNION ALL&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;JOIN&lt;/code&gt; distributes over &lt;code&gt;UNION ALL&lt;/code&gt;. However, &lt;code&gt;DISTINCT&lt;/code&gt;, aggregates, &lt;code&gt;TOP&lt;/code&gt; and some other operations do not.&lt;/p&gt;
&lt;p&gt;Maximum over a &lt;code&gt;UNION ALL&lt;/code&gt; is not the same as the &lt;code&gt;UNION ALL&lt;/code&gt; of the maximums. &lt;code&gt;TOP&lt;/code&gt; of a &lt;code&gt;UNION ALL&lt;/code&gt; is not the same as the &lt;code&gt;UNION ALL&lt;/code&gt; of &lt;code&gt;TOP&lt;/code&gt;s, etc.&lt;/p&gt;
&lt;p&gt;If we look closer into the restrictions put on the recursive operations by &lt;strong&gt;SQL Server&lt;/strong&gt; we will see that placing these restrictions have one ultimate goal: to forbid all operations that do not distribute over &lt;code&gt;UNION ALL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Aggregates are forbidden, &lt;code&gt;TOP&lt;/code&gt; is forbidden, &lt;code&gt;DISTINCT&lt;/code&gt; is forbidden. This is a conspiracy.&lt;/p&gt;
&lt;p&gt;However, they cannot lie to the world all the time. They cannot conceal every fact. There are two operations they failed to forbid. And now it’s a moment to reveal the truth.&lt;/p&gt;
&lt;h3&gt;EXCEPT&lt;/h3&gt;
&lt;p&gt;Consider a sample rowset:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Now, let’s make a recursive query over this rowset:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id) AS ( SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ), q AS ( SELECT id FROM mytable UNION ALL SELECT * FROM ( SELECT id FROM othertable EXCEPT SELECT * FROM q ) q2 )
SELECT TOP 20 *
FROM q
&lt;/pre&gt;
&lt;p&gt;What should this query return?&lt;/p&gt;
&lt;p&gt;Being rewritten as simple &lt;strong&gt;SQL&lt;/strong&gt;, it yields this:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id) AS ( SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ), anchor AS ( SELECT * FROM mytable ), recursive1 AS ( SELECT * FROM mytable EXCEPT SELECT * FROM anchor ), recursive2 AS ( SELECT * FROM mytable EXCEPT SELECT * FROM recursive1 ), recursive3 AS ( SELECT * FROM mytable EXCEPT SELECT * FROM recursive2 ), recursive4 AS ( SELECT * FROM mytable EXCEPT SELECT * FROM recursive3 )
-- , recursive5 AS
-- …
SELECT *, 'anchor' AS setname
FROM anchor
UNION ALL
SELECT *, 'recursive1' AS setname
FROM recursive1
UNION ALL
SELECT *, 'recursive2' AS setname
FROM recursive2
UNION ALL
SELECT *, 'recursive3' AS setname
FROM recursive3
UNION ALL
SELECT *, 'recursive4' AS setname
FROM recursive4
-- UNION ALL
-- …
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;setname&lt;/code&gt; above is for the sake of clarity only, to distinguish between the sets combined with &lt;code&gt;UNION ALL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s what this query returns:&lt;/p&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;setname&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;recursive4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;recursive4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;recursive4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;9 rows fetched in 0.0003s (0.0006s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;We see that the query returns the whole &lt;code&gt;anchor&lt;/code&gt; part which is just a &lt;code&gt;SELECT * FROM mytable&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;setname&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;anchor&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The next part, &lt;code&gt;recursive1&lt;/code&gt;, applies the &lt;code&gt;EXCEPT&lt;/code&gt; operator to the &lt;code&gt;mytable&lt;/code&gt; and &lt;code&gt;anchor&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable
EXCEPT
SELECT *
FROM anchor
&lt;/pre&gt;
&lt;p&gt;But since &lt;code&gt;mytable&lt;/code&gt; and &lt;code&gt;anchor&lt;/code&gt; actually match, the result of this operation is an empty rowset. And that’s why we don’t see &lt;code&gt;recursive1&lt;/code&gt; in the resultset above.&lt;/p&gt;
&lt;p&gt;The next part, &lt;code&gt;recursive2&lt;/code&gt;, applies &lt;code&gt;EXCEPT&lt;/code&gt; again:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable
EXCEPT
SELECT *
FROM recursive1
&lt;/pre&gt;
&lt;p&gt;This time, the second argument to &lt;code&gt;EXCEPT&lt;/code&gt; is empty, and each record from &lt;code&gt;mytable&lt;/code&gt; is returned:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;setname&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;recursive2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;EXCEPT&lt;/code&gt; applied to &lt;code&gt;mytable&lt;/code&gt; and an empty set yields a copy of &lt;code&gt;mytable&lt;/code&gt;. &lt;code&gt;EXCEPT&lt;/code&gt; applied to the &lt;code&gt;mytable&lt;/code&gt; and a copy of &lt;code&gt;mytable&lt;/code&gt; yields an empty set. Therefore, the final resultset will be endless, consisting of alternating empty sets and copies of &lt;code&gt;mytable&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The original recursive query, in theory, should return the same rowset. Let’s check if it’s really so:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id) AS ( SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ), othertable (id) AS ( SELECT 4 UNION ALL SELECT 5 ), q AS ( SELECT id FROM mytable UNION ALL SELECT * FROM ( SELECT id FROM mytable EXCEPT SELECT * FROM q ) q2 )
SELECT TOP 20 *
FROM q
OPTION (MAXRECURSION 4)
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;This differs much from what we expected to see.&lt;/p&gt;
&lt;p&gt;Let’s check what happened.&lt;/p&gt;
&lt;p&gt;The anchor part returned the first three rows just as it had to:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The next set (&lt;code&gt;recursive1&lt;/code&gt;) should have been empty. But it has &lt;strong&gt;2&lt;/strong&gt; rows instead:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;This could only happen it the &lt;code&gt;EXCEPT&lt;/code&gt; clause was applied to the last record of the &lt;code&gt;anchor&lt;/code&gt; set rather than to the whole &lt;code&gt;anchor&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
SELECT *
FROM mytable
EXCEPT
SELECT TOP 1 *
FROM anchor
ORDER BY id DESC
&lt;/pre&gt;
&lt;p&gt;The query above would yield the same results.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;recursive2&lt;/code&gt;, the &lt;code&gt;EXCEPT&lt;/code&gt; operator, had it been applied to the whole resultset returned by the previous query, would yield a single row &lt;strong&gt;3&lt;/strong&gt;. However, it returns &lt;strong&gt;1&lt;/strong&gt; and &lt;strong&gt;3&lt;/strong&gt;, which means that &lt;code&gt;EXCEPT&lt;/code&gt; clause was again applied only to the last row.&lt;/p&gt;
&lt;p&gt;This is not how a properly designed set-based recursive &lt;strong&gt;CTE&lt;/strong&gt; should behave. But this is exactly how &lt;code&gt;CONNECT BY&lt;/code&gt; query behaves. It splits the recordset into separate records and applies the recursive part to each record individually.&lt;/p&gt;
&lt;h3&gt;ROW_NUMBER&lt;/h3&gt;
&lt;p&gt;Analytical functions without &lt;code&gt;PARTITION BY&lt;/code&gt; clause do not distribute over &lt;code&gt;UNION ALL&lt;/code&gt; as well.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;UNION ALL&lt;/code&gt; of two queries containing the &lt;code&gt;ROW_NUMBER&lt;/code&gt;’s is not the same as a &lt;code&gt;ROW_NUMBER&lt;/code&gt; applied to the results of a single &lt;code&gt;UNION ALL&lt;/code&gt; query. The latter would return a single consecutive counter, while the former would count the records in each query separately.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ROW_NUMBER&lt;/code&gt;’s, however, are still allowed in &lt;strong&gt;SQL Server 2005&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Consider this adjacency list rowset defining a tree:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Parent&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;and make a simple tree query over it:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id, parent) AS ( SELECT 1, NULL UNION ALL SELECT 2, NULL UNION ALL SELECT 3, 1 UNION ALL SELECT 4, 1 UNION ALL SELECT 5, 2 UNION ALL SELECT 6, 2 ), q AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM mytable WHERE parent IS NULL UNION ALL SELECT mytable.*, ROW_NUMBER() OVER (ORDER BY mytable.id) FROM q JOIN mytable ON mytable.parent = q.id )
SELECT *
FROM q
&lt;/pre&gt;
&lt;p&gt;The tree is only two levels deep, that’s why this query can be rewritten as this:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id, parent) AS ( SELECT 1, NULL UNION ALL SELECT 2, NULL UNION ALL SELECT 3, 1 UNION ALL SELECT 4, 1 UNION ALL SELECT 5, 2 UNION ALL SELECT 6, 2 ), anchor AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM mytable WHERE parent IS NULL ), recursive1 AS ( SELECT mytable.*, ROW_NUMBER() OVER (ORDER BY mytable.id) AS rn FROM anchor JOIN mytable ON mytable.parent = anchor.id )
SELECT *
FROM anchor
UNION ALL
SELECT *
FROM recursive1
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;parent&lt;/th&gt;
&lt;th&gt;rn&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;6 rows fetched in 0.0004s (0.0012s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The recursive part returns &lt;strong&gt;4&lt;/strong&gt; records and calculates a &lt;code&gt;ROW_NUMBER&lt;/code&gt; over this set. The values returned by &lt;code&gt;ROW_NUMBER&lt;/code&gt; are from &lt;strong&gt;1&lt;/strong&gt; to &lt;strong&gt;4&lt;/strong&gt;, just as they should be.&lt;/p&gt;
&lt;p&gt;Now, let’s check the recursive query:&lt;/p&gt;
&lt;pre&gt;
WITH mytable (id, parent) AS ( SELECT 1, NULL UNION ALL SELECT 2, NULL UNION ALL SELECT 3, 1 UNION ALL SELECT 4, 1 UNION ALL SELECT 5, 2 UNION ALL SELECT 6, 2 ), q AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM mytable WHERE parent IS NULL UNION ALL SELECT mytable.*, ROW_NUMBER() OVER (ORDER BY mytable.id) FROM q JOIN mytable ON mytable.parent = q.id )
SELECT *
FROM q
&lt;/pre&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;parent&lt;/th&gt;
&lt;th&gt;rn&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;100&quot;&gt;6 rows fetched in 0.0003s (0.0011s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;See now?&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ROW_NUMBER&lt;/code&gt;’s are not consecutive. Instead of a single sequence from &lt;strong&gt;1&lt;/strong&gt; to &lt;strong&gt;4&lt;/strong&gt;, there are two sequences from &lt;strong&gt;1&lt;/strong&gt; to &lt;strong&gt;2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Again, that’s exactly what a &lt;code&gt;CONNECT BY&lt;/code&gt; query (or a &lt;code&gt;CROSS APPLY&lt;/code&gt;) would return.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;There are two approaches to implementing a recursive query:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;One approach is record-based. A recursive part takes a record as a parameter and returns a set. It is then separately applied to each record of the set returned . This approach is implemented by &lt;strong&gt;Oracle&lt;/strong&gt; in &lt;code&gt;CONNECT BY&lt;/code&gt; queries.&lt;/li&gt;
&lt;li&gt;Another approach is set-based. A recursive part takes a set as a parameter, processes it as a whole and returns a new set. It is then passed as a parameter to the next iteration. This approach can be implemented by recursive &lt;strong&gt;CTE&lt;/strong&gt;’s&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The record-based approach is better for building hierarchies because it naturally returns the records in the tree order. However, it’s less powerful in theory.&lt;/p&gt;
&lt;p&gt;The set-based approach is more powerful in theory, since it can process a set as a whole and more complex conditions can be applied. Extra effort is required to sort the resulting recorset in the tree order but it is still possible though less efficient.&lt;/p&gt;
&lt;p&gt;In theory, recursive &lt;strong&gt;CTE&lt;/strong&gt;’s are more powerful and therefore should be preferred.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL Server&lt;/strong&gt; nominally impelements recursive &lt;strong&gt;CTE&lt;/strong&gt;’s, but in fact they are no more than &lt;code&gt;CONNECT BY&lt;/code&gt; queries in disguise. No real set-based operations can be performed over these &lt;strong&gt;CTE&lt;/strong&gt;’s, only the record-based ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL Server&lt;/strong&gt; efficiently combines limitations of the record-based approach used by &lt;code&gt;CONNECT BY&lt;/code&gt; with the absence of the natural tree ordering implied by the set-based approach used by recursive &lt;strong&gt;CTE&lt;/strong&gt;’s.&lt;/p&gt;
&lt;p&gt;That’s why I’d say that &lt;strong&gt;Oracle&lt;/strong&gt; as of &lt;strong&gt;10g&lt;/strong&gt; implements recursive queries better than &lt;strong&gt;SQL Server&lt;/strong&gt; as of &lt;strong&gt;2005&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hope that helps.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’m always glad to answer the questions regarding database queries.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explainextended.com/ask-a-question&quot;&gt;&lt;strong&gt;Ask me a question&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <author>Quassnoi</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e7c203bd52057840</guid>
         <pubDate>Wed, 18 Nov 2009 12:00:18 -0800</pubDate>
      </item>
      <item>
         <title>IE8 SmartScreen in action</title>
         <link>http://blogs.msdn.com/ie/archive/2009/11/23/ie8-smartscreen-in-action.aspx</link>
         <author>ieblog</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3eda0a99e5dfe592</guid>
         <pubDate>Mon, 23 Nov 2009 13:32:00 -0800</pubDate>
      </item>
      <item>
         <title>[Review] GGL Review ends today, November 22nd</title>
         <link>http://permalink.gmane.org/gmane.comp.lib.boost.announce/244</link>
         <author>Hartmut Kaiser</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e6c243631a55447a</guid>
         <pubDate>Sun, 22 Nov 2009 15:59:13 -0800</pubDate>
      </item>
      <item>
         <title>toast version 1.469 (2009-11-21)</title>
         <link>http://toastball.net/toast/diff-1.469</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6533f6c71a0dcb5c</guid>
         <pubDate>Sat, 21 Nov 2009 14:58:58 -0800</pubDate>
      </item>
      <item>
         <title>toast version 1.468 (2009-11-21)</title>
         <link>http://toastball.net/toast/diff-1.468</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/64c3a3716e3bd06e</guid>
         <pubDate>Sat, 21 Nov 2009 14:58:58 -0800</pubDate>
      </item>
      <item>
         <title>[1.41.0] PDF Build of documentation available.</title>
         <link>http://permalink.gmane.org/gmane.comp.lib.boost.announce/243</link>
         <author>John Maddock</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f5fc0b009da16d32</guid>
         <pubDate>Fri, 20 Nov 2009 13:24:21 -0800</pubDate>
      </item>
      <item>
         <title>Announcing the Chromium OS Open Source Project</title>
         <link>http://feedproxy.google.com/~r/blogspot/Egta/~3/11LuihRdut4/announcing-chromium-os-open-source.html</link>
         <description>&lt;div&gt;Today we &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googleblog.blogspot.com/2009/11/releasing-chromium-os-open-source.html&quot;&gt;released&lt;/a&gt; Chromium OS, the open source project behind Google Chrome OS. Google Chrome OS is an operating system that is intended for people who spend most of their time on the web. It aims to provide a computing experience that is fast, simple and secure. The Chromium OS project as you'll see it today is comprised of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.chromium.org/chromium-os/building-chromium-os/getting-the-chromium-os-source-code&quot;&gt;the code&lt;/a&gt; that has been developed thus far, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.chromium.org/chromium-os/user-experience&quot;&gt;our early experiments with the user interface&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.chromium.org/chromium-os/chromiumos-design-docs&quot;&gt;detailed design docs&lt;/a&gt; for many parts that are under active development.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To learn more about what Google Chrome OS is, watch this short video:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div style=&quot;text-align:center;&quot;&gt;&lt;iframe class=&quot;embeddedvideo&quot; src=&quot;http://www.youtube.com/v/0QRO3gKj3qw&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&quot; width=&quot;560&quot; height=&quot;340&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To get a feel for the Google Chrome OS user experience, you can watch the demo from this morning's announcement event.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div style=&quot;text-align:center;&quot;&gt;&lt;iframe class=&quot;embeddedvideo&quot; src=&quot;http://www.youtube.com/v/ANMrzw7JFzA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&quot; width=&quot;560&quot; height=&quot;340&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/iframe&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span&gt;Posted by Kan Liu, Product Manager&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2250394496987063687-6122307557013782286?l=chrome.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/Egta/~4/11LuihRdut4&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>Sarah Nahm</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/564b5bd64d4c113d</guid>
         <pubDate>Thu, 19 Nov 2009 17:49:00 -0800</pubDate>
      </item>
      <item>
         <title>ANNOUNCE: GIMP 2.7.0</title>
         <link>http://permalink.gmane.org/gmane.comp.video.gimp.announce/127</link>
         <author>Martin Nordholts</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/2627489fe5322153</guid>
         <pubDate>Sun, 16 Aug 2009 19:18:39 -0700</pubDate>
      </item>
      <item>
         <title>ANNOUNCE: GIMP 2.6.7</title>
         <link>http://permalink.gmane.org/gmane.comp.video.gimp.announce/126</link>
         <author>Sven Neumann</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7a3e4f64a9311f62</guid>
         <pubDate>Sat, 15 Aug 2009 21:02:56 -0700</pubDate>
      </item>
      <item>
         <title>Blender Conference: videos</title>
         <link>http://feedproxy.google.com/~r/Blender3d/~3/c14rpEtlaNg/terugkijken.jsp</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/4123764b06a3c01d</guid>
         <pubDate>Thu, 19 Nov 2009 11:13:00 -0800</pubDate>
      </item>
      <item>
         <title>showing pop-ups</title>
         <link>http://emacs-fu.blogspot.com/2009/11/showing-pop-ups.html</link>
         <description>&lt;p&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_kGFGcbwevHE/SwWKlLoseMI/AAAAAAAAAd4/IcakPnbhnRQ/s1600/popup.png&quot;&gt;&lt;img style=&quot;float:right;margin:0 0 10px 10px;width:283px;height:128px;&quot; src=&quot;http://4.bp.blogspot.com/_kGFGcbwevHE/SwWKlLoseMI/AAAAAAAAAd4/IcakPnbhnRQ/s400/popup.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;div&gt;
&lt;div&gt; &lt;strong&gt;Updated: yes, it's %s, not %d&lt;/strong&gt; Sometimes, it's nice when &lt;code&gt;emacs&lt;/code&gt; can warn you when something is happening or
should happen. For example, when a new e-mail has arrived, or when there's a
meeting in 15 minutes you should attend. &lt;/div&gt;&lt;/div&gt;
&lt;p&gt;
As always, there are different way to do this, but here's what I've been using
for while. Various versions of this have been circulating around mailing
lists, so I don't know whom to credit with the original idea – anyway, this
is the (modified) version that I'm using.
&lt;/p&gt; &lt;pre&gt;(&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;djcb-popup&lt;/span&gt; (title msg &lt;span&gt;&amp;amp;optional&lt;/span&gt; icon sound) &lt;span&gt;&quot;Show a popup if we're on X, or echo it otherwise; TITLE is the title
of the message, MSG is the context. Optionally, you can provide an ICON and
a sound to be played&quot;&lt;/span&gt; (interactive) (&lt;span&gt;when&lt;/span&gt; sound (shell-command (concat &lt;span&gt;&quot;mplayer -really-quiet &quot;&lt;/span&gt; sound &lt;span&gt;&quot; 2&amp;gt; /dev/null&quot;&lt;/span&gt;))) (&lt;span&gt;if&lt;/span&gt; (eq window-system 'x) (shell-command (concat &lt;span&gt;&quot;notify-send &quot;&lt;/span&gt; (&lt;span&gt;if&lt;/span&gt; icon (concat &lt;span&gt;&quot;-i &quot;&lt;/span&gt; icon) &lt;span&gt;&quot;&quot;&lt;/span&gt;) &lt;span&gt;&quot; '&quot;&lt;/span&gt; title &lt;span&gt;&quot;' '&quot;&lt;/span&gt; msg &lt;span&gt;&quot;'&quot;&lt;/span&gt;)) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;text only version &lt;/span&gt; (message (concat title &lt;span&gt;&quot;: &quot;&lt;/span&gt; msg))))
&lt;/pre&gt; &lt;p&gt;
A couple of notes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
I'm using &lt;code&gt;notify-send&lt;/code&gt; for sending notifications; this assumes you are
using that system (it's part of the &lt;code&gt;libnotify-bin&lt;/code&gt; package in
Debian/Ubuntu). You can of course replace it with whatever is available on
your system. Alternatives are &lt;code&gt;zenity&lt;/code&gt; or &lt;code&gt;kdialog&lt;/code&gt; or &lt;code&gt;xmessage&lt;/code&gt; (for
old-timers) and their equivalents (?) on Windows, MacOS. &lt;/li&gt;
&lt;li&gt;
I'm now using &lt;code&gt;mplayer&lt;/code&gt; for playing sounds. This is a bit heavy, but at
least plays all kinds of audio files. If you only care about &lt;code&gt;.wav&lt;/code&gt;-files,
you could replace it with e.g. &lt;code&gt;aplay&lt;/code&gt;;
&lt;/li&gt;
&lt;li&gt;
as always, please ignore my ego-centric function names :-) &lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Now, we can use this function by evaluation e.g. &lt;/p&gt; &lt;pre&gt;(djcb-popup &lt;span&gt;&quot;Warning&quot;&lt;/span&gt; &lt;span&gt;&quot;The end is near&quot;&lt;/span&gt; &lt;span&gt;&quot;/usr/share/icons/test.png&quot;&lt;/span&gt; &lt;span&gt;&quot;/usr/share/sounds/beep.ogg&quot;&lt;/span&gt;)
&lt;/pre&gt; &lt;div&gt;
&lt;h3&gt;showing pop-ups from &lt;code&gt;org-mode&lt;/code&gt; appointments &lt;/h3&gt;
&lt;div&gt; &lt;p&gt;
The above popup function is most useful when it's does its work based on some
event. To be notified of appointments and the like, there is the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gnu.org/software/emacs/manual/html_node/emacs/Appointments.html&quot;&gt;emacs appt facility&lt;/a&gt;. Here, we set up this &lt;code&gt;appt&lt;/code&gt;, and then hook it up with &lt;code&gt;org-mode&lt;/code&gt;, so &lt;code&gt;appt&lt;/code&gt; can warn us when there's something happening soon…
&lt;/p&gt; &lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;the appointment notification facility
&lt;/span&gt;(&lt;span&gt;setq&lt;/span&gt; appt-message-warning-time 15 &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;warn 15 min in advance &lt;/span&gt; appt-display-mode-line t &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;show in the modeline
&lt;/span&gt; appt-display-format 'window) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;use our func
&lt;/span&gt;(appt-activate 1) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;active appt (appointment notification)
&lt;/span&gt;(display-time) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;time display is required for this...
&lt;/span&gt; &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;update appt each time agenda opened &lt;/span&gt;(&lt;span&gt;add-hook&lt;/span&gt; 'org-finalize-agenda-hook 'org-agenda-to-appt) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;our little façade-function for djcb-popup
&lt;/span&gt; (&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;djcb-appt-display&lt;/span&gt; (min-to-app new-time msg) (djcb-popup (format &lt;span&gt;&quot;Appointment in %s minute(s)&quot;&lt;/span&gt; min-to-app) msg &lt;span&gt;&quot;/usr/share/icons/gnome/32x32/status/appointment-soon.png&quot;&lt;/span&gt; &lt;span&gt;&quot;/usr/share/sounds/ubuntu/stereo/phone-incoming-call.ogg&quot;&lt;/span&gt;)) (&lt;span&gt;setq&lt;/span&gt; appt-disp-window-function (function djcb-appt-display))
&lt;/pre&gt; &lt;p&gt;
Of course, you can freely choose a icon / sound to your liking.
&lt;/p&gt;
&lt;/div&gt; &lt;/div&gt; &lt;div&gt;
&lt;h3&gt;showing pop-ups for new mail &lt;/h3&gt;
&lt;div&gt; &lt;p&gt;
Another event you might want to be warned about is new mail. There is
something to be set for &lt;i&gt;not&lt;/i&gt; letting yourself be disturbed for new mail, but
if you sufficiently filter your mails before they enter your inbox, it can be
a good way to periodically bring you back from your deep sl &lt;code&gt;^H^H&lt;/code&gt; thinking. For
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://emacs-fu.blogspot.com/2009/06/e-mail-with-wanderlust.html&quot;&gt;Wanderlust&lt;/a&gt;, I use something like this: &lt;/p&gt; &lt;pre&gt;(&lt;span&gt;add-hook&lt;/span&gt; 'wl-biff-notify-hook (&lt;span&gt;lambda&lt;/span&gt;() (djcb-popup &lt;span&gt;&quot;Wanderlust&quot;&lt;/span&gt; &lt;span&gt;&quot;You have new mail!&quot;&lt;/span&gt; &lt;span&gt;&quot;/usr/share/icons/gnome/32x32/status/mail-unread.png&quot;&lt;/span&gt; &lt;span&gt;&quot;/usr/share/sounds/ubuntu/stereo/phone-incoming-call.ogg&quot;&lt;/span&gt;)))
&lt;/pre&gt; &lt;p&gt;
Exercise for the reader: adapt this for your chosen mail client.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3992530807750384868-8184896567058918882?l=emacs-fu.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>djcb</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/0a56ecfd555e83a9</guid>
         <pubDate>Thu, 19 Nov 2009 10:10:00 -0800</pubDate>
      </item>
      <item>
         <title>Boost release 1.41.0 available</title>
         <link>http://permalink.gmane.org/gmane.comp.lib.boost.announce/242</link>
         <author>Beman Dawes</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/2d1a9b2900be6ebd</guid>
         <pubDate>Wed, 18 Nov 2009 18:26:25 -0800</pubDate>
      </item>
      <item>
         <title>An Early Look At IE9 for Developers</title>
         <link>http://blogs.msdn.com/ie/archive/2009/11/18/an-early-look-at-ie9-for-developers.aspx</link>
         <author>ieblog</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/882290cc2f14b722</guid>
         <pubDate>Wed, 18 Nov 2009 09:23:00 -0800</pubDate>
      </item>
      <item>
         <title>John Bailey: The Quest for Perfection</title>
         <link>http://theflamingbanker.blogspot.com/2009/11/quest-for-perfection.html</link>
         <author>noreply@blogger.com (John)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/db2e105cfc9711fd</guid>
         <pubDate>Tue, 17 Nov 2009 03:37:58 -0800</pubDate>
      </item>
      <item>
         <title>Flash Player 10.1 Beta</title>
         <link>http://blogs.adobe.com/penguin.swf/2009/11/flash_player_101_beta.html</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://labs.adobe.com/downloads/flashplayer10.html&quot;&gt;The beta of Flash Player 10.1 is available for download via labs.adobe.com.&lt;/a&gt; For this beta release, there is only a 32-bit plugin available for Linux (64-bit users will still need to use the previously released alpha version).&lt;/p&gt; &lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://bugs.adobe.com/flashplayer/&quot;&gt;Bugs can be reported and tracked here.&lt;/a&gt;&lt;/p&gt;</description>
         <author>Mike Melanson</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/543e7db7f03eb154</guid>
         <pubDate>Tue, 17 Nov 2009 00:01:00 -0800</pubDate>
      </item>
      <item>
         <title>[Review] GGL review extended until November 22nd</title>
         <link>http://permalink.gmane.org/gmane.comp.lib.boost.announce/241</link>
         <author>Hartmut Kaiser</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a9a2af8fdb853f58</guid>
         <pubDate>Sun, 15 Nov 2009 14:50:09 -0800</pubDate>
      </item>
      <item>
         <title>15 November 2009</title>
         <link>http://eion.robbmob.com/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bfc532e224803ae8</guid>
         <pubDate>Sat, 14 Nov 2009 04:39:27 -0800</pubDate>
      </item>
      <item>
         <title>My Favorite IE Add-on: Mouse Gestures by Ralph Hare</title>
         <link>http://blogs.msdn.com/ie/archive/2009/11/13/my-favorite-ie-add-on-mouse-gestures-by-ralph-hare.aspx</link>
         <author>ieblog</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b02a342f6fcdb21f</guid>
         <pubDate>Fri, 13 Nov 2009 14:45:00 -0800</pubDate>
      </item>
      <item>
         <title>copying lines without selecting them</title>
         <link>http://emacs-fu.blogspot.com/2009/11/copying-lines-without-selecting-them.html</link>
         <description>&lt;div&gt;
&lt;div&gt; &lt;p&gt;
When I'm programming, I often need to copy a line. Normally, this requires me
to first select ('mark') the line I want to copy. That does not seem like a
big deal, but when I'm in the 'flow' I want to avoid any little obstacle that
can slow me down.
&lt;/p&gt;
&lt;p&gt;
So, how can I copy the current line without selection? I found a nice trick by
&lt;i&gt;MacChan&lt;/i&gt; on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.emacswiki.org/emacs/SlickCopy&quot;&gt;EmacsWiki&lt;/a&gt; to accomplish this. It also adds ta function to kill
(cut) the current line (similar to &lt;code&gt;kill-line&lt;/code&gt; (&lt;code&gt;C-k&lt;/code&gt;), but kills the whole
line, not just from point (cursor) to the end.
&lt;/p&gt;
&lt;p&gt;
The code below simply embellishes the normal functions with the functionality
'if nothing is selected, assume we mean the current line'. The key bindings
stay the same (&lt;code&gt;M-w&lt;/code&gt;, &lt;code&gt;C-w&lt;/code&gt;).
&lt;/p&gt;
&lt;p&gt;
To enable this, put the following in your &lt;code&gt;.emacs&lt;/code&gt;:
&lt;/p&gt; &lt;pre&gt;(&lt;span&gt;defadvice&lt;/span&gt; &lt;span&gt;kill-ring-save&lt;/span&gt; (before slick-copy activate compile) &lt;span&gt;&quot;When called interactively with no active region, copy a single line instead.&quot;&lt;/span&gt; (interactive (&lt;span&gt;if&lt;/span&gt; mark-active (list (region-beginning) (region-end)) (message &lt;span&gt;&quot;Copied line&quot;&lt;/span&gt;) (list (line-beginning-position) (line-beginning-position 2))))) (&lt;span&gt;defadvice&lt;/span&gt; &lt;span&gt;kill-region&lt;/span&gt; (before slick-cut activate compile) &lt;span&gt;&quot;When called interactively with no active region, kill a single line instead.&quot;&lt;/span&gt; (interactive (&lt;span&gt;if&lt;/span&gt; mark-active (list (region-beginning) (region-end)) (list (line-beginning-position) (line-beginning-position 2)))))
&lt;/pre&gt; &lt;p&gt;
It also shows the power of Emacs-Lisp with the &lt;code&gt;defadvice&lt;/code&gt;-macro – see the
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html&quot;&gt;fine documentation&lt;/a&gt;. Using &lt;code&gt;defadvice&lt;/code&gt;, you can 'decorate' any function with
your own modifications. This great power should be used with caution, of
course, as to not break other usage that assumes the undecorated versions. In
this case, that seem unlikely. And note that the 'advise' only applies when
the functions are called interactively.
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3992530807750384868-7902853816255222152?l=emacs-fu.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>djcb</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/9d9e431d44e81b81</guid>
         <pubDate>Thu, 12 Nov 2009 11:03:00 -0800</pubDate>
      </item>
      <item>
         <title>bookmarks</title>
         <link>http://emacs-fu.blogspot.com/2009/11/bookmarks.html</link>
         <description>&lt;div&gt;
&lt;div&gt; &lt;p&gt;
Emacs has a very useful system for &lt;b&gt;bookmarks&lt;/b&gt; – shortcuts to often-used
files. It's also one of those features I only really started using after years
of emacs – there seem to be many of such &lt;i&gt;obvious&lt;/i&gt; features…
&lt;/p&gt;
&lt;p&gt;
Bookmarks are especially handy if you have long file names, or for examples
the special file names for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://emacs-fu.blogspot.com/2009/10/editing-files-owned-by-root.html&quot;&gt;editing root-owned files&lt;/a&gt; discussed here before.
&lt;/p&gt;
&lt;p&gt;
To start using bookmarks effectively, there are only a few important key
bindings to memorize: &lt;code&gt;C-x r m&lt;/code&gt; ('make') will create a new bookmark,
defaulting to the current file. Then, you can jump to an existing bookmark
with &lt;code&gt;C-x r b&lt;/code&gt; ('bookmark') Finally, you can see the list of your bookmarks
with &lt;code&gt;C-x r l&lt;/code&gt; ('list').
&lt;/p&gt;
&lt;p&gt;
There are a few customizations you can put in your &lt;code&gt;.emacs&lt;/code&gt;:
&lt;/p&gt; &lt;pre&gt;(&lt;span&gt;setq&lt;/span&gt; bookmark-default-file &lt;span&gt;&quot;~/.emacs.d/bookmarks&quot;&lt;/span&gt; &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;keep my ~/ clean
&lt;/span&gt; bookmark-save-flag 1) &lt;span&gt;;; &lt;/span&gt;&lt;span&gt;autosave each change)
&lt;/span&gt;&lt;/pre&gt; &lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3992530807750384868-4980646546758164848?l=emacs-fu.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>djcb</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e927332765013e69</guid>
         <pubDate>Thu, 05 Nov 2009 11:52:00 -0800</pubDate>
      </item>
      <item>
         <title>[boost] [Review Results] Boost.Polygon libraryaccepted into boost</title>
         <link>http://permalink.gmane.org/gmane.comp.lib.boost.announce/240</link>
         <author>Fernando Cacciola</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/72faa94fd023ff44</guid>
         <pubDate>Thu, 05 Nov 2009 15:21:32 -0800</pubDate>
      </item>
      <item>
         <title>Google Bar Code</title>
         <link>http://googlepuzzles.blogspot.com/2009/10/google-barcode.html</link>
         <description>&lt;div style=&quot;clear:both;text-align:center;&quot;&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_RU4D7DqyH0A/Sswx0tE2FMI/AAAAAAAAAAw/TeL3Pi6liaI/s1600-h/Google.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_RU4D7DqyH0A/Sswx0tE2FMI/AAAAAAAAAAw/TeL3Pi6liaI/s400/Google.png&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear:both;text-align:center;&quot;&gt;Google is celebrating the invention of the bar code on its home page. &lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear:both;text-align:center;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear:both;text-align:center;&quot;&gt;If you have a bar code scanner on your iPhone or Android phone, scan the bar code and... &lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/24381191-1041099417820307816?l=googlepuzzles.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Puzzle Solver Wannabe</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/421080815117a373</guid>
         <pubDate>Tue, 06 Oct 2009 23:15:00 -0700</pubDate>
      </item>
      <item>
         <title>If you can figure this out, you may have a future with Google.</title>
         <link>http://googlepuzzles.blogspot.com/2009/09/if-you-can-figure-this-out-you-may-have.html</link>
         <description>&lt;span style=&quot;&quot;&gt;8 M L D Q 6 T U I&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;&quot;&gt;6 T F M L R H A A&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;&quot;&gt;N R A 6 Q 8 E F L&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;&quot;&gt;D M Q 8 6 I I 2 O 3&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;&quot;&gt;2 S 5 J 1 3 J X O J&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;via TechCrunch's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.techcrunch.com/2009/09/21/google-is-searching-for-beautiful-minds-but-so-far-no-m-i-t-students-have-broken-its-code/&quot;&gt;Google Is Searching For Beautiful Minds, But So Far No M.I.T. Students Have Broken Its Code&lt;/a&gt;. &lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/24381191-4163317472934064762?l=googlepuzzles.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Puzzle Solver Wannabe</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/93b60db4b6c6188e</guid>
         <pubDate>Mon, 21 Sep 2009 20:17:00 -0700</pubDate>
      </item>
      <item>
         <title>Crop Circles. 51.327629, -0.5616088. puzzle?</title>
         <link>http://googlepuzzles.blogspot.com/2009/09/crop-circles-51327629-05616088-puzzle.html</link>
         <description>&lt;div align=&quot;left&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_RU4D7DqyH0A/Sq8RUsn7e5I/AAAAAAAAAAg/YnscKATVQoA/s1600-h/cropcircles.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_RU4D7DqyH0A/Sq8RUsn7e5I/AAAAAAAAAAg/YnscKATVQoA/s400/cropcircles.png&quot;&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;left&quot; style=&quot;clear:both;&quot;&gt;&lt;b&gt;query:&lt;/b&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/webhp?hl=en#q=crop+circles&amp;amp;ct=goog_e&amp;amp;oi=ddle&amp;amp;fp=81e4948bcc83d300&quot;&gt;crop circles&lt;/a&gt;&lt;/div&gt;&lt;b&gt;clue: &lt;/b&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=51.327629,+-0.5616088&amp;amp;sll=51.3275,-0.561468&amp;amp;sspn=0.001451,0.003439&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;z=15&quot;&gt;51.327629, -0.5616088&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/24381191-2144390952379988865?l=googlepuzzles.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Puzzle Solver Wannabe</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f0ab1abe36031e6c</guid>
         <pubDate>Mon, 14 Sep 2009 21:05:00 -0700</pubDate>
      </item>
      <item>
         <title>Unexplained Phenomenon. Puzzle?</title>
         <link>http://googlepuzzles.blogspot.com/2009/09/unexplained-phenomenon-puzzle.html</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitpic.com/giyxf&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:400px;height:171px;&quot; src=&quot;http://4.bp.blogspot.com/_RU4D7DqyH0A/SqH89xBt8XI/AAAAAAAAAAU/n0s88t6GQa4/s400/hp.png&quot;&gt;&lt;/a&gt;query: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/search?q=unexplained+phenomenon&quot;&gt;unexplained phenomenon&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Clue:&lt;/strong&gt;&lt;br&gt;twitter @google: 1.12.12 25.15.21.18 15 1.18.5 2.5.12.15.14.7 20.15 21.19&lt;br&gt;&lt;/p&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/24381191-4295849790204444574?l=googlepuzzles.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Puzzle Solver Wannabe</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a9476ffbf4c30b71</guid>
         <pubDate>Fri, 04 Sep 2009 22:52:00 -0700</pubDate>
      </item>
      <item>
         <title>Google Engineering Interview Questions</title>
         <link>http://googlepuzzles.blogspot.com/2009/09/google-engineering-interview-questions.html</link>
         <description>&lt;p&gt;Some readers have emailed and pointed out that some of these puzzles are example questions asked at Google engineering interviews. Wei Hwa is a Google software engineer and these puzzles provide a great insight into Google engineering hires. Why didn't I think of this earlier! What a great resource of puzzles from Google. Several users have used the answering format from this blog and got very far into the interview process. Their tips were&lt;/p&gt;&lt;ol&gt;&lt;li&gt;use analytical analysis&lt;/li&gt;&lt;li&gt;think out loud when solving the problem&lt;/li&gt;&lt;li&gt;use code to solve problems&lt;/li&gt;&lt;li&gt;learn about Google. Google, Google, Google - use gmail on your resume!&lt;/li&gt;&lt;li&gt;look sharp, pop a mint, be confident, and look good&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Check out the archives. Don't forget to read the comments. Lots of user answers.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;May 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;June 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;July 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;August 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;September 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;October 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;November 2006&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlepuzzles.blogspot.com/2006_05_01_archive.html&quot;&gt;December 2006&lt;br&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Not sure if they were hired. Best of luck and hire me when you get in. :) &lt;/p&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/24381191-3610172651137601546?l=googlepuzzles.blogspot.com&quot;&gt;&lt;/div&gt;</description>
         <author>Puzzle Solver Wannabe</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/0f403b4bd8d5b705</guid>
         <pubDate>Wed, 02 Sep 2009 23:40:00 -0700</pubDate>
      </item>
      <item>
         <title>The aftermath</title>
         <link>http://johanjeuring.blogspot.com/2007/10/aftermath.html</link>
         <description>We are wrapping up our efforts on the ICFP Programming Contest 2007. Most contest-related matters have been finished by now.&lt;br&gt;&lt;br&gt;If you want to read more about the ICFP Programming contest, you should have a look at our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cs.uu.nl/research/techreps/UU-CS-2007-029.html&quot;&gt;report&lt;/a&gt; about it.&lt;br&gt;&lt;br&gt;You can order a t-shirt with the after picture on the back, and one picture from the arrival sequence on the front from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cafepress.com/cp/prod.aspx?p=icfp2007.177344907&quot;&gt;cafepress&lt;/a&gt;, or create your own t-shirt using these &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cs.uu.nl/~ariem/icfp-shirt-source.zip&quot;&gt;materials&lt;/a&gt; (4.3MB).&lt;br&gt;&lt;br&gt;If you want to see the presentation we gave about the contest at ICFP 2007, have a look at our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://video.google.com/videoplay?docid=-6131258297916016786&quot;&gt;video&lt;/a&gt; (with an explanation about how to solve the contest problem starting at 18:00, and Endo appearing at around 1:12:00).&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;The&lt;/span&gt; question we got after the contest was: &lt;blockquote&gt;How much time did you spend creating it?&lt;/blockquote&gt; We have different answers to this question, but probably the one that comes closest to the truth is: as much as we enjoyed creating it.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-3834427776393654744?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d74f7a3448537ffe</guid>
         <pubDate>Wed, 24 Oct 2007 05:53:00 -0700</pubDate>
      </item>
      <item>
         <title>Endo lives!</title>
         <link>http://johanjeuring.blogspot.com/2007/10/endo-lives.html</link>
         <description>At the International Conference on Functional Programming (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.informatik.uni-bonn.de/~ralf/icfp07.html&quot;&gt;ICFP&lt;/a&gt;) in Freiburg last week, we announced the results of the ICFP Programming Contest 2007.&lt;br&gt;&lt;br&gt;Just as last year, the first prize was won by Team Smartass from Google research.&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_19dZmLR_fF8/Rwx_FA9Nj7I/AAAAAAAAABs/4mO8azumyFU/s1600-h/P1010140.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://4.bp.blogspot.com/_19dZmLR_fF8/Rwx_FA9Nj7I/AAAAAAAAABs/4mO8azumyFU/s320/P1010140.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The second prize was one by the United Coding Team from the University of Cape Town, South Africa.&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/Rwx_cQ9Nj8I/AAAAAAAAAB0/orWXBsw_11Q/s1600-h/P1010138.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/Rwx_cQ9Nj8I/AAAAAAAAAB0/orWXBsw_11Q/s320/P1010138.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The judges' prize was won by Celestial Dire Badger (Jed Davis). &lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/Rwx_sQ9Nj9I/AAAAAAAAAB8/xF6AfrunzHM/s1600-h/P1010136.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/Rwx_sQ9Nj9I/AAAAAAAAAB8/xF6AfrunzHM/s320/P1010136.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;The highest survival chance produced during the contest (by Team Smartass) was over 90%, so Endo survived! Endo actually came with us to Freiburg to say `thank you' to the people present. &lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/RwyAPw9Nj-I/AAAAAAAAACE/1F9A0ZPdkxs/s1600-h/P1010145.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/RwyAPw9Nj-I/AAAAAAAAACE/1F9A0ZPdkxs/s320/P1010145.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Later in the week he was spotted by several ICFP attendants in the city of Freiburg, running around and enjoying himself.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-2327910159333151702?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a8de59c4b056cc2b</guid>
         <pubDate>Wed, 10 Oct 2007 00:20:00 -0700</pubDate>
      </item>
      <item>
         <title>Tickling grass</title>
         <link>http://johanjeuring.blogspot.com/2007/08/tickling-grass.html</link>
         <description>&lt;div style=&quot;text-align:left;&quot;&gt;As you all already know, Endo's chance of survival is also affected by other organisms and objects in his environment. One of the organisms that has recently attracted our attention is grass. It turns out that with just a few modifications to Endo's DNA you can make grass grow in completely different places! We have not discovered, however, how to make it grow at the right locations. Take a look at what we tried:&lt;br&gt;&lt;/div&gt;&lt;pre&gt;IIPIFFCPICCFPICICFPPICICIPICIIICCCIICIIICCCIIICCCP&lt;br&gt;IICIPIIICCPIIPIICIIPIPIIICCPIICIIPIICIPIIICCPIICIP&lt;br&gt;PPCCCFFCCCCCCCCCCCCCCCCCCICIPPCPFCCCFFCCFCCCCCCCCC&lt;br&gt;CCFFFICIPPCCPCFCFCFFCCCCCFCFFCCCCCCCICIICIIPIFFCPI&lt;br&gt;CCFPICICFPPICICIPICCIIICICIIICIICCIIICCCPIICIPIIIC&lt;br&gt;CPIIPIICIIPIPIIICCPIICIIPIICIIPIPIIICCPIICIIPIICIP&lt;br&gt;IIICCPIICIPPPCCCCFFCCCCCCCCCCCCCCCCCICIPPCPCCFFFCC&lt;br&gt;FCFFFCCFFFFFFCFFICIPPCCPCFFCFFCCCCFCCCCCFCCCFFFICI&lt;br&gt;PPCICPCFFFCFFFFFCCCCCCFCCCCCCICIIC&lt;br&gt;&lt;/pre&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;This prefix enables grass repositioning and redefines the function bioMul (see initial conditions help page) as follows:&lt;br&gt;&lt;/div&gt;&lt;pre&gt;bioMul x y = bioAdd x y&lt;br&gt;&lt;/pre&gt;&lt;div style=&quot;text-align:left;&quot;&gt;It seems that the bioMul function influences where grass is going to grow. We are still searching for the right definition of bioMul, and we are confident that when we find it, grass will grow at the right locations. Do you want to help us figure out how to fix bioMul? If you do, you might find it helpful to understand first how bioAdd is encoded in DNA.&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-3260190547117502263?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Alexey</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/8a90ff3c37937fed</guid>
         <pubDate>Fri, 17 Aug 2007 06:59:00 -0700</pubDate>
      </item>
      <item>
         <title>Finding palindromes</title>
         <link>http://johanjeuring.blogspot.com/2007/08/finding-palindromes.html</link>
         <description>[Since this blog message has received thousands of hits since I wrote it in 2007, I decided to release the program described in this message. Visit &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jeuring.net/Palindromes/&quot;&gt;http://www.jeuring.net/Palindromes/&lt;/a&gt;to obtain the software.]&lt;br&gt;&lt;br&gt;A palindrome is a number, verse, word or a phrase that is the same whether you read it backwards or forwards, for example the word `refer'. &lt;br&gt;&lt;br&gt;When I started as a PhD student in Computer Science in 1988, my professor gave the following problem assignment to me. Construct an algorithm that, when given a string, finds the longest palindrome substring occurring in the string. For example, given the string &quot;yabadabadoo&quot;, the algorithm should return the substring &quot;abadaba&quot;. The algorithm should not only &lt;span style=&quot;font-weight:bold;&quot;&gt;return&lt;/span&gt; the longest palindrome substring, it should also return it &lt;span style=&quot;font-weight:bold;&quot;&gt;fast&lt;/span&gt;. The requirement was that the algorithm should only use a number of steps linear in the length of the argument string. This was a difficult problem, which gave me severe headaches in the months to follow. I spent four months on the problem, and solved it. The one comment I got from my professor was &quot;The best thing about this problem and its solution is that they have absolutely no practical relevance.&quot;&lt;br&gt;&lt;br&gt;He was wrong.&lt;br&gt;&lt;br&gt;Since 1988 I have found that palindromes play an important role in the world around us. Palindromes appear in music, in genomes, in art, architecture and design, mathematics, physics, chemistry, etc. &lt;br&gt;&lt;br&gt;Particularly interesting is the fact that palindromes occur in the male genome: of the about 20,000,000 characters representing the male-specific region of the Y chromosome, 5,700,000 characters form together eight large palindromes (off by a couple of characters). I don't think there is any proven explanation for the presence of palindromes in the male genome, but I suspect it has something to do with repairing genomes. If you know more about it: please let me know.&lt;br&gt;&lt;br&gt;As you may or may not have noticed when working on repairing Endo's DNA, the cloud is corrupted. It turns out that the cloud's genome also is a palindrome (off by a couple of characters), and that the corruption can be repaired by taking the mirror image of the palindrome. To do so, you have to find the palindrome. In the case of Endo, this is pretty easy: `duolc' follows cloud immediately in the symbol table. Had this information not been in the symbol table, you would have to find this palindrome in the DNA by means of an algorithm for finding palindromes. Actually, the DNA for the cloud is only 6,500 acids long, and using a naive quadratic-time algorithm for finding palindromes is not a real problem if you have a sufficiently fast machine. A quadratic-time algorithm for determining palindromes in human male DNA isn't going to work: it would take a long time to find the palindromes. &lt;br&gt;&lt;br&gt;This blog message explains how to find palindrome substrings in linear time. I will develop a program in Haskell for finding exact palindromes. The problem of finding approximate palindromes is left as an exercise to the reader :-) Interestingly, the algorithms for finding palindromes developed by computational biologists generally use suffix trees, and both space and time consumption seem to be worse compared with the algorithm I give in this blog message. But descriptions of the algorithm given here have been published in the eighties (by Galil and others, described in RAM-code) and nineties (by me, described in Squiggol, which is probably even harder to decypher than RAM-code) of the previous century, which is a long time ago of course.&lt;br&gt;&lt;br&gt;This blog message is a literate Haskell file, which can be interpreted with ghci.&lt;br&gt;&lt;br&gt;&lt;h3&gt;&lt;br&gt;The type of a function for finding palindromes&lt;br&gt;&lt;/h3&gt;&lt;br&gt;I want to find the longest palindrome substring in a string. The first attempt at a type for a function longestPalindrome is hence:&lt;br&gt;&lt;br&gt; longestPalindrome :: String -&amp;gt; String&lt;br&gt;&lt;br&gt;To determine whether or not a string is a palindrome, I have to compare characters at different positions in a list. It would be helpful if I had random access into the string. For that purpose, I'm going to change the input type of the longestPalindrome function to an array. Furthermore, the longestPalindrome algorithm can also be used to find the longest palindrome in a list of integers, or any other type on which I can define an equality function. So here is the second attempt at a type for a function for finding the longest palindrome:&lt;br&gt;&lt;br&gt; longestPalindrome :: Eq a =&amp;gt; Array Int a -&amp;gt; Array Int a&lt;br&gt;&lt;br&gt;To find the longest Palindrome in an array, I have to calculate the longest palindrome around each position of the array, where a position in an array is either on an element, or before or after an element. For example, the array corresponding to [1,2,3] has 7 positions: before the 1, on the 1, before the 2, ..., until after the 3. So I want to express the function longestPalindrome in terms of a function longestPalindromes of type&lt;br&gt;&lt;br&gt; longestPalindromes :: Eq a =&amp;gt; Array Int a -&amp;gt; [Int]&lt;br&gt;&lt;br&gt;where the result list is the list of the lengths of the longest palindrome around each position in the argument array. For example,&lt;br&gt;&lt;br&gt;?longestPalindromes (arrayList (0,2) [1,2,2])&lt;br&gt;[0,1,0,1,2,1,0]&lt;br&gt;&lt;br&gt;I will omit the definition of longestPalindrome in terms of longestpalindromes, and define function longestPalindromes below.&lt;br&gt;&lt;br&gt;&lt;h3&gt;&lt;br&gt;A naive algorithm for finding palindromes&lt;br&gt;&lt;/h3&gt;&lt;br&gt;A naive algorithm for finding palindromes calculates all positions of an input array, and for each of those positions, calculates the length of the longest palindrome around that position.&lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; module Palindromes where&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; import Data.Array&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt; longestPalindromesQ :: Eq a =&amp;gt; Array Int a -&amp;gt; [Int]&lt;br&gt;&amp;gt; longestPalindromesQ a = &lt;br&gt;&amp;gt; let (afirst,alast) = bounds a&lt;br&gt;&amp;gt; positions = [0 .. 2*(alast-afirst+1)]&lt;br&gt;&amp;gt; in map (lengthPalindromeAround a) positions&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Function lengthPalindromeAround takes an array and a position, and calculates the length of the longest palindrome around that position. &lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; lengthPalindromeAround :: Eq a =&amp;gt; Array Int a &lt;br&gt;&amp;gt; -&amp;gt; Int &lt;br&gt;&amp;gt; -&amp;gt; Int&lt;br&gt;&amp;gt; lengthPalindromeAround a position &lt;br&gt;&amp;gt; | even position = &lt;br&gt;&amp;gt; extendPalindromeAround (afirst+pos-1) &lt;br&gt;&amp;gt; (afirst+pos) &lt;br&gt;&amp;gt; | odd position = &lt;br&gt;&amp;gt; extendPalindromeAround (afirst+pos-1) &lt;br&gt;&amp;gt; (afirst+pos+1) &lt;br&gt;&amp;gt; where pos = div position 2&lt;br&gt;&amp;gt; (afirst,alast) = bounds a&lt;br&gt;&amp;gt; extendPalindromeAround start end = &lt;br&gt;&amp;gt; if start &amp;lt; 0 &lt;br&gt;&amp;gt; || end &amp;gt; alast-afirst &lt;br&gt;&amp;gt; || a!start /= a!end&lt;br&gt;&amp;gt; then end-start-1&lt;br&gt;&amp;gt; else extendPalindromeAround (start-1) &lt;br&gt;&amp;gt; (end+1) &lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;For each position, this function may take an amount of steps linear in the length of the array, so this is a quadratic-time algorithm.&lt;br&gt;&lt;br&gt;&lt;h3&gt;&lt;br&gt;A linear-time algorithm for finding palindromes&lt;br&gt;&lt;/h3&gt;&lt;br&gt;I now describe a linear-time algorithm for finding palindromes. Although the program is only about 15 lines long, it is rather intricate. I guess that you need to experiment a bit with to find out how and why it works. &lt;br&gt;&lt;br&gt;The algorithm processes the input array from left to right. It maintains the length of the current longest tail palindrome, and a list of lengths of longest palindromes around positions before the center of the current longest tail palindrome, in reverse order. Function longestPalindromes is expressed in terms of function extendTail. &lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; longestPalindromes :: Eq a =&amp;gt; Array Int a -&amp;gt; [Int]&lt;br&gt;&amp;gt; longestPalindromes a = &lt;br&gt;&amp;gt; let (afirst,alast) = bounds a&lt;br&gt;&amp;gt; in extendTail a afirst 0 []&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Function extendTail takes an array as argument, the current position in the array, the length of the current longest tail, and a list of lengths of longest palindromes around positions before the center of the current longest tail palindrome, in reverse order. There are four cases to be considered in function extendTail. If the current position is after the end of the array, we only have to add the final palindromes in the array to the list of longest palindromes, for which we use the function finalCentres. If the current longest tail palindrome extends to the start of the array, we extend the list of lengths of longest palindromes by means of function extendCentres. If the element at the current position in the array equals the element before the longest tail palindrome we extend the longest tail palindrome. If these elements are not equal, we extend the list of length of longest palindromes. &lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; extendTail a n currentTail centres &lt;br&gt;&amp;gt; | n &amp;gt; alast = &lt;br&gt;&amp;gt; -- reached the end of the array &lt;br&gt;&amp;gt; finalCentres currentTail centres &lt;br&gt;&amp;gt; (currentTail:centres)&lt;br&gt;&amp;gt; | n-currentTail == afirst = &lt;br&gt;&amp;gt; -- the current longest tail palindrome &lt;br&gt;&amp;gt; -- extends to the start of the array&lt;br&gt;&amp;gt; extendCentres a n (currentTail:centres) &lt;br&gt;&amp;gt; centres currentTail &lt;br&gt;&amp;gt; | a!n == a!(n-currentTail-1) = &lt;br&gt;&amp;gt; -- the current longest tail palindrome &lt;br&gt;&amp;gt; -- can be extended&lt;br&gt;&amp;gt; extendTail a (n+1) (currentTail+2) centres &lt;br&gt;&amp;gt; | otherwise = &lt;br&gt;&amp;gt; -- the current longest tail palindrome &lt;br&gt;&amp;gt; -- cannot be extended &lt;br&gt;&amp;gt; extendCentres a n (currentTail:centres) &lt;br&gt;&amp;gt; centres currentTail&lt;br&gt;&amp;gt; where (afirst,alast) = bounds a&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Function extendCentres adds palindromes to the list of lengths of longest palindromes. It takes the array as argument, the current position in the array, the list of palindromes to be extended, and the list of palindromes around centres before the centre of the current longest palindrome tail. It uses the mirror property of palindromes to calculate longest palindromes around centres after the centre of the current longest palindrome tail. If the last centre is on the last element, we call extendTail with a longest tail palindrome of length 1, and the position moved tot he right. If the previous element in the centre list reaches exactly to the end of the last tail palindrome, use the mirror property of palindromes to find the longest tail palindrome. In the other cases, we've found the longest palindrome around a centre, and add that to the list of length of longest palindromes. We proceed by moving the centres one position, and calling extendCentres again.&lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; extendCentres a n centres tcentres centreDistance&lt;br&gt;&amp;gt; | centreDistance == 0 = &lt;br&gt;&amp;gt; -- the last centre is on the last element: &lt;br&gt;&amp;gt; -- try to extend the tail of length 1&lt;br&gt;&amp;gt; extendTail a (n+1) 1 centres&lt;br&gt;&amp;gt; | centreDistance-1 == head tcentres = &lt;br&gt;&amp;gt; -- the previous element in the centre list &lt;br&gt;&amp;gt; -- reaches exactly to the end of the last &lt;br&gt;&amp;gt; -- tail palindrome use the mirror property &lt;br&gt;&amp;gt; -- of palindromes to find the longest tail &lt;br&gt;&amp;gt; -- palindrome&lt;br&gt;&amp;gt; extendTail a n (head tcentres) centres&lt;br&gt;&amp;gt; | otherwise = &lt;br&gt;&amp;gt; -- move the centres one step&lt;br&gt;&amp;gt; -- add the length of the longest palindrome &lt;br&gt;&amp;gt; -- to the centres&lt;br&gt;&amp;gt; extendCentres a n (min (head tcentres) &lt;br&gt;&amp;gt; (centreDistance-1):centres) &lt;br&gt;&amp;gt; (tail tcentres) (centreDistance-1)&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Function finalCentres calculates the lengths of the longest palindromes around the centres that come after the centre of the longest tail palindrome of the array. These palindromes are obtained by using the mirror property of palindromes.&lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&amp;gt; finalCentres 0 tcentres centres = centres&lt;br&gt;&amp;gt; finalCentres (n+1) tcentres centres = &lt;br&gt;&amp;gt; finalCentres n &lt;br&gt;&amp;gt; (tail tcentres) &lt;br&gt;&amp;gt; (min (head tcentres) n:centres)&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;At each step in this algorithm, either the longest tail palindrome is extended, and the current position in the array is moved, or the list of lengths of longest palindromes is extended. Since both the array, and the list of lengths of longest palindromes are linear in the length of the array, this is a linear-time algorithm.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-2403175236361098258?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f9dd7ef5e3e6aa6e</guid>
         <pubDate>Thu, 09 Aug 2007 23:25:00 -0700</pubDate>
      </item>
      <item>
         <title>The Major Imp Episodes</title>
         <link>http://johanjeuring.blogspot.com/2007/08/major-imp-episodes.html</link>
         <description>Although the Fuun typically want little to do with them, they do suffer from an inferiority complex when it comes to Imps. This is most evident in the large amount of extremely popular spy stories in which the Fuun novice invariably wins against a hard-boiled, sinister Imp character, who either dies (after a heroic attempt by the hero to save his life) or is converted to Fuun philosophy and thereafter serves the functional cause. A few short excerpts of such a story were recovered from Endo's DNA. It is still unclear whether these stories could actually play a role in saving Endo. For your amusement, we have included the very first episode below:&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;Only just before sleep-groggy roosters reared their scrawny heads, there was a hesitant knock on the steel door of the austere office of semi-colonel Void.&lt;span style=&quot;font-style:italic;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&quot;ENTER&quot;&lt;/span&gt;, rang out from the room, as though spoken in a medium-sized cathedral. Novice Imp entered the cramped room with some trepidation, knowing full well that many a (not so intelligent) agent had become deallocated after nary a slip of the tongue. Lieutenant Ptr, for example, had referred in His presence to &quot;some unwanted side-effects&quot; of a particular investigation. Ptr had promised that it wouldn't happen again, and Void had made sure that indeed it wouldn't.&lt;br&gt;&lt;br&gt;Somewhat weak at the knees, Imp made for the middle of the room, where he stood at attention. &lt;span style=&quot;font-style:italic;&quot;&gt;&quot;RELAX&quot;&lt;/span&gt;, spoke Void, in his usual teletype voice that belied the contents. &lt;span style=&quot;font-style:italic;&quot;&gt;&quot;I have heard that among our recruits, you are the one adhering closest our revered commandos. We have a sensitive and dangerous mission scheduled and you have been chosen to volunteer...&quot;&lt;/span&gt; (call-cc)&lt;/blockquote&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-77000565581531226?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Jurriaan Hage</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d02dc00694849203</guid>
         <pubDate>Sat, 04 Aug 2007 07:42:00 -0700</pubDate>
      </item>
      <item>
         <title>How did it go?</title>
         <link>http://johanjeuring.blogspot.com/2007/07/how-did-it-go.html</link>
         <description>The ICFP Contest 2007 ended last Monday. We have seen writeups of several teams that participated in the ICFP Contest. Many of those are interesting and sometimes funny reading. We particularly enjoyed &lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://stereotype441.livejournal.com/45150.html&quot;&gt;http://stereotype441.livejournal.com/45150.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;Marco Galotta collected a list of writeups, and posted them on his blog&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://marco-za.blogspot.com/2007/07/icfp-how-we-reached-top-15.html&quot;&gt;http://marco-za.blogspot.com/2007/07/icfp-how-we-reached-top-15.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;We don't want to give our writeup now, we'll do that for ICFP in Freiburg, but we do want to briefly share our experiences.&lt;br&gt;&lt;br&gt;We had a very hectic and pleasant time. I cannot remember I've had such an intense time at work before. &lt;br&gt;&lt;br&gt;Headquarters was never empty during the 72 hours of the contest. We had a laptop showing several screens via a beamer: last 20 submissions, standings, the icfp mail account, several irc channels devoted to the contest, etc. Not much happened in the middle of the contest, but both the start and end were very hectic. The end was a thriller, I can assure you. But more about that at the ICFP conference in Freiburg. &lt;br&gt;&lt;br&gt;Everything went fine. We haven't discovered an error in the task description yet. Initially we were worried about the slow start by many teams, but as time passed we were increasingly impressed by the creativity and cleverness of many teams. We have excellent winners. Our machines were unreachable twice for a short period, but that hasn't been a problem. Web statistics show that we processed millions of hits in these three days. All in all we are quite satisfied by how things went. &lt;br&gt;&lt;br&gt;From now on we will prepare our presentation at Freiburg. By then we will know whether or not Endo survived. In the presentation we will discuss the problem, possible solutions, techniques we used to create the problem, solutions we have seen from the participants, the winners, etc. We will hand out a writeup about the contest in Freiburg.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-3506831996991138479?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/afc1d5c3a8612d17</guid>
         <pubDate>Mon, 30 Jul 2007 03:41:00 -0700</pubDate>
      </item>
      <item>
         <title>Thank you</title>
         <link>http://johanjeuring.blogspot.com/2007/07/thank-you.html</link>
         <description>Thank you all so much for participating.&lt;br&gt;&lt;br&gt;It has been heart-warming to see all participants trying so hard to save the poor Endo. It was a hard struggle, but we are very optimistic Endo will survive. We have sent the best submitted prefix to Arrow, but haven't heard anything since. We hope that this is due to the fact that Arrow is using all its remaining energy to apply the DNA prefix to Endo, and not because something has gone wrong. For now, we can do nothing but wait for a sign of life. Repairing DNA takes time, but we expect that we will know whether or not it has been successful by the time of the ICFP Conference in Freiburg.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-3743914140288103173?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/15edf17963bc5bea</guid>
         <pubDate>Mon, 23 Jul 2007 04:03:00 -0700</pubDate>
      </item>
      <item>
         <title>Emorphency!</title>
         <link>http://johanjeuring.blogspot.com/2007/07/emorphency.html</link>
         <description>Ok, here's the story, as unbelievable as it sounds. It looks like the message was a call for help, sent by the ship that also appears in the sequence of pictures. The ship seems to be called &lt;em&gt;Arrow&lt;/em&gt; and to be a sentient being, or at least intelligent. Apparently the story as told by the picture sequence has actually happened, with the final picture (decrypted by us today as expected) happening three months ago, about when the message was sent to us.&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/RqBwE-irtcI/AAAAAAAAABk/A8e9cYXRxPA/s1600-h/emorphency.jpeg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://1.bp.blogspot.com/_19dZmLR_fF8/RqBwE-irtcI/AAAAAAAAABk/A8e9cYXRxPA/s320/emorphency.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;It is the story of &lt;em&gt;Endo&lt;/em&gt;, a specimen of the extraterrestial &lt;em&gt;Fuun&lt;/em&gt;. Endo was garbage-collected while sleeping in his(?) ship Arrow and unfortunately drifting into a heap of junk. Garbage collectors are apparently common in space and run by a species called the &lt;em&gt;Imps&lt;/em&gt;. They like to drop junk on underdeveloped worlds (sorry, this is what Arrow told us). So the ship, together with lots of other stuff, was dropped on Earth. Arrow was damaged in the process, and before it could warn Endo that the atmospheric conditions of Earth are not very suitable for a Fuun, Endo left the ship – only to be hit by a cargo container! Endo is now in serious trouble. According to Arrow, the only chance to save Endo is to adapt him to the conditions that are prevalent on Earth by changing its DNA. &lt;br&gt;&lt;br&gt;The hitch is that Arrow, being damaged itself, is running low on energy and cannot come up with a good modification itself. It can still perform the actual transformation process, but only if it gains knowledge of a suitable transformation soon. Arrow tells us it only has slightly more than 72 hours left before it will shut down!&lt;br&gt;&lt;br&gt;During the last days, we have been able to decipher large parts of the original message, found out that it is about DNA and describes how Fuun DNA works. We therefore have some understanding now about the process involved. Unfortunately – and we feel really guilty about it – we have given all of this a low priority due to the upcoming contest, and the one thing we didn't find out until after we actually made contact with Arrow, was that this really is a cry for help, and how urgent it is! If only we had found out earlier, we would have had much more time to save Endo!&lt;br&gt;&lt;br&gt;Because of that, and also because it is really the only thing we can think of to still give Endo a chance, we will change our plans. We will abandon the original topic we had in mind for the ICFP contest (writing generic programs in order to design boilerplates). Instead, we make it the task of the contest to Morph Endo!&lt;br&gt;&lt;br&gt;(Of course, we still are not 100% sure if the message is actually authentic, but from what we've seen, there seems to be a lot of structure in the DNA we discovered, and a lot of information provided by Arrow, and we doubt someone would put so much effort into a joke.)&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-4009100924077471867?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e1ef126480404326</guid>
         <pubDate>Fri, 20 Jul 2007 00:55:00 -0700</pubDate>
      </item>
      <item>
         <title>Contact</title>
         <link>http://johanjeuring.blogspot.com/2007/07/contact.html</link>
         <description>We seem to have made contact with the author of the message. At least that's what we believe. Communication is still, well, difficult at best.&lt;br&gt;&lt;br&gt;With the contest starting in a few days and the preparations more or less in place, we can now put a bit more effort into solving this mystery, and I am very curious where it will lead to.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-8730519669194720767?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d8db911f9fed79b0</guid>
         <pubDate>Tue, 17 Jul 2007 22:24:00 -0700</pubDate>
      </item>
      <item>
         <title>The message</title>
         <link>http://johanjeuring.blogspot.com/2007/07/message.html</link>
         <description>You might remember the 'SPAM' message we received more than 3 months ago (see my message on April 26). For a long time, the only thing we managed to do with it is decrypt pictures, which already takes us a lot of time. We run the decryption process on one machine, and get about one picture per week. It seems there's only one picture left to decrypt, and that should be ready by Friday. The pictures appear to tell a story, but we cannot make much sense of it.&lt;br&gt;&lt;br&gt;However, it was clear from the beginning that the pictures are only a small part of the message, and the rest remained a big mystery to us ... until last week, when Alexey suddenly had a brilliant idea that turned out to be a major breakthrough. Since then, we have not only deciphered a large part of the message, but we also have an idea about who sent it. It is all very strange, and we still do not know whether it all is a joke (maybe from an ex-student?) or whether it could be real. I'll keep you informed about our progress.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-6683712495552361782?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/de21080e87a5180c</guid>
         <pubDate>Mon, 16 Jul 2007 01:35:00 -0700</pubDate>
      </item>
      <item>
         <title>Hello, World!</title>
         <link>http://johanjeuring.blogspot.com/2007/07/hello-world.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_19dZmLR_fF8/RpdaT-irtbI/AAAAAAAAABc/FC5TZElBGko/s1600-h/helloworld.jpeg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://4.bp.blogspot.com/_19dZmLR_fF8/RpdaT-irtbI/AAAAAAAAABc/FC5TZElBGko/s320/helloworld.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-6786237323719312158?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/91cd61703ed6590b</guid>
         <pubDate>Fri, 13 Jul 2007 03:51:00 -0700</pubDate>
      </item>
      <item>
         <title>Feyeneyete loop?</title>
         <link>http://johanjeuring.blogspot.com/2007/07/feyeneyete-loop.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/Ro5XNJaKxvI/AAAAAAAAABU/cRmtyDkImow/s1600-h/feyeneyeteloop.jpeg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/Ro5XNJaKxvI/AAAAAAAAABU/cRmtyDkImow/s320/feyeneyeteloop.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-4339219864129308038?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/592d752fc43cd258</guid>
         <pubDate>Fri, 06 Jul 2007 07:51:00 -0700</pubDate>
      </item>
      <item>
         <title>The team</title>
         <link>http://johanjeuring.blogspot.com/2007/07/team.html</link>
         <description>Let me introduce the team. I cannot disclose their contributions in detail, for obvious reasons.&lt;br&gt;&lt;br&gt;Atze Dijkstra and Doaitse Swierstra. Contributed to the brainstorming sessions in 2005 and 2006. &lt;br&gt;&lt;br&gt;Eelco Dolstra. I think if someone in the team qualifies for the label hacker, it will be Eelco. Eelco has participated in several contests. He has developed, amongst others, the central component for this years' contest. He is &lt;span style=&quot;font-weight:bold;&quot;&gt;not&lt;/span&gt; a religious Haskell hacker (as many of us others are), and that has definitely been a Good Thing.&lt;br&gt;&lt;br&gt;Chris Eidhof, Maaike Gerritsen, Jeroen Leeuwestein, Eelco Lempsink, Martijn van Steenbergen, Mark Stobbe. Student testers. Contributed to many aspects of the problem after they finished their test run.&lt;br&gt;&lt;br&gt;Jurriaan Hage. Jurriaan has a broad background, and has contributed to several components of the task. Unfortunately, none of these can be disclosed.&lt;br&gt;&lt;br&gt;Bastiaan Heeren. Enthusiastic member from the start. Has become the central organiser in the team, and is continuously adding and testing new ideas, implementing tools, pushing students to implement ideas, answering questions, etc. He knows most of what is going on, what still needs to be done, who is doing what, etc.&lt;br&gt;&lt;br&gt;Stefan Holdermans and Arie Middelkoop. Young, starting, PhD students, who also have to write their first papers, so they cannot spend as much time as some of us others on the contest. I cannot disclose Arie's contributions; Stefan mainly worked on the task description. His perfectionism is exactly what we need for the task!&lt;br&gt;&lt;br&gt;Johan Jeuring. Johan is the chairman of the organisation committee. He takes care of the `external relations'. Furthermore, he contributed to the problem and the task description. But he spends most of his time on organisational matters.&lt;br&gt;&lt;br&gt;Andres Löh. One of our two external members. But he did his PhD here, and will become a lecturer very soon, so he cannot really be called external. Has participated in several contests (even won one!). Contributed many things: story, basic constructs, task description, theory development, etc. &lt;br&gt;&lt;br&gt;Clara Löh. Our other external member. Did most of the artwork.&lt;br&gt;&lt;br&gt;Alexey Rodriguez. Together with Eelco, I think Alexey is the other candidate for the hacker label. Has been away a couple of months to optimize GHC in GHC-headquarters, but has picked up very quickly again after he returned. His main contributions have to remain a secret for now. They're slightly obscure, but I hope you'll enjoy them anyway.&lt;br&gt;&lt;br&gt;John van Schie. One of our students, and another hacker, who has implemented the communication components.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-7681605530252055121?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/315825375c234302</guid>
         <pubDate>Wed, 04 Jul 2007 06:28:00 -0700</pubDate>
      </item>
      <item>
         <title>What's up?</title>
         <link>http://johanjeuring.blogspot.com/2007/06/whats-up.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/RoO8F5aKxuI/AAAAAAAAABM/7AanqZJTUtM/s1600-h/whatsup.jpeg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;&quot; src=&quot;http://3.bp.blogspot.com/_19dZmLR_fF8/RoO8F5aKxuI/AAAAAAAAABM/7AanqZJTUtM/s320/whatsup.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-1254046591375948993?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/9431e76ff028d38d</guid>
         <pubDate>Thu, 28 Jun 2007 06:47:00 -0700</pubDate>
      </item>
      <item>
         <title>The process</title>
         <link>http://johanjeuring.blogspot.com/2007/06/process.html</link>
         <description>Ralf Hinze, the general chair of ICFP 2007 asked us already at the end of 2005 if we would like to organise the ICFP Programming Contest 2007. I tried to collect a group of people from the Software Technology group of the Computing Sciences department of Utrecht University that were willing to help. That turned out to be rather easy: the majority of the people I asked were enthusiastic about it. In the first months we had frequent meetings, to discuss the several aspects of organising such a contest. Furthermore, we extended the team with several young colleagues. In particular with people that had participated in a couple of previous contests, which was really helpful.&lt;br&gt;&lt;br&gt;After two months we stopped meeting to wait for the 2006 contest. We participated in the 2006 contest with four members of the team. As I mentioned in the blog message about the 2006 contest, I think this was a great experience.&lt;br&gt;&lt;br&gt;We resumed brainstorming at the end of summer 2006. We ended up with three or four problem ideas. Each idea was investigated by a small group of people, and in October we selected one of the ideas, based on the practical requirements for a task we have formulated in a previous blog message.&lt;br&gt;&lt;br&gt;In the following months we implemented several components for the task, and we tried to solve the several problems we envisaged with our problem idea. In January 2007 we were pretty convinced that our problem idea had no fatal flaws, and we started working out the many details that we had left open.&lt;br&gt;&lt;br&gt;Since then we have been working on the implementation of the several components, testing, and quality control.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1307152710341271576-7061433155150836761?l=johanjeuring.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Johan Jeuring</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7bd14ecc39b6e990</guid>
         <pubDate>Mon, 25 Jun 2007 08:13:00 -0700</pubDate>
      </item>
      <item>
         <title>New Years, live-ish with Green Day</title>
         <link>http://int64.org/2009/11/24/new-years-live-ish-with-green-day</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://int64.org/wp-content/uploads/2009/11/greenday.jpg&quot; alt=&quot;greenday&quot; title=&quot;greenday&quot; width=&quot;200&quot; height=&quot;254&quot;&gt;I’ve gone to far too many events this past week. If I don’t put an end to this quick, I may become “normal”…&lt;/p&gt;
&lt;p&gt;I took it to the next level tonight, though, by traveling into the future to see Green Day’s New Years Eve concert at LA Live. Well, sort-of. NBC was filming the concert with Carson Daly as the host. They gave us all new years hats and had us all count down from 30 as if the ball was dropping on New Years Eve. Apparently they’ll air this then. TV Magic!&lt;/p&gt;
&lt;p&gt;After the count down, Green Day came on with a “Happy fucking New Year!” and rocked the stage for the rest of the night. Their performance was complete with explosions, fireworks, and a good mix between their newer stuff and the older stuff I was listening to on tape when I was eight years old (holy crap) in elementary school. Better yet, a friend I hadn’t seen in ages was down to visit family for the week, so I met her and her brothers there and caught up. Good times!&lt;/p&gt;</description>
         <author>Cory</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/068d6398cae3f1cd</guid>
         <pubDate>Tue, 24 Nov 2009 00:20:12 -0800</pubDate>
      </item>
      <item>
         <title>links for 2009-11-23</title>
         <link>http://feedproxy.google.com/~r/tecosystems/~3/c9MwfMcYqa8/</link>
         <description>&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.businessinsider.com/peter-thiel-on-obama-ai-and-why-he-rents-his-mansion-2009-11&quot;&gt;Peter Thiel Says Don't Piss Off The Robots (Or Bet On A Recovery)&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&quot;[An artificially intelligent computer] could be very good, it could be very bad, it could be somewhere in between. Certainly we would hope that it would be friendly to human beings. At the same time, I dont think you'd want to be known as one of the human beings that is against computers and makes a living being against computers. So probably at the margins it would be prudent not to make a name for yourself as a anti- technological human being just as these computers are coming onto the scene.&quot;&lt;/div&gt;
&lt;div&gt;(tags: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/peterthiel&quot;&gt;peterthiel&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/robots&quot;&gt;robots&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/artificialintelligence&quot;&gt;artificialintelligence&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/ai&quot;&gt;ai&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/humor&quot;&gt;humor&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redmonk.com/sogrady/?p=3182&amp;amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot;&gt;Share This&lt;/a&gt;
&lt;/p&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=c9MwfMcYqa8:q3tEGuwdM-c:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=c9MwfMcYqa8:q3tEGuwdM-c:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=c9MwfMcYqa8:q3tEGuwdM-c:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=c9MwfMcYqa8:q3tEGuwdM-c:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=c9MwfMcYqa8:q3tEGuwdM-c:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/c9MwfMcYqa8&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>sogrady</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/637011b5c253168b</guid>
         <pubDate>Mon, 23 Nov 2009 17:02:14 -0800</pubDate>
      </item>
      <item>
         <title>Extensions: One Step Closer to the Finish Line</title>
         <link>http://blog.chromium.org/2009/11/extensions-one-step-closer-to-finish.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_LJuAPqyUVas/SwsRYG4LKdI/AAAAAAAAAB8/Y4KvKgRPxks/s1600/galleryscreenshot+(1).png&quot;&gt;&lt;img style=&quot;width:400px;height:181px;&quot; src=&quot;http://1.bp.blogspot.com/_LJuAPqyUVas/SwsRYG4LKdI/AAAAAAAAAB8/Y4KvKgRPxks/s400/galleryscreenshot+(1).png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;div&gt;During the last few months, our team has been working hard to support extensions in Google Chrome's beta channel. Today, we are getting one step closer to this goal; developers can now upload their extensions to Google Chrome's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://chrome.google.com/extensions&quot;&gt;extension gallery&lt;/a&gt;. We are making the upload flow available early to make sure that developers have the time to publish their extensions ahead of our full launch.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You can find all the info to write an extension in our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/chrome/extensions&quot;&gt;docs&lt;/a&gt;. Once your extension is ready for the gallery, you'll need to upload a zip file of your code and an icon that helps users distinguish your extension. You'll also have the option to submit text, screenshots and/or YouTube videos that describe the functionality of your extension. All types of extensions are welcome in the gallery, provided they comply with our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://chrome.google.com/extensions/intl/en/dev_tos_text.html&quot;&gt;Terms of Service&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;For most extensions, the review process is fully automated. The only extensions we'll review manually are those that include an NPAPI component and all content scripts that affect &lt;span style=&quot;&quot;&gt;&quot;file://&quot;&lt;/span&gt; URLs. For security reasons, developers of these types of extensions will need to provide some additional information before they can post them in the gallery. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Once an extension is uploaded, our gallery takes care of packaging and signing. Updating an extension is also incredibly easy — all a developer needs to do is to upload a new file in the gallery. Finally, to further help developers, in the next few days, we plan to open up the gallery to a small group of trusted testers. They will provide developers with insights and bug reports that will help them polish their extensions ahead of our beta launch. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We can't wait to share all the great extensions that you'll submit with all of Google Chrome's users. In the meantime, we encourage you to submit any bugs you find in the upload process to our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/chromium/issues/list&quot;&gt;Issue Tracker&lt;/a&gt; and to ask all relevant questions in our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://groups.google.com/group/chromium-extensions&quot;&gt;discussion group&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span&gt;Posted by Lei Zheng, Software Engineer&lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2471378914199150966-60429925527553941?l=blog.chromium.org&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Ian Fette</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/46ad41a02ddc719b</guid>
         <pubDate>Mon, 23 Nov 2009 11:32:00 -0800</pubDate>
      </item>
      <item>
         <title>Node.js is genuinely exciting</title>
         <link>http://simonwillison.net/2009/Nov/23/node/</link>
         <description>&lt;p&gt;I agree. I played with it for a couple days and now I can’t shut up about it. That’s basically all I talked about at &lt;strong&gt;Ruby&lt;/strong&gt;Conf :)&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tomayko.com/linkings/51eb5401e2eaf6cf8cd3ac08883936ea&quot;&gt;#&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tomayko.com/linkings/51eb5401e2eaf6cf8cd3ac08883936ea#comments&quot;&gt;Discuss&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
         <author>simonwillison.net</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/adde3f3dddc4958c</guid>
         <pubDate>Mon, 23 Nov 2009 14:58:36 -0800</pubDate>
      </item>
      <item>
         <title>Can I talk to that William fellow? He was so helpful</title>
         <link>http://blogs.msdn.com/oldnewthing/archive/2009/11/23/9927055.aspx</link>
         <author>oldnewthing</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b28574d4d7198720</guid>
         <pubDate>Mon, 23 Nov 2009 07:00:00 -0800</pubDate>
      </item>
      <item>
         <title>&lt;br&gt;&lt;br&gt;In case you are wondering how Apple’s quaint digital *Animal</title>
         <link>http://technically.us/code/archive/2009/11#item-6542</link>
         <description>&lt;p&gt;In case you are wondering how Apple’s quaint digital &lt;em&gt;Animal Farm&lt;/em&gt; will inevitably advance, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.businessweek.com/technology/content/nov2009/tc20091120_354597_page_2.htm&quot;&gt;Phil &lt;strong&gt;Schiller&lt;/strong&gt; hints of the company sharing their absolute power over Cocoa Touch devices with various salivating governments&lt;/a&gt;: “We’ve had a lot of eyes on us. We’ve had inquiries from governments and political leaders asking us what we were doing to protect children from inappropriate content.” It warms the heart.&lt;/p&gt;</description>
         <author>n8han</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/ebf80f1720b15224</guid>
         <pubDate>Mon, 23 Nov 2009 09:15:00 -0800</pubDate>
      </item>
      <item>
         <title>the left fold: 2009-11-23</title>
         <link>http://feedproxy.google.com/~r/foldl/~3/j3WhGklJUTY/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b7bdfc14384edb68</guid>
         <pubDate>Sun, 22 Nov 2009 23:02:20 -0800</pubDate>
      </item>
      <item>
         <title>Monster UA string</title>
         <link>http://neugierig.org/software/chromium/notes/2009/11/monster-ua-string.html</link>
         <description>&lt;p&gt;Since we're a minority browser, many sites don't support us. This is fine when it's our bug, but sometimes a site is wrong to block us. Our rule is that we put some effort into contacting sites to get them to fix the problem, but in emergencies or where they're unwilling/able, we spoof.&lt;/p&gt;&lt;p&gt;Yahoo mail has three modes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It just works. As seen on majority browsers.&lt;/li&gt;&lt;li&gt;It gives you a &quot;your browser doesn't work&quot; page with the option to try anyway. This is what it does for Windows Chrome. From my perspective this is the proper behavior until they feel like supporting Chrome, and I appreciate that many people lack the resources to support all browsers so I'm not too upset if it stays like this.&lt;/li&gt;&lt;li&gt;Or it just decides that it can't work. This is what it does for Linux Chrome.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You might ask, how are Windows and Linux Chrome different? And the answer is &quot;they aren't&quot;, except for the UA string. (And that we antialias fonts.) So I &quot;fixed&quot; it with a UA string tweak that I find hilarious.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Mozilla/5.0 (Windows; U; &lt;em&gt;Windows Linux&lt;/em&gt; x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.250.0 Safari/532.5&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I imagine their regex must match &quot;Windows &amp;#92;S+&quot; or something to allow NT, XP, etc.&lt;/p&gt;&lt;p&gt;Arv notes that we're now claiming that we are all of:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mozilla&lt;/li&gt;&lt;li&gt;WebKit&lt;/li&gt;&lt;li&gt;HTML&lt;/li&gt;&lt;li&gt;Gecko&lt;/li&gt;&lt;li&gt;Safari&lt;/li&gt;&lt;li&gt;Windows&lt;/li&gt;&lt;li&gt;&lt;em&gt;and&lt;/em&gt; Linux&lt;/li&gt;&lt;/ul&gt;</description>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/71e72a1f5b65693a</guid>
         <pubDate>Sat, 21 Nov 2009 16:19:00 -0800</pubDate>
      </item>
      <item>
         <title>ACM censors linking!</title>
         <link>http://realtimecollisiondetection.net/blog/?p=101</link>
         <description>&lt;p&gt;OK, WTF, this got me so annoyed that I had to get out of blog posting dormancy. I just went to Ke-Sen Huang’s &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kesen.huang.googlepages.com/&quot;&gt;brilliant page&lt;/a&gt; of conference papers on the web. Except, this time, all ACM pages (such as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kesen.huang.googlepages.com/sig2009.html&quot;&gt;SIGGRAPH 2009&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kesen.huang.googlepages.com/i3d2009Papers.htm&quot;&gt;I3D 2009&lt;/a&gt;, etc) have been taken down, with the comment “This page has been removed at the request of the ACM Publications Board.”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What the fuck!?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ACM has no rights to &lt;strike&gt;request&lt;/strike&gt; require(*) someone to remove links to pages on the net, and it’s unfortunate that their request was complied with.&lt;/p&gt;
&lt;p&gt;According to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.acm.org/publications/panel?pageIndex=4&quot;&gt;this page&lt;/a&gt; the ACM Publications Board is run by the following nasty little censoring asses:&lt;/p&gt;
&lt;p&gt;Ronald F Boisvert (chair) - boisvert@acm.org&lt;br&gt;
Holly E Rushmeier (co-chair) - holly@acm.org&lt;br&gt;
Tamer M. Ozsu (vice-chair) - ozsu@acm.org&lt;/p&gt;
&lt;p&gt;I strongly urge you to email them, with a cc to the ACM president &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.acm.org/about/bios&quot;&gt;Wendy Hall&lt;/a&gt; (wh@ecs.soton.ac.uk), to tell them what you really feel about ACM practicing censorship on Ke-Sen Huang’s pages (or anywhere)!&lt;/p&gt;
&lt;p&gt;And if you have anything to do with ACM and SIGGRAPH, as people in the games industry tend to do, then I implore you to immediately stop your involvement and furthermore that you boycott their conferences (SIGGRAPH in particular) until they straighten their shit out.&lt;/p&gt;
&lt;p&gt;Do not let their censoring of free information stand!&lt;/p&gt;
&lt;p&gt;(*) Changed the wording here, because some dip-shit on Reddit can’t understand the message otherwise.&lt;/p&gt;
&lt;h3&gt;Update 11/23/09 16:04&lt;/h3&gt;
&lt;p&gt;The latest news is that, while Ke-Sen’s pages have not yet been restored, ACM has rescinded their censoring (through bogus copyright claims) as per the following email:&lt;br&gt;
&lt;tt&gt;&lt;br&gt;
From: Pat Ryan &lt;br&gt;
Date: 2009/11/24&lt;br&gt;
Subject: Web pages with SIGGRAPH Proceedings&lt;br&gt;
To: “kesen.huang@gmail.com” &lt;br&gt;
Cc: “boisvert@acm.org” , “Rushmeier, Holly” , Bernard Rous , “M. Tamer Özsu” , John White , Prof Wendy Hall &lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Dear Ke-Sen,&lt;/p&gt;
&lt;p&gt; As you are aware, the computer graphics community has expressed dismay and concern about the removal of your web pages. ACM wants to make it possible for you to continue this service that the community clearly values very highly. By this message ACM grants permission for you to repost the pages, with the addition of links to the authoritative versions of the papers in the ACM Digital Library. The author’s home page links may also be included, but should not be links directly to the author’s version of the paper. Please post on the site that the information is being provided with the permission of the ACM. This is the solution you proposed earlier, and it is clear from the community’s comments that it is the right thing to do.&lt;/p&gt;
&lt;p&gt;As you know, the concern about your pages was ACM copyright policy with regard to links. As a result of the community discussion, ACM will institute a formal review of this portion of its copyright policy.&lt;/p&gt;
&lt;p&gt;Please contact us with any concerns or questions.&lt;/p&gt;
&lt;p&gt;Sincerely,&lt;/p&gt;
&lt;p&gt;Patricia Ryan&lt;br&gt;
ACM Chief Operating Officer&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;They are still implying Ke-Sen’s pages were infringing on ACM copyright, which is still a legally suspect claim as (1) Ke-Sen’s pages are first and foremost factual listings which are not subjected to copyright infringements, (2) as Ke-Sen’s pages were sufficiently different from ACM’s so as not to be a derivative copy, and (3) even if they were outright copies of ACM’s table of contents, “fair use” of TOCs have apparently not been tested in a court of law, so ACM has no legal leg to stand on in this issue (and in fact, a ruling against all libraries in the US seems logistically implausible):&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://findarticles.com/p/articles/mi_m0FWE/is_6_8/ai_n6080446/&quot;&gt;http://findarticles.com/p/articles/mi_m0FWE/is_6_8/ai_n6080446/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It will be interesting to see how this truly plays out over the next several weeks, but it seems a battle has been won, though the war is likely to continue for quite some time.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who read my post and voiced your concern to the ACM Publication Board. An organization &lt;b&gt;is&lt;/b&gt; its members, and there is no stronger means of controlling an organization than through the vote of your voice and your purse!&lt;br&gt;
&lt;strong&gt;Similar Posts:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://realtimecollisiondetection.net/blog/?p=75&quot; title=&quot;August 10, 2008&quot;&gt;SIGGRAPH and books&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://realtimecollisiondetection.net/blog/?p=92&quot; title=&quot;May 24, 2009&quot;&gt;Catching up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://realtimecollisiondetection.net/blog/?p=94&quot; title=&quot;August 29, 2009&quot;&gt;CEDEC 2008 (2009?) archives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://realtimecollisiondetection.net/blog/?p=50&quot; title=&quot;March 27, 2008&quot;&gt;Programmers wanted!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://realtimecollisiondetection.net/books/list/&quot;&gt;My recommended books&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;</description>
         <author>christer</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/16176daf90d8db93</guid>
         <pubDate>Sat, 21 Nov 2009 12:32:06 -0800</pubDate>
      </item>
      <item>
         <title>Living in a browser</title>
         <link>http://diveintomark.org/archives/2009/11/21/living-in-a-browser</link>
         <description>&lt;p&gt;(Googler hat off)&lt;/p&gt; &lt;p&gt;I just spent an hour in Starbucks. (My kid is down the street at a Chinese class.) In the past hour, I’ve checked my email, read news, caught up on the HTML5 mailing lists and IRC chatter, paid two bills, balanced my checkbook, and written this post. Without leaving my browser.&lt;/p&gt; &lt;p&gt;So yeah, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html&quot;&gt;Google Chrome OS&lt;/a&gt; is gonna be a hit.&lt;/p&gt; &lt;p&gt;&lt;del&gt;Bummer about the whole “only runs apps &lt;a rel=&quot;nofollow&quot; title=&quot;If you don't own the master (key), the master owns you&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/search?&amp;amp;ie=UTF-8&amp;amp;q=%22if+you+don't+own+the+master%22+lyrics&quot;&gt;signed by a private key&lt;/a&gt; that Google won’t be sharing with anyone” thing. I’m not thrilled about the prospect of working for a DRM company. Google was in the DRM business once before; it ended with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlewatch.eweek.com/content/google_video/google_admits_to_fixes_video_refund_gaffe.html&quot;&gt;giving everyone their money back, twice&lt;/a&gt;. And does anyone honestly believe the first Chrome OS machine won’t be jailbroken within a week?&lt;/del&gt; Update: I’m getting conflicting reports about whether retail (non-developer) Chrome OS hardware will include a way to run unverified software. I’m locking this discussion thread until I can confirm this important detail.&lt;/p&gt; &lt;p&gt;On the other hand, computer maintenance sucks gargantuan donkey balls, and normal people don’t care about root. If you accost a random person on the street and ask them if they need root on their operating system to install another browser, and they’ll have three questions for you: 1. What’s root? 2. What’s an operating system? 3. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlesystem.blogspot.com/2009/06/browser-is-search-engine.html&quot;&gt;What’s a browser&lt;/a&gt;?&lt;/p&gt; &lt;p&gt;Still… if I had root on a Linux netbook, the first thing I’d do is install Chromium and then spend 99% of my time in the browser. So I have to think that Chrome OS is a step in the right direction.&lt;/p&gt; &lt;p&gt;This is an open thread, but I won’t answer any questions on behalf of Google.&lt;/p&gt;</description>
         <author>Mark</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/477d78ad12490850</guid>
         <pubDate>Sat, 21 Nov 2009 08:36:16 -0800</pubDate>
      </item>
      <item>
         <title>Go, going forward</title>
         <link>http://www.cowlark.com/2009-11-21-go-going-forward/index.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/3719e6fc22de2835</guid>
         <pubDate>Sat, 21 Nov 2009 08:51:02 -0800</pubDate>
      </item>
      <item>
         <title>Structured Exception Handling in Assembly Language</title>
         <link>http://www.rohitab.com/structured-exception-handling-in-assembly-language</link>
         <author>rohitab</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/333fbf75db2695cf</guid>
         <pubDate>Wed, 22 Sep 1999 21:12:35 -0700</pubDate>
      </item>
      <item>
         <title>The difference between assignment and attachment with ATL smart pointers</title>
         <link>http://blogs.msdn.com/oldnewthing/archive/2009/11/20/9925918.aspx</link>
         <author>oldnewthing</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/13977dd320477285</guid>
         <pubDate>Fri, 20 Nov 2009 07:00:00 -0800</pubDate>
      </item>
      <item>
         <title>The Whigs come to LA</title>
         <link>http://int64.org/2009/11/20/the-whigs-come-to-la</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://int64.org/wp-content/uploads/2009/11/whigssm.jpg&quot; alt=&quot;whigssm&quot; title=&quot;whigssm&quot; width=&quot;200&quot; height=&quot;204&quot;&gt;Just saw &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.thewhigs.com/&quot;&gt;The Whigs&lt;/a&gt; live at the Troubadour — what a kick-ass show! The owner of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.garagepizzala.com/&quot;&gt;my pizza place&lt;/a&gt; turned me on to these guys a year or so ago and I’ve been a big fan ever since.&lt;/p&gt;
&lt;p&gt;Opening for them was &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.myspace.com/thedeadtrees&quot;&gt;The Dead Trees&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.myspace.com/thefeatures&quot;&gt;The Features&lt;/a&gt;. I had heard of neither, but they both put on great sets of their own — I bought their CDs right after the show. &lt;img src=&quot;http://int64.org/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot;&gt; &lt;/p&gt;
&lt;p&gt;If you’ve never heard The Whigs before, they are giving out two songs from their upcoming CD “In The Dark” for free from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.thewhigs.com/freedownload/&quot;&gt;their website&lt;/a&gt;.&lt;/p&gt;</description>
         <author>Cory</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b409633b61d645a8</guid>
         <pubDate>Fri, 20 Nov 2009 00:28:17 -0800</pubDate>
      </item>
      <item>
         <title>Assorted notes</title>
         <link>http://psung.blogspot.com/2009/11/assorted-notes.html</link>
         <description>&lt;p&gt;Many random notes (some for my own reference), each of which is too short to warrant a full blog post:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Emacs&lt;/b&gt;&lt;/p&gt; &lt;p&gt;It had always bothered me, just a little, that &lt;tt&gt;C-v&lt;/tt&gt; and &lt;tt&gt;M-v&lt;/tt&gt;, in addition to scrolling, move the cursor to the bottom or top of the screen. This has the odd effect that &lt;tt&gt;C-v M-v&lt;/tt&gt; is not a no-op. Turns out that setting the variable &lt;tt&gt;scroll-preserve-screen-position&lt;/tt&gt; appropriately can fix this. (via &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2009-11/msg00288.html&quot;&gt;emacs-devel&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;b&gt;Chrome&lt;/b&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Have you ever wondered why running Firefox instances get broken when new versions are installed? On GNU/Linux systems the package manager, which runs as root, pays no mind to what non-root users are doing. Some apps, like Firefox, run into major trouble because they'll load additional files after startup that can't be mixed and matched with the previous versions (this isn't really a problem for programs that are essentially just one binary). Chrome acquires immunity to this with its &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/chromium/wiki/LinuxZygote&quot;&gt;Zygote mode&lt;/a&gt;, which basically means &lt;em&gt;do not load anything from disk after startup&lt;/em&gt;. A simple idea, but it takes some work to follow through with it. &lt;/li&gt; &lt;li&gt; Among visitors to this blog, Chrome is the second most popular browser, with a 9.5% share! Chrome leads IE (6.6%), Safari (5.9%), and Opera (4.3%), and trails only Firefox (72.6%). You can sort of see what a non-representative sample of web users happens across this blog. &lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;&lt;b&gt;Unix/Ubuntu&lt;/b&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://soundconverter.berlios.de/&quot;&gt;Soundconverter&lt;/a&gt; (&lt;tt&gt;aptitude install soundconverter&lt;/tt&gt;) is a handy GTK/GNOME program for converting (transcoding) audio between formats. It is easy to use, converts all the music metadata, and takes full advantage of multicore processors.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;When using &lt;tt&gt;find&lt;/tt&gt; with &lt;tt&gt;xargs&lt;/tt&gt;, &lt;tt&gt;xargs&lt;/tt&gt; will get tripped up by filenames with spaces (it will treat each space-delimited component as a different argument). You can get around this by changing the delimiter in both &lt;tt&gt;find&lt;/tt&gt; and &lt;tt&gt;xargs&lt;/tt&gt; to &lt;tt&gt;&amp;#92;0&lt;/tt&gt; instead of space, as follows:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;&lt;tt&gt;find . -iname '*.tmp' &lt;b&gt;-print0&lt;/b&gt; | xargs &lt;b&gt;-0&lt;/b&gt; rm&lt;/tt&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can usually achieve the same effect with &lt;tt&gt;find ... -exec&lt;/tt&gt; but I can never remember how to use it.&lt;/p&gt; &lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;&lt;b&gt;HTML, HTML5&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Some things I picked up while working on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://web.psung.name/zeya&quot;&gt;Zeya&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.webreference.com/programming/css_frames/index.html&quot;&gt; Making a frame-like layout with CSS&lt;/a&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox&quot;&gt;HTML5 audio/video APIs as implemented in Firefox&lt;/a&gt;. The audio/video APIs provide nearly all the features you'd need for a music player. Just add chrome!&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://diveintohtml5.org/detect.html&quot;&gt;Detecting HTML5 features (from Dive Into HTML5)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;One cool feature in HTML5 that you may not have heard of (because it's not quite as earth-shattering as video, canvas, or local storage) is &quot;placeholder text&quot; for text boxes.&lt;/p&gt; &lt;p&gt;&lt;img style=&quot;height:30px;width:268px;&quot; src=&quot;http://c.wearehugh.com/dih5/location-bar-empty-unfocused.png&quot;&gt;&lt;/p&gt; &lt;p&gt;(The text goes away when you focus the input and/or type something in it.)&lt;/p&gt; &lt;p&gt;It's a feature that (I assume, at least) people have been using Javascript hacks to implement for a long time.&lt;/p&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/970055329001593038-2616451884633712696?l=psung.blogspot.com%2Findex.html&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Phil</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/579aa3ce54b191c0</guid>
         <pubDate>Thu, 19 Nov 2009 23:29:00 -0800</pubDate>
      </item>
      <item>
         <title>ReCode / Warnings in Boost</title>
         <link>http://www.revergestudios.com/reblog/index.php?n=ReCode.WarningsInBoost</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/05905acc45ff0512</guid>
         <pubDate>Thu, 19 Nov 2009 18:58:53 -0800</pubDate>
      </item>
      <item>
         <title>The Traveling Salesman Problem and Javascript Compression</title>
         <link>http://feedproxy.google.com/~r/blogspot/timepedia/~3/CwA30T0sU1U/traveling-salesman-problem-and.html</link>
         <description>In my last post, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://timepedia.blogspot.com/2009/08/on-reducing-size-of-compressed.html&quot;&gt;On Reducing the Size of Compressed Javascript&lt;/a&gt;, I covered a technique I had been researching on re-ordering Javascript code to enhance the efficiency of the gzip/deflate compressors. The basic approach is to come up with some way of measuring the distance between two functions, and then trying to group functions together by shortest distance.&lt;br&gt;&lt;br&gt;A key question is, what's a good metric? I knew that the ideal metric would take into account how the LZ77 algorithm works, but for expediency, I went with a reasonable and well known string distance: the levenshtein distance.&lt;br&gt;&lt;h2&gt;GZip vs 7-zip&lt;/h2&gt;&lt;br&gt;Another finding from my previous experiments was that 7-zip sports a much superior deflate implementation, it can compress a given input using the same algorithm as gzip with non-trivial size improvements. The problem is, 7-zip is implemented in C++, and I wanted to write a GWT Linker to automatically produce super-compressed Javascript.&lt;br&gt;&lt;br&gt;In digging around for a Java 7-zip deflate implementation, I ran into this paper on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.paul.sladen.org/projects/http://www.paul.sladen.org/projects/compression/&quot;&gt;Paul Sladen's page.&lt;/a&gt; titled: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cis.poly.edu/tr/tr-cis-2004-02.pdf&quot;&gt;Compressing File Collections with a TSP-Based Approach&lt;/a&gt;. This paper published in 2004 details a similar technique of enhancing TAR compression of a collection of files by re-ordering the TAR to maximize compression. More on that later, but the paper itself has an obscure reference to something called the &lt;span style=&quot;font-weight:bold;&quot;&gt;LZ Distance&lt;/span&gt; metric. Tracking down that paper &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.348&quot;&gt;&quot;G. Cormode, M. Paterson, S. Sahinalp, and U. Vishkin. Communication complexity of doc- ument exchange. In Proc. of the ACM–SIAM Symp. on Discrete Algorithms, January 2000.&quot;&lt;/a&gt; leads us to the definition of LZ Distance.&lt;br&gt;&lt;h2&gt;LZ Distance&lt;/h2&gt;&lt;br&gt;The LZ Distance between two strings &lt;tt&gt;x&lt;/tt&gt; and &lt;tt&gt;y&lt;/tt&gt; denoted by &lt;tt&gt;LZDIST(x,y)&lt;/tt&gt; is as follows:&lt;br&gt;&lt;blockquote&gt;The minimum number of single characters or substrings of &lt;tt&gt;y&lt;/tt&gt; or of the partially built string, which are required to build &lt;tt&gt;x&lt;/tt&gt; from left to right.&lt;/blockquote&gt;&lt;br&gt;As an example, consider &lt;tt&gt;x=aabcdefgabc&lt;/tt&gt; and &lt;tt&gt;y=aaaaaaaaaaaaaaaa&lt;/tt&gt;. We try to parse x in terms of y, and keep a running partially built string called 'p'. Here are the steps:&lt;br&gt;&lt;ol&gt;&lt;br&gt;&lt;li&gt; Prefix 'aa' of x is contained in y, so p = (aa), x = bcdefgabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p, so just add 'b' p = (aa)(b), x = cdefgabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p ,so just add 'c', p = (aa)(b)(c), x = defgabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p ,so just add 'd', p = (aa)(b)(c)(d), x = efgabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p ,so just add 'e', p = (aa)(b)(c)(d)(e), x = fgabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p ,so just add 'f', p = (aa)(b)(c)(d)(e)(f), x = gabc&lt;br&gt;&lt;li&gt; No prefix of x found in y or p ,so just add 'g', p = (aa)(b)(c)(d)(e)(f)(g), x = abc&lt;br&gt;&lt;li&gt; 'abc' is found at index '1' in p, so p = (aa)(b)(c)(d)(e)(f)(g)(abc)&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;Here, the LZDIST(x,y) = 8. But what of LZDIST(y, x)?&lt;br&gt;&lt;ol&gt;&lt;br&gt;&lt;li&gt; Prefix 'aa' of y is contained in x, so p = (aa), y = aaaaaaaaaaaaaa&lt;br&gt;&lt;li&gt; Prefix 'aa' of y is contained in x, so p = (aa)(aa), y = aaaaaaaaaaaa&lt;br&gt;&lt;li&gt; Prefix 'aaaa' of y is contained in p, p = (aa)((aa)(aaaa) y = aaaaaaaa&lt;br&gt;&lt;li&gt; Prefix 'aaaaaaaa' of y is contained in p, so p = (aa)(aa)(aaaa)(aaaaaaaa)&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;LZDIST(y,x) = 4. Interesting, but what does this buy us?&lt;br&gt;&lt;h2&gt;LZDIST and GZIP&lt;/h2&gt;&lt;br&gt;Recall that GZIP's deflate encoder uses an algorithm called LZ77 which looks at the current input tokens, and searches backwards for previous substrings that match the current input string, replacing them with back references. What LZDIST(x,y) gives us, is a measure of how many back references for X can be found in Y, that is, how X can be compressed by references to substrings in Y or in partially built decompression outputs.&lt;br&gt;&lt;br&gt;Now you can see why this might help improve code re-ordering. If we can order Javascript functions in order to maximize back-references, we might be able to squeeze a little more out of gzip.&lt;br&gt;&lt;h2&gt;Clustering with LZDIST&lt;/h2&gt;&lt;br&gt;Remember the earlier paper's title had the acronym TSP? This paper discusses how re-ordering can be viewed as an optimal tour on a graph which means that solving it is as hard as the Traveling Salesman Problem - NP-Complete. Uh oh, that sounds like trouble, but that's only NP Complete for the optimal solution. A good estimate on the true solution might also produce good results, and this paper shows that a greedy tour heuristic produces up to a 10% benefit in compression.&lt;br&gt;&lt;br&gt;For expediency reasons, I decided not to implement a TSP model at this point, but went with simple pair-based greedy approach detailed in my previous blog post, substituting LZDIST for Levenshtein Distance. I also implemented an LZ-like greedy algorithm where I keep a running string which is the concatenation of all of the functions which have been added to the output, and use LZDIST to find the next closest function to append within a 32k window. This mimics how a gzip compressor might see the input. &lt;br&gt;&lt;h2&gt;Results for GWT Showcase Application&lt;/h2&gt;&lt;br&gt;&lt;table border=&quot;1&quot;&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;Technique&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th&gt;Ratio&lt;/th&gt;&lt;th&gt;Relative Improvement (vs previous row)&lt;/th&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;No Compression&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;196778&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;100%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;gzip -9&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;64401&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;32.7%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;32.7%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;7zip&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;61500&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;31.5%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4.6%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;gzip -9 + levensthein&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;61409&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;31.2%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4.7%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;7zip + levenshtein&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;58536&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;29.7%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4.7%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;7zip + lzdist&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;57923&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;29.4%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1.1%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;tr&gt;&lt;th&gt;LZMA&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;51423&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;26.1%&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;11.3%&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;/td&gt;&lt;/table&gt;&lt;br&gt;Looking at relative compression, levenshtein vs lzdist, the difference 57923/58536 = 1.1% which seems worthwhile to me. In a large script, this can save 1-2 kilobytes. I threw in LZMA which boasts 12% better compression in this instance than DEFLATE. &lt;br&gt;&lt;h2&gt;Notes on implementation&lt;/h2&gt;&lt;br&gt;The LZDIST function is expensive to compute in a naive fashion. It is similar to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Longest_common_substring&quot;&gt;longest common substring problem&lt;/a&gt;. The brute force version can be on the order of O(n^3), while a dynamic programming version can run in O(n^2). To make this run efficiently and not irritate your users, you need to use a Generalized Suffix Tree approach. Compressors like 7-zip are already using Suffix trees to implement the LZ77 search algorithm, so those of you looking for hints to do an efficient implementation should take a look at the LZMA SDK (both C++ and Java versions are available)&lt;br&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br&gt;Utilizing clustering compression techniques, LZ distance, and 7-zip, it is possible to reduce the GWT Showcase application from 64401 bytes to 57923 bytes, a savings of about 10.1%.&lt;br&gt;&lt;br&gt;-Ray&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2515037436118935802-6236516474721179439?l=timepedia.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?a=CwA30T0sU1U:FQA8Q1KQbSs:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?a=CwA30T0sU1U:FQA8Q1KQbSs:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?a=CwA30T0sU1U:FQA8Q1KQbSs:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?i=CwA30T0sU1U:FQA8Q1KQbSs:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?a=CwA30T0sU1U:FQA8Q1KQbSs:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?a=CwA30T0sU1U:FQA8Q1KQbSs:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/timepedia?i=CwA30T0sU1U:FQA8Q1KQbSs:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/timepedia/~4/CwA30T0sU1U&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>Ray Cromwell</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/2c77d5531c4f5381</guid>
         <pubDate>Thu, 19 Nov 2009 16:39:00 -0800</pubDate>
      </item>
      <item>
         <title>links for 2009-11-19</title>
         <link>http://feedproxy.google.com/~r/tecosystems/~3/_ZoZq7K3F2o/</link>
         <description>&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.wolframalpha.com/2009/11/19/future-directions-of-wolframalpha/&quot;&gt;Wolfram|Alpha Blog : Future Directions of Wolfram|Alpha&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&quot;But do you know how often we release a new version of Wolfram|Alpha?&lt;br&gt;
It’s once a week. 23 times so far.&quot;&lt;/div&gt;
&lt;div&gt;(tags: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/wolframalpha&quot;&gt;wolframalpha&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/saas&quot;&gt;saas&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/updates&quot;&gt;updates&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/maintenance&quot;&gt;maintenance&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://delicious.com/sogrady/upgrades&quot;&gt;upgrades&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redmonk.com/sogrady/?p=3178&amp;amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot;&gt;Share This&lt;/a&gt;
&lt;/p&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=_ZoZq7K3F2o:JAaOlb5_YjA:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=_ZoZq7K3F2o:JAaOlb5_YjA:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=_ZoZq7K3F2o:JAaOlb5_YjA:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=_ZoZq7K3F2o:JAaOlb5_YjA:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=_ZoZq7K3F2o:JAaOlb5_YjA:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/_ZoZq7K3F2o&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>sogrady</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/08ed47abc3bb5f41</guid>
         <pubDate>Thu, 19 Nov 2009 17:03:41 -0800</pubDate>
      </item>
      <item>
         <title>ThreadFrac revised</title>
         <link>http://codesuppository.blogspot.com/2009/11/threadfrac-revised.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_PtTKwwh_xBc/SwXWLWze1uI/AAAAAAAAGuU/GEGEC-EVWaU/s1600/5731_263484590200_896320200_8359062_7807823_n.jpg&quot;&gt;&lt;img style=&quot;width:300px;height:400px;&quot; src=&quot;http://3.bp.blogspot.com/_PtTKwwh_xBc/SwXWLWze1uI/AAAAAAAAGuU/GEGEC-EVWaU/s400/5731_263484590200_896320200_8359062_7807823_n.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Grrr...I went to run my copy of 'ThreadFrac' that was uploaded in a couple of places and it wouldn't run due to side-by-side assembly issues or some such nonsense.&lt;br&gt;&lt;br&gt;I rebuilt it with an embedded manifest and it should run now.&lt;br&gt;&lt;br&gt;Let me know if you have a problem; requires Windows with DX9 to run.&lt;br&gt;&lt;br&gt;The reason I was looking for ThreadFrac is that I want to start messing with the new 3d equation called 'Mandelbulb'.&lt;br&gt;&lt;br&gt;I'm going to write a real-time multi-threaded raytracer and add it to my ThreadFrac program when I get a chance to work on.&lt;br&gt;&lt;br&gt;If you haven't seen the '&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.skytopia.com/project/fractal/mandelbulb.html&quot;&gt;Mandelbulb&lt;/a&gt;' yet, check it out.&lt;br&gt;&lt;br&gt;Here is the link to the revised executable for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://aarm.mywowbb.com/ThreadFrac.zip&quot;&gt;ThreadFrac.&lt;/a&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/23430315-2041039939703676846?l=codesuppository.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>John</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/13e7126c2f21c0e6</guid>
         <pubDate>Thu, 19 Nov 2009 15:34:00 -0800</pubDate>
      </item>
      <item>
         <title>What’s After Excel? Big Data and the Future of Spreadsheets</title>
         <link>http://feedproxy.google.com/~r/tecosystems/~3/Huwg08pMvvM/</link>
         <description>&lt;p&gt;For the better part of twenty years, Microsoft Excel has been the most popular spreadsheet application on the planet. In a very real sense, it is &lt;em&gt;the&lt;/em&gt; driver of Office revenues, because while office workers will use alternatives to Powerpoint and Word, you can pry Excel from their cold, dead fingers. &lt;/p&gt;
&lt;p&gt;So how do you replace it? &lt;/p&gt;
&lt;p&gt;You don’t. Many have tried. All have failed. Excel has, at least as measured by marketshare, been chewing up and spitting out competing products for well over a decade. &lt;/p&gt;
&lt;p&gt;The best strategy in competing with Office generally, as evidenced by the success of Google Docs, is to reframe the debate. To compete where Office does not. As Sun Tzu tells us, “You can be sure of succeeding in your attacks if you only attack places which are undefended.”&lt;/p&gt;
&lt;p&gt;But what territory, precisely, has Excel left undefended? It’s the gold standard for analysts the world over, and it’s actually somewhat frightening how many businesses are run purely on top of it. Excel isn’t online yet, but it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Office_Web_Apps&quot;&gt;will be&lt;/a&gt; and even if it doesn’t get there, Google Docs did. So that’s out. Leaving what?&lt;/p&gt;
&lt;p&gt;How about big data?&lt;/p&gt;
&lt;p&gt;Excel has been used on big data for years, it’s true. But not &lt;i&gt;directly&lt;/i&gt; on big data. With a row limit of around 65,000 [&lt;b&gt;Update&lt;/b&gt;: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cullina.com/&quot;&gt;Mike Cullina&lt;/a&gt; writes in to say the 65K limit was eliminated in the last release, 2007 - the new limit is 1M plus], it certainly can’t be used as a direct window into data warehouses or marts. So instead analysts use it to front end views or other subsets of the original dataset. Which, by the way, has probably been heavily cleansed and normalized. &lt;/p&gt;
&lt;p&gt;Want to ask questions of the entire dataset? Or of datasets, pluarl? Terrific. Learn SQL, find and be very nice to a DBA, and beg for the access you need. Also, be prepared to wait days or even weeks for your answer. Working on big data is hard, remember. &lt;/p&gt;
&lt;p&gt;Unless you have a new back end, one designed to reduce complicated questions into a set of tasks that can be individually executed on multiple machines. A back end like Hadoop. &lt;/p&gt;
&lt;p&gt;The good news about Hadoop, you’ve already heard: it’s very, very good at carving up large workloads when you can supply it with adequate hardware. The bad news, however, is that the front ends for the tool are, to put it charitably, a bit behind. See this slide from Kevin Weil’s &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/kevinweil/hadoop-pig-and-twitter-nosql-east-2009&quot;&gt;presentation at NoSQL East&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.flickr.com/photos/sog/4118402994/&quot; title=&quot;pig by sogrady, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2684/4118402994_7438bf0e6f_o.png&quot; width=&quot;514&quot; height=&quot;474&quot; alt=&quot;pig&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And that’s the &lt;i&gt;simple&lt;/i&gt; interface. Anybody who knows SQL is in good shape, but I think it’s safe to say Hadoop is just a tad less accessible to analyst-types than Excel. &lt;/p&gt;
&lt;p&gt;Which is where IBM’s Big Sheets comes in. Called M2 at the time of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/cloudera/hw09-enabling-ad-hoc-analytics-at-web-scale&quot;&gt;Rod Smith’s presentation&lt;/a&gt; from HadoopWorld, you can think of it as a spreadsheet-like front end (with elements of DabbleDB, ManyEyes, and others) for Hadoop datasets. &lt;/p&gt;
&lt;div style=&quot;width:425px;text-align:left;&quot;&gt;&lt;a rel=&quot;nofollow&quot; style=&quot;font:14px Helvetica, Arial, Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/cloudera/hw09-enabling-ad-hoc-analytics-at-web-scale&quot; title=&quot;Hw09 Enabling Ad Hoc Analytics At Web Scale&quot;&gt;Hw09 Enabling Ad Hoc Analytics At Web Scale&lt;/a&gt;
&lt;div style=&quot;font-size:11px;font-family:tahoma, arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a rel=&quot;nofollow&quot; style=&quot;text-decoration:underline;&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a rel=&quot;nofollow&quot; style=&quot;text-decoration:underline;&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/cloudera&quot;&gt;Cloudera, Inc.&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you can’t see the promise in the slides, just wait for the video from HadoopWorld. Or just trust me: Big Sheets is the real deal, and the shape of things to come. Maybe it’ll be Big Sheets, maybe something totally different: the concept is real.&lt;/p&gt;
&lt;p&gt;Should Microsoft be worried? Not in the short term. Excel is near perfectly adapted to its environment, and is in no danger of being replaced by an alternative, whether that’s Big Sheets, Google Docs or OpenOffice.org Spreadsheets. But environments are not static; they have a way of changing, and it certainly appears that we’re in the midst of a change now. &lt;/p&gt;
&lt;p&gt;Data hypergrowth has pretty much become a cliche at this point: how many times can you hear “we’re going to produce more data in the next [small time period] that we have in human history” before you stop hearing it? Less apparent, however, has been the impact on individual analysis. Take the Twitter &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://infochimps.org/datasets/twitter-census-::-conversation-metrics-one-year-of-urls-hashtags&quot;&gt;datasets&lt;/a&gt; recently released by the Infochimps guys: the &lt;i&gt;monthly&lt;/i&gt; base tab separated values spreadsheet is 1.7 GB. The hourly version, it can be assumed, is a bit larger. &lt;/p&gt;
&lt;p&gt;Point being: a lot of us are going to be working with large datasets soon, if we’re not already. And while the current toolset of choice – Excel – has its strengths, that doesn’t happy to be one of them. So either it gets there, or someone goes &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Island_hopping&quot;&gt;island hopping&lt;/a&gt; beyond the most popular spreadsheet product in history and defines the user interface and experience for Big Data. &lt;/p&gt;
&lt;p&gt;Adapt or die, as they say. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Disclosure&lt;/b&gt;: Both IBM and Microsoft are RedMonk clients; Google is not. &lt;/p&gt;
&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redmonk.com/sogrady/?p=3174&amp;amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot;&gt;Share This&lt;/a&gt;
&lt;/p&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=Huwg08pMvvM:xJ-wfZsBu8M:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=Huwg08pMvvM:xJ-wfZsBu8M:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=Huwg08pMvvM:xJ-wfZsBu8M:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=Huwg08pMvvM:xJ-wfZsBu8M:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=Huwg08pMvvM:xJ-wfZsBu8M:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/Huwg08pMvvM&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>sogrady</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/5aff122585641651</guid>
         <pubDate>Thu, 19 Nov 2009 14:24:52 -0800</pubDate>
      </item>
      <item>
         <title>S.O.S. Band – No One’s Gonna Love You (loop)</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/yOLjwLNgK94/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://267bbb15.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://e5f7a958.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/332f25c6e7a608b4</guid>
         <pubDate>Sun, 22 Nov 2009 23:00:57 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/22/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/TiepyXj1aOw/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Boo Yaa Tribe ft. Layzie Bone – Mafia Lyfestyle (instrumental)&lt;br&gt;
Da Nayborhoods – How We Do It (instrumental)&lt;br&gt;
Da Youngstas – Verbal Glock (instrumental)&lt;br&gt;
Dru Hill – 5 Steps (instrumental)&lt;br&gt;
Lionel Richie – All Night Long (instrumental)&lt;br&gt;
Lo-Key – I Got A Thang 4 Ya! (Wangs &amp;amp; Thangs 4 Ya Remix instrumental)&lt;br&gt;
Michel’le – Keep Watchin’ (instrumental)&lt;br&gt;
Poor Righteous Teachers – Dreadful Day (instrumental)&lt;br&gt;
Shabba Ranks – Mr. Loverman (Raggamental Mix instrumental)&lt;br&gt;
Tasha Holiday – Just The Way You Like It (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://5350e034.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cbebc533.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7381f58deba5020f</guid>
         <pubDate>Sat, 21 Nov 2009 23:00:42 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/21/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/rxDFNt8o_Sk/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Ahmad – Who Can (remix instrumental)&lt;br&gt;
Boyz II Men – On Bended Knee (instrumental)&lt;br&gt;
Celly Cel ft. E-40 – D-Boyz (instrumental)&lt;br&gt;
Kurupt &amp;amp; Snoop Dogg – Story To Tell (instrumental)&lt;br&gt;
Mary J. Blige – I’m Going Down (remix instrumental)&lt;br&gt;
Master P – Pockets Gone Stay Fat (instrumental)&lt;br&gt;
PM Dawn – I’d Die Without You (remix instrumental)&lt;br&gt;
Run DMC – Run’s House (instrumental)&lt;br&gt;
Shyheim – Shaolin Style (instrumental)&lt;br&gt;
Smokey ft. Juelz Santana – Swimming In My Money (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3fa1cbe6.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://12410200.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e04cdfb1e3c75133</guid>
         <pubDate>Fri, 20 Nov 2009 23:00:25 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/20/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/qf3fHIzlrRc/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
187 Fac – 2 Geez (instrumental)&lt;br&gt;
702 - Where My Girls At (instrumental)&lt;br&gt;
III Frum Tha Soul – What Cha Missin’ (instrumental)&lt;br&gt;
Keke Wyatt – Put Your Hands On Me (instrumental)&lt;br&gt;
New Edition – Cool It Now (dub version)&lt;br&gt;
Public Enemy - Rebel Without A Pause (instrumental)&lt;br&gt;
Tevin Campbell – I’m Ready (instrumental)&lt;br&gt;
Three 6 Mafia ft. Tiesto, Sean Kingston, Flo Rida – Feel It (instrumental)&lt;br&gt;
Warren G – We Brings Heat (instrumental)&lt;br&gt;
Wyclef ft. Mavado – Hold On (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://c22c6a02.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2eaa5e5e.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/78fd3d07d6298a53</guid>
         <pubDate>Thu, 19 Nov 2009 23:00:12 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/19/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/17DKaawcSkg/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Bushwick Bill – Who’s The Biggest (instrumental)&lt;br&gt;
Gangsta Boo – Can I Get Paid (Get Your Broke Ass Out) (instrumental)&lt;br&gt;
Jagged Edge – Gotta Be (instrumental)&lt;br&gt;
Mac Dre – Feelin Myself (instrumental)&lt;br&gt;
Mary J. Blige – You Don’t Have To Worry (instrumental)&lt;br&gt;
New Edition – Hit Me Off (instrumental)&lt;br&gt;
Scarface – A Minute To Pray And A Second To Die (instrumental)&lt;br&gt;
Shiro ft. Lord Tariq – Good Love (instrumental)&lt;br&gt;
The Tony Rich Project – Nobody Knows (album instrumental)&lt;br&gt;
Warren G ft. Ron Isley – Smokin Me Out (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1c0f2038.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://95b55529.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; - RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f04de401ec9cbc32</guid>
         <pubDate>Wed, 18 Nov 2009 23:00:38 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/18/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/X5Xssc8vvvs/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;
&lt;p&gt;Brandy ft. Mase – Top Of The World (instrumental)&lt;br&gt;
&lt;span style=&quot;text-decoration:line-through;&quot;&gt;Immature – Feel The Funk (instrumental)&lt;/span&gt; &amp;lt;–oops, repost (7/22/09)&lt;br&gt;
Jyshoun ft. Gucci Mane – Keep Me High (instrumental)&lt;br&gt;
Kausion – Land Of The Skanless (instrumental)&lt;br&gt;
Kida ft. Busta Rhymes, Little Brother, Kurupt, Crooked I, Talib Kweli, Jay Rock, Willie B – Holla Remix (instrumental)&lt;br&gt;
Lloyd ft. Bun B – Like Me Remix (instrumental)&lt;br&gt;
Lloyd ft. J. Holiday, Nicki Minaj – Take It Off (instrumental)&lt;br&gt;
Mary J. Blige – I Am (instrumental)&lt;br&gt;
Rihanna ft. Young Jeezy – Hard (instrumental)&lt;br&gt;
Stat Quo – What I Like (Freaky Girl) (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1d6c91d2.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://efcd5a8b.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/95eabf037c8b42cd</guid>
         <pubDate>Tue, 17 Nov 2009 23:00:06 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/17/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/6JPZ-1x6Jbk/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
DJ Quik ft. Snoop Dogg, Nate Dogg, AMG, 2nd II None, Hi-C, El DeBarge – Medley For A V (The Pussy Medley) (instrumental)&lt;br&gt;
Icon The Group ft. Too Short – Butta Soft (instrumental)&lt;br&gt;
Jagged Edge – He Can’t Love U (instrumental)&lt;br&gt;
Janet Jackson – All For You (DJ Premier Remix instrumental)&lt;br&gt;
Janet Jackson – All For You (Instrumental)&lt;br&gt;
J-Shin – Baby Mama Drama (instrumental)&lt;br&gt;
Playa Fly – Club Friendly (instrumental)&lt;br&gt;
Skee-Lo – 308 Days (instrumental)&lt;br&gt;
Skee-Lo – How Did I Know (instrumental)&lt;br&gt;
Skee-Lo – Overdose (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://520f6bcf.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://b22134a9.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/740a279e5162d1c4</guid>
         <pubDate>Mon, 16 Nov 2009 23:00:08 -0800</pubDate>
      </item>
      <item>
         <title>Your Looks and Your Inbox</title>
         <link>http://blog.okcupid.com/index.php/2009/11/17/your-looks-and-online-dating/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;This week we will be confronting a fact that, by definition, haunts the average online dater: no matter how much time you spend polishing your profile, honing your IM banter, and perfecting your message introductions, it’s your picture that matters most.&lt;/p&gt;
&lt;p&gt;We’re going to look at how your photos affect both the messages you get and how successful your own outgoing messages are. We all know that beautiful people are more successful daters, but let’s quantify by exactly how much.&lt;/p&gt;
&lt;p&gt;To illustrate the exact spectrum of looks we’re talking about here, and to put some human faces on our discussion, I want to introduce a few photos of real OkCupid users. Here are two women near the top our range.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/roomtodance.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;
&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/ghostttt.jpg&quot;&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div style=&quot;text-align:center;padding:2px;padding-bottom:10px;&quot;&gt;[&lt;a rel=&quot;nofollow&quot;&gt;show men instead&lt;/a&gt;]&lt;/div&gt;
&lt;p&gt;And here are two rated in the middle.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/rds858.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/ElleSC.jpg&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div style=&quot;text-align:center;padding:2px;padding-bottom:10px;&quot;&gt;[&lt;a rel=&quot;nofollow&quot;&gt;show men instead&lt;/a&gt;]&lt;/div&gt;
&lt;p&gt;As for photos at the &lt;b&gt;bottom&lt;/b&gt; of the curve, it didn’t feel right to write someone and say “can I use you to illustrate the concept of ugliness on my blog?” so you’ll just have to extrapolate.&lt;/p&gt;
&lt;p&gt;The above featured users have graciously agreed to let me post their pictures, so please don’t make them regret it. Funnily enough, I had to write about a dozen beautiful female users before anyone would even get back to me. Life imitates blog!&lt;/p&gt;
&lt;p&gt;Anyhow, I know attractiveness is far from a universal concept, but maybe keep these folks in mind as we go through the data. &lt;/p&gt;
&lt;div&gt;. . .&lt;/div&gt;
&lt;p&gt;We’ll start with a simple line chart. The information I’ll present in this post is &lt;strong&gt;not normalized&lt;/strong&gt; because, as we’ll see, it’s interesting how men and women evaluate looks differently.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Male-Attractiveness-Ratings.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Our chart shows how men have rated women, on a scale from &lt;strong&gt;0&lt;/strong&gt; to &lt;strong&gt;5&lt;/strong&gt;. The curve is symmetric and surprisingly charitable: a woman is as likely to be considered extremely ugly as extremely beautiful, and the majority of women have been rated about “medium.” The chart &lt;i&gt;looks&lt;/i&gt; normalized, even though it’s just the unfiltered opinions of our male users.&lt;/p&gt;
&lt;p&gt;Given the popular wisdom that Hollywood, the Internet, and Photoshop have created unrealistic expectations of how a woman should look, I found the fairness and, well, realism, of this gray arc kind of heartening.&lt;/p&gt;
&lt;p&gt;Now let’s superimpose the distribution of actual messages guys have sent:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Male-Messaging-Curve.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;When it comes down to actually choosing targets, men choose the modelesque. Someone like &lt;strong&gt;roomtodance&lt;/strong&gt; &lt;span&gt;&lt;br&gt;
2/3 of male messages go to the top 1/3 of women.&lt;br&gt;
&lt;/span&gt;above gets nearly 5 times as many messages as a typical woman and 28 times as many messages as a woman at the low end of our curve. Site-wide, two-thirds of male messages go to the best-looking third of women. So basically, guys are fighting each other 2-for-1 for the absolute best-rated females, while plenty of potentially charming, even cute, girls go unwritten.&lt;/p&gt;
&lt;p&gt;The medical term for this is male pattern madness.&lt;/p&gt;
&lt;div&gt;. . .&lt;/div&gt;
&lt;p&gt;The female equivalent of the above chart shows a different bias: &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Female-Messaging-Curve.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see from the gray line, women rate an incredible 80% of guys as worse-looking than medium. Very harsh. On the other hand, when it comes to actual messaging, women shift their expectations only just slightly ahead of the curve, which is a healthier pattern than guys’ pursuing the all-but-unattainable. But with the basic ratings so out-of-whack, the two curves together suggest some strange possibilities for the female thought process, the most salient of which is that the average-looking woman has convinced herself that the vast majority of males aren’t good enough for her, but she then goes right out and messages them anyway.&lt;/p&gt;
&lt;p&gt;Just to illustrate that women are operating on a very different scale, here are just a few of the many, many guys we here in the office think are &lt;strong&gt;totally decent-looking&lt;/strong&gt;, but that women have rated, in their occult way, as &lt;i&gt;significantly&lt;/i&gt; less attractive than so-called “medium”:&lt;/p&gt;
&lt;table style=&quot;margin-bottom:10px;&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/chriscoyne.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/crudder.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/sammy.jpg&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/mkrohn.jpg&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Females of OkCupid, we site founders say to you: ouch! Paradoxically, it seems it’s women, not men, who have unrealistic standards for the “average” member of the opposite sex.&lt;/p&gt;
&lt;p&gt;Finally, I just want to combine the two charts to emphasize how much fuller the inboxes of good-looking people get. I have scaled this graph to show multiples of messages sent to the lowest-rated people. For instance, the most attractive guys get 11× the messages the lowest-rated do. The medium-rated get about 4×.
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Message-Multiple.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;
This graph also dramatically illustrates just how much more important a woman’s looks are than a guy’s.
&lt;/p&gt;
&lt;div&gt;. . .&lt;/div&gt;
&lt;p&gt;Now let’s take a look at how senders’ and recipients’ attractivenesses affect &lt;i&gt;reply rates&lt;/i&gt;, not just the number of messages sent.
&lt;/p&gt;
&lt;p&gt;As you’d expect, more attractive people get more replies. And since they themselves get so many more messages than everyone else, they write back much less frequently. Here’s the graph for female senders, plotted in evenly-spaced “attractiveness groups.”&lt;/p&gt;
&lt;p&gt;	&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Replies-Attractiveness-Female-Sender.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;And here’s the one for male senders.&lt;/p&gt;
&lt;p&gt;	&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Replies-Attractiveness-Male-Sender.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;One interesting thing seems to be going on here: when the best-looking men write the worst-looking women, &lt;span&gt;taste the rainbow,&lt;br&gt;of self-esteem issues &lt;/span&gt;their message success rate takes a &lt;b&gt;big&lt;/b&gt; hit. The knee-jerk response would be to somehow chalk it up to hunky spammers, but we very carefully control for that in these articles, and in any event why would better-looking girls be drastically more susceptible to it? It seems to be some kind of self-confidence thing.
&lt;/p&gt;
&lt;p&gt;As we did before, I’m going to consolidate the line charts to show just how your attractiveness changes how often your messages get responses.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.okcimg.com/blog/your_looks_and_inbox/Attractiveness-Reply-Rate.png&quot;&gt;&lt;/p&gt;
&lt;div&gt;. . .&lt;/div&gt;
&lt;p&gt;This post has been the preamble to the larger discussion of “what makes a good profile?” We’ve spent a lot of time on &lt;strong&gt;OkTrends&lt;/strong&gt; looking at messages, and since your profile is the other important place you express yourself, we thought it deserved the same treatment.
&lt;/p&gt;
&lt;p&gt;I wanted to address physical attractiveness right at the start, because obviously it’s a huge factor in how successful your profile is. In the upcoming posts in this series, we’re going to &lt;b&gt;control&lt;/b&gt; for attractiveness, so that we can deliver real and useful advice for all the non-models out there.&lt;/p&gt;
&lt;p&gt;We’ll look at, among other things: what makes a good picture (is it taken outside? inside? is it full-body? a head-shot? with your pet snake? what?), what kinds of self-presentation will get you the most messages (jokey? flirty? all business?), and how much profile information is too much. Should be good.
&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author>christian</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/10c6138fd7fc2702</guid>
         <pubDate>Mon, 16 Nov 2009 21:47:23 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/15/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/txsxarzIylo/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
50 Cent – Get It Hot (instrumental)&lt;br&gt;
Blackstreet – Joy (Quiet Storm instrumental)&lt;br&gt;
Case – Happily Ever After (remix instrumental)&lt;br&gt;
C-Bo ft. Killa Tay, Big Lurch, Roger Troutman Jr. – Can U Deal With This (instrumental)&lt;br&gt;
Cypress Hill – Lowrider (instrumental)&lt;br&gt;
Dap Daniel – Turnin’ Up the Heat (instrumental)&lt;br&gt;
Keyshia Cole ft. Eve – Never (instrumental)&lt;br&gt;
Sisqo – Incomplete (instrumental)&lt;br&gt;
Wordsmith – Day After The Apocalypse (instrumental)&lt;br&gt;
Yukmouth ft. Richie Rich, Beeda Weeda, Agerman, Kafani, Shady Nate, Lee Majors, G-Stack, London – Da Town Remix (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://183232c5.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://a09533dd.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7b821bd76d1c8f8c</guid>
         <pubDate>Sat, 14 Nov 2009 21:00:41 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/14/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/6LeL3HKOWzw/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Allure – Kool Wit Me (instrumental)&lt;br&gt;
Blackstreet – Don’t Leave Me (instrumental)&lt;br&gt;
Freeway ft. Beanie Sigel, Jakk Frost – Bac Ya Boyz Down (instrumental)&lt;br&gt;
Ginuwine – What’s So Different (instrumental)&lt;br&gt;
Kris Kross – Live And Die For Hip Hop (DJ Clark Kent Mix instrumental)&lt;br&gt;
Mary J. Blige – Your Child (instrumental)&lt;br&gt;
MF Grimm – Landslide (instrumental)&lt;br&gt;
Mike Marshall ft. E-40, Mistah F.A.B. – Drinks On Me (instrumental)&lt;br&gt;
Too Short – That’s Right (instrumental)&lt;br&gt;
Tru Life ft. Prodigy, Kool G Rap – When Your A Thug (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://254de99c.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://f1146a53.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/061bb97df7ed8b27</guid>
         <pubDate>Fri, 13 Nov 2009 21:00:25 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/13/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/cjOtjKdalI8/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
3rd Bass – Pop Goes the Weasel (instrumental)&lt;br&gt;
52nd Street – Tell Me How It Feels (dub instrumental)&lt;br&gt;
Cash Money Millionaires – Project Chick (instrumental)&lt;br&gt;
Cobra ft. Dru Down, Knucklehead, Otis &amp;amp; Shug – Sliden (instrumental)&lt;br&gt;
Deadly Venoms – Bomb Threat (instrumental)&lt;br&gt;
DJ Kay Slay ft. MC Ren, E-A-Ski, Kam – Westside Drive By (instrumental)&lt;br&gt;
Keith Sweat – Something Just Ain’t Right (instrumental)&lt;br&gt;
Mary J. Blige – Can’t Get You Off My Mind (instrumental)&lt;br&gt;
O’Ryan – Take It Slow (instrumental)&lt;br&gt;
South Central Cartel – That’s My Shit (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://26fada62.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://21e2dd96.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6510fae3a1b69c4d</guid>
         <pubDate>Thu, 12 Nov 2009 21:00:17 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/12/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/oxHk34_ybLI/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
ACD – In The City (instrumental)&lt;br&gt;
Avant ft. Keke Wyatt – My First Love (instrumental)&lt;br&gt;
Chris Webber ft. Kurupt – Gangsta Gangsta (instrumental)&lt;br&gt;
Drag-On ft. DMX – Niggas Die 4 Me (instrumental)&lt;br&gt;
Illa J – Airplane (instrumental)&lt;br&gt;
Knoc-Turn’Al ft. Slip Capone, Timebomb, Jayo Felony, Butch Cassidy – Let’s All Roll (instrumental)&lt;br&gt;
LaReece ft. Krayzie Bone – Thug Story (instrumental)&lt;br&gt;
Mary J. Blige – Not Gon’ Cry (instrumental)&lt;br&gt;
Olivia – Bizounce (instrumental)&lt;br&gt;
Playa Fly – Here Fly Come (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://7ccd17a1.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://5a0db378.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/dda9188a34d57b41</guid>
         <pubDate>Wed, 11 Nov 2009 21:00:39 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/11/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/bR0MO-Fbfeg/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Big Boi ft. Gucci Mane – Shine Blockas (instrumental)&lt;br&gt;
Bobby Valentino – Party, Party, Party (instrumental)&lt;br&gt;
DJ Kay Slay ft. Ray J, Yo Gotti, Jim Jones, Busta Rhymes – Blockstars (remix instrumental)&lt;br&gt;
Gorilla Zoe – Alright (Patron) (instrumental)&lt;br&gt;
Invinceable ft. Jon B. – Soldier Never Dies (instrumental)&lt;br&gt;
Lil Rob – Dream (instrumental)&lt;br&gt;
Sha Stimuli ft. Freeway – Move Back (instrumental)&lt;br&gt;
Timbaland – Ease Off The Liquor (instrumental)&lt;br&gt;
Timbaland ft. Drake – Say Something (instrumental)&lt;br&gt;
Young Money ft. Lloyd – Bedrock (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3e8ce9c1.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://00df472a.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bfe19d395786cfb2</guid>
         <pubDate>Tue, 10 Nov 2009 21:00:39 -0800</pubDate>
      </item>
      <item>
         <title>Live At The House Of Blues DVD instrumentals</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/aY_-UArIjT8/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;these were extracted from an audio layer off the “Tupac: Live At The House Of Blues” DVD. It contains 5.1 DTS so I had to demux the ac3 audio from the VOBs, then demux the resulting ac3 file into 6 separate WAVs…one of which had the instrumentals only. Everything was ripped as is…I left it unedited so it includes all the DJ cuts…whatever you hear on the DVD is what you get.&lt;/p&gt;
&lt;p&gt;I’m trying to find other concert DVDs which have 5.1 DTS so I can see if they also contain an instrumental layer. If anyone has any suggestions, hit me up. I need the full DVD (ISO, IMG, or VOB format) and not just an encoded rip (AVI, WMV, etc.)&lt;/p&gt;
&lt;p&gt;added to the 2pac instrumentals list…&lt;/p&gt;
&lt;p&gt;2pac – Never Call U Bitch Again (House OF Blues DVD instrumental)&lt;br&gt;
2pac – Tattoo Tearz (House OF Blues DVD instrumental)&lt;br&gt;
2pac – Troublesome ‘96 (House OF Blues DVD instrumental)&lt;br&gt;
2pac ft. Nate Dogg – All Bout U (House OF Blues DVD instrumental)&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://instrodepot.com/?p=2076&quot;&gt;http://instrodepot.com/?p=2076&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Snoop Dogg – Gz And Hustlas (House Of Blues DVD instrumental)&lt;br&gt;
Snoop Dogg – Murder Was The Case Remix (House Of Blues DVD instrumental)&lt;br&gt;
Snoop Dogg – Tha Shiznit (House Of Blues DVD instrumental)&lt;br&gt;
Snoop Dogg ft. Tha Dogg Pound – For All My Niggaz &amp;amp; Bitches (House Of Blues DVD instrumental)&lt;br&gt;
Tha Dogg Pound – Big Pimpin’ (House Of Blues DVD instrumental)&lt;br&gt;
Tha Dogg Pound – Do What I Feel (House Of Blues DVD instrumental)&lt;br&gt;
Tha Dogg Pound – If We All Gonna Fuck (House Of Blues DVD instrumental)&lt;br&gt;
Tha Dogg Pound – Me In Your World (House Of Blues DVD instrumental)&lt;br&gt;
Tha Dogg Pound ft. Snoop Dogg – Some Bomb Azz Pussy (House Of Blues DVD instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://048692a7.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://db3332fa.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e3313d6800cd179c</guid>
         <pubDate>Mon, 09 Nov 2009 21:00:46 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/9/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/juybVKTZxko/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Alicia Keys – Sleeping With A Broken Heart (instrumental)&lt;br&gt;
Cee-Lo presents The G.T.G. – Hello Miss (instrumental)&lt;br&gt;
Jaicko Lawrence ft. Snoop Dogg – Oh Yeah (instrumental)&lt;br&gt;
Jamie Foxx ft. Gucci Mane – Speak French (instrumental)&lt;br&gt;
Kornbred ft. Pitbull – I Luv A Hata (remix instrumental)&lt;br&gt;
Mack 10 ft. J Holiday – Hood Famous (instrumental)&lt;br&gt;
Nipsey Hussle – The Hussle Way (instrumental)&lt;br&gt;
Problem ft. Candice Pillay – Keep It Movin (instrumental)&lt;br&gt;
Raheem DeVaughn ft. Ludacris – Bulletproof (instrumental)&lt;br&gt;
Shortyo ft. Lil Wayne – Thats Right (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://abcf07f6.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://484881d5.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/303e4a177a379ccf</guid>
         <pubDate>Sun, 08 Nov 2009 21:00:09 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/8/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/FLBP6C5euN0/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Black Rob – You Don’t Know Me (instrumental)&lt;br&gt;
Eazy-E ft. Ice Cube, Xzibit, Six Two – Do Not Attempt (instrumental)&lt;br&gt;
En Vogue – Whatever (instrumental)&lt;br&gt;
Ginuwine – Trouble (instrumental)&lt;br&gt;
Ini Kamoze – The Hotstepper (allaamental)&lt;br&gt;
Ini Kamoze – The Hotstepper (heartimental)&lt;br&gt;
Lil Half Dead – That Dope Lil Half Dead (instrumental)&lt;br&gt;
LV ft. Treach – Throw Your Hands Up (instrumental)&lt;br&gt;
Megan Rochell ft. Fabolous – The One You Need (instrumental)&lt;br&gt;
Patra – Worker Man (Royal instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://33316792.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://69969620.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; - RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/69aa0b3b488ef3b3</guid>
         <pubDate>Sat, 07 Nov 2009 21:00:40 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/7/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/TGpc1Mp-n3Q/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt; &lt;br&gt;
Conscious Daughters – We Roll Deep (LP instrumental)&lt;br&gt;
Conscious Daughters – We Roll Deep (remix instrumental)&lt;br&gt;
Digital Underground – Doo Woo You (instrumental)&lt;br&gt;
Doggy’s Angels ft. Snoop Dogg, Layzie Bone – Pleezbaleevit! (instrumental)&lt;br&gt;
E-40 ft. T-Pain – Give Her The Keys (instrumental)&lt;br&gt;
Jill Scott – Family Reunion (instrumental)&lt;br&gt;
Kam – I Want Action (instrumental)&lt;br&gt;
Lost Boyz – Lifestyles Of The Rich And Shameless (instrumental)&lt;br&gt;
The Almighty RSO – Badd Boyz (instrumental)&lt;br&gt;
Usher – Call Me A Mack (percussamental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://23e8bdfe.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://348f2ae1.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/937ca9d28c2b220c</guid>
         <pubDate>Fri, 06 Nov 2009 21:00:42 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/6/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/k-3Zep5zZ2g/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;Bell Biv DeVoe – Poison (Smoothed Mix instrumental)&lt;br&gt;
Blackjack ft. Notorious B.I.G., Snakes – Young G’s Perspective (instrumental)&lt;br&gt;
D’Angelo – Brown Sugar (instrumental)&lt;br&gt;
DJ Khaled ft. Rick Ross, Drake, Young Jeezy, Usher – Fed Up (instrumental)&lt;br&gt;
Dru Hill ft. Ja Rule – You Are Everything (remix instrumental)&lt;br&gt;
J.R. Swinga – Chocolate City (instrumental)&lt;br&gt;
Taral ft. LL Cool J – How Can I Get Over You (Nerved Mix instrumental)&lt;br&gt;
Tash – Pimpin Aint Easy (instrumental)&lt;br&gt;
Tyrese – One (instrumental)&lt;br&gt;
Young Gunz ft. Daz Dillinger – Tonight (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://40bb6acb.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://e76fa67b.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/30dcc4af39a4cc67</guid>
         <pubDate>Thu, 05 Nov 2009 21:00:48 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/5/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/cC4eHbNrf3A/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;AMG – I Use’Ta Luv Tha Way (instrumental)&lt;br&gt;
Boyz II Men – Pass You By (instrumental)&lt;br&gt;
Charli Baltimore – Diary (instrumental)&lt;br&gt;
Foesum – Just Get On Down (G-Shit) (instrumental)&lt;br&gt;
Jason Derulo – Whatcha Say (instrumental)&lt;br&gt;
Jodeci – Stay (instrumental)&lt;br&gt;
Latif – I Don’t Wanna Hurt You (instrumental)&lt;br&gt;
Michel’le – No More Lies (instrumental)&lt;br&gt;
Tha Eastsidaz ft. Snoop Dogg, Jayo Felony – Got Beef (instrumental)&lt;br&gt;
The Click – Hurricane (remix instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ce193879.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://efb9929b.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/eba4ffca2f3c5917</guid>
         <pubDate>Thu, 05 Nov 2009 00:00:07 -0800</pubDate>
      </item>
      <item>
         <title>VA – Instrumentals 11/4/09</title>
         <link>http://feedproxy.google.com/~r/instrodepot/~3/YpYosjm4Heo/</link>
         <description>&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;width:400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:line-through;&quot;&gt;Aaliyah – Loose Rap (instrumental)&lt;/span&gt; &amp;lt;-oops, I dont know what the hell this is…anyone know the real name for this track?&lt;br&gt;
Brandy – What About Us (Boogiesoul Remix nstrumental)&lt;br&gt;
Brandy – What About Us (instrumental)&lt;br&gt;
Brandy – What About Us (Simon Vegas Remix instrumantal)&lt;br&gt;
Jamal – Unfuckwittable (instrumental)&lt;br&gt;
Kollosus – Breakin’ Bread (instrumental)&lt;br&gt;
LL Cool J – Around The Way Girl (Untouchables Remix instrumental)&lt;br&gt;
Michel’le – Can I Get A Witness (instrumental)&lt;br&gt;
Ro-Cee – Gettin All Da Babes (instrumental)&lt;br&gt;
YG – Toot It And Boot It (instrumental)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://377e8701.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – MF&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:large;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://70ca789d.linkbucks.com&quot;&gt;DOWNLOAD&lt;/a&gt; – RS&lt;/span&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/decdb0af7c851523</guid>
         <pubDate>Tue, 03 Nov 2009 20:00:54 -0800</pubDate>
      </item>
      <item>
         <title>Apple Launching New iPhone Ads Tonight (Arik Hesseldahl/BusinessWeek)</title>
         <link>http://www.techmeme.com/091123/p57#a091123p57</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/dce80c39a19d094f</guid>
         <pubDate>Mon, 23 Nov 2009 20:10:00 -0800</pubDate>
      </item>
      <item>
         <title>Extensions: One Step Closer to the Finish Line (Ian Fette/Chromium Blog)</title>
         <link>http://www.techmeme.com/091123/p62#a091123p62</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/82b4ef5b0e30bf19</guid>
         <pubDate>Mon, 23 Nov 2009 18:25:01 -0800</pubDate>
      </item>
      <item>
         <title>New Facebook worm - don't click da' button baby! (Nick/AVG Blogs)</title>
         <link>http://www.techmeme.com/091123/p47#a091123p47</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/85e325df39214f47</guid>
         <pubDate>Mon, 23 Nov 2009 17:15:03 -0800</pubDate>
      </item>
      <item>
         <title>Twitter's Biz Stone says could go IPO route (Georgina Prodhan/Reuters)</title>
         <link>http://www.techmeme.com/091123/p53#a091123p53</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f8cb14e238ca960f</guid>
         <pubDate>Mon, 23 Nov 2009 13:50:10 -0800</pubDate>
      </item>
      <item>
         <title>Windows Mobile vs. Android: WinMo Is Better Than You Think (James Kendrick/jkOnTheRun)</title>
         <link>http://www.techmeme.com/091123/p44#a091123p44</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6ddf04dcd6d311c3</guid>
         <pubDate>Mon, 23 Nov 2009 13:05:12 -0800</pubDate>
      </item>
      <item>
         <title>Easy holiday shopping with Google Product Search</title>
         <link>http://feedproxy.google.com/~r/blogspot/MKuf/~3/pB55vRUu-Ig/easy-holiday-shopping-with-google.html</link>
         <description>This holiday season, whether you're shopping for a new &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products?q=dog+sweater&amp;amp;aq=f&quot;&gt;sweater for Fido&lt;/a&gt;, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products/catalog?q=duplo&amp;amp;cid=12928216284921348247&amp;amp;sa=button#p&quot;&gt;Lego set&lt;/a&gt; for young builders, or that &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products/catalog?q=nikon+d90&amp;amp;cid=14031877078004511992&amp;amp;sa=title#p&quot;&gt;fancy camera&lt;/a&gt; you've been eyeing all year, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products&quot;&gt;Google Product Search&lt;/a&gt; can help you find what you're looking for at a great price. You can compare products and prices from merchants across the web, from popular retailers like Amazon and Best Buy to places to buy unique gifts like eBay and Etsy.&lt;br&gt;&lt;br&gt;Check out some of the recent improvements we've made to Google Product Search:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Our new &lt;span style=&quot;font-weight:bold;&quot;&gt;gallery view&lt;/span&gt; shows larger, higher-resolution images to help pick the style or model that is right for you. Check out some [&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products?hl=en&amp;amp;q=digital+cameras&amp;amp;show=li&amp;amp;lnk=showgrid&amp;amp;show=li&quot;&gt;digital cameras&lt;/a&gt;] or [&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products?q=sweater+boots&amp;amp;aq=f&amp;amp;show=li&quot;&gt;sweater boots&lt;/a&gt;].&lt;/li&gt;&lt;/ul&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_7ZYqYi4xigk/SwrrxCC_PMI/AAAAAAAAE-k/D2LTBY2K-kE/s1600/sweater+boots.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:400px;height:273px;&quot; src=&quot;http://4.bp.blogspot.com/_7ZYqYi4xigk/SwrrxCC_PMI/AAAAAAAAE-k/D2LTBY2K-kE/s400/sweater+boots.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Check the Reviews section of our product pages before you buy — we're now including &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products/catalog?q=asus+eee+pc+1005ha&amp;amp;cid=992462114018706598&amp;amp;sa=button&amp;amp;os=reviews#&quot;&gt;review summaries&lt;/a&gt; to help you see what people are saying at a glance. &lt;/li&gt;&lt;/ul&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_7ZYqYi4xigk/SwrrxnWwzzI/AAAAAAAAE-s/be6arb5tF6M/s1600/reviews.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:400px;height:107px;&quot; src=&quot;http://3.bp.blogspot.com/_7ZYqYi4xigk/SwrrxnWwzzI/AAAAAAAAE-s/be6arb5tF6M/s400/reviews.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;We've recently integrated &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products/catalog?hl=en&amp;amp;q=nikon+d90&amp;amp;cid=14031877078004511992&amp;amp;sa=button&amp;amp;os=videos&quot;&gt;video product reviews&lt;/a&gt; from YouTube, which appear right on the product pages so you can get an in-depth look at items before you buy. &lt;/li&gt;&lt;/ul&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/Swrrx1z1gKI/AAAAAAAAE-0/Hw5xcL9q8oA/s1600/yt+review.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:400px;height:287px;&quot; src=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/Swrrx1z1gKI/AAAAAAAAE-0/Hw5xcL9q8oA/s400/yt+review.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;If you want to see or purchase an item in person, click &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/products/catalog?q=ipod+touch&amp;amp;hl=en&amp;amp;cid=13561372809271777520&amp;amp;sa=button#p&quot;&gt;nearby stores&lt;/a&gt; to see a map of nearby &lt;span style=&quot;font-weight:bold;&quot;&gt;store locations&lt;/span&gt; for that seller. &lt;/li&gt;&lt;/ul&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwrryObY2cI/AAAAAAAAE-8/VOINzWzKx9c/s1600/store+locations.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:400px;height:211px;&quot; src=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwrryObY2cI/AAAAAAAAE-8/VOINzWzKx9c/s400/store+locations.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Product Search works great on &lt;span style=&quot;font-weight:bold;&quot;&gt;mobile phones&lt;/span&gt;, so you can compare prices, read reviews and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://google-latlong.blogspot.com/2009/11/with-coupons-on-your-phone-it-doesnt.html&quot;&gt;even find coupons&lt;/a&gt; from the Local Business Center while you're shopping. You can also use the nifty &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googlemobile.blogspot.com/2009/05/google-product-search-for-android-now.html&quot;&gt;barcode scanner&lt;/a&gt; on your phone to compare prices quickly and easily.&lt;/li&gt;&lt;/ul&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwrrysBWiJI/AAAAAAAAE_E/cjESdMqizBY/s1600/mobile.png&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:267px;height:400px;&quot; src=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwrrysBWiJI/AAAAAAAAE_E/cjESdMqizBY/s400/mobile.png&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;We hope these new features help you find the perfect gifts for your friends and family (and maybe even something nice for yourself) this holiday season.&lt;br&gt;&lt;br&gt;Happy shopping!&lt;br&gt;&lt;br&gt;&lt;span&gt;Posted by Sameer Samat, Product Management Director &amp;amp; Jeff Bartelma, Senior Product Manager&lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/10861780-7993842173069197667?l=googleblog.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?a=pB55vRUu-Ig:gpXtkNPpePo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?a=pB55vRUu-Ig:gpXtkNPpePo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?i=pB55vRUu-Ig:gpXtkNPpePo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/MKuf/~4/pB55vRUu-Ig&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>A Googler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d820e42ebb861b26</guid>
         <pubDate>Mon, 23 Nov 2009 12:13:00 -0800</pubDate>
      </item>
      <item>
         <title>Beyond Bookmark Me! Become a Fan of This App! ... (Eric von Coelln/Inside Social Games)</title>
         <link>http://www.techmeme.com/091123/p35#a091123p35</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e9d3e7a4d75b7e89</guid>
         <pubDate>Mon, 23 Nov 2009 11:45:09 -0800</pubDate>
      </item>
      <item>
         <title>Happy Thanksgiving Travels: Google Maps Navigation now available for Android 1.6 (Michael Siliski/Google Mobile Blog)</title>
         <link>http://www.techmeme.com/091123/p40#a091123p40</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/72aa373635e78f8b</guid>
         <pubDate>Mon, 23 Nov 2009 11:30:00 -0800</pubDate>
      </item>
      <item>
         <title>Apple Joins AT&amp;amp;T/Verizon Spat With New iPhone Ads (See Them Here!) (John Paczkowski/Digital Daily)</title>
         <link>http://www.techmeme.com/091123/p38#a091123p38</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/db7f39dc15cd8780</guid>
         <pubDate>Mon, 23 Nov 2009 11:05:06 -0800</pubDate>
      </item>
      <item>
         <title>LinkedIn Platform: Open for Business (Adam Nash/The LinkedIn Blog)</title>
         <link>http://www.techmeme.com/091123/p29#a091123p29</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b31faa64c0032d51</guid>
         <pubDate>Mon, 23 Nov 2009 10:05:10 -0800</pubDate>
      </item>
      <item>
         <title>Displaying the best display ad with Teracent (The Official Google Blog)</title>
         <link>http://www.techmeme.com/091123/p33#a091123p33</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/5490c8cbf37e7f06</guid>
         <pubDate>Mon, 23 Nov 2009 10:00:34 -0800</pubDate>
      </item>
      <item>
         <title>Displaying the best display ad with Teracent</title>
         <link>http://feedproxy.google.com/~r/blogspot/MKuf/~3/7Z31g60Ofso/displaying-best-display-ad-with.html</link>
         <description>&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_7ZYqYi4xigk/SwqxuPyLNfI/AAAAAAAAE-U/kAb2t9Wj0kc/s1600/top.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:300px;height:250px;&quot; src=&quot;http://4.bp.blogspot.com/_7ZYqYi4xigk/SwqxuPyLNfI/AAAAAAAAE-U/kAb2t9Wj0kc/s400/top.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwqxuS6vRqI/AAAAAAAAE-c/NFgd4ffRlqg/s1600/bottom.jpg&quot;&gt;&lt;img style=&quot;display:block;margin:0px auto 10px;text-align:center;width:300px;height:250px;&quot; src=&quot;http://1.bp.blogspot.com/_7ZYqYi4xigk/SwqxuS6vRqI/AAAAAAAAE-c/NFgd4ffRlqg/s400/bottom.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;br&gt;Can you spot the difference between these two sample display ads? Of course you can. However, the most important difference is not discernible to the naked eye.&lt;br&gt;&lt;br&gt;The lower ad was customized and chosen from thousands of different creative elements, automatically and in real-time, by machine-learning algorithms developed by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://teracent.com/&quot;&gt;Teracent&lt;/a&gt;, a San Mateo, California startup.&lt;br&gt;&lt;br&gt;We think that this technology has great potential to improve display advertising on the web. That's why we're pleased to announce today that we've entered into a definitive agreement to acquire Teracent. The transaction, which is subject to various closing conditions, is expected to close this quarter.&lt;br&gt;&lt;br&gt;As you know, we've been busy releasing &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://adwordsagency.blogspot.com/2009/11/google-ad-planner-and-dfa-updates.html&quot;&gt;new&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://adwordsagency.blogspot.com/2009/10/campaign-insights-better-measurement.html&quot;&gt;features&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://googleblog.blogspot.com/2009/09/doubleclick-ad-exchange-growing-display.html&quot;&gt;products&lt;/a&gt; to help improve display advertising on the web for everyone. We believe that Teracent's technology fits neatly into these efforts.&lt;br&gt;&lt;br&gt;Teracent's technology can pick and choose from literally thousands of creative elements of a display ad in real-time — tweaking images, products, messages or colors. These elements can be optimized depending on factors like geographic location, language, the content of the website, the time of day or the past performance of different ads.&lt;br&gt;&lt;br&gt;This technology can help advertisers get better results from their display ad campaigns. In turn, this enables publishers to make more money from their ad space and delivers web users better ads and more ad-funded web content.&lt;br&gt;&lt;br&gt;We're looking forward to welcoming the Teracent team to Google and to making this technology available to our display advertising clients — including those who run display ad campaigns on the Google Content Network and our DoubleClick clients.&lt;br&gt;&lt;br&gt;&lt;span&gt;Posted by Neal Mohan, Vice President, Product Management and Joerg Heilig, Engineering Director&lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/10861780-3328023591929502018?l=googleblog.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?a=7Z31g60Ofso:oslrAtgM35E:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?a=7Z31g60Ofso:oslrAtgM35E:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/MKuf?i=7Z31g60Ofso:oslrAtgM35E:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/MKuf/~4/7Z31g60Ofso&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>A Googler</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/eae0f143a16d4743</guid>
         <pubDate>Mon, 23 Nov 2009 09:32:00 -0800</pubDate>
      </item>
      <item>
         <title>The Many Flaws of Twitter's Retweet Feature</title>
         <link>http://www.25hoursaday.com/weblog/2009/11/23/TheManyFlawsOfTwittersRetweetFeature.aspx</link>
         <description>&lt;p&gt;
I've been a Twitter user for almost two years now and I have always been impressed
by the emergent behavior that has developed from simply giving people a text box with
140 character limit. The folks at Twitter have also done a good job of noticing some
these emergent behaviors and making them formal features of the site. Both &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://help.twitter.com/forums/10711/entries/49309&quot;&gt;hashtags&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.twitter.com/2008/05/how-replies-work-on-twitter-and-how.html&quot;&gt;@replies&lt;/a&gt; are
examples of emergent community conventions in authoring tweets that are now formal
features of the site. &lt;/p&gt;
&lt;p&gt;
Twitter recently added retweets to this list with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.twitter.com/2009/08/project-retweet-phase-one.html&quot;&gt;Project
Retweet&lt;/a&gt;. After using this feature for a few days I've found that unlike hashtags
and @replies, the way this feature has been integrated into the Twitter experience
is deeply flawed. Before I talking about the problems with Project Retweet, I should
talk about how the community uses retweeting today. &lt;/p&gt;
&lt;h3&gt;Retweeting 101: What is it and why do people do it? &lt;/h3&gt;
&lt;p&gt;
Retweeting is akin to the practice of forwarding along interesting blog posts and
links to your friends via email. A retweet repeats the content of a person's tweet
(sometimes edited for brevity) along with a reference to the user who is being retweeted.
Often times people also add some commentary to the retweets. Examples of both styles
of retweets are shown below. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1phGodQ9_Yr8qGzV1_sgkcfkbg7AbyTHhdDZRDy13MNJYhPrrqbjsa6sB1DzCjDCjF2-k4iOZHE_KAY4vcDbnyew/retweet%20sans%20comment.PNG&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 1:&lt;/u&gt; Retweet without commentary
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1pDcX50F8H76d7VRz_pfmYkGSGz3tlBw2QCLmRDfJ1rp7M1zNgJJSwzU6D_4tovS-tvU4VrHaxarHqqof0KZTbXg/retweet%20with%20comment.PNG&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 2:&lt;/u&gt; Retweet with added comment
&lt;/p&gt;
&lt;p&gt;
Unlike hashtags and @replies, the community conventions aren't as consistent with
retweets. Below are two examples of retweets from my home page which use different
prefixes and separators from the one above to indicate the item is a retweet and the
user's comment respectively. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1pCy4LAPplYbWGJH75O4f5v5ndSpWR57u_gMF3S7VX3mIYns-GRStRbCEKz9fBUd-eCqWQYZecgi7rxRHfxIY4Ew/viewing%20retweets.PNG&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 3:&lt;/u&gt; Different conventions in retweeting
&lt;/p&gt;
&lt;p&gt;
However there are many issues with retweeting not being a formal feature of Twitter.
For one, it is often hard for new users to figure out what's going on when they see
people posting updates prefixed with strange symbols and abbreviations. Another problem
is that users who want to post a retweet now have to deal with the fact that the original
tweet may have taken up all or most of the 140 character limit so there may be little
room to credit the author let alone add commentary. &lt;/p&gt;
&lt;p&gt;
Thus I was looking forward to retweeting becoming a formal feature of Twitter so that
these problems would be addressed. Unfortunately, while one of these problems was
fixed more problems were introduced. &lt;/p&gt;
&lt;h3&gt;Flaw #1: Need to visit multiple places to see all retweets of your content &lt;/h3&gt;
&lt;p&gt;
Before the introduction of the retweet feature, users could go to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.twitter.com/replies&quot;&gt;http://www.twitter.com/replies&lt;/a&gt; to
see all posts that reference their name which would include @replies and retweets.
The new Twitter features fragments this in an inconsistent manner. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1ptXjJkoqt8prm53JS56D6D2Zxn464HGDZ0lgViXXXi_qGfRiCHNyFaR4XICWQEcngdOI8vTdREQqdKC7zxq5vxw/twitter%20sidebar.PNG&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 4:&lt;/u&gt; Current Twitter sidebar
&lt;/p&gt;
&lt;p&gt;
Now users have to visit &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.twitter.com/replies&quot;&gt;http://www.twitter.com/replies&lt;/a&gt; to
see people who has retweeted their posts using community conventions (i.e. copy and
pasting then prefixing &quot;RT&quot; to a tweet) and then visit &lt;a rel=&quot;nofollow&quot; title=&quot;http://twitter.com/retweeted_of_mine&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/retweeted_of_mine&quot;&gt;http://twitter.com/retweeted_of_mine&lt;/a&gt; to
see who has retweeted their posts by clicking the &lt;em&gt;Retweet&lt;/em&gt; link in the Twitter
web user interface. There will be different people in both lists. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1pgplRYtorrkLTCrqDZ3n8nf_vYaGY8AWydoZvJr0HV5r95chrwwmkF7-5rRWvsHZuNBf1QQUcble7s4sl6sSOCQ/retweets%20via%20replies.PNG&quot; width=&quot;515&quot; height=&quot;254&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 5:&lt;/u&gt; Retweets in the Replies/Mentions page
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;img src=&quot;http://public.bay.livefilestore.com/y1pp18llfCEnbIG2XpisYCU5WhmzcDr9kp0pMQidDFVyrSd5YFLW-0ywoicWBwxOFClhubGxg-fR6Tq1SMaTW1xiA/retweeted%20of%20mine.PNG&quot; width=&quot;511&quot; height=&quot;422&quot;&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 6:&lt;/u&gt; Retweets on the &quot;Your tweets, retweeted&quot; page
&lt;/p&gt;
&lt;p&gt;
It is surprising to me that Twitter didn't at least include posts that start with
RT followed by your username in &lt;a rel=&quot;nofollow&quot; title=&quot;http://twitter.com/retweeted_of_mine&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/retweeted_of_mine&quot;&gt;http://twitter.com/retweeted_of_mine&lt;/a&gt; as
well. &lt;/p&gt;
&lt;h3&gt;Flaw #2: No way to add commentary on what you are retweeting
&lt;/h3&gt;
&lt;p&gt;
As I mentioned earlier, it is fairly common for people to retweet a status update
and then add their own commentary. The retweet feature built into Twitter ignores
this common usage pattern and provides no option to add your own commentary. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1p6gVMQxDilJ_7esKRX9I97Nk0cYJ6ZGX2gxP_k0NUkD5NsF9JhloOgfLTz1td2NVt9J6z0ulpWCBP9pbtftk2pA/Retweet%20question.PNG&quot; width=&quot;645&quot; height=&quot;179&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 7:&lt;/u&gt; The Retweet prompt
&lt;/p&gt;
&lt;p&gt;
This omission is particularly problematic if you disagree with what you are sharing
and want to clarify to your followers that although you find the tweet interesting
you aren't endorsing the opinion. &lt;/p&gt;
&lt;h3&gt;Flaw #3: Retweets don't show up in Twitter apps
&lt;/h3&gt;
&lt;p&gt;
One of the other surprising changes is that Twitter retweets have been introduced
in a backwards-incompatible manner into the API. This means that retweets created
using the Twitter retweet button do not show up in 3rd party applications that use
the Twitter API. See below for an example of what I see in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://echofon.com/&quot;&gt;Echofon&lt;/a&gt; versus
the Twitter web experience and notice the missing tweet. &lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://public.bay.livefilestore.com/y1pDqWNukk7Nzjy6N96i5llJ_vl10bmq1r0Zj87_lzYGo6ixxzzyQviq5Y3-_tDy75oL3Jld5-BQZa1WUZ5vFeoSA/twitter%20retweets.PNG&quot; width=&quot;472&quot; height=&quot;357&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 8:&lt;/u&gt; Twitter website showing a retweet
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;img src=&quot;http://public.bay.livefilestore.com/y1pXSe04VbbINJAv8UURAMubsYApto0gEIYJqrwwUptfGJt9Hm68Isbg1ndUR6ccbVBLAWel9xnAdp57Ejn-9FUUg/echofon%20no%20retweets.jpg&quot;&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Figure 9: &lt;/u&gt;The retweet is missing in Echofon
&lt;/p&gt;
&lt;p&gt;
Again, I find this surprising since it would have been straightforward to keep retweets
in the API and exposing them as if they were regular old school retweets prefixed
with &quot;RT&quot;. &lt;/p&gt;
&lt;h3&gt;Flaw #4: Pictures of people I don't know in my stream
&lt;/h3&gt;
&lt;p&gt;
The last major problem with the Twitter retweet feature is that it breaks user expectation
of the stream. Until this feature shipped, users could rest assured that the only
content they saw in their stream was content they had explicitly asked for by subscribing
to a user. Thus when you see someone in your stream the person's user name and avatar
are familiar to you. &lt;/p&gt;
&lt;p&gt;
With the new retweet feature, the Twitter team has decided to highlight the person
being retweeted and treat the person who I've subscribed to that did the retweeting
as an afterthought. Not only does this confuse users at first (who is this person
showing up in my feed and why?) but it also assumes that the content being retweeted
is more important than who did the retweeting. This is an unfortunate assumption since
in many cases the person who did the retweeting adds all the context. &lt;/p&gt;
&lt;p&gt;
&lt;img style=&quot;vertical-align:middle;&quot; title=&quot;Note&quot; alt=&quot;Note&quot; src=&quot;http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif&quot;&gt; Now
Playing: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Jason%20Derulo&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6&quot;&gt;Jason
Derulo&lt;/a&gt; - &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Jason%20Derulo+Whatcha%20Say&amp;amp;x=0&amp;amp;y=0&quot;&gt;Whatcha
Say&lt;/a&gt; &lt;img style=&quot;vertical-align:middle;&quot; title=&quot;Note&quot; alt=&quot;Note&quot; src=&quot;http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif&quot;&gt;
&lt;/p&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=kZVQTIIrF1Q:EunL2jSDvE4:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=kZVQTIIrF1Q:EunL2jSDvE4:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=kZVQTIIrF1Q:EunL2jSDvE4:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=kZVQTIIrF1Q:EunL2jSDvE4:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=kZVQTIIrF1Q:EunL2jSDvE4:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=kZVQTIIrF1Q:EunL2jSDvE4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=kZVQTIIrF1Q:EunL2jSDvE4:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=kZVQTIIrF1Q:EunL2jSDvE4:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=kZVQTIIrF1Q:EunL2jSDvE4:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Carnage4life/~4/kZVQTIIrF1Q&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/aebb5d882bd40a21</guid>
         <pubDate>Mon, 23 Nov 2009 08:24:00 -0800</pubDate>
      </item>
      <item>
         <title>MSNBC.com Taking Over @BreakingNews Twitter Feed; Signs On As BNO News' First Client (Rafat Ali /paidContent.org)</title>
         <link>http://www.techmeme.com/091123/p26#a091123p26</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/681780fac677b5de</guid>
         <pubDate>Mon, 23 Nov 2009 08:40:01 -0800</pubDate>
      </item>
      <item>
         <title>Another iPhone worm - and this time it's malicious (Chester Wisniewski/Chester Wisniewski's ...)</title>
         <link>http://www.techmeme.com/091123/p2#a091123p2</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/270f4184c4c5f35c</guid>
         <pubDate>Mon, 23 Nov 2009 08:00:14 -0800</pubDate>
      </item>
      <item>
         <title>AdMob Data Reveals Android's Growth, Device Market Share (Om Malik/GigaOM)</title>
         <link>http://www.techmeme.com/091123/p20#a091123p20</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bb7bb118e598d03d</guid>
         <pubDate>Mon, 23 Nov 2009 07:35:18 -0800</pubDate>
      </item>
      <item>
         <title>Volunteers Log Off As Wikipedia Ages (Wall Street Journal)</title>
         <link>http://www.techmeme.com/091123/p18#a091123p18</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/265390fe5eb66a73</guid>
         <pubDate>Mon, 23 Nov 2009 07:25:03 -0800</pubDate>
      </item>
      <item>
         <title>Building Scalable Databases: Perspectives on the War on Soft Deletes</title>
         <link>http://www.25hoursaday.com/weblog/2009/11/23/BuildingScalableDatabasesPerspectivesOnTheWarOnSoftDeletes.aspx</link>
         <description>&lt;p&gt;
In the past few months I've noticed an increased number of posts questioning practices
around deleting and &quot;virtually&quot; deleting data from databases. Since some
of the concerns around this practice have to do with the impact of soft deletes on
scalability of a database-based application, I thought it would be a good topic for
my ongoing series on building scalable databases. &lt;/p&gt;
&lt;h3&gt;Soft Deletes 101: What is a soft delete and how does it differ from a hard delete? &lt;/h3&gt;
&lt;p&gt;
Soft deleting an item from a database means that the row or entity is marked as deleted
but not physically removed from the database. Instead it is hidden from normal users
of the system but may be accessible by database or system administrators. &lt;/p&gt;
&lt;p&gt;
For example, let's consider this sample database of XBox 360 games I own
&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;833&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Name&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Category&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
ESRB&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
GamespotScore&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Company&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Call of Duty: Modern Warfare 2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
First Person Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Infinity Ward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Batman: Arkham Asylum&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Fantasy Action Adventure&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Teen&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Rocksteady Studios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Gears of War 2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Sci-Fi Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Epic Games&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Call of Duty 4: Modern Warfare&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
First Person Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Infinity Ward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Soul Calibur IV&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
3D Fighting&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Teen&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;151&quot;&gt;
8.5&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;139&quot;&gt;
Namco&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Now consider what happens if I decide that I'm done with Call of Duty 4: Modern Warfare
now that I own Call of Duty: Modern Warfare 2. The expected thing to do would then
be to remove the entry from my database using a query such as &lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
&lt;code&gt;DELETE FROM games WHERE name='Call of Duty 4: Modern Warfare';&lt;/code&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
This is what is considered a &quot;hard&quot; delete. &lt;/p&gt;
&lt;p&gt;
But then what happens if my friends decide to use my list of games to decide which
games to get me for Christmas? A friend might not realize I'd previously owned the
game and might get it for me again. Thus it might be preferable if instead of deleting
items from the database they were removed from consideration as games I currently
own but still could be retrieved in special situations. To address this scenario I'd
add an IsDeleted column as shown below &lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;924&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Name&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Category&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
ESRB&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
GamespotScore&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Company&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
IsDeleted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Call of Duty: Modern Warfare 2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
First Person Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Infinity Ward&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Batman: Arkham Asylum&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Fantasy Action Adventure&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Teen&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Rocksteady Studios&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Gears of War 2&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
Sci-Fi Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Epic Games&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Call of Duty 4: Modern Warfare&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
First Person Shooter&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Mature&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
9.0&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Infinity Ward&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;297&quot;&gt;
Soul Calibur IV&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;143&quot;&gt;
3D Fighting&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;
Teen&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;153&quot;&gt;
8.5&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;137&quot;&gt;
Namco&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;
False&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Then for typical uses an application would interact with the following view of the
underlying table
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
&lt;code&gt;CREATE VIEW current_games AS &lt;br&gt;
SELECT Name, Category, ESRB, GameSpotScore, Company FROM games WHERE IsDeleted=False; &lt;/code&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
but when my friends ask me for a list of all of the games I have, I can provide the
full list of all the games I've ever owned from the original &lt;code&gt;games&lt;/code&gt; table
if needed. Now that we understand how one would use soft deletes we can discuss the
arguments against this practice. &lt;/p&gt;
&lt;h3&gt;Rationale for War: The argument against soft deletes
&lt;/h3&gt;
&lt;p&gt;
Ayende Rahien makes a cogent argument against soft deletes in his post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx&quot;&gt;Avoid
Soft Deletes&lt;/a&gt; where he writes &lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
&lt;em&gt;One of the annoyances that we have to deal when building enterprise applications
is the requirement that no data shall be lost. The usual response to that is to introduce
a WasDeleted or an IsActive column in the database and implement deletes as an update
that would set that flag.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Simple, easy to understand, quick to implement and explain.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;It is also, quite often, wrong.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The problem is that deletion of a row or an entity is rarely a simple event. It
effect not only the data in the model, but also the shape of the model. That is why
we have foreign keys, to ensure that we don’t end up with Order Lines that don’t have
a parent Order. And that is just the simplest of issues. &lt;br&gt;
... &lt;br&gt;
Let us say that we want to delete an order. What should we do? That is a business
decision, actually. But it is one that is enforced by the DB itself, keeping the data
integrity.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;When we are dealing with soft deletes, it is easy to get into situations where
we have, for all intents and purposes, corrupt data, because Customer’s LastOrder
(which is just a tiny optimization that no one thought about) now points to a soft
deleted order.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
Ayende is right that adding an IsDeleted flag mean that you can no longer take advantage
of database triggers for use when cleaning up database state when a deletion occurs.
This sort of cleanup now has to moved up into the application layer. &lt;/p&gt;
&lt;p&gt;
There is another set of arguments against soft deletes in Richard Dingwall's post
entitled &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/&quot;&gt;The
Trouble with Soft Delete&lt;/a&gt; where he points out the following problems &lt;/p&gt;
&lt;blockquote&gt; &lt;h6&gt;&lt;em&gt;Complexity&lt;/em&gt;
&lt;/h6&gt;
&lt;p&gt;
&lt;em&gt;To prevent mixing active and inactive data in results, all queries must be made
aware of the soft delete columns so they can explicitly exclude them. It’s like a
tax; a mandatory WHERE clause to ensure you don’t return any deleted rows.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This extra WHERE clause is similar to checking return codes in programming languages
that don’t throw exceptions (like C). It’s very simple to do, but if you forget to
do it in even one place, bugs can creep in very fast. And it is background noise that
detracts away from the real intention of the query.&lt;/em&gt;
&lt;/p&gt;
&lt;h6&gt;&lt;em&gt;Performance&lt;/em&gt;
&lt;/h6&gt;
&lt;p&gt;
&lt;em&gt;At first glance you might think evaluating soft delete columns in every query
would have a noticeable impact on performance. However, I’ve found that most RDBMSs
are actually pretty good at recognizing soft delete columns (probably because they
are so commonly used) and does a good job at optimizing queries that use them. In
practice, filtering inactive rows doesn’t cost too much in itself.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Instead, the performance hit comes simply from the volume of data that builds
up when you don’t bother clearing old rows. For example, we have a table in a system
at work that records an organisations day-to-day tasks: pending, planned, and completed.
It has around five million rows in total, but of that, only a very small percentage
(2%) are still active and interesting to the application. The rest are all historical;
rarely used and kept only to maintain foreign key integrity and for reporting purposes.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Interestingly, the biggest problem we have with this table is not slow read performance
but writes. Due to its high use, we index the table heavily to improve query performance.
But with the number of rows in the table, it takes so long to update these indexes
that the application frequently times out waiting for DML commands to finish.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
These arguments seem less valid than Ayende's especially when the alternatives proposed
are evaluated. Let's look at the aforementioned problems and the proposed alternatives
in turn. &lt;/p&gt;
&lt;h3&gt;Trading the devil you know for the devil you don't: Thoughts on the alternatives
to soft deletes
&lt;/h3&gt;
&lt;p&gt;
Richard Dingwall argues that soft deletes add unnecessary complexity to the system
since all queries have to be aware of the IsDeleted column(s) in the database. As
I mentioned in my initial description of soft deletes this definitely does not have
to be the case. The database administrator can create views which the core application
logic interacts with (i.e. the &lt;code&gt;current_games&lt;/code&gt; table in my example) so
that only a small subset of system procedures need to actually know that the soft
deleted columns even still exist in the database. &lt;/p&gt;
&lt;p&gt;
A database becoming so large that data manipulation becomes slow due to having to
update indexes is a valid problem. However Richard Dingwall's suggested alternative
excerpted below seems to trade one problem for a worse one &lt;/p&gt;
&lt;blockquote&gt; &lt;h6&gt;&lt;em&gt;The memento pattern&lt;/em&gt;
&lt;/h6&gt;
&lt;p&gt;
&lt;em&gt;Soft delete only supports undoing deletes, but the &lt;/em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Memento_pattern&quot;&gt;&lt;em&gt;memento
pattern&lt;/em&gt;&lt;/a&gt;&lt;em&gt; provides a standard means of handling all undo scenarios your
application might require.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;It works by taking a snapshot of an item just before a change is made, and putting
it aside in a separate store, in case a user wants to restore or rollback later. For
example, in a job board application, you might have two tables: one transactional
for live jobs, and an undo log that stores snapshots of jobs at previous points in
time:&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
The problem I have with this solution is that if your database is already grinding
to a halt simply because you track which items are active/inactive in your database,
how much worse would the situation be if you now store every state transition in the
database as well? Sounds like you're trading one performance problem for a much worse
one. &lt;/p&gt;
&lt;p&gt;
The real problem seems to be that the database has gotten too big to be operated on
in an efficient manner on a single machine. The best way to address this is to partition
or shard the database. In fact, you could even choose to store all inactive records
on one database server and all active records on another. Those interested in database
sharding can take a look at a &lt;a rel=&quot;nofollow&quot; title=&quot;Building Scalable Databases: Pros and Cons of Various Database Sharding Schemes&quot; target=&quot;_blank&quot; href=&quot;http://www.25hoursaday.com/weblog/2009/01/16/BuildingScalableDatabasesProsAndConsOfVariousDatabaseShardingSchemes.aspx&quot;&gt;more
detailed discussion on database sharding&lt;/a&gt; I wrote earlier this year.
&lt;/p&gt;
&lt;p&gt;
Another alternative proposed by both Ayende Rahien and Richard Dingwall is to delete
the data but use database triggers to write to an audit log in the cases where auditing
is the primary use case for keeping soft deleted entries in the database. This works
in the cases where the &lt;em&gt;&lt;u&gt;only reason&lt;/u&gt; &lt;/em&gt;for soft deleting entries is for
auditing purposes. However there are many real world situations where this is not
the case. &lt;/p&gt;
&lt;p&gt;
One use case for soft deleting is to provide an &quot;undo&quot; feature in an end
user application. For example, consider a user synchronizes the contact list on their
phone with one in the cloud (e.g. an iPhone or Windows Mobile/Windows Phone connecting
to Exchange or an Android phone connecting to Gmail). Imagine that the user now deletes
a contact from their phone because they do not have a phone number for the person
only to find out that person has also been deleted from their address book in the
cloud. At that point, an undo feature is desirable. &lt;/p&gt;
&lt;p&gt;
Other use cases could be the need to reactivate items that have been removed from
the database but with their state intact. For example, when people return to Microsoft
who used to work there in the past their seniority for certain perks takes into account
their previous stints at the company. Similarly, you can imagine a company restocking
an item that they had pulled from their shelves because they have become popular due
to some new fad (e.g. Beatles memorabilia is back in style thanks to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.thebeatlesrockband.com/&quot;&gt;The
Beatles™: Rock Band™&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;
The bottom line is that an audit log may be a useful replacement for soft deletes
in some scenarios but it isn't the answer to every situation where soft deletes are
typically used. &lt;/p&gt;
&lt;h3&gt;Not so fast: The argument against hard deletes &lt;/h3&gt;
&lt;p&gt;
So far we haven't discussed how hard deletes should fit in a world of soft deletes.
In some cases, soft deletes eventually lead to hard deletes. In the example of video
games I've owned I might decide that if a soft deleted item is several years old or
is a game from an outdated console then it might be OK to delete. So I'd create a
janitor process that would scan the database periodically to seek out soft deleted
entries to permanently delete. In other cases, some content may always be hard deleted
since there are no situations where one might consider keeping them around for posterity.
An example of the latter is comment or trackback spam on a blog post. &lt;/p&gt;
&lt;p&gt;
Udi Dahan wrote a rebuttal to Ayende Rahien's post where he question my assertion
above that there are situations where one wants to hard delete data from the database
in his post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.udidahan.com/2009/09/01/dont-delete-just-dont/&quot;&gt;Don’t
Delete – Just Don’t&lt;/a&gt; where he writes &lt;/p&gt;
&lt;blockquote&gt; &lt;h5&gt;&lt;em&gt;Model the task, not the data&lt;/em&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;em&gt;Looking back at the story our friend from marketing told us, his intent is to
discontinue the product – not to delete it in any technical sense of the word. As
such, we probably should provide a more explicit representation of this task in the
user interface than just selecting a row in some grid and clicking the ‘delete’ button
(and “Are you sure?” isn’t it).&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;As we broaden our perspective to more parts of the system, we see this same pattern
repeating:&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; &lt;p&gt;
&lt;em&gt;Orders aren’t deleted – they’re cancelled. There may also be fees incurred if
the order is canceled too late.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Employees aren’t deleted – they’re fired (or possibly retired). A compensation
package often needs to be handled.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Jobs aren’t deleted – they’re filled (or their requisition is revoked). &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
&lt;em&gt;In all cases, the thing we should focus on is the task the user wishes to perform,
rather than on the technical action to be performed on one entity or another. In almost
all cases, more than one entity needs to be considered.&lt;/em&gt;
&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Statuses&lt;/em&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;em&gt;In all the examples above, what we see is a replacement of the technical action
‘delete’ with a relevant business action. At the entity level, instead of having a
(hidden) technical WasDeleted status, we see an explicit business status that users
need to be aware of.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;
I tend to agree with Udi Dahan's recommendation. Instead of a technical flag like
IsDeleted, we should model the business process. So my database table of games I owned
should really be called &lt;code&gt;games_I_have_owned&lt;/code&gt; with the &lt;code&gt;IsDeleted&lt;/code&gt; column
replaced with something more appropriate such as &lt;code&gt;CurrentlyOwn&lt;/code&gt;. This is
a much better model of the real-life situation than my initial table and the soft
deleted entries are now clearly part of the business process as opposed to being part
of some internal system book keeping system. &lt;/p&gt;
&lt;p&gt;
Advocating that items be never deleted is a tad extreme but I'd actually lean closer
to that extreme than most. Unless the data is clearly worthless (e.g. comment spam)
or the cost is truly prohibitive (e.g. you're storing large amounts of binary data)
then I'd recommend keeping the information around instead of assuming the existence
of a DELETE clause in your database is a requirement that you use it. &lt;/p&gt;
&lt;p&gt;
&lt;img style=&quot;vertical-align:middle;&quot; title=&quot;Note&quot; alt=&quot;Note&quot; src=&quot;http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif&quot;&gt; Now
Playing: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=50%20Cent&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6&quot;&gt;50
Cent&lt;/a&gt; - &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=50%20Cent+Baby%20By%20Me%20(feat.%20Ne-Yo)&amp;amp;x=0&amp;amp;y=0&quot;&gt;Baby
By Me (feat. Ne-Yo)&lt;/a&gt; &lt;img style=&quot;vertical-align:middle;&quot; title=&quot;Note&quot; alt=&quot;Note&quot; src=&quot;http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif&quot;&gt;
&lt;/p&gt;&lt;div&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=_E1QDqwrhGI:o1xGTqmEWJ4:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=_E1QDqwrhGI:o1xGTqmEWJ4:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=_E1QDqwrhGI:o1xGTqmEWJ4:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=_E1QDqwrhGI:o1xGTqmEWJ4:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=_E1QDqwrhGI:o1xGTqmEWJ4:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=_E1QDqwrhGI:o1xGTqmEWJ4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=_E1QDqwrhGI:o1xGTqmEWJ4:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Carnage4life?a=_E1QDqwrhGI:o1xGTqmEWJ4:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Carnage4life?i=_E1QDqwrhGI:o1xGTqmEWJ4:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Carnage4life/~4/_E1QDqwrhGI&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/870df930b6de12f6</guid>
         <pubDate>Mon, 23 Nov 2009 06:46:15 -0800</pubDate>
      </item>
      <item>
         <title>Meet the New AOL Logo: &quot;Aol.&quot; (Plus the Press Release) (Peter Kafka/MediaMemo)</title>
         <link>http://www.techmeme.com/091122/p24#a091122p24</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/94ef4fef333552c2</guid>
         <pubDate>Mon, 23 Nov 2009 07:05:00 -0800</pubDate>
      </item>
      <item>
         <title>Armstrong On AOL's New Branding And 'Very, Very, Very Inexpensive' Campaign (Staci D. Kramer/paidContent)</title>
         <link>http://www.techmeme.com/091123/p4#a091123p4</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/842ddf3f817c4593</guid>
         <pubDate>Mon, 23 Nov 2009 06:20:04 -0800</pubDate>
      </item>
      <item>
         <title>Recovering files using TestDisk</title>
         <link>http://y_z.scripts.mit.edu/wp/2009/11/23/recovering-files-using-testdisk/</link>
         <description>&lt;p&gt;I recently had a hard disk go bad. It had a single NTFS partition where the partition was no longer recognized by Windows or Linux.&lt;/p&gt;&lt;p&gt;I managed to recover (I think) all of my files by reading the data off of the disk using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cgsecurity.org/wiki/TestDisk&quot;&gt;TestDisk&lt;/a&gt;. It discovered my partition without issue, and the actual file recovery went relatively smoothly.&lt;/p&gt;&lt;p&gt;I believe the way TestDisk was primarily designed to work was by attempting to actually repair the partition. This should be fine if you’re working on a copy of the raw disk bits (you can probably use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.chrysocome.net/dd&quot;&gt;dd for Windows&lt;/a&gt; for this, or write a program that accesses ), but I’d generally be averse to making any further changes to a bad disk. I chose to recover my data just by copying the files directly out. You can do this as follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;go to (your disk) &amp;gt; Intel &amp;gt; Analyse &amp;gt; (your dynamic partition)&lt;/li&gt;&lt;li&gt;highlight your partition&lt;/li&gt;&lt;li&gt;press P to list files&lt;/li&gt;&lt;li&gt;press H to hide deleted files&lt;/li&gt;&lt;li&gt;press C to copy the current directory&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;One thing to watch out for when using this approach is to first make sure you press H to hide deleted files. Otherwise, you end up recovering deleted files as well, and sometimes these deleted files (for whatever reason—probably because my data’s sufficiently corrupted) end up pointing back into the root of the file system, leading to cycles in the tree and thus an infinitely recursive file copying procedure.&lt;/p&gt;</description>
         <author>yang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e5941d2dca25d31a</guid>
         <pubDate>Mon, 23 Nov 2009 18:29:15 -0800</pubDate>
      </item>
      <item>
         <title>DB</title>
         <link>http://zs.ath.cx:5001/_diff/DB?to=b5a728a&amp;from=9d8934e</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/003170e5b34512a3</guid>
         <pubDate>Sun, 22 Nov 2009 03:17:54 -0800</pubDate>
      </item>
      <item>
         <title>Algorithms</title>
         <link>http://zs.ath.cx:5001/_diff/Algorithms?to=9d8934e&amp;from=836189a</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/acbe8c55088522a3</guid>
         <pubDate>Sun, 22 Nov 2009 03:14:50 -0800</pubDate>
      </item>
      <item>
         <title>Systems</title>
         <link>http://zs.ath.cx:5001/_diff/Systems?to=836189a&amp;from=fb303ba</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/956d7e42f1fa24e5</guid>
         <pubDate>Sat, 21 Nov 2009 22:26:25 -0800</pubDate>
      </item>
      <item>
         <title>Hackery</title>
         <link>http://zs.ath.cx:5001/_diff/Hackery?to=fb303ba&amp;from=afb6f3a</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/48beea510a00bc7b</guid>
         <pubDate>Sat, 21 Nov 2009 22:26:17 -0800</pubDate>
      </item>
      <item>
         <title>Security</title>
         <link>http://zs.ath.cx:5001/_diff/Security?to=afb6f3a&amp;from=d8d5f65</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e1c85de63b7f3c52</guid>
         <pubDate>Fri, 20 Nov 2009 23:19:16 -0800</pubDate>
      </item>
      <item>
         <title>Architecture, Security, Systems</title>
         <link>http://zs.ath.cx:5001/_diff/Architecture?to=d8d5f65&amp;from=e1ef6ad</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/575a926cc354f4e3</guid>
         <pubDate>Fri, 20 Nov 2009 23:05:15 -0800</pubDate>
      </item>
      <item>
         <title>Systems</title>
         <link>http://zs.ath.cx:5001/_diff/Systems?to=e1ef6ad&amp;from=b7a236e</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/ed5796ecef74a963</guid>
         <pubDate>Fri, 20 Nov 2009 23:03:35 -0800</pubDate>
      </item>
      <item>
         <title>Systems</title>
         <link>http://zs.ath.cx:5001/_diff/Systems?to=b7a236e&amp;from=5c96a9d</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/0d14e7309618e93a</guid>
         <pubDate>Fri, 20 Nov 2009 22:55:34 -0800</pubDate>
      </item>
      <item>
         <title>Misc</title>
         <link>http://zs.ath.cx:5001/_diff/Misc?to=5c96a9d&amp;from=dca482c</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/be7843c285d509b8</guid>
         <pubDate>Fri, 20 Nov 2009 22:55:17 -0800</pubDate>
      </item>
      <item>
         <title>Misc</title>
         <link>http://zs.ath.cx:5001/_diff/Misc?to=dca482c&amp;from=52ab497</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/517f9bc1e48ae1c3</guid>
         <pubDate>Fri, 20 Nov 2009 21:19:42 -0800</pubDate>
      </item>
      <item>
         <title>Languages</title>
         <link>http://zs.ath.cx:5001/_diff/Languages?to=52ab497&amp;from=9b49978</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/8536736fe21469dd</guid>
         <pubDate>Fri, 20 Nov 2009 21:19:30 -0800</pubDate>
      </item>
      <item>
         <title>Hackery</title>
         <link>http://zs.ath.cx:5001/_diff/Hackery?to=9b49978&amp;from=ba8deb0</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a24d1f915c67db36</guid>
         <pubDate>Fri, 20 Nov 2009 21:19:17 -0800</pubDate>
      </item>
      <item>
         <title>Security</title>
         <link>http://zs.ath.cx:5001/_diff/Security?to=ba8deb0&amp;from=5eb59be</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/8220c8012d75022d</guid>
         <pubDate>Thu, 19 Nov 2009 21:24:54 -0800</pubDate>
      </item>
      <item>
         <title>DB</title>
         <link>http://zs.ath.cx:5001/_diff/DB?to=5eb59be&amp;from=061bffb</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/8649c106b6c7ffa9</guid>
         <pubDate>Thu, 19 Nov 2009 21:23:52 -0800</pubDate>
      </item>
      <item>
         <title>Algorithms</title>
         <link>http://zs.ath.cx:5001/_diff/Algorithms?to=061bffb&amp;from=253e155</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b0b08550b1bd07dd</guid>
         <pubDate>Thu, 19 Nov 2009 21:23:28 -0800</pubDate>
      </item>
      <item>
         <title>AI</title>
         <link>http://zs.ath.cx:5001/_diff/AI?to=253e155&amp;from=fce7de1</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/203876e67ea78f1b</guid>
         <pubDate>Thu, 19 Nov 2009 21:23:10 -0800</pubDate>
      </item>
      <item>
         <title>Hackery</title>
         <link>http://zs.ath.cx:5001/_diff/Hackery?to=fce7de1&amp;from=7a16635</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d0b39cd9608ab820</guid>
         <pubDate>Wed, 18 Nov 2009 11:59:34 -0800</pubDate>
      </item>
      <item>
         <title>Concurrency</title>
         <link>http://zs.ath.cx:5001/_diff/Concurrency?to=7a16635&amp;from=6ee4f00</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/208af2206d6c583d</guid>
         <pubDate>Wed, 18 Nov 2009 11:59:20 -0800</pubDate>
      </item>
      <item>
         <title>Security</title>
         <link>http://zs.ath.cx:5001/_diff/Security?to=6ee4f00&amp;from=78551bb</link>
         <author>Yang Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/aa9d5987407fa676</guid>
         <pubDate>Wed, 18 Nov 2009 11:58:30 -0800</pubDate>
      </item>
      <item>
         <title>Environmental chemicals: feminizing boys?</title>
         <link>http://jxyzabc.blogspot.com/2009/11/environmental-chemicals-feminizing-boys.html</link>
         <description>Yes, I'm somewhat behind on blogging--I just finished a big deadline on Saturday.&lt;br&gt;&lt;br&gt;(A couple of weeks ago) Owen sent me this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://science.slashdot.org/story/09/11/14/2023219/Environmental-Chemicals-Are-Feminizing-Boys&quot;&gt;Slashdot story&lt;/a&gt; about an unofficial Danish study suggesting that environmental chemicals are &quot;feminizing boys.&quot; From Slashdot:&lt;br&gt;&lt;br&gt;&lt;i&gt;&quot;Denmark has unveiled official research showing that two-year-old children are at risk from a bewildering array of gender-bending chemicals in such everyday items as waterproof clothes, rubber boots... A picture is emerging of ubiquitous &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.guardian.co.uk/society/2009/nov/06/health-eu&quot;&gt;chemical contamination driving down sperm counts and feminizing male children&lt;/a&gt; all over the developed world. Research at Rotterdam's Erasmus University found that boys whose mothers were exposed to PCBs and dioxins were more likely to play with dolls and tea sets and dress up in female clothes... '&quot;&lt;/i&gt;&lt;br&gt;&lt;br&gt;Yikes? I didn't realize that chemicals could change culture and socialization in such strong ways*.&lt;br&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;br&gt;* Sarcasm.&lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/29172085-1310636651721959263?l=jxyzabc.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>jxyz</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/256241d350282a3a</guid>
         <pubDate>Mon, 23 Nov 2009 20:41:00 -0800</pubDate>
      </item>
      <item>
         <title>Write badly well</title>
         <link>http://jxyzabc.blogspot.com/2009/11/write-badly-well.html</link>
         <description>I love this hilarious blog, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://writebadlywell.blogspot.com/&quot;&gt;how to write badly well&lt;/a&gt;, by one of the authors of the book &lt;span style=&quot;font-style:italic;&quot;&gt;Who Writes This Crap?&lt;/span&gt; A quote from the post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://writebadlywell.blogspot.com/2009/11/learn-about-syllepsis-then-refuse-to.html&quot;&gt;&quot;Learn about syllepsis, then refuse to stop employing it&quot;&lt;/a&gt;:&lt;br&gt;&lt;br&gt;&lt;div style=&quot;margin:0px;font-style:italic;font-variant:normal;font-weight:normal;font-size:14px;line-height:normal;font-size-adjust:none;font-stretch:normal;text-align:justify;&quot;&gt;&quot;As he ran a red light, the conversation back in his mind and away from his troubles, he couldn’t help but feel a sense of rising panic and the soft matte finish of his hand-stitched leather steering wheel. Angelica had been absolutely right and his wife for fifteen years, so why was he running scared, these kind of risks and this deadly gauntlet of illicit entanglements?&quot;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;margin:0px;font-style:italic;font-variant:normal;font-weight:normal;font-size:14px;line-height:normal;font-size-adjust:none;font-stretch:normal;text-align:justify;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/29172085-2651289440428933365?l=jxyzabc.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>jxyz</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/172b805d17d1ef59</guid>
         <pubDate>Mon, 23 Nov 2009 20:35:00 -0800</pubDate>
      </item>
      <item>
         <title>Building a Social Data Commons</title>
         <link>http://feedproxy.google.com/~r/marcua/blog/~3/YKjeH5Ldd6o/255139186</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/be7626e8806b4198</guid>
         <pubDate>Mon, 23 Nov 2009 19:30:21 -0800</pubDate>
      </item>
      <item>
         <title>Java String Encoding Performance</title>
         <link>http://evanjones.ca/software/java-string-encoding.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/33dd7c5f3367f3e7</guid>
         <pubDate>Mon, 23 Nov 2009 07:12:31 -0800</pubDate>
      </item>
      <item>
         <title>new ones</title>
         <link>http://arnab.org/blog/new-ones</link>
         <author>arnab</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/f3c9c68db012c8fc</guid>
         <pubDate>Sun, 22 Nov 2009 21:38:35 -0800</pubDate>
      </item>
      <item>
         <title>Information:</title>
         <link>http://page2rss.com/p/5eeb9cda6692d352f96e7340c25fb27a_4672518_4681904</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/6fd37cd2dfe8f71c</guid>
         <pubDate>Sun, 22 Nov 2009 10:24:00 -0800</pubDate>
      </item>
      <item>
         <title>NEW: find only *first*-authored papers</title>
         <link>http://page2rss.com/p/ccbe9e2baeb9731138595693338e0da1_4671290_4680407</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/601dd47c7664961e</guid>
         <pubDate>Sat, 21 Nov 2009 09:27:00 -0800</pubDate>
      </item>
      <item>
         <title>Thu, Nov 19, 2009</title>
         <link>http://page2rss.com/p/50b889ceabbab46a4767de8b679860ca_4671298_4678287</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7bf9b75d22a6c89d</guid>
         <pubDate>Thu, 19 Nov 2009 22:07:00 -0800</pubDate>
      </item>
      <item>
         <title>math at midnight</title>
         <link>http://melthetraveler.blogspot.com/2009/11/math-at-midnight.html</link>
         <description>hours until my final: 13&lt;br&gt;&lt;br&gt;pages of systemics notes reviewed tonight: 3&lt;br&gt;episodes of house watched: 2 &lt;br&gt;stuff learned tonight: not very much&lt;br&gt;stuff forgot tonight: very much&lt;br&gt;&lt;br&gt;&lt;br&gt;my thinking goes, the more i study, the more i forget, so i might as well watch some House (at least it's entertaining, though really not all that educational).&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1251626102645027802-6748308877029415072?l=melthetraveler.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;</description>
         <author>Melanie Zhang</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/b863c910d3eca706</guid>
         <pubDate>Thu, 19 Nov 2009 23:52:00 -0800</pubDate>
      </item>
      <item>
         <title>i guess it was just a matter of time</title>
         <link>http://rivenreality.livejournal.com/26824.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/bad9055592856d26</guid>
         <pubDate>Wed, 18 Nov 2009 22:57:36 -0800</pubDate>
      </item>
      <item>
         <title>organizing background research</title>
         <link>http://feedproxy.google.com/~r/NehaBlog/~3/ocJjh3b629g/organizing-background-research.html</link>
         <description>I've been fuddling around with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt; and a basic .bib file, but I think I found something more awesome: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.mendeley.com/&quot;&gt;Mendeley&lt;/a&gt;. I found it looking for a PDF annotator, and it looks fantastic! I'll update later after I've used it a while. It even syncs with Zotero and can watch a folder for new PDFs.&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9018357085562770055-554335555939797336?l=transientneha.blogspot.com&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/NehaBlog/~4/ocJjh3b629g&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>neha</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/7c032fa0989d7c81</guid>
         <pubDate>Wed, 18 Nov 2009 07:28:00 -0800</pubDate>
      </item>
      <item>
         <title>You know what's hard?</title>
         <link>http://rivenreality.livejournal.com/26462.html</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/a6b989ed4ede8e93</guid>
         <pubDate>Mon, 16 Nov 2009 22:46:39 -0800</pubDate>
      </item>
      <item>
         <title>] [ppt</title>
         <link>http://page2rss.com/p/6bba9008963470b68011b12a93932059_4671305_4674079</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/e6b44c2c5eb7d7e4</guid>
         <pubDate>Mon, 16 Nov 2009 23:59:00 -0800</pubDate>
      </item>
      <item>
         <title>JCOP Smartcard Performance</title>
         <link>http://feedproxy.google.com/~r/VictorCostan/~3/cNjpM5FmYUk/jcop-smartcard-performance.html</link>
         <description>&lt;span style=&quot;font-size:large;&quot;&gt;Abstract&lt;/span&gt;&lt;br&gt;
I use NXP JCOP smart-cards for prototyping in my research. I have recently benchmarked the cards using my research code, which contains computational and cryptographic workloads.&lt;br&gt;
&lt;br&gt;
I found a couple of surprising results that I want to share, so fellow developers can make informed decisions when choosing their prototyping platforms.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size:large;&quot;&gt;Findings&lt;/span&gt;&lt;br&gt;
There is a &lt;b&gt;1.5-2x speed difference&lt;/b&gt; between the different revisions of the same high-end chip, the NXP JCOP41 with 72kb of EEPROM. The V2.2 revision for smart-cards (no longer available, replaced by 2.2.1) has the best performance, and the V2.2.1 revision for the SIM (ID 000) form factor has the worst performance.&lt;br&gt;
&lt;br&gt;
There is a &lt;b&gt;significant speed difference&lt;/b&gt; between the same revision (V2.2.1) of the same chip (NXP JCOP41, 72kb of EEPROM), in different form factors. The chip for the smart-card form factor is almost as fast as the older V2.2 revision, while the chip for the SIM (ID 000) form factor is significantly slower.&lt;br&gt;
&lt;br&gt;
There is a &lt;b&gt;2-4x speed difference&lt;/b&gt; between the same revisions (V2.2, smart-card form factor) of the NXP JCOP31 and the NXP JCOP41 chips.&lt;br&gt;
&lt;br&gt;
The 3DES encryption/decryption engine has &lt;b&gt;non-linear performance&lt;/b&gt;. The time it takes to decrypt 128 bytes is not very different from the time it takes to decrypt 24 bytes, on the JCOP41 chips. It seems that there is a huge setup cost for the DES engine, which outweighs the actual encryption cost.&lt;br&gt;
&lt;br&gt;
There is a &lt;b&gt;4-8x speed difference between RSA and 3DES encryption&lt;/b&gt; on the JCOP41 chips, and a &lt;b&gt;3x speed difference&lt;/b&gt; on the JCOP31 chip. This goes against the conventional wisdom that symmetric encryption is 2 orders of magnitude faster then asymmetric encryption. This is probably due to the time it takes to setup the 3DES engine.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size:large;&quot;&gt;Conclusion&lt;/span&gt;&lt;br&gt;
Secure processors in smart-cards have non-obvious performance characteristics. I hope my work saves you from the unpleasant surprises that I had.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size:large;&quot;&gt;Motivation &lt;/span&gt;&lt;br&gt;
To the best of my knowledge, there are no easy to get benchmarks on smart-card processors. At least, I couldn't find anything when I searched.&lt;br&gt;
&lt;br&gt;
Smart-card retailers disclose vital specifications, like EEPROM size and the cryptographic primitives that are implemented on the chip, but tend to be quiet about speed. The sites I used don't mention anything about the type of processor used, or the frequency of the processor.&lt;br&gt;
&lt;br&gt;
For some applications (e.g. prototyping, where I want my unit tests to run quickly), speed is just as critical as the other specifications, and its more important than cost.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size:large;&quot;&gt;Data&lt;/span&gt;&lt;br&gt;
The data that I used to reach my conclusions is available below. The benchmarks are described in section 5.1 (page 13) in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://people.csail.mit.edu/devadas/pubs/cardis08tem.pdf&quot;&gt;my paper on a successor to the TPM&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;decrypt_3des&lt;/span&gt;&lt;/span&gt; decrypts 24 bytes of data, while &lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;decrypt_3des_long&lt;/span&gt;&lt;/span&gt; and &lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;decrypt_rsa&lt;/span&gt;&lt;/span&gt; work on 128 bytes of data. 3DES is configured in EDE-CBC mode (112 bits of key material) and uses the ISO-9797 method 2 for padding. RSA decryption uses PCKS#1 padding.&lt;br&gt;
&lt;br&gt;
The benchmarks can be reproduced by installing Rubygems, then installing the &lt;i&gt;tem_ruby&lt;/i&gt; gem, and issuing the following commands&lt;br&gt;
&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;font-size:x-small;&quot;&gt;tem_upload_fw # Uploads my JavaCard applet to the active smart-card.&lt;/span&gt;&lt;br&gt;
&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;font-size:x-small;&quot;&gt;tem_bench # Runs the benchmarks.&lt;br&gt;
&lt;/span&gt;&lt;br&gt;
&lt;/div&gt;&lt;br&gt;
NXP JCOP41 v2.2/72k (no longer available)&lt;br&gt;
&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_3des: 0.20757s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_rsa: 0.86173s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_sec: 0.18017s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des: 0.05803s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des_long: 0.08042s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_rsa_long: 0.74047s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_post_buffer: 0.08280s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_simple_apdu: 0.00515s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf: 0.73887s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_3des: 0.78137s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_rsa: 1.43647s&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
NXP JCOP41 v2.2.1/72k (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.usasmartcard.com/component/page,shop.product_details/flypage,shop.flypage/product_id,54/category_id,26/manufacturer_id,0/option,com_virtuemart/Itemid,26/&quot;&gt;usasmartcard.com product link&lt;/a&gt;)&lt;br&gt;
&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_3des: 0.24155s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_rsa: 0.89740s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_sec: 0.18937s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des: 0.08420s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des_long: 0.10800s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_rsa_long: 0.76480s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_post_buffer: 0.08577s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_simple_apdu: 0.00610s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf: 0.83257s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_3des: 0.90033s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_rsa: 1.55637s&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
NXP JCOP41 v2.2.1/72k USB token (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.usasmartcard.com/component/page,shop.product_details/flypage,shop.flypage/product_id,103/category_id,7/manufacturer_id,0/option,com_virtuemart/Itemid,26/&quot;&gt;usasmartcard.com product link&lt;/a&gt;, probably using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.usasmartcard.com/component/page,shop.product_details/flypage,shop.flypage/product_id,134/category_id,26/manufacturer_id,0/option,com_virtuemart/Itemid,26/&quot;&gt;this card&lt;/a&gt;)&lt;br&gt;
&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_3des: 0.41070s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_rsa: 1.23089s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_sec: 0.34530s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des: 0.19010s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des_long: 0.21410s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_rsa_long: 1.05600s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_post_buffer: 0.17213s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_simple_apdu: 0.01000s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf: 1.11310s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_3des: 1.19703s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_rsa: 2.01420s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
NXP JCOP31 v2.2 (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.usasmartcard.com/component/page,shop.product_details/flypage,shop.flypage/product_id,53/category_id,26/manufacturer_id,0/option,com_virtuemart/Itemid,26/&quot;&gt;usasmartcard.com product link&lt;/a&gt;)&lt;br&gt;
&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_3des: 0.84673s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_bound_secpack_rsa: 1.78957s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_blank_sec: 0.78120s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des: 0.23553s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_3des_long: 0.50060s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_devchip_decrypt_rsa_long: 1.54990s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_post_buffer: 0.88864s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_simple_apdu: 0.02813s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf: 1.84374s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_3des: 1.92594s&lt;/span&gt;&lt;br style=&quot;&quot;&gt;&lt;span style=&quot;&quot;&gt;time_vm_perf_bound_rsa: 2.87900s&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4376417828574391409-7470711915701108274?l=blog.costan.us&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/VictorCostan/~4/cNjpM5FmYUk&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
         <author>Victor Costan</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/ab3c4a708d7c1e01</guid>
         <pubDate>Mon, 16 Nov 2009 21:22:00 -0800</pubDate>
      </item>
      <item>
         <title>&lt;br&gt;&lt;br&gt;</title>
         <link>http://page2rss.com/p/251d98f39dbaaf224dc76dab99a66b54_4671871_4673712</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/4a50c7f55c57e2d2</guid>
         <pubDate>Mon, 16 Nov 2009 17:52:00 -0800</pubDate>
      </item>
      <item>
         <title>. Generated on: 2009-11-16.</title>
         <link>http://page2rss.com/p/f2f1d3f209a88c8e7a495da1c4f04bfc_4671293_4672237</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/24fb56fc3e3c0896</guid>
         <pubDate>Sun, 15 Nov 2009 17:17:00 -0800</pubDate>
      </item>
      <item>
         <title>Page2RSS Monitored Page:</title>
         <link>http://page2rss.com/page?url=www.quarl.org/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/deacac4f9359b434</guid>
         <pubDate>Sun, 15 Nov 2009 22:01:03 -0800</pubDate>
      </item>
      <item>
         <title>Page2RSS Monitored Page:</title>
         <link>http://page2rss.com/page?url=www.cs.brown.edu/~hkimura/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/564759fdedb0e984</guid>
         <pubDate>Sun, 15 Nov 2009 21:58:08 -0800</pubDate>
      </item>
      <item>
         <title>Page2RSS Monitored Page:</title>
         <link>http://page2rss.com/page?url=www.cs.brown.edu/~pavlo/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/5c1158250e60867e</guid>
         <pubDate>Sun, 15 Nov 2009 21:58:08 -0800</pubDate>
      </item>
      <item>
         <title>Page2RSS Monitored Page: Daisy Zhe Wang: DaisyZheWang</title>
         <link>http://page2rss.com/page?url=www.cs.berkeley.edu/~daisyw/</link>
         <author>(author unknown)</author>
         <guid isPermaLink="false">tag:google.com,2005:reader/item/d1f443518d9450d8</guid>
         <pubDate>Sun, 15 Nov 2009 11:11:26 -0800</pubDate>
      </item>
      <item>
         <title>Not-a-Bot: Improving Service Availability in the Face of Botnet Attacks</title>
         <link>http://www.mosharaf.com/blog/2009/11/23/not-a-bot-improving-service-availability-in-the-face-of-botnet-attacks/</link>
         <description>&lt;p&gt;R. Gummadi, H. Balakrishnan, P. Maniatis, S. Ratnasamy, “Not-a-Bot: Improving Service Availability in the Face of Botnet Attacks,” &lt;em&gt;NSDI’09&lt;/em&gt;, (April 2009). [&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://berkeley.intel-research.net/maniatis/publications/2009NSDINAB.pdf&quot;&gt;PDF&lt;/a&gt;]&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;In recent years, botnets have become the major originators of email spams, DDoS attacks, and click-frauds on advertisement-based web sites. This paper argues that separating human-generated traffic from botnet-generated activities can improve reliability of various web-based services against botnet attacks. But identifying human-generated traffic in the absence of strong unique identities can be challenging. In this paper, the authors propose NAB (Not-A-Bot), a system to approximately identify and certify human-generated activity in a non-intrusive way.&lt;/p&gt;
&lt;h3&gt;NAB Architecture&lt;/h3&gt;
&lt;p&gt;NAB consists of an attester, a &lt;em&gt;small&lt;/em&gt; trusted software, that runs locally at a host (isolated from the &lt;em&gt;untrusted&lt;/em&gt; OS) and generates attestations corresponding to a request from an application, as well as an external verifier that validates these attestations in a distributed site. There are four main requirements that drive the NAB architecture (attester and verifier) design:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attestations must be generated in response to human requests automatically.&lt;/li&gt;
&lt;li&gt;Attestations must not be transferable from the client on which they are generated to attest traffic originating from another client.&lt;/li&gt;
&lt;li&gt;NAB must benefit users that deploy it without hurting those that do not.&lt;/li&gt;
&lt;li&gt;NAB must preserve the existing privacy and anonymity semantics of applications&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Requirements 1 and 2 are implemented/met in the attester and requirements 3 and 4 are ensured in the verifier.&lt;/p&gt;
&lt;h3&gt;Attester&lt;/h3&gt;
&lt;p&gt;The attester runs on a trusted computing base (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Trusted_computing_base&quot;&gt;TCB&lt;/a&gt;), which is implemented by taking advantage of the Trusted Platform Module (TPM) available is most modern systems. The authors use TPM to create a trusted path between physical input devices and the human activity attester.&lt;/p&gt;
&lt;p&gt;The attester’s sole purpose is to create attestations – when asked for by an application – for legitimate human activity. The authors used a simple t-δ attester, where a attestation is created if there is any input activity in last δ time units. Even though there is a possibility of forging/harvesting user activity in this simpler approach, the authors argue that the botnet will be limited by human activity frequency, which will decrease the number of attacks.&lt;/p&gt;
&lt;p&gt;NAB generates responder-specific, content-specific, and if appropriate, challenger-specific attestations and employs existing cryptographic methods to secure them. It also ensures that attestations cannot be double-spent and cannot be misused by botnets (for a &lt;em&gt;very limited&lt;/em&gt; time window botnets can forge attestations)&lt;/p&gt;
&lt;h3&gt;Verifier&lt;/h3&gt;
&lt;p&gt;Verifier is co-located with the server processing requests. When invoked, the verifier is passed both the attestation and the request. Based on these information (plus the crypto-thing that are in the paper), the verifier checks the validity of the attestation. The authors also discussed different application-specific spam, DDoS, and click-fraud verification policies.&lt;/p&gt;
&lt;h3&gt;Evaluation Results&lt;/h3&gt;
&lt;p&gt;Major results from the evaluation are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCB size can be really small (500 SLOC)&lt;/li&gt;
&lt;li&gt;Attester CPU cost is 10&lt;sup&gt;7&lt;/sup&gt; instructions/attestations&lt;/li&gt;
&lt;li&gt;For simple application changes less than 250 SLOC changes is enough to enable them of NAB&lt;/li&gt;
&lt;li&gt;In the worst case, NAB c