<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-21332048</atom:id><lastBuildDate>Fri, 17 Feb 2012 04:34:59 +0000</lastBuildDate><category>mobile</category><category>discussion</category><category>postgresql</category><category>magazine</category><category>tools</category><category>ironpython</category><category>pycon11</category><category>documentation</category><category>funny</category><category>news</category><category>twisted</category><category>html5</category><category>web</category><category>programming community</category><category>interesting</category><category>development</category><category>community</category><category>python windows</category><category>privacy</category><category>abortion</category><category>open source</category><category>jetpack</category><category>pycon</category><category>threading</category><category>software development</category><category>programming python</category><category>lazy web</category><category>firefox</category><category>game development</category><category>xkcd</category><category>input devices</category><category>css</category><category>git</category><category>society</category><category>tips</category><category>rails</category><category>gdata</category><category>performance</category><category>journalapp</category><category>review</category><category>work</category><category>rant</category><category>videogame</category><category>socialserve</category><category>xml</category><category>business</category><category>scalability</category><category>portables</category><category>pleading</category><category>security</category><category>information</category><category>graphics</category><category>legal</category><category>geek</category><category>ux</category><category>philosophy</category><category>cloud</category><category>django</category><category>concurrency</category><category>links</category><category>complaint</category><category>patents</category><category>axiom</category><category>prosumer</category><category>android</category><category>exploits</category><category>opinion</category><category>software</category><category>MPAA</category><category>conversation</category><category>html</category><category>projectmanagement</category><category>marketing</category><category>geopy</category><category>design</category><category>podcasting</category><category>version control</category><category>testing</category><category>release</category><category>crowdsourcing</category><category>virtual machines</category><category>jython</category><category>blogging</category><category>content</category><category>web design</category><category>google</category><category>legislation</category><category>ruby</category><category>node.js</category><category>yahoo</category><category>media</category><category>education</category><category>pythonmagazine</category><category>technology</category><category>straight.plugin</category><category>javascript</category><category>social software</category><category>list</category><category>organization</category><category>apple</category><category>.Net</category><category>forums</category><category>environment</category><category>advertising</category><category>social</category><category>flock</category><category>youtube</category><category>programming python tips</category><category>merb</category><category>censorship</category><category>electricity</category><category>announcement</category><category>jquery plugin</category><category>social networking</category><category>webtools</category><category>response</category><category>python</category><category>planning</category><category>licensing</category><category>user interface</category><category>vagrant</category><category>python community</category><category>irc</category><category>x86_64</category><category>services</category><category>canvas</category><category>productivity</category><category>programming language</category><category>prediction</category><category>app engine</category><category>usability</category><category>hardware</category><category>database</category><category>science</category><category>code review</category><category>Windows 7</category><category>promotion</category><category>idea</category><category>user experience</category><category>cvs</category><category>python programming</category><category>personal</category><category>bettercache</category><category>law</category><category>Google Wave</category><category>RIAA</category><category>ajax</category><category>politics</category><category>programming</category><category>tutorial</category><category>pycon08</category><category>2010</category><category>music</category><category>socialnetworking</category><category>lisp</category><category>google gears</category><category>bookmarks</category><category>blog</category><category>book</category><category>reddit</category><category>life</category><category>nanowrimo</category><category>kindle</category><category>jquery</category><category>comet</category><category>copyright</category><category>adultswim</category><category>correction</category><category>web2.0</category><category>extsession</category><category>ipod</category><category>food</category><category>twitter</category><category>index</category><category>browsing</category><category>standards</category><category>career</category><category>begging</category><category>mozilla</category><category>project management</category><category>writing</category><category>progress</category><category>pypy</category><category>estimation</category><category>system administration</category><category>ethic</category><title>Developing Upwards</title><description /><link>http://techblog.ironfroggy.com/</link><managingEditor>noreply@blogger.com (Calvin Spealman)</managingEditor><generator>Blogger</generator><openSearch:totalResults>302</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RavingTechnoRant" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ravingtechnorant" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-6398664313127098297</guid><pubDate>Wed, 15 Feb 2012 01:05:00 +0000</pubDate><atom:updated>2012-02-14T20:05:55.808-05:00</atom:updated><title>ANN: Django Better Cache 0.5.3</title><description>I've added a small, but useful, addition to Django Better Cache, today. The new bettercache.decorators.CachedFormMethod utility is a decorator for Django form methods, which is essentially a memoizer, but with a nice twist.&lt;br /&gt;
&lt;br /&gt;
This is great for forms that include DB or search index reading methods which can be expensive and you'd like to cache, but normal memoization fails when the important parameters to key on are in the form data, not the arguments to the actual method.&lt;br /&gt;
&lt;br /&gt;
Read about the new decorator at the &lt;a href="http://readthedocs.org/docs/django-better-cache/en/latest/cachemodel.html#cachedformmethod"&gt;docs&lt;/a&gt; to learn more. &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FriendsLookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@CachedFormMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# expire in 15 minutes&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_friends_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;include_pending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleaned_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Friendship&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;from_user__username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;include_pending&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PENDING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APPROVED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;APPROVED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;friends &lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-6398664313127098297?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lfcsiJFaIEk:vmAxkjeeBM8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lfcsiJFaIEk:vmAxkjeeBM8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lfcsiJFaIEk:vmAxkjeeBM8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=lfcsiJFaIEk:vmAxkjeeBM8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lfcsiJFaIEk:vmAxkjeeBM8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lfcsiJFaIEk:vmAxkjeeBM8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=lfcsiJFaIEk:vmAxkjeeBM8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/02/ann-django-better-cache-053.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-7758737427266372216</guid><pubDate>Tue, 31 Jan 2012 10:57:00 +0000</pubDate><atom:updated>2012-01-31T05:57:37.144-05:00</atom:updated><title>ANN: Django Better Cache 0.5.1 with expanded docs</title><description>&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
I've made a small incremental release on Django Better Cache, adding a from_miss() method to handle cache misses in CacheModel objects. Now, you can define your cache model and how it initializes data when the cache is empty, and perform all your lookups through the CacheModel, expecting misses to auto-populate for you.&lt;br /&gt;
&lt;br /&gt;
You can see a quick example of the new functionality below, but I have also made large improvements to the documentation hosted over at &lt;a href="http://readthedocs.org"&gt;ReadTheDocs&lt;/a&gt;, so go read the &lt;a href="http://readthedocs.org/docs/django-better-cache/en/latest/"&gt;full docs&lt;/a&gt; right now, if you are interested.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;from bettercache.objects import CacheModel
from django.contrib import auth

class User(CacheModel):
    username = Key()
    email = Field()
    full_name = Field()

    def from_miss(self, username):
        user = auth.models.User.objects.get(username=username)
        self.email = user.email
        self.full_name = user.get_full_name()
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
If this &lt;code&gt;get()&lt;/code&gt; does not find the object in the cache, it will create a new&lt;br /&gt;
User instance and call &lt;code&gt;from_miss()&lt;/code&gt; with the key parameter username to&lt;br /&gt;
initialize it, and then save and return that object for you. The next call,&lt;br /&gt;
it will find it in the cache.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;user = User.get(username="bob")
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-7758737427266372216?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ehwkmaJ3K8g:wOvDPZLoP-s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ehwkmaJ3K8g:wOvDPZLoP-s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ehwkmaJ3K8g:wOvDPZLoP-s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=ehwkmaJ3K8g:wOvDPZLoP-s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ehwkmaJ3K8g:wOvDPZLoP-s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ehwkmaJ3K8g:wOvDPZLoP-s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=ehwkmaJ3K8g:wOvDPZLoP-s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/01/ann-django-better-cache-051-with.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-457484525715559593</guid><pubDate>Mon, 30 Jan 2012 03:02:00 +0000</pubDate><atom:updated>2012-01-29T22:02:11.573-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">straight.plugin</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>ANN: straight.plugin 1.3 released - with docs!</title><description>&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
I think it is worth a new release to announce that I have documented straight.plugin and published the docs to ReadTheDocs. I hope this will help anyone who has had trouble parsing my terse README file, and will improve adoption of the project in the future.&lt;br /&gt;
&lt;br /&gt;
Check out the &lt;a href="https://github.com/ironfroggy/straight.plugin"&gt;new code&lt;/a&gt; and the &lt;a href="http://straightplugin.readthedocs.org/en/latest/index.html"&gt;new docs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-457484525715559593?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=kTa20kZDtmk:jpR5X7J9SAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=kTa20kZDtmk:jpR5X7J9SAw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=kTa20kZDtmk:jpR5X7J9SAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=kTa20kZDtmk:jpR5X7J9SAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=kTa20kZDtmk:jpR5X7J9SAw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=kTa20kZDtmk:jpR5X7J9SAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=kTa20kZDtmk:jpR5X7J9SAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/01/ann-straightplugin-13-released-with.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-4409578345308316477</guid><pubDate>Thu, 26 Jan 2012 12:26:00 +0000</pubDate><atom:updated>2012-01-26T07:26:25.975-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web design</category><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>A little trick for wide pages</title><description>&lt;data:post.title&gt;We have wide monitors and our reading doesn't tend to like wide text very well. This is why newspapers have lots of narrow columns, rather than stretch each story across the entire width of the paper.&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;&lt;br /&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;Not all websites follow this tip, so drag this to your bookmark toolbar and squeeze the margin in 100px at a time, until you can read more naturally.&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;&lt;br /&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="javascript:(function(){var%20s=document.body.style;s.marginRight=parseInt(s.marginRight||0)+100+'px';})();"&gt;&lt;data:post.title&gt;&amp;gt;squeeze!&amp;lt;&lt;/data:post.title&gt;&lt;/a&gt;&lt;/div&gt;
&lt;data:post.title&gt;&lt;br /&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;Yes, I could resize my window, but the same width isn't right for all pages, and most are padded or have sidebars. This is good when you only need &lt;i&gt;some&lt;/i&gt; of the pages you have open to be narrower than the rest.&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-4409578345308316477?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=cCl_5Nd-grI:fqbIDpkBsZk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=cCl_5Nd-grI:fqbIDpkBsZk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=cCl_5Nd-grI:fqbIDpkBsZk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=cCl_5Nd-grI:fqbIDpkBsZk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=cCl_5Nd-grI:fqbIDpkBsZk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=cCl_5Nd-grI:fqbIDpkBsZk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=cCl_5Nd-grI:fqbIDpkBsZk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/01/little-trick-for-wide-pages.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-5615210454558172013</guid><pubDate>Sun, 22 Jan 2012 19:55:00 +0000</pubDate><atom:updated>2012-01-22T14:55:52.943-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">bettercache</category><category domain="http://www.blogger.com/atom/ns#">announcement</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>ANN: Django Better Cache 0.5 Released</title><description>&lt;data:post.title&gt;I am announcing the release of Django Better Cache 0.5 today. This release includes a move to sphinx as a documentation tool and a new component, the bettercache.objects module, which provides a lite ORM-like interface for caching data.&lt;/data:post.title&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;data:post.title&gt;Please read the full, but short documentation &lt;a href="http://readthedocs.org/docs/django-better-cache/en/latest/"&gt;over at Read The Docs&lt;/a&gt; for details on the bettercache &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{% cache %} &lt;/span&gt;tag and the bettercache.objects ORM, and have a much easier time with your caching needs.&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;&lt;br /&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;Here is just a quick example of the new cache models, from the docs:&lt;/data:post.title&gt;&lt;br /&gt;
&lt;data:post.title&gt;&lt;br /&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CacheModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'bob'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'bob@hotmail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'Bob T Fredrick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'bob'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'bob@hotmail.com'&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'Bob T Fredrick'&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;/pre&gt;
&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-5615210454558172013?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=aEl2tSMTlK4:CFNEfIxTanY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=aEl2tSMTlK4:CFNEfIxTanY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=aEl2tSMTlK4:CFNEfIxTanY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=aEl2tSMTlK4:CFNEfIxTanY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=aEl2tSMTlK4:CFNEfIxTanY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=aEl2tSMTlK4:CFNEfIxTanY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=aEl2tSMTlK4:CFNEfIxTanY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/01/ann-django-better-cache-05-released.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-6127886232513229834</guid><pubDate>Tue, 17 Jan 2012 22:04:00 +0000</pubDate><atom:updated>2012-01-17T17:04:22.275-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">app engine</category><category domain="http://www.blogger.com/atom/ns#">journalapp</category><title>Leaving Google AppEngine</title><description>&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 22px;"&gt;&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;div class="tweet-user-block" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;a href="https://twitter.com/#!/ironfroggy" style="color: blue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;&lt;img alt="Calvin Spealman" class="tweet-user-block-image user-profile-link js-action-profile-avatar" data-user-id="5622042" src="https://twimg0-a.akamaihd.net/profile_images/1411001015/tumblr_lggmhbe4Cr1qe7vhgo1_500_normal.jpg" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; cursor: pointer; float: left; height: 48px; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: 48px;" /&gt;&lt;/a&gt;&lt;div class="tweet-user-block-name" style="line-height: 18px; margin-bottom: 0px; margin-left: 40px; margin-right: 0px; margin-top: 0px; min-height: 36px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;a class="tweet-user-block-screen-name user-profile-link js-action-profile-name" data-user-id="5622042" href="https://twitter.com/#!/ironfroggy" style="color: blue; cursor: pointer; display: inline-block; font-size: 20px; font-weight: bold; line-height: 24px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: -2px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" title="Calvin Spealman"&gt;@ironfroggy&lt;/a&gt;&lt;span class="tweet-user-block-full-name" style="color: #999999; display: block; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Calvin Spealman&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;div class="tweet-text tweet-text-large" style="-webkit-font-smoothing: antialiased; font-family: Georgia, Palatino, 'Helvetica Neue', Helvetica, Arial, sans-serif !important; font-size: 28px; line-height: 36px; margin-bottom: 6px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 10px; word-wrap: break-word;"&gt;
I can use AWS and work on technological engineering issues, or appengine and work on price-ological engineering issues. :-/&lt;/div&gt;
&lt;/div&gt;
&lt;div class="js-tweet-media-container tweet-media-container" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;div class="component" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; margin-bottom: 6px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;div class="tweet-media" style="margin-bottom: 12px; margin-left: 0px; margin-right: 0px; margin-top: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;a class="tweet-timestamp js-permalink" href="https://twitter.com/#!/ironfroggy/status/156931984831152130" style="color: blue; cursor: default; font-size: 13px; line-height: 22px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none !important;"&gt;&lt;span class="js-tweet-timestamp _old-timestamp" data-long-form="true" data-time="1326250475000" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="9:54 PM, Jan 10th"&gt;10 Jan&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span class="tweet-source" style="color: #999999; font-size: 13px; line-height: 22px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 12px; padding-top: 0px;"&gt;via&amp;nbsp;&lt;a href="http://www.tweetdeck.com/" rel="nofollow" style="color: blue; font-size: 13px; line-height: 22px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
Maybe I should take myself seriously when I said this. In the past few months, I've barely done any feature or bug work on JournaApp, because it takes my limited time and energy just keeping myself under quota when I'm the &lt;i&gt;only&lt;/i&gt;&amp;nbsp;&lt;i&gt;user of the app&lt;/i&gt;. I can't keep that up and keep my sanity, and it is honestly an emotionally draining exercise. This is creating a toxin that affects everything I do, so I'm going to take it out of my life.&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="tweet-row" style="clear: left; display: block; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"&gt;
I don't know if I'll port JournalApp or not. I like it, it has been fun and useful, but I'll probably take project notes in Evernote from here on forward, and on paper again. I miss paper.&lt;/div&gt;
&lt;/span&gt;&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-6127886232513229834?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1PNLVe3PlNE:83Wnm7jhseI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1PNLVe3PlNE:83Wnm7jhseI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1PNLVe3PlNE:83Wnm7jhseI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=1PNLVe3PlNE:83Wnm7jhseI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1PNLVe3PlNE:83Wnm7jhseI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1PNLVe3PlNE:83Wnm7jhseI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=1PNLVe3PlNE:83Wnm7jhseI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2012/01/leaving-google-appengine.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-1500541059029715294</guid><pubDate>Sun, 20 Nov 2011 15:56:00 +0000</pubDate><atom:updated>2011-11-20T10:59:26.738-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">straight.plugin</category><category domain="http://www.blogger.com/atom/ns#">announcement</category><category domain="http://www.blogger.com/atom/ns#">release</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>ANN: straight.plugin 1.2 Released</title><description>&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;h1 class="avatared" style="background-color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 30px; height: 54px; letter-spacing: -1px; line-height: 54px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-shadow: rgb(255, 255, 255) 1px 1px 0px;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; letter-spacing: normal; line-height: normal;"&gt;Erik Youngren contributed the loading of packages as plugin modules, which should be useful to a number of users who have module needs that don't fit in a single .py file. This release also includes .egg packages for Python 2.6, 2.7, and 3.2 versions.&lt;/span&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; letter-spacing: normal; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; letter-spacing: normal; line-height: normal;"&gt;Enjoy!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; letter-spacing: normal; line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Get the new release here&amp;nbsp;&lt;a href="http://pypi.python.org/pypi/straight.plugin/1.2"&gt;http://pypi.python.org/pypi/straight.plugin/1.2&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Or, go straight to the source at &lt;a href="http://github.com/ironfroggy/straight.plugin"&gt;http://github.com/ironfroggy/straight.plugin&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-1500541059029715294?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ZsJhPP8Gp8Q:ru5gT0AQSfg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ZsJhPP8Gp8Q:ru5gT0AQSfg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ZsJhPP8Gp8Q:ru5gT0AQSfg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=ZsJhPP8Gp8Q:ru5gT0AQSfg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ZsJhPP8Gp8Q:ru5gT0AQSfg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=ZsJhPP8Gp8Q:ru5gT0AQSfg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=ZsJhPP8Gp8Q:ru5gT0AQSfg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/11/ann-straightplugin-12-released.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-7140518119713090105</guid><pubDate>Fri, 04 Nov 2011 02:27:00 +0000</pubDate><atom:updated>2011-11-03T22:27:53.075-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">personal</category><category domain="http://www.blogger.com/atom/ns#">nanowrimo</category><category domain="http://www.blogger.com/atom/ns#">writing</category><title>NaNoWriMo: Day 3</title><description>&lt;blockquote class="tr_bq"&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
LONG DAY. Frustrated with the results today, but I am happy that I'm still on track. This is why I got extra words in the first two days!&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;

Daily Goal: 1666&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;

&lt;/span&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Today: 967&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;

&lt;/span&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Total: 5005&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;

&lt;/span&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining: 44995&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;

&lt;/span&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining Daily: 1606&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;span style="font-size: x-small;"&gt;from my &lt;a href="http://ironfroggy.tumblr.com/post/12311311301/nanowrimo-day-3"&gt;tumblr post &lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-7140518119713090105?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lo2UPs8PcsY:PUed_KDNwP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lo2UPs8PcsY:PUed_KDNwP0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lo2UPs8PcsY:PUed_KDNwP0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=lo2UPs8PcsY:PUed_KDNwP0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lo2UPs8PcsY:PUed_KDNwP0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=lo2UPs8PcsY:PUed_KDNwP0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=lo2UPs8PcsY:PUed_KDNwP0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/11/nanowrimo-day-3.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-887266914827749408</guid><pubDate>Thu, 03 Nov 2011 01:03:00 +0000</pubDate><atom:updated>2011-11-02T21:03:39.549-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">personal</category><category domain="http://www.blogger.com/atom/ns#">nanowrimo</category><category domain="http://www.blogger.com/atom/ns#">writing</category><title>NaNoWriMo: Day 2</title><description>&lt;blockquote class="tr_bq"&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
I love how the story is revealing itself. I am not planning much, but
 many possibilities are popping into my head as I start to make 
connections in the story. Partly i wonder if i should avoid them, maybe 
they are too obvious since i thought of them just from what i’ve 
written? I don’t know. I’ll probably run with it, I need the material, 
after all.&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
What &lt;i&gt;is&lt;/i&gt; Roshyn after, anyway?&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Daily Goal: 1666&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Today: 2028&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Total: 4038&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining: 45962&lt;/div&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining Daily: 1584&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;from my &lt;a href="http://ironfroggy.tumblr.com/post/12265147926/nanowrimo-day-2"&gt;Tumblr post &lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-887266914827749408?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=iB8qxJnK0Sw:dszPjGqrqF4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=iB8qxJnK0Sw:dszPjGqrqF4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=iB8qxJnK0Sw:dszPjGqrqF4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=iB8qxJnK0Sw:dszPjGqrqF4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=iB8qxJnK0Sw:dszPjGqrqF4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=iB8qxJnK0Sw:dszPjGqrqF4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=iB8qxJnK0Sw:dszPjGqrqF4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/11/i-love-how-story-is-revealing-itself.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-207038471463406029</guid><pubDate>Wed, 02 Nov 2011 01:56:00 +0000</pubDate><atom:updated>2011-11-01T21:56:49.752-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">personal</category><category domain="http://www.blogger.com/atom/ns#">nanowrimo</category><category domain="http://www.blogger.com/atom/ns#">writing</category><title>NaNoWriMo: Day 1</title><description>&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
I started my novel. I hate the first thousand words, which were just 
meandering and going no where. I stumbled on something interesting for 
the second thousand. &lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Daily Goal: 1666 &lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Today: 2010 &lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Total: 2010 &lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining: 47,990 &lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Remaining Daily: 1600&lt;/blockquote&gt;
&lt;blockquote class="tr_bq" style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;
Today
 was a Good Writing Day. Even though I could not write in the morning, 
and only was able to get 300 words on the bus, I still finished out 
ahead.&lt;/blockquote&gt;
&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size: x-small;"&gt;from my &lt;a href="http://ironfroggy.tumblr.com/post/12223543339/nanowrimo-day-1"&gt;Tumblr post &lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-207038471463406029?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=8TU6aJw7saM:bX187xldsc0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=8TU6aJw7saM:bX187xldsc0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=8TU6aJw7saM:bX187xldsc0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=8TU6aJw7saM:bX187xldsc0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=8TU6aJw7saM:bX187xldsc0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=8TU6aJw7saM:bX187xldsc0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=8TU6aJw7saM:bX187xldsc0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/11/nanowrimo-day-1.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-2814633705263992302</guid><pubDate>Tue, 01 Nov 2011 03:04:00 +0000</pubDate><atom:updated>2011-10-31T23:04:43.673-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">personal</category><category domain="http://www.blogger.com/atom/ns#">nanowrimo</category><category domain="http://www.blogger.com/atom/ns#">writing</category><title>NaNoWriMo: Day 0</title><description>&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="background-color: white; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I have signed up for NaNoWriMo 2011 with a novel draft I’ll be writing named &lt;i&gt;The Compass and The Leash&lt;/i&gt;. I’ll make some notes here each day as I go.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;div style="text-align: right;"&gt;
Mirrored from&amp;nbsp;my &lt;a href="http://ironfroggy.tumblr.com/post/12184669964/nanowrimo-day-0"&gt;Tumblr post&lt;/a&gt;&lt;/div&gt;
&lt;/span&gt;&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-2814633705263992302?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=CqAOtsv1aNA:44sbA3OjBX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=CqAOtsv1aNA:44sbA3OjBX8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=CqAOtsv1aNA:44sbA3OjBX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=CqAOtsv1aNA:44sbA3OjBX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=CqAOtsv1aNA:44sbA3OjBX8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=CqAOtsv1aNA:44sbA3OjBX8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=CqAOtsv1aNA:44sbA3OjBX8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/10/nanowrimo-day-0.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-7410513515462570894</guid><pubDate>Wed, 21 Sep 2011 12:32:00 +0000</pubDate><atom:updated>2011-09-21T08:32:31.890-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><title>0x0002 Dev Diaries - JS Privates</title><description>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;A little experiment / toy I have, which I might use to keep some decoupling attempts straight.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/Kx8kW/1/embedded/" style="height: 300px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Using this, I'll be able to allow the various components to maintain properties on other objects they work with, safely, without interfering with one another.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;For example, I have a Draggable behavior that can be enabled in a scene and allows objects in the scene to be, obviously, draggable. During this use, the behavior code may often need to set properties on the objects to track dragging state, but needs to do so without interfering with other behaviors setting properties of their own, even other instances of the same behavior. This simple utility enables this.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;privates(this, entity).dragPath = [];&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;privates(this, entity).dragPath.push(curPos);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;drawPath(privates(this, entity).dragPath);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The concept this is trying to express is that the first object owns a set of private properties attached to the second object, and this works much like private attributes in many languages but works with delegation and composition, rather than&amp;nbsp;inheritance.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My rendering system will be using this to take the general description of a sprite object and attach to it loaded images, animation state, and flags needed to manage redraw orderings, without mucking in the namespace of the object itself.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-7410513515462570894?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ac5aFweN3Hg:UE5g7LLOU7g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ac5aFweN3Hg:UE5g7LLOU7g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ac5aFweN3Hg:UE5g7LLOU7g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Ac5aFweN3Hg:UE5g7LLOU7g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ac5aFweN3Hg:UE5g7LLOU7g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ac5aFweN3Hg:UE5g7LLOU7g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Ac5aFweN3Hg:UE5g7LLOU7g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/09/0x0002-dev-diaries-js-privates.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-1071040157224692484</guid><pubDate>Mon, 19 Sep 2011 03:04:00 +0000</pubDate><atom:updated>2011-09-18T23:04:43.239-04:00</atom:updated><title /><description>New post on my game development progress.&lt;br /&gt;
&lt;blockquote&gt;
I've been tinkering on a small Javascript and Canvas engine for the last few weeks, and I'm mostly happy with the results, if not as happy with the progress. Still, it has been steady, so I'll focus on being happy for that part.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
I'm starting to split the codebase into two parts: a javascript utility library, very similar to backbone.js, and the game engine on top of it.&lt;/blockquote&gt;
&lt;a href="http://pantechnoco-game-dev.blogspot.com/2011/09/0x0001-dev-diaries-entities-events.html"&gt;Read the full post&lt;/a&gt;&lt;br /&gt;
&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-1071040157224692484?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/09/new-post-on-my-game-development.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-3923155969373778819</guid><pubDate>Sat, 02 Jul 2011 03:20:00 +0000</pubDate><atom:updated>2011-07-01T23:20:25.723-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">journalapp</category><category domain="http://www.blogger.com/atom/ns#">announcement</category><title>Announcement: JournalApp 2.0 is Live</title><description>My Month-Project for June 2011 was the 2.0 release of the JournalApp tool I built during PyCon. I'm going to give a quick overview here, but I really hope anyone with the least bit of interest in what I do will go and look for themselves. I also think you should give it a try, but I don't think its for everyone. I think there are ways to sort your thoughts that work for us and we have different methods that will work best for us. This works best for me. If it works for you, great. If not, I hope you find something for you.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can try it out now at &lt;a href="http://gojournalapp.com/"&gt;GoJournalApp.com&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The easiest way for me to summarize it is to just copy-paste the help page right here.&lt;/div&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;Write.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;
Write&amp;nbsp;&lt;span class="tag" style="color: #80d080;"&gt;#awesome&lt;/span&gt;&amp;nbsp;things and tag use hashtags to find them later.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;Find things by hashtag by typing only the tags you want to search.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&lt;code&gt;#likethis&lt;/code&gt;&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;
Have something to do?&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&lt;span class="label" style="color: grey; text-transform: uppercase;"&gt;TODO:&lt;/span&gt;&amp;nbsp;write todo's in your entries.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="label" style="color: grey; text-transform: uppercase;"&gt;DONE:&lt;/span&gt;&amp;nbsp;and click them to check them off.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="label" style="color: grey; text-transform: uppercase;"&gt;ALSO:&lt;/span&gt;&amp;nbsp;notice you can use "todo" or&amp;nbsp;&lt;i&gt;any&lt;/i&gt;&amp;nbsp;word you want.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;
Like searching for tags, you can also search for todo items, or whatever word you used. You can even mix them with hashtags! Here's how I find a list of books i want to read.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&lt;code&gt;#reading book:&lt;/code&gt;&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&amp;nbsp;Finally, while you are searching,&amp;nbsp;&lt;/span&gt;&lt;i style="font-family: Cantarell, ariel, serif;"&gt;anything&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&amp;nbsp;you write gets the current hashtags automagically&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;&amp;nbsp;You can use this to create separate notebooks, topics, or any other way you want to organize.&lt;/span&gt;&lt;/blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: Cantarell, ariel, serif;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-3923155969373778819?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1SjCnfh8y-g:3rkuuRAQeK4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1SjCnfh8y-g:3rkuuRAQeK4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1SjCnfh8y-g:3rkuuRAQeK4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=1SjCnfh8y-g:3rkuuRAQeK4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1SjCnfh8y-g:3rkuuRAQeK4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=1SjCnfh8y-g:3rkuuRAQeK4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=1SjCnfh8y-g:3rkuuRAQeK4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/07/announcement-journalapp-20-is-live.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-6347812192471762678</guid><pubDate>Wed, 29 Jun 2011 03:08:00 +0000</pubDate><atom:updated>2011-06-28T23:08:12.434-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>Of Auto-Authenticating URLs, Shortlinks, and Danger</title><description>The road to hell is paved with good intentions, they say.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, it was a good intention when someone (not me) decided to install a link shortener and send password reset links through it, before producing the printed newsletters that would be sent out to individual members. They would need to type the URLs in by hand, so a shorter URL was a good idea. At least, it must have seemed like it, at the time.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Today I took a look at this system, which I was asked to clean up before it gets used again after several months of being ignored. I admit it didn't click in my mind immediately, but after producing some newsletter content in our staging system and verifying the shortlinks were being recorded properly, it suddenly jumped out of the screen and bit me on the nose:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;The shortener was producing sequential links for a bunch of password reset links.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
What this meant in practical terms is that two newsletters sent out with password reset links for two different users would send them URLs like http://foo.com/z1 and http://foo.com/z2 and while these were very short for the user to type in they were not &lt;i&gt;easy&lt;/i&gt;&amp;nbsp;to type in, if you require "correctly" as part of the measurement of how easy it is. They are so short and the space so condensed that mistyping won't get you a 404, but someone else's entirely valid password reset link. This is terrible. There is a reason password resets give you links with long randomized sequences of characters, and all of those reasons were being thrown out the window.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Turns out, a shortened URL can be &lt;i&gt;too&lt;/i&gt;&amp;nbsp;short.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-6347812192471762678?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ars8ckAJbzs:iEhyUdXMxoU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ars8ckAJbzs:iEhyUdXMxoU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ars8ckAJbzs:iEhyUdXMxoU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Ars8ckAJbzs:iEhyUdXMxoU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ars8ckAJbzs:iEhyUdXMxoU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Ars8ckAJbzs:iEhyUdXMxoU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Ars8ckAJbzs:iEhyUdXMxoU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/06/of-auto-authenticating-urls-shortlinks.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-7219524926859975473</guid><pubDate>Tue, 28 Jun 2011 01:58:00 +0000</pubDate><atom:updated>2011-06-27T21:58:15.637-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">productivity</category><category domain="http://www.blogger.com/atom/ns#">organization</category><category domain="http://www.blogger.com/atom/ns#">review</category><title>A tale of three TODO products</title><description>I'm the kind of guy that hates the amount of time he spends considering, evaluating, and test driving new productivity software. Recently I had yet another surge of uncertainty over my use of Remember The Milk, and I tried a few other things. I gave a spin on Nozbe and Todo.txt, and I've come to a conclusion.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;For now...&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
I have been a big fan of Remember The Milk, and I pay for a professional account. Even still, I'm not above admitting I might be wrong, so when a few things started to annoy me I sought out something new. I had heard Todo.txt talked up a lot on This Week in Google, given that the author is a host on the show. I had also tried Nozbe in the past, but new it had several large updates since then and wanted to give it another try.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Remember The Milk&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I really was happy with RTM, so I want to make clear the things I do like about it! I really have been happy with the Android app, and with the use of smart lists to create filters that match different contexts I want to work in. Here is the corner stone of my smart lists, which I combine with several others:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="color: #575757; font-family: verdana, arial, helvetica, sans-serif; font-size: 11px; line-height: 15px;"&gt;(dueBefore:"tomorrow midnight" OR (due:never AND tag:next) ) OR (dueWithin:"1 month of today" AND tag:bill) OR (tag:writing AND dueWithin:"1 week of today") OR (tag:sticky)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This means "Everything with a due date that is today or already passed, or without a due date marked to be done next, or due within the next month and is a bill, or is something i need to write within the next week, or is tagged 'sticky'" and I can update this as need be, and other lists that use it adjust themselves. What this lets me do is set due dates in the future and hide the items until they become important, so it works great for setting my todo list for work and to see a condensed set of things I should focus on each day.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, what was getting on my nerves? What I haven't gotten to feel right is a small and loose set of tasks that I want to do in order, and so only one is relevant at a time. Good example is a book series. I need to maintain next tags on items right now, and that isn't terrible, but automation is great. What I feel would be nice is a tool where lists were super light and throw-away and only the top item on the list was included in the main view, as a "Next Action". Yes, that is a GTD thing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Todo.txt&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I can't say the idea of keeping everything in a file I own isn't appealing, it is. I was able to customize the sorting command and some filtering options so I could kind of do a thing like the next actions I talked about before, and I could see the first thing in each context I've defined when I list my tasks. But, that flexibility kind of vanishes when I use the android app, so while it is very cool that it just syncs my local file via Dropbox, it also means that I can only customize half my experience, which kind of just makes the android half feel worse. At least my smart lists work in RTM's android app.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Nozbe&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The most appealing feature here is an actual support for next actions. With any list, anything marked as a next action is easily accessible and the main view will show me only one next action for each list and will show me the next one when I complete the current. That's great. However, lists are not cheap. As in, I need to pay to get more than 5, and it costs more than RTM. I did not feel that I can create them willy nilly, which meant I felt confined. Nice app, and an integration with evernote that I will never use, even though I am an evernote user. Better luck next time.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I've returned to Remember The Milk. I should focus on doing, more than what to be doing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://freelanceswitch.com/wp-content/uploads/2011/06/FF213_GettingThingsDone.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://freelanceswitch.com/wp-content/uploads/2011/06/FF213_GettingThingsDone.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #646060; font-family: Arial, Helvetica, sans-serif; line-height: 20px;"&gt;&lt;h1 style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #33312a; font-family: Helvetica, Arial, sans-serif; font-style: inherit; letter-spacing: -1px; line-height: 44px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 20px; padding-left: 0px; padding-right: 110px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;a href="http://freelanceswitch.com/freelance-freedom/freelance-freedom-213-getting-things-done/"&gt;Freelance Freedom #213: Getting Things Done&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-7219524926859975473?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=F3C7ixpqfvY:zO4XyH7O38s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=F3C7ixpqfvY:zO4XyH7O38s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=F3C7ixpqfvY:zO4XyH7O38s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=F3C7ixpqfvY:zO4XyH7O38s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=F3C7ixpqfvY:zO4XyH7O38s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=F3C7ixpqfvY:zO4XyH7O38s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=F3C7ixpqfvY:zO4XyH7O38s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/06/tale-of-three-todo-products.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-7971987656395727813</guid><pubDate>Mon, 27 Jun 2011 12:54:00 +0000</pubDate><atom:updated>2011-06-27T08:54:28.780-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">twisted</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Relearning Twisted.web</title><description>I want to use Twisted.web for some projects, and I haven't used it in years. I'm relearning and I feel like a novice all over again, as I should, given the years that have passed since I have seriously looked at any twisted code. I miss it, very much. Want to relearn or learn for the first time? I can't stress enough the excellence of a quick pass through the examples of &lt;a href="http://twistedmatrix.com/documents/10.1.0/web/howto/web-in-60/index.html"&gt;Twisted.web in 60 Seconds&lt;/a&gt;. Go through those immediately. Afterwards, I &lt;a href="http://twistedmatrix.com/~glyph/sphinx-preview-11.0pre1/projects/web/howto/twisted-templates.html"&gt;read up&lt;/a&gt; on the new twisted.web.template, which is based on the Nevow templates I worked with so long-feeling ago, and I'm pretty happy with what I see there. I'm wondering how well it will produce HTML5 compliant markup, not that it is very strict, but it looks pretty clear.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
My brain still thinks in&amp;nbsp;asynchronous&amp;nbsp;operations and I constantly have to unravel those thoughts and figure out how to express them, non-ideally, in a synchronous workflow. This is becoming tiring, and while I don't plan on leaving Django, I do plan on giving my brain a rest. Maybe I'll find a way to combine my two interests in the near future...&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is the result of the hour I spent relearning last night.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;
import time&lt;/code&gt;&lt;/div&gt;
&lt;code&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;
&lt;code&gt;
&lt;div&gt;
from twisted.web.server import Site, NOT_DONE_YET&lt;/div&gt;
&lt;div&gt;
from twisted.web.static import File&lt;/div&gt;
&lt;div&gt;
from twisted.web.resource import Resource&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
from twisted.internet import reactor&lt;/div&gt;
&lt;div&gt;
from twisted.internet.defer import Deferred&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
class ClockPage(Resource):&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;isLeaf = True&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;def render_GET(self, request):&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d = Deferred()&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@d.addCallback&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def _(r):&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.write("&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;%s&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;" % (r,))&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.finish()&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def get_time(r):&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d.callback(time.ctime())&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;reactor.callLater(2, get_time, None)&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return NOT_DONE_YET&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
resource = ClockPage()&lt;/div&gt;
&lt;div&gt;
factory = Site(resource)&lt;/div&gt;
&lt;div&gt;
reactor.listenTCP(8888, factory)&lt;/div&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;
&lt;code&gt;
reactor.run()
&lt;/code&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-7971987656395727813?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Pw77TnAmvvc:msaV6tdSmeY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Pw77TnAmvvc:msaV6tdSmeY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Pw77TnAmvvc:msaV6tdSmeY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Pw77TnAmvvc:msaV6tdSmeY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Pw77TnAmvvc:msaV6tdSmeY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Pw77TnAmvvc:msaV6tdSmeY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Pw77TnAmvvc:msaV6tdSmeY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/06/relearning-twistedweb.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-4513434803164389528</guid><pubDate>Tue, 14 Jun 2011 03:45:00 +0000</pubDate><atom:updated>2011-06-13T23:45:09.968-04:00</atom:updated><title>Windows 8, HTML5 Applications, and Bitching, Moaning, Whiny Developers</title><description>I have a great idea, Windows developers: stop being a big bag of whiny bullshit. Oh my god, you have yet another optional API in your toolbox, if you want to use it. Oh no! It's based on scary web thingies you haven't used before! Guess what? COM was new and scary, and so was Win32, and so was .Net and WFC and DirectX and everything else Redmond is spat at your feet to walk on our praise, at your discretion, for the last several decades. You're making a big whiny fuss because you have one more optional API to use, for a novelty new feature that has obvious merits, but is so obviously &lt;i&gt;not&lt;/i&gt;&amp;nbsp;the entire picture of Windows 8 that your overt and public cry-fest would be laughable if it was even remotely believable. I refuse to accept that the host of Windows developers is really buying into the bullshit story that everything in the history of Windows is getting swept under the rug and replaced by this, that everything is immediately an old, festering legacy API with legacy applications waiting to collect dust on Balmer's bookshelf. Not a god damn chance. They didn't rewrite Word on top of .Net, and they aren't going to rewrite it for HTML5, either. They're going to integrate a lot of things the Internet Explorer 9 platform provides into the new Operating System and they're going to do some fun looking features and make a great effort. Hell, it might even be a Decent Product! But you know what it isn't going to be? It isn't going to be made from scratch biscuits from grandma's secret recipe. No. This is going to be hamburger helper with some basil tossed in, so the cook feels fancy. Learn a little Javascript, because you've got so many things under your belt already that one more language isn't going to make much of a difference, so live a little and see what its all about. Make a fun little touch-based windows 8 application and impress your friends, and then get back to your job where you'll write version 17 of whatever corporate tax audit tool you've been maintainer for the last twenty years. When someone suggests rewriting it for Windows 8, giggle with your friends while one of the managers mentions that most the customers are still migrating off Windows XP and IE6, and move on to getting some real work done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-4513434803164389528?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Cvs2c7AKwo8:okx4EqKLD-g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Cvs2c7AKwo8:okx4EqKLD-g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Cvs2c7AKwo8:okx4EqKLD-g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Cvs2c7AKwo8:okx4EqKLD-g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Cvs2c7AKwo8:okx4EqKLD-g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Cvs2c7AKwo8:okx4EqKLD-g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Cvs2c7AKwo8:okx4EqKLD-g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/06/windows-8-html5-applications-and.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-923974700823713638</guid><pubDate>Sun, 12 Jun 2011 13:23:00 +0000</pubDate><atom:updated>2011-06-12T09:23:52.244-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">node.js</category><category domain="http://www.blogger.com/atom/ns#">funny</category><title>Node.js Conference</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://i.imgur.com/0p0o5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://i.imgur.com/0p0o5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
[via &lt;a href="http://www.reddit.com/r/programming/comments/hxq6u/nodejs_conference/"&gt;reddit/r/programming&lt;/a&gt;]&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I would attend such a conference.&lt;/div&gt;
&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-923974700823713638?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=7IiqQBNc_7g:njEakifX0Fk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=7IiqQBNc_7g:njEakifX0Fk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=7IiqQBNc_7g:njEakifX0Fk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=7IiqQBNc_7g:njEakifX0Fk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=7IiqQBNc_7g:njEakifX0Fk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=7IiqQBNc_7g:njEakifX0Fk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=7IiqQBNc_7g:njEakifX0Fk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/06/nodejs-conference.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-8105336327954839354</guid><pubDate>Mon, 30 May 2011 01:22:00 +0000</pubDate><atom:updated>2011-05-29T22:11:49.635-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">announcement</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>ANNOUNCE: Hashtrack.js 0.2</title><description>Hashtrack.js 0.2 includes a number of bug fixes and enhancements, and I'd like to start doing official releases that really show off what the tool is capable of. I've been using this for a few years in projects both personal and professional, and I always merge improvements back into it. Hopefully, I can start making an effort to polish it up better, because in this day and age we all are finding ourselves in need of stateful web applications, and we need to handle this gracefully.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Take a look at the &lt;a href="http://github.com/ironfroggy/hashtrack/"&gt;github repo&lt;/a&gt; for hashtrack if you like the sample code below, or take a look at the very sparse but &lt;a href="http://ironfroggy.github.com/hashtrack/"&gt;informative docs&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt; hashtrack.onhashvarchange("background", function (value) {
     $('body').css('background', value);
 }, true);&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt; -----&lt;/pre&gt;
&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt; &amp;lt;a href="#?background=green"&amp;gt;Make the background green&amp;lt;/a&amp;gt;&lt;/pre&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-8105336327954839354?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=3CO27UO8rPE:JTc-56jYXOM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=3CO27UO8rPE:JTc-56jYXOM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=3CO27UO8rPE:JTc-56jYXOM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=3CO27UO8rPE:JTc-56jYXOM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=3CO27UO8rPE:JTc-56jYXOM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=3CO27UO8rPE:JTc-56jYXOM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=3CO27UO8rPE:JTc-56jYXOM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/05/announcement-hashtrackjs-02.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-8521383894009907278</guid><pubDate>Mon, 02 May 2011 01:06:00 +0000</pubDate><atom:updated>2011-05-01T21:06:00.982-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcement</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>ANNOUNCE: straight.plugin - A simple plugin loader for Python 2.7 - 3.2</title><description>Tonight I uploaded straight.plugin 1.1 to the Python Package Index. This release includes a new loader, straight.plugin.loaders.ClassLoader and adds an subclasses parameter to the simple load() API to invoke class loading, opposed to the default module loading. The classes are filtered by type and are looked up in the same modules that would be loaded by the ModuleLoader available in straight.plugin 1.0. This release has been testing on Python 2.7 and 3.2.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can check out the &lt;a href="https://github.com/ironfroggy/straight.plugin"&gt;source at github&lt;/a&gt; or the &lt;a href="http://pypi.python.org/pypi/straight.plugin/1.1"&gt;packages at PyPI&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-8521383894009907278?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=9fo4hpw0TdY:38_Xkq17EWc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=9fo4hpw0TdY:38_Xkq17EWc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=9fo4hpw0TdY:38_Xkq17EWc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=9fo4hpw0TdY:38_Xkq17EWc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=9fo4hpw0TdY:38_Xkq17EWc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=9fo4hpw0TdY:38_Xkq17EWc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=9fo4hpw0TdY:38_Xkq17EWc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/05/announce-straightplugin-simple-plugin.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-8233814356957537307</guid><pubDate>Mon, 07 Mar 2011 11:48:00 +0000</pubDate><atom:updated>2011-03-07T06:48:12.078-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">pycon</category><category domain="http://www.blogger.com/atom/ns#">pycon11</category><title>How To Attend Pycon 2011</title><description>Short announcement:&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I &lt;i&gt;will&lt;/i&gt;&amp;nbsp;be at Pycon this year. Also, that Saturday, March 12, &lt;i&gt;is&lt;/i&gt;&amp;nbsp;my birthday.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
See you there!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-8233814356957537307?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=5WAE87w1pZs:uRcMRs-x8o8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=5WAE87w1pZs:uRcMRs-x8o8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=5WAE87w1pZs:uRcMRs-x8o8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=5WAE87w1pZs:uRcMRs-x8o8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=5WAE87w1pZs:uRcMRs-x8o8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=5WAE87w1pZs:uRcMRs-x8o8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=5WAE87w1pZs:uRcMRs-x8o8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/03/how-to-attend-pycon-2011.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-4113611078662984555</guid><pubDate>Sun, 13 Feb 2011 02:23:00 +0000</pubDate><atom:updated>2011-02-12T21:23:37.988-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><title>Django: How to hook in after multiple M2M have been processed</title><description>This situation comes up, from time to time, when we need to get something to happen after a many-to-many field is changed. The novice will connect a post_save signal and scratch his head when it doesn't fire on the addition or removal of items in the ManyToManyField. We all learn that it takes a slightly more complicated signal, the &lt;a href="http://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed"&gt;m2m_changed signal, and its many actions&lt;/a&gt;, which tell us exactly what has changed in the particular field sending it (the signal comes from the field's through table, to be exact).&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Well, a slightly more complicated case arose in a design today and I was scratching my head and feeling like a novice all over again. You see, I needed to know when new things had been adding to such a field, but I had more than one. In fact, I had four of them. I needed a specific function called on the instance when all of these fields were finished being cleared or added to or subtracted from. This was in a form in the Django admin.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thankfully I had an assumption I could make this easier with: the fields in question would only be set from the admin interface. With this knowledge in hand, I hopped into the app's admin.py and I added these methods:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;def response_change(self, request, obj):&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response = super(MyAdmin, self).response_change(request, obj)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;obj.do_thing()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;def response_add(self, request, obj, *args, **kwargs):&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response = super(MyAdmin, self).response_add(request, obj, *args, **kwargs)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;obj.do_thing()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response&lt;br /&gt;
&lt;br /&gt;
These get called when the admin interface is used to edit and create a new object, respectively. It happens &lt;i&gt;after&lt;/i&gt;&amp;nbsp;both the model instance itself and all of the many-to-many fields have been saved, which is exactly what we need. It works, but I wish I could find a better solution.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-4113611078662984555?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Aj4IqPmwd9I:sQqFF2s3Uf0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Aj4IqPmwd9I:sQqFF2s3Uf0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Aj4IqPmwd9I:sQqFF2s3Uf0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Aj4IqPmwd9I:sQqFF2s3Uf0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Aj4IqPmwd9I:sQqFF2s3Uf0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=Aj4IqPmwd9I:sQqFF2s3Uf0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=Aj4IqPmwd9I:sQqFF2s3Uf0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/02/django-how-to-hook-in-after-multiple.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-8841867975385947965</guid><pubDate>Wed, 12 Jan 2011 02:15:00 +0000</pubDate><atom:updated>2011-01-11T21:15:56.561-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">database</category><category domain="http://www.blogger.com/atom/ns#">postgresql</category><title>How To Speed Up Django Tests on Postgresql</title><description>I had a problem with a Django project that took forever to run its unit tests. The test database took an enormous amount of time to run, upwards of ten to fifteen minutes each. I didn't have a lot of ways around this, because I had to use a base Model that pulled in lots of cascading requirements and I couldn't avoid the dozens of applications it needed to build tables for. This was really hindering my ability to develop, as I rely heavily on constantly running tests in my own pathetic attempt at Continuous Integration.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After some poking around the PG forums, I eventually worked out this script, which I now run on startup.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;code&gt;#!/usr/bin/env bash&lt;/code&gt;&lt;br /&gt;&lt;code&gt;service postgresql stop&lt;/code&gt;&lt;div&gt;&lt;code&gt;mount -t tmpfs -o size=500m tmpfs /mnt/pg_data_mem/&lt;/code&gt;&lt;br /&gt;&lt;code&gt;cp -R /var/lib/postgresql/8.4/main/ /mnt/pg_data_mem/&lt;/code&gt;&lt;br /&gt;&lt;code&gt;mount --bind /var/lib/postgresql/8.4/main/pg_xlog /mnt/pg_data_mem/main/pg_xlog&lt;/code&gt;&lt;br /&gt;&lt;code&gt;chown -R postgres:postgres /mnt/pg_data_mem/&lt;/code&gt;&lt;br /&gt;&lt;code&gt;sudo -u postgres /usr/lib/postgresql/8.4/bin/pg_resetxlog -f /mnt/pg_data_mem/main/service postgresql start&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I also set &lt;code&gt;data_directory = '/mnt/pg_data_mem/main'&lt;/code&gt; in postgresql.conf.&lt;br /&gt;&lt;br /&gt;This works in development, where I don't need my DB to persist between reboots. If I did want to keep it around, I could just copy from &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/mnt/pg_data_mem/main/&lt;/span&gt; to &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/var/lib/postgresql/8.4/main/&lt;/span&gt; and keep it on disc. For now, my one-way solution works.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-8841867975385947965?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=v4HdHmpfvGI:pjjteekcgBo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=v4HdHmpfvGI:pjjteekcgBo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=v4HdHmpfvGI:pjjteekcgBo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=v4HdHmpfvGI:pjjteekcgBo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=v4HdHmpfvGI:pjjteekcgBo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=v4HdHmpfvGI:pjjteekcgBo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=v4HdHmpfvGI:pjjteekcgBo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/01/how-to-speed-up-django-tests-on.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21332048.post-5157071375680587088</guid><pubDate>Mon, 03 Jan 2011 03:12:00 +0000</pubDate><atom:updated>2011-01-02T22:12:04.576-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">programming python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Soft Announcement: Trapdoor Prototype</title><description>Previously I made a &lt;a href="http://techblog.ironfroggy.com/2010/12/how-to-tease-everyone-on-christmas.html"&gt;little preview&lt;/a&gt; of something I'm announcing today, but it is a soft announcement as I've had it on github for some time, but I haven't done anything with the project.&lt;data:post.title&gt;&lt;/data:post.title&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is just a prototype, an experiment, and it is called Trapdoor. I don't remember why I named it Trapdoor.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Trapdoor has a simple concept, along the lines of Mozilla Prism. I wanted to take things I use to build web applications and test how they could be applied to building desktop applications. This meant two things:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) I need to wrap up a web application in something that can be run locally.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
2) I need some way to extend a web application in ways that normally only desktop applications can provide.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This has been done in the simplest way I could find, at the time, and is &lt;a href="https://github.com/ironfroggy/trapdoor"&gt;available on github&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 11px; line-height: 14px;"&gt;&lt;pre style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div class="line" id="LC1" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;extensions&lt;/span&gt;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC2" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&amp;nbsp;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;calculator.Calculator&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC3" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;js&lt;/span&gt;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC4" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&amp;nbsp;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;calculator.js&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC5" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;plugins&lt;/span&gt;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC6" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;
&amp;nbsp;&lt;span class="p-Indicator" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;trapdoor.contrib.windowmanager&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Applications are configured through this simply manifest, where they are given extensions, plugins, and javascript. Honestly, extensions and plugins can probably be merged. They are both defined by a Python class and the object exposes methods to the Javascript, which gets loaded and initialized by the runtime. The current version includes two plugins:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;trapdoor.contrib.windowmanager&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is a basic plugin that provides a simple createWindow method, through which the Javascript can create new windows with (in the future) more control than the standard Javascript APIs would otherwise provide. One thing I'll be adding to this is a fullscreen API and other properties to control the window&amp;nbsp;appearance, such as borders and which controls are visible.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;trapdoor.contrib.nodes&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
This is my favorite of the two standard plugins. Each Node is an isolated Javascript runtime, in its own global space. The application is loaded in the first node, but it can create and initialize others, allowing it to run untrusted Javascript safely. If I continue development, I hope to use this to test ways to allow community additions to software without worrying about what they are running. This is similar to how extensions and user scripts work in Firefox and Chrome.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, I don't know if more will come of this. I think, if it does, it should probably be evaluated if I should rewrite it based on Chromium and V8, rather than Qt and whatever Javascript engine it is running on. It is also lacking a solid use case, for me, that I can use to drive my desire to improve it. However, I had fun writing it for the thought experiment, and I do hope to do more with it in the near future.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Please, fork it and tell me what you think.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21332048-5157071375680587088?l=techblog.ironfroggy.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=rBp6LsoGlkI:aDmsg9bBy_U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=rBp6LsoGlkI:aDmsg9bBy_U:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=rBp6LsoGlkI:aDmsg9bBy_U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=rBp6LsoGlkI:aDmsg9bBy_U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=rBp6LsoGlkI:aDmsg9bBy_U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RavingTechnoRant?a=rBp6LsoGlkI:aDmsg9bBy_U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RavingTechnoRant?i=rBp6LsoGlkI:aDmsg9bBy_U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://techblog.ironfroggy.com/2011/01/soft-announcement-trapdoor-prototype.html</link><author>noreply@blogger.com (Calvin Spealman)</author><thr:total>1</thr:total></item></channel></rss>

