<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>annema.me feed</title><link>http://www.annema.me/blog/feed</link><description>Blog posts on annema.me</description><lastBuildDate>Thu, 23 Feb 2012 17:18:01 GMT</lastBuildDate><generator>PyRSS2Gen-1.0.0</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/annemame" /><feedburner:info uri="annemame" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Changes to AppEngine's _from_entity</title><link>http://feedproxy.google.com/~r/annemame/~3/uILIn6l2PaI/changes-to-appengines-_from_entity</link><description>&lt;p&gt;Both my blog and Enstore experienced a serious outage today. This was caused by a recent change to how App Engine initializes entities. The error was:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;BadArgumentError: Cannot use key and key_name at the same time with different values
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A common trick to detect wether an entity is loaded from datastore or not is to check &lt;code&gt;if kwargs.get('_from_entity') == True:&lt;/code&gt; in the models &lt;code&gt;__init__&lt;/code&gt; method. Before today's change _from_entity was a bool argument and this code worked perfectly. Today's change made _from_entity a dictionary containing the entities' properties and values. Because of this the explicit check for &lt;code&gt;True&lt;/code&gt; returned &lt;code&gt;False&lt;/code&gt; and both Enstore and this blog started returning 500 errors.&lt;/p&gt;
&lt;p&gt;The issues were resolved by changing :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;`&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;_from_entity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;`
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;to: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;`&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;_from_entity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;`&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/uILIn6l2PaI" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2011/9/8/changes-to-appengines-_from_entity</guid><pubDate>Thu, 08 Sep 2011 15:49:11 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2011/9/8/changes-to-appengines-_from_entity</feedburner:origLink></item><item><title>The future</title><link>http://feedproxy.google.com/~r/annemame/~3/S2HDtw0DcKE/the-future</link><description>&lt;p&gt;Most of you probably already know, but for those who don’t; the company I work at, &lt;a href="http://www.madebysofa.com"&gt;Sofa&lt;/a&gt; was acquired by &lt;a href="http://www.madebysofa.com/blog/facebook-acquires-sofa/"&gt;Facebook&lt;/a&gt;. For reasons I can’t disclose I was not part of the acquisition.&lt;/p&gt;
&lt;p&gt;The last couple of weeks have been a very emotional and busy period. Over the course of two weeks I went from having a job I enjoyed, to moving to the Bay Area for a job at Facebook, to having no job at all. In other words my future was destroyed, recreated and destroyed again. &lt;/p&gt;
&lt;p&gt;Even though Facebook wasn’t an option, I didn’t want to waste the opportunity to move to the US. I got a ton of job offers during WWDC and I spend most of my time pursuing them trying to find a job in San Francisco.&lt;/p&gt;
&lt;p&gt;While I was interviewing at another company I got an email from Sofa’s partner in &lt;a href="http://www.checkoutapp.com"&gt;Checkout&lt;/a&gt;, &lt;a href="http://acclivitysoftware.com"&gt;Acclivity&lt;/a&gt;. They wanted me to stop by New Jersey on my way back home to talk about my future and offered me an opportunity to continue development on &lt;a href="http://www.enstore.com"&gt;Enstore&lt;/a&gt; and Checkout. Although I had set my mind on San Francisco this was an opportunity too good to pass by. &lt;/p&gt;
&lt;p&gt;I’ll be part of a newly formed NYC based company responsible for Enstore and Checkout. My wife and I will be moving to New York City as soon as my visa is arranged. Suggestions where to live, eat and spend our spare time are very welcome.&lt;/p&gt;
&lt;p&gt;In closing I would like to thank all the companies that offered me a job and all the great people that helped me out trying to find a new job! The last couple of months have been a hard and emotional period, but I’m sure the future will make up for it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/S2HDtw0DcKE" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2011/7/19/the-future</guid><pubDate>Tue, 19 Jul 2011 15:33:00 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2011/7/19/the-future</feedburner:origLink></item><item><title>My git setup</title><link>http://feedproxy.google.com/~r/annemame/~3/veQhdmZtd1g/my-git-setup</link><description>&lt;p&gt;I have been using git since I started working on Cappuccino. Over time I’ve found several useful additions to my configuration that made working with it easier.&lt;/p&gt;
&lt;h3&gt;Bash additions&lt;/h3&gt;
&lt;p&gt;While working with git it’s easy to get lost in branches, tags and commits. The bash completion script included with git helps to keep track. It's core functionality is autocompletion, but it can optionally show the current branch after your prompt.
Installation instructions are included in the file, which you can find in the git repository under &lt;code&gt;contrib/completion/&lt;/code&gt;. If you change your bash prompt to show the current branch (step 3) consider using &lt;code&gt;PS1='\h:\W'$RED'$(__git_ps1 "@%s")'$NONE'\$ '&lt;/code&gt;. It will display the current branch in red, making it much more obvious.&lt;/p&gt;
&lt;h3&gt;Aliases&lt;/h3&gt;
&lt;p&gt;Git (since version 1.4) includes support for aliasing commands. For a quick introduction see &lt;a href="https://git.wiki.kernel.org/index.php/Aliases"&gt;this&lt;/a&gt; tutorial on the git wiki.&lt;/p&gt;
&lt;p&gt;These are the aliases I currently use:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
    &lt;span class="na"&gt;co&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
    &lt;span class="na"&gt;mg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;merge&lt;/span&gt;
    &lt;span class="na"&gt;st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
    &lt;span class="na"&gt;ci&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;commit&lt;/span&gt;
    &lt;span class="na"&gt;br&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;branch&lt;/span&gt;
    &lt;span class="na"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;difftool&lt;/span&gt;
    &lt;span class="na"&gt;lg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;log --graph --pretty=format:&amp;#39;%C(bold red)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold green)&amp;lt;%an&amp;gt;%Creset&amp;#39; --abbrev-commit --date=relative&lt;/span&gt;
    &lt;span class="na"&gt;lc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;log ORIG_HEAD.. --no-merges --graph --pretty=format:&amp;#39;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset&amp;#39; --abbrev-commit --date=relative&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With the exception of &lt;code&gt;lc&lt;/code&gt; and &lt;code&gt;lg&lt;/code&gt; all my aliases are shortcuts for git commands. The &lt;code&gt;lg&lt;/code&gt; alias is a shortcut for &lt;code&gt;git log&lt;/code&gt; with custom formatting. &lt;code&gt;lc&lt;/code&gt; is the same, but it only shows the last fetched commits. While you’re adding aliases don’t forget to alias git itself as well. I’ve added the following to &lt;code&gt;~/.bash_login&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;git&amp;#39;&lt;/span&gt;
# &lt;span class="n"&gt;Make&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;autocompleton&lt;/span&gt; &lt;span class="n"&gt;work&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;
&lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;bashdefault&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;nospace&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;_git&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; 2&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;nospace&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;_git&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Editor and difftool&lt;/h3&gt;
&lt;p&gt;I’ve changed my default git editor to Textmate. This means commands that require text entry, such as commit and tag, will open Textmate. You can change the editor by running: &lt;code&gt;git config --global core.editor 'mate -w'&lt;/code&gt; or by setting the &lt;code&gt;GIT_EDITOR&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;p&gt;Lastly I’ve also changed my difftool to &lt;a href="http://www.kaleidoscopeapp.com"&gt;Kaleidoscope&lt;/a&gt;. This is easily done from Kaleidscope itself by going to the Integration in the Kaleidscope menu. If you don’t have Kaleidoscope already you can &lt;a href="http://www.approvalparty.com"&gt;currently&lt;/a&gt; buy it for a 50% discount in the &lt;a href="http://itunes.apple.com/us/app/kaleidoscope/id412622418?mt=12&amp;amp;ls=1"&gt;Mac app store&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;This is just a summary of how I configured git. If this post has whet your appetite use &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; and mix and match several setups to find &lt;em&gt;your&lt;/em&gt; perfect git setup.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/veQhdmZtd1g" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2011/4/28/my-git-setup</guid><pubDate>Thu, 28 Apr 2011 17:30:20 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2011/4/28/my-git-setup</feedburner:origLink></item><item><title>Announcing autonib2cib</title><link>http://feedproxy.google.com/~r/annemame/~3/prMzz13Fe1s/announcing-autonib2cib</link><description>&lt;p&gt;Some time ago I posted a &lt;a href="https://gist.github.com/799190"&gt;gist&lt;/a&gt; for a command line utility that automatically nib2cibs changed nibs. During the weekend I've rewritten the utility, making it more reliable with newly created nibs and nibs containing resources.&lt;/p&gt;
&lt;p&gt;I've also moved the code (all 100 lines of it) from the gist to it's own &lt;a href="https://github.com/klaaspieter/autonib2cib"&gt;github repo&lt;/a&gt;. If you have a feature request or find a bug, please &lt;a href="https://github.com/klaaspieter/autonib2cib/issues"&gt;create an issue&lt;/a&gt; or even better, a &lt;a href="https://github.com/klaaspieter/autonib2cib/pull/new/master"&gt;pull request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Take a look at the &lt;a href="https://github.com/klaaspieter/autonib2cib#readme"&gt;README&lt;/a&gt; for installation instructions. After installing you can start monitoring your nibs by running &lt;code&gt;autonib2cib &amp;lt;resource directory&amp;gt;&lt;/code&gt; in your terminal.&lt;/p&gt;
&lt;p&gt;Cappuccino has been very successful at preserving the customary 'code and refresh' workflow for web developers. However, as any developer with more than a handful of cibs knows, having to manually run nib2cib breaks this workflow. Autonib2cib will solve this problem by automating the nib2cib process.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/prMzz13Fe1s" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2011/3/15/announcing-autonib2cib</guid><pubDate>Tue, 15 Mar 2011 20:20:33 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2011/3/15/announcing-autonib2cib</feedburner:origLink></item><item><title>Improving the Cappuccino Theme System</title><link>http://feedproxy.google.com/~r/annemame/~3/5M16jMQ_UnE/improving-the-cappuccino-theme-system</link><description>&lt;p&gt;I've written about the Cappuccino theming system before&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; and I have a confession to make, I don't like the current system.&lt;/p&gt;
&lt;p&gt;Let me clarify. Being able to change every visual aspect of a view is great, but  currently it's too complex.&lt;/p&gt;
&lt;p&gt;It's complex because a it requires manual building, even during development. I should be able to make a change, refresh the browser and see the difference. Just like developing everything else on the web, including Objective-J.&lt;/p&gt;
&lt;p&gt;Objective-J itself is also part of the complexity. &lt;code&gt;setValue:forThemeAttribute:inState&lt;/code&gt; works great for small amounts of theme changes. But it becomes unreadable when changing large parts of a theme.&lt;/p&gt;
&lt;p&gt;With all the talent in the Cappuccino community I'm sure we can work around these problems with the current system. It will however not fix the biggest issue. Designers &lt;em&gt;won't&lt;/em&gt; theme as long as we're using Objective-J as our theming language.&lt;/p&gt;
&lt;p&gt;This is a huge step backwards. Designers have been able to style websites &lt;a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets#History"&gt;for years&lt;/a&gt; using CSS. I don't see why that isn't possible for (Cappuccino) web applications.&lt;/p&gt;
&lt;p&gt;Now is the time for the skeptics to say that this impossible or to hard to do. Well, as we say in Dutch, &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/index-debug.html"&gt;watch and shiver&lt;/a&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Obviously this application is a big hack, but it does show what is already possible. Imagine what we could do if we implemented this properly.&lt;/p&gt;
&lt;p&gt;In the application I use a Javascript CSS parser. This prevents the need for a separate build phase during development. When the application is ready to be deployed, the CSS can still be build into an optimized format. CSS is also a far more readable theming language and most designers already know and use it.&lt;/p&gt;
&lt;p&gt;Now to also get them to use Git.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Previous posts are &lt;a href="http://www.annema.me/blog/post/cappuccino-custom-themes"&gt;Cappuccino Custom Themes&lt;/a&gt; and &lt;a href="http://www.annema.me/blog/post/the-basics-of-cappuccino-theming"&gt;The Basics of Cappuccino Theming&lt;/a&gt;)&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/5M16jMQ_UnE" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/11/5/improving-the-cappuccino-theme-system</guid><pubDate>Fri, 05 Nov 2010 21:13:41 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/11/5/improving-the-cappuccino-theme-system</feedburner:origLink></item><item><title>Cappuccino Custom Themes</title><link>http://feedproxy.google.com/~r/annemame/~3/x9P-3YZhhck/cappuccino-custom-themes</link><description>&lt;p&gt;A while ago I wrote a blog post about &lt;a href="http://www.annema.me/blog/post/the-basics-of-cappuccino-theming"&gt;the basics of Cappuccino theming&lt;/a&gt;. Since then I've got a lot of questions about how to create fully customized themes. &lt;/p&gt;
&lt;p&gt;The first step in building your own custom theme is to create a theme descriptor. If you've built Cappuccino &lt;a href="http://github.com/280north/cappuccino/wiki/Getting-and-Building-the-Source"&gt;from source&lt;/a&gt; you can create one using the following command:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;capp&lt;/span&gt; &lt;span class="n"&gt;gen&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;ThemeDescriptor&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;BlendKit&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Theme&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you haven't installed Cappuccino from source, you can &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Cappuccino%20Theming/ThemeDescriptor.zip"&gt;download&lt;/a&gt; a default theme descriptor.&lt;/p&gt;
&lt;p&gt;You should now have a folder with the theme descriptor file, a resources directory and a Jakefile. A theme descriptor also includes a handy showcase application which you can use to preview your theme. Running the showcase is simply a matter of opening &lt;code&gt;index.html&lt;/code&gt; or &lt;code&gt;index-debug.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The showcase by default isn't very helpful, it only has an ugly button. If you open the theme descriptor you'll see the &lt;code&gt;+ (CPButton)themedButton&lt;/code&gt; class method. You can change the theme properties for a button by setting additional theme values in this method. How to change theme values is described in my previous &lt;a href="http://www.annema.me/blog/post/the-basics-of-cappuccino-theming"&gt;blog post&lt;/a&gt; about Cappuccino theming.&lt;/p&gt;
&lt;p&gt;Unfortunately theme-able properties are not documented. You'll have to take a look at Aristo's theme descriptor or check the &lt;code&gt;+ (id)themeAttributes&lt;/code&gt; method of a class and all of it's superclasses.&lt;/p&gt;
&lt;p&gt;Theming another class is done by implementing another &lt;code&gt;+(&amp;lt;Class&amp;gt;)themed&amp;lt;Class&amp;gt;&lt;/code&gt; method. If the class is initialized with a frame and some theme values it will automatically show in the theme showcase. Take a look at &lt;a href="http://github.com/280north/cappuccino/blob/master/AppKit/Themes/Aristo/ThemeDescriptors.j"&gt;Aristo's theme descriptor&lt;/a&gt; to see what you can do.&lt;/p&gt;
&lt;p&gt;The next step is building your theme. You can do this by running &lt;code&gt;jake debug&lt;/code&gt; or &lt;code&gt;jake install&lt;/code&gt; inside your theme directory. The build process will take the resources and theme descriptor and build it into a theme blend. After the build is done, the theme blend can be found in: &lt;code&gt;Build/[Configuration]/[Theme name].blend&amp;gt;&lt;/code&gt;. [Configuration] is either Debug or Release, depending on the jake argument used.&lt;/p&gt;
&lt;p&gt;The theme blend is what is needed to actually load the theme in your Cappuccino application. The easiest way to load the theme is by adding the following to your application's Info.plist:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CPDefaultTheme&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;[Theme name]&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will automatically set the custom theme as the default theme for the application. This will override Aristo (Cappuccino's default theme) and set your theme as the default for the application.&lt;/p&gt;
&lt;p&gt;If you load your application, you'll see there's an error; Cappuccino can't find your theme blend. This is because Cappuccino will look inside your application bundle's resource directory for the theme blend and it was built somewhere else. The easiest way to solve this is to symlink the theme blend inside the Resources directory. This also makes sure any changes to your theme are automatically applied in your application when you rebuild the theme.&lt;/p&gt;
&lt;p&gt;As mentioned before the previously described method of loading a Theme will completely override Aristo. If you want to use Aristo in addition to your own theme you can load the theme blend manually. The following code shows how this is done:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;applicationDidFinishLaunching:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CPNotification&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;aNotification
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CPBundle&lt;/span&gt; &lt;span class="n"&gt;mainBundle&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;blend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;CPThemeBlend&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;initWithContentsOfURL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="n"&gt;pathForResource&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&amp;lt;Theme name&amp;gt;.blend&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;blend&lt;/span&gt; &lt;span class="n"&gt;loadWithDelegate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;blendDidFinishLoading:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CPThemeBlend&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;theBlend
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Show your application and use your custom theme&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When using this method it's advisable to show your application after the blend finished loading. This way you'll never have flashes when the custom theme loads.&lt;/p&gt;
&lt;p&gt;After the blend is loaded you can apply it to any view:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CPTheme&lt;/span&gt; &lt;span class="nl"&gt;themeNamed:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Theme&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CPButton&lt;/span&gt; &lt;span class="nl"&gt;buttonWithTitle:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Custom themed button&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="nl"&gt;setTheme:&lt;/span&gt;&lt;span class="n"&gt;customTheme&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I've wrapped up both methods of theming into separate projects. Both can be downloaded &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Cappuccino%20Theming/Cappuccino%20Custom%20Themes.zip"&gt;here&lt;/a&gt;. Please let me know if you have any questions in the &lt;a href="#comment_form"&gt;comments&lt;/a&gt;.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Previous posts are &lt;a href="http://www.annema.me/blog/post/cappuccino-custom-themes"&gt;Cappuccino Custom Themes&lt;/a&gt; and &lt;a href="http://www.annema.me/blog/post/the-basics-of-cappuccino-theming"&gt;The Basics of Cappuccino Theming&lt;/a&gt;)&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/x9P-3YZhhck" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/9/16/cappuccino-custom-themes</guid><pubDate>Thu, 16 Sep 2010 19:17:35 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/9/16/cappuccino-custom-themes</feedburner:origLink></item><item><title>NSConference MINI 2010 Sessions Online</title><link>http://feedproxy.google.com/~r/annemame/~3/eZknsezIK0s/nsconference-mini-2010-sessions-online</link><description>&lt;p&gt;This year, European developers had a hard time attending the &lt;a href="http://developer.apple.com/wwdc"&gt;WWDC&lt;/a&gt;, Apple's developers conference. The announcement was to late, forcing developers to arrange an entire inter continental trip in a relative short amount of time. There was also the pretty steep price and of course it was sold out within just 8 days!&lt;/p&gt;
&lt;p&gt;Luckily the community took care of us. The Mac Developer Network hosted a mini NSConference during WWDC. Wanting to help out, I gave a talk about the &lt;a href="http://cappuccino.org"&gt;Cappuccino&lt;/a&gt; frameworks.&lt;/p&gt;
&lt;p&gt;My session and all the others given during NSConference MINI are now available at the &lt;a href="http://www.mac-developer-network.com/video/video101038.html"&gt;Mac Developer Network&lt;/a&gt; website. You can get all of the sessions in one pack for 50 dollars&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As far as I'm aware there's no way to buy individual sessions, so if you're only interested in one talk you're still going to have to pay the full sum for all the sessions.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/eZknsezIK0s" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/7/22/nsconference-mini-2010-sessions-online</guid><pubDate>Thu, 22 Jul 2010 17:46:51 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/7/22/nsconference-mini-2010-sessions-online</feedburner:origLink></item><item><title>Programmatically Scroll a UIWebView</title><link>http://feedproxy.google.com/~r/annemame/~3/Jid7Gr6exuk/programmatically-scroll-a-uiwebview</link><description>&lt;p&gt;Ever wanted to scroll a UIWebView programmatically on the iPad or iPhone? Unfortunately Apple doesn't have a public API to do this, but there is a way. A UIWebView can execute any arbitrary javascript with &lt;code&gt;stringByEvaluatingJavaScriptFromString:&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Using this method we can easily scroll a web view like so:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt; &lt;span class="nl"&gt;stringByEvaluatingJavaScriptFromString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;window.scrollTo(0.0, 100.0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It's also possible to save the scroll state of the web view through javascript:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;CGFloat&lt;/span&gt; &lt;span class="n"&gt;xOffset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;stringByEvaluatingJavaScriptFromString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;pageXOffset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;floatValue&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CGFloat&lt;/span&gt; &lt;span class="n"&gt;yOffset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;stringByEvaluatingJavaScriptFromString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;pageYOffset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;floatValue&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I've used and tested both of these methods and haven't found any bugs or weird issues. I've filed radar bug 8184256: No API for programmatically scrolling / zooming a UIWebView. It has been marked as a duplicate of radar bug 5912563.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As far as I'm aware there's no way to buy individual sessions, so if you're only interested in one talk you're still going to have to pay the full sum for all the sessions.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/Jid7Gr6exuk" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/7/15/programmatically-scroll-a-uiwebview</guid><pubDate>Thu, 15 Jul 2010 06:33:14 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/7/15/programmatically-scroll-a-uiwebview</feedburner:origLink></item><item><title>The Basics of Cappuccino Theming</title><link>http://feedproxy.google.com/~r/annemame/~3/bqUNHs_-TgA/the-basics-of-cappuccino-theming</link><description>&lt;p&gt;This is the second post of a series of posts about Cappuccino where I explain the subjects I talked about during my &lt;a href="http://www.cocoaheads.nl"&gt;CocoaHeads Amsterdam&lt;/a&gt; presentation. The first post can be found &lt;a href="http://www.annema.me/blog/post/objective-j-explained-brtoll-free-bridges"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cappuccino and Cocoa have a lot of similarities, but there are some differences. Most prominent is probably Cappuccino's theming engine. Web developers are accustomed to a certain level of customization that Cocoa does not provide. The theming engine provides this freedom to Cappuccino developers. &lt;/p&gt;
&lt;p&gt;The theming engine let's you customize any theme-able attribute of CPView. Every subclass of CPView can declare it's own theme-able attributes by implementing the &lt;code&gt;themeAttributes&lt;/code&gt; class method and returning a CPDictionary with the attribute names as keys and their default value as values.&lt;/p&gt;
&lt;h3&gt;Theme states&lt;/h3&gt;
&lt;p&gt;Before going into theming you'll have to know something about theme states. Basically every Cappuccino view has a theme state. The current theme state can be found by calling the &lt;code&gt;themeState&lt;/code&gt; method on any view.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;themeState&lt;/code&gt; method itself is not extremely useful since you'll only get a unsigned integer back, it's up to you to find the actual theme state. Far more useful is the &lt;code&gt;currentValueForThemeAttribute:&lt;/code&gt; method. This methods takes a string, the name of the theme-attribute, and returns it's current value.&lt;/p&gt;
&lt;p&gt;Changing theme states is done through the &lt;code&gt;setThemeState:&lt;/code&gt; and &lt;code&gt;unsetThemeState:&lt;/code&gt; method. They both take a string with the state name or the CPThemeState itself as their only argument.&lt;/p&gt;
&lt;h3&gt;Changing theme-attributes&lt;/h3&gt;
&lt;p&gt;Most (if not all) of the state changing is handled by Cappuccino. Unless you are creating a custom control, you won't need to touch any of the the above methods. Far more important is the &lt;code&gt;setValue:forThemeAttribute:inState:&lt;/code&gt; method. Let's take a look at changing the left and right content inset of a CPButton:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;CGInsetMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;forThemeAttribute&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;content-inset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Since we don't want the text to jump around when changing states we don't explicitly name the state, this effectively sets a fallback value. When a control is in a state with no defined value, the control will fall back to using this value. &lt;/p&gt;
&lt;p&gt;Let's also take a look at setting theme-attributes for different states:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;buttonBezel&lt;/span&gt; &lt;span class="n"&gt;forThemeAttribute&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;bezel-color&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;inState&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;CPThemeStateBordered&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;p&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;highlightedButtonBezel&lt;/span&gt; &lt;span class="n"&gt;forThemeAttribute&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;bezel-color&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;inState&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;CPThemeStateBordered&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CPThemeStateHighlighted&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;disabledButtonBezel&lt;/span&gt; &lt;span class="n"&gt;forThemeAttribute&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;bezel-color&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;inState&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;CPThemeStateBordered&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CPThemeStateDisabled&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Assuming the bezel colors are defined, the above sets the bezel color for the normal, highlighted and disabled state.&lt;/p&gt;
&lt;p&gt;During my presentation I used an example of a large button to show how the theming engine works. All the code used in this post came from that example. The project can be downloaded &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Cappuccino%20Theming/Theming%20Cappuccino%20-%20The%20Basics.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These are the basics of the theming engine. In my own code I often use:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;forThemeAttribute&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;inState&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;to quickly change small details&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. I don't recommend creating your own, fully custom, themes this way. It will only result in a lot of clutter in your code. If you want to create your own theme, you should take a look at theme descriptors&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The last thing I talked about during my CocoaHeads presentation is data availability. Cappuccino and Cocoa both assume data to be available when the application launches. I'll discuss this problem in more detail in the next, and last, post of the series.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Like issues with text in a control with odd height, resulting in the text appearing a pixel off center.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I tried to find a good post about theme descriptors to link to, but unfortunately I couldn't find one. If you know of one, I'd be happy to link to it.&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As far as I'm aware there's no way to buy individual sessions, so if you're only interested in one talk you're still going to have to pay the full sum for all the sessions.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/bqUNHs_-TgA" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/4/6/the-basics-of-cappuccino-theming</guid><pubDate>Tue, 06 Apr 2010 08:02:38 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/4/6/the-basics-of-cappuccino-theming</feedburner:origLink></item><item><title>Objective-J Explained: &lt;br&gt;Toll-Free Bridges</title><link>http://feedproxy.google.com/~r/annemame/~3/Ndxh0qlcbrg/objective-j-explained-toll-free-bridges</link><description>&lt;p&gt;Last week I gave a talk on the &lt;a href="http://www.cappuccino.org"&gt;Cappuccino&lt;/a&gt; frameworks during a &lt;a href="http://www.cocoaheads.nl"&gt;Cocoaheads Amsterdam&lt;/a&gt; meeting. This post is the first in a series in which I’ll explain several of the subjects I talked about during my presentation. I didn’t have a lot of slides and they won’t make much sense without explanation but for those that are interested you can download them &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Objective-J%20Explained/Cocoaheads%20Cappuccino.key"&gt;here&lt;/a&gt;. All of the examples used in this post can be downloaded &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Objective-J%20Explained/Objective-J-Explained.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm going to start of this series at the basis of the Cappuccino framework, Javascript. In the end Cappuccino and Objective-J are build on top of this one language and that allows for some pretty cool things. Cool things which will look familiar to Cocoa developers and cool things that can make the transition for Javascript developers easier.&lt;/p&gt;
&lt;p&gt;The following code shows an example:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// 1 Declare a javascript array&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="n"&gt;CPLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Step 1: %@&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt;&lt;/span&gt;

&lt;p&gt;&lt;span class="c1"&gt;// 2 Call an Objective-J method on it&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;addObject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;first object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CPLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Step 2: %@&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; first object&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c1"&gt;// 3 Call a Javascript function&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;SECOND OBJECT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;CPLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Step 3: %@&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; first object,SECOND OBJECT&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c1"&gt;// 4 Mix it up&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;objectAtIndex&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CPLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Step 4: %@&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;objectAtIndex&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; true&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c1"&gt;// 5 Do something wacky&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;indexOfObject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;SECOND OBJECT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;objectAtIndex&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;indexOfObject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;SECOND OBJECT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;CPLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Step 5: %@&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; first object,second object&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;All of the above code is perfectly valid. This is an example of a toll-free bridge. A toll-free bridged object is both an instance of a regular Javascript and an instance of an Objective-J object. In Objective-J CPArray and CPString are toll-free bridged to their Javascript equivalents.&lt;/p&gt;
&lt;p&gt;As you see you can mix and match both syntaxes as you feel fit. &lt;strong&gt;A word of caution&lt;/strong&gt;. The above example (especially step 5) is contrived, I do not recommend mixing syntax like this in production code since it can make your code very hard to read and maintain. Personally I only use Javascript literal array notation to create arrays because it's shorter and  more readable than &lt;code&gt;[CPArray array]&lt;/code&gt;. I also use regular Javascript objects in stead of CPDictionaries because CPDictionary is &lt;em&gt;not&lt;/em&gt; toll-free bridged with the Javascript object.&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// 1. Create a regular javascript object using literal notation&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {}&lt;/span&gt;

&lt;p&gt;&lt;span class="c1"&gt;// 2. Add a key value pair to it using javascript&lt;/span&gt;
&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;value1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {&amp;quot;key1&amp;quot;: &amp;quot;value1&amp;quot;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c1"&gt;// 3. Attempt to add another key value pair using Objective-J&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;value2&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;forKey&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;key2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; TypeError: Result of expression &amp;#39;isa&amp;#39; [undefined] is not an object.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;If you prefer using CPDictionaries over Javascript objects you can transform it into a CPDictionary like so:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// 1. Create the object from the previous example&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;key1&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;@&amp;quot;value1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {&amp;quot;key1&amp;quot;: &amp;quot;value1&amp;quot;}&lt;/span&gt;

&lt;p&gt;&lt;span class="c1"&gt;// 2. Make a CPDictionary out of it&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CPDictionary&lt;/span&gt; &lt;span class="n"&gt;dictionaryWithJSObject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;recursively&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {&amp;quot;key1&amp;quot;: &amp;quot;value1&amp;quot;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c1"&gt;// 3. Attempt to add the key value pair using Objective-J again&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;value2&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;forKey&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;key2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {&amp;quot;key1&amp;quot;: &amp;quot;value1&amp;quot;, &amp;quot;key2&amp;quot;: &amp;quot;value2&amp;quot;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;I personally never do this because, to me:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;key1&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;value1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@&amp;quot;key2&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;value2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;is far more readable than:&lt;/p&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CPDictionary&lt;/span&gt; &lt;span class="n"&gt;dictionaryWithObjectsAndKeys&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="s"&gt;@&amp;quot;value1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@&amp;quot;key1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@&amp;quot;value2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@&amp;quot;key2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As you've seen, Objective-J and Javascript differ in syntax a lot, but are still very much the same thing. &lt;/p&gt;
&lt;p&gt;As I've said earlier, this post is the start of a series of posts about Cappuccino. The next one will be about Theming, make sure you don't miss it by &lt;a href="feed://feeds.feedburner.com/annemame"&gt;subscribing&lt;/a&gt; to my feed or &lt;a href="http://www.twitter.com/klaaspieter/"&gt;following&lt;/a&gt; me on Twitter.&lt;/p&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As far as I'm aware there's no way to buy individual sessions, so if you're only interested in one talk you're still going to have to pay the full sum for all the sessions.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/Ndxh0qlcbrg" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/3/19/objective-j-explained-toll-free-bridges</guid><pubDate>Fri, 19 Mar 2010 22:34:25 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/3/19/objective-j-explained-toll-free-bridges</feedburner:origLink></item><item><title>Welcome!</title><link>http://feedproxy.google.com/~r/annemame/~3/dfdslZnu3Vs/welcome</link><description>&lt;p&gt;After some delay it's finally here. Welcome to my blog! I intend to post here whenever I learn something new and interesting. I don't have a specific subject in mind, but it will certainly have to do with usability, design and software.&lt;/p&gt;
&lt;p&gt;The reason for me to start this blog is that I like talking about things I learn. Of course it's also kind of mandatory to have a blog nowadays.&lt;/p&gt;
&lt;p&gt;I intend to talk about the things I'm currently working on, provided I &lt;em&gt;can&lt;/em&gt; talk about them. For now, this post will have to do. Thanks for stopping by and I hope to &lt;a href="feed://feeds.feedburner.com/annemame"&gt;see you again&lt;/a&gt; soon!&lt;/p&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;As far as I'm aware there's no way to buy individual sessions, so if you're only interested in one talk you're still going to have to pay the full sum for all the sessions.&amp;#160;&lt;a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The source is available &lt;a href="http://dl.dropbox.com/u/3415875/Blog/Improving%20the%20Cappuccino%20Theme%20System/Improving%20the%20Cappuccino%20Theme%20System.zip"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/annemame/~4/dfdslZnu3Vs" height="1" width="1"/&gt;</description><guid isPermaLink="false">/blog/post/2010/3/8/welcome</guid><pubDate>Mon, 08 Mar 2010 20:27:15 GMT</pubDate><feedburner:origLink>http://www.annema.me/blog/post/2010/3/8/welcome</feedburner:origLink></item></channel></rss>

