<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14650593</id><updated>2012-01-23T01:35:37.663-05:00</updated><title type='text'>Exploring</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>84</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14650593.post-8105615912198387306</id><published>2010-05-03T17:00:00.001-04:00</published><updated>2010-05-03T16:44:24.826-04:00</updated><title type='text'>Joining Facebook!</title><content type='html'>&lt;p&gt;I'm really excited to announce that I'm going to be joining Facebook to work on the infrastructure team. With all the growth Facebook has seen comes unique challenges in scaling systems. I'm looking forward to working on this.&lt;/p&gt;

&lt;p&gt;Of course, this also means saying good bye to Google and reCAPTCHA. It's been over 3 years since we started working on the crazy idea of getting millions of people to digitize the world's books in their spare time. I'm looking forward to seeing reCAPTCHA continue to grow.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-8105615912198387306?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/8105615912198387306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=8105615912198387306' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8105615912198387306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8105615912198387306'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2010/05/joining-facebook.html' title='Joining Facebook!'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-859533352966003584</id><published>2010-02-01T21:15:00.003-05:00</published><updated>2010-02-01T21:30:58.989-05:00</updated><title type='text'>Juxtapositions</title><content type='html'>&lt;p&gt;From time to time, reCAPTCHA will give users odd juxtapositions of words. I got quite a kick out of seeing this one:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i.somethingawful.com/u/garbageday/photoshop_phriday/2010_01_29/Esplanade_01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px; height: 657px;" src="http://i.somethingawful.com/u/garbageday/photoshop_phriday/2010_01_29/Esplanade_01.jpg" border="0" alt="" /&gt;&lt;/a&gt;

&lt;p&gt;I think this would make a great show!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-859533352966003584?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/859533352966003584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=859533352966003584' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/859533352966003584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/859533352966003584'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2010/02/juxtapositions.html' title='Juxtapositions'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6874439504084479582</id><published>2009-07-10T21:43:00.003-04:00</published><updated>2010-12-21T00:29:36.964-05:00</updated><title type='text'>Recipe: Double Chocolate Chip Peppermint Cookies</title><content type='html'>&lt;p&gt;This cookie is a nice variation on the classic double chocolate chip.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1/2 cup butter (one stick)&lt;/li&gt;
&lt;li&gt;1/2 cup brown sugar&lt;/li&gt;
&lt;li&gt;1/2 cup white sugar&lt;/li&gt;
&lt;li&gt;1 egg&lt;/li&gt;
&lt;li&gt;1/4 tsp vanilla&lt;/li&gt;
&lt;li&gt;1/4 tsp peppermint&lt;/li&gt;
&lt;li&gt;1 cup flower&lt;/li&gt;
&lt;li&gt;1/4 cpu unsweatened cocoa powder&lt;/li&gt;
&lt;li&gt;1/2 tsp baking soda&lt;/li&gt;
&lt;li&gt;1/4 tsp salt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Directions&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Preheat oven to 350F &lt;/li&gt;
&lt;li&gt;Soften butter and mix with eggs, sugar, peppermint and vanilla&lt;/li&gt;
&lt;li&gt;Mix flower, salt, baking soda, and cocoa in a separate bowl&lt;/li&gt;
&lt;li&gt;Beat in the dry ingredients&lt;/li&gt;
&lt;li&gt;Form balls on a cookie tray and bake for 8-10 minutes. Underbake slightly so the cookies are chewy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tip: I've found that I'll eat these cookies far quicker than I really should. In order to ration the cookies, I will mix up a double batch, and freeze the balls of dough. Once the dough is frozen, you can place the balls in a ziplock bag. The cookies can be baked from frozen by adding 2 minutes to the baking time and last a few weeks. Cookies can then be baked in small batches. I can't tell any difference between cookies from frozen dough or fresh dough.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6874439504084479582?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6874439504084479582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6874439504084479582' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6874439504084479582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6874439504084479582'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2009/07/recipe-double-chocolate-chip-peppermint.html' title='Recipe: Double Chocolate Chip Peppermint Cookies'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7082318738441737344</id><published>2009-01-14T14:26:00.002-05:00</published><updated>2009-01-14T14:33:45.085-05:00</updated><title type='text'>Laptop + Multiple Monitors Help</title><content type='html'>&lt;p&gt;I'm trying to get my laptop to display on dual external monitors. I'd appreciate some guidance in getting this configuration set up&lt;/p&gt;

&lt;p&gt;What I have&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Dell Latitude D620 with nVidia Corporation G72M [Quadro NVS 110M/GeForce Go 7300]&lt;/li&gt;
&lt;li&gt;A Dell docking station with dual-link DVI output&lt;/li&gt;
&lt;li&gt;2 Dell 2007FP Monitors&lt;/li&gt;
&lt;li&gt;Ubuntu 8.04&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I want&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When I dock my laptop, the two external monitors are used (I don't really need to use the internal screen as a third monitor)&lt;/li&gt;
&lt;li&gt;When my laptop is undocked, my internal screen activates.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7082318738441737344?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7082318738441737344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7082318738441737344' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7082318738441737344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7082318738441737344'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2009/01/laptop-multiple-monitors-help.html' title='Laptop + Multiple Monitors Help'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7223314844012192625</id><published>2008-11-18T12:46:00.002-05:00</published><updated>2008-11-18T13:02:47.561-05:00</updated><title type='text'>Amazon's CloudFront CDN: disappointing</title><content type='html'>&lt;p&gt;I took a look at &lt;a href="http://aws.amazon.com/cloudfront/"&gt;CloudFront&lt;/a&gt; today. They have really good intentions. The CDN space is quite a mess -- it could easily be a pay-as-you-go, self-service industry. However, players such as Akamai try to make a large profit. The CDN space is especially hard for small sites -- you can't get any reasonable pricing unless you are doing high levels of traffic.&lt;/p&gt;

&lt;p&gt;Amazon wants to change all of that. However, I think they made a number of missteps in their initial offering.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They aren't using it on amazon.com. They use Level(3)'s CDN! Why should anybody consider using a service Amazon isn't using themselves. This is a chance to prove your CDN in real life.&lt;/li&gt;

&lt;li&gt;Tiered pricing. In a self-service model, it doesn't make sense to offer different prices for different bandwidth usages. One customer with 100 TB of traffic is the same as 10 customers with 10 TB of traffic.&lt;/li&gt;

&lt;li&gt;Pay per request. For S3, this made sense. Every request was one disk seek on the servers, and people need to pay for that. However, in a CDN, you are expected to serve from memory. The 1 cent per 10,000 requests effectively adds 6 KB of data to every file. So if you serve a 1 KB file, this increases your cost by 6x. At the very least, the fixed cost per request should be less than that with s3 to account for the lack of disk seeks&lt;/li&gt;

&lt;li&gt;Lack of peering. Doing a traceroute to cloudfront from a few locations (Carnegie Mellon, colos in New York and LA), it appeared that all of my traffic was going over transit links. In contrast, traffic to amazon.com went over fast and cheap peering links.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I do hope that Amazon fixes up CloudFront. It's a fantastic concept. They have the power to force reason into the market.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7223314844012192625?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7223314844012192625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7223314844012192625' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7223314844012192625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7223314844012192625'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/11/amazons-cloudfront-cdn-disappointing.html' title='Amazon&apos;s CloudFront CDN: disappointing'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-9109099537020780469</id><published>2008-05-14T02:08:00.002-04:00</published><updated>2008-05-14T02:22:42.608-04:00</updated><title type='text'>More human computation with GWAP</title><content type='html'>&lt;p&gt;It's oh so exciting to see that &lt;a href="http://gwap.com"&gt;GWAP&lt;/a&gt; (games with a purpose) has launched. GWAP is part of the research on human computation that started the &lt;a href="http://recaptcha.net"&gt;reCAPTCHA&lt;/a&gt; project. GWAP is a framework which allows researchers to create fun games which generate useful data. For example, "Matchin" is a game where you and a random stranger on the internet get a pair of images. You must agree on which one is "better" without talking with each other. The game is fast, fun, and very addicting. From this game, you can actually get quite a bit of useful information. Most importantly, it's possible to find the "good" photos from a site like Flicker.&lt;/p&gt;

&lt;p&gt;What I find most exciting about GWAP is that it is a production service. Many researchers will write papers about ideas, maybe create a prototype or a mock-up. However, they don't really do anything to bring their ideas to fruition. Luis's work is different. For example, with reCAPTCHA, we've spent months developing systems for serving CAPTCHAs to the internet. Most of this time was spent making our code reliable, scalable, and fast. Our efforts really payed off. reCAPTCHA now serves CAPTCHAs on a wide range of sites including Ticketmaster, Facebook, StumbleUpon, Twitter and Bebo.&lt;/p&gt;

&lt;p&gt;I think this tendency for productionizing is going to pay off with GWAP. Lots of time was spent on things like UI design and scalability. The UI makes the games fun to play, the scalability makes sure that the team can have a real world impact.&lt;/p&gt;

&lt;p&gt;Congrats to Mike and the rest of the GWAP team on a job well done.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-9109099537020780469?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/9109099537020780469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=9109099537020780469' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/9109099537020780469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/9109099537020780469'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/05/more-human-computation-with-gwap.html' title='More human computation with GWAP'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5790443125850837799</id><published>2008-04-01T21:54:00.002-04:00</published><updated>2008-04-01T21:59:12.167-04:00</updated><title type='text'>Wanted: Temporary Palo Alto Housing</title><content type='html'>&lt;p&gt;I'm looking for 1 bedroom in area below between May 1 and Aug 20 (so hopefully, something furnished). Closer to the green arrow thingy is better. Please email me at bmaurer@andrew.cmu.edu if you have something like this.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.contrib.andrew.cmu.edu/~bmaurer/housing-wanted.png"/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5790443125850837799?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5790443125850837799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5790443125850837799' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5790443125850837799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5790443125850837799'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/04/wanted-temporary-palo-alto-housing.html' title='Wanted: Temporary Palo Alto Housing'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-8627564010808272805</id><published>2008-03-26T15:40:00.000-04:00</published><updated>2008-03-26T15:39:24.145-04:00</updated><title type='text'>The Open Source Google Stack</title><content type='html'>&lt;p&gt;The open source community is slowly growing a software stack that emulates a number of internal Google technologies. What's interesting is that the stack is being developed by a number of tech companies -- ranging from giants (mostly Yahoo!) to medium size firms (Facebook) to startup companies (Last.fm, PowerSet, Krugle, Veoh). So far, the following pieces of infrastructure have been developed&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Hadoop&lt;/b&gt; is an umbrella project that covers a number of technologies: the Hadoop Filesystem (replacing Google's GFS), Map-Reduce, and HBase a database inspired by BigTable. In short, Hadoop covers storage technology as well as the infrastructure needed to compute over large amounts of storage.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Thrift&lt;/b&gt; is a RPC system which was initially developed by Facebook. While, in some senses, there is no lack of RPC-subsystems out there, Thrift is different. Thrift focuses on inter-language RPC. Interop between a large number of languages is transparent. Thrift also avoids the bloat that comes with some of the older RPC systems, such as SOAP. Finally, Thrift doubles as a serialization system (sort of like Python's Pickle or Java serialization). Because the binary data it generates is compact, it can be used for logging or in a database. Thrift is partially modeled off of Google's Protocol Buffers.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;ZooKeeper&lt;/b&gt; is a service for coodination between distributed servers simplifying functions such as master election, configuration lookup, and distributed locks. ZooKeeper was recently open sourced by Yahoo.&lt;/p&gt;

&lt;p&gt;These projects seem to be the start of a positive trend: a number of companies are realizing that in order to rapidly develop new services, they need to have infrastructure. In contrast to Google's typical strategy, these companies are sharing their work with each other. I think that this collaboration is critical to developing a robust infrastructure.&lt;/p&gt;

&lt;p&gt;In some ways, I think that these developments put Google in a tough spot. It's not unforeseeable that these open source stack will grow to point where it is superior to Google's own stack. It would be unrealistic for Google to migrate to these new technologies. If there's going to be an open version of Google's technology, it would be in Google's best interest for that implementation to be their own. Not only would Google benefit from external improvements to their stack, it might make it easier for them to acquire new startups and integrate their technology into Google.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-8627564010808272805?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/8627564010808272805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=8627564010808272805' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8627564010808272805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8627564010808272805'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/03/open-source-google-stack.html' title='The Open Source Google Stack'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5814843171603691287</id><published>2008-02-18T11:05:00.002-05:00</published><updated>2008-02-18T11:51:10.479-05:00</updated><title type='text'>Silicon Mechanics</title><content type='html'>&lt;p&gt;I'm looking at &lt;a href="http://www.siliconmechanics.com/"&gt;Silicon Mechanics&lt;/a&gt; for potentially buying a few rack mount servers. I'm wondering if anybody has good (or bad) experience dealing with them.&lt;/p&gt;

&lt;p&gt;On paper, it looks like they have prices that are much cheaper than Dell (of course). Also, they have a nice thing where they can have two servers in a 1U (16 cores in a 1U... that's alot). I just want to see if anybody here has some real experience with them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5814843171603691287?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5814843171603691287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5814843171603691287' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5814843171603691287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5814843171603691287'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/02/silicon-mechanics.html' title='Silicon Mechanics'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4563708913853058045</id><published>2008-02-06T10:18:00.000-05:00</published><updated>2008-02-06T10:25:56.976-05:00</updated><title type='text'>Windows Error Messages</title><content type='html'>&lt;p&gt;While being out of disk space on a server isn't generally much fun, this error message made it worth the while&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_cTHNT2OZ0ok/R6nQOv3I5HI/AAAAAAAAACg/oUSLRpsdqSo/s1600-h/delete.png"&gt;&lt;img style="cursor: pointer;" src="http://www.contrib.andrew.cmu.edu/~bmaurer/delete.png" alt="" id="BLOGGER_PHOTO_ID_5163887399541466226" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4563708913853058045?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4563708913853058045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4563708913853058045' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4563708913853058045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4563708913853058045'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2008/02/windows-error-messages.html' title='Windows Error Messages'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6120147383028151464</id><published>2007-11-10T17:00:00.000-05:00</published><updated>2007-11-10T17:37:33.995-05:00</updated><title type='text'>Randall Munroe (xkcd author) comes to CMU</title><content type='html'>&lt;p&gt;Randall Munroe came to CMU to give a talk yesterday. It was the most attended talk of the semester. Randall's talk was fantastic -- he said that he is trying to fill part of his bedroom with plastic balls (like in one of his cartoons). He also drew two mini-cartoons while talking, which was very cool. Finally, he set two very useful standards. First, he declared that punctuation need not go inside quotation mark (eg, did she say "I love you"?). Second, he declared himself president of the Internet (so that another evil person wouldn't take it.&lt;/p&gt;

&lt;p&gt;I guess what I really like about Randall's talk (and about XKCD) is that it's a way to relax and reflect on being a tech person. It feels like The Daily Show for geeks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6120147383028151464?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6120147383028151464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6120147383028151464' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6120147383028151464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6120147383028151464'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/11/randall-munroe-xkcd-author-comes-to-cmu.html' title='Randall Munroe (xkcd author) comes to CMU'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5945137199197339450</id><published>2007-11-08T14:10:00.002-05:00</published><updated>2007-11-08T14:15:44.317-05:00</updated><title type='text'>New reCAPTCHA APIs: i18n and Theming</title><content type='html'>We're really proud to announce the release of two new APIs for the client side.
&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;Internationalization&lt;/span&gt;
For users of our default theme, we've added a way to request the display of the user interface in a different language. We've translated our UI and help page into the following languages
&lt;p&gt;
German&lt;br/&gt;
Spanish&lt;br/&gt;
French&lt;br/&gt;
Dutch&lt;br/&gt;
Portuguese&lt;br/&gt;
Turkish&lt;br/&gt;
Russian&lt;br/&gt;
&lt;/p&gt;&lt;p&gt;
We're looking into getting translations for other languages. If your language isn't supported, you can use the theming API to allow you to customize the user interface.
&lt;/p&gt;&lt;p&gt;
You can take a look at an example of internationalization at:

&lt;a href="http://recaptcha.net/fastcgi/demo/recaptcha?lang=ru" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://recaptcha.net/fastcgi&lt;wbr&gt;/demo/recaptcha?lang=ru&lt;/a&gt;
&lt;a href="http://recaptcha.net/fastcgi/demo/recaptcha?lang=es"&gt; http://recaptcha.net/fastcgi/demo/recaptcha?lang=es&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;Theming&lt;/span&gt;
The ability to customize the appearance of reCAPTCHA has been a frequent request. Our Theming API allows you to completely customize the way reCAPTCHA looks. For example you can see a demo at:
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://recaptcha.net/fastcgi/demo/customtheme" target="_blank"&gt;http://recaptcha.net/fastcgi/demo/customtheme&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
In this demo, we show how you can completely remove the UI of reCAPTCHA and make a non-themed interface. You can use this as a starting point for blending reCAPTCHA into your site.
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;More information&lt;/span&gt;
To get more information about these new APIs, look at our client API guide:
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://recaptcha.net/apidocs/captcha/client.html"&gt;http://recaptcha.net/apidocs/captcha/client.html &lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5945137199197339450?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5945137199197339450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5945137199197339450' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5945137199197339450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5945137199197339450'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/11/new-recaptcha-apis-i18n-and-theming_9105.html' title='New reCAPTCHA APIs: i18n and Theming'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4546406464815732905</id><published>2007-10-18T20:10:00.000-04:00</published><updated>2007-10-18T20:22:58.258-04:00</updated><title type='text'>Updating Ubuntu -- please make it faster</title><content type='html'>&lt;p&gt;Dear Ubuntu hackers,&lt;/p&gt;

&lt;p&gt;Gusty is out. I want it. But the update process for your wonderful operating system is broken. It seems that this process on getting files from a central machine. Said machines seem to be overwhelmed by other users who also want to upgrade -- they won't even respond to a TCP SYN packet&lt;/p&gt;

&lt;p&gt;In the future, it'd be really nice if this process used mirrors so that it wouldn't be as flooded.&lt;/p&gt;

&lt;p&gt;If the file really does need to be centralized, choose the host carefully. S3 is very good at this stuff. Akamai does even better (though they'll charge you an arm and a leg).&lt;/p&gt;

&lt;p&gt;PS: now that I got past accessing that server, Gusty is downloading at 4 megabytes per second, thanks to Internet 2. It would have been a lot fast if it used the mirror for that one small part&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4546406464815732905?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4546406464815732905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4546406464815732905' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4546406464815732905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4546406464815732905'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/10/updating-ubuntu-please-make-it-faster.html' title='Updating Ubuntu -- please make it faster'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-1442602263022840845</id><published>2007-10-10T00:45:00.000-04:00</published><updated>2007-10-10T00:47:10.790-04:00</updated><title type='text'>XKCD teaches SQL Injection</title><content type='html'>The hacker inside me found this funny&lt;p&gt;
&lt;a href="http://xkcd.com/327/"&gt;&lt;img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-1442602263022840845?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/1442602263022840845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=1442602263022840845' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/1442602263022840845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/1442602263022840845'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/10/xkcd-teaches-sql-injection.html' title='XKCD teaches SQL Injection'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4641163848076679513</id><published>2007-09-21T19:56:00.000-04:00</published><updated>2007-09-21T20:00:06.349-04:00</updated><title type='text'>Randy Pausch: an inspiring video</title><content type='html'>Randy Pausch is a professor at Carnegie Mellon who believes in making programming, specifically for entertainment purposes, accessible to everybody. Sadly, Professor Pausch has an untreatable form of cancer which will take his life in the next few months. This week, he gave a talk which is truly inspirational. This is a person I wish I could have gotten to know.&lt;br&gt;

&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-5700431505846055184&amp;hl=en" flashvars=""&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4641163848076679513?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4641163848076679513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4641163848076679513' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4641163848076679513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4641163848076679513'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/09/randy-pausch-inspiring-video.html' title='Randy Pausch: an inspiring video'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-1489009350683092042</id><published>2007-09-21T11:34:00.000-04:00</published><updated>2007-09-21T11:36:50.165-04:00</updated><title type='text'>M-x gdb</title><content type='html'>I &lt;i&gt;really&lt;/i&gt; wish somebody had told me about this a long time ago:&lt;br&gt;
&lt;img src="http://www.gnu.org/software/emacs/tour/images/gdb.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-1489009350683092042?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/1489009350683092042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=1489009350683092042' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/1489009350683092042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/1489009350683092042'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/09/m-x-gdb.html' title='M-x gdb'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7864139484082728766</id><published>2007-09-04T16:29:00.000-04:00</published><updated>2007-09-04T21:30:04.250-04:00</updated><title type='text'>Firefox Caching</title><content type='html'>&lt;p&gt;&lt;a href="http://primates.ximian.com/~federico/news-2007-09.html#firefox-memory-1"&gt;Federico&lt;/a&gt; posted about some work he was doing on making Firefox not cache as many uncompressed bitmaps in memory. I was playing around with the cache stuff and noticed something: my Firefox cache is full of youtube videos. YouTube videos aren't exactly the best thing for Firefox to cache. My internet connection is fast enough that streaming the videos works just fine. I suspect that most people who use online video frequently do so on a connection that can support streaming (otherwise, YouTube would be painfully slow, and they'd go do something else).&lt;/p&gt;

&lt;p&gt;It turns out that Firefox's cache is based only on least-recently-used. So, let's say you have a 50 MB cache. Right now, all 50 MB of it is full with cached javascript, css, images, etc. You go to youtube and start watching a 10 MB movie. 20% of your cache gets blown away. In all likelihood, you'll never view that video again.&lt;/p&gt;

&lt;p&gt;Even worse is if you listen to a flash-based media player. The MP3s that this downloads are cached just like anything else. So if you listen to 50 MB worth of music your disk cache gets blown away.&lt;/p&gt;

&lt;p&gt;Probably LRU isn't the best technique to use here. I'm not sure how one would evaluate various choices (what is a representative test set of browsing sessions?)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7864139484082728766?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7864139484082728766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7864139484082728766' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7864139484082728766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7864139484082728766'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/09/firefox-caching.html' title='Firefox Caching'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7331319491466679012</id><published>2007-08-30T19:53:00.000-04:00</published><updated>2007-08-30T20:07:49.658-04:00</updated><title type='text'>Yay Dual Homing!</title><content type='html'>&lt;p&gt;Today, we had our first drill with dual homing on reCAPTCHA. In Pittsburgh, the water main that serves the Carnegie Mellon area broke today, causing a complete water outage on campus. This has resulted in many servers being shut down. reCAPTCHAs servers were kept up, as they are production servers, however we were told that it was possible they'd be shut down.&lt;/p&gt;

&lt;p&gt;It's times like these when you just love having a backup. We have a DNS service that does automatic health checking and routes away from unplanned outages. However, with DNS it takes a few minutes for these sorts of changes to take affect. We proactively switched away our traffic off of the pittsburgh servers.&lt;/p&gt;

&lt;p&gt;One of the funny things about using DNS for Dual Homing is how long it takes to really kick in. We're still getting requests to our pittsburgh servers even hours after we made the switch. This is one reason it's important to have DNS not be the only load balancing solution (you need a L7 or L4 load balancer as well)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7331319491466679012?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7331319491466679012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7331319491466679012' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7331319491466679012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7331319491466679012'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/08/yay-dual-homing.html' title='Yay Dual Homing!'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-800498391192900919</id><published>2007-08-28T15:42:00.000-04:00</published><updated>2007-08-28T15:56:03.277-04:00</updated><title type='text'>Facebook 2.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_cTHNT2OZ0ok/RtR673Dy6qI/AAAAAAAAAB8/4tqE01D4XN4/s1600-h/Screenshot-Facebook+%7C+Home+-+Mozilla+Firefox.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_cTHNT2OZ0ok/RtR673Dy6qI/AAAAAAAAAB8/4tqE01D4XN4/s400/Screenshot-Facebook+%7C+Home+-+Mozilla+Firefox.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5103839446528354978" /&gt;&lt;/a&gt;

&lt;p&gt;So if your profile says you are single, and looking for women, single women looking for men might soon get a higher ranking in search results? I'm not sure what other "intentions" facebook might know about&lt;/p&gt;

&lt;p&gt;Of course, this could open up a whole new era of social networking: I'd call if AdFaces. If you feel that you are not showing up often enough in search results, you can bid for clicks on your profile with a CPC model. Or maybe Facebook can experiment with a cost-per-action model. Then we'll need a product like Facebook Analytics to improve profile conversion rate, and FaceSense to allow publishers to embed targeted profile advertisements on their website.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-800498391192900919?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/800498391192900919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=800498391192900919' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/800498391192900919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/800498391192900919'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/08/facebook-20.html' title='Facebook 2.0'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_cTHNT2OZ0ok/RtR673Dy6qI/AAAAAAAAAB8/4tqE01D4XN4/s72-c/Screenshot-Facebook+%7C+Home+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6401599019800880157</id><published>2007-07-17T01:13:00.000-04:00</published><updated>2007-07-17T02:19:44.196-04:00</updated><title type='text'>Making bugs... and fixing them</title><content type='html'>&lt;p&gt;Two interesting bugs from today.&lt;/p&gt;

&lt;p&gt;First, you gotta be careful with order of operations. I wrote this code:&lt;/p&gt;

&lt;pre&gt;
int someValue = ...;
storePref(MY_PREF_NAME, "" + someValue + 1);
&lt;/pre&gt;

&lt;p&gt;The code looks innocent enough. However, order of operations kicks in here. The compiler translates this as: (("" + someValue) + 1), or Integer.toString(someValue) + Integer.toString (1). So rather than adding one, we multiply by 10 and &lt;span style="font-style:italic;"&gt;then&lt;/span&gt; add one :-). The fun part about this experience was that I had &lt;a href="http://gafter.blogspot.com/"&gt;Neal Gafter&lt;/a&gt; sitting next to me to explain exactly what I'd done, and also to point out where this problem is discussed in his fantastic book &lt;a href="http://www.javapuzzlers.com/"&gt;Java Puzzlers&lt;/a&gt; (Neal gave me a copy, which I've been meaning to read).&lt;/p&gt;

&lt;p&gt;In the "Fixing bugs" column, I was testing something out on IE 5.0 today (yes, five-point-oh, released in 1999. Sadly, it sill has some market share). The box had Google.com as the homepage, and I noticed that it displayed a JavaScript error (for older versions of IE, displaying this error was a default setting). After reporting this, it turns out that it was actually an interaction with Google Desktop. Now, I don't expect that there are &lt;i&gt;that&lt;/i&gt; many users with IE 5.0 and Google Desktop, but with millions of users, "not a lot" means thousands or tens of thousands of people.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6401599019800880157?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6401599019800880157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6401599019800880157' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6401599019800880157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6401599019800880157'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/07/making-bugs-and-fixing-them.html' title='Making bugs... and fixing them'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6355793633292019927</id><published>2007-07-10T19:39:00.000-04:00</published><updated>2007-07-10T19:55:06.724-04:00</updated><title type='text'>Yahoo's and Microsoft's CAPTCHAs likely NOT broken</title><content type='html'>&lt;p&gt;BitDefender went a bit overboard in their claim about CAPTCHAs. Their statement about CAPTCHAs was issued as a &lt;a href="http://www.bitdefender.com/NW516-en--Trojan-Uses-Hotmail-Yahoo-as-Spam-Hosts.html"&gt;press release&lt;/a&gt; (which clearly has meet their goals of getting press -- regardless of the accuracy of their statements). The article states that about 500 accounts are being created per hour. This is about the effort of one person solving CAPTCHAs. If they had actually broken the CAPTCHAs of Hotmail and Yahoo, there would be tens of thousands of accounts every hour. The article also mentions that about 15,000 accounts has been created. At 2 cents per CAPTCHA, that's a $300 investment to manually solve the CAPTCHAs (this rate is easily obtainable in some countries). It's extremely unlikely that one could hire a person to break the CAPTCHAs of Yahoo and Hotmail for this price. Also, if you're working on a virus-type program, one of the easiest ways to generate CAPTCHA solutions would be to use your infected users (eg, make them type in a CAPTCHA once per day. If you integrate it into the web browser, it might not raise suspicion).&lt;/p&gt;

&lt;p&gt;The information that BitDefender has published actually suggests that these spammers/virus makers have &lt;i&gt;not&lt;/i&gt; beaten CAPTCHAs using OCR&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6355793633292019927?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6355793633292019927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6355793633292019927' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6355793633292019927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6355793633292019927'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/07/yahoos-and-microsofts-captchas-likely.html' title='Yahoo&apos;s and Microsoft&apos;s CAPTCHAs likely NOT broken'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-3717946093724841030</id><published>2007-06-27T14:42:00.000-04:00</published><updated>2007-06-27T15:20:45.894-04:00</updated><title type='text'>Life at Google</title><content type='html'>&lt;p&gt;This &lt;a href="http://no2google.wordpress.com/2007/06/24/life-at-google-the-microsoftie-perspective/"&gt;blog&lt;/a&gt; is pretty funny. It's sort of like what the Daily Show might say about Google -- the facts are mostly true (some are pretty out-dated), but they're twisted in the opposite direction of how things actually are.
&lt;/p&gt;

&lt;p&gt;The blog entry got me thinking about what I like and don't like about an internship at Google. One of my favorite things is the freedom to set my own hours. I personally have an aversion to waking up any time before 10am. Usually, I wake up, read some blogs, check personal email and reCAPTCHA support email (I can't check Google email remotely as an intern), then I walk to work around 11:30-12:30. Having the free meals every day (I rarely get to take advantage of breakfast, which ends at 9:30) is a huge plus. The blog article hinted at the end how huge of a factor the free food actually is. It's a relatively inexpensive perk that makes a huge difference.&lt;/p&gt;

&lt;p&gt;The comments about how the developer's work areas are laid out is also really interesting. The first time I saw the Google layout, I was a bit surprised. "I thought I was getting an office!". I ended up really liking this in the end. Before Google, when working on the Mono project, the primary way to communicate with other people was IRC. When I had to ask a question, sometimes it wasn't always possible to get a response right away. At Google, my coworkers are sitting very close by. I can work something out on a whiteboard with them. I don't have to walk a long way to their office.&lt;/p&gt;

&lt;p&gt;One thing the article didn't mention (probably because it's a problem that's worse at MSFT than Google) is that going into a big environment like Google can be intimidating. With open source, building things was always easy. ./configure; make; make install. The process takes about  10 minutes the first time, 2-3 minutes every day, depending on how many changes. At Google (and I'm sure pretty much any place similar), checking things out can be an adventure. A simple build process is probably an advantage of working on an open source project, or at a smaller company.&lt;/p&gt;

&lt;p&gt;At the end of the day, the thing I really enjoy about Google is the access to the vast repository of interesting code Google has to offer. Being able to see how a Google product works, under the hood, is just an amazing experience. I remember going snorkeling on an 8th grade trip to the Bahamas. The excitement of being able to see ocean life for the first time is very similar to my experience of being able to look into the moving parts of Google. Surely this isn't something unique to Google. I'm sure there are as many fascinating moving parts inside Microsoft, or many other large companies.&lt;/p&gt;

&lt;p&gt;On another note, the reCAPTCHA launch went fantastically well. I was happy and relieved that we didn't have any embarrassing incidents like crashing under the load of Digg (Our servers handled it just fine!). We've had some exciting customers adopting our product. I hope to write more soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-3717946093724841030?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/3717946093724841030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=3717946093724841030' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/3717946093724841030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/3717946093724841030'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/06/life-at-google.html' title='Life at Google'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-2520950564588619238</id><published>2007-06-11T04:08:00.000-04:00</published><updated>2007-06-11T04:49:58.618-04:00</updated><title type='text'>NYTimes Article on CAPTCHAs</title><content type='html'>The &lt;a href="http://www.nytimes.com/2007/06/11/technology/11code.html?ref=technology&amp;pagewanted=all"&gt;New York Times&lt;/a&gt; is running an article today on CAPTCHAs. The article really misses some key points. For example, it talks about the CAPTCHAs on YouTube. YouTube's CAPTCHA is really, really bad. The CAPTCHA is mis-designed, using different colors to attempt to provide security. I can't imagine solving this as a color blind user, it must be nearly impossible. Most CAPTCHA providers have migrated to using a monochrome CAPTCHA (for example Google, Yahoo and MSN). The way to create a challenging CAPTCHA today is to make segmentation difficult. This can be achieved without causing as much pain for humans.
&lt;p&gt;

Then there's this Asirra thing. Did anybody from the Times actually try it? Here's an &lt;b&gt;unscalled&lt;/b&gt; image of what it looks like:

&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_cTHNT2OZ0ok/Rm0HDWZdGJI/AAAAAAAAAB0/YHepiuT2KJ4/s1600-h/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_cTHNT2OZ0ok/Rm0HDWZdGJI/AAAAAAAAAB0/YHepiuT2KJ4/s400/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5074720109249763474" /&gt;&lt;/a&gt;

&lt;p&gt;

Now, you can hover over an image for a larger version. But now to solve one of these CAPTCHAs, you've got to hover over 12 images, and make a decision on each. Asirra is undeniably cute, but it's not clear that it's all that much easier than the current, well designed, CAPTCHAs. The security of Asirra is also unclear. It'd be interesting to see what happens if Asirra is ever put in front of a high value target (something that can be used to send email, host pagerank-gaining links, or host porn/warez). I have a feeling that some spammer would find a way to abuse a botnet and take advantage of some of the design issues in Asirra.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-2520950564588619238?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/2520950564588619238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=2520950564588619238' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2520950564588619238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2520950564588619238'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/06/nytimes-article-on-captchas.html' title='NYTimes Article on CAPTCHAs'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_cTHNT2OZ0ok/Rm0HDWZdGJI/AAAAAAAAAB0/YHepiuT2KJ4/s72-c/Screenshot.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-2444028090216491265</id><published>2007-05-23T16:31:00.000-04:00</published><updated>2007-11-09T10:40:42.766-05:00</updated><title type='text'>reCAPTCHA: A new way to fight spam</title><content type='html'>&lt;p&gt;
You've probably seen a &lt;a href="http://recaptcha.net/captcha.html"&gt;CAPTCHA&lt;/a&gt; before. It's those funky letters you have to enter before you sign up for an account on almost any website. I'm proud to announce a new type of CAPTCHA: &lt;a href="http://recaptcha.net/"&gt;reCAPTCHA&lt;/a&gt;: (&lt;a href="http://recaptcha.net/learnmore.html"&gt;click&lt;/a&gt; to see a live demo!).
&lt;/p&gt;

&lt;div&gt;
&lt;a href="http://recaptcha.net/learnmore.html"&gt;&lt;img src="http://bp3.blogger.com/_cTHNT2OZ0ok/RlSl1qdzvqI/AAAAAAAAABs/DtXk0sM80CM/s400/recaptcha.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5067857822049615522" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;You might notice that reCAPTCHA has two words. Why? reCAPTCHA is more than a CAPTCHA, it also helps to digitize old books. One of the words in reCAPTCHA is a word that the computer knows what it is, much like a normal CAPTCHA. However, the other word is a word that the computer can't read. When you solve a reCAPTCHA, we not only check that you are a human, but use the result on the other word to help read the book!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cs.cmu.edu/~biglou/"&gt;Luis von Ahn&lt;/a&gt; and myself estimated that about 60 million CAPTCHAs are solved every day. Assuming that each CAPTCHA takes 10 seconds to solve, this is over 160,000 human hours per day (that's about 19 &lt;i&gt;years&lt;/i&gt;). Harnessing even a fraction of this time for reading books will greatly help efforts in digitalizing books.&lt;/p&gt;

&lt;p&gt;reCAPTCHA provides an easy to use &lt;a href="http://recaptcha.net/apidocs/captcha/"&gt;API&lt;/a&gt; for putting CAPTCHAs on your site. Installing is as easy as adding a few lines of code to your HTML and then making a HTTP POST request to our servers to verify the solution. We also wrote plugins for &lt;a href="http://recaptcha.net/plugins/wordpress/"&gt;WordPress&lt;/a&gt;, &lt;a href="http://recaptcha.net/plugins/mediawiki/"&gt;MediaWiki&lt;/a&gt;, and &lt;a href="http://recaptcha.net/plugins/phpbb/"&gt;phpBB&lt;/a&gt; to make it very easy to integrate.&lt;/p&gt;

&lt;p&gt;One other interesting service reCAPTCHA provides is a way to securely obfuscate emails. Many sites display emails like bmaurer [at] foo [dot] com or use hacks with tables, javascript or encodings to get the same effect. Spammers are getting smarter and figuring out these tricks. Spammers are especially diligent at working around the strategies of well known open source software. Consider this warning on bugzilla.mozilla.org:&lt;/p&gt;

&lt;blockquote&gt;Although steps are taken to hide addresses from email harvesters, the spammers are continually getting better technology and it is almost guaranteed that the address you use with Bugzilla will get spam.&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://mailhide.recaptcha.net/"&gt;reCAPTCHA Mailhide&lt;/a&gt; provides a scalable solution to email obfuscation that can be widely deployed without being breakable. Mailhide provides a way to encrypt a user's email with a key only reCAPTCHA knows. reCAPTCHA will only display the email address when the user solves a CAPTCHA. With reCAPTCHA, I can display my email address as bmau&lt;a href="http://mailhide.recaptcha.net/d?k=01Atc0uJ8RW6_JzUsp12LmzA==&amp;amp;c=YAKdZX9OtFrZA2IkuUKlsqLExAvjy_6nQ7wujtZIdYE=" onclick="window.open('http://mailhide.recaptcha.net/d?k=01Atc0uJ8RW6_JzUsp12LmzA==&amp;amp;c=YAKdZX9OtFrZA2IkuUKlsqLExAvjy_6nQ7wujtZIdYE=', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;" title="Reveal this e-mail address"&gt;...&lt;/a&gt;@andrew.cmu.edu. If you click on the three dots and solve a CAPTCHA, you can see my address. Mailhide provides a way for individual users to encode their email address as well as an API for services (like Bugzilla) to share an encryption key with reCAPTCHA.&lt;/p&gt;

&lt;p&gt;If you're suffering problems with spam, take a look at &lt;a href="http://recaptcha.net/"&gt;reCAPTCHA&lt;/a&gt;. Not only can you solve your problems with spam, you can help preserve mankind's written history into the digital age!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-2444028090216491265?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/2444028090216491265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=2444028090216491265' title='74 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2444028090216491265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2444028090216491265'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/05/recaptcha-new-way-to-fight-spam.html' title='reCAPTCHA: A new way to fight spam'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_cTHNT2OZ0ok/RlSl1qdzvqI/AAAAAAAAABs/DtXk0sM80CM/s72-c/recaptcha.png' height='72' width='72'/><thr:total>74</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-262715839841602700</id><published>2007-05-14T15:30:00.000-04:00</published><updated>2007-05-14T16:04:09.818-04:00</updated><title type='text'>LD_LIBRARY_PATH empty entries</title><content type='html'>&lt;p&gt;Many of us developers have a bashrc that has lines like:

&lt;p&gt;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/install/lib

&lt;p&gt;I've always known that this isn't perfect, that one should check $LD_LIBRARY_PATH isn't empty, but had always thought it was just a minor point. It turns out that the loader sees an empty entry as meaning the current working directory. This means that it looks there for libraries.

&lt;p&gt;The reason I noticed this is because I was using sshfs to mount something on my workstation in Pittsburgh from my laptop in California. When I ran any command (for example "ls"), the loader would look for tons of libraries. Each one of these libraries, it'd execute a stat for. A round trip between Pittsburgh and California is 90ms... so you can imagine everything was quite slow.

&lt;p&gt;Of course, there are security implications too. I'm not that worried about a rogue directory on my laptop, but on shared systems (such as some of the university ones), I can imagine this being a risk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-262715839841602700?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/262715839841602700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=262715839841602700' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/262715839841602700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/262715839841602700'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/05/ldlibrarypath-empty-entries.html' title='LD_LIBRARY_PATH empty entries'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-9039502811720657316</id><published>2007-05-09T01:36:00.000-04:00</published><updated>2007-05-09T01:39:14.448-04:00</updated><title type='text'>In the Bay Area...</title><content type='html'>Starting this Saturday I'll be in the Bay Area, specifically Mountain View, for my internship at &lt;a href="http://google.com"&gt;Google&lt;/a&gt;. While there, I'll be working on &lt;a href="http://calendar.google.com/"&gt;Google Calendar&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-9039502811720657316?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/9039502811720657316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=9039502811720657316' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/9039502811720657316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/9039502811720657316'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/05/in-bay-area.html' title='In the Bay Area...'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6165596249579972742</id><published>2007-04-05T15:33:00.000-04:00</published><updated>2007-04-05T15:45:46.848-04:00</updated><title type='text'>A new spam technique</title><content type='html'>A spammer got very clever in terms of ways to make money&lt;p&gt;

&lt;/p&gt;&lt;blockquote&gt;
Subject: Search on Google raise money for charity

Dooniz is now affiliated with Google. That will permit to redistribute a part of the money made on Internet to charity foundations. Internet users
can make a difference by search Google using Dooniz.com. A simple click can help children in difficulty or bring more money to cancer or climatic
changes researches&lt;/blockquote&gt;

&lt;p&gt;This person basically created a homepage with loads of affiliate links, and claims that it helps charity (the site says 75% goes to charity. Yeah, right). Primarily, Google is advertised (using the site specific search stuff that AdSense provides). People get convinced they are helping charity when very little of the money, if any, will actually go that, make it their homepage, the dude profits.&lt;/p&gt;

&lt;p&gt;Hopefully, Google will prevent the guy from cashing in on spamming...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6165596249579972742?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6165596249579972742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6165596249579972742' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6165596249579972742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6165596249579972742'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/04/new-spam-technique.html' title='A new spam technique'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4023485939072632743</id><published>2007-03-30T11:22:00.000-04:00</published><updated>2007-03-30T11:28:10.182-04:00</updated><title type='text'>Google Job Ads</title><content type='html'>&lt;p&gt;Google likes to advertise job positions with Adwords. I was searching for something about the HTTP protocol and encountered this Google ad:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_cTHNT2OZ0ok/Rg0rsxppuXI/AAAAAAAAABg/W_FrJS93xtY/s1600-h/googlehttp.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_cTHNT2OZ0ok/Rg0rsxppuXI/AAAAAAAAABg/W_FrJS93xtY/s400/googlehttp.png" alt="" id="BLOGGER_PHOTO_ID_5047738805594470770" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;Nice to see a sense of humor in the ad&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4023485939072632743?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4023485939072632743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4023485939072632743' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4023485939072632743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4023485939072632743'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/03/google-job-ads.html' title='Google Job Ads'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_cTHNT2OZ0ok/Rg0rsxppuXI/AAAAAAAAABg/W_FrJS93xtY/s72-c/googlehttp.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-952738422682426265</id><published>2007-03-02T17:05:00.000-05:00</published><updated>2007-03-02T17:11:51.006-05:00</updated><title type='text'>Gnomefiles needs love</title><content type='html'>Eugenia Loli-Queru sent me a quick note today that &lt;a href="http://gnomefiles.org/"&gt;GNOMEfiles&lt;/a&gt; is in need of an owner. The site gets 25,000 pages daily on average. This seems like a pretty important resource for the GNOME community, something worth keeping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-952738422682426265?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/952738422682426265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=952738422682426265' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/952738422682426265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/952738422682426265'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/03/gnomefiles-needs-love.html' title='Gnomefiles needs love'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5776006929521231423</id><published>2007-02-28T22:44:00.000-05:00</published><updated>2007-03-01T01:02:53.045-05:00</updated><title type='text'>Google's CAPTCHA Broken?</title><content type='html'>A few months ago, I found a nice trick that let me read comments on my blog without polling for them. GData allows you to get a ATOM feed of comments on your blog. For example mine is:
&lt;a href="http://bmaurer.blogspot.com/feeds/comments/default"&gt;http://bmaurer.blogspot.com/feeds/comments/default&lt;/a&gt;
I put this in to &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt; and blog comments show up just like any other type of blog entry.

Recently, I've noticed that, from time to time, I am getting spam comments. However, Google uses a &lt;a href="http://en.wikipedia.org/wiki/Captcha"&gt;CAPTCHA&lt;/a&gt; to protect it's comments. This means one of two things:
&lt;ol&gt;&lt;li&gt;Google's CAPTCHAs have been broken&lt;/li&gt;&lt;li&gt;Some spammers are willing to hire humans to break CAPTCHAs&lt;/li&gt;&lt;/ol&gt;The rate at which spammers post is very small, maybe one or two comments per month. I think this might support a theory that spammers are using humans (if they were using computers, I think it'd be easier to post on the blogs more often). However, Google may be using anti-spam filters in addition to the CAPTCHA (this would be easy enough for somebody to verify, just copy and paste some blatent spam in to blogger, and solve the CAPTCHAs). To be honest, I don't think blog spam would make enough of a profit to justify humans. Google is using the nofollow tag, so the links don't get any PageRank. I bet that spammers are able to break Google's CAPTCHA with a &lt;1% href="http://www.ceas.cc/papers-2005/160.pdf"&gt;this paper from Microsoft Research on the importance of segmentation in CAPTCHAs).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5776006929521231423?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5776006929521231423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5776006929521231423' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5776006929521231423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5776006929521231423'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/02/googles-captcha-broken.html' title='Google&apos;s CAPTCHA Broken?'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7456521631167978875</id><published>2007-02-28T14:04:00.000-05:00</published><updated>2007-02-28T14:17:50.862-05:00</updated><title type='text'>CMU dorm policy: Nerds gone wild?</title><content type='html'>Recently    Carnegie Mellon announced that it was going to test out a gender neutral housing program next semester. It's hard to see how this can be all that shocking (most university housing is co-ed by room). Of course, there's always somebody with an &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;ridiculous&lt;/span&gt; point of view:
&lt;blockquote&gt;Unfair or not, my fear is that nerdy kids at Carnegie Mellon might put aside writing computer language for the space program and attempt to brush up their knowledge of biology in the privacy of their own dormitories. This is wrong. Nerds should not be having love affairs with other nerds. There is always the danger that in the throes of nerd passion, their thick glasses will collide or else they will drop heavy laptops onto vulnerable body parts. [&lt;a href="http://www.post-gazette.com/pg/07059/765461-154.stm"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;CMU&lt;/span&gt; Dorm Policy: Nerds gone wild?&lt;/a&gt;]&lt;/blockquote&gt;I'm glad to hear that some folks think of students at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CMU&lt;/span&gt; as nerds who need to be protected from distractions such as members of the opposite sex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7456521631167978875?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7456521631167978875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7456521631167978875' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7456521631167978875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7456521631167978875'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/02/cmu-dorm-policy-nerds-gone-wild.html' title='CMU dorm policy: Nerds gone wild?'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7599783471126824693</id><published>2007-02-07T12:05:00.000-05:00</published><updated>2007-02-07T12:05:49.894-05:00</updated><title type='text'>Big Media DMCA Notices: Guilty until proven innocent</title><content type='html'>&lt;p&gt;
It's no secret that media companies have started to hire companies such as &lt;a href="http://www.baytsp.com/"&gt;BayTSP&lt;/a&gt; to automatically find file sharers and send letters to their ISPs. The goal of this is to use fear to persuade people to use legal methods of getting digital content.
&lt;/p&gt;

&lt;p&gt;
Many ISP's, especially universities, trust the good faith of these companies and will automatically deactivate the Internet connection of those who they get notifications for. As a personal project, and with the help of Carnegie Mellon's Information Security Office (which employs me to work on various computing security tasks), I decided to investigate the reliability of notices from companies such as BayTSP. The answer: the companies do not actually gather the data they claim to. Their standards for sending DMCA notices are very low.
&lt;/p&gt;

&lt;p&gt;In order to understand the issues, it's first necessary to have a basic understanding of BitTorrent. In order to download something via BitTorrent you download a ".torrent" file from any number of sites that index the content. This file contains a fingerprint for every piece of the file that you are attempting to download. It also contains a reference to a tracker. This tracker is the way that peers (the people downloading the content) find each other. After contacting the tracker, you contact each of the potential peers that the tracker shares with you (and other peers may contact you). The client then begins swapping parts of the file with each of the peers. What the media companies object to is that in the process of downloading the file, your client will offer parts of their copyrighted content to other users -- a violation of copyright law. In order to catch these violations, BayTSP advertises fake clients to the Bittorrent tracker and uses the list of peers which it gets back to find violations&lt;/p&gt;

&lt;p&gt;
For my investigation, I wrote a very simple BitTorrent client. My client sent a request to the tracker, and generally acted like a normal Bittorrent client &lt;i&gt;up to sharing files&lt;/i&gt;. The client refused to accept downloads of, or upload copyrighted content. It obeyed the law.&lt;/p&gt;

&lt;p&gt;I placed this client on a number of torrent files that I suspected were monitored by BayTSP (For my own protection I don't want to identify the torrents used for this research. I used the fact that NBC is a client of BayTSP to find trackers. If you want to check if BayTSP is monitoring a torrent, look for IPs coming from ranges in &lt;a href="http://test.blocklist.org/"&gt;test.blocklist.org&lt;/a&gt;). Because the university's information security office is very diligent about processing DMCA notices, I would be able to tell if the BayTSP folks sent notices based on this. With just this, completely legal, BitTorrent client, I was able to get notices from BayTSP.&lt;/p&gt;

&lt;p&gt;To put this in to perspective, if BayTSP were trying to bust me for doing drugs, it'd be like getting arrested because I was hanging out with some dealers, but they never saw me using, buying, or selling any drugs.&lt;/p&gt;

&lt;p&gt;The fact that BayTSP does not confirm that the client it is accusing actually uploads illegal content could cause false identification of innocent users. BitTorrent trackers work via a standard HTTP request request, for example:&lt;/p&gt;

&lt;pre&gt;
GET /announce?info_hash=579CC43E4D66D35AE22312985EA04275939AB477&amp;peer_id=asdfasdfadfasdf&amp;amp;port=12434&amp;compact=1
&lt;/pre&gt;

&lt;p&gt;One easy way to make somebody look likea bittorrenter would be to get them to go to a website with the code &amp;lt;img src="http://tracker.com:12345/announce?info_hash=579CC43E4D66D35AE22312985EA04275939AB477&amp;peer_id=asdfasdfadfasdf&amp;amp;amp;amp;amp;port=12434&amp;amp;compact=1" /&gt;. They'd be on the tracker, and &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;BayTSP&lt;/span&gt; would see their &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;IP&lt;/span&gt; address, and might send them an infringement notice. &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;BayTSP&lt;/span&gt; might check that they are listening on the port they advertise (maybe even check for a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;BitTorrent&lt;/span&gt; handshake). If the user is using &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;bittorrent&lt;/span&gt; for legal usages, you could just advertise a port they were listening on. More investigation is needed into exactly what triggers the notice.&lt;/p&gt;

&lt;p&gt;One even easier trick you can use: the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;BitTorrent&lt;/span&gt; clients &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;BayTSP&lt;/span&gt; uses support Peer Exchange. You can give them the name of another peer for them to rat out to the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;ISP&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;At the end of the day, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;BayTSP&lt;/span&gt; (and probably other similar companies) are sending &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;DMCA&lt;/span&gt; notices which claim that they detected a user uploading and downloading copyrighted files. This is a lie. They didn't catch the user in the act of downloading. A lying tracker, a peer using peer exchange, hostile web page, or buggy &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;BitTorrent&lt;/span&gt; client could all result in a false &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;DMCA&lt;/span&gt; notice.&lt;/p&gt;

&lt;p&gt;If your &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ISP&lt;/span&gt; forwards a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;DMCA&lt;/span&gt; notice from these guys, point them here. This research suggests that they have no evidence of wrong-doing. If &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;ISPs&lt;/span&gt; learn that the folks sending them &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;DMCA&lt;/span&gt; notices are not being completely honest, they may be willing to reconsider their position about how they respond to the notices. The people I work with at Carnegie Mellon seemed willing to reevaluate their policies given this evidence. I believe that &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;ISPs&lt;/span&gt; should require that any peer-to-peer related &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;DMCA&lt;/span&gt; notice include a statement regarding exactly what evidence of sharing was found. Ideally, the notice should contain evidence that could be corroborated with log files (for example, "we found that the client at 123.1.2.3 uploaded 1 MB of file X to 4.3.2.1". The &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;ISP&lt;/span&gt; may be able to check that there was 1 MB of traffic between these two clients).&lt;/p&gt;

&lt;p&gt;A piece of good news for anybody who has gotten a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;bittorrent&lt;/span&gt; related notice from &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;BayTSP&lt;/span&gt;: it doesn't seem like a studio could do much in terms of court action with the evidence &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;BayTSP&lt;/span&gt; gives them.&lt;/p&gt;

&lt;p&gt;For the technically minded, I though I'd share some observations of the behavior of &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;BayTSP's&lt;/span&gt; clients&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;BayTSP's&lt;/span&gt; clients don't don't accept incoming connections, only send outgoing ones. I wonder what exactly this is for.&lt;/li&gt;
&lt;li&gt;Some of the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;BayTSP&lt;/span&gt; clients claim to be using &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Azureus&lt;/span&gt; (and support &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;Azureus&lt;/span&gt; extensions), while others run &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;libtorrent&lt;/span&gt;. I'm not sure why they are doing this&lt;/li&gt;
&lt;li&gt;When &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;BayTSP's&lt;/span&gt; clients connect to a &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;BT&lt;/span&gt; user, they claim to not have downloaded any of the file, but refuse uploads. Not only does this behavior not make any sense for an actual user, but it seems like &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;BayTSP&lt;/span&gt; would want to accept data, which might
provide proof of infringement.&lt;/li&gt;
&lt;li&gt;Some of the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;IP&lt;/span&gt; ranges I noticed coming from &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;BayTSP&lt;/span&gt; were: 154.37.66.xx, 63.216.76.xx, 216.133.221.xx. Sometimes, they make themselves really obvious on the tracker. For example, 154.37.66.xx and 63.216.76.xx will send 10 clients to the same tracker all claiming to listen on port 12320. Maybe trackers should block these folks&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7599783471126824693?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7599783471126824693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7599783471126824693' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7599783471126824693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7599783471126824693'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/02/big-media-dmca-notices-guilty-until.html' title='Big Media DMCA Notices: Guilty until proven innocent'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4133542235020915610</id><published>2007-01-18T16:23:00.000-05:00</published><updated>2007-01-18T16:28:06.146-05:00</updated><title type='text'>Interning at Google Again</title><content type='html'>&lt;p&gt;This summer, I'm going to do another internship at Google. I'll be working on Google Calendar.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4133542235020915610?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4133542235020915610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4133542235020915610' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4133542235020915610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4133542235020915610'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/01/interning-at-google-again.html' title='Interning at Google Again'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4222791521946060764</id><published>2007-01-01T15:02:00.000-05:00</published><updated>2007-01-01T15:13:41.674-05:00</updated><title type='text'>Beware random CAPTCHAs found on slashdot</title><content type='html'>&lt;a href="http://www.omgili.com/captcha.php"&gt;This&lt;/a&gt; CAPTCHA, found on slashdot is pretty silly. First, the HTML doesn't &lt;i&gt;really&lt;/i&gt; provide that much security. It wouldn't be that hard to script Gecko to render the thing. Worse, it has a very insecure implementation:

&lt;pre&gt;
if (isset($_POST['hash']) &amp;&amp; isset($_POST['CaptchaStr']) ) 

{

 if($captcha-&gt;validate_submit($_POST['hash'],$_POST['CaptchaStr']))

  $Message = "Correct.";

 else

  $Message = "Incorrent.";

}

  function check_captcha($correct_hash,$attempt)

  {

   // when check, destroy picture on disk

   if(file_exists($this-&gt;get_filename($correct_hash)))

   {

    $res = @unlink($this-&gt;get_filename($correct_hash)) ? 'TRUE' : 'FALSE';

    if($this-&gt;debug) echo "\n&lt;br&gt;-Captcha-Debug: Delete image (".$this-&gt;get_filename($correct_hash).") returns: ($res)";

   }

   $res = (md5($attempt)===$correct_hash) ? 'TRUE' : 'FALSE';

   if($this-&gt;debug) echo "\n&lt;br&gt;-Captcha-Debug: Comparing public with private key returns: ($res)";

   return $res == 'TRUE' ? TRUE : FALSE;

  }
  /** @private **/

  function get_filename($public='')

  {

   if($public=='') $public=$this-&gt;public_key;

   return $this-&gt;tempfolder.$this-&gt;filename_prefix.$public.'.jpg';

  }
&lt;/pre&gt;

&lt;p&gt;So, here are a few bad things you can do&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your OCR can read 1/2 the chars on the page, the md5sum lets you crack the others. Really quickly&lt;/li&gt;
&lt;li&gt;Forget OCR. It doesn't check that the server itself generated the hashes. Hash "apple" then submit the hash and the word "apple".&lt;/li&gt;
&lt;li&gt;There are no checks for duplicates. You can solve one captcha and submit it 1000000 times.&lt;/li&gt;
&lt;li&gt;You can delete any jpeg file on the website, due to the non-checking of the hash for the word   ".."&lt;/li&gt;
&lt;li&gt;You can fill up the dude's disk by requesting lots of captchas but not solving them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't trust this kind of script!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4222791521946060764?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4222791521946060764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4222791521946060764' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4222791521946060764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4222791521946060764'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/01/beware-random-captchas-found-on.html' title='Beware random CAPTCHAs found on slashdot'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-4620413054890881004</id><published>2007-01-01T14:15:00.001-05:00</published><updated>2007-01-01T14:38:12.177-05:00</updated><title type='text'>Posting Zero-Day Scripting Exploits</title><content type='html'>&lt;p&gt;It's really sad to see people posting zero day exploits for large applications, such as &lt;a href="http://cyber-knowledge.net/blog/2007/01/01/gmail-vulnerable-to-contact-list-hijacking/"&gt;this&lt;/a&gt; GMail exploit. First, it's not clear what this guy's motives are. Maybe he wants to get slashdotted so that the ads on his page will get clicked due to the massive number of visitors. He might also want to get a bit of fame, which is easier to do if you post a zero-day issue and then get it slashdotted.&lt;/p&gt;

&lt;p&gt;Maybe he just wants the security issue fixed as fast as possible, and having notified the Google security folks is unsatisfied with their response time. If that's the case, I think he was very irresponsible in the posting of the exploit. First, it's new year's day. That means response time from &lt;i&gt;any&lt;/i&gt; website is going to be slow. Thus, it will take longer to get something pushed out. Why not publish something like this on a weekday, when people are at work? The issue will be fixed faster, and slashdot traffic will be higher (more ad clicks, more fame!).&lt;/p&gt;

&lt;p&gt;It's also worth noting how dangerous such zero-day issues are. Spammers could do quite a bit of damage in a short amount of time (even if it was open for an hour or two). Spammers likely have (or will acquire) pages that get a fair number of clicks (domain landing pages and porn sites are likely good candidates for this). A zero day exploit could easily let them gather some great data for spamming (Imagine being able to send out an email to somebody from one of the people on their contact list, including the full name of the person! It's a spammer's dream come true).&lt;/p&gt;

&lt;p&gt;With all that said, I think the use of JSON for things like sending contact lists is becoming a large danger. I've found and reported similar issues to Google and Facebook in the last month. I bet lots of web 2.0 sites have the exact same issue. There are two easy and secure ways to fix the issue&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a secret token. For example, make the url something like google.com/contacts?tok=asdfasdfasdfasdf. Make the tok a per-user string (like a HMAC of their username). If the tok isn't correct, deny the request&lt;/li&gt;
&lt;li&gt;Rely on XmlHttpRequest. Insert the following code at the top of the JS document "while (1);". Using XmlHttpRequest, download the code, and remove the token. People trying to use a script tag to include the document won't be able to do so.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-4620413054890881004?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/4620413054890881004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=4620413054890881004' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4620413054890881004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/4620413054890881004'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2007/01/posting-zero-day-scripting-exploits.html' title='Posting Zero-Day Scripting Exploits'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6079441138324539004</id><published>2006-12-04T17:32:00.000-05:00</published><updated>2006-12-04T17:35:01.417-05:00</updated><title type='text'>Performance Tip of the Day: Script Tags are Blocking</title><content type='html'>&lt;p&gt;Today I downloaded the fantastic &lt;a href="http://getfirebug.com"&gt;firebug&lt;/a&gt; extension. It has a mode where it shows network activity:&lt;/p&gt;

&lt;img src="http://getfirebug.com/net.gif"&gt;

&lt;p&gt;I learned that if you have a JavaScript file, the browser will block rendering of the page until the request is done. I saved about 100ms on a few sites I run by moving the Google Analytics tracker to the bottom of the page (not sure why it wasn't being cached, probably because I am on an SSL site).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6079441138324539004?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6079441138324539004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6079441138324539004' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6079441138324539004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6079441138324539004'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/12/performance-tip-of-day-script-tags-are.html' title='Performance Tip of the Day: Script Tags are Blocking'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5318677228371007021</id><published>2006-11-28T13:12:00.000-05:00</published><updated>2006-11-28T13:21:00.726-05:00</updated><title type='text'>Posting sensitive data in JSON</title><content type='html'>&lt;p&gt;If you are using JSON in AJAX, make sure not to put sensitive data in the JSON feed. Because script tags don't follow the same-origin policy, it's possible to include a script from third party sites.&lt;/p&gt;

&lt;p&gt;Google's GData-JSON feeds (which I &lt;a href="bmaurer.blogspot.com/2006/11/using-gcal-json-to-make-freebusy.html"&gt;blogged&lt;/a&gt; about earlier) had just such an issue. Google allowed you to request a URL such as http://www.google.com/calendar/feeds/default/private/basic?alt=json-in-script. If you use Google calendar, take a look at that feed with the alt= part taken off. It likely has your email address, your full name, and possibly some sensitive events in it. Any site you visited could have requested that URL and scraped the data. Note that with more advanced techniques, it's possible to get data that doesn't use the callback, ie, array literals. See &lt;a href="http://jeremiahgrossman.blogspot.com/2006/01/advanced-web-attack-techniques-using.html"&gt; Jeremiah Grossman's blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luckily, this was fixed relatively quickly after I reported it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5318677228371007021?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5318677228371007021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5318677228371007021' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5318677228371007021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5318677228371007021'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/11/posting-sensitive-data-in-json.html' title='Posting sensitive data in JSON'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-6087361734589609335</id><published>2006-11-25T13:27:00.000-05:00</published><updated>2006-11-25T13:43:52.295-05:00</updated><title type='text'>DomBuilder + Functional Programming == Awesome</title><content type='html'>&lt;p&gt;The DOM sucks. It's so so slow to type document.createElement and document.createTextNode. One nice solution for this is &lt;a href="http://svn.vivabit.net/external/codedump/javascript/DomBuilder/"&gt;DomBuilder&lt;/a&gt; which allows you to say:&lt;/p&gt;

&lt;pre&gt;
document.body.appendChild(
 DIV({ id : "el_" + times, 'onclick' : 'alert("sdsdsd")'}, 
  STRONG({ 'class' : 'test' },"Lovely"), " nodes! #" + times
 )
);
&lt;/pre&gt;

&lt;p&gt;When using the DomBuilder in a project of mine, I found that it couldn't handle data very well. I had a list of items, and I wanted to make a table. There's no easy way to do that with DOMBuilder.&lt;/p&gt;

&lt;p&gt;However, a bit of functional programming can save the day. Using Prototype, and adding the following line of code to tagFunc gets lots of millage:&lt;/p&gt;

&lt;pre&gt;
arguments = $A(arguments).flatten ().compact ();
&lt;/pre&gt;

&lt;p&gt;What is this doing? First, we turn arguments into an array so that we can handle it cleanly. Then we flatten any arrays (turn [a,[b,c]] into [a, b, c]) and then compact any null entries ([a,null,b,c] into [a,b,c]). What's the win? Now this library can handle data very elegantly:&lt;/p&gt;

&lt;pre&gt;
var stocks = [{ name : "NOVL", price : 6.28 }, { name : "GOOG", price : 505.00 }];
document.body.appendChild($table (
   $tr ($th ("Name"), $th ("Price")),
   stocks.map (function (stock) {
       return $tr ($td (stock.name), $td (stock.price.toString ()));
   })
));
&lt;/pre&gt;

&lt;p&gt;Note the use of map to handle each of the stocks. Without the flatten, this would not have worked. It's pretty easy to build up HTML from data like this very elegantly.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-6087361734589609335?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/6087361734589609335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=6087361734589609335' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6087361734589609335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/6087361734589609335'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/11/dombuilder-functional-programming.html' title='DomBuilder + Functional Programming == Awesome'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-8778705241295940673</id><published>2006-11-22T23:44:00.000-05:00</published><updated>2006-11-22T23:54:55.680-05:00</updated><title type='text'>Using GCal JSON to make a free/busy schedule</title><content type='html'>&lt;p&gt;Lately, I seem to be getting lots of emails of the form "When are you free this week, I'd like to meet with you sometime". Each time I get this email, I have to go to my calendar, copy my appointments for the next week, and send it in a reply.&lt;/p&gt;

&lt;p&gt;In an ideal world, I could just paste a link to my calendar in iCal format. Sadly, not enough people use a calendaring client for this to be reliable (and worse off, many of the people I interact with use the horror that is Oracle Calendar, which doesn't really handle external ical).&lt;/p&gt;

&lt;p&gt;This week, Google added JSON output to their Google Calendar feeds. This allows me to make a pure-javascript solution to this problem. I created a bit of Javascript code (&lt;a href="http://www.contrib.andrew.cmu.edu/~bmaurer/freev1.html"&gt;here&lt;/a&gt;) which loads my calendar in JSON format and tells the other person when I'm busy&lt;/p&gt;

&lt;p&gt;It's nice to be able to only show a free-busy projection of my calendar (I don't want the world to know who I'm meeting with, where I am, etc at every moment. I also use the calendar as a place to dump event related date, for example, airline confirmation numbers). I also like that I only have to host a small static html page to do this. No figuring out where to put a PHP script, no SQL, just a bit of javascript&lt;/p&gt;

&lt;p&gt;TODO:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle multi-day events&lt;/li&gt;
&lt;li&gt;Better date formatting (use day of week, month names, etc)&lt;/li&gt;
&lt;li&gt;Combine events (If I'm busy from 10:30-11:30 and 11:30-12:30, I can just be busy between 10:30 and 12:30)&lt;/li&gt;
&lt;li&gt;Not depend on prototype (or only take what I need)&lt;/li&gt;
&lt;li&gt;Make it pretty&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-8778705241295940673?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/8778705241295940673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=8778705241295940673' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8778705241295940673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/8778705241295940673'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/11/using-gcal-json-to-make-freebusy.html' title='Using GCal JSON to make a free/busy schedule'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-3131017942215111445</id><published>2006-11-13T16:10:00.000-05:00</published><updated>2006-11-13T16:14:56.430-05:00</updated><title type='text'>Now that javac is open source...</title><content type='html'>&lt;p&gt;Maybe somebody (me?) can &lt;b&gt;finally&lt;/b&gt; make a patch for this issue:&lt;/p&gt;

&lt;pre&gt;
[bmaurer@omega ~]$ cat x.java
public class x {
        public static void main (String[] args) {
                System.out.println ("hello world");
        }
}
[bmaurer@omega ~]$ time javac x.java

real    0m0.766s
user    0m0.604s
sys     0m0.040s
&lt;/pre&gt;

&lt;p&gt;For the record, mcs has a time of:&lt;/p&gt;

&lt;pre&gt;
[bmaurer@omega ~]$ time mcs x.cs

real    0m0.483s
user    0m0.440s
sys     0m0.024s
&lt;/pre&gt;

&lt;p&gt;But Java is using a form of Ahead of Time compilation (they call it class file sharing or something) while my MCS is not.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-3131017942215111445?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/3131017942215111445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=3131017942215111445' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/3131017942215111445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/3131017942215111445'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/11/now-that-javac-is-open-source.html' title='Now that javac is open source...'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7212331201721997230</id><published>2006-11-01T22:14:00.000-05:00</published><updated>2006-11-01T22:20:07.863-05:00</updated><title type='text'>Don't echo back plain text passwords</title><content type='html'>&lt;p&gt;Today I found two nice little security issues on an e-commerce site I use. First, the site has a page that allows you to change passwords. The code on the page is of the form &amp;lt;input type="password" name="password" value="MY PASSWORD IN PLAIN TEXT"&amp;gt;. Secondly, the site had some Cross Site Scripting issues. At the end of the day, it was drop-dead easy to phish for people's passwords. Yikes.
&lt;/p&gt;

&lt;p&gt;
Never, ever, ever echo sensitive data back to the user. It makes an XSS attack really damaging (and is also bad if somebody leaves their computer unlocked).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7212331201721997230?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7212331201721997230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7212331201721997230' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7212331201721997230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7212331201721997230'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/11/dont-echo-back-plain-text-passwords.html' title='Don&apos;t echo back plain text passwords'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-5989082841008853140</id><published>2006-10-28T01:56:00.000-04:00</published><updated>2006-10-28T01:58:49.998-04:00</updated><title type='text'>Finding Social Security Numbers with Google</title><content type='html'>Google has a helpful syntax x..y for searching web pages with numbers between x and y. This feature, combined with the stupidity of the general public, results in social security numbers being findable: &lt;a href="http://www.google.com/search?q=inurl%3Aresume+ssn+*+10000...99999999"&gt;inurl:resume ssn * 10000...99999999&lt;/a&gt;.
&lt;p&gt;
Note that Google proactively protects users by forbiding the query 100000000..999999999 (that's the full SSN range). It also bans a varity of searches for credit card numbers. However, using the wider range allows one to still find socials, granted with some false positives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-5989082841008853140?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/5989082841008853140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=5989082841008853140' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5989082841008853140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/5989082841008853140'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/10/finding-social-security-numbers-with.html' title='Finding Social Security Numbers with Google'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-2778405028770346791</id><published>2006-10-18T17:00:00.000-04:00</published><updated>2006-10-18T13:31:50.950-04:00</updated><title type='text'>Math.abs Returns a Negative Number</title><content type='html'>&lt;p&gt;Math.abs (Math.Abs in C# :-) is one of those methods that sould be pretty simple, right? Just take the value, if it's negative, return a positive version, duh! Well, it's not that simple.&lt;/p&gt;

&lt;p&gt;There are 2&lt;sup&gt;32&lt;/sup&gt; possible values of &lt;tt&gt;int&lt;/tt&gt;, each of which is positive, negative or zero. There's only one integer that is zero, namely 0x00000000. That means that either there is one bit pattern of ints that doesn't represent an integer, or there is not a 1-1 mapping between positive and negative numbers. It turns out, the second is the case. The odd number is int.MinValue, which is equal to 0x80000000 in binary.&lt;/p&gt;

&lt;p&gt;What happens when you negate this number? In two's complement -x=~x+1. ~x = 0x7fffffff. ~x+1=0x80000000. That means -int.MinValue == int.MinValue. Uh oh!&lt;/p&gt;

&lt;p&gt;Enter Math.abs. What's the function to do when passed int.MinValue. Well, in C#, Math.Abs throws an OverflowException. Java, on the other hand, happily returns int.MinValue. Either way, the caller of the function probably wasn't expecting this.&lt;/p&gt;

&lt;p&gt;I discovered this oddity when reading Effective Java (kindly provided to all Google Engineers). The book talks about the code: &lt;tt&gt;Math.abs (new Random ().nextInt ()) % n&lt;/tt&gt; as a way to generate random numbers between 0 and n. This code &lt;i&gt;usually&lt;/i&gt; works, except when Random happens to return int.MinValue. In this case, the abs returns a negative value, causing the modulus operator to return a negative number. Eeeek!&lt;/p&gt;

&lt;p&gt;At this point, I realized that for the data structures course I TA, many students used a similar piece of code in a hashtable they wrote. I wrote a quick script to check how many people screwed up on int.MinValue. Most students did.&lt;/p&gt;

&lt;p&gt;I wondered how much this occurred in production code. Luckily, I had one of the best test cases at my fingertips. Google has an internal "grep" tool (the inspiration for the new Code Search) utility. I made a quick regex to find where this occurred. There were many instances.&lt;/p&gt;

&lt;p&gt;Now that Google has released an external version of this tool, you can see some of the places this anti-pattern is used in the real world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=math.abs%5C%28.*nextint%5C%28%5C%29%5B%5E%25%5D*%5C%29"&gt;Random version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=math.abs%5C%28.*hashCode%5C%28%5C%29%5B%5E%25%5D*%5C%29"&gt;Hash Code version&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these snippits is a time bomb. One in 2&lt;sup&gt;32&lt;/sup&gt; executions, the function will do something strange.&lt;/p&gt;

&lt;p&gt;Having found this issue in Google's source code, I emailed somebody inside Google who had been running &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; internally. He in turn talked to Bill Pugh, who added &lt;a href="http://findbugs.blogspot.com/2006/09/is-mathabs-broken.html"&gt;a detector&lt;/a&gt;. I added a test case to the test suite for the homework assignment at CMU, so students will have to handle this case. All in all, a very obscure bug&lt;/p&gt;

&lt;p&gt;So, what should you do rather than Math.abs? I've seen primarially two buggy patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Hashtables&lt;/b&gt; People want to find "which bucket should I put an object with hashcode x in". The best way to do this is (o.GetHashCode () &amp;amp; 0x7fffffff) % table.Length. This has the advantage of being faster than Math.abs (no branches).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Random Numbers&lt;/b&gt; People want to say Math.Abs (new Random ().Next ()) % N. Not only is this buggy in the rare case, it can also cause a bad distribution of numbers for large N. Use the Next (int, int) method which allows you to specify bounds&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-2778405028770346791?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/2778405028770346791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=2778405028770346791' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2778405028770346791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/2778405028770346791'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/10/mathabs-returns-negative-number.html' title='Math.abs Returns a Negative Number'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-7268402131615519489</id><published>2006-10-07T12:28:00.000-04:00</published><updated>2006-10-07T12:35:55.776-04:00</updated><title type='text'>Edgy Memory Usage</title><content type='html'>&lt;p&gt;I just installed the Ubuntu Edgy beta on my laptop. I'm impressed by the memory usage. On startup, it's using 87mb of ram. WOW.&lt;/p&gt;

&lt;p&gt;In system monitor, there's one sore point. This system-tools-backend thingy is launching perl on startup. This requires 9 mb of writable memory on startup. What the hell is this thing?&lt;/p&gt;

&lt;p&gt;Whatever the program does, it clearly does &lt;i&gt;not&lt;/i&gt; have a reputation for performance. Ryan "kill wakeups" Lortie reported that the program made &lt;a href="https://launchpad.net/distros/ubuntu/+source/system-tools-backends/+bug/61186"&gt;20 wakesups per second&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Filed a &lt;a href="https://launchpad.net/distros/ubuntu/+source/system-tools-backends/+bug/61186"&gt;bug&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-7268402131615519489?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/7268402131615519489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=7268402131615519489' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7268402131615519489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/7268402131615519489'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/10/edgy-memory-usage.html' title='Edgy Memory Usage'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-554000045022892728</id><published>2006-10-06T11:16:00.000-04:00</published><updated>2006-10-06T11:36:36.498-04:00</updated><title type='text'>Mono Summit; New Google Products</title><content type='html'>&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;Mono Summit&lt;/span&gt;: I'm going to be at the Mono summit in Boston (thanks Mig!). I look forward to seeing lots of Mono hackers (and having some very good ice cream :-)
&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;New Google Products&lt;/span&gt;: In the past month or so, Google has had a pretty crazy schedule of product releases.

&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Blogger Beta&lt;/span&gt;: Google finally made lots of improvements to Blogger, giving it tags, etc. Also, it was moved over to Google Accounts, killing yet another password. Most importantly: spell checking!
&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Google Reader&lt;/span&gt;: Completely new version. This thing is amazing, it really works the way I'd want a blog reader to work. The old Google Reader had really poor performance on Linux, and this one seems to fix it. I only have two issues with the program. First, it does not auto refresh feeds, so I need to remember to hit "r" to refresh things. Also, the server side seems to have less than stellar performance. I'm betting they did such a fantastic job that they got more users than they had server power.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Google Transit&lt;/span&gt;: Being a college student, I use public transportation (it's free in the sense that I am forced to pay a flat fee for the entire year). Pittsburgh's public transit does not publish schedules in a usable format. Transit completely fixed this for me.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Groups Beta&lt;/span&gt;: Google did a refresh of groups. The UI is much better, and they now have a wiki-like functionality and the ability to upload files (100mb of storage -- that's not too bad). Like Google Reader, the servers aren't quite as fast as they could be. I assume this will be fixed when it's out of beta&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Code Search&lt;/span&gt;: global grep. No horrible interface like koders or krugle.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Image Labler&lt;/span&gt;: This is a version of a game by Luis Von Ahn (a professor here at CMU) that lets people label images. Google needs to do serious work on game play (their images are far too small, likely due to copyright paranoia, and they aren't using taboo words correctly well). However, if you look at the high scores, there are people who have been playing this thing for &lt;span style="font-style: italic;"&gt;days&lt;/span&gt;. Imagine what would happen if Google were to increase the game play experience and put a link on the home page for &lt;span style="font-style: italic;"&gt;one day&lt;/span&gt;.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I have to say, this is a pretty amazing array of products.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-554000045022892728?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/554000045022892728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=554000045022892728' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/554000045022892728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/554000045022892728'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/10/mono-summit-new-google-products.html' title='Mono Summit; New Google Products'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115413448556518940</id><published>2006-07-28T20:33:00.000-04:00</published><updated>2006-07-28T20:54:45.576-04:00</updated><title type='text'>Constructive Finger Pointing</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.gnome.org/view/ryanl/2006/07/27/0"&gt;Ryan Lortie&lt;/a&gt; made a very good post on the waste of power due to timer use. In the past, I have made many similar posts about how memory is wasted. I think these types of blogs provide good insight to the developer community. It's a way to say "wow, this is really a problem". I'd like to see the process automated.&lt;/p&gt;

&lt;p&gt;On the Google Intranet, there is a status dashboard. The dashboard is sorted by latency, slowest first. So, if your service is slow, you get highlighted on the home page, with a big red (!) next to your project. I think this is a good incentive to make services fast&lt;/p&gt;

&lt;p&gt;I wonder if the same thing can be done for GNOME. We could gather data about which components are sucking and put it in a high profile place (the planet would be a good one). Some metrics are easy to get (modules with the most unreviewed bugs). In time, I think GNOME and distributions should build tools to get other types of data: "what applications are taking up memory", "which apps are segfaulting", "which apps are abusing timers".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115413448556518940?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115413448556518940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115413448556518940' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115413448556518940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115413448556518940'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/constructive-finger-pointing.html' title='Constructive Finger Pointing'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115406203277467097</id><published>2006-07-28T00:40:00.000-04:00</published><updated>2006-07-28T01:09:13.866-04:00</updated><title type='text'>Luis von Ahn Talks at Google</title><content type='html'>&lt;p&gt;Luis von Ahn, inventor of CAPTCHAs and the ESP Game, gave a talk at Google yesterday. This talk is worth listening to (would I blog it otherwise?). Luis describes how, by using people's spare time, all images on the web could be labeled in months (or even weeks). This talk is non-theory-person friendly (no math). It's also &lt;i&gt;quite&lt;/i&gt; funny (Luis' lectures are even better). (&lt;a href="http://video.google.com/videoplay?docid=-8246463980976635143"&gt;direct link&lt;/a&gt; if you can't see the embeded version below)&lt;/p&gt;

&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-8246463980976635143"&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115406203277467097?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115406203277467097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115406203277467097' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115406203277467097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115406203277467097'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/luis-von-ahn-talks-at-google.html' title='Luis von Ahn Talks at Google'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115405722198749296</id><published>2006-07-27T23:06:00.000-04:00</published><updated>2006-07-27T23:27:01.996-04:00</updated><title type='text'>Google Code Hosting</title><content type='html'>&lt;p&gt;Hosting &lt;a href="http://code.google.com/hosting/"&gt;Google Code&lt;/a&gt; is &lt;i&gt;very&lt;/i&gt; interesting. While, at first glance, the site really doesn't compare to Sourceforge, I think it's a really interesting offering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Google Code issue tracker is very elegant. The tagging system is much, much smarter than what Bugzilla does.&lt;/li&gt;
&lt;li&gt;It will scale. Period. It's interesting to note that some of the biggest investment was on making subversion very scalable (see &lt;a href="http://www.newsforge.com/article.pl?sid=06/07/27/1833251"&gt;this interview&lt;/a&gt;). Anyone who has ever used Sourceforge knows that the performance of their version control is...less than stellar :-).&lt;/li&gt;
&lt;li&gt;Possibly the most interesting thing is the fact that &lt;i&gt;very little&lt;/i&gt; infrastructure will be needed to make this service usable; it can just connect to what Google already has. Google Pages, GMail, Google Groups, Blogger and Writely all provide services that in other services would just be one-off hacks. The future of online interaction seems to be combinations of tools that do one thing and do it right into a powerful system. For example, I'm currently trying to convince the people running 15-211 at CMU (the Data Structures course which I TA) to use the combination of Blogger + Google Groups + Google Calendar rather than Blackboard, which is a content management / community system gone wrong. In order to create an integrated experience, I wrote a "portal" (read: 200 line asp.net hack) using the ATOM feeds provided by all three services. It's going to be really interesting to see what a company with so many &lt;a href="http://www.google.com/intl/en/options/"&gt;offerings&lt;/a&gt; can do for open source&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115405722198749296?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115405722198749296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115405722198749296' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115405722198749296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115405722198749296'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/google-code-hosting.html' title='Google Code Hosting'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115329277839912603</id><published>2006-07-19T02:41:00.000-04:00</published><updated>2006-07-19T03:07:03.700-04:00</updated><title type='text'>Yahoo Portal</title><content type='html'>&lt;p&gt;
I saw that Yahoo released an ajaxish portal today. I tried it, to see if they've improved at all. Let me say, I'm shocked these guys are still around. The site is &lt;i&gt;horrible&lt;/i&gt;. First, the home page is &lt;i&gt;filled&lt;/i&gt; with ads. I mean the moving, flashing, distracting ads that are so 1999. In addition, the home page has some text ads offering me a range of services I really don't need (Vonage -- no thanks, I don't use the phone that much, domain name registration -- maybe, but does &lt;i&gt;everyone&lt;/i&gt; need to see this, "Degrees in as fast as 1 year" -- thanks, I go to a school with &lt;a href="http://ww.cmu.edu"&gt;reputation&lt;/a&gt;, "What’s your credit score 560? 678? 720? - See it free." -- this might as well be in my spam folder).&lt;/p&gt;

&lt;p&gt;
The featured items on the page are completely irrelevent to most people. In the prime location on the page, I'm offered a contest to "Design Janet Jackson's new album cover". The Yahoo Pulse tells me that the number one "Top Guilty Pleasures Ringtones" is "PYT Pretty Young..." by Michael Jackson.
&lt;/p&gt;

&lt;p&gt;
Well, at least the page has a search box. The focus is on the text box by default (good!), so I can get going right away. Let's give Yahoo a hard search, linq. This is the C# 3.0 Object/Relational mapping. Typical search, not really. But I want a search engine that finds things that are hard to find.
&lt;/p&gt;

&lt;p&gt;It turns out that Yahoo and Google have about the same search results. However, the difference is in the ads.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/yhoogoogads.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/320/yhoogoogads.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;Each page has more ads, however for advertisers, the top three are the most important spots, so I'm just going to look at those. The Yahoo ads in positions 1 and 3 offer me some obscure products that happen to be named "linq". Yahoo ad 2 links to www.restaurant.com with no connection what so ever to linq. Compare this to the Google ads, all of which might be relevent to somebody looking at O/R mapping in .NET. Let's just say Google is getting lots more revenue from its ads.&lt;/p&gt;

&lt;p&gt;Ok, let's give Yahoo a break. I'll try an easy query "restaurant". Yahoo highlights restaurant results in &lt;i&gt;Pittsburgh&lt;/i&gt; (right now, I'm in CA). Now, I know I've used Yahoo's farechase to find flights from PIT to SFO, but my IP address should very clearly tell Yahoo where I am. All of Yahoo's ads are for restaurant supplies Now, Google doesn't try to highlight local restaurants (to do that I have to say "restaurant near mountain view ca"), however the ads are geo-targeted, giving local restaurants (&lt;i&gt;not&lt;/i&gt; restaurant suppliers).&lt;/p&gt;

&lt;p&gt;Well, I don't think I'll be changing my home page any time soon. There are some things I did like about Yahoo's design (I really like that you can change from Web to Image search without the page being refreshed. Google should totally copy that idea). However, it's pretty clear why Google has so many users.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115329277839912603?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115329277839912603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115329277839912603' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115329277839912603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115329277839912603'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/yahoo-portal.html' title='Yahoo Portal'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115206462649245802</id><published>2006-07-04T21:38:00.000-04:00</published><updated>2006-07-04T23:20:52.000-04:00</updated><title type='text'>Today in performance</title><content type='html'>&lt;p&gt;I started off today by using massif and the traditional memcheck to see where memory was allocated in the libgnomeui stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use libgnutls to handle ssl in gnome-vfs. This program mallocs 65 kb of memory in the intializer (which is called from gnome-vfs's initializer). I sent off an email to the address their website told me to use for bugs (no bugzilla!). If you are interested in fixing this on the gnutls side, the code to look at is gnutls_global_init, specifically the two calls to asn1_array2tree. In the mean time, I think we should &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=346573"&gt;fix this in GNOME&lt;/a&gt; by lazily initializing the tls library. I think this is a pretty rare use case. On my (basically empty) desktop, 18 processes are using gnome-vfs. That makes 1.1 MB (probably more, countin malloc overhead).&lt;/li&gt;
&lt;li&gt;Noticed lots of allocations from inside glibc when calling setlocale (which the gnome option parser does). Turns out there is a glibc cache for this stuff, but Ubuntu wasn't packaging it. Filed &lt;a href="https://launchpad.net/bugs/51884"&gt;a bug&lt;/a&gt;. I have 40 processes using the cache right now (even bash uses it!). Not using the cache costs about 70kb. That's 2.7 mb.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I then went on to look a bit at gedit, which I noticed was taking up a pretty high amount of memory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;

&lt;p&gt;First sign of trouble: gedit loads python. Why? By default a plugin called "modelines" which describes itself as "Emacs, Kate and Vim-style modelines support for gedit". I'm not sure exactly what that does, or how I'd use it. Disabling just that plugin gives me back 3.2 mb of ram. It also made gedit feel faster to start up. Filed &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=346598"&gt;a bug&lt;/a&gt; suggesting that it either be disabled or written in C.&lt;/p&gt;

&lt;p&gt;It looks like python+gtk could use some memory optimization. For startup, a hello world in Python has 4 mb of private dirty rss. Compare this to Mono and Gtk# which takes only 2.7 mb. Granted, even Mono is large compared to 608 kb for a C based GTK app. I'll see what I can do about that some weekend :-).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ubuntu's launchpad-integration library was taking up quite a bit of memory by allocating pixbufs. strace -eopen gave the issue away:&lt;/p&gt;
&lt;pre&gt;
open("/usr/share/pixmaps/lpi-help.png", O_RDONLY|O_LARGEFILE) = 17
open("/usr/share/pixmaps/lpi-translate.png", O_RDONLY|O_LARGEFILE) = 17
open("/usr/share/pixmaps/lpi-help.png", O_RDONLY|O_LARGEFILE) = 17
open("/usr/share/pixmaps/lpi-translate.png", O_RDONLY|O_LARGEFILE) = 17
... (78 lines of this)
&lt;/pre&gt;

&lt;p&gt;Whoops :-). Filed a &lt;a href="https://launchpad.net/bugs/51901"&gt;bug&lt;/a&gt;. Not sure how much this saves, as it's not easy to count how many times this code is used.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, that's about 7 mb of memory from all these issues (and my estimates are fairly conservative -- I'm rounding things down, not counting malloc overhead, and looking at my desktop with just xchat, gaim, firefox, gedit, and a few terminals), I'd actually expect the total effects of these to be 8-10 mb. Even with 1 gb of ram, that's pretty large.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115206462649245802?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115206462649245802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115206462649245802' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115206462649245802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115206462649245802'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/today-in-performance.html' title='Today in performance'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115196008279385938</id><published>2006-07-03T16:18:00.000-04:00</published><updated>2006-07-03T16:54:54.796-04:00</updated><title type='text'>gnome cups icon leak</title><content type='html'>&lt;p&gt;The printer status icon (gnome-cups-icon) leaks quite a bit. There is a &lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=369083"&gt;Debian&lt;/a&gt; and a &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=339365"&gt;GNOME&lt;/a&gt; bug. It looks like there has been no maintainer attention to the bug since it was filed. Now that there's a patch, it'd be great to see some action. It looks like this is a fairly visible leak.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115196008279385938?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115196008279385938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115196008279385938' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115196008279385938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115196008279385938'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/gnome-cups-icon-leak.html' title='gnome cups icon leak'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115187859620821493</id><published>2006-07-02T18:07:00.000-04:00</published><updated>2006-07-02T18:36:31.746-04:00</updated><title type='text'>Why does libgnomeui cost so much</title><content type='html'>&lt;p&gt;
So, after measuring the benefit of removing libgnomeui from a program, I thought I might dig deeper into the cause of the bloat. I first made three hello world style applications: one used plain GTK, another used GTK but also initialized GNOME VFS, the last used libgnomeui (which also uses vfs). Each of these three programs loads a superset of the libraries of those before it. I used smaps to gather data about the heap space allocated (used by malloc) and the writable mappings due to shared libraries.&lt;/p&gt;

&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/1600/writable.0.png" border="0" alt="" /&gt;

&lt;p&gt;
Some observations to make here:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Malloced memory causes the most trouble at the gtk level. However, the gnome vfs and libgnomeui are still responsible for quite a bit of mallocing&lt;/li&gt;
&lt;li&gt;libgnomevfs is the worst offender with respect to loading libraries.&lt;/li&gt;
&lt;li&gt;libgnomevfs is a much larger jump in memory than libgnomeui&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I then dug further into what libraries were being loaded by vfs and gnomeui. To get useful data here, I excluded the libraries loaded by gtk from consideration when looking at vfs and similarly excluded libraries loaded by vfs when looking at gnomeui.
&lt;/p&gt;
&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/1600/gnomevfs.png" border="0" alt="" /&gt;

&lt;ul&gt;
&lt;li&gt;Bonobo, ORBit...ugh&lt;/li&gt;
&lt;li&gt;libgnutls, libxml2, and libgcrypt have quite a bit of writable memory. If they could be cut to 4 kb each, we'd save 50kb for each process with gnomevfs.&lt;/li&gt;
&lt;li&gt;The "Other" category has all the 4 kb libs. A few worth special mention: avahi loads three .so files. First, having avahi here seems a bit silly; second, &lt;i&gt;three&lt;/i&gt; libraries. Also, libpopt is used, isn't there something in glib for this now?&lt;/li&gt;
&lt;/ul&gt;

&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/1600/gnomeui.png" border="0" alt="" /&gt;

&lt;ul&gt;
&lt;li&gt;Maybe all those sound related libs should be dynamically loaded. Not many apps use sound!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Investigation to do&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Look at the malloced memory. Valgrind is a good tool here&lt;/li&gt;
&lt;li&gt;Look at the size of the writable memory in libraries mentioned here&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115187859620821493?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115187859620821493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115187859620821493' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115187859620821493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115187859620821493'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/why-does-libgnomeui-cost-so-much.html' title='Why does libgnomeui cost so much'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115179989907240910</id><published>2006-07-01T20:10:00.000-04:00</published><updated>2006-07-01T20:24:59.086-04:00</updated><title type='text'>Kill libgnomeui</title><content type='html'>&lt;p&gt;
libgnomeui would be better named "libkitchensink". It brings in all kinds of libraries from avahi to zlib. How much effect would removing this dependency have on memory? I decided to try out on gnome-volume-manager (which handles volumes as in mounts, not as in sound). Hackishly, I commented out the session management stuff that requires libgnomeui. The results were pretty good.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/libgnomeui.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/400/libgnomeui.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
That's 800kb of memory (I'm using the private dirty rss number, aka "the number that matters"). There are 17 processes on my desktop using libgnomeui right now. If we can remove the dependency from all of those, it would get us 13 MB of savings. In addition to the memory savings, this would likely speed startup speed quite a bit. FYI, the list of processes using libgnomeui right now is:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;/usr/bin/gnome-session
/usr/lib/control-center/gnome-settings-daemon
/usr/bin/gnome-panel
/usr/bin/nautilus
/usr/bin/update-notifier
/usr/bin/gnome-volume-manager
/usr/bin/gnome-cups-icon
/usr/bin/gnome-power-manager
/usr/lib/gnome-applets/trashapplet
/usr/lib/gnome-panel/clock-applet
/usr/lib/gnome-applets/mixer_applet2
/usr/bin/gnome-terminal
/usr/lib/firefox/firefox-bin
/usr/bin/eog
/usr/bin/evolution-2.6
/usr/lib/evolution/2.6/evolution-exchange-storage
/usr/lib/evolution/2.6/evolution-alarm-notify&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
I'm quite sure that we can kill the library from many of those. If one looks for GNOME VFS (which is responsible for quite a bit of the bloat), there are even more processes that could use dependency pruning.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115179989907240910?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115179989907240910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115179989907240910' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115179989907240910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115179989907240910'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/07/kill-libgnomeui.html' title='Kill libgnomeui'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115159853422202573</id><published>2006-06-29T12:20:00.000-04:00</published><updated>2006-06-29T12:28:54.236-04:00</updated><title type='text'>notification-daemon</title><content type='html'>&lt;p&gt;
notification-daemon displays those "you've got 10 minutes of battery left" dialogs. To launch it, you send a dbus signal. A file in /usr/share/dbus-1/services launches the servicce when the dbus interface is called.
&lt;/p&gt;

&lt;p&gt;
An interesting thing I noticed today: if I kill the notification-daemon process, I can still get messages. The process just gets relaunched by dbus. Why the hell doesn't the process quit when no notifications are active? This would save 3.1 MB of memory on my system.
&lt;/p&gt;

&lt;p&gt;
Filed &lt;a href="http://trac.galago-project.org/ticket/71"&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115159853422202573?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115159853422202573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115159853422202573' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115159853422202573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115159853422202573'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/06/notification-daemon.html' title='notification-daemon'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115159168609265389</id><published>2006-06-29T09:53:00.000-04:00</published><updated>2006-06-29T10:35:01.016-04:00</updated><title type='text'>Google Checkout</title><content type='html'>&lt;p&gt;
Google Checkout was &lt;a href="http://slashdot.org/articles/06/06/29/126234.shtml"&gt;released&lt;/a&gt; today. In the great slashdot tradition, the story is sold as "Google is releasing an X killer" where X is a product that does something similar but has a totally different goal. (Google Spreadsheets the "excel" killer, etc).
&lt;/p&gt;

&lt;p&gt;
Two things about Google checkout are very interesting to me. First, the ability for Google to provide the user with some sort of confidence in the checkout process. I never really liked Froogle all that much because it'd point you at some random store that just happened to have a website.
&lt;/p&gt;

&lt;p&gt;
The second thing I like is that Checkout offers &lt;a href="http://checkout.google.com/support/bin/answer.py?answer=43280"&gt;an anonymous email service&lt;/a&gt;. The ability to shut off email from a seller if they get out of hand is very, very nice. (as I understand it, it also offers the ability to forward email for the inevitable email address change. However, it seems the main functionality is being anonymous).
&lt;/p&gt;

&lt;p&gt;
Of course, there's always a down side to things. I'm quite sure this will cause an increase in phishing emails for Google accounts. With that said, it looks like Google is using &lt;a href="http://checkout.google.com/support/bin/answer.py?answer=29069"&gt;smart measures&lt;/a&gt; to make sure a stolen password won't be of much use. Also, I'd think that gmail users would be especially safe from phishing (when GMail team gets a phishing report, I'd assume they can retroactively filter it).
&lt;/p&gt;

&lt;p&gt;
The checkout support site also has some (basic) information on what the &lt;a href="https://checkout.google.com/support/sell/bin/answer.py?answer=38145&amp;topic=8666"&gt;anti-fraud team does&lt;/a&gt;. I can assure you, the process is much more complex than that site makes it sound :-).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115159168609265389?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115159168609265389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115159168609265389' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115159168609265389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115159168609265389'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/06/google-checkout.html' title='Google Checkout'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115052245930434783</id><published>2006-06-17T01:25:00.000-04:00</published><updated>2006-06-17T01:34:19.320-04:00</updated><title type='text'>Powered by Google Maps</title><content type='html'>&lt;p&gt;
While Google can't &lt;a href="http://www.google.com/romance/"&gt;find you a date&lt;/a&gt;, with the combined power of &lt;a href="http://www.google.com/apis/maps/"&gt;Maps API&lt;/a&gt; and somebody who has way too much time on his hands, you can &lt;a href="http://whereihadmyfirstkiss.com/"&gt;tell the world&lt;/a&gt; what happened (and where it happened) &lt;i&gt;after&lt;/i&gt; you got one.
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/400/Screenshot.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115052245930434783?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115052245930434783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115052245930434783' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115052245930434783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115052245930434783'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/06/powered-by-google-maps.html' title='Powered by Google Maps'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115043816058577442</id><published>2006-06-16T01:41:00.000-04:00</published><updated>2006-06-16T02:09:20.596-04:00</updated><title type='text'>onmousedown and performance</title><content type='html'>&lt;p&gt;
While checking my email on my coporate GMail account today, I noticed that when I clicked on a button in GMail (eg, Inbox, or on a message), it starts to open when you press the button down, rather than when you release it to make the full click. This is &lt;i&gt;not&lt;/i&gt; the typical behavior of a site (try it on any other hyperlink).
&lt;/p&gt;

&lt;p&gt;
After pondering for a while, I realized that this must be a performance thing. It must take 50-100ms for one to complete a click. However, pinging google.com from here (home, on a wireless connection) takes about 70ms. That head start by capturing onmousedown must be enough to hide most of the delay in fetching stuff.
&lt;/p&gt;

&lt;p&gt;
With a bit of further investigation, I found that Google Search uses the same thing. If you look at the html for a typical query, you will see &lt;tt&gt;onmousedown="return rwt(...&lt;/tt&gt;. &lt;tt&gt;rwt&lt;/tt&gt; appears to be a function that sends a request to &lt;tt&gt;google.com/url&lt;/tt&gt; with a query string that tells what result was clicked. This would make sense in collecting stuff about &lt;q&gt;are the best results really on the top position&lt;/q&gt;. It's genius that they slip this tracking in the onmousedown so that it does not affect user performance.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115043816058577442?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115043816058577442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115043816058577442' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115043816058577442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115043816058577442'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/06/onmousedown-and-performance.html' title='onmousedown and performance'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-115014204051177375</id><published>2006-06-12T15:50:00.000-04:00</published><updated>2006-06-12T15:54:00.526-04:00</updated><title type='text'>Bad situation #153</title><content type='html'>&lt;p&gt;
You print out the design for something you need to use. The first line is:&lt;br /&gt;
&lt;b&gt;Status: CURRENT&lt;/b&gt; &lt;small&gt;(as of November 19, 2003)&lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
It's time to start grepping the source code for what I need.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-115014204051177375?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/115014204051177375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=115014204051177375' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115014204051177375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/115014204051177375'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/06/bad-situation-153.html' title='Bad situation #153'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114831942076138698</id><published>2006-05-22T13:32:00.000-04:00</published><updated>2006-05-22T13:37:00.773-04:00</updated><title type='text'>Please don't me-too on bugs I blog</title><content type='html'>&lt;p&gt;On one of the Launchpad bugs I blogged, there have been a few me-too posts saying &lt;q&gt;Yeah, this problem sucks. Let's fix it&lt;/q&gt;. Please do not do this. When I blog about a bug, I have two goals. First, it allows people reading my blog to get an idea of what issues are being looked into in the performance front. If you are interested in our progress, you should feel free to subscribe to the bugs. Subscribing can be viewed as a vote for the bug. Second, I'd like to highlight some of the easy wins to the developer community. Commenting on a bug saying &lt;q&gt;I wish you would fix this&lt;/q&gt; helps nobody, and increases the time people have to spend on bugzilla. Please don't do it, or else I'll have to stop blogging bugs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114831942076138698?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114831942076138698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114831942076138698' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114831942076138698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114831942076138698'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/please-dont-me-too-on-bugs-i-blog.html' title='Please don&apos;t me-too on bugs I blog'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114824474100803018</id><published>2006-05-21T16:22:00.000-04:00</published><updated>2006-05-21T16:52:21.020-04:00</updated><title type='text'>Performance: The Good, The Bad, And The Ugly</title><content type='html'>&lt;p&gt;&lt;b&gt;The Good&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The latest Dapper betas are starting up GNOME with less than 95 MB of ram. This is really impressive. Everyone involved in this should feel really good about it.&lt;/li&gt;
&lt;li&gt;I think we're making good progress in terms of startup memory usage in general. In the next round of distros, I'm willing to bet we can bring the GNOME startup cost to about 85 MB. This will result in startup time reductions for everyone (even those with 1 GB of ram) and will be very important for low-memory users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;The Bad&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My box wastes 3.4 mb of private dirty ram to load hpssd, some sort of HP printing thing. I don't have a HP printer. Even if I did, why does 3.4 mb of stuff need to be loaded? This piece of software simply needs fixing. There's already a &lt;a href="https://launchpad.net/distros/ubuntu/+source/hplip/+bug/20309/"&gt;bug&lt;/a&gt; on this in launchpad.&lt;/li&gt;
&lt;li&gt;Evolution sees it fit to launch &lt;tt&gt;evolution-exchange-storage&lt;/tt&gt; just because the Exchange plugin is installed. This wasts 1.6 mb of private dirty ram. I personally think distributions should remove evolution-exchange from the default install set until this is fixed. Exchange users are likely using managed distros. Those people can install the plugin along with their other configurations. I filed a &lt;a href="https://launchpad.net/distros/ubuntu/+source/ubuntu-meta/+bug/43830"&gt;bug&lt;/a&gt; for Ubuntu to remove this from the default install. I also filed a &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=342522"&gt;Evolution bug&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The way Ubuntu uses gettext to translate gnome-panel items caused &lt;a href="https://launchpad.net/distros/ubuntu/+source/gnome-panel/+bug/45913"&gt;1.2 MB of memory&lt;/a&gt; to be used&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;The Ugly&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We load way too many processes at startup. nm-applet, gnome-volume-manager, gnome-power-manager, etc. All of these are loading must of the same stuff in their address space. I think we need to have some shared infrastructure for desktop plugins that listen for some sort of event and then take action on it. These are all small, simple tasks that should be in one process.&lt;/li&gt;
&lt;li&gt;Firefox, Evolution, and OpenOffice are still taking much more memory than they should. We may be reaching the point of diminishing returns in desktop startup memory. We will need to turn our focus to these apps.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114824474100803018?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114824474100803018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114824474100803018' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114824474100803018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114824474100803018'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/performance-good-bad-and-ugly.html' title='Performance: The Good, The Bad, And The Ugly'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114811369889653814</id><published>2006-05-20T03:03:00.000-04:00</published><updated>2006-05-20T14:21:34.663-04:00</updated><title type='text'>Life as a Noogler</title><content type='html'>&lt;p&gt;
It's the end of my first week at Google. It was a fairly mundane week. The first day I set a password, got a Google badge, and filled out forms (they have a very nice automated system that made filling out 16 forms a quick job). The food is, simply put, fantastic. A typical Google lunch would be a $20 dinner. The menu at Charlies, Google's primary eating establishment, has a wide varity of selections. The snacks are just as good. It's like I'm living in Whole Foods.
&lt;/p&gt;

&lt;p&gt;
There are a few things I'm getting used to at Google. It's really different than the world I'm used to. The oddest thing is how hush hush everything is. Every meeting starts out with "this is confidential". Sure, at Novell I had to deal with some things that were under NDA. In Google, you &lt;i&gt;presume&lt;/i&gt; all knowledge is under NDA by default.  Second, everyone at Google is new, or so it seems. When a social event is done, it seems like a common exercise is for people to raise their hand if they are new. A large number of people do this. The introductory training sessions are &lt;i&gt;huge&lt;/i&gt;. Google is growing at a rapid rate, it's really exciting.
&lt;/p&gt;

&lt;p&gt;
One of the most exciting parts of being at Google is the fun stuff to explore. Interns have access to almost all of the Google code base (interns fall into a bucket called &lt;q&gt;nonconfs&lt;/q&gt; who have a few restrictions, such as not being able to see the pagerank code). It's hard to resist the urge to explore code when there is work to be done.
&lt;/p&gt;

&lt;p&gt;
In other news: GStreamer was &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=341479"&gt;loading too many plugins&lt;/a&gt; in each process. This caused a few extra MB of private dirty memory for gstreamer using programs, like the settings daemon and mixer_applet2. This should be fixed now.
&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;ps&lt;/i&gt; noogler == new googler
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114811369889653814?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114811369889653814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114811369889653814' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114811369889653814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114811369889653814'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/life-as-noogler.html' title='Life as a Noogler'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114745900204199484</id><published>2006-05-12T14:17:00.000-04:00</published><updated>2006-05-12T20:18:35.116-04:00</updated><title type='text'>Google Trends</title><content type='html'>&lt;a href="http://google.com/trends"&gt;Google Trends&lt;/a&gt; is a really cool service. In case you don't read Slashdot, it gives you stats on who searches for what. Some are rather interesting, for example, you can find out what the popular Linux distros are in different parts of the world.
&lt;/p&gt;

&lt;div&gt;
&lt;img border=0 src='http://google.com/trends/images/dot1.gif' width=11 height=11&gt;&lt;font color='4684ee'&gt;suse&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img border=0 src='http://google.com/trends/images/dot2.gif' width=11 height=11&gt;&lt;font color='dc3912'&gt;fedora&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img border=0 src='http://google.com/trends/images/dot3.gif' width=11 height=11&gt;&lt;font color='ff9900'&gt;ubuntu&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img border=0 src='http://google.com/trends/images/dot4.gif' width=11 height=11&gt;&lt;font color='008000'&gt;debian&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/div&gt;

&lt;b&gt;Around the World&lt;/b&gt;&lt;br/&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/trends?q=suse%2C+fedora%2C+ubuntu%2C+debian"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/320/distro_world.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
&lt;b&gt;In the US&lt;/b&gt;&lt;br/&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/trends?q=suse%2C+fedora%2C+ubuntu%2C+debian&amp;ctab=0&amp;geo=US&amp;date=all"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/320/distro_us.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
&lt;b&gt;In Germany&lt;/b&gt;&lt;br/&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/trends?q=suse%2C+fedora%2C+ubuntu%2C+debian&amp;ctab=0&amp;geo=DE&amp;date=all"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/320/distro_germany.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
Google Trends also has great tastes in education.
&lt;div&gt;
&lt;img border=0 src='http://google.com/trends/images/dot1.gif' width=11 height=11&gt;&lt;font color='4684ee'&gt;Carnegie Mellon University&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img border=0 src='http://google.com/trends/images/dot2.gif' width=11 height=11&gt;&lt;font color='dc3912'&gt;Massachusetts Institute of Technology&lt;/font&gt;
&lt;/div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/trends?q=Carnegie+Mellon+University%2CMassachusetts+Institute+of+Technology"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/320/univ.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114745900204199484?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114745900204199484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114745900204199484' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114745900204199484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114745900204199484'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/google-trends.html' title='Google Trends'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114720461780685235</id><published>2006-05-09T15:42:00.000-04:00</published><updated>2006-05-09T15:56:57.823-04:00</updated><title type='text'>Track down your first leak!</title><content type='html'>&lt;p&gt;
Now that gnome-system-monitor &lt;a href"http://bmaurer.blogspot.com/2006/05/breaking-news-g-s-m-now-gives-useful.html"&gt;gives useful information&lt;/a&gt;, I've been keeping it open quite a while. There is pretty clearly a slow memory leak. The heap grows by just keeping it open (i've been having it in the process view). You need it open over a period of a few hours to notice the leak. I first saw it after leaving it on over night.
&lt;/p&gt;
&lt;p&gt;
Want an easy way to get your hands dirty with performance? This is your chance. I've filed the bug as &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=341175"&gt;#341175&lt;/a&gt;. Here is the plan of action:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reproduce the bug, make sure you can see it. I'm using GNOME 2.14, as it is packaged on Dapper.&lt;/li&gt;
&lt;li&gt;Run G-S-M under valgrind. I like to use the following flags &lt;tt&gt;valgrind --num-callers=20 --leak-check=yes --show-reachable=yes --leak-resolution=high gnome-system-monitor&lt;/tt&gt;. This will generate a large dump file, because it showes stuff that's still reachable. However, this will help you if gsm retains pointers to memory, but just doesn't use it.&lt;/li&gt;
&lt;li&gt;Figure out who's to blame&lt;/li&gt;
&lt;li&gt;Patch it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you complete any of these steps, please update your progress in the bug report. Again, this is a great chance for somebody new to performance work to get involved. If you need help, go to &lt;tt&gt;#performance&lt;/tt&gt; on IRC, and one of the performance hackers will help you.&lt;/p&gt;

&lt;p&gt;Talking of performance masters, Ubuntu users should thank Sebastien Bacher. The fair seb128 checked in &lt;a href="https://lists.ubuntu.com/archives/dapper-changes/2006-May/010553.html"&gt;a patch&lt;/a&gt; that puts many of the gnome-panel applets in process. This saves a good amount of ram. Thanks Sebastien!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114720461780685235?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114720461780685235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114720461780685235' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114720461780685235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114720461780685235'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/track-down-your-first-leak.html' title='Track down your first leak!'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114720354472470457</id><published>2006-05-09T15:36:00.000-04:00</published><updated>2006-05-09T20:24:02.346-04:00</updated><title type='text'>USB Wireless Help</title><content type='html'>&lt;s&gt;If you have experience using a USB wireless adapter on Linux, I'd really appreciate an email (&lt;a href="mailto:bmaurer+usbwifi@andrew.cmu.edu"&gt;bmaurer+usbwifi@andrew.cmu.edu&lt;/a&gt;). I've been having quite a bit of trouble finding something supported. Many thanks!&lt;/s&gt;
&lt;p&gt;
Thanks to those who responded. Responses I got, by chipset: prism, atmel (reported to require some hacking to get working), Ralink rt2570. One person recommened SWEEX Usb WLAN LC100010, saying it worked out of the box. Again, thanks for the quick help!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114720354472470457?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114720354472470457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114720354472470457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114720354472470457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114720354472470457'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/usb-wireless-help.html' title='USB Wireless Help'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114713519848058172</id><published>2006-05-08T20:26:00.000-04:00</published><updated>2006-05-09T11:26:16.960-04:00</updated><title type='text'>Breaking news: g-s-m now gives useful information</title><content type='html'>&lt;p&gt;
Tired of guessing what 20 MB of RSS &lt;i&gt;really&lt;/i&gt; means? Want numbers that give you statistics that aren't lies. Wait no longer. With a &lt;a href="http://cvs.gnome.org/viewcvs/gnome-system-monitor/src/proctable.c?r1=1.166&amp;amp;r2=1.167"&gt;simple patch&lt;/a&gt; gnome-system-monitor version 2.14.2 gives useful information when combined with a modern kernel (in FC5, Ubuntu Dapper, or SUSE 10.1).
&lt;/p&gt;

&lt;p&gt;
This new statistic is the &lt;q&gt;Writable Memory&lt;/q&gt; column in gnome-system-monitor. You may have to modify your preferences to expose this. This column gives you the &lt;i&gt;private dirty RSS&lt;/i&gt;, the memory statistic which I've talked about in previous posts. This is the amount of memory that is private to your process, modified from the on disk version, and loaded into memory. The number is a very good indication of how much memory you are using.
&lt;/p&gt;

&lt;img src="http://www.contrib.andrew.cmu.edu/~bmaurer/memory/gsm-writable.png"/&gt;

&lt;p&gt;
Note how the Writable Memory column is less than the traditionally used RSS. This is becaused shared rss is not taken in to account.
&lt;/p&gt;

&lt;p&gt;
I'd like to propose that we make One True Statistic for g-s-m: writable memory + X memory. This is an &lt;i&gt;very&lt;/i&gt; accurate accounting of memory usage. I think it's as good as we can get without further kernel patches.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114713519848058172?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114713519848058172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114713519848058172' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114713519848058172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114713519848058172'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/05/breaking-news-g-s-m-now-gives-useful.html' title='Breaking news: g-s-m now gives useful information'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114459875803950711</id><published>2006-04-09T12:03:00.000-04:00</published><updated>2006-04-09T17:17:21.393-04:00</updated><title type='text'>Fighting Daemons</title><content type='html'>One of the things I love about GNOME and Linux in general is the philosophy of "do one thing, and do it right". However, we may have taken this to an extreme in the GNOME community. The GNOME desktop has seperate daemons for a plethora of simple tasks. &lt;tt&gt;nm-applet&lt;/tt&gt; sits around and waits for the network connection status to change. Great, I love &lt;tt&gt;nm-applet&lt;/tt&gt;. But does this task warrent 2.7 MB of memory? According to my smem script, this is the amount of private dirty rss the task takes.
&lt;p&gt;
To initialize the GTK+ framework (among other frameworks), one must allocate a given amount of memory on the heap. Depending on what parts of the stack (dbus, libgnomeui, etc) one loads, this ranges from 1-3 MB. While it's important to work to fix this (eg, by mmaping things), there's only so much we can do.
&lt;p&gt;
I believe it would be beneficial to have a host process for daemons like this. The system would need to be set up in such a way so that mini-daemons could be put into a different process via configuration (eg, for debugging).
&lt;p&gt;
One of the types daemons on the desktop is panel applets. We have a process to display the clock, the volume switcher, etc. The panel already has a framework for doing these in process. What would be the benefit of using this? To find out, I put two applets in process: the wnck-applet which handles the workspace switcher and task list and the notification-area-applet, which handles the notification tray.
&lt;p&gt;
I actually already had the patch for this. openSUSE already uses a similar patch thanks to Federico. I decided to modify the patch so that it would not put clock-applet in process. Some people have complained that because this links to evo, it might be at risk for crashing. Fine, whatever. Let's start with some low hanging fruit.
&lt;p&gt;
Here are the results for private dirty rss, before and after &lt;a href="http://www.contrib.andrew.cmu.edu/~bmaurer/memory/"&gt;the patch&lt;/a&gt;.
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Process&lt;/th&gt;&lt;th&gt;Before&lt;/th&gt;&lt;th&gt;After&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;gnome-panel&lt;/td&gt;&lt;td&gt;4008 kb&lt;/td&gt;&lt;td&gt;4248 kb&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;notification-area-applet&lt;/td&gt;&lt;td&gt;1368 kb&lt;/td&gt;&lt;td&gt;--&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;wnck-applet&lt;/td&gt;&lt;td&gt;3056 kb&lt;/td&gt;&lt;td&gt;--&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;TOTAL&lt;/td&gt;&lt;td&gt;8432 kb&lt;/td&gt;&lt;td&gt;4248 kb&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
This is over 4mb! Just for putting two things in process. There are three other applets on my Dapper computer that could benefit just as easily: trash-applet (trivial), mixer applet (see below), clock applet (links to evo stuff. maybe?). I hope other distros follow the led of openSUSE in this area.
&lt;p&gt;
One thing to look at: the mixer applet loads every single part of gstreamer. This causes extra memory usage (gstreamer plugins badly need constification), as well as extra spinning of the disk. Can this be fixed?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114459875803950711?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114459875803950711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114459875803950711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114459875803950711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114459875803950711'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/04/fighting-daemons.html' title='Fighting Daemons'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114452073941855555</id><published>2006-04-08T13:48:00.000-04:00</published><updated>2006-04-10T23:37:13.076-04:00</updated><title type='text'>Google</title><content type='html'>I will be interning at Google this summer in the AdWords anti-fraud team. This is a really exciting opportunity for me.
&lt;p&gt;
I'd like to publicly thank  my friends and colleagues on the Mono project for the fantastic learning experience I've had over the past three years. There are a few people I'd like to give an extra-special thanks:
&lt;p&gt;
&lt;ul&gt;&lt;li&gt;Sebastien, for guiding me through my first project, BigInteger.
&lt;/li&gt;&lt;li&gt;Atsushi, for guidance on the project I'm probably most proud of, the XSLT engine.&lt;/li&gt;&lt;li&gt;Paolo, for code reviews that have begun to teach me the meaning of "good style" (and I admit, I'm still learning).&lt;/li&gt;&lt;li&gt;Miguel, for believing in me and being a great mentor/friend/boss.&lt;/li&gt;&lt;/ul&gt;I'll still work with Mono on the side and stay in touch via IRC and email.
&lt;p&gt;
If you are a college (or high school student) reading this, I would like to give you one piece of advice. &lt;span style="font-style: italic;"&gt;Get involved in an open source project&lt;/span&gt;. It will be the best choice of your life. Even the &lt;a href="http://www.cs.cmu.edu/"&gt;world's best computer science schools&lt;/a&gt; are very bad at teaching you what you &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; need to know to get work done. CS classes teach theory, not how to write good code. Hacking on open source software is the best way to be a smart programmer. Open source projects are more than happy to take on a dedicated hacker, even one who makes mistakes at first. Hacking will be the best decision you ever made. Your chances of getting an internship are greatly increased by working on OSS.
&lt;p&gt;
As a side note: for those of you who missed my previous blog because pgo wasn't picking up my feed, I'm going to GUADEC. Be prepared to kill bloat.
&lt;p&gt;
(I promise performance blogs are coming soon. Really)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114452073941855555?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114452073941855555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114452073941855555' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114452073941855555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114452073941855555'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/04/google.html' title='Google'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114435623162600656</id><published>2006-04-06T19:50:00.000-04:00</published><updated>2006-04-06T19:40:54.396-04:00</updated><title type='text'>Newslets</title><content type='html'>&lt;ul&gt;&lt;li&gt;    I'm going to GUADEC, now that I am being sponsored. Be prepared to kill bloat with the Ben, Federico, Behdad team. If you're interested in memory reduction, it'd be great to have you.&lt;/li&gt;&lt;li&gt;    With leadership from Daniel Holbach, Ubuntu will be &lt;a href="https://lists.ubuntu.com/archives/ubuntu-devel/2006-April/017061.html"&gt;using the icon cache&lt;/a&gt;. Yay.&lt;/li&gt;&lt;li&gt;I promise for some more juicy memory reduction content soon, after I finish 15-251 (Discrete Math) homework.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114435623162600656?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114435623162600656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114435623162600656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114435623162600656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114435623162600656'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/04/newslets.html' title='Newslets'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114403398308496893</id><published>2006-04-02T22:53:00.000-04:00</published><updated>2006-04-02T23:13:03.096-04:00</updated><title type='text'>More Icon Cache</title><content type='html'>It's too bad that we are at a standstill as to using the GTK Icon Cache in Ubuntu/Debian. Clearly, both Fedora and SUSE have implemented the standards defined policy and have (to my knowledge) not encountered major issues.
&lt;p&gt;

While the impressive number of over 300 packages quoted on the Ubuntu bug seems like a very hard task, distributed across many contributers, I can't imagine this being a blocking issue. As for 3rd party apps: sure, &lt;i&gt;could&lt;/i&gt; cause a third party app to break. But the same app will be broken on any other issue.

&lt;p&gt;

Even if the Debian folks absolutely do &lt;i&gt;not&lt;/i&gt; want to risk breaking something, how about at least using the shared memory aspect of the cache? You can stat every directory in /usr/share/icons to make sure the cache is valid. But if it is, you'll save 300kb per process by &lt;i&gt;using&lt;/i&gt; the cache.

&lt;p&gt;
Anyways, it looks like the spec is staying as is. The folks upstream have given (IMHO) a well reasoned argument that the spec is implementable and reasonable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114403398308496893?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114403398308496893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114403398308496893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114403398308496893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114403398308496893'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/04/more-icon-cache.html' title='More Icon Cache'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114382753413048963</id><published>2006-03-31T12:49:00.000-05:00</published><updated>2006-03-31T12:52:14.280-05:00</updated><title type='text'>Make sure to use the Icon Cache</title><content type='html'>It's sad when people take great efforts to optimize the memory usage of a program, only to have the optimization not used. It seems like, due to &lt;a href="https://launchpad.net/malone/bugs/17970"&gt;a packaging bug&lt;/a&gt;, Ubuntu isn't taking advantage of GTK's icon cache, wasting 300 kb per process.

&lt;p&gt;

Not sure what we can do to make sure every distro takes the actions necessary to get the best performance out of GNOME, I guess there's always the process of filing bugs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114382753413048963?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114382753413048963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114382753413048963' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114382753413048963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114382753413048963'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/03/make-sure-to-use-icon-cache.html' title='Make sure to use the Icon Cache'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114374768859791334</id><published>2006-03-30T14:38:00.000-05:00</published><updated>2006-03-30T14:41:28.616-05:00</updated><title type='text'>Zenity Memory Usage: Valgrind</title><content type='html'>So, on the latest Dapper beta, I tried running valgrind on an instance of Zenity, a fairly good example of a minimal gtk program. I noticed that stuff was getting allocated for the icon data:

&lt;p&gt;

&lt;pre&gt;
==24632== 74,477 bytes in 2,864 blocks are still reachable in loss record 4,829 of 4,830
==24632==    at 0x401C422: malloc (vg_replace_malloc.c:149)
==24632==    by 0x479FF36: g_malloc (in /usr/lib/libglib-2.0.so.0.1000.1)
==24632==    by 0x47AFC65: g_strdup (in /usr/lib/libglib-2.0.so.0.1000.1)
==24632==    by 0x42BAD04: ??? (gtkicontheme.c:2161)
==24632==    by 0x42BAF11: ??? (gtkicontheme.c:1057)
==24632==    by 0x42BBC5F: gtk_icon_theme_lookup_icon (gtkicontheme.c:1244)
==24632==    by 0x42BC108: gtk_icon_theme_load_icon (gtkicontheme.c:1388)
==24632==    by 0x42B74C1: gtk_icon_set_render_icon (gtkiconfactory.c:1748)
==24632==    by 0x43D0CAB: gtk_widget_render_icon (gtkwidget.c:5337)
&lt;/pre&gt;

&lt;p&gt;
There were other stack traces here, accounting for over 200kb of memory. I tried regenerating my cache, this had no effect. Have to see what is going on. Also, this stack trace was very curious:

&lt;p&gt;
&lt;pre&gt;
==24632== 337,656 bytes in 94 blocks are still reachable in loss record 4,830 of 4,830
==24632==    at 0x401C422: malloc (vg_replace_malloc.c:149)
==24632==    by 0x494FC0C: (within /usr/lib/libfreetype.so.6.3.8)
==24632==    by 0x41B0E9A: (within /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B6974: (within /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B237A: (within /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B4DA1: (within /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B02D1: pango_ot_info_get_gpos (in /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B0357: (within /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x41B0407: pango_ot_info_find_script (in /usr/lib/libpangoft2-1.0.so.0.1200.0)
==24632==    by 0x4C162E9: (within /usr/lib/pango/1.5.0/modules/pango-basic-fc.so)
==24632==    by 0x45E4D12: (within /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x45F3FB3: pango_shape (in /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x45E7BCE: (within /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x45EAD1A: (within /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x45EB274: (within /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x45EBBCB: (within /usr/lib/libpango-1.0.so.0.1200.0)
==24632==    by 0x42DA876: ??? (gtklabel.c:2027)
&lt;/pre&gt;

&lt;p&gt;I wonder exactly what this is that needs 300 kb of memory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114374768859791334?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114374768859791334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114374768859791334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114374768859791334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114374768859791334'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/03/zenity-memory-usage-valgrind.html' title='Zenity Memory Usage: Valgrind'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114308247073241541</id><published>2006-03-22T21:31:00.000-05:00</published><updated>2006-03-22T21:54:30.750-05:00</updated><title type='text'>libaudiofile patch</title><content type='html'>Jason Allen commented on my last blog with a &lt;a href="http://lorddut.dyndns.org/~lord_dut/audiofile.patch"&gt;patch&lt;/a&gt; to fix libaudiofile. This simple patch just adds &lt;q&gt;const&lt;/q&gt; to lots of data tables. It trims the 92 kb of dirty private rss down to 8 kb, saving just under 2 mb desktop wide! Jason: this patch is great. Let's get it upstream, and also try to get the next round of distros (suse 10.1, dapper, fc5) to include this. 
&lt;p&gt;
There are quite a few other libraries that are used by almost every GNOME process that could benefit from such constification. Some I saw from gnome-terminal:
&lt;p&gt;
&lt;pre&gt;
      48 kb        0 kb       48 kb   /usr/lib/libORBit-2.so.0.1.0
      40 kb        0 kb       40 kb   /usr/lib/libbonobo-2.so.0.0.0
      36 kb        0 kb       36 kb   /usr/lib/libgtk-x11-2.0.so.0.800.16
      36 kb        0 kb       28 kb   /usr/lib/libxml2.so.2.6.23
      24 kb        0 kb       24 kb   /usr/lib/libgnutls.so.12.3.6
      20 kb        0 kb       20 kb   /usr/lib/libasound.so.2.0.0
      20 kb        0 kb       20 kb   /usr/lib/libfontconfig.so.1.0.4
      20 kb        0 kb       20 kb   /usr/lib/libgnomevfs-2.so.0.1400.0
      20 kb        0 kb       16 kb   /usr/lib/libgcrypt.so.11.2.1
      16 kb        0 kb       16 kb   /usr/lib/libX11.so.6.2.0
      16 kb        0 kb       16 kb   /usr/lib/libgnomeui-2.so.0.1400.0
&lt;/pre&gt;
&lt;p&gt;
Fixing one of these libraries will have the benefit multiplied by about 20.
&lt;p&gt;
We should also consider is reducing the number of processes on the desktop. For example, clock-applet takes up 2.7 MB of private dirty rss. 1.7 MB of this is the heap and stack, the other MB is the .data section of .so files. For the most part, these are constant costs we are going to experience with any process. Reducing the number of processes will reduce this problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114308247073241541?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114308247073241541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114308247073241541' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114308247073241541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114308247073241541'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/03/libaudiofile-patch.html' title='libaudiofile patch'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-114299450063092976</id><published>2006-03-21T20:44:00.000-05:00</published><updated>2006-12-06T22:48:22.731-05:00</updated><title type='text'>Memory Usage with smaps</title><content type='html'>As most developers should know by now, the memory statistics given on Linux are mostly &lt;a href="http://mail.gnome.org/archives/gnome-list/1999-September/msg00036.html"&gt;meaningless&lt;/a&gt;. We have the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;vmsize&lt;/span&gt;, which counts the total address space used by a process. However, this is not accurate because it counts pages that are not mapped in to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;memory&lt;/span&gt;. We also have &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;rss&lt;/span&gt;, which measures pages mapped into memory. However, it &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;multi&lt;/span&gt;-counts shared pages: every process gets X &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;kb&lt;/span&gt; of &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;rss&lt;/span&gt; due to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;libgtk&lt;/span&gt;. However, the majority of the pages in &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;libgtk&lt;/span&gt; are shared across the processes.&lt;p&gt;
What we really care about is the &lt;i&gt;private &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;rss&lt;/span&gt;&lt;/i&gt;, the amount of pages our process maps in to memory that are only used by our process. We'd also like to know the &lt;i&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;rss&lt;/span&gt; per mapping&lt;/i&gt; so that we can point-fingers/find-where-to-fix-the-bug.&lt;/p&gt;&lt;p&gt;
Up until this point, such statistics have been hard to come by. No longer! The 2.6.16 kernel adds support for &lt;q&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;smaps&lt;/span&gt;&lt;/q&gt;, per-mapping data, including data on each mapping's &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;rss&lt;/span&gt; usage. This data lives in &lt;tt&gt;/&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;proc&lt;/span&gt;/$&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;pid&lt;/span&gt;/&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;smaps&lt;/span&gt;&lt;/tt&gt;. However, the format of the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;smaps&lt;/span&gt; file is hard to digest. I've written a quick &lt;a href="http://www.contrib.andrew.cmu.edu/%7Ebmaurer/memory/smem.pl"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;perl&lt;/span&gt; script&lt;/a&gt; which parses this into something more useful. It uses the &lt;tt&gt;Linux::&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Smaps&lt;/span&gt;&lt;/tt&gt; module on &lt;a href="http://search.cpan.org/%7Eopi/Linux-Smaps-0.01/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;CPAN&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;
An example of the data generated by this script:

&lt;/p&gt;&lt;blockquote&gt;
&lt;pre&gt;
&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;VMSIZE&lt;/span&gt;:      41132 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;kb&lt;/span&gt;
&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;RSS&lt;/span&gt;:         23052 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;kb&lt;/span&gt; total
         9212 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;kb&lt;/span&gt; shared
            0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;kb&lt;/span&gt; private clean
        13840 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;kb&lt;/span&gt; private dirty
PRIVATE MAPPINGS
&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;vmsize&lt;/span&gt;   &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;rss&lt;/span&gt; clean   &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;rss&lt;/span&gt; dirty   file
12768 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;kb&lt;/span&gt;    12616 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;kb&lt;/span&gt;   [heap]
196 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;kb&lt;/span&gt;      196 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;kb&lt;/span&gt;
120 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;kb&lt;/span&gt;       92 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;kb&lt;/span&gt;   /usr/lib/libaudiofile.so.0.0.2
132 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;kb&lt;/span&gt;       80 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;kb&lt;/span&gt;
 80 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;kb&lt;/span&gt;       60 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;kb&lt;/span&gt;   [stack]
 48 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;kb&lt;/span&gt;       48 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;kb&lt;/span&gt;   /usr/lib/libORBit-2.so.0.1.0
 40 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;kb&lt;/span&gt;       40 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;kb&lt;/span&gt;   /usr/lib/libbonobo-2.so.0.0.0
 36 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;kb&lt;/span&gt;       36 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;kb&lt;/span&gt;   /usr/lib/libgtk-x11-2.0.so.0.800.16
...
SHARED MAPPINGS
&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;vmsize&lt;/span&gt;   &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;rss&lt;/span&gt; clean   &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;rss&lt;/span&gt; dirty   file
2848 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;kb&lt;/span&gt;     1596 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;kb&lt;/span&gt;   /usr/lib/libgtk-x11-2.0.so.0.800.16
1172 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;kb&lt;/span&gt;      624 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;kb&lt;/span&gt;   /lib/tls/i686/cmov/libc-2.3.6.so
488 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;kb&lt;/span&gt;      400 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;kb&lt;/span&gt;   /usr/lib/libgdk-x11-2.0.so.0.800.16
900 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;kb&lt;/span&gt;      396 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;kb&lt;/span&gt;   /usr/lib/libX11.so.6.2.0
524 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;kb&lt;/span&gt;      360 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;kb&lt;/span&gt;        0 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;kb&lt;/span&gt;   /usr/lib/libglib-2.0.so.0.1000.1

&lt;/pre&gt;&lt;/blockquote&gt;
The &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;vmsize&lt;/span&gt; and total &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;rss&lt;/span&gt; size are the statistics that everyone is used to. The &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_73"&gt;rss&lt;/span&gt; size is split into &lt;q&gt;private&lt;/q&gt; and &lt;q&gt;shared&lt;/q&gt;. The private &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;rss&lt;/span&gt; is what could be best called the process' memory usage.&lt;p&gt;
Below this, we give the per-mapping statistics for private mappings. Most of these are either from the heap (&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_75"&gt;eg&lt;/span&gt;, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;malloc'd&lt;/span&gt; data), or writable mappings in .so files (from the .data section). This output is especially helpful for diagnosing the second kind. Following, we give the same data for shared mappings (most of which are .so files, the executable code, etc).&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Call to action:&lt;/b&gt; I would love to see the following done:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Check out some of the libraries with large writable segments. An extreme example of this is
&lt;tt&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_77"&gt;libaudiofile&lt;/span&gt;&lt;/tt&gt;. This library has 92 &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_78"&gt;kb&lt;/span&gt; of dirty, private &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_79"&gt;rss&lt;/span&gt; (isn't that naughty!). To make matters worse, the library is used by &lt;i&gt;22&lt;/i&gt; processes on my GNOME 2.14 desktop. This is about 2 MB of memory! Let's figure out why this is happening and make the data &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_80"&gt;const&lt;/span&gt;. Also, it might be wise to see if we could reduce the number of programs using this library. We should try to find any other instances of this.
&lt;/li&gt;&lt;li&gt;Let's get some &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_81"&gt;smaps&lt;/span&gt; based data in gnome-system-monitor, and possibly more low level tools as well.
&lt;/li&gt;&lt;li&gt;We should look at tools like &lt;a href="http://www.berthels.co.uk/exmap/"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_82"&gt;exmap&lt;/span&gt;&lt;/a&gt; to get per-page level &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_83"&gt;rss&lt;/span&gt; into. This is useful for finding out things like &lt;q&gt;what pages does evolution use from &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_84"&gt;libgtk&lt;/span&gt; and why&lt;/q&gt;. We can use this tool to figure out what we can do for low memory users: we can simulate high levels of swapping by allocating memory in a dummy process. We should then see what pages must be loaded from disk to use the desktop, evolution, etc.
&lt;/li&gt;&lt;li&gt;It'd be great to set a community goal for 2.16. &lt;q&gt;We will reduce the private &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_85"&gt;rss&lt;/span&gt; used by all GNOME processes in setup X by Y MB&lt;/q&gt;. We should also take statistics from 2.14 to make sure that there are no memory usage regressions.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
In other performance related news, somebody has &lt;a href="http://people.redhat.com/berrange/olpc/performance/epiphany/"&gt;finally&lt;/a&gt; gotten good statistics on &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_86"&gt;Firefox's&lt;/span&gt; memory usage. It looks like Mozilla is leaking &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_87"&gt;pixmaps&lt;/span&gt; when browsing with tabs. I think there are many people who would be made much happier if this could be fixed. This is really great data gathering, and I'd like to see more of it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-114299450063092976?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/114299450063092976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=114299450063092976' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114299450063092976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/114299450063092976'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2006/03/memory-usage-with-smaps.html' title='Memory Usage with smaps'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-113316217210758767</id><published>2005-11-28T02:03:00.000-05:00</published><updated>2005-11-28T02:16:12.120-05:00</updated><title type='text'>Web desktop?</title><content type='html'>&lt;a href="http://tirania.org/blog/archive/2005/Nov-27-1.html"&gt;Miguel&lt;/a&gt;, your ideas aren't without merit. However, I am a bit scared of the web desktop. First, this would involve a substantial security risk, just by exposing new applications to external threats. Probably not an issue at home for you, since you are a home user with a firewall. But here at the university, opening up a port means opening it to the world. Needless to say, I'd hope that any such service was off by default, and had a good audit.

Second, is it really necessary for each application to provide the functionality from scratch? Windos users have had SMB/CIFS since forever. If I want to share files with my family, I tell them to go to \\ben\photos, and they'll see the photos. In your case they go to http://ben:123/photos. Of course, the http user will get a spiffy UI.

But what are the advantages to the SMB method:

&lt;ul&gt;
&lt;li&gt;One central security provider (the ACLs on the files). One program to audit&lt;/li&gt;
&lt;li&gt;No work required for the application programmer&lt;/li&gt;
&lt;li&gt;The files can be accessed even if f-spot or whatever isn't open&lt;li&gt;
&lt;/ul&gt;

What about a combination of the two: we use Apache (a very well audited server) to serve up webdav based file sharing. Windows, Linux and Macs should be able to mount webdav shares. WebDAV could become the Linux SMB. However, users could also use a custom browser based view with search/rich ui. With your plan, it seems like every application would be reinventing the wheel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-113316217210758767?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/113316217210758767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=113316217210758767' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/113316217210758767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/113316217210758767'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/11/web-desktop.html' title='Web desktop?'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-113164940455978805</id><published>2005-11-10T13:52:00.000-05:00</published><updated>2005-11-10T17:30:47.063-05:00</updated><title type='text'>Pornography And CMU</title><content type='html'>&lt;p&gt;Interesting email in my in box this morning. The &lt;a href="http://www.cs.cmu.edu/~pattis/"&gt;SCS Frosh Advisor&lt;/a&gt; emailed the list that a student asked for an IC point [1] to be offered for watching &lt;a href="http://imdb.com/title/tt0477457/"&gt;an adult movie&lt;/a&gt; that is being shown at CMU.&lt;/p&gt;

&lt;p&gt;Historically, it has been found that if CMU published in the schedule of movies that it was shoing an adult film, some local media would make a fuss about it. So, a semi-secret code was adopted that adult films would be listed TBA. I say semi-secret because Google &lt;a href="http://www.google.com/search?q=cmu+tba+porn"&gt;knows&lt;/a&gt; what this means. My advisor decided not to offer an IC point (even though one of the tasks had been "watch a movie at cmu") for the TBA movies, reasoning that he should try to avoid "CMU Advisor Encourgages Porno" in the local tabloid^Wnewspaper (of course by blogging that I've somewhat circumvented this ;-).&lt;/p&gt;

&lt;p&gt;One piece of advice Rich gave was that when he was a student at CMU he attended a showing of _Deep Throat_ and found that the effect of watching porn was reduced by watching it with a large group of students in a large auditorium. Sounds logcial.&lt;/p&gt;

&lt;p&gt;[1] For background the IC is the SCS frosh imigration course. In order to pass this course we must attend almost all of the (sometimes boring) weekly guest lectures. We must also earn "IC" points which are basically proof that we did things other than sit in front of a computer. The point list is &lt;a href="http://www.andrew.cmu.edu/course/15-128/pointlist.html"&gt;here&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;b&gt;EDIT:&lt;/b&gt; at Rich's request I've removed the original email&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-113164940455978805?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/113164940455978805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=113164940455978805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/113164940455978805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/113164940455978805'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/11/pornography-and-cmu.html' title='Pornography And CMU'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112797002303853825</id><published>2005-09-29T00:55:00.000-04:00</published><updated>2005-09-29T01:00:23.096-04:00</updated><title type='text'>Numbers</title><content type='html'>Pretty good joke I heard today:

&lt;p&gt;
President Bush was at a meeting yesterday when one of his advisors told him that a Brazilian soldier had been killed in Iraq. 
&lt;p&gt;     
"OH NO!" shouted Bush, "that's terrible!"
&lt;p&gt;
A silence fell over the room while everyone looked at Bush.
&lt;p&gt;        
He looked back up the advisor with tears in his eyes and said "Just how many is a Brazilian!?"
&lt;p&gt;

&lt;center&gt;
&lt;a href="http://omega.res.cmu.edu/gallery/v/lifeatcmu/numbers/00022.jpg.html"&gt;&lt;img src="http://omega.res.cmu.edu/gallery/d/781-2/00022.jpg" /&gt;&lt;/a&gt;&lt;p&gt;
&lt;i&gt;The President would not fare well at &lt;a href="http://www.cmu.edu"&gt;CMU&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112797002303853825?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112797002303853825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112797002303853825' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112797002303853825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112797002303853825'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/09/numbers.html' title='Numbers'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112771500669619551</id><published>2005-09-26T02:01:00.000-04:00</published><updated>2005-09-26T02:10:06.696-04:00</updated><title type='text'>The life of CMU CS Frosh, in pictures</title><content type='html'>&lt;center&gt;
&lt;a href="http://omega.res.cmu.edu/gallery/v/pittsburgh/cityscapes/burghbynight.jpg.html"&gt;&lt;img src="http://omega.res.cmu.edu/gallery/d/342-1/burghbynight.jpg"/&gt;&lt;/a&gt;

&lt;p&gt;


&lt;a href="http://omega.res.cmu.edu/gallery/v/dorm/morewood4e/IMG_0583.JPG.html"&gt;&lt;img src="http://omega.res.cmu.edu/gallery/d/740-2/IMG_0583.JPG"/&gt;&lt;/a&gt;

&lt;p&gt;

&lt;a href="http://omega.res.cmu.edu/gallery/v/art/justin_rebelxt/IMG_0727.JPG.html"&gt;&lt;img src="http://omega.res.cmu.edu/gallery/d/708-2/IMG_0727.JPG"/&gt;&lt;/a&gt;

&lt;/center&gt;

This, and more on the &lt;a href="http://omega.res.cmu.edu/gallery/"&gt;SCS Freshman Photo Web Site&lt;/a&gt;, being run on the desktop computer here in my dorm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112771500669619551?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112771500669619551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112771500669619551' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112771500669619551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112771500669619551'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/09/life-of-cmu-cs-frosh-in-pictures.html' title='The life of CMU CS Frosh, in pictures'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112748909675188986</id><published>2005-09-23T11:20:00.000-04:00</published><updated>2005-09-23T11:24:56.756-04:00</updated><title type='text'>RE: Should I use Gnome#?</title><content type='html'>&lt;p&gt;&lt;a href="http://spaces.msn.com/members/jluke19/Blog/cns!1p0-nklelyrMCYFdvkUe0boA!108.entry"&gt;jluke&lt;/a&gt;, you have fallen into the all too common trap of relying on RSS statistics as a measure of memory usage. RSS means "how many pages of memory did this process use". This number &lt;em&gt;includes&lt;/em&gt; shared pages. Now, I think it's a reasonable assumption that alot of pages from libgnomeui.so etc are paged into the system without the Mono application in question. What you really want to count is how many private pages get into memory. This is much harder to measure, in fact, we don't have the tools to really do this correctly.

&lt;p&gt;
That being said, there are other reasons not to use Gnome#, one of which being that better versions of the stuff in there are being moved to Gtk#.

&lt;p&gt;
If you are thinking about measuring the amount of ram a process uses, please, please, please be careful about what numbers you look at. It's really easy to come up with nutty conclusions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112748909675188986?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112748909675188986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112748909675188986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112748909675188986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112748909675188986'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/09/re-should-i-use-gnome.html' title='RE: Should I use Gnome#?'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112521056337402537</id><published>2005-08-28T02:15:00.000-04:00</published><updated>2005-08-28T17:39:10.303-04:00</updated><title type='text'>Linux for College Students</title><content type='html'>&lt;p&gt;It is pretty interesting how many CMU students want to try out linux but don't know how. And these are not just male CS students -- a diverse range of people is interested in what else is out there. Firefox has huge exposure at CMU and on other college campuses. People know about Linux but don't know how to take the plunge. I think it is important that we try to incubate new Linux users at universities like CMU. These are our future engineers, scientists, and programmers.&lt;/p&gt;

&lt;p&gt;
So, I think the best way to start thinking about this is "what do students do with their computers?" With a corporate desktop (like NLD) this part of the game is pretty easy. Employees have well defined tasks. College students are a much more interesting crowd. I don't think we will be able to replicate 100% the programs that students are used to. But let's take a look at what is important:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Being able to play every video and music format on Earth.&lt;/li&gt;
  &lt;li&gt;P2P sharing (i2hub!)&lt;/li&gt;
  &lt;li&gt;Using Flash&lt;/li&gt;
  &lt;li&gt;Fully functional java environment (eclipse+tools+your choice of gcj or sun java)&lt;/li&gt;
  &lt;li&gt;Being able to read &lt;b&gt;every&lt;/b&gt; pdf thrown at them (that means acroread -- I love evince but there are some documents it does not want to read).&lt;/li&gt;
  &lt;li&gt;0-hassle integration with their campus network (at CMU, afs should be mounted)&lt;/li&gt;
  &lt;li&gt;Allow easy installation of university licensed software (mathematica!)&lt;/li&gt;
  &lt;li&gt;iPods must work with no hassle.&lt;/li&gt;
  &lt;li&gt;All wireless cards must work (I had to go through some hoops to get my Dell laptop's wireless to work. Not cool).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The most important part is taking a stock distro and making it do the tasks I listed above &lt;b&gt;extremely&lt;/b&gt; easily. We can't expect people to go through 100 hoops just to play a DVD. There are some obvious legal issues here. But given that we college students have found ways to host terrabytes of copyrighted music and video, I don't see why it should be such a challenge for us to host a small amount of software that may have whatever issues.&lt;/p&gt;

&lt;p&gt;
Once this step is done, we would need to consider how to get Linux out to users. I think this has two aspects. First we need to have "Linux Heros" who can help people out. &lt;a href="http://facebook.com"&gt;facebook&lt;/a&gt; would be a great place to start this. The second aspect is making it easy to actually install Linux. On a campus network, bandwidth is virtually free (at least within the univ. and other internet2 campuses). Therefore, the media should come from the campus network. I think a pxeboot system would be very powerful: with the help of a person familiar with how to use the BIOS, Linux can be installed with no physical media. Also, "kickstart" disks could be distributed that would boot to the pxe system for people with network cards that don't support pxe or who don't know how to use the bios.
&lt;/p&gt;
&lt;p&gt;
I guess the way to start making this work would be to get a list of rpms that can be installed to make my above task list work. If packages don't exist, we need to create them. Where possible, we should prefer open source, patent-free stuff, but where that does not exist/does not have the functionality students need/etc, other solutions are needed.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Late breaking ideas&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;What if we make a Windows program that modifies the MBR so that on the next boot, it will go to the pxe server. This allows people to use pxe without touching the bios and without needing any physical media&lt;/li&gt;
  &lt;li&gt;Presentations / Demos of Linux&lt;/li&gt;
  &lt;li&gt;Form a community. Do some non-geeky stuff. Ice cream social for Linux. Could be integrated with presentations (hook them with ice cream, get them to watch the demo of linux)&lt;/li&gt;
  &lt;li&gt;Give "Linux Heros" free t-shirts. If we have enough heros, it won't be hard to find a person wearing their tshirt on any given day. These people can answer questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Later Breaking&lt;/b&gt;:

&lt;ul&gt;
  &lt;li&gt;See &lt;a href="http://www.gnu.org/software/grub/manual/html_node/Network.html"&gt;GRUB docs&lt;/a&gt; for ideas about booting from the network. So we give the user a grub config file with the pxe server specified&lt;/li&gt;
  &lt;li&gt;Install grub on windows &lt;a href="http://www.geocities.com/lode_leroy/grubinstall/"&gt;without touching the MBR&lt;/a&gt;. If I understand this correctly, it would mean a dual stage boot: first it goes into the NTLDR menu then the grub menu. But, it sounds a bit less risky.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Laterer Breaking&lt;/b&gt;

&lt;ul&gt;
  &lt;li&gt;A guide to &lt;a href="http://marc.herbert.free.fr/linux/win2linstall.html"&gt;installing Linux with no media&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Going with the community, how about an irc hangout for linux users at university?&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112521056337402537?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112521056337402537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112521056337402537' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112521056337402537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112521056337402537'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/08/linux-for-college-students.html' title='Linux for College Students'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112516573292698989</id><published>2005-08-27T13:51:00.000-04:00</published><updated>2005-08-28T01:52:26.560-04:00</updated><title type='text'>At CMU</title><content type='html'>&lt;p&gt;
Am at the CMU campus:
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/cmu1.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/400/cmu.jpeg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
In the center is Hamerschlag Hall. The large tower on the right is &lt;a href="http://www.pitt.edu"&gt;Pitt's&lt;/a&gt; Cathedral of Learning. The ugly looking slab on the right is Wean Hall, the CS building.
&lt;p&gt;
Abstract art at Carnegie Museum of Art (cmoa):
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/spiky.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/400/spiky.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;
Still CMOA, but now much more fun. Who said adults can't enjoy the children's section.
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7349/1332/1600/spin.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7349/1332/400/spin.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112516573292698989?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112516573292698989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112516573292698989' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112516573292698989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112516573292698989'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/08/at-cmu.html' title='At CMU'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112451368552733723</id><published>2005-08-20T00:47:00.000-04:00</published><updated>2005-08-20T00:54:45.533-04:00</updated><title type='text'>Off to college</title><content type='html'>&lt;p&gt;On Sunday, I'll be going off to college:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cmu.edu/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.cmu.edu/identity/wordmarks/wordmark1r.jpg" border="0" alt="Carnegie Mellon" /&gt;&lt;/a&gt;

&lt;p&gt;One week of orientation (the schedule is literally 40 pages long. Hopefully, there is a list of important things :-), and then classes. I'll have to start programming in Java. Given that I convinced the CS department to let me into a fairly advanced class, it would probably be a Good Thing to know how to write a "hello world" in java by the first day of class. How long will it take me to get used to javaCase? And then how long before I leak javaCase into CSharpCase? I wonder if I could get away with using Mainsoft's stuff and claiming that my c# code is actually Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112451368552733723?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112451368552733723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112451368552733723' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112451368552733723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112451368552733723'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/08/off-to-college.html' title='Off to college'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112434132266434385</id><published>2005-08-18T00:50:00.000-04:00</published><updated>2005-08-18T01:24:44.800-04:00</updated><title type='text'>Msdn Browser</title><content type='html'>&lt;center&gt;
 &lt;img src="http://primates.ximian.com/%7Ebmaurer/msdnview.png" /&gt;
&lt;/center&gt;

&lt;p&gt;Browse msdn &lt;b&gt;without&lt;/b&gt; an insane treeview and &lt;b&gt;without&lt;/b&gt; an insane browser. Source is &lt;a href="http://primates.ximian.com/%7Ebmaurer/msdnb.cs"&gt;here&lt;/a&gt;. It's only 220 lines, you can read it really quickly!
&lt;/p&gt;
&lt;p&gt;Left to do:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Integrate into monodoc&lt;/li&gt;
  &lt;li&gt;Make it handle T:System.String style links in monodoc (would allow it to replace the   default class ref).&lt;/li&gt;
  &lt;li&gt;Handle clicking links inside the msdn content area&lt;/li&gt;
  &lt;li&gt;Greasemonkey-like modifications of MSDN's content&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Remove syntax for VB, etc.&lt;/li&gt;
    &lt;li&gt;Remove the msdn footer&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;Use a cache for the xml&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Would be cool to use mozilla's cache here. That means I can avoid writing my own policy for caching.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;

&lt;p&gt;This shows off some cool Gtk# 2.0 features (the tree node stuff) and some cool C# 2.0 features (the delegate stuff). Also, I am using a very cute hack, the xml serializer, to read the data.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112434132266434385?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112434132266434385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112434132266434385' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112434132266434385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112434132266434385'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/08/msdn-browser.html' title='Msdn Browser'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112336128816691534</id><published>2005-08-06T16:29:00.000-04:00</published><updated>2005-08-06T16:55:15.376-04:00</updated><title type='text'>String Freezing</title><content type='html'>Whidbey has a very cute feature in it's ngen (it's ahead-of-time compile solution). Traditionally, string literals in .NET assemblies are stored in a string heap. When they are loaded from the assembly (using the IL ldstr opcode), the runtime allocates a new object and does a memcpy of the data (on some platforms chars have to be byteswapped, but same idea). Why does this copy need to happen? The first 8 bytes of an object consist of a pointer to a VTable (which holds the object's type's identity, including the data needed to make virtual calls) and a (normally null) pointer to a "monitor" that can be used to lock the object.

Now, this is a fairly large waste of memory. First, we have to allocate the string in the GC heap in each process. Second, by reading the string from metadata, we have paged it into memory there (but that is shared between processes).

The traditional solution to this (as is implemented in C programs) is to store strings in the .rodata section of shared libraries. This way, they can be shared between processes. (C also does a cute hack taking advantage of the fact that strings are \0 terminated. If you have "123" and "abc123" as literal strings in the same program, it stores "abc123\0" and the string "123" is just "abc123" + 3).

Doing something like this should be simple in the aot format. The string data just needs to be copied to a readonly section. However, there are two challenges. First, the VTable for string is allocated in dynamic memory. How can we know its address at AOT time. I can think of two possible solutions:

Mono statically links the JIT and Runtime into a single executable. Static executables never get relocated, so we can pre-allocate the .data section in the mono runtime. We know that this pointer won't change (except if mono is recompiled; some sanity check would be needed). However, this has a very large disadvantage: applications embedding mono could never take advantage of this.

A second, harder, but much better (IMHO) solution is to implement a system like the Windows dynamic loader. Jason Zander explains how this works &lt;a href="http://blogs.msdn.com/jasonz/archive/2003/09/24/53574.aspx"&gt;here&lt;/a&gt;. To give a sort summary, in Windows, you need to say that your .dll should be loaded at a specfic address in virtual memory. If that address can't be found, the operating system goes around and changes all references that depended on this location. If we use this solution, the AOTd mscorlib.dll would simply hold the string vtable. This solution is alot better because it provides us with advantages beyond string freezing. We avoid the need for a GOT/PLT like structure. Also, we could precomputate vtables, and possibly other metadata structures, and store them in readonly memory; this would greatly reduce the cost of managed code. The disadvantage is that we need to help developers find available virtual address space. Also, if there are virtual address space conflicts, we probably can't use the aot'd file. This solution also takes a fair bit of work.

For some more information about Whidbey improvements in Microsoft's runtime see &lt;a href="http://blogs.msdn.com/ricom/archive/2005/07/27/444136.aspx"&gt;ricom's blog&lt;/a&gt;. Also, &lt;a href="http://weblog.ikvm.net/PermaLink.aspx?guid=b28aa8b7-87e3-49d7-b0aa-3cc2cb5dbac9"&gt;Jeroen Frijters wrote about string freezing&lt;/a&gt;

&lt;b&gt;Idea I had right after I published&lt;/b&gt;: string literal bloat seems most likely to matter in a GUI application. However, in that case, we also have the issue that we need to convert the .NET style string to a C style string when we call Gtk+. Would it make sense for us to also pre-cache converted strings so that they too could be shared?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112336128816691534?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112336128816691534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112336128816691534' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112336128816691534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112336128816691534'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/08/string-freezing.html' title='String Freezing'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14650593.post-112188192435815533</id><published>2005-07-20T13:48:00.000-04:00</published><updated>2005-07-20T13:54:47.830-04:00</updated><title type='text'>I'm back!</title><content type='html'>I've been blogless for a while. Some person in Europe called our ops at 3 am in the morning talking about an emergency (now, to be fair, that was probably a reasonable time for them). The emergency? codeblogs.ximian.com had (GASP) porn spam! Novell was sponsoring porn! Our friendly ops, not happy about the rude awakening, decided that the easiest solution was to shut down the server completely. Lazyness has caused me not to have a blog since then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14650593-112188192435815533?l=bmaurer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bmaurer.blogspot.com/feeds/112188192435815533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14650593&amp;postID=112188192435815533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112188192435815533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14650593/posts/default/112188192435815533'/><link rel='alternate' type='text/html' href='http://bmaurer.blogspot.com/2005/07/im-back.html' title='I&apos;m back!'/><author><name>Ben Maurer</name><uri>http://www.blogger.com/profile/00743319148021355050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
