<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://planet.mozinterns.net">
	<title>Planet Mozilla Interns</title>
	<link>http://planet.mozinterns.net</link>
	<description>Planet Mozilla Interns - http://planet.mozinterns.net</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-2685360518322234527" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=202" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=197" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=276" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=112" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-7542125839253392773" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-7346264826768479539" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=273" />
			<rdf:li rdf:resource="http://zpao.com/articles/12-yahoo_hacku_2008" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=135" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-5677637899555228447" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-4317579651266576241" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-2167132140964810978" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=192" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=248" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-8874372882563702089" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-6691857614313049877" />
			<rdf:li rdf:resource="http://bholley.wordpress.com/?p=3" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=133" />
			<rdf:li rdf:resource="http://robarnold.org/?p=28" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=186" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=177" />
			<rdf:li rdf:resource="http://zpao.com/articles/11-passwordmgr_storage_faster" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=163" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=84" />
			<rdf:li rdf:resource="http://zpao.com/articles/10-passwordmgr_storage" />
			<rdf:li rdf:resource="http://zpao.com/articles/9-new_design_updates" />
			<rdf:li rdf:resource="http://robarnold.org/?p=22" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-6288418948076886252" />
			<rdf:li rdf:resource="http://robarnold.org/?p=3" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-1239007967872784827" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-5173675098335102835" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-3902257053941535834" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=240" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=131" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-6887935518787643563" />
			<rdf:li rdf:resource="http://frenchguyonair.wordpress.com/?p=21" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=86" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=85" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=232" />
			<rdf:li rdf:resource="http://frenchguyonair.wordpress.com/2008/07/30/first-post/" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=83" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=230" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=228" />
			<rdf:li rdf:resource="http://zpao.com/articles/8-dtrace_treemaps_part_1" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-2625113980722798086" />
			<rdf:li rdf:resource="http://www.ericbutler.net/blog/?p=11" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=127" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=87" />
			<rdf:li rdf:resource="http://zpao.com/articles/7-on_open_source" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=76" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=82" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-1748710433638718746" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=226" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-8010502766505287486" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=224" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=81" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=74" />
			<rdf:li rdf:resource="http://nerdlife.net/?p=73" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=80" />
			<rdf:li rdf:resource="http://zpao.com/articles/6-programming_brain_teaser" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=81" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=79" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=78" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=64" />
			<rdf:li rdf:resource="http://www.ericbutler.net/blog/?p=8" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=223" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-6439561539898172827.post-1936623231908003545" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=222" />
			<rdf:li rdf:resource="http://www.bailopan.net/blog/?p=77" />
			<rdf:li rdf:resource="http://www.kix.in/blog/?p=220" />
			<rdf:li rdf:resource="http://www.ericbutler.net/blog/?p=6" />
			<rdf:li rdf:resource="http://weizhou.wordpress.com/?p=57" />
			<rdf:li rdf:resource="http://zpao.com/articles/5-introducing_lolcanvas" />
			<rdf:li rdf:resource="http://bholley.wordpress.com/2008/06/27/hello-world/" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-2685360518322234527">
	<title>Lukas Blakk: Seneca and Mozilla in the news</title>
	<link>http://crashopensource.blogspot.com/2008/11/seneca-and-mozilla-in-news.html</link>
	<content:encoded>So &lt;a href=&quot;http://armenzg.blogspot.com/&quot;&gt;Armen&lt;/a&gt; and I were interviewed a while back for the school paper - The Senecan - about our work with Mozilla through Seneca's open source courses.  The article just came out, &lt;a href=&quot;http://www.senecac.on.ca/export/sites/www.senecac.on.ca/media/documents/novsenecan08.pdf&quot;&gt;Download PDF&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_kUuZHNHDPdc/SSWiWpmm30I/AAAAAAAAAM0/VZ_qmfI8FW8/s1600-h/Picture+1.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_kUuZHNHDPdc/SSWiWpmm30I/AAAAAAAAAM0/VZ_qmfI8FW8/s400/Picture+1.png&quot; style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; cursor: hand; width: 400px; height: 397px;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5270797448915640130&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;</content:encoded>
	<dc:date>2008-11-20T17:47:36+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=202">
	<title>Wei Zhou: Service design &amp; three Mozilla interns get together</title>
	<link>http://weizhou.wordpress.com/2008/11/13/service-design-three-mozilla-interns-get-together/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;This story can only happen in Carnegie Mellon University. I always love CMU over Yale, because CMU promotes team work, I can work with people from different backgrounds here, where designers, psychologists, MBA students, HCI researchers and computer scientists get together, and we work with real clients all the time. I’m a way happier than I was in Yale.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/11/us.jpg&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/11/us.jpg?w=300&amp;amp;h=146&quot; title=&quot;us&quot; height=&quot;146&quot; width=&quot;300&quot; alt=&quot;us&quot; class=&quot;alignnone size-medium wp-image-212&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Three ex-Mozilla interns, me, Maria, and Steve were assigned into the same team in Shelley Evenson’s service design class. It’s absolutely a coincidence, so we subconsciously keep low-key and not ware Mozilla T-shirts all three people together at the same time. So far we work very hard on making our design not suck. However we maybe embedded Mozilla’s soul into our process - a pure clean service system, with personalized service “plug-ins”. I’m really looking forward how the final prototype would be.&lt;/p&gt;
&lt;p&gt;Yeah, we strive to be the best team in this class. GO TEAM!&lt;br /&gt;
&lt;br /&gt;
Territory Map&lt;br /&gt;
&lt;br /&gt;
User research &amp;amp; Exploratory phase&lt;br /&gt;
&lt;br /&gt;
Concept development and generative phase&lt;br /&gt;
- Yeah, the next step is concept validation, then interface design, user-testing &amp;amp; prototyping. This is my first time in my life to design medical device interfaces, Hmmm…&lt;br /&gt;
Here’s the first small project: A self checkout service system.&lt;br /&gt;
&lt;/p&gt;
      &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/202/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/202/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/202/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/202/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/202/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/202/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/202/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/202/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/202/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/202/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=202&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-11-13T04:30:45+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=197">
	<title>Wei Zhou: Digital Self</title>
	<link>http://weizhou.wordpress.com/2008/11/05/digital-self/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I haven’t updated my blog for a while. The FLU is really killing me. I just got to know there’re different kinds of FLUs, and I am the lucky person who is got attacked by more than one.&lt;/p&gt;
&lt;p&gt;But nothing can stop me doing fun stuff. These are screen shots for my recent project “Digital Self”. I programmed it in processing. Haha, I have to admit it, when comes to the UI stuff, processing sucks.&lt;/p&gt;
&lt;p&gt;Well, the basic idea, as I said before, the web browser knows more than you know about yourself. As much as I analyze the data, I realized those “Google map search” means more than just one keyword, it encapsulates all my feelings and emotions at that time. I vividly remember the moment I searched “Mountain view taxi” when my car was broken and I was anxious about being late to airport. These stories, alone with the search keywords, suddenly jump out of my mind, like I pressed the Replay button of a movie player. If we see in the near future, a software can be expressed in an art form, and the fundamental question would be  “How do we enhance meaningful human experience “. The browsing history, literally becomes a backup memory library.&lt;/p&gt;
&lt;p&gt;I didn’t do a good job because of time constraints.  This application reads your local moz_places.sql file, and sorts the browsing data either by category or time. You can enter an estimation of how much time you spend online for sth, and the application will tell you how to monitor yourself better. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/11/picture-5.png&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/11/picture-5.png?w=504&amp;amp;h=400&quot; title=&quot;picture-5&quot; height=&quot;400&quot; width=&quot;504&quot; alt=&quot;picture-5&quot; class=&quot;alignnone size-full wp-image-194&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the animated beginning. Each dot represents one single site entry.(by site, not by url).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/11/picture-6.png&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/11/picture-6.png&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/11/picture-6.png?w=518&amp;amp;h=409&quot; title=&quot;picture-6&quot; height=&quot;409&quot; width=&quot;518&quot; alt=&quot;picture-6&quot; class=&quot;alignnone size-full wp-image-195&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/11/picture-7.png&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/11/picture-7.png?w=504&amp;amp;h=358&quot; title=&quot;picture-7&quot; height=&quot;358&quot; width=&quot;504&quot; alt=&quot;picture-7&quot; class=&quot;alignnone size-full wp-image-196&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yeah, that’s my own data. Haha. You can see I actually spend a lot of time studying and working!&lt;/p&gt;
&lt;p&gt;Well, if you are interested in this visualization application, please email me your moz_place.sqlite file. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
      &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/197/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/197/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/197/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/197/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/197/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/197/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/197/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/197/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/197/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/197/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=197&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-11-05T02:32:18+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://www.kix.in/blog/?p=276">
	<title>Anant Narayanan: EU_MozCamp and Friends</title>
	<link>http://www.kix.in/blog/2008/11/eu_mozcamp-and-friends/</link>
	<content:encoded>&lt;p&gt;I’ve been doing a &lt;em&gt;lot&lt;/em&gt; of traveling in the past few weeks, starting with the really exciting “Northside Weekend” at the Dutch towns of Tolbert and Groningen. Copious amounts of embarrassing pictures were generated on Facebook: I wouldn’t expect any less from a group of 60 students hanging out over the weekend &lt;img src=&quot;http://www.kix.in/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Allowing for just enough time to recover, I had to write my final exam for the Parallel Programming course. Having courses compressed into such short time periods can be both and good and bad, I guess I will decide for myself when the results come in!&lt;/p&gt;
&lt;p&gt;I left almost immediately after the exam to catch a flight to Barcelona, for &lt;a href=&quot;https://wiki.mozilla.org/EU_MozCamp_2008&quot;&gt;EU MozCamp 2008&lt;/a&gt;. There was a Labs Session at the Facultat d’informàtica de Barcelona the next day, part of Dan and Aza’s Europe tour. I managed to reach just before the session ended, thanks to me getting lost and then someone pointing me to a different place in the opposite direction. &lt;a href=&quot;http://blog.sandmill.org/&quot;&gt;thunder&lt;/a&gt;, &lt;a href=&quot;http://www.azarask.in/blog/&quot;&gt;aza&lt;/a&gt; and myself then traversed the excellent Metro system in the city, to catch up with &lt;a href=&quot;http://cbeard.typepad.com/&quot;&gt;cbeard&lt;/a&gt; for lunch. I had my first experience with Tapas, and it wasn’t bad at all - the fact that thunder knows spanish helped a lot. &lt;a href=&quot;http://steelgryphon.com/blog/&quot;&gt;mconnor&lt;/a&gt; joined us shortly after. A fabulous dinner later, we were all set for the first day of MozCamp &lt;img src=&quot;http://www.kix.in/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Most Mozilla events are all about meeting new people and catching up with people you knew already. I made the most of it, it was nice to see faces back from Mountain View, and some new ones. Aza was scheduled for a Labs keynote on the first day, which was pretty good. Unfortunately, he seemed to have contracted food poisoning, or maybe just general exhaustion and insomnia from the whole Labs Europe tour; so they postponed the session on Ubiquity to the next day. &lt;a href=&quot;http://ascher.ca/blog/&quot;&gt;David Ascher&lt;/a&gt;’s talk was fantastic with some really cool demos, Thunderbird 3 is going to be prodigious! We had a session on Weave that evening, which also went off reasonably well, though the audience seemed more focused on the legal and privacy aspects of the project. Not a bad thing, just not interesting to me - I’d rather think and talk about technical challenges &lt;img src=&quot;http://www.kix.in/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;I had the wonderful opportunity to have dinner with &lt;a href=&quot;http://commonspace.wordpress.com/&quot;&gt;Mark Surman&lt;/a&gt;, Executive Director of the Mozilla Foundation. I also met up with Suneel who had just recently joined Mozilla at Mountain View, and we all had a great time! mconnor had to stay awake a little later than the rest of us, to prepare for his talk the next day.&lt;/p&gt;
&lt;p&gt;Highlights of Day 2 were mconnor’s talk, 2010 goals discussion and the session on Ubiquity. I also had a brief discussion with Dan on some of my plans for Weave 0.3, it’s going to be awesome! Labs team did a little sightseeing that night, and then caught up with &lt;a href=&quot;http://john.jubjubs.net/&quot;&gt;John Lilly&lt;/a&gt;, accompanied by his wife, for dinner. A perfect end to an excellent weekend.&lt;/p&gt;
&lt;p&gt;Thanks Mozilla Europe, and Barcelona!&lt;/p&gt;</content:encoded>
	<dc:date>2008-11-02T22:06:17+00:00</dc:date>
	<dc:creator>Anant</dc:creator>
</item>
<item rdf:about="http://www.bailopan.net/blog/?p=112">
	<title>David Anderson: TraceMonkey and Type Instability in JavaScript</title>
	<link>http://www.bailopan.net/blog/?p=112</link>
	<content:encoded>&lt;p&gt;Work on &lt;a href=&quot;https://wiki.mozilla.org/JavaScript:TraceMonkey&quot;&gt;TraceMonkey&lt;/a&gt; continues!  TraceMonkey is Mozilla’s JavaScript JIT based on &lt;a href=&quot;http://www.andreasgal.com/&quot;&gt;Franz-Gal trace compilation&lt;/a&gt;.  The JIT ships with Firefox 3.1 and can be enabled in the beta via &lt;tt&gt;about:config&lt;/tt&gt;.  This article is about how TraceMonkey was recently changed to handle type changes in JavaScript data flow.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The greatest advantage to a trace compiling JIT rather than a method compiling JIT, for dynamic languages, is &lt;i&gt;type specialization&lt;/i&gt;.  Observe the following loop:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; f&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;c&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;500&lt;/span&gt;; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
    c &lt;span style=&quot;color: #339933;&quot;&gt;+=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2&lt;/span&gt;;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; c;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In a traditional JIT this method would need to be compiled generically enough to use all possible incoming types.  The function could be invoked using either a string, object, number, or anything — and the compiled code must account for that.  Optimizing further requires static analysis.  &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Type Specialization&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;TraceMonkey’s approach is remarkably different.  If a hot path (loop) is encountered, the runtime behavior is observed, recorded, and compiled as a “trace tree.”  If that loop is run using integers, the trace tree becomes a specialized chunk of assembly using straight integer math.  Because trace compilation only compiles instructions that have been hit (for example, it may only compile one side to an &lt;tt&gt;if&lt;/tt&gt; path), it’s much easier and faster to type specialize than doing aggressive static analysis.&lt;/p&gt;
&lt;p&gt;This approach has worked very well so far.  Except for type instability.&lt;/p&gt;
&lt;p&gt;If that loop above were run a second time with &lt;tt&gt;c&lt;/tt&gt; being a string instead, the original tree could not be used as the types are not compatible.  This resulted in a “tree mismatch,” and excessive tree mismatches meant destroying the tree to make way for another.  What if you could have multiple type-specialized trees for a given loop?  Enter multi-trees.&lt;/p&gt;
&lt;p&gt;Over the past week or so I have been working on (and now landed) my second major TraceMonkey patch — multi-trees.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Multiple Type Specializations per Path&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;TraceMonkey stores a cache of all trees.  The bytecode location of each hot loop is mapped to a linked list of trees; the first in each list is called the “root peer.”  Each tree records &lt;i&gt;typemaps&lt;/i&gt;, which are a simple arrays describing the data type of each slot in the stack.  A tree contains one &lt;i&gt;entry typemap&lt;/i&gt;, which is the set of types the stack must have in order to execute the compiled tree.  &lt;/p&gt;
&lt;p&gt;The simplest case of multiple type specializations is the example above, where a simple loop’s typemap can alternate on entry.  This is the easiest case to handle.  The linked list is grown for each new combination of types.  &lt;tt&gt;f(3)&lt;/tt&gt; will create the root peer with an integer specialization.  &lt;tt&gt;f(’a')&lt;/tt&gt; will link in a new tree with a string specialization.&lt;/p&gt;
&lt;p&gt;To invoke a tree, the root tree is fetched and the list is traversed until a matching entry typemap is found.  The tree is then executed.  If no matching typemap exists, the list is appended and a new tree using the new typemap is recorded.  This means there are multiple trees recorded for the same loop, and we pick one matching the types on the stack.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Type Instability Inside Loops&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The hard cases involve type instability within the same loop.  TraceMonkey relies on being able to &lt;i&gt;close&lt;/i&gt; loops, meaning that the loop edge (tail of the loop) can jump directly back to the top.  This can only happen if the entry type map is equivalent to the type map at the loop edge.  For example, a number turning into a string can’t be closed because the compiled code at the top of the loop expects a double, and we never recorded a path to bridge the conversion back.&lt;/p&gt;
&lt;p&gt;There are many reasons this can happen.  Take the following dumb example:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; g&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; q;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;100&lt;/span&gt;; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
    q &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2.0&lt;/span&gt;;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; q;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first time we enter this loop, the entry typemap contains &lt;tt&gt;Boolean&lt;/tt&gt; for &lt;tt&gt;q&lt;/tt&gt; since it is &lt;tt&gt;undefined&lt;/tt&gt;.  When the loop reaches its first edge, &lt;tt&gt;q&lt;/tt&gt; has changed to a &lt;tt&gt;Number&lt;/tt&gt;.  Recording starts on the second iteration, so now both the entry and exit typemaps will contain &lt;tt&gt;Number&lt;/tt&gt;.  &lt;/p&gt;
&lt;p&gt;Now if &lt;tt&gt;g()&lt;/tt&gt; is run again we can’t run the tree we just recorded, because it expects &lt;tt&gt;q&lt;/tt&gt; to be a &lt;tt&gt;Number&lt;/tt&gt; when it really starts out as &lt;tt&gt;Boolean&lt;/tt&gt;.  To solve this we immediately start recording a new tree.  At the end we encounter a problem: in our tree, &lt;tt&gt;q&lt;/tt&gt; started out as &lt;tt&gt;Boolean&lt;/tt&gt; and now it’s a &lt;tt&gt;Number&lt;/tt&gt;.  This means the loop cannot be closed because the exit and entry points are not type compatible.  Joining the ends would be incorrect.&lt;/p&gt;
&lt;p&gt;To solve this we search for a tree X (on the same loop) whose entry types are identical to our ending types.  If X exists we compile a “loop” that runs once, then immediately jumps into tree X.  This resolves the type conflict by bridging the type flow to another loop.  Visualization:  &lt;/p&gt;
&lt;p&gt;&lt;tt&gt;Figure 1&lt;/tt&gt;&lt;br /&gt;
&lt;img src=&quot;http://users.alliedmods.net/~dvander/mtreespec_1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Delayed Bridging&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;What happens if no matching tree exists?  Take this example:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; f&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; c&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; q;
   &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; c; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
     q &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2.0&lt;/span&gt;;
   &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; q;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
f&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;
f&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;
f&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first call to &lt;tt&gt;f&lt;/tt&gt; puts a counter that says “record a trace for me next time I’m reached.”  The second call to &lt;tt&gt;f&lt;/tt&gt; records a trace with a type instability: &lt;tt&gt;q&lt;/tt&gt; flows from &lt;tt&gt;undefined&lt;/tt&gt; to &lt;tt&gt;Number&lt;/tt&gt;.  Unlike the previous example though, there is no stable tree to complete the bridge.  &lt;/p&gt;
&lt;p&gt;To solve this, we have the top of each tree (where the entry typemap is stored) contain a list of unstable loop edge exit points for that specific tree.  During the third call to &lt;tt&gt;f&lt;/tt&gt; a stable loop will be compiled.  We then use the following algorithm:&lt;/p&gt;
&lt;p&gt;1.  For all other peers that have compiled code,&lt;br /&gt;
2.  For all unstable exit points in that peer,&lt;br /&gt;
3.  If any unstable exit point has a typemap matching our entry typemap, bridge the points together and remove the unstable exit from its peer’s list.&lt;/p&gt;
&lt;p&gt;This algorithm is invoked every time a main trace is compiled (that is, a trace that’s not tying to extend a branch off a tree).  Once it runs in the above example we a diagram very similar to &lt;tt&gt;Figure 1&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The important result of this is that we can bridge many types of instability together.  For example, imagine a scenario where two traces are mutually unstable.  This is easily bridged:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;Figure 2&lt;/tt&gt;&lt;br /&gt;
&lt;img src=&quot;http://users.alliedmods.net/~dvander/mtreespec_2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Other crazy situations are handled as well.  For example, stable loops with unstable branch exits, or chaining multiple unstable traces together (multiple levels of mutual instability).  One case I ran into was something like this:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;Figure 3&lt;/tt&gt;&lt;br /&gt;
&lt;img src=&quot;http://users.alliedmods.net/~dvander/mtreespec_3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nested Type Instability&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The situation gets hairy with nested trees.  Consider a loop like:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript javascript&quot;&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;100&lt;/span&gt;; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; q;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; j &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; j &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;100&lt;/span&gt;; j&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
    q &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2.0&lt;/span&gt;;
  &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example there’s an inner tree that will quickly type stabilize.  When the outer loop starts recording, the inner loop’s incoming types will not match the existing root tree.  In this case the outer loop’s recording is temporarily aborted and the inner loop immediately starts recording again under the assumption that it will record a type stabilizing trace.  In this loop it does, and the two trees are connected together.  The outer loop can then record and directly call into the tree that starts out with unstable types.&lt;/p&gt;
&lt;p&gt;This solves all sorts of crazy data flow stability problems.  Previously SunSpider was traced as very type unstable, and loop hoisted variables (such as the &lt;tt&gt;q&lt;/tt&gt; in that example) served as tracing poison.  They’re now handled fine.  Our least favorite test, &lt;tt&gt;access-fannkuch&lt;/tt&gt;, used to have 100,000 and even 200,000 side exits (exits from the JIT to the interpreter). It now only has 200 and it runs 2.3X faster than the interpreter (over an old 1.3X).  Other cases like &lt;tt&gt;crypto-md5&lt;/tt&gt; are almost completely covered by tracing.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Thin Loops&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Multi-trees go hand in hand with “thin loops,” a concept Andreas landed recently.  The idea is that if a loop doesn’t close because it’s too short, we close it anyway and assume the best.  That works really nicely for very thin loops, especially thin nested loops which would prevent the outer from recording.  Unfortunately it doesn’t give thin loops time to type stabilize, so many thin loops are thrown out.  For example:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; h&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;c&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; k&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; q &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;new&lt;/span&gt; String&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 0; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; c; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
    q &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; k &lt;span style=&quot;color: #339933;&quot;&gt;+&lt;/span&gt; q;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; q;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
h&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;
h&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;
h&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Multi-trees solves this.  The first call to &lt;tt&gt;h&lt;/tt&gt; tells the JIT to start recording the next time &lt;tt&gt;h&lt;/tt&gt; is called.  When &lt;tt&gt;h&lt;/tt&gt; gets called the second time a thin loop is recorded.  But the types are not stable, and the loop cannot be closed - we get another dangling trace that runs once and exits.  When &lt;tt&gt;h&lt;/tt&gt; gets called a third time it type stabilizes.  A new loop is compiled and the two traces are bridged together.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Note: &lt;/i&gt;&lt;tt&gt;h&lt;/tt&gt;&lt;i&gt; is not immediately stable because &lt;/i&gt;&lt;tt&gt;new String&lt;/tt&gt;&lt;i&gt; returns a &lt;/i&gt;&lt;tt&gt;JSVAL_OBJECT&lt;/tt&gt;&lt;i&gt; in SpiderMonkey, whereas the addition returns a &lt;/i&gt;&lt;tt&gt;JSVAL_STRING&lt;/tt&gt;&lt;i&gt;.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Type Speculation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;TraceMonkey has a very cool optimization called &lt;i&gt;type speculation&lt;/i&gt;. Floating point values like &lt;tt&gt;30.0&lt;/tt&gt; or &lt;tt&gt;-12.0&lt;/tt&gt; fit into an integer. When TraceMonkey starts recording a loop it speculates that such “promotable” numbers are integers for the entire loop. When the loop closes, if the number in that slot changed to a double, the loop can’t be closed and the recording is thrown out. How do you tell it to not perform integer promotion next time that loop is recorded?&lt;/p&gt;
&lt;p&gt;The original solution was an oracle, a simple lossy hash table. If an integer-&amp;gt;double conflict arose the oracle would be told “please blacklist stack slot N for bytecode location X, so we don’t try to promote it to an integer.” Since the hash table is lossy this led to false positives as traces filled the JIT cache. &lt;/p&gt;
&lt;p&gt;Multitrees rids most uses of the oracle. If a loop can’t be closed because of integer-&amp;gt;double conflicts, a new trace is immediately recorded with the same conflicts demoted to doubles on entry. This is better than compiling bridged traces (int-&amp;gt;double and double-&amp;gt;double), because the extra time spent compiling has very little gain. &lt;/p&gt;
&lt;p&gt;There is one case where the oracle is still important (global variables aside), in that the oracle can help memoize type instability for nested loops. If the JIT cache is flushed the oracle will still remember which stack slots can’t be promoted, and outer loops can be compiled faster. Thus the oracle only memoizes stack slots when recording inner tree calls. &lt;/p&gt;
&lt;p&gt;There is also a case where we build similar traces that are impossible to connect.  For example, two variables going from int-&amp;gt;int in one tree, and double-&amp;gt;double in a peer tree.  If a branch from the first goes from int-&amp;gt;double for one the variables but not the other, the traces cannot be connected without some sort of intermediate conversion logic.  Perhaps with very bushy trees it would make more sense to build such intermediate bridges.  For now we simply throw out the tree that is causing the problems (the original integer tree).  This is safe because integers can always be boxed into doubles, so the second trace is all we need.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Problems&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;It’s not perfect.  There’s potential for code/trace explosion if types are too unstable.  The heuristics for deeply nested trees can get messy too.  If there are many inner trees that are type unstable it can take a long time to build a stable outer tree.  &lt;/p&gt;
&lt;p&gt;Compared to the original “single-tree specialization” TraceMonkey, there are cases that get a little slower (although still faster than with no JIT).  This is because the original algorithm aggressively pegged incompatible values into mismatching trees.  For example, &lt;tt&gt;undefined&lt;/tt&gt; (Boolean) was passed as a 0 for integer slots and &lt;tt&gt;NaN&lt;/tt&gt; for double slots.  This was wrong.  For example, &lt;tt&gt;((undefined == undefined) == true)&lt;/tt&gt; but &lt;tt&gt;((NaN == NaN) == false)&lt;/tt&gt;.  And &lt;tt&gt;((undefined == undefined) == true)&lt;/tt&gt; but &lt;tt&gt;((undefined == 0) == false)&lt;/tt&gt;.  Other operators are hurt too.  &lt;tt&gt;NaN&lt;/tt&gt; is a poison value and causes any expression to return false.&lt;/p&gt;
&lt;p&gt;So there were cases where the compiled code was simply wrong and produced incorrect results (but boy was it fast!).  By the time this fault was discovered it was too late.  Removing this aggressive coercion corrected a small percentage of code at the price of greatly reducing performance.  Trees would continually get trashed because they mismatched.  Multitrees solved this, but in some cases it uncovers new paths that don’t yet trace well.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;As TraceMonkey improves, type specialization will bring JIT’d code closer and closer to C equivalents.  Multiple type specialized trees furthers us toward this goal.  It solves a huge class of correctness bugs and improves performance in many scenarios where nested trees could not be compiled.&lt;/p&gt;</content:encoded>
	<dc:date>2008-10-28T03:08:41+00:00</dc:date>
	<dc:creator>dvander</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-7542125839253392773">
	<title>Lukas Blakk: The TTC on the move...</title>
	<link>http://crashopensource.blogspot.com/2008/10/ttc-on-move.html</link>
	<content:encoded>This is an awesome video made with OpenGL by the guys who just did a PK on &lt;a href=&quot;http://myttc.ca&quot;&gt;myttc.ca&lt;/a&gt; - an amazing visual of the transit system in Toronto throughout the day:&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;a href=&quot;http://vimeo.com/1865789?pg=embed&amp;amp;sec=1865789&quot;&gt;TTC Weekday Service (HD)&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/user605056?pg=embed&amp;amp;sec=1865789&quot;&gt;Kieran Huggins&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com?pg=embed&amp;amp;sec=1865789&quot;&gt;Vimeo&lt;/a&gt;.</content:encoded>
	<dc:date>2008-10-24T02:03:48+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-7346264826768479539">
	<title>Lukas Blakk: Ready, Set, FSOSS</title>
	<link>http://crashopensource.blogspot.com/2008/10/ready-set-fsoss.html</link>
	<content:encoded>&lt;div&gt;Sitting in the workshop &lt;a href=&quot;http://fsoss.senecac.on.ca/2008/?q=node/65&quot;&gt;&quot;ohai! art!&quot;&lt;/a&gt; at &lt;a href=&quot;http://fsoss.senecac.on.ca/2008/&quot;&gt;FSOSS&lt;/a&gt; early on a Thursday morning.  I'm downloading &lt;a href=&quot;http://puredata.info/downloads&quot;&gt;pure data&lt;/a&gt; (extended) to participate.  Very curious to see what we'll do in this time.&lt;br /&gt;&lt;br /&gt;Last night was the kick-off party at Mozilla for FSOSS speakers and also a time to do a dry run of the &lt;a href=&quot;http://fsoss.senecac.on.ca/2008/?q=node/86&quot;&gt;PK&lt;/a&gt; presentation that I'll be doing on Friday.  I got a sneak-peek at &lt;a href=&quot;http://www.kmdi.utoronto.ca/people/bios/GaleMoore.aspx&quot;&gt;Gale Moore&lt;/a&gt;'s slides and then did a run-through myself.  By setting the timing on the slides to 20 seconds I forced myself to stick to the format.  It's not hard to do this when you're really just talking about your life.  It's a whirlwind tour of what I call my &quot;Zero to Hero Journey&quot;.  Come by tomorrow and see it.&lt;br /&gt;&lt;br /&gt;The best part of last night though was informal discussions about two topics I love; activism and enjoyable work environments.  The former came up in discussion with Gale and &lt;a href=&quot;http://exple.tive.org/&quot;&gt;Mike Hoye&lt;/a&gt; about the systems being used in schools.  Seneca uses &lt;a href=&quot;http://www.blackboard.com/us/index.bbb&quot;&gt;BlackBoard&lt;/a&gt; which is akin to being drawn and quartered on a regular basis.  It's painful to use, ugly, has absolutely nothing to offer students, and even our teachers hardly touch it.  Gale wondered why students weren't rebelling or otherwise agitating for a better system...&lt;a href=&quot;http://moodle.org/&quot;&gt;Moodle&lt;/a&gt; for example.  My take, granted that I am a bit different than the &quot;average&quot; student at Seneca, is that because of the decentralization of students - many live up to 3 hours away from campus - there is never going to be a decent level of student activism about this or any other issue because we don't spend time with each other outside of class.&lt;br /&gt;&lt;br /&gt;On rare occasions, students may have time to compare notes with each other about their experience in their program - but without a common space for downtime, combined with an interest in making changes to the way things are, we will never join together to combat the system as it stands.&lt;br /&gt;&lt;br /&gt;I'm 6.5 months away from being done school and it's not in my list of priorities to take on this kind of activity either.  So no complaining about BlackBoard for me.  I've got bigger fish to fry.&lt;br /&gt;&lt;br /&gt;The second topic, the work environment, was fun because it wasn't just a Mozilla love-in (and there is so much to love) but instead I heard from someone in a completely different field how much their workplace supported and encouraged them, gave them a clear path to advancement and had a strong team with no weak links.  I'm often griping about the team work that we are obliged to do in school, mostly because the teams are often nothing like anything found in the &quot;real world&quot; and then also due to the fact that the assignments are often fictitious and therefore don't give us as much of a challenge.  &lt;br /&gt;&lt;br /&gt;The open source class at Mozilla really raised the bar by giving us real work to do and that experience is invaluable.  Instead of wasting time with teammates dividing up work and trying to manage other students' work ethics, we were project leaders on our Mozilla work and we pulled people into our teams as needed to get the work done.  This kind of turns the model that other classes use on its ear.  Next term I'll be doing a research and methodologies course where our deliverable is a significant research paper on some facet of technology.  I intend to pitch an idea to research the current BSD program's project stream and how it currently leads to very little implementation.  Hopefully with a little research, we can look at ways to turn that around and give the next generation of BSD students a level of satisfaction that will enable them to recognize this in their future workplaces.&lt;br /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-10-23T16:01:05+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="http://www.kix.in/blog/?p=273">
	<title>Anant Narayanan: Exciting Happenings at Mozilla</title>
	<link>http://www.kix.in/blog/2008/10/exciting-happenings-at-mozilla/</link>
	<content:encoded>&lt;p&gt;Mozilla is making great strides towards making impacting innovations built on the open web. If you haven’t already heard, the always awesome &lt;a href=&quot;http://cbeard.typepad.com/&quot;&gt;Chris Beard&lt;/a&gt; was appointed as Mozilla’s &lt;a href=&quot;http://john.jubjubs.net/2008/10/13/mozilla-chief-innovation-officer-chris-beard/&quot;&gt;Chief Innovation Officer&lt;/a&gt;. He’ll be heading the newly formed &lt;a href=&quot;http://labs.mozilla.com/2008/10/developer-tools-and-the-open-web/&quot;&gt;Developer Tools Lab&lt;/a&gt; which was formed after the co-founders of &lt;a href=&quot;http://ajaxian.com/archives/ajaxians-join-mozilla-creating-developer-tools&quot;&gt;Ajaxian&lt;/a&gt;, &lt;a href=&quot;http://galbraiths.org/blog/&quot;&gt;Ben&lt;/a&gt; and &lt;a href=&quot;http://almaer.com/blog/&quot;&gt;Dion&lt;/a&gt;, were hired by Mozilla. That’s in addition to his existing responsibilities with Mozilla Labs and Evangelism.&lt;/p&gt;
&lt;p&gt;I feel extremely privileged to be working with a group of such brilliant people &lt;img src=&quot;http://www.kix.in/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;With projects like Geode, Ubiquity, Weave, and Snowl already on the table; I simply can’t hold my excitement in anticipation of the great things that are to come out from Mozilla in the near future!&lt;/p&gt;</content:encoded>
	<dc:date>2008-10-14T00:55:36+00:00</dc:date>
	<dc:creator>Anant</dc:creator>
</item>
<item rdf:about="http://zpao.com/articles/12-yahoo_hacku_2008">
	<title>Paul O'Shannessy: Yahoo! HackU 2008</title>
	<link>http://zpao.com/articles/12-yahoo_hacku_2008</link>
	<content:encoded>&lt;p&gt;This past week Yahoo! was on campus for their annual &lt;a href=&quot;http://developer.yahoo.com/hacku/&quot;&gt;HackU&lt;/a&gt; event. This is the third year they have been doing it and each year it has gotten progressively larger.&lt;/p&gt;


	&lt;h2&gt;The Past&lt;/h2&gt;


	&lt;p&gt;The first year (2006), I think there was a single entry. I made it in time for the presentation and was pretty sad I hadn’t had a chance to make anything.&lt;/p&gt;


	&lt;p&gt;Last year, I made a determined effort and hacked together my own entry – &lt;a href=&quot;http://playground.zpao.com/yweather&quot;&gt;yWeather&lt;/a&gt; – and contributed to &lt;a href=&quot;http://flolcatr.com&quot;&gt;flolcatr&lt;/a&gt;. These were among the six or so entries from Carnegie Mellon. I didn’t win anything, though I’m still pretty proud of yWeather. There was a 24-hour hack session on the last night, but I’m pretty sure there was nobody there after midnight.&lt;/p&gt;


	&lt;h2&gt;This year&lt;/h2&gt;


	&lt;p&gt;This year there were 28 hacks! I was simply astounded at the number and variation of the entries this year. There were technically impressive hacks, humorous hacks, hacks that could change the web, and even some creepy hacks. We had some big hacker names from Yahoo! show up – &lt;a href=&quot;http://lerdorf.com/&quot;&gt;Rasmus Lerdof&lt;/a&gt; (creator of &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;), &lt;a href=&quot;http://kentbrewster.com/&quot;&gt;Kent Brewster&lt;/a&gt; (hacker extraordinaire), and my new pal &lt;a href=&quot;http://paulisageek.com/&quot;&gt;Paul Tarjan&lt;/a&gt; (creator of Search Monkey). I think there were people who actually pulled off the 24-hour hackathon, staying up the whole night. I know Paul was there when I left around 6am.&lt;/p&gt;


	&lt;p&gt;Last year I took advantage of the time and spent the week working on my hack. This year I didn’t start until after midnight. I contributed a little bit to a hack (“lolmonkey”) with &lt;a href=&quot;http://matttthompson.com/&quot;&gt;Mattt Thompson&lt;/a&gt; which uses &lt;a href=&quot;http://developer.yahoo.com/searchmonkey/&quot;&gt;Search Monkey&lt;/a&gt; and creates an infobar in Yahoo! search results lolifying an image on the linked page. While not the craziest hack, we had fun with it. I think at this point we are both officially done creating tools/hacks that have anything to do with lolcats.&lt;/p&gt;


	&lt;h2&gt;Busses &amp;amp; the Blueprint Framework&lt;/h2&gt;


	&lt;p&gt;The other hack that I worked on uses the &lt;a href=&quot;http://mobile.yahoo.com/developers/roadmap&quot;&gt;Yahoo! Blueprint framework&lt;/a&gt; for creating mobile applications. While not the most technically advanced hack, I think it was one with the most immediate value. It was called “CMU Busses”, and simply tells you the next 5 busses leaving Carnegie Mellon in either direction. You can see a screenshot on the &lt;a href=&quot;http://playground.zpao.com/bp_busses&quot;&gt;project page&lt;/a&gt;. This is something I’ve been wanting to make for a long time, and something I would actually use (no offense to the other hacks). This was a true “hack” – I’m scraping the &lt;span class=&quot;caps&quot;&gt;PAT&lt;/span&gt; website with Ruby. My Ruby code is outputting &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; code (the departure times are hardcoded instead of doing a DB lookup). Then the rest of the script is using the &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; Blueprint framework that Yahoo! provides (after spending a while working it out).&lt;/p&gt;


	&lt;p&gt;I had originally planned to make this an iPhone application, but having never done Objective-C, I figured now wasn’t the time to start. I had also wanted this application to be able to detect the user’s &lt;span class=&quot;caps&quot;&gt;GPS&lt;/span&gt; coordinates and find the closes 5 bus stops before showing departure times, but that had some barriers as well. In a future iteration hopefully we’ll see that. The Blueprint framework is supposedly also able to convert a Blueprint application to an iPhone application, but that has not been released to the public yet. When it is released, I think I may publish what I have now as a first iteration.&lt;/p&gt;


	&lt;h2&gt;Some Other Highlights&lt;/h2&gt;


	&lt;p&gt;I got to hang out with some great people throughout the week. I also got treated to a dinner for all of the former Yahoo! interns at Fuel &amp;amp; Fuddle. It was a good time, getting to talk some technology and design with smart people.&lt;/p&gt;


	&lt;p&gt;As a result of working on the lolmonkey hack, Mattt and I were invited to dinner by Alicia at &lt;a href=&quot;http://buglabs.net&quot;&gt;Bug Labs&lt;/a&gt;. They have a really cool product called &lt;span class=&quot;caps&quot;&gt;BUG&lt;/span&gt;, which as they say on their website, “is a collection of easy-to-use electronic modules that snap together to build any gadget you can imagine”. I got to play with one and it’s really neat. I wish I had some spare cash to get one. They also have some of the coolest package design I’ve seen in a while. So if you’re interested in hacking hardware, take a look at them – they’re cool people with a cool product, hacking on open source hardware and software.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=g42pm&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=g42pm&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=nC5bM&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=nC5bM&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/zpao/~4/418803717&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2008-10-12T18:50:09+00:00</dc:date>
	<dc:creator>Paul O’Shannessy</dc:creator>
</item>
<item rdf:about="http://nerdlife.net/?p=135">
	<title>Brian Krausz: PHP is a /great/ first language…for a hacker</title>
	<link>http://feeds.feedburner.com/~r/nerdlife/~3/412644297/</link>
	<content:encoded>&lt;p&gt;So I figured I’d jump on the blogger bandwagon in the debate on &lt;a href=&quot;http://codeutopia.net/blog/2008/05/01/is-php-a-good-first-language/&quot;&gt;whether&lt;/a&gt; &lt;a href=&quot;http://rubayeet.wordpress.com/2008/05/10/php-is-a-good-second-programming-language/&quot;&gt;or&lt;/a&gt; &lt;a href=&quot;http://reidburke.com/2008/10/05/when-php-is-your-first-language/&quot;&gt;not&lt;/a&gt; PHP is a good first language.&lt;/p&gt;
&lt;p&gt;First, a little context.  PHP was the first language I did anything useful in.  I learned QBASIC in middle school, which I used to make some neat games.  Around 7th grade I taught myself PHP by hacking on phpBB installations.  I didn’t learn any other language until college, where I quickly picked up Java, C, and SML (in that order).  I agree that PHP is a horrible language to teach proper programming practices, but that’s not the point of it.&lt;/p&gt;
&lt;p&gt;I’ve had the privledge of talking to Rasmus a number of times over the last few years, and while I didn’t get permission to reproduce his comments and so I won’t (I will say he has some funny stories about David Filo…), I can quote an article he wrote approx. 4 years ago &lt;a href=&quot;http://www.oracle.com/technology/pub/articles/php_experts/rasmus_php.html&quot;&gt;on PHP&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;PHP was never meant to win any beauty contests. … &lt;span class=&quot;bodycopy&quot;&gt;It was designed to solve a single problem: the Web problem. &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It does this very well, as shown by it’s outstanding adoption rate.  The truth is that PHP is hacky, but it’s hacky in a logical way.  It was written to help a programmer have an easier time writing for the web by one in that exact situation, and it does it’s job.  If you need to throw a page together in 5 minutes, you can do that!  Which is exactly what budding programmers should be exposed to.&lt;/p&gt;
&lt;p&gt;Think of it this way: why do people learn programming in the first place?  Nowadays, it’s either as a career path, in which case they probably aren’t destined to be hackers in any sense, or because they need to solve a problem and writing a program is the best way to do it.  What is going to turn a newbie on to programming faster: learning proper structure, or being able to pump out a solution to his/her problem in 5 minutes?  I would bet a lot it’s the later.  That’s what hackers do, they pump out a solution to a problem quick and, quite possibly, dirty.&lt;/p&gt;
&lt;p&gt;“But Brian, have you ever seen dirty code?” you ask.  Of course I have, and I despise it.  But I contest that proper style is something that can be learned after the fact.  The ability to pump out a prototype in 5 minutes can’t be learned as easily.  The ability to ignore all convention and generate an import script to move all of your data from A to B to get your site back up, or hack together a script to bulk rename files in a really wonky way, while trivial to do for most programmers, can be done much faster with a hacker mentality.&lt;/p&gt;
&lt;p&gt;I am a hacker, but I have no problem following convention.  I don’t like to, since it slows down coding, but when I’m in a group of programmers, or working on code that needs to be maintained, I do recognize the point of doing so and follow them (to the letter even).  Of course, I’m by no means the norm on anything, so take what I say with a grain of salt, but it seems to have worked well for me: I can follow convention, but at the same time I can adjust, I can change my style as the situation demands, and I can code up a storm when need be.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/412644297&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2008-10-06T09:39:53+00:00</dc:date>
	<dc:creator>Brian</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-5677637899555228447">
	<title>Lukas Blakk: Third time's a charm - Unittest Production moves tomorrow morning</title>
	<link>http://crashopensource.blogspot.com/2008/09/third-times-charm-unittest-production.html</link>
	<content:encoded>Wednesday September 24th at 6:00 PDT I'll be connecting the new slaves to Tinderbox:Firefox and taking down the old ones.&lt;br /&gt;&lt;br /&gt;Fingers crossed that it really happens this time.</content:encoded>
	<dc:date>2008-09-23T20:22:45+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-4317579651266576241">
	<title>Lukas Blakk: Postponed - Production MozCentral Unittest Moves - to the Build Network</title>
	<link>http://crashopensource.blogspot.com/2008/09/postponed-production-mozcentral_23.html</link>
	<content:encoded>As you may already know, there is some major outage (power out at the San Jose colo) this morning - now dubbed &quot;Black Tuesday&quot; by me.  So the switch is postponed again. &lt;br /&gt;&lt;br /&gt;New time and date forthcoming when the network is up and stable again.</content:encoded>
	<dc:date>2008-09-23T14:03:40+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-2167132140964810978">
	<title>Lukas Blakk: Take 2 - mozilla-central unittest production waterfalls moves to build network</title>
	<link>http://crashopensource.blogspot.com/2008/09/take-2-mozilla-central-unittest.html</link>
	<content:encoded>Hopefully things will still look good tomorrow morning because the new time of the move is now:&lt;br /&gt;&lt;br /&gt;This will take place on Tuesday September 23th, at 7am PDT&lt;br /&gt;&lt;br /&gt;The new production buildbot will already be up and running smoothly&lt;br /&gt;(currently reports to the UnitTest tinderbox tree) so there should&lt;br /&gt;hopefully be very little impact when this switch over happens.&lt;br /&gt;&lt;br /&gt;Basically, the new unittest buildbot slaves will start reporting to&lt;br /&gt;the Firefox tinderbox tree, and the current slaves will stop reporting&lt;br /&gt;there.&lt;br /&gt;&lt;br /&gt;This means you will be looking at new slave names.  There are 2&lt;br /&gt;buildslaves for each platform and their names are as follows:&lt;br /&gt;&lt;br /&gt;Linux mozilla-central moz2-linux-slave07 dep unit test&lt;br /&gt;Linux mozilla-central moz2-linux-slave08 dep unit test&lt;br /&gt;MacOSX Darwin 9.2.2 moz2-darwin8-slave01 dep unit test&lt;br /&gt;MacOSX Darwin 9.2.2 moz2-darwin8-slave02 dep unit test&lt;br /&gt;WINNT 5.2 mozilla-central moz2-win32-slave07 dep unit test&lt;br /&gt;WINNT 5.2 mozilla-central moz2-win32-slave08 dep unit test</content:encoded>
	<dc:date>2008-09-22T18:09:59+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=192">
	<title>Wei Zhou: Internet Self</title>
	<link>http://weizhou.wordpress.com/2008/09/21/internet-self/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I’m recently obsessed with human identity, perception and self-expression. In Stacie’s course ‘ Information and interaction’, I proposed to do a 6 weeks project naming “Digital Self”. The goal is quite simple: Explore the difference between your real self in the society and your digital self on the Internet.  The method is even simpler: by analyzing people’s daily browsing activities. I plan to build this piece by Processing(as usual), the final delivery will be an “artistic” interactive piece - I’m suffering with CMU’s rigorous design research, usibility tesing and seminar reading education, it’s time to have some fun.&lt;/p&gt;
&lt;p&gt;So what’s a Digital Self and why start from a web browsing history analysis?&lt;/p&gt;
&lt;p&gt;People may scared if they realized that their browser knows themselves more than they do. The browser traced down every single activity you do on the Internet, that somehow reflects you as a whole slightly different than you are in the real world.&lt;/p&gt;
&lt;p&gt;For example, here are some variables that may reflects your “Internet” personality.&lt;/p&gt;
&lt;p&gt;Your most frequent visiting sites.&lt;/p&gt;
&lt;p&gt;- If I ask you to list some favorite sites, the answer you give me might be different than the answer given by your browser. You may not realize why you actually spend 30 hours on Facebook monthly, that conflicts with your goal - study harder.&lt;/p&gt;
&lt;p&gt;How long do you stay at a site&lt;/p&gt;
&lt;p&gt;- Spending 10 hours shopping on Amazon and 10 seconds to check things on Amazon reflects different personalities. If we did a long-term research, you may find you are easily obsessed with one thing, or you may like to change your focus frequently. That’s a very interesting Internet personality.&lt;/p&gt;
&lt;p&gt;Your browsing time&lt;/p&gt;
&lt;p&gt;- This directly reflects your schedule, how busy you are.&lt;/p&gt;
&lt;p&gt;Sites category you visited over time&lt;/p&gt;
&lt;p&gt;- When you are relax and happy, you will visit a lot of sites you like, otherwise, if you are hitting a deadline, you will only visit sites related to your work. However the sites people visit reflects how they release their pressure, such as watching a cartoon after a long time work.&lt;/p&gt;
&lt;p&gt;Your search result&lt;/p&gt;
&lt;p&gt;- Reflects your curiosity&lt;/p&gt;
&lt;p&gt;What do you tag or bookmark a page&lt;/p&gt;
&lt;p&gt;- This may reflect your Internet self in a social context.&lt;/p&gt;
&lt;p&gt;What much do you comment or upload things on Internet(In versus Out)?&lt;/p&gt;
&lt;p&gt;- If you only get, never give, does that mean you have a selfish personality on the Internet?&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;It will be interesitng to build a framework for Internet Self Study, but I think that’s phychologists’ job.&lt;/p&gt;
      &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/192/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/192/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/192/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/192/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/192/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/192/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/192/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/192/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/192/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/192/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=192&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-09-21T05:12:02+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://www.kix.in/blog/?p=248">
	<title>Anant Narayanan: Meme(me)</title>
	<link>http://www.kix.in/blog/2008/09/mememe/</link>
	<content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.glazman.org/weblog/dotclear/index.php?post/2008/09/20/Mememe&quot;&gt;Another&lt;/a&gt; &lt;a href=&quot;http://www.kartmann.com/blog/mememe/&quot;&gt;meme&lt;/a&gt; &lt;a href=&quot;http://www.0xdeadbeef.com/weblog/?p=754&quot;&gt;has&lt;/a&gt; &lt;a href=&quot;http://john.jubjubs.net/2008/09/19/mememe/&quot;&gt;begun&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.kix.in/blog/wp-content/uploads/2008/09/photo-5.jpg&quot;&gt;&lt;img src=&quot;http://www.kix.in/blog/wp-content/uploads/2008/09/photo-5-300x225.jpg&quot; title=&quot;MemeMe&quot; height=&quot;225&quot; width=&quot;300&quot; alt=&quot;&quot; class=&quot;alignnone size-medium wp-image-249&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1. Take a picture of yourself right now.&lt;br /&gt;
2. Don’t change your clothes, don’t fix your hair… just take a picture.&lt;br /&gt;
3. Post that picture with NO editing.&lt;br /&gt;
4. Post these instructions with your picture.&lt;/p&gt;</content:encoded>
	<dc:date>2008-09-20T23:58:12+00:00</dc:date>
	<dc:creator>Anant</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-8874372882563702089">
	<title>Lukas Blakk: Postponed - Production MozCentral Unittest Moves - to the Build Network</title>
	<link>http://crashopensource.blogspot.com/2008/09/postponed-production-mozcentral.html</link>
	<content:encoded>Due to some glitches in the buildslaves, the move of the mozilla-central unittest build master has been postponed for now.  &lt;br /&gt;&lt;br /&gt;I will post again soon with a new time and date for the switch.&lt;br /&gt;&lt;br /&gt;http://groups.google.com/group/mozilla.dev.planning/post</content:encoded>
	<dc:date>2008-09-19T14:09:44+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-6439561539898172827.post-6691857614313049877">
	<title>Lukas Blakk: Production MozCentral Unittest Moves - to the Build Network</title>
	<link>http://crashopensource.blogspot.com/2008/09/production-mozcentral-unittest-moves-to.html</link>
	<content:encoded>So the last task in the move from QA network to Build network is moving the production mozilla-central unittest boxes.&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;This will take place on Friday September 19th, at 7am PDT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The new production buildbot is already up and running smoothly (currently reports to the &lt;a href=&quot;http://tinderbox.mozilla.org/showbuilds.cgi?tree=UnitTest&quot;&gt;UnitTest&lt;/a&gt; tinderbox tree) so there should hopefully be very little impact when this switch over happens.  &lt;br /&gt;&lt;br /&gt;Basically, the new unittest buildbot slaves will start reporting to the Firefox tinderbox tree, and the current slaves will stop reporting there.&lt;br /&gt;&lt;br /&gt;This means you will be looking at new slave names.  There are 2 buildslaves for each platform and their names are as follows:&lt;br /&gt;&lt;br /&gt;Linux mozilla-central moz2-linux-slave07 dep unit test&lt;br /&gt;Linux mozilla-central moz2-linux-slave08 dep unit test&lt;br /&gt;MacOSX Darwin 9.2.2 moz2-darwin8-slave01 dep unit test&lt;br /&gt;MacOSX Darwin 9.2.2 moz2-darwin8-slave02 dep unit test&lt;br /&gt;WINNT 5.2 mozilla-central moz2-win32-slave07 dep unit test&lt;br /&gt;WINNT 5.2 mozilla-central moz2-win32-slave08 dep unit test&lt;br /&gt;&lt;br /&gt;Thanks to Jesse Ruderman and others for working so hard on bug &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=450637&quot;&gt;#450637&lt;/a&gt;, as it means we are now running unit tests on win32 VMs with very consistent results.&lt;br /&gt;&lt;br /&gt;As soon as this is done, and working well I can tie up the loose ends, close out some bugs, update the config files and start looking at some new projects...like the test results - and try server unittests.</content:encoded>
	<dc:date>2008-09-17T21:53:50+00:00</dc:date>
	<dc:creator>Lukas Blakk</dc:creator>
</item>
<item rdf:about="http://bholley.wordpress.com/?p=3">
	<title>Bobby Holley: So Many Colors</title>
	<link>http://bholley.wordpress.com/2008/09/12/so-many-colors/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;This summer, I’ve been working on getting Mozilla’s color management backend ready for the prime time. We’re finally turning it on in tonight’s nightly builds, so I thought I’d give a bit of background on the history of color management in Mozilla and on color management in general. You should all go download the latest &lt;a href=&quot;http://www.mozilla.org/developer/&quot;&gt;nightly&lt;/a&gt; when it comes out and give it a try.&lt;/p&gt;
&lt;p&gt;In a nutshell, color management involves using information about a computer’s display, and in some cases information about certain images, to render pages more accurately. Contrary to popular belief, an RGB value (such as #ffffff) alone does not represent a color. Rather, the values for the red, green, and blue channels can be thought of as coordinates in a color space that contains the actual colors. The color that an RGB tuple represents thus depends on how the color space is defined (see &lt;a href=&quot;http://en.wikipedia.org/wiki/Color_space&quot;&gt;Wikipedia&lt;/a&gt; for more information).&lt;/p&gt;
&lt;p&gt;This type information is generally stored in a file called an ICC color profile. Computer displays often ship with ICC profiles that specify exactly how various RGB values will look on the screen. Additionally, JPG and PNG images are often tagged with ICC profiles to describe the color space of the pixels. In theory, every image should come with a color profile specifying its color space. However, many images do not contain embedded profiles, nor would it make sense for a CSS stylesheet to embed a color profile for CSS colors. As a result, the W3C determined that untagged web content should be assumed to be in a standard color space called sRGB. So color management in Mozilla is really a two-part process: we map incoming RGB values out of their respective color spaces, and into the color space of your display (which we obtain by querying the operating system).&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;div style=&quot;width: 281px;&quot; id=&quot;attachment_10&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://bholley.files.wordpress.com/2008/09/ciexy1931_ciergb.png&quot;&gt;&lt;img src=&quot;http://bholley.files.wordpress.com/2008/09/ciexy1931_ciergb.png?w=271&amp;amp;h=300&quot; title=&quot;ciexy1931_ciergb&quot; align=&quot;center&quot; height=&quot;300&quot; width=&quot;271&quot; alt=&quot;Colors are more complicated than you might think.&quot; class=&quot;size-medium wp-image-10&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Colors are more complicated than you might think.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;About a year ago, Mike Beltzner unveiled Mozilla’s color management support &lt;a href=&quot;http://www.beltzner.ca/mike/archives/2007/08/do-you-like-the-pretty.html&quot;&gt;in a blog post&lt;/a&gt;. Unfortunately, there were some major issues that kept the color management mode set squarely to ‘off’ for the release of Firefox 3.0.&lt;/p&gt;
&lt;p&gt;First of all, there were quite a few rendering bugs filed for our color management implementation. I was able to confirm a good number of them, and discover a few more myself, and I’ve landed the necessary fixes. There were also quite a few issues with our Reftest rendering test suite that needed fixing so that the tests would pass with color management on. These issues have also been fixed. However, several people reported bizarre rendering behavior (whites showing up yellowish, blues showing up purple) that turned out to be the result of bogus display profiles on the reporter’s system (many thanks to &lt;a href=&quot;http://www.colorremedies.com/&quot;&gt;Chris Murphy&lt;/a&gt; for lending his expertise on this issue). This is scary, because it raises the possibility that any number of people might see inexplicably weird colors in their browser once we turn on color management. As such, we’re hoping to get as many testers as possible in the nightlies and betas to see how widespread the problem is.&lt;/p&gt;
&lt;p&gt;Another concern we had over color management had to do with plugins. Since plugins like Flash and Java do their own drawing, we don’t have any control over whether they use color management. While an extension to the plugin API to allow this is in the works, there’s currently no way for the browser and plugins to coordinate on color management. If the browser color corrects a color while the plugin doesn’t, they no longer look exactly the same side by side. At this point, it’s unclear exactly how much of a problem this is, but we’d appreciate feedback.&lt;/p&gt;
&lt;p&gt;However, the biggest reason color management was disabled for Firefox 3.0 was that it regressed performance by about 20-30% (according to our &lt;a href=&quot;http://quality.mozilla.org/projects/automation/talos&quot;&gt;Talos tests&lt;/a&gt;) when switched on. This was deemed unacceptable for a default setting. As such, I spent a great deal of time profiling code and then devising, implementing, and testing dozens of strategies to squeeze the performance overhead as close to zero as possible.&lt;/p&gt;
&lt;p&gt;This turned out to be really hard. Color management is a per-pixel transform, meaning that we need to call a function for every pixel of an image (CSS colors are easier since repeated pixels are known to the rendering code). Such an embarrassingly parallel problem would be a perfect candidate for GPU acceleration, but we’re just beginning to draw up plans for OpenGL and Direct3D backends to Cairo, so it will be quite a while before we can just write a custom shader and make the entire problem disappear. As a result, I dug in my heels and worked on making the transformation of one pixel really, really fast. After some rearchitecting, various precaching strategies, and a whole lot of hand-tuned SSE2 assembly, the performance overhead of full-page color management is finally at about 4-5% on all platforms.&lt;/p&gt;
&lt;p&gt;For the past few months, this seemed to be enough. Beltzner was receptive to the idea of turning it on, and nobody in either of the development meetings raised any gripes on the issue. Robert O’Callahan and David Baron had voiced some concerns about standards compliance and interoperability, but both were willing to turn it on for Firefox 3.1 Beta 1 in order to get feedback from the community. However, as Vlad and I were landing the final patch to turn color management on, we were beset by a flurry of naysayers who didn’t feel like the performance hit was worth it.&lt;/p&gt;
&lt;p&gt;As a contingency, I had previously implemented a third mode for color management, one that color-corrects tagged images only, that has a performance hit of about 1%. Safari has been color-correcting tagged images for a while now, and this is certainly the dominant use case for color management. Given the pushback on full color management, it looks like we’ll have to settle for a default of “tagged only” for now. The capability for full correction is available in Firefox, and hopefully we’ll have an easy way to switch modes by the time 3.1 rolls out the door. For now, you can go to about:config and set gfx.color_management.mode to ‘0′ for no color management, ‘1′ for full color management, and ‘2′ (the default) for tagged-only correction (for technical reasons, you’ll need to restart your browser for this setting to take effect). Deb Richardson put together a &lt;a href=&quot;http://www.dria.org/wordpress/archives/2008/04/29/633/&quot;&gt;great blog post&lt;/a&gt; where she highlighted some of the differences between color-managing and not color-managing tagged images. I’d encourage you to check it out.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;div style=&quot;width: 352px;&quot; id=&quot;attachment_12&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://bholley.files.wordpress.com/2008/09/deb_cms_comparison.png&quot;&gt;&lt;img src=&quot;http://bholley.files.wordpress.com/2008/09/deb_cms_comparison.png?w=342&amp;amp;h=508&quot; title=&quot;deb_cms_comparison&quot; align=&quot;center&quot; height=&quot;508&quot; width=&quot;342&quot; alt=&quot;Color Management Off, Color Management On&quot; class=&quot;size-full wp-image-12&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Color Management Off, Color Management On   (Courtesy of Deb)&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Personal disappointment aside, I think it would be a good idea to open up discussion on the subject of full color management on the web. In a world where every browser supported color management and nobody had bogus display profiles (idealistic, I know), a web designer could pick a color scheme for his or her web page and rest assured that it would actually look the same for each viewer. Whites would really be white, and that soothing hue of green would look just as good on your mother’s laptop as it does on your desktop. I’d encourage people to try browsing the web with gfx.color_management.mode=1. Is the performance impact noticeable? Do you run across any web pages that don’t look right? How many color-matched plugins do you see on a daily basis? Do you care about color correction? As always, Firefox is &lt;em&gt;your&lt;/em&gt; browser, and we want to know what &lt;em&gt;you&lt;/em&gt; want. So tell us.&lt;/p&gt;
&lt;img src=&quot;http://feeds.wordpress.com/1.0/categories/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://feeds.wordpress.com/1.0/tags/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/bholley.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/bholley.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/bholley.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/bholley.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/bholley.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/bholley.wordpress.com/3/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=bholley.wordpress.com&amp;amp;blog=4081394&amp;amp;post=3&amp;amp;subd=bholley&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-09-12T04:24:14+00:00</dc:date>
	<dc:creator>bholley</dc:creator>
</item>
<item rdf:about="http://nerdlife.net/?p=133">
	<title>Brian Krausz: Antiantisocial Networks</title>
	<link>http://feeds.feedburner.com/~r/nerdlife/~3/384687093/</link>
	<content:encoded>&lt;p&gt;Today TechCrunch reported on a paper describing a way to &lt;a href=&quot;http://www.techcrunch.com/2008/09/05/researchers-build-malicious-facebook-app/&quot;&gt;use Facebook for malicious means&lt;/a&gt;.  The paper describes a DDoS attack that can be done, leveraging the large number of users of an application to attack a victim site.&lt;/p&gt;
&lt;p&gt;While this attack vector is legitimate, I see a number of things that make it inherently infeasibly, and don’t think it really warrants being called a “FaceBot” (implying similar power to a botnet).&lt;/p&gt;
&lt;p&gt;In order to create an application, one obviously needs to create a Facebook account, though that can be done anonymously.  The real issue is that in order to execute such an attack, one would need to make an application that is incredibly popular.  The attacker would need to devote a large number of resources to keeping such a popular app up, which would all need to be done anonymously (though would need to be paid for in one way or another).&lt;/p&gt;
&lt;p&gt;Let’s say an attacker has gone through all of this to make a popular application: why doesn’t he/she just use those resources for a direct attack?  One possibly answer is that the Facebook DDoS would be hard to shut down, or better in some other way in executing the attack.  This is false because as soon as someone realizes that their traffic is coming from Facebook (whether by referrers, or FB trying to pull images for its cache, or some other mechanism), it can in most instances be stopped immediately, especially considering how most Facebook calls to other sites include the application’s API keys.  Even barring that, IP addresses and Facebook’s logging can be used to determine what application a user was in when they requested the victim’s site.&lt;/p&gt;
&lt;p&gt;Additionally, DDoSs using this attack vector are relatively easy to mitigate.  If a hacker already has all of these resources dedicated to keeping an application up, why wouldn’t they just launch a TCP SYN flood or similar lower-level attack, much more potent DoSs, even if launched from a more limited IP range.&lt;/p&gt;
&lt;p&gt;Let’s take a different route: suppose a hacker attacks one of Slide’s applications and somehow manages to break in and add an attack iframe.  This is a completely legitimate and anonymous way of attacking a site (though it begs the question of why the hacker didn’t just break into the target site in the first place, assuming both have similar levels of security).  While this is a legitimate issue, the same holds true for all websites.  Should someone hack into Yahoo! and figure out how to deploy a new home page (somewhere between almost-impossible and no-freaking-way on the difficulty scale), almost any site on the internet could easily be taken down.  I certainly hope top app developers take security as seriously as top website owners, but this is nothing special for Facebook.&lt;/p&gt;
&lt;p&gt;On the topic of information theft, this is why Facebook requires you to explicitly permit an application to access your information.  The concept of an API implies this potential for theft…users are trusting applications to access their information and not keep it.  There is no way to prevent this for the same reason DRM doesn’t work: if people can view things they can store things.  While this is a legitimate concern, again it is nothing new, and not much can be done about it short of user education.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/384687093&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2008-09-06T02:09:45+00:00</dc:date>
	<dc:creator>Brian</dc:creator>
</item>
<item rdf:about="http://robarnold.org/?p=28">
	<title>Rob Arnold: Science of the Web</title>
	<link>http://robarnold.org/science-of-the-web/</link>
	<content:encoded>&lt;p&gt;My friend &lt;a href=&quot;http://www.pbs.org/idealab/dan_schultz/&quot;&gt;Dan Schultz&lt;/a&gt; is currently taking a course called &lt;a href=&quot;http://sched.tcpulse.com/browse/courses/15396&quot;&gt;“Science of The Web”&lt;/a&gt;. For one of his &lt;a href=&quot;http://scienceoftheweb.org/15-396/assignments/hwk2.pdf&quot;&gt;assignments&lt;/a&gt; (see problem 2), he needs as much help as he can get. Here’s where you come in. It’s quick and easy:&lt;/p&gt;
&lt;p&gt;1) Go to &lt;a href=&quot;http://boom.aladdin.cs.cmu.edu/cgi-bin/ipaddy&quot;&gt;http://boom.aladdin.cs.cmu.edu/cgi-bin/ipaddy&lt;/a&gt; (the server might encounter an error, just refresh and it should work)&lt;br /&gt;
2) Enter ‘dschultz’&lt;br /&gt;
3) Get as many other people as possible to do the same&lt;/p&gt;</content:encoded>
	<dc:date>2008-09-03T15:32:51+00:00</dc:date>
	<dc:creator>Rob Arnold</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=186">
	<title>Wei Zhou: Bauhous and Google products</title>
	<link>http://weizhou.wordpress.com/2008/09/02/bauhous-and-google-products/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Actually I like Google products over a lot of others. But there’s something out there makes me not a big fan of it. Eventually I cannot endure it anymore and decide to write something. I think Google, being considered as one of the leading software companies in the world, has the responsibility to make their product user experience not suck, not only in terms of usability, but of aesthetics.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/09/picture-20.png&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/09/picture-20.png?w=108&amp;amp;h=96&quot; alt=&quot;&quot; height=&quot;96&quot; class=&quot;alignnone size-thumbnail wp-image-187&quot; width=&quot;108&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2008/09/picture-21.png&quot;&gt;&lt;img src=&quot;http://weizhou.files.wordpress.com/2008/09/picture-21.png?w=128&amp;amp;h=92&quot; alt=&quot;&quot; height=&quot;92&quot; class=&quot;alignnone size-thumbnail wp-image-188&quot; width=&quot;128&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If everybody is using Gmail, Google Calendar and Google Doc, we begin to lose our control over our choices of web applications, just as we have to use Windows OS. So welcome to a software modernism age. Welcome Google’s fast-food web apps. Keep Google Bauhaus design doctrine in mind: “Our Web Apps are so simple, secure and fast, that’s all you need for your Internet.”&lt;/p&gt;
&lt;p&gt;Is simple, secure and fast all we want? If design is about the value,not the truth, where can we target our values in this fast-food software culture? When can a piece of software become a form of art, bringing people altimate enjoyment?When can a web Apps functions beyond a tool, behave like a digital being or digital asistant that help us in an interesting and considerate way? Can softare have personalities, catering to their master(user)’s ever-changing needs and interests? Google basically ignores all of those possibilities and proves itself proudly: A group of engineers, make softwares, work hard to make every engineer happy, and change every Internet user to a engineer.&lt;/p&gt;
&lt;img src=&quot;http://feeds.wordpress.com/1.0/categories/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://feeds.wordpress.com/1.0/tags/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/186/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/186/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/186/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/186/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/186/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/186/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=186&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-09-02T21:53:14+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=177">
	<title>Wei Zhou: Master of Tangible Interaction Design &amp; Gold Rush</title>
	<link>http://weizhou.wordpress.com/2008/08/29/master-of-tangible-interaction-design-gold-rush/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Recently my school(CMU)announces a new program: &lt;a href=&quot;http://code.arc.cmu.edu/mTID/master_of_tangible_interaction_design.html&quot;&gt;Master of Tangible Interaction Design&lt;/a&gt;. It’s a one-year master program, no GRE requirements, no need to have any design backgrounds, no Thesis project or thesis paper, no CHI submissions, and under the school of architecture. I regrect that I chose my current program -&lt;a href=&quot;http://www.design.cmu.edu/show_program.php?s=2&amp;amp;t=3&quot;&gt;Interaction Design&lt;/a&gt;(well-known for its user-centered design theory and practice), for which I had to do everything the other program doesn’t need, for which I dropped Yale, and declined RCA and CMU HCI’s offer. It really hurts, we spent so much money and energy to define the word of “interaction design”, we worked so hard to distinguish interaction design/user experience design with other subjects, and a new name-misleading program simply ruin it all.&lt;/p&gt;
&lt;img src=&quot;http://feeds.wordpress.com/1.0/categories/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://feeds.wordpress.com/1.0/tags/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/177/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/177/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/177/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/177/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/177/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/177/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=177&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-08-29T18:15:11+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://zpao.com/articles/11-passwordmgr_storage_faster">
	<title>Paul O'Shannessy: Making the New Password Manager Storage Faster</title>
	<link>http://zpao.com/articles/11-passwordmgr_storage_faster</link>
	<content:encoded>&lt;p&gt;When I first wrote the new storage module for the Password Manager, I took a few “shortcuts,” trying to keep my code &lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;. Partially this was because of the first patch by Mrinal Kant, but mostly it was because I like to reuse code. This bit us just a bit.&lt;/p&gt;


	&lt;p&gt;I mentioned in my &lt;a href=&quot;http://zpao.com/articles/10-passwordmgr_storage&quot;&gt;first post about this change&lt;/a&gt; that we were initially considerably slower in the critical &lt;code&gt;countLogins&lt;/code&gt; method. While it got improved before being checked in, it was still marginally slower (milliseconds on an abnormally large dataset).&lt;/p&gt;


	&lt;p&gt;As I said before, this was most likely since we were doing a &lt;code&gt;SELECT *&lt;/code&gt; on the &lt;code&gt;moz_logins&lt;/code&gt; table, and looping over the results and counting. This allowed me to reuse more code. Loops are a kind of slow, and since this was so important, I decided to speed it up.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=451479&quot;&gt;I filed a bug&lt;/a&gt; just over a week ago entitled “storage-mozStorage should use &lt;span class=&quot;caps&quot;&gt;COUNT&lt;/span&gt; in countLogins” – which pretty much explains what the solution to the above problem. I created a patch which essentially just switched the mosStorage module to use &lt;code&gt;SELECT COUNT(1)&lt;/code&gt;. I reran the performance tests I created and we’re doing much better now. There’s still a miniscule loss in speed from the legacy storage module, but at this point, we’ve done all that we can, and where the difference was milliseconds, its closer to millisecond.&lt;/p&gt;


	&lt;p&gt;This was &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/rev/ce557eb9ef4a&quot;&gt;checked in&lt;/a&gt; today (thanks Justin!).&lt;/p&gt;


	&lt;p&gt;And that’s it. I have another patch in the pipeline and hopefully I’ll have time to get it finished, approved, and reviewed for the freeze (whenever that is now).&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=M9cy2k&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=M9cy2k&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=J8wOfK&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=J8wOfK&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/zpao/~4/377635358&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2008-08-29T01:01:47+00:00</dc:date>
	<dc:creator>Paul O’Shannessy</dc:creator>
</item>
<item rdf:about="http://weizhou.wordpress.com/?p=163">
	<title>Wei Zhou: Scratching the surface</title>
	<link>http://weizhou.wordpress.com/2008/08/27/scratching-the-surface/</link>
	<content:encoded>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I have been using iPhone for three weeks now. Here’s a normal iPhone user daily schedule.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7:00 AM: iPhone &lt;strong&gt;Alarm&lt;/strong&gt; wakes me up&lt;/li&gt;
&lt;li&gt;7:01 AM: Check &lt;strong&gt;facebook, twitter, mySpace, Blog&lt;/strong&gt;, School email, Gmail, company email, open &lt;strong&gt;MC chats&lt;/strong&gt;, log into msn and AIM, &lt;strong&gt;Gmail&lt;/strong&gt;, skype(wifi), IRC(wifi).Quickly check &lt;strong&gt;TODO&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;7:05 AM: Fully wake up. Hold iPhone and run to the bathroom. Listen to &lt;strong&gt;Stitcher&lt;/strong&gt;’s new radios. Cook breakfast, check iPhone for nutrition info.&lt;/li&gt;
&lt;li&gt;7:30 AM: Bring my iPhone(and my iPhone charger!), walk to the bus stop, read &lt;strong&gt;Newsstand&lt;/strong&gt; RSS feeds, check &lt;strong&gt;Stanza, Jamed&lt;/strong&gt;, &lt;strong&gt;NetNewsWire&lt;/strong&gt;, and &lt;strong&gt;Shovel&lt;/strong&gt;, digg news and comment on other people’s blogs.&lt;/li&gt;
&lt;li&gt;8:00 AM: On the bus stop, search &lt;strong&gt;iWant&lt;/strong&gt; for local bus schedule.&lt;/li&gt;
&lt;li&gt;8:30 AM: Class begin. Use &lt;strong&gt;Note&amp;amp;Sketch&lt;/strong&gt; to take notes, use &lt;strong&gt;FileMagnet&lt;/strong&gt; to view course outline.&lt;/li&gt;
&lt;li&gt;8:35 AM: Bored. Check &lt;strong&gt;iGotchi&lt;/strong&gt; and feed my pet.&lt;/li&gt;
&lt;li&gt;9:00 AM: Teacher forgot my name. Use &lt;strong&gt;Shout it&lt;/strong&gt;, display “Wei Zhou” and wave to him.&lt;/li&gt;
&lt;li&gt;9:30 AM: Use &lt;strong&gt;Camera&lt;/strong&gt; to take a picture of my teacher, publish through &lt;strong&gt;ShoZu&lt;/strong&gt;, send it to facebook, flickr, MySpace, WordPress and Picasa.&lt;/li&gt;
&lt;li&gt;10:30 AM: Class ends, update my &lt;strong&gt;Diary&lt;/strong&gt;. Play &lt;strong&gt;Tris&lt;/strong&gt;, &lt;strong&gt;Tap Tap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;11:30 AM: Run for another class, focus on teaching, &lt;strong&gt;Camera&lt;/strong&gt; bad students sleep in class.&lt;/li&gt;
&lt;li&gt;12:00 AM. Break. Use &lt;strong&gt;VoiceNotes&lt;/strong&gt; to record student’s requirements.&lt;/li&gt;
&lt;li&gt;1:30 PM: Starving. Check &lt;strong&gt;Urbanspoon&lt;/strong&gt; for food.Drive up there using &lt;strong&gt;maps&lt;/strong&gt;.Turn on &lt;strong&gt;Pathtracker&lt;/strong&gt; because I’m directionally challenged. Using &lt;strong&gt;where&lt;/strong&gt; to find Starbucks.&lt;/li&gt;
&lt;li&gt;2:30 PM: &lt;strong&gt;Graffitio&lt;/strong&gt; notify me another CMU friend in Starbucks is using iPhone as well.Exchange cellphone number with him.&lt;strong&gt;Textmessage&lt;/strong&gt; another friend to join us. Send him our location using &lt;strong&gt;Over Here&lt;/strong&gt;. Share &lt;strong&gt;Loopt&lt;/strong&gt; with them.&lt;/li&gt;
&lt;li&gt;3:00 PM:Another class. Bored. Use &lt;strong&gt;Lifecast &lt;/strong&gt;to record class discussion.&lt;/li&gt;
&lt;li&gt;5:50 PM: End class. Repeat 1:30 PM.&lt;/li&gt;
&lt;li&gt;6:30 PM: Another class. Explore new Apps on App Store.&lt;/li&gt;
&lt;li&gt;8:30 PM: School ends. Walk back home. Study english using &lt;strong&gt;Blanks&lt;/strong&gt;. Update &lt;strong&gt;TODO&lt;/strong&gt;. Repeat 7:01 AM.&lt;/li&gt;
&lt;li&gt;9:30 PM: Homework time, use &lt;strong&gt;SnatchTest&lt;/strong&gt; as a mouse for my Macpro.Use &lt;strong&gt;controller&lt;/strong&gt; for my iTV and iPod player.&lt;/li&gt;
&lt;li&gt;10:30 PM: Play &lt;strong&gt;Ambient&lt;/strong&gt; to get to sleep.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P.S.: Repeat 7:01 AM many times during the day.&lt;/p&gt;
&lt;h4&gt;What else do I need?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt; Support remote printing.&lt;/li&gt;
&lt;li&gt;Every time I jump from one App to another App, the previous one stops working, I have to reopen it afterwards. That really stops my work-flow. I wish it works like Tabs in a browser(Or even better). In summery, the navigation is bad.&lt;/li&gt;
&lt;li&gt;Constantly pressing the main home button is annoying. Especially when I lay on the bed, holding the iPhone with one hand, I don’t want to move another hand. Can I just do everything use one hand?&lt;/li&gt;
&lt;li&gt; I wish I could track my iPhone using history.&lt;/li&gt;
&lt;li&gt;Searching is painful. iPhone should have an universal Google search button on the device.&lt;/li&gt;
&lt;li&gt;Typing is painful. I need a auto-type App.&lt;/li&gt;
&lt;li&gt;How can I copy and paste info from one App to another???!!!&lt;/li&gt;
&lt;li&gt;I need a Firefox browser App&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to design a Multi-touch interaction framework from ground up? &lt;a href=&quot;http://www.apple.com/iphone/&quot;&gt;IPhone&lt;/a&gt; just scratched the surface of a smart phone design - for me iPhone is a device that combines a bunch of unrelated separate gadgets together. It’s getting there, but hardly to be considered as “Smart”. &lt;a href=&quot;http://www.wipo.int/pctdb/en/wo.jsp?WO=2008085784&amp;amp;IA=US2007089161&amp;amp;DISPLAY=DESC&quot;&gt;Multi-touch gesture standards&lt;/a&gt; will be set up within next 5 years. What we need is no longer a “&lt;a href=&quot;http://en.wikipedia.org/wiki/Smartphone&quot;&gt;smart phone&lt;/a&gt;“, but a smart browser that embedded in a mobile device, In this way we would be able to use a series of small Apps in a meaningful combination, adjusting to people’s ever-changing task flow and context, without interrupting people’s thinking model over time(also see &lt;a href=&quot;http://labs.mozilla.com/2008/08/introducing-ubiquity/&quot;&gt;Ubiquity&lt;/a&gt;). &lt;strong&gt;That makes a digital device really become part of our body, like our hands and feet.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes. Building a variety of cool Apps is important, but not as important as arranging them in a useful way(&lt;a href=&quot;http://en.wikipedia.org/wiki/Human_computation&quot;&gt;Outsourcing part of human thinking to machines&lt;/a&gt;?). That applies to Small screen browser design, as well as browser for OS. Human beings are task-oriented, not tool-oriented.  Guess that’s the difference between a human and a computer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.azarask.in/blog/post/ambient-information-in-the-browser/&quot;&gt;&lt;/a&gt;As a designer we usually need to answer three questions:”What”, “Why”, and “How”. Here I delve into what and why, not much how. I found Aza’s blog particularly interesting -  &lt;a href=&quot;http://www.azarask.in/blog/post/ambient-information-in-the-browser/&quot;&gt;Ambient information.&lt;/a&gt; Because it also talked about how. We need more “Hows”.&lt;/p&gt;
&lt;img src=&quot;http://feeds.wordpress.com/1.0/categories/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://feeds.wordpress.com/1.0/tags/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/163/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/163/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/163/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/163/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/163/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/163/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=163&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2008-08-27T18:36:46+00:00</dc:date>
	<dc:creator>weizhou</dc:creator>
</item>
<item rdf:about="http://www.bailopan.net/blog/?p=84">
	<title>David Anderson: SpiderMonkey + Tracing = TraceMonkey</title>
	<link>http://www.bailopan.net/blog/?p=84</link>
	<content:encoded>&lt;p&gt;Firefox has a JIT for JavaScript now.  Whoa.  Before I continue on, here are links to the blogs of other Mozilla people close to the TraceMonkey team:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://weblogs.mozillazine.org/roadmap/archives/2008/08/tracemonkey_javascript_lightsp.html&quot;&gt;Brendan Eich - TraceMonkey: JavaScript Lightspeed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://shaver.off.net/diary/2008/08/22/the-birth-of-a-faster-monkey/&quot;&gt;Mike Shaver - Building a Faster Monkey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://andreasgal.com/2008/08/22/tracing-the-web/&quot;&gt;Andreas Gal - Tracing the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.mozilla.com/schrep/2008/08/22/what-can-you-do-when-your-browser-is-7-times-faster/&quot;&gt;Mike Schreopfer - What can you do when your browser is 7 times faster?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I started at Mozilla by working on Tamarin-Tracing.  Tracing is &lt;a href=&quot;http://www.andreasgal.com&quot;&gt;Andreas Gal’s&lt;/a&gt; fancy new idea for run-time guided JIT optimization, a powerful new concept that poses huge benefits over whole method compilation.  I &lt;a href=&quot;http://www.bailopan.net/blog/?p=72&quot;&gt;talked about this before&lt;/a&gt;, perhaps erroneously, but the concepts are there.&lt;/p&gt;
&lt;p&gt;The old style of compilation is to perform static analysis on entire methods at a time, compiling them to assembly when necessary.  Without running the program, you decide how to compile loops and nested loops efficiently, perhaps even trying to decide if they’re expensive or not.  Methods may or may not be inlined, but they are still the fundamental building block of most compilers.&lt;/p&gt;
&lt;p&gt;The concept of methods quickly disappears in a tracing compiler.  Everything is inlined as the tracer only compiles exactly what low level operations it sees being performed (and any sort of control flow is essentially a no-op).  A tracing JIT essentially turns an expensive loop into its own isolated method call, optimized for its run-time properties, regardless of where it is or what the loop has to call into.&lt;/p&gt;
&lt;p&gt;Andreas’s original paper on tracing was targeted toward mobile performance, where whole-method compilation and static analysis are too expensive.  For dynamic languages one instruction can have many decision paths at run-time.  Whole method JITing is a real problem because the code required for each opcode becomes very large, and static analysis is either unfruitful (because of dynamic types) or just too expensive.  This is especially problematic for JavaScript where browser performance is critical, and time spent analyzing code is time wasted.&lt;/p&gt;
&lt;p&gt;Thus it’s no surprise that Adobe decided to try tracing in the next generation of their Tamarin project.  Adobe’s approach to tracing ActionScript is to create very primitive building blocks and trace those at the lowest level.  It does this by converting ActionScript bytecode to a Forth dialect, and tracing the primitive Forth operations.  &lt;/p&gt;
&lt;p&gt;Mozilla’s JavaScript engine (”SpiderMonkey”) is very different.  It has a decade worth of optimization hacks and very “fat” opcodes (instructions that have a lot of internal decisions, rather than performing one single operation).  Although there were originally plans for Mozilla to switch to Tamarin, throwing out SpiderMonkey had a lot of hurdles, and the TraceMonkey project was started instead.&lt;/p&gt;
&lt;p&gt;Luckily Adobe had very nicely separated the tracing backend from their interpreter.  Tamarin-Tracing has a “nanojit” component with a simple IR.  Interpreters are responsible for emitting the IR, and nanojit can compile straight-line IR blocks into native code.  It can also link compiled code fragments together for attaching branches and building trees of traces.&lt;/p&gt;
&lt;p&gt;Using Adobe’s nanojit, Andreas decided to take a top-down approach to tracing SpiderMonkey.  The edge of every loop is monitored.  If a loop is executed enough times, the tracer is activated.  Every opcode is hooked and critical decision points are emitted as nanojit IR where possible.  When the control flow reaches the loop edge again, the IR is compiled and the loop will run as native code thereafter.&lt;/p&gt;
&lt;p&gt;There are some fascinating aspects to Andreas’s work.  Type speculation and specialization, the native stack versus the script stack, tree specialization, his handling of global variables — are all intricate and critical to the rapid progress and success he’s made on TraceMonkey.  And he (and Mike Shaver and Brendan Eich) did it all in 60 days, which is amazing.&lt;/p&gt;
&lt;p&gt;What’s my role in all this?  My summer intern project was porting the code generator and tracer to AMD64, which has landed and seems to work in the shell.  I’ve also been debugging anything that goes wrong on the 32-bit port.  Working with nanojit was a lot of fun - Adobe did a great job making it usable by other projects, and it’s definitely something that could become a generic library for dynamic languages to use for tracing.&lt;/p&gt;
&lt;p&gt;The big news today is that TraceMonkey has landed in mozilla-central and will probably be turned on by default for Firefox 3.1 beta 1.  Although it was open source and downloadable during development, it is now being officially announced and publicized, and can be used in the official nightly builds.  The speed difference is noticeable in sites doing intense JavaScript processing.  And though the SunSpider benchmarks can be considered superficial, it’s great to see the improvements we’re getting on them versus the old SpiderMonkey.&lt;/p&gt;
&lt;p&gt;This is just the beginning.  A lot more is planned for TraceMonkey and for tracing in general.  Code that used to be considered too crazy for JavaScript, like graphics and crypto loops, is becoming plausible.  We’re already noticing smoother play quality in some 3D JavaScript games on the web (using Canvas) and in other heavy applications.  In Mike Shaver’s words, this could change the way people use JavaScript.&lt;/p&gt;
&lt;p&gt;In terms of portability, nanojit still needs a bit of work, but it’s been hammered into shape for AMD64 for the time being.  It can use the extra eight registers available with REX prefixes, and it will perform 32-bit integer math versus 64-bit pointer math correctly (given using the correct LIR instructions for safety).  I also took the liberty of prettying up the macros used for code generation.  Some of the work remaining that I’d like to do in terms of the overall x32/x64 assembly process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Taking more advantage of addressing modes — we can reduce register pressure by combining redundant store/load ALU operations.&lt;/li&gt;
&lt;li&gt;Improving SSE2 logic which currently uses LAHF/PUSHF.&lt;/li&gt;
&lt;li&gt;Improving calling conventions for SSE2 and reducing register spilling.&lt;/li&gt;
&lt;li&gt;Inheriting type information from child instructions, to remove the need for separately typed IR instructions (i.e. no need for add versus fadd versus qadd).&lt;/li&gt;
&lt;li&gt;Enabling 64-bit jitting in the browser (too unstable right now so it’s only on in the shell).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should thank Edwin Smith at Adobe for putting up with my intense nanojit nagging; Mozilla for giving me the opportunity to work on this project as an intern; and Andreas Gal for coaching me through the tracing concepts every time I got them wrong.&lt;/p&gt;
&lt;p&gt;For people who follow this blog from the &lt;a href=&quot;http://www.sourcemod.net/&quot;&gt;SourceMod&lt;/a&gt; project, will SourcePawn get tracing?  It’s something I’m experimenting with and will talk more about later.  There are some hurdles to JITing Pawn in that very careful escape analysis is needed to make any of the nice optimizations.&lt;/p&gt;</content:encoded>
	<dc:date>2008-08-22T20:00:32+00:00</dc:date>
	<dc:creator>dvander</dc:creator>
</item>
<item rdf:about="http://zpao.com/articles/10-passwordmgr_storage">
	<title>Paul O'Shannessy: Password Manager now uses mozStorage</title>
	<link>http://zpao.com/articles/10-passwordmgr_storage</link>
	<content:encoded>&lt;p&gt;The other day &lt;a href=&quot;http://hg.mozilla.org//mozilla-central/index.cgi/rev/c2f416981fa3&quot;&gt;my patch landed&lt;/a&gt; switching the Password Manager to use &lt;a href=&quot;http://developer.mozilla.org/en/docs/Storage&quot;&gt;mozStorage&lt;/a&gt; (our wrapper around SQLite).  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=288040&quot;&gt;The bug&lt;/a&gt; had been up on Bugzilla for a long time, over 3 years, when I came across it at the end of June. I had been doing some Password Manager related work already by that point, so I decided I would do it. This is the story of that bug: the process, the hardships, the code (at least a bit). Keep in mind I was also doing work on my &lt;a href=&quot;http://zpao.com/articles/8-dtrace_treemaps_part_1&quot;&gt;DTrace Treemaps&lt;/a&gt; at the time, went to Summit, and encountered more edge cases than I wanted, so this took longer than expected.&lt;/p&gt;


	&lt;h2&gt;Quick Features &amp;amp; Change Summary&lt;/h2&gt;


	&lt;p&gt;Some of this is discussed further down, so bear with me. One of the primary differences in the switch to using mozStorage is that we now store data in a database. Previously we were storing data in a text file, using lines and periods to separate data fields. Open &lt;code&gt;signons3.txt&lt;/code&gt; in your &lt;a href=&quot;http://support.mozilla.com/en-US/kb/Profiles&quot;&gt;profile directory&lt;/a&gt; and take a look at it (assuming you’ve saved a password before). All information was kept in memory, and when a new password was saved, the whole file would need to be rewritten. The same thing happened if you ever removed a saved password. Using a database means that we don’t have to keep any (potentially) sensitive information in memory. It also means faster reading and writing since we don’t have to read the whole file every time. These speed boosts are apparent especially in the speed tests, attached to the bug and summarized below.&lt;/p&gt;


	&lt;p&gt;Since this is really just a drop in change that must implement an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, to the outside world nothing has changed. Although the inner workings are different, it’s the same to anybody who happens to use it (extensions or other parts of Firefox).&lt;/p&gt;


	&lt;h2&gt;v0.1 – The beginning&lt;/h2&gt;


	&lt;p&gt;I began work by really taking a look at the &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/src/storage-Legacy.js&quot;&gt;legacy storage module&lt;/a&gt; to make sure I knew what was supposed to be happening. Then I looked at the initial attempts by other developers. The first attempts were made before Password Manager got rewritten, so those weren’t relevant. Mrinal Kant came in (over 2 years after the first patches) and wrote what I used as the basis for my code. I don’t think I ran it as it was, but it looked functional, at least at the core.&lt;/p&gt;


	&lt;p&gt;I actually started by just copying the legacy storage file, removing all of the code from methods that would need to be changed, and started fresh. I copied in some code from Mrinal’s work and used some of the conventions, but the bulk of it was rewritten. I opted to use the wrapper we have for Storage, which makes it easy to do parameter replacement. This also automatically binds the parameters to a type – so when you give it a string, it will ensure it’s treated as a string. It’s very handy.&lt;/p&gt;


	&lt;p&gt;This first version “worked” (at least as far as I remember), though it definitely had problems. I brought it up at our &lt;a href=&quot;http://wiki.mozilla.org/Firefox3.1/StatusMeetings/&quot;&gt;weekly status meeting&lt;/a&gt; and it became one of the “nice to have” features for 3.1. That gave it some attention it needed and I got some quick feedback from &lt;a href=&quot;http://shawnwilsher.com&quot;&gt;Shawn&lt;/a&gt; and &lt;a href=&quot;http://blog.mozilla.com/dolske/&quot;&gt;Justin&lt;/a&gt;.&lt;/p&gt;


	&lt;h2&gt;v0.2 – Database details&lt;/h2&gt;


	&lt;p&gt;One of the primary changes here was some of the database stuff. Shawn had pointed out that I needed a way to version the database. All I had was a method to create the tables. In order to future-proof this, I needed to make sure the schema was stored somewhere and there was a procedure for migrating the database.&lt;/p&gt;


	&lt;p&gt;I took a look at &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/source/toolkit/components/contentprefs/src/nsContentPrefService.js&quot;&gt;nsContentPrefService&lt;/a&gt; (which stores your preferences for specific sites, like remembering zoom settings) since that was another component using storage and written in JavaScript. I “hijacked” the code related to the database stuff, and modified it a bit to fit my needs.&lt;/p&gt;


	&lt;p&gt;The other major change here was to replace &lt;code&gt;var&lt;/code&gt; with &lt;code&gt;let&lt;/code&gt; – “&lt;code&gt;let is the new var&lt;/code&gt;” as my shirt says. A number of other changes were also made – cleaning up queries, hard-coding the table names, and making sure I was using statements correctly.&lt;/p&gt;


	&lt;h2&gt;v0.3, v0.4 – Cleanup &amp;amp; Optimization&lt;/h2&gt;


	&lt;p&gt;These versions were pretty light – mostly involving cleanup. &lt;code&gt;modifyLogin&lt;/code&gt; and the process involved got improved. I also reduced the number of queries we were making by hand and so all &lt;code&gt;SELECT&lt;/code&gt;s were done from just 2 places (one for each table).&lt;/p&gt;


	&lt;h2&gt;v0.5 – Importing&lt;/h2&gt;


	&lt;p&gt;v0.5 focused on importing from the legacy module. The basics were in the original code Mrinal wrote, but all of the edge cases were difficult to handle. The one case that caused a lot of problems were the “user has a master password, but presses cancel when we import”. We needed to handle that gracefully, and Justin and I decided the best way was to introduce a &lt;code&gt;_deferredInit&lt;/code&gt; method, which did the bulk of the initialization work. At the beginning of each public method, we then check the initialization state and try to import again. It can get annoying, but everything about the master password is annoying.&lt;/p&gt;


	&lt;p&gt;This also resulted in a couple bugs being spun off to help us with importing: &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=449810&quot;&gt;one bug&lt;/a&gt; was just a few lines added to the legacy module and the password manager UI to handle an additional error, and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=449095&quot;&gt;the other&lt;/a&gt; was just to ensure the legacy module didn’t create an empty file if it was never used.&lt;/p&gt;


	&lt;h2&gt;v0.6 – Tests&lt;/h2&gt;


	&lt;p&gt;I finally got to writing the tests, which involved a lot of copy &amp;amp; paste from the legacy tests, then making small modifications. It’s not the most efficient way, but it works ok. Since the mozStorage module works slightly differently, the code duplication is a necessity for now. In theory they can be cleaned up, but that’ll be a task for the next intern :)&lt;/p&gt;


	&lt;p&gt;At this point I thought I was pretty much done, and I was. There were still a few problems though, and also not quite enough test coverage.&lt;/p&gt;


	&lt;h2&gt;v0.7, v0.8 – Cleanup, Tests, Corrupt Databases&lt;/h2&gt;


	&lt;p&gt;v0.7 involved a lot of cleanup and adding tests. v0.8 was an important milestone in that I finally added the handling of a corrupt database. Before this point, if we encountered a corrupt database, we would fail and then as with a failed import, just try again and again. This was bad, really bad. So a “thank you” to Shawn for catching that. Now we backup the corrupt database and just create a new one. It should be difficult to get a corrupt database, but just in case (and to cover the case when people think they know what they’re doing, but don’t).&lt;/p&gt;


	&lt;h2&gt;v0.9, v1.0 – Performance&lt;/h2&gt;


	&lt;p&gt;In one of the recent status meetings, &lt;a href=&quot;http://shaver.off.net/diary/&quot;&gt;Mike Shaver&lt;/a&gt; asked me about performance. At that point I hadn’t really done much except throw it up on the try server. The try server gives decent ball park figures, but it’s not perfect. So Justin worked on getting &lt;a href=&quot;http://wiki.mozilla.org/StandaloneTalos&quot;&gt;Standalone Talos&lt;/a&gt; working while I wrote some &lt;span class=&quot;caps&quot;&gt;XPC&lt;/span&gt; shell “tests”. I discovered that while we were generally faster – faster init, faster add, faster remove – we were considerably slower for &lt;code&gt;countLogin&lt;/code&gt;, which is a critical path, since it gets called on every page. Over 90% of the that time was actually spent initializing &lt;code&gt;nsLoginInfo&lt;/code&gt; objects (since I tried to reuse code). This got improved, though we are still a couple milliseconds slower. This could likely be improved a little bit since we are still doing a &lt;code&gt;SELECT&lt;/code&gt; and looping over the results. A little bit more work needs to be done that way, so making the query use &lt;code&gt;COUNT&lt;/code&gt; would cut that out. Maybe I’ll write another patch to do that before Beta 1. For now though, we’ll keep doing it how we’re doing it.&lt;/p&gt;


	&lt;h2&gt;And that’s all… almost&lt;/h2&gt;


	&lt;p&gt;After this got checked in, the Windows boxes turned orange on Tinderbox. This was because of the tests (trying to delete files). Justin and I thought we had a quick fix, committed that. As I was packing to come home, I got pinged on &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; since the boxes were still orange and it was my fault. So the tests for my changeset got backed out and we switched back to the legacy module, but the code was still in there.&lt;/p&gt;


	&lt;p&gt;On Sunday, my module &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/index.cgi/rev/063c145b2a09&quot;&gt;was re-enabled&lt;/a&gt; (thanks Justin!). There was &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=451040&quot;&gt;another hiccup&lt;/a&gt; related to packages-static, but that was fixed as well. If you have any problems &lt;a href=&quot;https://bugzilla.mozilla.org/enter_bug.cgi?component=Password%20Manager&amp;amp;product=Toolkit&quot;&gt;please report them on Bugzilla&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=msGkpk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=msGkpk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/zpao?a=laWcYK&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/zpao?i=laWcYK&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/zpao/~4/368627763&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content:encoded>
	<dc:date>2008-08-19T03:55:43+00:00</dc:date>
	<dc:creator>Paul O’Shannessy</dc:creator>
</item>
<item rdf:about="http://zpao.com/articles/9-new_design_updates">
	<title>Paul O'Shannessy: New Design &amp; Updates</title>
	<link>http://zpao.com/articles/9-new_design_updates</link>
	<content:encoded>&lt;p&gt;The night before heading to Whistler for &lt;a href=&quot;https://wiki.mozilla.org/Summit2008&quot;&gt;Summit&lt;/a&gt; (it was awesome!), I started messing around in Illustrator. I came up with a little idea that I liked and decided to take it a step further, so I opened Photoshop and got to work. It progressed fairly well, so I started working on the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; the next day. By the end of the plane ride to Vancouver I had a single page mostly done, with all the images and everything.&lt;/p&gt;


	&lt;p&gt;I was busy the n