<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
	<title>Ian Lewis' Blog</title>
	<link rel="alternate" type="text/html" href="http://www.ianlewis.org/en/" />
	
	<id>http://www.ianlewis.org/en/?tempskin=_atom</id>
	<subtitle>The Blog of Ian Lewis</subtitle>
	<generator uri="http://b2evolution.net/" version="2.4.1">b2evolution</generator>
	<updated>2009-06-06T11:43:23Z</updated>
	
	<link rel="self" href="http://feeds.feedburner.com/IanLewisBlog" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
		<title type="text">Google Wave BOF</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/cwbY1kKu7ts/wave-bof" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/wave-bof</id>
		<published>2009-06-03T00:08:24Z</published>		<updated>2009-06-03T00:58:51Z</updated>
				<content type="html">&lt;p&gt;I attended the &lt;a href="http://d.hatena.ne.jp/a2c/20090602/1243954329"&gt;Google Wave BOF&lt;/a&gt; (Birds of a Feather, A gathering of people with similar interests). It was a good time for folks with &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; accounts to show it off to folks who can't sign into it yet. It originally was going to be about 25 people but due to popular demand the location had to be moved, and it went up to about 40 people. Lots of folks were interested in hearing about &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; Wave as a new collaborative platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/a2c/" title="a2c"&gt;id:a2c&lt;/a&gt; mentioned my 'debuggy' robot that I created to show events as they get fired by &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; Wave. Below is me showing off debuggy at the Googleplex. I got a very tepid response from the folks at the hackathon. I seemed to get a better response from people at the BOF. I'll talk more about debuggy in a later post.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://farm4.static.flickr.com/3406/3576839015_f145765228.jpg?v=0" rel="lightbox" title="Me showing off debuggy at the Google Wave Hackathon at the Googleplex"&gt;&lt;img src="http://farm4.static.flickr.com/3406/3576839015_f145765228_m.jpg" title="Me showing off debuggy at the Google Wave Hackathon at the Googleplex" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it is, currently it was hard for most people to visualize how they would use the tool for daily work but everyone seemed interested in the possibilities and it was recieved warmly. Looking forward to future releases of &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; Wave!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602212504.jpg" rel="lightbox" title="Matsuo-san sports his Wave T-shirt."&gt;&lt;img src="http://img.f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602212504_120.jpg" title="Matsuo-san sports his Wave T-shirt." /&gt;&lt;/a&gt;
&lt;a href="http://f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602212403.jpg" rel="lightbox" title="Demoing Google Wave"&gt;&lt;img src="http://img.f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602212403_120.jpg" title="Demoing Google Wave" /&gt;&lt;/a&gt;
&lt;a href="http://f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602193641.jpg" rel="lightbox" title="Future fans of Google Wave?"&gt;&lt;img src="http://img.f.hatena.ne.jp/images/fotolife/a/a2c/20090602/20090602193641_120.jpg" title="Future fans of Google Wave?" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Google Wave BOF',
              url   : 'http://www.ianlewis.org/en/wave-bof'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/wave-bof#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/wave-bof"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=cwbY1kKu7ts:Cdi6c9DjnUM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=cwbY1kKu7ts:Cdi6c9DjnUM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=cwbY1kKu7ts:Cdi6c9DjnUM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=cwbY1kKu7ts:Cdi6c9DjnUM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=cwbY1kKu7ts:Cdi6c9DjnUM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/wave-bof</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Google IO 2009</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/P_DFCkt84oA/google-io-2009" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/google-io-2009</id>
		<published>2009-06-01T05:57:11Z</published>		<updated>2009-06-01T15:07:28Z</updated>
				<content type="html">&lt;p&gt;This year I attended &lt;a href="http://code.google.com/events/io/"&gt;Google IO&lt;/a&gt; and had so much fun that I think I'll have to break it up into several blog posts. &lt;a href="http://code.google.com/events/io/"&gt;Google IO&lt;/a&gt; is held in San Francisco and is the #1 &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; event of the year. About 4000 or so developers attended the event which was held in the &lt;a href="http://maps.google.co.jp/maps?q=Moscone+West+Convention+Center+San+Francisco"&gt;Moscone West Convention Center&lt;/a&gt;. In this post I'll kind of give the history of the events leading up to the event and some context.&lt;/p&gt;

&lt;p&gt;One day in late January or so, &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; announced that registration for this year's &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt; IO was open and there was a subsequent conversation on twitter that ensued which led to &lt;a href="http://takashi-matsuo.blogspot.com/" title="松尾 貴史"&gt;id:tmatsuo&lt;/a&gt;, &lt;a href="http://d.hatena.ne.jp/a2c/" title="a2c"&gt;id:a2c&lt;/a&gt;, &lt;a href="http://d.hatena.ne.jp/Voluntas/" title="仲居良介"&gt;id:voluntas&lt;/a&gt;, myself, and several others proclaiming they were going to attend this year's event.&lt;/p&gt;

&lt;p&gt;I found out that the office of one of my old classmates, &lt;a href="http://bob.pythonmac.org/"&gt;Bob Ippolito&lt;/a&gt;, is close to the event so I sort of &lt;a href="http://twitter.com/IanMLewis/status/1154992029"&gt;jokingly invited&lt;/a&gt; myself and &lt;a href="http://takashi-matsuo.blogspot.com/" title="松尾 貴史"&gt;id:tmatsuo&lt;/a&gt; to stay at his office. You might know &lt;a href="http://twitter.com/etrepum"&gt;Bob&lt;/a&gt; as the co-founder and CTO of a company called &lt;a href="http://www.mochimedia.com/"&gt;MochiMedia&lt;/a&gt;, or as the author of numerous pieces of well used free software such as &lt;a href="http://code.google.com/p/simplejson/"&gt;simplejson&lt;/a&gt;, &lt;a href="http://code.google.com/p/mochiweb/"&gt;MochiWeb&lt;/a&gt;, &lt;a href="http://www.mochikit.com"&gt;MochiKit&lt;/a&gt;, or &lt;a href="http://pyobjc.sourceforge.net/"&gt;PyObjC&lt;/a&gt; or as the coiner of the phrase &lt;a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/"&gt;JSONP&lt;/a&gt; (Note the date of the blog post). He has consistently gotten into things before they become big, including technologies such as &lt;a href="http://www.google.com/search?q=json"&gt;json&lt;/a&gt;, &lt;a href="http://www.google.com/search?q=erlang"&gt;erlang&lt;/a&gt;, &lt;a href="http://www.google.com/search?q=key+value+database"&gt;Non-RDBM databases&lt;/a&gt; and often gives talks about them which essentially give you key insights into the future of web programming.&lt;/p&gt;

&lt;p&gt;ded by offering to let me and &lt;a href="http://takashi-matsuo.blogspot.com/" title="松尾 貴史"&gt;id:tmatsuo&lt;/a&gt; stay at his apartment. However, when it came close to the event Bob realized that he was going to be at &lt;a href="http://flashontap.com/"&gt;another conference&lt;/a&gt; for Flash developers in Boston, which meant that we would only have one day where we were both in San Francisco. Bummer! But he let us stay at his house even though he wasn't going to be there saving us a lot of money. He was very gracious.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3391/3570254347_44d7f0c4c8.jpg?v=0" alt="Me and Bob" /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, a few folks such as &lt;a href="http://d.hatena.ne.jp/Voluntas/" title="仲居良介"&gt;id:voluntas&lt;/a&gt; couldn't go to the event because of overreactions by their employers to the outbreak of &lt;a href="http://www.google.com/search?q=swine+flu"&gt;swine flu&lt;/a&gt; but almost everyone that did go arrived in San Francisco on May 26th. I'll continue in a later blog post!!&lt;/p&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Google IO 2009',
              url   : 'http://www.ianlewis.org/en/google-io-2009'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/google-io-2009#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/google-io-2009"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=P_DFCkt84oA:fXRQWTrVxj0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=P_DFCkt84oA:fXRQWTrVxj0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=P_DFCkt84oA:fXRQWTrVxj0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=P_DFCkt84oA:fXRQWTrVxj0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=P_DFCkt84oA:fXRQWTrVxj0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/google-io-2009</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Tokyo Barcamp 2009</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/sMHloVEd8bc/tokyo-barcamp-2009" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/tokyo-barcamp-2009</id>
		<published>2009-05-16T13:18:05Z</published>		<updated>2009-05-16T13:29:26Z</updated>
				<content type="html">&lt;p&gt;Today I participated in &lt;a href="http://barcamp.org/BarCamp-Tokyo2009"&gt;Tokyo Barcamp 2009&lt;/a&gt;. From the Tokyo Barcamp website:&lt;/p&gt;

&lt;blockquote&gt;Tokyo BarCamp 2009 will be a day of workshops, presentations and discussions on a wide variety of topics related to technology and how it affects our lives.&lt;/blockquote&gt;

&lt;p&gt;
&lt;a rel="lightbox" href="http://farm3.static.flickr.com/2053/3535087963_36d833708b.jpg?v=0"&gt;&lt;img src="http://farm3.static.flickr.com/2053/3535087963_36d833708b_m.jpg" alt="" /&gt;&lt;/a&gt;
&lt;a rel="lightbox" title="Miwaza talking to 1Rick and some other guy." href="http://farm4.static.flickr.com/3384/3535905380_ca4f389d44.jpg?v=0"&gt;&lt;img src="http://farm4.static.flickr.com/3384/3535905380_ca4f389d44_m.jpg" alt="" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I was a little skeptical about how organized barcamp would be when I decided to participate but it became very cool and conductive to discussing ideas. It especially gave people a good opportunity to think about the future of the web and the internet and various other topics such as "music in virtual worlds" and "eco living".&lt;/p&gt;

&lt;p&gt;Discussions I participated in were as follows:&lt;/p&gt;

&lt;h4&gt;Mobile Browsers&lt;/h4&gt;
&lt;p&gt;Mobile browsers and their history and where they may be headed in the future. Discussion headed up by &lt;a href="http://twitter.com/LonelyBob"&gt;LonelyBob&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Natural Language Parsing&lt;/h4&gt;
&lt;p&gt;A presentation and discussion about parsing language and getting a data in a unified format regardless of language (English, Japanese etc.) and regardless of language parsing method. The presentation was by &lt;a href="http://twitter.com/kimtaro"&gt;Kim Ahlström&lt;/a&gt; from &lt;a href="http://smart.fm"&gt;Smart.fm&lt;/a&gt;. He introduced Cereling which is a language parsing unifier/engine he is working on at Smart.fm and they are planning to Open Source. Unfortunately it's also apparently written in Ruby.&lt;/p&gt;

&lt;h4&gt;Hacker Space&lt;/h4&gt;

&lt;a title="Mitch Altman talking about the hacker space movement." rel="lightbox" href="http://farm4.static.flickr.com/3378/3535085013_37c7fe349a.jpg?v=0"&gt;&lt;img src="http://farm4.static.flickr.com/3378/3535085013_37c7fe349a_m.jpg" alt="" 
/&gt;&lt;/a&gt;

&lt;p&gt;By far the most interesting idea that came out of barcamp was the idea of hacker spaces where folks can get together and share ideas as well as have a space to try new things and experiment. There was a lot of interest in the Hacker Space concept and creating one in Tokyo. We even created a website already at &lt;a href="http://www.tokyohackerspace.com/"&gt;Tokyo Hacker Space&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We also learned that there exists a Hacker Space in Tokyo already called &lt;a href="http://456.im/wp/"&gt;4ncho5la6&lt;/a&gt; (Anchorlab). Some folks from the barcamp are planning to go out there and check it out. We want to see what they did and what we can learn from them and perhaps collaborate on membership and events. Interestingly, the lab is headed by &lt;a href="http://daito.ws/"&gt;Daito Manabe&lt;/a&gt; who is famous for his "Face Visualizer" video on Youtube.&lt;/p&gt;

&lt;div class="youtube center"&gt;&lt;object type="application/x-shockwave-flash" style="width:425px; height:350px" data="http://www.youtube.com/v/YxdlYFCp5Ic&amp;amp;eurl"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YxdlYFCp5Ic&amp;amp;eurl" /&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Tokyo Barcamp 2009',
              url   : 'http://www.ianlewis.org/en/tokyo-barcamp-2009'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/tokyo-barcamp-2009#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/tokyo-barcamp-2009"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=sMHloVEd8bc:J-nEbbfLf4U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=sMHloVEd8bc:J-nEbbfLf4U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=sMHloVEd8bc:J-nEbbfLf4U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=sMHloVEd8bc:J-nEbbfLf4U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=sMHloVEd8bc:J-nEbbfLf4U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/tokyo-barcamp-2009</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Connecting Sortables in jQuery UI</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/tt7uU1F9Hr4/connecting-sortables-in-jquery-ui" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/connecting-sortables-in-jquery-ui</id>
		<published>2009-04-22T01:26:41Z</published>		<updated>2009-04-23T01:21:51Z</updated>
				<content type="html">&lt;p&gt;&lt;a href="http://jquery.com/" title="jQuery"&gt;jQuery&lt;/a&gt; has a UI framework called &lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; which provides a number of UI controls and widgets that you can use to create cool user interfaces. I've been using &lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; a fair bit for work recently and wanted to share a pretty cool feature that &lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; has.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; has a widget called a &lt;a href="http://jqueryui.com/demos/sortable/"&gt;sortable&lt;/a&gt; which is just a list of sortable dom elements. It allows you to drag the items around and resort them in a list. Options are passed in an object that you give to the sortable constructor/initializer. You can initialize a sortable like so:&lt;/p&gt;

&lt;div class="codeblock amc_javascript amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;$&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#my-list'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;sortable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; axis: &lt;span style="color: #3366CC;"&gt;'x'&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this case the options object and contained &amp;quot;axis&amp;quot; option are optional but it gives you a good idea what a widget initializer looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; also has a draggable widget which allows you to easily create draggable items. This draggable can also be connected to a sortable object so you can drag an object onto a sortable widget.&lt;/p&gt;

&lt;div class="codeblock amc_javascript amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;$&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#my-item'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;draggable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; connectToSortable: &lt;span style="color: #3366CC;"&gt;'#my-list'&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="http://jqueryui.com/" title="jQueryUI"&gt;jQueryUI&lt;/a&gt; also allows you to connect sortables to each other which creates the potential for some interesting user interfaces.&lt;/p&gt;

&lt;div class="codeblock amc_javascript amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;$&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#my-list'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;sortable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; connectWith: &lt;span style="color: #3366CC;"&gt;'#my-other-list'&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can even connect the sortables together so you can drag items back and forth between the sortables:&lt;/p&gt;

&lt;div class="codeblock amc_javascript amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;$&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#my-list'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;sortable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; connectWith: &lt;span style="color: #3366CC;"&gt;'#my-other-list'&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;$&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'#my-other-list'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;sortable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; connectWith: &lt;span style="color: #3366CC;"&gt;'#my-list'&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p style="font-size: 200%;"&gt;&lt;a href="http://www.ianlewis.org/files/sortables/index.html" target="_blank"&gt;DEMO &gt;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Connecting Sortables in jQuery UI',
              url   : 'http://www.ianlewis.org/en/connecting-sortables-in-jquery-ui'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/connecting-sortables-in-jquery-ui#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/connecting-sortables-in-jquery-ui"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=tt7uU1F9Hr4:wHCPPSO-Q_w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=tt7uU1F9Hr4:wHCPPSO-Q_w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=tt7uU1F9Hr4:wHCPPSO-Q_w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=tt7uU1F9Hr4:wHCPPSO-Q_w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=tt7uU1F9Hr4:wHCPPSO-Q_w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/connecting-sortables-in-jquery-ui</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Unreadable</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/QNzC3_jG-Fo/title-2" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/title-2</id>
		<published>2009-04-01T05:07:48Z</published>		<updated>2009-04-01T05:08:06Z</updated>
				<content type="html">&lt;p&gt;What is it about some C programmers that makes them write code that looks like this:&lt;/p&gt;

&lt;div class="codeblock amc_c amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;len&amp;lt;&lt;span style="color: #cc66cc;"&gt;16&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;start;k&amp;lt;start&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;len;k&lt;span style="color: #66cc66;"&gt;+=&lt;/span&gt;j&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; j&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;;x&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;V&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;h&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&amp;lt;start&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;len;i&lt;span style="color: #66cc66;"&gt;++&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;V&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;h&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&amp;lt;x&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;V&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;h&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;V&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;h&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;==&lt;/span&gt;x&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;j&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;j&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;tmp;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j&lt;span style="color: #66cc66;"&gt;++&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;;i&amp;lt;j;i&lt;span style="color: #66cc66;"&gt;++&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; V&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;i&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;+&lt;/span&gt;j&lt;span style="color: #cc66cc;"&gt;-1&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;j&lt;span style="color: #66cc66;"&gt;==&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; I&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;-1&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Unreadable',
              url   : 'http://www.ianlewis.org/en/title-2'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/title-2#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/title-2"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=QNzC3_jG-Fo:9HxD_NjoZc0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=QNzC3_jG-Fo:9HxD_NjoZc0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=QNzC3_jG-Fo:9HxD_NjoZc0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=QNzC3_jG-Fo:9HxD_NjoZc0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=QNzC3_jG-Fo:9HxD_NjoZc0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/title-2</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Transactions on Appengine</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/kBJMTHwk3E4/transactions-on-appengine" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/transactions-on-appengine</id>
		<published>2009-03-18T15:44:52Z</published>		<updated>2009-03-18T15:44:52Z</updated>
				<content type="html">&lt;p&gt;The way to store data on &lt;a href="http://code.google.com/appengine/" title="Appengine"&gt;Appengine&lt;/a&gt; is with &lt;a href="http://www.google.com/" title="Google"&gt;Google&lt;/a&gt;'s &lt;a href="http://code.google.com/appengine/docs/python/datastore/"&gt;BigTable Datastore&lt;/a&gt; which has support for transactions. However, the transactions are quite limited in that,&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You can only execute callables inside transactions. Which means you basically call run_in_transaction() on a function. This can sometimes be a pain but can generally be worked around with decorators and the like.
&lt;div class="codeblock amc_python amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;def&lt;/span&gt; my_update_function&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;# Some update code here&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; ent.&lt;span style="color: black;"&gt;put&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;run_in_transaction&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;my_update_function&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;You can only update entities in the same entity group. This means all entities must be in the same ancestor tree. This can make updating entities with various relationships hard or impossible to do in a general way in a transaction.&lt;/li&gt; 
&lt;li&gt;You cannot do filters in a transaction. This means you cannot do any kind of select, &lt;em&gt;period&lt;/em&gt;. This means you cannot do the following:
&lt;div class="codeblock amc_python amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;class&lt;/span&gt; ModelA&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;db.&lt;span style="color: black;"&gt;Model&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #ff7700;font-weight:bold;"&gt;pass&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;class&lt;/span&gt; ModelB&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;db.&lt;span style="color: black;"&gt;Model&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; modela = ReferenceProperty&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;ModelA&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;def&lt;/span&gt; update_func&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;# Sorry this won't work&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; modelas = ModelA.&lt;span style="color: black;"&gt;all&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;# This is the only thing that works&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; modela = ModelA.&lt;span style="color: black;"&gt;get_by_id&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;123&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;# Jeez, you can't do this either!&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; modelb = ModelB.&lt;span style="color: #008000;"&gt;filter&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'modela ='&lt;/span&gt;, modela&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

You can only do gets based on the key of an entity. Which means if you have a relationship like the one above you need to be able to derive the key to ModelB given the key for ModelA. And since you cannot chose numeric keys with which to save entities (numeric keys are always assigned), you will need to assign &lt;a href="http://code.google.com/appengine/docs/python/datastore/keysandentitygroups.html#Kinds_Names_and_IDs"&gt;key names&lt;/a&gt; for both entities.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All this makes transactions a bit of a pain in &lt;a href="http://code.google.com/appengine/" title="Appengine"&gt;Appengine&lt;/a&gt; but workable if you put a bit of effort into it. In the end you'll want to use key names for most every entity that matters as current backup solutions for &lt;a href="http://code.google.com/appengine/" title="Appengine"&gt;Appengine&lt;/a&gt; rely on key names to maintain the keys of entities when backing up and restoring. It wouldn't be to fun if all the urls for an entity that had numeric ids changed after restoring the data from a backup.&lt;/p&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Transactions on Appengine',
              url   : 'http://www.ianlewis.org/en/transactions-on-appengine'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/transactions-on-appengine#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/transactions-on-appengine"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=kBJMTHwk3E4:UK989g5OQH8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=kBJMTHwk3E4:UK989g5OQH8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=kBJMTHwk3E4:UK989g5OQH8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=kBJMTHwk3E4:UK989g5OQH8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=kBJMTHwk3E4:UK989g5OQH8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/transactions-on-appengine</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Jaiku on Appengine</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/-WtChUZvpLE/jaiku-on-appengine-1" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/jaiku-on-appengine-1</id>
		<published>2009-03-15T14:52:31Z</published>		<updated>2009-03-15T14:54:02Z</updated>
				<content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/ianlewis/3356660226/"&gt;&lt;img src="http://farm4.static.flickr.com/3650/3356660226_c8d4f84cb9.jpg?v=0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yesterday &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;'s &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt;-like service, &lt;a href="http://www.jaiku.com/"&gt;Jaiku&lt;/a&gt; was released as &lt;a href="http://code.google.com/p/jaikuengine/"&gt;open source&lt;/a&gt; running on &lt;a href="http://code.google.com/appengine/"&gt;Google Appengine&lt;/a&gt; so I decided to take it for a spin. It has a lot of neat parts like XMPP and google contacts integration, but what I'm interested in most is how it implements it's publisher/subscriber model.&lt;/p&gt;

&lt;p&gt;I brought the code down from svn and tried to follow the instructions, but I got a "No module named django" error. One of the problems currently with appengine is that you have a limit of 1000 files you can upload. Because of this limit when deploying jaiku you need to zip a bunch of libraries into a zip file and use zipimport. Accordingly you have to prevent the source files from being uploaded because you get an error saying you can't upload more than 1000 files.&lt;/p&gt;

&lt;p&gt;The problem there is that the newest (1.1.9) SDK prevents you from loading modules and/or accessing files that are specified in the skip-files directive in your app.yaml. This prevented me from importing django because it's a zipped module.&lt;/p&gt;

&lt;p&gt;At first I tried just zipping the files up using the zip_all command in the Makefile (make zip_all) but I still got the same error so I just commented out the relevant parts in app.yaml.&lt;/p&gt;

&lt;div class="codeblock amc_yaml amc_long"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;skip_files: |&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;^(.*/)?(&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(app\.yaml)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(app\.yml)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(index\.yaml)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(index\.yml)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(#.*#)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(.*~)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(.*\.py[co])|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;(.*/RCS/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (\..*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (manage.py)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (google_appengine.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (simplejson/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (gdata/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (atom/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (tlslite/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (oauth/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (beautifulsoup/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (django/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (docutils/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (epydoc/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (appengine_django/management/commands/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (README)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (CHANGELOG)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (Makefile)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (bin/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (images/ads/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (images/ext/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (wsgiref/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (elementtree/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (doc/.*)|&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;# (profiling/.*)&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;)$&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From there it should have worked but I got an error about the pstats module. That just happened to not be installed on my machine so installed python-profiler and Jaiku ran from there.&lt;/p&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Jaiku on Appengine',
              url   : 'http://www.ianlewis.org/en/jaiku-on-appengine-1'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/jaiku-on-appengine-1#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/jaiku-on-appengine-1"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=-WtChUZvpLE:rFZEk5QR1_k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=-WtChUZvpLE:rFZEk5QR1_k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=-WtChUZvpLE:rFZEk5QR1_k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=-WtChUZvpLE:rFZEk5QR1_k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=-WtChUZvpLE:rFZEk5QR1_k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/jaiku-on-appengine-1</feedburner:origLink></entry>

	
	<entry>
		<title type="text">Werkzeug and reverse urls</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/IanLewisBlog/~3/3g4eaM-XnwI/werkzeug-and-reverse-urls" />
		<author>
			<name>Ian Lewis</name>
			<uri>http://www.ianlewis.org/</uri>
		</author>
		<id>http://www.ianlewis.org/en/werkzeug-and-reverse-urls</id>
		<published>2009-03-14T01:57:52Z</published>		<updated>2009-03-14T02:01:35Z</updated>
				<content type="html">&lt;p&gt;I wanted to impove a &lt;a href="http://code.google.com/appengine/"&gt;Google Appengine&lt;/a&gt; application that a friend of mine created (&lt;a href="http://twisted-mind.appspot.com/"&gt;ほぼ汎用イベント管理ツール&lt;/a&gt;(jp)) and noticed that he was &lt;a href="http://bitbucket.org/voluntas/twisted-mind/src/tip/views.py#cl-132"&gt;redirecting directly to urls&lt;/a&gt;. He is using &lt;a href="http://werkzeug.pocoo.org/"&gt;Werkzeug&lt;/a&gt; to handle url routing so I wondered if there was a method for generating urls from a name like you can in &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It turns out you can but you give it an endpoint name rather than a url name.&lt;/p&gt;

urls.py
&lt;div class="codeblock amc_python amc_long"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;from&lt;/span&gt; werkzeug.&lt;span style="color: black;"&gt;routing&lt;/span&gt; &lt;span style="color: #ff7700;font-weight:bold;"&gt;import&lt;/span&gt; Map, Rule, RuleTemplate, Submount, EndpointPrefix&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt; = RuleTemplate&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/${name}/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'${name}_index'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/${name}/create/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'create_${name}'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/${name}/update/&amp;lt;string:${var}&amp;gt;/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'update_${name}'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/${name}/delete/&amp;lt;string:${var}&amp;gt;/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'delete_${name}'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: black;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;url_map = Map&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'index'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/&amp;lt;string:slug&amp;gt;/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'project_or_event'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/form/&amp;lt;string:key&amp;gt;/&amp;lt;string:slug&amp;gt;/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'form'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; Submount&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/account'&lt;/span&gt;, &lt;span style="color: black;"&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'account_index'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/create/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'create_account'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/update/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'update_account'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/delete/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'delete_account'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Rule&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/event/cancel/&amp;lt;string:slug&amp;gt;/'&lt;/span&gt;, endpoint=&lt;span style="color: #483d8b;"&gt;'event_cancel'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: black;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; EndpointPrefix&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'admin_'&lt;/span&gt;, &lt;span style="color: black;"&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; Submount&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'/admin'&lt;/span&gt;, &lt;span style="color: black;"&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;name=&lt;span style="color: #483d8b;"&gt;'account'&lt;/span&gt;, var=&lt;span style="color: #483d8b;"&gt;'email'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;name=&lt;span style="color: #483d8b;"&gt;'project'&lt;/span&gt;, var=&lt;span style="color: #483d8b;"&gt;'slug'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;name=&lt;span style="color: #483d8b;"&gt;'event'&lt;/span&gt;, var=&lt;span style="color: #483d8b;"&gt;'slug'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;name=&lt;span style="color: #483d8b;"&gt;'program'&lt;/span&gt;, var=&lt;span style="color: #483d8b;"&gt;'slug'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #dc143c;"&gt;resource&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;name=&lt;span style="color: #483d8b;"&gt;'application'&lt;/span&gt;, var=&lt;span style="color: #483d8b;"&gt;'slug'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: black;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: black;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

views.py
&lt;div class="codeblock amc_python amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;from&lt;/span&gt; werkzeug redirect as wredirect&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;from&lt;/span&gt; urls &lt;span style="color: #ff7700;font-weight:bold;"&gt;import&lt;/span&gt; url_map&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc4"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="color: #ff7700;font-weight:bold;"&gt;def&lt;/span&gt; reverse&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;**&lt;/span&gt;kwargs&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc5"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; c = url_map.&lt;span style="color: black;"&gt;bind&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;''&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc6"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #ff7700;font-weight:bold;"&gt;return&lt;/span&gt; wredirect&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;c.&lt;span style="color: black;"&gt;build&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;**&lt;/span&gt;kwargs&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc7"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc8"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;...&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc9"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #ff7700;font-weight:bold;"&gt;return&lt;/span&gt; reverse&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'form'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;dict&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;key=key, slug=slug&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc0"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You need to give the build function a full endpoint. in the above example you can have endpoints like admin_create_${name} where ${name} is the name of a resource. This would need to be filled in when passing it to build.&lt;/p&gt;

&lt;div class="codeblock amc_python amc_short"&gt;&lt;table&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc1"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;...&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_even"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc2"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp; &lt;span style="color: #ff7700;font-weight:bold;"&gt;return&lt;/span&gt; reverse&lt;span style="color: black;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;'admin_create_event'&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="amc_code_odd"&gt;&lt;td class="amc_line"&gt;&lt;div class="amc3"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="sharethis"&gt;
        &lt;script type="text/javascript" language="javascript"&gt;
          SHARETHIS.addEntry( {
            title : 'Werkzeug and reverse urls',
              url   : 'http://www.ianlewis.org/en/werkzeug-and-reverse-urls'}, 
            { button: true }
          ) ;
        &lt;/script&gt;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ianlewis.org/en/werkzeug-and-reverse-urls#disqus_thread"&gt;Send feedback&lt;/a&gt;&lt;/div&gt;&lt;div class="item_footer"&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://www.ianlewis.org/en/werkzeug-and-reverse-urls"&gt;Original post&lt;/a&gt; blogged on &lt;a href="http://b2evolution.net/"&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=3g4eaM-XnwI:f4CiuW5OVJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=3g4eaM-XnwI:f4CiuW5OVJ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=3g4eaM-XnwI:f4CiuW5OVJ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IanLewisBlog?a=3g4eaM-XnwI:f4CiuW5OVJ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IanLewisBlog?i=3g4eaM-XnwI:f4CiuW5OVJ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
				<feedburner:origLink>http://www.ianlewis.org/en/werkzeug-and-reverse-urls</feedburner:origLink></entry>

	</feed>
