<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:idx="urn:atom-extension:indexing" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:media="http://search.yahoo.com/mrss/" idx:index="no"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="http://www.google.com/reader">Google Reader</generator><id>tag:google.com,2005:reader/user/06920941852763310482/state/com.google/broadcast</id><title>dshaw's shared items in Google Reader</title><gr:continuation>CJKhwvOIrJUC</gr:continuation><author><name>dshaw</name></author><updated>2009-02-24T04:36:19Z</updated><link rel="self" href="http://feeds.feedburner.com/dshaw/reader" type="application/atom+xml" /><entry gr:crawl-timestamp-msec="1235450179195"><id gr:original-id="http://joewalnes.com/?p=339">tag:google.com,2005:reader/item/de7cd57f9f30c261</id><category term="Software" /><category term="Java" /><category term="NewRelease" /><category term="OpenSource" /><category term="SiteMesh" /><title type="html">SiteMesh 2.4 released</title><published>2009-01-22T20:52:12Z</published><updated>2009-01-22T20:52:12Z</updated><link rel="alternate" href="http://joewalnes.com/2009/01/22/sitemesh-24-released/" type="text/html" /><media:group><media:content url="" /></media:group><content xml:base="http://joewalnes.com/" type="html">&lt;div&gt;&lt;br&gt;&lt;p&gt;After a long wait, SiteMesh 2.4 has just been released.&lt;/p&gt;
&lt;p&gt;This mostly consists of minor bug fixes and improvements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="http://www.opensymphony.com/sitemesh/"&gt;http://www.opensymphony.com/sitemesh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download: &lt;a href="http://www.opensymphony.com/sitemesh/download.action"&gt;http://www.opensymphony.com/sitemesh/download.action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Changes: &lt;a href="http://jira.opensymphony.com/secure/IssueNavigator.jspa?reset=true&amp;amp;pid=10000&amp;amp;fixfor=21683"&gt;http://jira.opensymphony.com/secure/IssueNavigator.jspa?reset=true&amp;amp;pid=10000&amp;amp;fixfor=21683&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joewalnes.wordpress.com/339/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joewalnes.wordpress.com/339/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joewalnes.wordpress.com/339/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joewalnes.wordpress.com/339/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joewalnes.wordpress.com/339/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joewalnes.wordpress.com/339/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joewalnes.wordpress.com/339/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joewalnes.wordpress.com/339/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joewalnes.wordpress.com/339/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joewalnes.wordpress.com/339/"&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joewalnes.com&amp;amp;blog=5140026&amp;amp;post=339&amp;amp;subd=joewalnes&amp;amp;ref=&amp;amp;feed=1"&gt;&lt;/div&gt;</content><author><name>joewalnes</name></author><source gr:stream-id="feed/http://joewalnes.com/feed/"><id>tag:google.com,2005:reader/feed/http://joewalnes.com/feed/</id><title type="html">Joe Walnes</title><link rel="alternate" href="http://joewalnes.com" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1230431368939"><id gr:original-id="">tag:google.com,2005:reader/item/821843ee0bf96c19</id><title type="html">Stop Using Internet Explorer 7 (For Now), Or Deploy Workarounds</title><published>2008-12-28T02:29:28Z</published><updated>2008-12-28T02:29:28Z</updated><link rel="alternate" href="http://feeds.feedburner.com/~r/securosis/~3/482948273/" type="text/html" /><link rel="related" href="http://securosis.com" title="securosis.com" /><content xml:base="http://feeds.feedburner.com/~r/securosis/~3/482948273/" type="html">&lt;blockquote&gt;Shared by  dshaw 
&lt;br&gt;
Just stop using IE. Please. It's a security architecture failure.&lt;/blockquote&gt;
&lt;p&gt;There is an &lt;a href="http://isc.sans.org/diary.html?storyid=5458"&gt;unpatched vulnerability for Internet Explorer 7 being actively exploited in the wild&lt;/a&gt;. The details are public, so any bad guy can take advantage of this. It’s a heap overflow in the XML parser, for you geeks out there. It affects all current versions of Windows.&lt;/p&gt;
&lt;p&gt;Microsoft issued an &lt;a href="http://www.microsoft.com/technet/security/advisory/961051.mspx"&gt;advisory with workarounds that prevent exploitation&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set Internet and Local intranet security zone settings to “High” to prompt before running ActiveX Controls and Active Scripting in these zones.&lt;/li&gt;
&lt;li&gt;Configure Internet Explorer to prompt before running Active Scripting or to disable Active Scripting in the Internet and Local intranet security zone.&lt;/li&gt;
&lt;li&gt;Enable DEP for Internet Explorer 7.&lt;/li&gt;
&lt;li&gt;Use ACL to disable OLEDB32.DLL.&lt;/li&gt;
&lt;li&gt;Unregister OLEDB32.DLL.&lt;/li&gt;
&lt;li&gt;Disable Data Binding support in Internet Explorer 8.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/%7Ef/securosis?a=Dc7cO"&gt;&lt;img src="http://feeds.feedburner.com/%7Ef/securosis?i=Dc7cO" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/%7Ef/securosis?a=G2Jyo"&gt;&lt;img src="http://feeds.feedburner.com/%7Ef/securosis?i=G2Jyo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/%7Ef/securosis?a=GKCio"&gt;&lt;img src="http://feeds.feedburner.com/%7Ef/securosis?i=GKCio" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/%7Ef/securosis?a=uGp0o"&gt;&lt;img src="http://feeds.feedburner.com/%7Ef/securosis?i=uGp0o" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/%7Er/securosis/%7E4/482948273" height="1" width="1"&gt;
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Just stop using IE. Please. It's a security architecture failure.</content><author gr:user-id="06920941852763310482" gr:profile-id="100235426753535268123"><name>dshaw</name></author></gr:annotation><source gr:stream-id="user/06920941852763310482/source/com.google/link"><id>tag:google.com,2005:reader/user/06920941852763310482/source/com.google/link</id><title type="html">securosis.com</title><link rel="alternate" href="http://securosis.com" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1230431256075"><id gr:original-id="">tag:google.com,2005:reader/item/75d81c82347c213e</id><title type="html">What Blogger Should Do</title><published>2008-12-28T02:27:36Z</published><updated>2008-12-28T02:27:36Z</updated><link rel="alternate" href="http://evhead.com/2008/12/what-blogger-should-do.html" type="text/html" /><link rel="related" href="http://evhead.com/" title="evhead" /><content xml:base="http://evhead.com/2008/12/what-blogger-should-do.html" type="html">&lt;blockquote&gt;Shared by  dshaw 
&lt;br&gt;
+1 Better templates. I've stopped short numerous times from doing a project with Blogger solely for this reason.&lt;/blockquote&gt;
&lt;a href="http://blogger.com"&gt;&lt;img src="http://1.bp.blogspot.com/_94lNR2vayWk/STeUWNOvgHI/AAAAAAAAAQ8/DPGKl-OPFqw/s320/blogger+logo.jpg" style="border:0pt none;width:200px;float:right;margin-left:10px;margin-bottom:10px" border="0"&gt;&lt;/a&gt; I was recently asked about the "death of blogging" for &lt;a href="http://www.economist.com/business/displaystory.cfm?story_id=12566826"&gt;this article in The Economist&lt;/a&gt;. I didn't get back to the reporter in time, though, so my comments ended up, ironically, &lt;a href="http://andreaskluth.org/2008/11/06/the-death-of-blogging/"&gt;on his blog&lt;/a&gt;. (Conclusion: I don't believe blogging is dying, but...it's complicated. Like in most healthy ecosystems, new species are breeding. Whether or not they're called "blogging" is a question perhaps best left for scientists, but there are many new forms that are undeniably part of the blogging genus.)&lt;br&gt;&lt;br&gt;Last night at the Churchill Club, I was quoted as saying that Twitter "will dwarf Blogger." I do believe that, but it will be no easy task and will not be soon. Blogger is big. &lt;a href="http://www.avc.com/a_vc/2008/04/as-usual-google.html"&gt;Really big&lt;/a&gt;. That chart was from six months ago. Is it losing traction? I don't know. It doesn't look like it was then. And since then, the team over there seems to be kicking ass. A glance at &lt;a href="http://buzz.blogger.com/"&gt;Blogger Buzz&lt;/a&gt; show's they've been launching feature after feature the last few months. Launching &lt;i&gt;any&lt;/i&gt; features when you're that big is usually a daunting task. Shows that a lot of years building a solid platform have paid off. &lt;br&gt;&lt;br&gt;So, the question is: Where do they go from here? Part of that, I suppose, will be determined by where the Google powers-that-be decide Blogger lands on their priority list, &lt;a href="http://online.wsj.com/article/SB122826503489174369.html"&gt;given the leaner times&lt;/a&gt;. Clearly it's not one their cash cows, but it's also not a side project they're dabbling in. I've heard it makes money (from AdSense on blogs they host), but I really don't know. In fact, I know so little about Blogger these days, I feel like I can actually write about it as an outsider. &lt;br&gt;&lt;br&gt;From a product perspective, I do feel like they could get more out of the capabilities and incredible usage they already have. Here's an unordered list of some of the ways I'd look to do that if I were in charge:&lt;br&gt;&lt;br&gt;&lt;b&gt;Build a Network of Networks:&lt;/b&gt; Building more interconnection between users and blogs is clearly part of the focus now with "followers." It's something we realized we were remiss in not doing more of way back when we built the (not very good) profile pages in 2004, when Friendster was the big thing and Orkut was launching down the hall. There are a ton of mechanisms to do this, but one thing to consider: Don't try to make one big network. Perhaps enable anybody to create a blog network/community thingy. (There might be a doc around there about "Blogger Hubs" -- not sure if it's still relevant.)&lt;br&gt;&lt;br&gt;&lt;b&gt;Point People to Good Content:&lt;/b&gt; When it comes to interconnectedness, don't just try to make it more "social." Social is important, but pure socialness can be achieved elsewhere. One unique thing about Blogger -- vs. say Facebook or MySpace -- is the content. How can you make the content more interlinked and use the network to get more attention to the good stuff, thus rewarding the creating of more good stuff? You know what the most-viewed/commented/linked-to post on Blogger was today. Show it to me! I bet it's interesting! (Even better: Show me what's most popular within &lt;i&gt;my&lt;/i&gt; blog network.) BTW, if revenue, not just usage, is a priority, this plays to that, because it's the content focused blogs that can make the money.&lt;br&gt;&lt;br&gt;&lt;b&gt;Get More Out of the Navbar:&lt;/b&gt; The toolbar you have at the top of millions of blogs could do so much more. This is where you can put the feedback mechanisms, interlinking mechanisms, etc. NextBlog could be a whole thing! Make that so I never wanna stop clicking because it always shows me something awesome. (Think StumbleUpon within the Blogger network.)&lt;br&gt;&lt;br&gt;&lt;b&gt;Prettier Templates:&lt;/b&gt; When it comes down to it, many people just want a page that looks good. This a large part of Tumblr's appeal, in my opinion. You gotta upgrade those templates. I know prettiness is not a focus in your culture, but bring them into 2007 at least web design, if not 2009. &lt;br&gt;&lt;br&gt;&lt;b&gt;Help People use the Layout Engine:&lt;/b&gt; The new templating system does everything anyone would every want. But you kinda gotta be a programmer who likes programming in production, in a textarea, in a language you've never used, to tap into it. Yes, there's point-and-click design and widget goodness, but it seems...hard. Can you make it seem fun? Can you make it so pseudo-developers can figure it out and others can leverage that? Layout sharing perhaps (kill two birds)? &lt;br&gt;&lt;br&gt;&lt;b&gt;Make it Fast:&lt;/b&gt; You've made some progress on slimming down the posting form page (at least in Draft). But I don't know if we've fully embraced the Google mantra of speed is every. I predict you'd see a 30% increase in posts if you made posting twice as fast. (That goes for the whole workflow, not just the posting form.)&lt;br&gt;&lt;br&gt;&lt;b&gt;Become the Aggregator:&lt;/b&gt; One possible answer to the question to what role does the stand-alone blog live in the age of a million-and-one generalized and specialized participatory web experiences is as a personal aggregator that reflects back the other stuff one does on the web. Yes, I'll load all that stuff into FriendFeed, but that's not my "online presence" as we used to say back in the day. Everybody (or at least a lot of people) needs an URL -- and one without a ? in it. I want my tweets, and my photos, and my whatevers to show up on evhead.com (hosted by Blogger) in an attractive way. &lt;br&gt;&lt;br&gt;&lt;b&gt;Put Ads in the App Interface:&lt;/b&gt; For example, the published landing page alone must get millions of views a day. And it's the perfect point for someone to go elsewhere. See if you can target it off what they wrote about. No one will mind (much). And strengthening your revenue story will strengthen your position in the company. &lt;br&gt;&lt;br&gt;&lt;b&gt;Do Something Radical:&lt;/b&gt; I almost feel like this list is way too conservative. Not that I think Blogger's in trouble. But I suspect there something potentially more awesome that you could pull off by leveraging what you already have. You probably have those ideas. When there are so many great things to do that you know will work, it's hard to not focus on them. But it might be time to try something wacky.&lt;br&gt;&lt;br&gt;&lt;br&gt;Sorry, I know you've already thought of these things. When you're working on a product and people on the outside tell you what you should do, acting like they're all smart, it's annoying. The hard part is &lt;i&gt;building&lt;/i&gt; stuff, not thinking it up. Carry on. (But seriously, the prettier templates thing.)
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">+1 Better templates. I've stopped short numerous times from doing a project with Blogger solely for this reason.</content><author gr:user-id="06920941852763310482" gr:profile-id="100235426753535268123"><name>dshaw</name></author></gr:annotation><source gr:stream-id="user/06920941852763310482/source/com.google/link"><id>tag:google.com,2005:reader/user/06920941852763310482/source/com.google/link</id><title type="html">evhead</title><link rel="alternate" href="http://evhead.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1230430932365"><id gr:original-id="tag:blogger.com,1999:blog-2765056849626104020.post-8927431741876526980">tag:google.com,2005:reader/item/ee7215fae1f5e709</id><category term="Janus" scheme="http://www.blogger.com/atom/ns#" /><category term="WMV3" scheme="http://www.blogger.com/atom/ns#" /><category term="encoding" scheme="http://www.blogger.com/atom/ns#" /><category term="VC1" scheme="http://www.blogger.com/atom/ns#" /><category term="Silverlight" scheme="http://www.blogger.com/atom/ns#" /><category term="WMDRM" scheme="http://www.blogger.com/atom/ns#" /><category term="PlayReady" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Encoding for streaming</title><published>2008-11-06T15:56:00Z</published><updated>2008-11-19T01:44:42Z</updated><link rel="alternate" href="http://blog.netflix.com/2008/11/encoding-for-streaming.html" type="text/html" /><content xml:base="http://blog.netflix.com/" type="html">This is Neil Hunt, Netflix chief product officer, with some technical background on the Netflix encodes used for streaming. We get a lot of questions about this, so I'm going to go deep.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;First Generation Encoding&lt;/span&gt;&lt;br&gt;&lt;br&gt;Our first set of encodes are based on WMV3 and WMA in ASF with WMDRM10 (Janus).  We chose these standards because the Janus components have been widely adopted by our CE partners such as Roku, LG Electronics, Samsung, TiVo, and of course Microsoft Xbox.&lt;br&gt;&lt;br&gt;We encode most content at 500, 1000, 1600, and 2200kbps VBR, but some titles whose source quality merits it have also been encoded at 3400kbps.  The highest bitrate encodes are fit into 720x480 non-square pixels (the usual 1.2 PAR for widescreen content, 0.9 PAR for 4:3), but optimum encoding at lower bitrates is achieved with fewer pixels.  Encoded films are normally at 24fps to match the source, while shot-to-video and mixed material is de-interlaced to 30fps (or 25fps for PAL content).&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Second Generation Encoding&lt;/span&gt;&lt;br&gt;&lt;br&gt;The new Silverlight player (that some users are helping us test as I write) uses VC1 Advanced Profile encoding with PlayReady DRM.  A key property is that each GOP header includes frame size and resolution, which allows us to assemble a stream on the fly from different bitrate encodes as your broadband bandwidth fluctuates.  (Another key feature is more coverage, including Intel Macs and Firefox users.)  We expect to switch completely to the new player later this year.&lt;br&gt;&lt;br&gt;The VC1 encoders are more efficient than the WMV3 encoders, so we are currently encoding VC1AP at slightly lower birates: 375, 500, 1000, and 1500kbps, all square pixel.  At some point we are likely to add a couple more resolutions of non-square pixel encodes capturing the original pixel-aspect-ratio of the source.&lt;br&gt;&lt;br&gt;We are also re-wrapping the VC1AP encodes in WMDRM10 for CE devices, which will gradually switch to the more efficient encodes in future firmware upgrades.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;High Definition Encodes&lt;/span&gt;&lt;br&gt;&lt;br&gt;Today we have rights to deliver about 400 streams in HD (720p).  More titles will be added over time.  We experimented with first-generation WMV3 encodes at 4000kbps and 5500kbps, but settled on second-generation HD encodes with VC1AP at 2600kbps and 3800kbps, which extends their accessibility down to lower home broadband connections.  As with SD, encodes of film material are at 24fps, and encodes of shot-to-video material are at 30fps (or 25fps for PAL), rather than the 60fps that would come from a Blu-ray disc - we judged the 60fps content as too expensive of bandwidth for now.  In general, these encodes are definitively better than SD, but won't challenge well-executed Blu-ray encodes - that would require a bitrate out of reach for most domestic broadband today.  We believe Moore's law will drive home broadband higher and higher enabling full 1080p60 encodes in a few years.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Stereo Audio&lt;/span&gt;&lt;br&gt;&lt;br&gt;Today, we cannot use WMDRM to deliver AC3 or DD+ audio, which means that only stereo (delivered via WMA) is available.  PCs and Macs decode the WMA, and CE players also transcode to PCM for digital connections to receivers.  We could technically include multichannel audio using WMAPro, but essentially no receivers are actually capable of decoding that.  We are working on solutions to deliver multichannel audio for all the streams where we have suitable source, but this won't happen in 2008 for sure.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Subtitles, Closed Captions, and Alternate Soundtracks&lt;/span&gt;&lt;br&gt;&lt;br&gt;All these features are desired for future releases.  Delivering closed-captions via the Silverlight player is probably closest, but it won't be 2008 either.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Sources&lt;/span&gt;&lt;br&gt;&lt;br&gt;Our best sources are electronically delivered mezzanine files, or high quality D5 tapes, and the highest bitrate encodes of these sources really look as good or better than DVDs.  Digibeta tape sources can also generate good encodes, but some sources just are not as good, regardless of the bitrate used for encoding.  We also encode from DV tape and even on occasion from DVDs.  We get HD sources for many titles, even if we only have the rights to stream SD.  The HD sources permit a better SD encode than working from SD soures.&lt;br&gt;&lt;br&gt;One class of sources has been derived from 24fps film, interlaced to i60 for TV broadcast, and then decimated to p30, and comes with restrictions on reprocessing.  This results in frames that are even-odd interlaces of adjacent film frames, and a 4/5 cadence motion jerkiness.  We are actively working to re-acquire these sources in better form.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Delivered Quality&lt;/span&gt;&lt;br&gt;&lt;br&gt;Our first-gen PC streaming player uses 1-4 bars to represent the delivered quality, representing 500, 1000, 1600, and 2200 kbps.  The 3400kbps encodes are represented as 4 bars.  The player measures bandwidth once at the start of the title, and chooses a bitrate for delivery that has at least 40% headroom from the measured speed.&lt;br&gt;&lt;br&gt;The Roku, LG, and Samsung, players use four dots during buffering in the same way, and Xbox has 4 bars just like the PC player.  The TiVo player has a similar display, but with 10 thin bars.&lt;br&gt;&lt;br&gt;The Silverlight player is currently more opaque, since it picks the stream to deliver dynamically.  If your connection slows, as the buffer empties, the player starts buffering a lower bitrate stream and switches seamlessly across.  Conversely, if the buffer fills rapidly again, the player can pick a higher bitrate stream.  (Note that if Outlook (or some other large application) decides to wake up and refresh your email in the middle of a movie, Silverlight might be starved of CPU and drop some frames; this may cause the player to conclude that it should switch to a lower bitrate stream that won't overload the CPU.  Today, we haven't figured a reliable way to determine that the CPU is again underutilized and permit switching back up again, so my advice is to close Outlook and similar periodically expensive applications prior to playing the movie!)&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;Other Notes&lt;/span&gt;&lt;br&gt;&lt;br&gt;We strive to deliver great encodes, and the encoding recipe evolves as we learn new tricks and engage new encoding technology.  Since we have a variety of software and CE players in the field, we have to continue to support existing encodes for a transition period if new versions incompatible with existing players are added, until we can work with partners to upgrade firmware to support the new encodes.&lt;br&gt;One new feature that I want to add is a post-play screen that appears when a playback is stopped, so that users can easily flag when encodes fall below par, so that we can prioritize identifying and fixing issues.&lt;div&gt;&lt;img width="1" height="1" src="http://res1.blogblog.com/tracker/2765056849626104020-8927431741876526980?l=blog.netflix.com"&gt;&lt;/div&gt;</content><author><name>NDH</name></author><source gr:stream-id="feed/http://blog.netflix.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://blog.netflix.com/feeds/posts/default</id><title type="html">The Official Netflix Blog</title><link rel="alternate" href="http://blog.netflix.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1229023096430"><id gr:original-id="">tag:google.com,2005:reader/item/b1866cce887d9806</id><title type="html">The W3C Core Working group has broken faith with the XML community by  publishing an XML 1.0, fifth edition spec that is incompatible with all  previous versions.</title><published>2008-12-11T19:18:16Z</published><updated>2008-12-11T19:18:16Z</updated><link rel="alternate" href="http://www.cafeconleche.org/#December_8_2008_22075" type="text/html" /><link rel="related" href="http://www.cafeconleche.org/" title="Cafe con Leche XML News and Resources" /><content xml:base="http://www.cafeconleche.org/#December_8_2008_22075" type="html">&lt;blockquote&gt;Shared by  Paul R Brown 
&lt;br&gt;
And over the shark we go.  Good riddance.&lt;/blockquote&gt;
The W3C Core Working group has broken faith with the XML community by publishing an XML 1.0, fifth edition spec that is incompatible with all previous versions. The grammar has changed and previously malformed documents are suddenly well-formed. Existing parsers cannot handle the syntax defined by this edition. XML 1.1 has failed so now the W3C is trying to rewrite history and pretend that this is what they meant all along. (If that were true, why did we waste so much time on XML 1.1?) Apparently stability of standards is no longer a virtue at the W3C. This is even worse than the XML 1.1 debacle. At least there, the W3C admitted they were pushing a new, incompatible version; and gave users a hook to tell which version they were receiving. Now we don't even have that. As if XML weren't already confusing enough for people who don't spend 60 hours a week thinking about this stuff. Now we have to explain that the well-formedness of a document depends on which version of which parser is being used, and which edition of XML the parser implements, and no, there's nothing in the document to tell you which version you should be using. More...
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">And over the shark we go.  Good riddance.</content><author gr:user-id="14627107182419169041" gr:profile-id="108735516876641390122"><name>Paul R Brown</name></author></gr:annotation><source gr:stream-id="user/14627107182419169041/source/com.google/link"><id>tag:google.com,2005:reader/user/14627107182419169041/source/com.google/link</id><title type="html">Cafe con Leche XML News and Resources</title><link rel="alternate" href="http://www.cafeconleche.org/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1229023021817"><id gr:original-id="">tag:google.com,2005:reader/item/f8c833e945f919e2</id><title type="html">Dependency injection with Guice</title><published>2008-12-11T19:17:01Z</published><updated>2008-12-11T19:17:01Z</updated><link rel="alternate" href="http://www.ibm.com/developerworks/library/j-guice.html" type="text/html" /><link rel="related" href="http://www.ibm.com/" title="www.ibm.com" /><content xml:base="http://www.ibm.com/developerworks/library/j-guice.html" type="html">&lt;blockquote&gt;Shared by  crazybob 
&lt;br&gt;
Nick Lesiecki on Guice&lt;/blockquote&gt;
Guice is Google's open source dependency injection framework for Java development. It enables better testing and modularity by taking away the pain of writing your own factories. Nicholas Lesiecki offers a tour of the most important Guice concepts that will leave you ready to Guice up your applications.
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Nick Lesiecki on Guice</content><author gr:user-id="07248529942124281245" gr:profile-id="114815478402472606661"><name>crazybob</name></author></gr:annotation><source gr:stream-id="user/07248529942124281245/source/com.google/link"><id>tag:google.com,2005:reader/user/07248529942124281245/source/com.google/link</id><title type="html">www.ibm.com</title><link rel="alternate" href="http://www.ibm.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1229017667984"><id gr:original-id="http://xkcd.com/511/">tag:google.com,2005:reader/item/b197840f679a86fd</id><title type="html">Sleet</title><published>2008-12-01T05:00:00Z</published><updated>2008-12-01T05:00:00Z</updated><link rel="alternate" href="http://xkcd.com/511/" type="text/html" /><summary xml:base="http://xkcd.com/" type="html">&lt;img src="http://imgs.xkcd.com/comics/sleet.png" title="I mean, I can barely hear myself complaining about Battlestar Galactica." alt="I mean, I can barely hear myself complaining about Battlestar Galactica."&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://xkcd.com/rss.xml"><id>tag:google.com,2005:reader/feed/http://xkcd.com/rss.xml</id><title type="html">xkcd.com</title><link rel="alternate" href="http://xkcd.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1228931393665"><id gr:original-id="http://www.css3.info/?p=317">tag:google.com,2005:reader/item/2acd6faa1d4a9ae9</id><title type="html">Meyer and Resig on CSS3</title><published>2008-12-10T10:01:17Z</published><updated>2008-12-10T10:01:17Z</updated><link rel="alternate" href="http://www.css3.info/meyer-and-resig-on-css3/" type="text/html" /><content xml:base="http://www.w3.org/Style/CSS/Planet/" xml:lang="en" type="html">&lt;p&gt;&lt;a href="http://sixrevisions.com/interviews/six-questions-eric-meyer-on-css3/"&gt;Six Revisions put six questions to the estimable Eric Meyer on the subject of CSS3&lt;/a&gt;, and we get some nice link love.&lt;/p&gt;
&lt;p&gt;Also (and I’m slightly late with this one) John Resig, creator of the &lt;a href="http://jquery.com/"&gt;jQuery library&lt;/a&gt;, &lt;a href="http://ejohn.org/blog/css3-template-layout/"&gt;runs an approving eye over the Advanced Layout Module&lt;/a&gt;. &lt;a href="http://www.webmonkey.com/blog/Someday_You_Will_Not_Hate_the_CSS3_Advanced_Layout"&gt;Webmonkey provide further context&lt;/a&gt;. We looked at the module back in 2006 (&lt;a href="http://www.css3.info/how-well-layout-websites-in-2016/"&gt;part one&lt;/a&gt;, &lt;a href="http://www.css3.info/how-well-lay-out-websites-in-2016-part-two/"&gt;part two&lt;/a&gt;), and my tongue-in-cheek prediction of a ten year wait to use it is now down to only eight years…&lt;/p&gt;</content><author><name>CSS3 . Info</name></author><source gr:stream-id="feed/http://www.w3.org/Style/CSS/Planet/atom.xml"><id>tag:google.com,2005:reader/feed/http://www.w3.org/Style/CSS/Planet/atom.xml</id><title type="html">The Future of Style - W3C</title><link rel="alternate" href="http://www.w3.org/Style/CSS/Planet/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1227636816181"><id gr:original-id="">tag:google.com,2005:reader/item/daceeeb840f97a8e</id><title type="html">Extreme Kite Snowboarding</title><published>2008-11-25T18:13:36Z</published><updated>2008-11-25T18:13:36Z</updated><link rel="alternate" href="http://www.cynical-c.com/?p=12351" type="text/html" /><link rel="related" href="http://www.cynical-c.com" title="Cynical-C Blog" /><content xml:base="http://www.cynical-c.com/?p=12351" type="html">&lt;blockquote&gt;Shared by  dshaw 
&lt;br&gt;
Oh man, that looks sketchy and scary.&lt;/blockquote&gt;
&lt;p&gt;&lt;embed src="http://www.youtube.com/v/-RVuXjf_PJo&amp;amp;hl=en&amp;amp;fs=1" allowScriptAccess="never" allowFullScreen="true" height="344" width="425" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;
	&lt;br&gt;&lt;a href="http://www.pheedo.com/click.phdo?feedUrl=http%3A//www.cynical-c.com/wordpress/wp-rdf.php&amp;amp;itemLink=http%3A%2F%2Fwww.cynical-c.com%2F%3Fp%3D12351&amp;amp;itemDate=2008-11-24+12%3A16%3A15&amp;amp;itemTitle=Extreme+Kite+Snowboarding"&gt;&lt;img src="http://www.pheedo.com/img.phdo?feedUrl=http%3A//www.cynical-c.com/wordpress/wp-rdf.php&amp;amp;itemLink=http%3A%2F%2Fwww.cynical-c.com%2F%3Fp%3D12351&amp;amp;itemDate=2008-11-24+12%3A16%3A15&amp;amp;itemTitle=Extreme+Kite+Snowboarding" border="0"&gt;&lt;/a&gt;
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Oh man, that looks sketchy and scary.</content><author gr:user-id="06920941852763310482" gr:profile-id="100235426753535268123"><name>dshaw</name></author></gr:annotation><source gr:stream-id="user/06920941852763310482/source/com.google/link"><id>tag:google.com,2005:reader/user/06920941852763310482/source/com.google/link</id><title type="html">Cynical-C Blog</title><link rel="alternate" href="http://www.cynical-c.com" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1227636637705"><id gr:original-id="tag:blogger.com,1999:blog-4195135246107166251.post-6281754507367507717">tag:google.com,2005:reader/item/77b2f05000d251bc</id><category term="book review" scheme="http://www.blogger.com/atom/ns#" /><category term="programming languages" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Scala?</title><published>2008-11-21T17:53:00Z</published><updated>2008-11-21T19:28:28Z</updated><link rel="alternate" href="http://neopythonic.blogspot.com/2008/11/scala.html" type="text/html" /><content xml:base="http://neopythonic.blogspot.com/" type="html">I received a free copy of the &lt;a href="http://www.artima.com/shop/programming_in_scala"&gt;Scala eBook&lt;/a&gt; &lt;span&gt;by Martin Odersky, Lex Spoon, and Bill Venners&lt;/span&gt;. I tried to read it on my &lt;a href="http://www.caltrain.com/"&gt;CalTrain&lt;/a&gt; commute, but ended up only skimming -- at 700+ pages it's a hefty tome. I'm also not in the primary target audience, as its focus seems to bounce between trying to entice Java programmers to try a better language, and an introduction to programming that happens to use Scala. I ended up going to the &lt;a href="http://www.scala-lang.org/"&gt;Scala website&lt;/a&gt; where I downloaded various other documents, such as a &lt;a href="http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaTutorial.pdf"&gt;tutorial&lt;/a&gt;, a more technical &lt;a href="http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaOverview.pdf"&gt;overview paper&lt;/a&gt;, and the &lt;a href="http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf"&gt;language reference&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Sad to say, I'm quite disappointed (in the language -- can't really say much about the quality of the eBook except that it's as big as the language). One of the first times I heard Scala mentioned it was a &lt;a href="http://sites.google.com/site/io/server-side-javascript-on-the-java-virtual-machine"&gt;talk&lt;/a&gt; by &lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge&lt;/a&gt; at &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt; last May. Steve characterized Scala as "static typic's revenge" (I'm paraphrasing -- too lazy to watch the video to find that section) and went on to make fun of the incredible complexity of Scala's type system, which contains such esoteric concepts as type erasures, variance annotations, existential types, polymorphic method types, and many more (just scan the ToC of the language reference).&lt;br&gt;&lt;br&gt;I have to agree with Steve -- if this is what it takes to have compile-time type-safety in a language, I'll take dynamic typing any day. There's got to be a better way -- perhaps &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;? Haskell is a pure functional language with a fast implementation that seems to have solved the I/O problem of functional languages well -- while its &lt;a href="http://www.haskell.org/haskellwiki/Monad"&gt;Monads&lt;/a&gt; are truly deep and take real work to create, their &lt;span style="font-style:italic"&gt;use&lt;/span&gt; seems quite straightforeward.&lt;br&gt;&lt;br&gt;Perhaps my biggest disappointment in Scala is that they have so many rules to make it possible to write code that &lt;span style="font-style:italic"&gt;looks&lt;/span&gt; straightforward, while being anything but -- these rules all seem to have innumerable exceptions, making it hard to know when writing simple code will work and when not. For example, the Scala book explains that you can use multiple 'if' qualifiers in its for-statement, but points out that you have to insert a semicolon in a position where you'd expect it to be inferred by the parser. To make matters even more mysterious, if you were to use curly braces instead of parentheses, you can omit the semicolon. All this is presented without any explanation. I found the explanation by combining two seemingly unrelated rules in the reference manual: first, the for-statement (technically called &lt;span style="font-style:italic"&gt;for-comprehension&lt;/span&gt;) allows both braces or parentheses with exactly the same semantics, but the rules for inferring semicolons are different inside braces than they are inside parentheses. Obvious, eh! :-)&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/4195135246107166251-6281754507367507717?l=neopythonic.blogspot.com"&gt;&lt;/div&gt;</content><author><name>Guido van Rossum</name></author><source gr:stream-id="feed/http://neopythonic.blogspot.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://neopythonic.blogspot.com/feeds/posts/default</id><title type="html">Neopythonic</title><link rel="alternate" href="http://neopythonic.blogspot.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1226610644732"><id gr:original-id="http://blogs.jetbrains.com/idea/?p=223">tag:google.com,2005:reader/item/0578d7d3248aaa7c</id><category term="Tips &amp; Tricks" scheme="http://blogs.jetbrains.com/idea" /><title type="html">IntelliJ IDEA 8 Refactorings: Introduce Parameter Object</title><published>2008-11-12T14:31:02Z</published><updated>2008-11-12T14:34:19Z</updated><link rel="alternate" href="http://blogs.jetbrains.com/idea/2008/11/intellij-idea-8-refactorings-introduce-parameter-object/" type="text/html" /><content xml:base="http://blogs.jetbrains.com/idea/2008/11/intellij-idea-8-refactorings-introduce-parameter-object/" xml:lang="en" type="html">&lt;p&gt;As you might already have noticed from the &lt;a href="http://www.jetbrains.com/idea/features/index.html"&gt;Features list&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/idea/download/index.html"&gt;IntelliJ IDEA&lt;/a&gt; 8 brings you 7 new refactorings to ease the daily coding routine. One of these refactorings is Introduce Parameter Object. Its name speaks for itself: when you have a large group of parameters which go a long way through a chain of delegating method calls, it lets you create a wrapper class that you can then use instead. Another case is when you have a group of method parameters semantically tied one to another â€“ a wrapper class comes handy as well.&lt;br&gt;&lt;br&gt;Letâ€™s have a look at an example. Say, we have this code:&lt;br&gt;&lt;a href="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/before.gif"&gt;&lt;img src="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/before.gif" alt="drawEdge class before refactoring" title="code example"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Look at how many parameters are passed to &lt;em&gt;drawEdge&lt;/em&gt; method â€“ six! Imagine how lengthy the calls to this method are and how it all swamps the code. No worries â€“ IntelliJ IDEA can help us. As we can see, the &lt;em&gt;X&lt;/em&gt; and &lt;em&gt;Y&lt;/em&gt; coordinates and the &lt;em&gt;edgeWidth&lt;/em&gt; naturally go together, so we can move them to their own object.&lt;br&gt;&lt;br&gt;Right-click the method name and select &lt;strong&gt;Refactor | Introduce Parameter Object&lt;/strong&gt; from the context menu.In the Introduce Parameter Object dialog, we can select whether we want to create a new class, inner class, or use an existing one to wrap the parameters. For this case, we opt to the first choice. Then, select the parameters to be extracted. As we decided, these are &lt;em&gt;edgeWidth&lt;/em&gt;, &lt;em&gt;x1&lt;/em&gt;, &lt;em&gt;x2&lt;/em&gt;, &lt;em&gt;y1&lt;/em&gt;, and &lt;em&gt;y2&lt;/em&gt;. Click &lt;strong&gt;OK&lt;/strong&gt;, and voila â€“ the things are a lot easier now!&lt;br&gt;&lt;br&gt;&lt;a href="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/after-1.gif"&gt;&lt;img src="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/after-1.gif" alt="drawEdge class after refactoring" title="after-1"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/after-2.gif"&gt;&lt;img src="http://blogs.jetbrains.com/idea/wp-content/uploads/2008/11/after-2.gif" alt="new Parameter Object" title="after-2"&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name>Maria Khalusova</name></author><source gr:stream-id="feed/http://blogs.jetbrains.com/idea/wp-atom.php"><id>tag:google.com,2005:reader/feed/http://blogs.jetbrains.com/idea/wp-atom.php</id><title type="html">JetBrains IntelliJ IDEA Blog</title><link rel="alternate" href="http://blogs.jetbrains.com/idea" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1226610360047"><id gr:original-id="">tag:google.com,2005:reader/item/923a08b6022be637</id><title type="html">Skiers now have an application they can use during runs</title><published>2008-11-13T21:06:00Z</published><updated>2008-11-13T21:06:00Z</updated><link rel="alternate" href="http://feeds.feedburner.com/~r/MYiPhone/~3/451076283/skiers-now-have-an-application-they-can-use-during-jumps-125150.php" type="text/html" /><link rel="related" href="http://www.iphonebuzz.com" title="iPhone Buzz" /><content xml:base="http://feeds.feedburner.com/~r/MYiPhone/~3/451076283/skiers-now-have-an-application-they-can-use-during-jumps-125150.php" type="html">&lt;blockquote&gt;Shared by  dshaw 
&lt;br&gt;
This is awesome!&lt;/blockquote&gt;
&lt;p&gt;Lately it seems like the iPhone is getting a lot of sports related applications. The latest by DropZone, HangTimer, has been launched in the App Store for both the iPhone and iPod Touch. As you might have guessed by the title, this application was created for skiers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-5.jpg"&gt;&lt;img src="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-5.jpg" alt="" height="386" width="258"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HangTimer utilizes both the built in accelerometer and technology used by NASA to determine the split second that you become airborne. This application records your airtime and top ten jumps. HangTimer will even automatically detect your ski resort from anywhere in the world and automatically download the area’s snow reports, lift stats and trail maps. HangTimer also accesses webcams in select resorts.&lt;/p&gt;
&lt;p&gt;For iPhone 3G users, HangTimer has a bonus feature that utilizes the built in GPS to find and plot your exact location using Google Maps. Using the GPS you can also display your speed as you cruise along as well as how fast you are going. You can download HangTimer in the App Store today for only $9.99.&lt;/p&gt;

&lt;a href="http://www.iphonebuzz.com/skiers-now-have-an-application-they-can-use-during-jumps-125150.php/itunes-5" title="itunes-5"&gt;&lt;img src="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-5-150x150.jpg" alt="" height="150" width="150"&gt;&lt;/a&gt;
&lt;a href="http://www.iphonebuzz.com/skiers-now-have-an-application-they-can-use-during-jumps-125150.php/itunes-6" title="itunes-6"&gt;&lt;img src="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-6-150x150.jpg" alt="" height="150" width="150"&gt;&lt;/a&gt;
&lt;a href="http://www.iphonebuzz.com/skiers-now-have-an-application-they-can-use-during-jumps-125150.php/itunes-7" title="itunes-7"&gt;&lt;img src="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-7-150x150.jpg" alt="" height="150" width="150"&gt;&lt;/a&gt;
&lt;a href="http://www.iphonebuzz.com/skiers-now-have-an-application-they-can-use-during-jumps-125150.php/itunes-8" title="itunes-8"&gt;&lt;img src="http://www.iphonebuzz.com/wp-content/uploads/2008/11/itunes-8-150x150.jpg" alt="" height="150" width="150"&gt;&lt;/a&gt;

&lt;img src="http://feeds.feedburner.com/%7Er/MYiPhone/%7E4/451076283" height="1" width="1"&gt;
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">This is awesome!</content><author gr:user-id="06920941852763310482" gr:profile-id="100235426753535268123"><name>dshaw</name></author></gr:annotation><source gr:stream-id="user/06920941852763310482/source/com.google/link"><id>tag:google.com,2005:reader/user/06920941852763310482/source/com.google/link</id><title type="html">iPhone Buzz</title><link rel="alternate" href="http://www.iphonebuzz.com" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1226597304388"><id gr:original-id="http://www.kottke.org/08/11/pixars-burne">tag:google.com,2005:reader/item/98af5779393ea60b</id><title type="html">Pixar's Burn-E</title><published>2008-11-13T14:50:02Z</published><updated>2008-11-13T14:50:02Z</updated><link rel="alternate" href="http://www.kottke.org/08/11/pixars-burne" type="text/html" /><summary xml:base="http://www.kottke.org/" type="html">&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=XoTT4WBZ-30&amp;amp;fmt=18"&gt;Pixar presents the adventures of Burn-E&lt;/a&gt;, a robot contemporary of Wall-E.&lt;/p&gt;

&lt;p&gt;&lt;embed src="http://www.youtube.com/v/XoTT4WBZ-30&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18" allowScriptAccess="never" allowFullScreen="true" width="500" height="405" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;

&lt;p&gt;The events in Burn-E's short film take place concurrent with those in the feature film.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; YouTube just took the video down at Pixar's request. If you missed it, &lt;a href="http://www.dailymotion.com/swf/k1uCDheC6Itc4PQ1V4&amp;amp;related=1&amp;amp;canvas=medium"&gt;check it out here&lt;/a&gt;. (thx, &lt;a href="http://www.pinguinorodriguez.cl/"&gt;jose&lt;/a&gt;)&lt;/p&gt; (&lt;a href="http://www.kottke.org/08/11/pixars-burne"&gt;link&lt;/a&gt;)</summary><author><name>jason@kottke.org</name></author><source gr:stream-id="feed/http://feeds.kottke.org/main"><id>tag:google.com,2005:reader/feed/http://feeds.kottke.org/main</id><title type="html">kottke.org</title><link rel="alternate" href="http://www.kottke.org/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1225989274561"><id gr:original-id="http://www.codecommit.com/blog/scala/scala-as-a-scripting-language">tag:google.com,2005:reader/item/14a31696878f48dc</id><category term="Scala" /><title type="html">Scala as a Scripting Language?</title><published>2008-11-03T08:00:31Z</published><updated>2008-11-03T08:00:31Z</updated><link rel="alternate" href="http://feeds.codecommit.com/~r/codecommit/~3/440734280/scala-as-a-scripting-language" type="text/html" /><content xml:base="http://www.codecommit.com/blog" type="html">&lt;p&gt;I know, the title seems a bit…bizarre.  I don’t know about you, but when I think of Scala, I think of many of the same uses to which I apply Java.   Scala is firmly entrenched in my mind as a static, &lt;a href="http://www.codecommit.com/blog/java/defining-high-mid-and-low-level-languages"&gt;mid-level language&lt;/a&gt; highly applicable to things like large-scale applications and non-trivial architectures, but less so for tasks like file processing and system maintenance.   However, as I have been discovering, Scala is also &lt;i&gt;extremely&lt;/i&gt; well suited to basic scripting tasks, things that I would normally solve in a dynamic language like Ruby.&lt;/p&gt;
&lt;p&gt;One particular task which I came across quite recently was the parsing of language files into  &lt;a href="http://www.codecommit.com/blog/scala/bloom-filters-in-scala"&gt;bloom filters&lt;/a&gt;, which were then stored on disk.  To me, this sounds like a perfect application for a scripting language.  It’s fairly simple, self-contained, involves a moderate degree of file processing, and should be designed, coded and then discarded as quickly as possible.   Dynamic languages have a tendency to produce working designs much faster than static ones, and given the fact that the use-case required access to a library written in Scala, JRuby seemed like the obvious choice (Groovy would have been a fine choice as well, but I’m more familiar with Ruby).  The result looked something like this:&lt;/p&gt;

&lt;div&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span style="color:#009966;font-weight:bold"&gt;require&lt;/span&gt; &lt;span style="color:#ff00cc"&gt;'scala'&lt;/span&gt;
 
import com.&lt;span&gt;codecommit&lt;/span&gt;.&lt;span&gt;collection&lt;/span&gt;.&lt;span&gt;BloomSet&lt;/span&gt;
 
import java.&lt;span&gt;io&lt;/span&gt;.&lt;span&gt;BufferedOutputStream&lt;/span&gt;
import java.&lt;span&gt;io&lt;/span&gt;.&lt;span&gt;FileOutputStream&lt;/span&gt;
 
WIDTH = &lt;span style="color:#ff0000"&gt;2000000&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;def&lt;/span&gt; compute_k&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;lines, width&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
  &lt;span style="color:#cc0000"&gt;# ...&lt;/span&gt;
&lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;def&lt;/span&gt; compute_m&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;lines&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
  &lt;span style="color:#cc0000"&gt;#...&lt;/span&gt;
&lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
 
Dir.&lt;span&gt;foreach&lt;/span&gt; &lt;span style="color:#ff00cc"&gt;'wordlists'&lt;/span&gt; &lt;span style="color:#006699;font-weight:bold"&gt;do&lt;/span&gt; |fname|
  &lt;span style="color:#006699;font-weight:bold"&gt;unless&lt;/span&gt; File.&lt;span&gt;directory&lt;/span&gt;? fname
    count = &lt;span style="color:#ff0000"&gt;0&lt;/span&gt;
    File.&lt;span&gt;new&lt;/span&gt; &lt;span style="color:#ff00cc"&gt;&amp;quot;wordlists/#{fname}&amp;quot;&lt;/span&gt; &lt;span style="color:#006699;font-weight:bold"&gt;do&lt;/span&gt; |file|
      file.&lt;span&gt;each&lt;/span&gt; &lt;span style="font-weight:bold"&gt;{&lt;/span&gt; |line| count += &lt;span style="color:#ff0000"&gt;1&lt;/span&gt; &lt;span style="font-weight:bold"&gt;}&lt;/span&gt;
    &lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
 
    optimal_m = compute_m&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;count&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    optimal_k = compute_k&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;count, WIDTH&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
 
    set = BloomSet.&lt;span&gt;new&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;optimal_m, optimal_k&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
 
    File.&lt;span&gt;new&lt;/span&gt; &lt;span style="color:#ff00cc"&gt;&amp;quot;wordlists/#{fname}&amp;quot;&lt;/span&gt; &lt;span style="color:#006699;font-weight:bold"&gt;do&lt;/span&gt; |fname|
      file.&lt;span&gt;each&lt;/span&gt; &lt;span style="color:#006699;font-weight:bold"&gt;do&lt;/span&gt; |line|
        set += line.&lt;span&gt;strip&lt;/span&gt;
      &lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
    &lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
 
    os = BufferedOutputStream.&lt;span&gt;new&lt;/span&gt; FileOutputStream.&lt;span&gt;new&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#ff00cc"&gt;&amp;quot;gen/#{fname}&amp;quot;&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    set.&lt;span&gt;store&lt;/span&gt; os
    os.&lt;span&gt;close&lt;/span&gt;
  &lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#006699;font-weight:bold"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As far as scripts go, this one isn’t too bad.  I’ve written some real whoppers for things like video encoding and incremental backups.  The main trick here is the fact that we need to make two separate passes over the same file in order to get the number of lines before constructing the set.  We &lt;i&gt;could&lt;/i&gt; load the file into an array buffer in a single pass, count its length and then iterate over the array, placing each element in the bloom filter.   However, this really wouldn’t be too much faster than just hitting the file twice (we still need two separate passes) and it has the additional drawback of requiring a fair amount of memory.&lt;/p&gt;
&lt;p&gt;All in all, this script is a fairly natural representation of my requirements.   I needed to loop over a number of word lists, push the results into separate bloom filters and then freeze-dry the state.  However, look at what we’ve actually done here.  Remember earlier where we were considering which language to use?  We wanted a language which could concisely and quickly express our intent.  For that decision making process, we just &lt;i&gt;assumed&lt;/i&gt; that a dynamic language would suffice better than one hampered by a static type system.  However, at no point in the above script do we actually do anything &lt;i&gt;truely&lt;/i&gt; dynamic.  By that I mean: open classes, unfixed parameter types, &lt;code&gt;method_missing&lt;/code&gt;, that sort of thing.   In fact, we haven’t really done anything that we couldn’t do in Scala:&lt;/p&gt;

&lt;div&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span style="color:#006699;font-weight:bold"&gt;import&lt;/span&gt; com.&lt;span&gt;codecommit&lt;/span&gt;.&lt;span&gt;collection&lt;/span&gt;.&lt;span&gt;BloomSet&lt;/span&gt;
&lt;span style="color:#006699;font-weight:bold"&gt;import&lt;/span&gt; java.&lt;span&gt;io&lt;/span&gt;.&lt;span style="font-weight:bold"&gt;{&lt;/span&gt;BufferedOutputStream, File, FileOutputStream&lt;span style="font-weight:bold"&gt;}&lt;/span&gt;
&lt;span style="color:#006699;font-weight:bold"&gt;import&lt;/span&gt; scala.&lt;span&gt;io&lt;/span&gt;.&lt;span&gt;Source&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; WIDTH = &lt;span style="color:#ff0000"&gt;2000000&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#9966ff"&gt;computeK&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;lines: &lt;span style="color:#009966;font-weight:bold"&gt;Int&lt;/span&gt;, width: &lt;span style="color:#009966;font-weight:bold"&gt;Int&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; = &lt;span style="color:#cc0000"&gt;// ...&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#9966ff"&gt;computeM&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;lines: &lt;span style="color:#009966;font-weight:bold"&gt;Double&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; = &lt;span style="color:#cc0000"&gt;// ...&lt;/span&gt;
 
&lt;span style="color:#006699;font-weight:bold"&gt;for&lt;/span&gt; &lt;span style="font-weight:bold"&gt;(&lt;/span&gt;file &amp;lt;- &lt;span style="color:#006699;font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#9966ff"&gt;File&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#ff00cc"&gt;&amp;quot;wordlists&amp;quot;&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;.&lt;span&gt;listFiles&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="font-weight:bold"&gt;{&lt;/span&gt;
  &lt;span style="color:#006699;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="font-weight:bold"&gt;(&lt;/span&gt;!file.&lt;span&gt;isDirectory&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="font-weight:bold"&gt;{&lt;/span&gt;
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; src = Source.&lt;span style="color:#9966ff"&gt;fromFile&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;file&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; count = src.&lt;span&gt;getLines&lt;/span&gt;.&lt;span style="color:#9966ff"&gt;foldLeft&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000"&gt;0&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="font-weight:bold"&gt;{&lt;/span&gt; &lt;span style="font-weight:bold"&gt;(&lt;/span&gt;i, line&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; =&amp;gt; i + &lt;span style="color:#ff0000"&gt;1&lt;/span&gt; &lt;span style="font-weight:bold"&gt;}&lt;/span&gt;
 
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; optimalM = &lt;span style="color:#9966ff"&gt;computeM&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;count&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; optimalK = &lt;span style="color:#9966ff"&gt;computeK&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;count, optimalM&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
 
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; init = &lt;span style="color:#006699;font-weight:bold"&gt;new&lt;/span&gt; BloomSet&lt;span style="color:#9900cc"&gt;&lt;span style="font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#0099ff;font-weight:bold"&gt;String&lt;/span&gt;&lt;span style="font-weight:bold"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;optimalM, optimalK&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
 
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; set = src.&lt;span&gt;reset&lt;/span&gt;.&lt;span&gt;getLines&lt;/span&gt;.&lt;span style="color:#9966ff"&gt;foldLeft&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;init&lt;span style="font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="font-weight:bold"&gt;{&lt;/span&gt; _ + _.&lt;span&gt;trim&lt;/span&gt; &lt;span style="font-weight:bold"&gt;}&lt;/span&gt;
 
    &lt;span style="color:#006699;font-weight:bold"&gt;val&lt;/span&gt; os = &lt;span style="color:#006699;font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#9966ff"&gt;BufferedOutputStream&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#006699;font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#9966ff"&gt;FileOutputStream&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#ff00cc"&gt;&amp;quot;gen/&amp;quot;&lt;/span&gt; + file.&lt;span&gt;getName&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    set.&lt;span style="color:#9966ff"&gt;store&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;os&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
    os.&lt;span style="color:#9966ff"&gt;close&lt;/span&gt;&lt;span style="font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="font-weight:bold"&gt;)&lt;/span&gt;
  &lt;span style="font-weight:bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight:bold"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is actually runnable Scala.  I’m not omitting boiler-plate or cheating in any similar respect.  If you copy this code into a &lt;code&gt;.scala&lt;/code&gt; file and make sure that &lt;code&gt;BloomSet&lt;/code&gt; is on your CLASSPATH (which you would have needed anyway for JRuby), you would be able to run the script &lt;i&gt;uncompiled&lt;/i&gt; using the &lt;code&gt;scala&lt;/code&gt; command.  Unlike Java, Scala actually includes an “interpreter” which can parse raw Scala sources and execute the representative program just as if it had been pre-compiled using &lt;code&gt;scalac&lt;/code&gt;.   One of the perquisites of this approach is the ability to simply omit any &lt;code&gt;main&lt;/code&gt; method or &lt;code&gt;Application&lt;/code&gt; class.  In nearly every sense of the word, Scala is a scripting language…as well as an enterprise-ready Java-killer (let the flames begin).&lt;/p&gt;
&lt;p&gt;Now that we’re fairly convinced that the above &lt;i&gt;is&lt;/i&gt; valid Scala, let’s compare it with the original version of the script written using JRuby.  If we just go off LoC (Lines of Code), Scala actually wins here.  This was a more-than-slightly surprising discovery for me, given how often dynamic languages (and Ruby in particular) are touted as being more concise and expressive than static languages.  But of course, sheer LoC-brevity isn’t everything: we also should consider things like readability.  A few characters of &lt;a href="http://esolangs.org/wiki/Befunge"&gt;Befunge&lt;/a&gt; can accomplish more than I can do in several lines of Scala, but that doesn’t mean I’ll be able to figure out what it means tomorrow morning.&lt;/p&gt;
&lt;p&gt;On the readability score, I think Scala wins here too.  The file processing and set creation is all done in a highly functional style (using &lt;code&gt;foldLeft&lt;/code&gt;).   At least to my eyes, this is a lot easier to follow than the imperative form in Ruby.  More importantly, I think it’s a bit harder to make silly mistakes.  When I wrote the Ruby version of the script, it took several tries before I solidly pinned down the exact incantation I was seeking.  The Scala version literally required only one revision after the initial prototype.   Granted, I had the Ruby version to go off of, but I think we would all agree that the scripts use some fairly different libraries and methodologies for accomplishing identical tasks.&lt;/p&gt;
&lt;p&gt;So what is it that makes Scala so surprisingly well suited to the task of quick-and-dirty file processing and scripting?  After all, isn’t is just a fancy syntax wrapping around the plain-old-Java standard library?  While it is true that Scala has first-class access to Java libraries (as demonstrated in the script), that isn’t all that it offers.  I believe that Scala has two important features which make it so suitable for these tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type inference&lt;/li&gt;
&lt;li&gt;Powerful core libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first feature is of course evident wherever you look in the script.  With the exception of the two methods and the &lt;code&gt;BloomSet&lt;/code&gt; constructor, we never actually declare a type anywhere in the script.  This gives the whole thing a very “dynamic feel” without actually sacrificing static type safety.   The first time you try this sort of language feature it is an almost euphoric experience (especially coming from highly-verbose languages like Java).&lt;/p&gt;
&lt;p&gt;The second feature is a bit harder to see.  It is most evident in the way in which we handle file IO.  The directory listing is of course yet another application of the venerable &lt;code&gt;java.io.File&lt;/code&gt; class, but the process of opening and reading the file line-by-line seems to be a lot easier than anything Java can muster.  This is made possible by Scala’s &lt;code&gt;Source&lt;/code&gt; API.   Rather than fiddling with &lt;code&gt;BufferedReader&lt;/code&gt; and the whole menagerie that goes along with it, we just get a new &lt;code&gt;Source&lt;/code&gt; from a &lt;code&gt;File&lt;/code&gt; instance and then use conventional Scala methods to &lt;i&gt;iterate&lt;/i&gt; over its contents.  In fact, we’re actually applying a functional idiom (fold) rather than a standard imperative iteration.  Finally, when we’re done with our first pass, we don’t need to re-open the file from scratch (inviting initialization mistakes in our coding), we just &lt;code&gt;reset&lt;/code&gt; the &lt;code&gt;Source&lt;/code&gt; and start from the beginning once more.&lt;/p&gt;
&lt;p&gt;Using Scala as a scripting language comes with some pretty hefty benefits.   For one thing, you get immediate and idiomatic access to the mighty wealth of libraries which exist in Java.  Even for scripting, this sort of interoperability is invaluable.  JRuby does provide some excellent Java interop, but it simply can’t compare to what you get with Scala.  Further, Scala has a static type system to check you (at runtime with a script) to ensure that you haven’t done anything obviously bone-headed.  This too is nothing to sniff at.&lt;/p&gt;
&lt;p&gt;Given the fact that Scala’s “scripting syntax” is just as concise as Ruby’s (sometimes more), it’s hard to see a reason &lt;i&gt;not&lt;/i&gt; to employ it for around-the-server tasks.  Amusingly, the most compelling reason not to use Scala for scripting just might be its comment syntax.  Not having direct support for the magic “hash bang” (&lt;code&gt;#!&lt;/code&gt;) incantation to define a file interpreter just means that Scala scripts have to go through some extra steps to be directly executable.  However, if immediately-executable scripts aren’t an issue, you may want to consider Scala as your scripting language of choice for your next non-trivial outing.  You may reap the rewards in ways you weren’t even expecting.&lt;/p&gt;
&lt;img src="http://feeds.codecommit.com/~r/codecommit/~4/440734280" height="1" width="1"&gt;</content><author><name>Daniel Spiewak</name></author><source gr:stream-id="feed/http://feeds.codecommit.com/codecommit"><id>tag:google.com,2005:reader/feed/http://feeds.codecommit.com/codecommit</id><title type="html">Code Commit</title><link rel="alternate" href="http://www.codecommit.com/blog" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1225207393019"><id gr:original-id="http://ejohn.org/blog/adv-javascript-and-processingjs/">tag:google.com,2005:reader/item/9036256eded595bf</id><category term="jquery" /><category term="javascript" /><category term="processing" /><category term="canvas" /><title type="html">Adv. JavaScript and Processing.js</title><published>2008-09-22T18:53:14Z</published><updated>2008-09-22T18:53:14Z</updated><link rel="alternate" href="http://ejohn.org/blog/adv-javascript-and-processingjs/" type="text/html" /><content xml:base="http://ejohn.org/" type="html">&lt;p&gt;Recently I gave two talks at the Web 2.0 Expo in New York City and one for the Boston IxDA.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Learning Advanced JavaScript&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;An advanced talk on the JavaScript language. Explored functions, closures, function prototypes, and inheritance. The entire presentation was given using an &lt;a href="http://ejohn.org/apps/learn/"&gt;interactive site/presentation&lt;/a&gt; (tested in Firefox and Safari).&lt;/p&gt;
	&lt;p&gt;&lt;center&gt;&lt;a href="http://ejohn.org/apps/learn/"&gt;&lt;img src="http://ejohn.org/files/learn.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
	&lt;p&gt;Feel free to browse through the presentation (I'm not sure how useful it will be without me talking about the particulars - but it may be nice).&lt;/p&gt;
	&lt;p&gt;There are a number of neat things that I like about the implementation of this talk:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;It's interactive. Each code slide is executable (the user can see the output right away). Additionally each slide is editable - just double-click the code to go into an edit mode.&lt;/li&gt;
	&lt;li&gt;Code editing is simple. Basic IDE functions (auto-indentation, proper tabbing, and backspace-to-delete-tab) are included. It's not a ton but it's enough to get started.&lt;/li&gt;
	&lt;li&gt;All code slides include syntax hilighting.&lt;/li&gt;
	&lt;li&gt;All slides are bookmarkable.&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;The presentation includes a number fill-in-the-blank quizzes to help test your knowledge of what you just learned. In practice I may save this for situations in which more people have laptops/computers at the talk.&lt;/p&gt;
	&lt;p&gt;You can download the full presentation as a &lt;a href="http://ejohn.org/files/learn.zip"&gt;zip file&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Building a Visualization Language&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;I gave a talk on my work with &lt;a href="http://ejohn.org/blog/processingjs/"&gt;Processing.js&lt;/a&gt;, together with covering how the Canvas element works and the Processing language itself.&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.slideshare.net/jeresig/building-a-visualization-language-presentation/"&gt;View on Slideshare&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/files/visual-js.pdf"&gt;Download PDF&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;During the talk I stepped through the construction of a visualization using Canvas:&lt;/p&gt;
	&lt;p&gt;&lt;center&gt;&lt;a href="http://ejohn.org/apps/spiral/canvas.html"&gt;&lt;img src="http://ejohn.org/files/spiral-sm.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/spiral/canvas.html"&gt;View Canvas/JavaScript Version&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/spiral/process.html"&gt;View Processing.js Version&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;&lt;b&gt;jQuery for the Boston IxDA&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;An introductory presentation explaining how jQuery works.&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.slideshare.net/jeresig/jquery-boston-ixda-presentation/"&gt;View on Slideshare&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/files/jquery-bostonixda.pdf"&gt;Download PDF&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/files/learn-jquery-code.zip"&gt;Demo Code&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;The meat of the presentation was a series of interactive slides which could be run and played with in order to better understand how jQuery works.&lt;/p&gt;
	&lt;p&gt;&lt;center&gt;&lt;a href="http://ejohn.org/apps/learn-jquery/"&gt;&lt;img src="http://ejohn.org/files/learn-jquery.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
	&lt;p&gt;You can download the runnable code as a &lt;a href="http://ejohn.org/files/learn-jquery.zip"&gt;zip file&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Upcoming&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;I'm going to be giving a number of talks this weekend at the jQuery Conference followed by The Ajax Experience, I'll be sure to post the slides and code from them, as well.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Bonus&lt;/b&gt;&lt;/p&gt;
	&lt;p&gt;Last week was the MIT Career Fair - I stopped by and worked the Mozilla booth with Boris, Brad, and Julie - a good time as usual:&lt;/p&gt;
	&lt;p&gt;&lt;center&gt;&lt;a href="http://www.flickr.com/photos/jeresig/2880085155/" title="Boris, Brad, and John at the MIT Career Fair by John Resig, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3031/2880085155_1c631f393e_m.jpg" width="240" height="180" alt="Boris, Brad, and John at the MIT Career Fair"&gt;&lt;/a&gt;&lt;/center&gt;
&lt;/p&gt;
		&lt;img src="http://ejohn.org/apps/rss/?from=rss&amp;amp;id=5645" style="width:0px;height:0px"&gt;&lt;img src="http://feeds.feedburner.com/~r/JohnResig/~4/400258186" height="1" width="1"&gt;</content><author><name>John Resig</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/JohnResig"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/JohnResig</id><title type="html">John Resig</title><link rel="alternate" href="http://ejohn.org" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1225204481019"><id gr:original-id="tag:typepad.com,2003:post-57550937">tag:google.com,2005:reader/item/0b10fc9ef9e7109e</id><category term="Venture Capital and Technology" /><title type="html">Great Presentation From Saul Klein</title><published>2008-10-25T22:58:12Z</published><updated>2008-10-25T22:58:12Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/AVc/~3/UVTz90jF3kM/great-presentat.html" type="text/html" /><link rel="enclosure" href="http://feedproxy.google.com/~r/AVc/~5/tmk2kNBjT30/ssplayer2.swf" type="application/x-shockwave-flash" length="53164" /><media:group><media:content url="http://feedproxy.google.com/~r/AVc/~5/tmk2kNBjT30/ssplayer2.swf" /></media:group><content xml:base="http://www.avc.com/a_vc/" type="html">&lt;div style="width:425px;text-align:left"&gt;&lt;a href="http://www.slideshare.net/cape/thoughts-on-european-start-ups-presentation-678957?type=powerpoint" title="Thoughts on European Start Ups" style="margin:12px 0pt 3px;font-family:Helvetica,Arial,Sans-serif;font-style:normal;font-variant:normal;font-weight:normal;font-size:14px;line-height:normal;font-size-adjust:none;font-stretch:normal;display:block;text-decoration:underline"&gt;Thoughts on European Start Ups&lt;/a&gt;&lt;embed width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=web2berlin-211008-1224639939550362-8&amp;amp;stripped_title=thoughts-on-european-start-ups-presentation-678957" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px"&gt;View SlideShare &lt;a href="http://www.slideshare.net/cape/thoughts-on-european-start-ups-presentation-678957?type=powerpoint" title="View Thoughts on European Start Ups on SlideShare" style="text-decoration:underline"&gt;presentation&lt;/a&gt; or &lt;a href="http://www.slideshare.net/upload?type=powerpoint" style="text-decoration:underline"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a href="http://slideshare.net/tag/startups" style="text-decoration:underline"&gt;startups&lt;/a&gt; &lt;a href="http://slideshare.net/tag/vc" style="text-decoration:underline"&gt;vc&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks to &lt;a href="http://betaworks.com/post/55777496/wonderful-presentation-from-our-friend-saul-klein"&gt;Andy at Betaworks&lt;/a&gt; for showcasing it on their blog.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.googleadservices.com/~a/DXt5Rt-P4AuGgWFouSnvu9Xvqks/a"&gt;&lt;img src="http://feedads.googleadservices.com/~a/DXt5Rt-P4AuGgWFouSnvu9Xvqks/i" border="0" ismap&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feedproxy.google.com/~f/AVc?a=KVhbybJD"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?i=KVhbybJD" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=6Ogg3QZv"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?d=41" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=VBN7A66i"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?i=VBN7A66i" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=jW0LoB2t"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?i=jW0LoB2t" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=chmlQhUg"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?d=43" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=f7khvaWy"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?i=f7khvaWy" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=dQaTDCXp"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?d=415" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=cYDsdlTv"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?d=150" border="0"&gt;&lt;/a&gt; &lt;a href="http://feedproxy.google.com/~f/AVc?a=g4iQSjDa"&gt;&lt;img src="http://feedproxy.google.com/~f/AVc?d=45" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feedproxy.google.com/~r/AVc/~4/UVTz90jF3kM" height="1" width="1"&gt;</content><author><name>Fred</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/AVc"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/AVc</id><title type="html">A VC</title><link rel="alternate" href="http://www.avc.com/a_vc/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1225204152377"><id gr:original-id="http://www.mysqlperformanceblog.com/?p=511">tag:google.com,2005:reader/item/d8e62105caa4ce52</id><category term="replication" scheme="http://www.mysqlperformanceblog.com" /><category term="tips" scheme="http://www.mysqlperformanceblog.com" /><title type="html">Three ways to know when a MySQL slave is about to start lagging</title><published>2008-10-09T00:56:06Z</published><updated>2008-10-09T00:56:06Z</updated><link rel="alternate" href="http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/" type="text/html" /><content xml:base="http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/" xml:lang="en" type="html">&lt;p&gt;The trouble with slave lag is that you often can't see it coming.  Especially if the slave's load is pretty uniform, a slave that's at 90% of its capacity to keep up with the master can be indistinguishable from one that's at 5% of its capacity.&lt;/p&gt;
&lt;p&gt;So how can you tell when your slave is nearing its capacity to keep up with the master?  Here are three ways:&lt;/p&gt;
&lt;p&gt;One: watch for spikes of lag.  If you have Cacti (and these &lt;a href="http://code.google.com/p/mysql-cacti-templates/"&gt;Cacti templates for MySQL&lt;/a&gt;) you can see this in the graphs.  If the graphs start to get a little bumpy, you can assume that the iceberg is floating higher and higher in the water, so to speak.  (Hopefully that's not too strange a metaphor.)  As the slave's routine work gets closer and closer to its capacity, you'll see these spikes get bigger and "wider".  The front-side of the spike will always be less than a 45-degree angle in ordinary operation[1] but the back-side, when the slave is catching up after lagging behind, will become a gentler and gentler slope.&lt;/p&gt;
&lt;p&gt;Two: deliberately make a slave fall behind, then see how fast it can catch up.  This is sort of related to Method One.  The goal here is to explicitly see how steep the backside of that slope is.  If you stop a slave for an hour, then start it again and it catches up in one hour, it is running at 1/2 of its capacity.  (In case that's confusing: if you stop it at noon and restart it at 1:00, and it's caught up again at 2:00, it played all statements from 12:00 to 2:00 in 1 hour, so it went at 2x speed.)&lt;/p&gt;
&lt;p&gt;Three: measure it more scientifically.  Use &lt;a href="http://www.percona.com/percona-lab.html"&gt;our patched server&lt;/a&gt;, which gives you a USER_STATISTICS table.&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;a href="http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/#"&gt;PLAIN TEXT&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;SQL:&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;mysql&amp;gt; &lt;span style="color:#993333;font-weight:bold"&gt;SELECT&lt;/span&gt; * &lt;span style="color:#993333;font-weight:bold"&gt;FROM&lt;/span&gt; INFORMATION_SCHEMA.USER_STATISTICS &lt;span style="color:#993333;font-weight:bold"&gt;WHERE&lt;/span&gt; USER=&lt;span style="color:#ff0000"&gt;'#mysql_system#'&lt;/span&gt;\G&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;*************************** &lt;span style="color:#cc66cc;color:#800000"&gt;1&lt;/span&gt;. row ***************************&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;                  USER: &lt;span style="color:#808080;font-style:italic"&gt;#mysql_system#&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;     TOTAL_CONNECTIONS: &lt;span style="color:#cc66cc;color:#800000"&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;CONCURRENT_CONNECTIONS: &lt;span style="color:#cc66cc;color:#800000"&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;        CONNECTED_TIME: &lt;span style="color:#cc66cc;color:#800000"&gt;46188&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;             BUSY_TIME: &lt;span style="color:#cc66cc;color:#800000"&gt;719&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;          ROWS_FETCHED: &lt;span style="color:#cc66cc;color:#800000"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;          ROWS_UPDATED: &lt;span style="color:#cc66cc;color:#800000"&gt;1882292&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;       SELECT_COMMANDS: &lt;span style="color:#cc66cc;color:#800000"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;       UPDATE_COMMANDS: &lt;span style="color:#cc66cc;color:#800000"&gt;580431&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;        OTHER_COMMANDS: &lt;span style="color:#cc66cc;color:#800000"&gt;338857&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;color:black;font-weight:normal;font-style:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt;   COMMIT_TRANSACTIONS: &lt;span style="color:#cc66cc;color:#800000"&gt;1016571&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal"&gt; ROLLBACK_TRANSACTIONS: &lt;span style="color:#cc66cc;color:#800000"&gt;0&lt;/span&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can compare the BUSY_TIME to one-half the CONNECTED_TIME (because there are two replication threads on the slave) to see how much of the time the slave thread was actively processing statements.  If the slave threads are always running, you can just use the server's uptime instead.&lt;/p&gt;
&lt;p&gt;[1] There are cases where this isn't true, especially if you're monitoring Seconds_behind_master instead of using &lt;a href="http://www.maatkit.org/"&gt;mk-heartbeat&lt;/a&gt;, which is immune to this anomaly.&lt;/p&gt;
    &lt;hr noshade style="margin:0;height:1px"&gt;
    &lt;p&gt;Entry posted by Baron Schwartz |
      &lt;a href="http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/#comments"&gt;8 comments&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;Add to: &lt;a href="http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/&amp;amp;title=Three%20ways%20to%20know%20when%20a%20MySQL%20slave%20is%20about%20to%20start%20lagging" title="Bookmark this post on del.icio.us"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png" alt="delicious"&gt;&lt;/a&gt; | &lt;a href="http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/&amp;amp;title=Three%20ways%20to%20know%20when%20a%20MySQL%20slave%20is%20about%20to%20start%20lagging" title="Digg this post on Digg.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png" alt="digg"&gt;&lt;/a&gt; | &lt;a href="http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/&amp;amp;title=Three%20ways%20to%20know%20when%20a%20MySQL%20slave%20is%20about%20to%20start%20lagging" title="Submit this post on reddit.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png" alt="reddit"&gt;&lt;/a&gt; | &lt;a href="http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/&amp;amp;T=Three%20ways%20to%20know%20when%20a%20MySQL%20slave%20is%20about%20to%20start%20lagging" title="Vote for this article on Netscape"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif" alt="netscape"&gt;&lt;/a&gt; | &lt;a href="http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2008/10/08/three-ways-to-know-when-a-mysql-slave-is-about-to-start-lagging/&amp;amp;title=Three%20ways%20to%20know%20when%20a%20MySQL%20slave%20is%20about%20to%20start%20lagging" title="Add to Google Bookmarks"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png" alt="Google Bookmarks"&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name>Baron Schwartz</name></author><source gr:stream-id="feed/http://www.mysqlperformanceblog.com/feed/atom/"><id>tag:google.com,2005:reader/feed/http://www.mysqlperformanceblog.com/feed/atom/</id><title type="html">MySQL Performance Blog</title><link rel="alternate" href="http://www.mysqlperformanceblog.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1225204137066"><id gr:original-id="http://www.mysqlperformanceblog.com/?p=476">tag:google.com,2005:reader/item/e684f24a6b33ccf1</id><category term="community" scheme="http://www.mysqlperformanceblog.com" /><category term="pbxt" scheme="http://www.mysqlperformanceblog.com" /><category term="sphinx" scheme="http://www.mysqlperformanceblog.com" /><title type="html">Percona’s patches spread to a wider audience</title><published>2008-10-14T03:50:00Z</published><updated>2008-10-14T03:50:00Z</updated><link rel="alternate" href="http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/" type="text/html" /><content xml:base="http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/" xml:lang="en" type="html">&lt;p&gt;Percona's patches are now available to a wider audience via &lt;a href="http://ourdelta.org/"&gt;OurDelta&lt;/a&gt;, a community effort to provide  builds with features (&lt;a href="http://www.percona.com/percona-lab.html"&gt;Percona patches&lt;/a&gt;, &lt;a href="http://code.google.com/p/google-mysql-tools/"&gt;Google patches&lt;/a&gt;, etc) and storage engines (&lt;a href="http://www.primebase.org/"&gt;PBXT&lt;/a&gt;, &lt;a href="http://www.sphinxsearch.com/"&gt;Sphinx&lt;/a&gt;, etc) that aren't in the main MySQL server.  &lt;a href="http://arjen-lentz.livejournal.com/135346.html"&gt;Arjen Lentz is really the brainchild&lt;/a&gt; behind this.  Kudos Arjen!&lt;/p&gt;
&lt;p&gt;What does this mean for the Percona patches? Well, now you can get them in more places.  But it doesn't change our own commitment to keep innovating in ways our customers (and we ourselves) find useful.  We're still building our own builds and hosting the downloads from our own website; it's important that you can get a build that you know authoritatively came from us and was built by us.  The Percona patches and builds represent our best judgment about what's the state of the art in the MySQL server for real-world usage, and we have no plans to change that.&lt;/p&gt;
&lt;p&gt;The OurDelta project is a great way to get pre-built versions of the server with cutting-edge features like PBXT.  This should help lower the barriers to trying these things out.  The Percona builds and patches are conservative (except for the -highperf builds, which are experimental) and won't include such features, at least not for the foreseeable future.  We're really glad that others are adopting our patches and blending them with features our builds won't include.  OurDelta also has a build infrastructure behind it, which is quite a nice thing to have, and we expect that bug reports and patches may even flow "upstream" back to us.&lt;/p&gt;
&lt;p&gt;Of course the project is very new, and many changes will undoubtedly happen in the weeks and months to come.  But you have to start somewhere, and it's really nice to see such an initiative.&lt;/p&gt;
    &lt;hr noshade style="margin:0;height:1px"&gt;
    &lt;p&gt;Entry posted by Baron Schwartz |
      &lt;a href="http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/#comments"&gt;7 comments&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;Add to: &lt;a href="http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/&amp;amp;title=Percona%E2%80%99s%20patches%20spread%20to%20a%20wider%20audience" title="Bookmark this post on del.icio.us"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png" alt="delicious"&gt;&lt;/a&gt; | &lt;a href="http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/&amp;amp;title=Percona%E2%80%99s%20patches%20spread%20to%20a%20wider%20audience" title="Digg this post on Digg.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png" alt="digg"&gt;&lt;/a&gt; | &lt;a href="http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/&amp;amp;title=Percona%E2%80%99s%20patches%20spread%20to%20a%20wider%20audience" title="Submit this post on reddit.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png" alt="reddit"&gt;&lt;/a&gt; | &lt;a href="http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/&amp;amp;T=Percona%E2%80%99s%20patches%20spread%20to%20a%20wider%20audience" title="Vote for this article on Netscape"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif" alt="netscape"&gt;&lt;/a&gt; | &lt;a href="http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2008/10/13/perconas-patches-spread-to-a-wider-audience/&amp;amp;title=Percona%E2%80%99s%20patches%20spread%20to%20a%20wider%20audience" title="Add to Google Bookmarks"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png" alt="Google Bookmarks"&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name>Baron Schwartz</name></author><source gr:stream-id="feed/http://www.mysqlperformanceblog.com/feed/atom/"><id>tag:google.com,2005:reader/feed/http://www.mysqlperformanceblog.com/feed/atom/</id><title type="html">MySQL Performance Blog</title><link rel="alternate" href="http://www.mysqlperformanceblog.com/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1220417492888"><id gr:original-id="http://www.kottke.org/08/09/google-chrome-google-browser">tag:google.com,2005:reader/item/9a1f836ace8a11e8</id><title type="html">● Google Chrome, Google Browser</title><published>2008-09-02T01:58:15Z</published><updated>2008-09-02T01:58:15Z</updated><link rel="alternate" href="http://www.kottke.org/08/09/google-chrome-google-browser" type="text/html" /><summary xml:base="http://www.kottke.org/" type="html">&lt;p&gt;&lt;a href="http://webword.com/moving/googleclient.html"&gt;Google Browser, 2001&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;What if Google built something that was very much like a browser but was mainly used for searching for information. What if they built a tool that was focused on searching for answers to your questions first, and looking at web pages second. Wrap your head around that. You have search needs. You also have unique search patterns. You have ways of looking for information that are very interesting and personal. Where are the tools that help you search? You are probably thinking of search engines, like Google. But search engines are server based. Why not bring the power of the server to the desktop? There are some tools out there like this, but they aren't complete. They also don't have the usability and brand recognition of Google.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://dashes.com/anil/2003/07/upon-the-demise.html"&gt;Google Browser, 2003&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;So, a Google browser, based on Mozilla. An easily-justified commitment to cross-platform support and outstanding user experience, based on Google's history of honoring those tenets and the Mozilla organization's inherent preference for them. Culturally, hiring the core members of the Mozilla dev team would be an extraordinarily easy fit. And, frankly, it'd probably require little more development resources, bandwidth, or staffing than the Pyra acquisition did.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://kottke.org/04/08/the-google-browser"&gt;Google Browser, 2004&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Google could use their JavaScript expertise (in the form of Gmail ubercoder Chris Wetherell) to build Mozilla applications. Built-in blogging tools. Built-in Gmail tools. Built-in search tools. A search pane that watches what you're browsing and suggests related pages and search queries or watches what you're blogging and suggests related pages, news items, or emails you've written. Google Toolbar++. You get the idea.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogoscoped.com/archive/2008-09-01-n47.html"&gt;Google Browser, 2008&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;All of us at Google spend much of our time working inside a browser. We search, chat, email and collaborate in a browser. And in our spare time, we shop, bank, read news and keep in touch with friends -- all using a browser. Because we spend so much time online, we began seriously thinking about what kind of browser could exist if we started from scratch and built on the best elements out there. We realized that the web had evolved from mainly simple text pages to rich, interactive applications and that we needed to completely rethink the browser. What we really needed was not just a browser, but also a modern platform for web pages and applications, and that's what we set out to build.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;More on this tomorrow if motivation allows.&lt;/p&gt;</summary><author><name>jason@kottke.org</name></author><source gr:stream-id="feed/http://feeds.kottke.org/main"><id>tag:google.com,2005:reader/feed/http://feeds.kottke.org/main</id><title type="html">kottke.org</title><link rel="alternate" href="http://www.kottke.org/" type="text/html" /></source></entry><entry gr:crawl-timestamp-msec="1220385763225"><id gr:original-id="">tag:google.com,2005:reader/item/7904cf5c1dabefb6</id><title type="html">Welcome to Chromium</title><published>2008-09-02T20:02:43Z</published><updated>2008-09-02T20:02:43Z</updated><link rel="alternate" href="http://blog.chromium.org/2008/09/welcome-to-chromium_02.html" type="text/html" /><link rel="related" href="http://blog.chromium.org/" title="Chromium Blog" /><content xml:base="http://blog.chromium.org/" type="html">&lt;blockquote&gt;Shared by  Daniel Shaw 
&lt;br&gt;
Chrome is going to be fantastic! I can't wait for it to run natively on a Mac.&lt;/blockquote&gt;
&lt;div&gt;Today, Google launched a new web browser called &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;. At the same time, we are releasing all of the code as open source under a permissive BSD license. The open source project is called Chromium - after the metal used to make chrome.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Why did Google release the source code?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Primarily it's because one of the fundamental goals of the Chromium project is to help drive the web forward. Open source projects like &lt;a href="http://www.mozilla.org/"&gt;Firefox&lt;/a&gt; and &lt;a href="http://www.webkit.org/"&gt;WebKit&lt;/a&gt; have led the way in defining the next generation of web technologies and standards, and we felt the best way we could help was to follow suit, and be as open as we could. To be clear, improving the web in this way also has some clear benefits for us as a company. With a richer set of APIs we can build more interesting apps allowing people to do more online. The more people do online, the more they can use our services. At any rate, we have worked on this project by ourselves for long enough - it's time for us to engage with the wider web community so that we can move on to the next set of challenges.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We believe that open source works not only because it allows people to join us and improve our products, but also (and more importantly) because it means other projects are able to use the code we've developed. Where we've developed innovative new technology, we hope that other projects can use it to make their products better, just as we've been able to adopt code from other open source projects to make our product better.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;How will we be working with the open source community?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To begin with, we are engaging with the WebKit community to integrate our patches back into the main line of WebKit development. Because of Chromium's unique &lt;a href="http://dev.chromium.org/developers/design-documents/multi-process-architecture"&gt;multi-process architecture&lt;/a&gt;, the integration of the &lt;a href="http://code.google.com/p/v8/"&gt;V8 JavaScript engine&lt;/a&gt;, and other factors, we've built a fairly significant port of WebKit on Windows, and are developing the same for Mac OS X  and Linux. We want to make sure that we can find a productive way to integrate and sync up with the WebKit community in this effort as we move forward.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Today, you can visit our project website at &lt;a href="http://www.chromium.org/"&gt;www.chromium.org&lt;/a&gt;, where you can get the latest source code or the freshest development build. If you're interested in keeping track of what's going on, you can join one of our &lt;a href="http://dev.chromium.org/developers/discussion-groups"&gt;discussion groups&lt;/a&gt;, where you can participate in development discussions and keep track of bugs as they're filed and fixed. Maybe you'll want to fix a few, too! You'll also find information on reporting bugs and all the various other aspects of the project. We hope you'll check it out!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This is the Chromium blog. The posts here will be of a mostly technical nature, discussing the design theory and implementation details of work we've done or are doing. Over the next few weeks there'll be a number of posts that give a high level tour of the most important aspects of the browser.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Finally, if you've not yet done so, take Google Chrome for a spin. You can download it from &lt;a href="http://www.google.com/chrome/"&gt;http://www.google.com/chrome/&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span&gt;Posted by Ben Goodger, Software Engineer&lt;/span&gt;
</content><author gr:unknown-author="true"><name>(author unknown)</name></author><gr:annotation><content type="html">Chrome is going to be fantastic! I can't wait for it to run natively on a Mac.</content><author gr:user-id="06920941852763310482" gr:profile-id="100235426753535268123"><name>Daniel Shaw</name></author></gr:annotation><source gr:stream-id="user/06920941852763310482/source/com.google/link"><id>tag:google.com,2005:reader/user/06920941852763310482/source/com.google/link</id><title type="html">Chromium Blog</title><link rel="alternate" href="http://blog.chromium.org/" type="text/html" /></source></entry></feed>
