<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title></title>
	<atom:link href="http://blazingcloud.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blazingcloud.net</link>
	<description></description>
	<lastBuildDate>Mon, 06 Sep 2010 05:37:51 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Making DSLs with Ruby</title>
		<link>http://blazingcloud.net/2010/09/05/making-dsls-with-ruby/</link>
		<comments>http://blazingcloud.net/2010/09/05/making-dsls-with-ruby/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 05:34:58 +0000</pubDate>
		<dc:creator>sarah</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=1117</guid>
		<description><![CDATA[My favorite Ruby Kaigi talk was by Yasuko Ohba (@nay3) of Everyleaf Corporation in Japan.  Despite the fact that the talk was in Japanese, with nice code examples on the slides and key translations over IRC, I was able to follow the presentation and learn some tricks.  The coding techniques are really quite [...]]]></description>
			<content:encoded><![CDATA[<p>My favorite <a href="http://rubykaigi.org/2010/en">Ruby Kaigi</a> talk was by Yasuko Ohba (<a href="http://twitter.com/nay3">@nay3</a>) of <a href="http://everyleaf.com/">Everyleaf Corporation</a> in Japan.  Despite the fact that the talk was in Japanese, with nice code examples on the slides and key translations over IRC, I was able to follow the presentation and learn some tricks.  The coding techniques are really quite straight-forward, just not necessarily intuitive to invent.  She reviews a variety of techniques along with real and imaginary examples of each.</p>
<div style="width:425px" id="__ss_5071469"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/nay/the-basis-of-making-dsl-with-ruby" title="The Basis of Making DSL with Ruby">The Basis of Making DSL with Ruby</a></strong><object id="__sse5071469" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rubykaigi-2010-100827192047-phpapp01&#038;rel=0&#038;stripped_title=the-basis-of-making-dsl-with-ruby" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5071469" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rubykaigi-2010-100827192047-phpapp01&#038;rel=0&#038;stripped_title=the-basis-of-making-dsl-with-ruby" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/09/05/making-dsls-with-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blazing Cloud Sign</title>
		<link>http://blazingcloud.net/2010/09/01/blazing-cloud-sign/</link>
		<comments>http://blazingcloud.net/2010/09/01/blazing-cloud-sign/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 05:13:58 +0000</pubDate>
		<dc:creator>sarah</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=1114</guid>
		<description><![CDATA[We have a new sign for our office.  Check it out next time you visit:

]]></description>
			<content:encoded><![CDATA[<p>We have a new sign for our office.  Check it out next time you visit:<br />
<img src="http://img.skitch.com/20100902-8u5d8bj4nme2paqrpjhh3uty1n.png" alt="office sign" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/09/01/blazing-cloud-sign/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQTouch slide transition fix for Android 2.0</title>
		<link>http://blazingcloud.net/2010/08/11/jqtouch-slide-transition-fix-for-android-2-0/</link>
		<comments>http://blazingcloud.net/2010/08/11/jqtouch-slide-transition-fix-for-android-2-0/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 19:29:25 +0000</pubDate>
		<dc:creator>pablo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[jqtouch]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=1074</guid>
		<description><![CDATA[A client of Blazing Cloud recently wanted to support animated screen transitions in their mobile platform and came to us for help. We decided to integrate the latest jQTouch (version 1, beta 2) into their framework since we had heard good things about it. Unfortunately, many animated transitions in Android don&#8217;t work very well. Worst [...]]]></description>
			<content:encoded><![CDATA[<p>A client of Blazing Cloud recently wanted to support animated screen transitions in their mobile platform and came to us for help. We decided to integrate the latest <a href="http://www.jqtouch.com/">jQTouch</a> (version 1, beta 2) into their framework since we had heard good things about it. Unfortunately, many animated transitions in Android don&#8217;t work very well. Worst is that slide transitions don&#8217;t work at all on Android 2.0 devices.</p>
<p>After poking around a bit, it seemed that the @-webkit-keyframes styles in jqtouch.css defined for the sliding transitions were being applied in parallel when running in Android 2.0. For example, a slide-in-from-right link  has these webkit animated styles applied to it:</p>
<pre class="brush: css; gutter: false;">.in, .out {
    -webkit-animation-timing-function: ease-in-out;
    -webkit-animation-duration: 350ms;
}

.slide.in {
    -webkit-animation-name: slideinfromright;
}

@-webkit-keyframes slideinfromright {
    from { -webkit-transform: translateX(100%); }
    to { -webkit-transform: translateX(0); }
}</pre>
<p>On  iPhone and Android 1.0 devices,  a slide-in-from-right screen slides in correctly from 100% to 0 in about 350ms. But on Android 2.0 devices,  the screen appears immediately as if no animation occurred.</p>
<p>To work around this problem,  you have to manually set the start position first, then the end position and animation style. That is, instead of letting the @-webkit-keyframes do the work, you have to manually position the screen at 100%, then set the animation  and final position style after a small time interval. For example, the key portion of the code to consider  is:</p>
<pre class="brush: jscript; gutter: false;">toPage.css(&quot;webkitTransform&quot;, &quot;translate3d(100%,0px,0px)&quot;);
setTimeout(function() {
    toPage.css({webkitTransitionDuration: &quot;350ms&quot;,
    webkitTransitionTimingFunction: &quot;ease-in-out&quot;});
    toPage.css(&quot;webkitTransform&quot;, &quot;translate3d(0px,0px,0px)&quot;);
}, 5);</pre>
<p>Note that we first set the starting position then wait about 5 milliseconds before applying the animated style (webkitTransitionDuration and webkitTransitionTimingFunction). After the transition completes, I clear the style from the page:</p>
<pre class="brush: jscript; gutter: false;">toPage.css({webkitTransitionDuration: null,
            webkitTransitionTimingFunction: null})</pre>
<p>The sliding animation is handled in the animatePages function. Here&#8217;s the code with workaround (my changes in bold):</p>
<pre class="brush: jscript; gutter: false; highlight: [20,21,22,23,24,25,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75];">function animatePages(fromPage, toPage, animation, backwards) {
    // Error check for target page
    if(toPage.length === 0){
        $.fn.unselect();
        console.error('Target element is missing.');
        return false;
    }

    // Collapse the keyboard
    $(':focus').blur();

    // Make sure we are scrolled up to hide location bar
    scrollTo(0, 0);

    // Define callback to run after animation completes
    var callback = function(event){

        if (animation)
        {
            if (animation.name == &quot;slide&quot;) {
                var css = {webkitTransitionDuration: null,
                    webkitTransitionTimingFunction: null};
                toPage.css(css);
                fromPage.css(css);
            }
            toPage.removeClass('in reverse ' + animation.name);
            fromPage.removeClass('current out reverse ' + animation.name);
        }
        else
        {
            fromPage.removeClass('current');
        }

        toPage.trigger('pageAnimationEnd', { direction: 'in' });
        fromPage.trigger('pageAnimationEnd', { direction: 'out' });

        clearInterval(dumbLoop);
        currentPage = toPage;
        location.hash = currentPage.attr('id');
        dumbLoopStart();

        var $originallink = toPage.data('referrer');
        if ($originallink) {
            $originallink.unselect();
        }
        lastAnimationTime = (new Date()).getTime();
        tapReady = true;
    }

    fromPage.trigger('pageAnimationStart', { direction: 'out' });
    toPage.trigger('pageAnimationStart', { direction: 'in' });

    if ($.support.WebKitAnimationEvent &amp;&amp;
        animation &amp;&amp;
        jQTSettings.useAnimations) {
        tapReady = false;
        if (animation.name == &quot;slide&quot;) {
            toPage.one('webkitTransitionEnd', callback);
            toPage.addClass('in current');
            fromPage.addClass('out');
            toPage.css(&quot;webkitTransform&quot;,
                       &quot;translate3d(&quot; + (backwards ? &quot;-100%&quot; : &quot;100%&quot;) + &quot;,0px,0px)&quot;);
            fromPage.css(&quot;webkitTransform&quot;,
                         &quot;translate3d(0px,0px,0px)&quot;);
            setTimeout(function() {
                var css = {webkitTransitionDuration: &quot;350ms&quot;,
                    webkitTransitionTimingFunction: &quot;ease-in-out&quot;};
                toPage.css(css);
                fromPage.css(css);
                toPage.css(&quot;webkitTransform&quot;,
                           &quot;translate3d(0px,0px,0px)&quot;);
                fromPage.css(&quot;webkitTransform&quot;,
                             &quot;translate3d(&quot; + (backwards ? &quot;100%&quot; : &quot;-100%&quot;) + &quot;,0px,0px)&quot;);
            }, 5);
        } else {
            toPage.one('webkitAnimationEnd', callback);
            toPage.addClass(animation.name + ' in current ' + (backwards ? ' reverse' : ''));
            fromPage.addClass(animation.name + ' out' + (backwards ? ' reverse' : ''));
        }
    } else {
        toPage.addClass('current');
        callback();
    }

    return true;
}</pre>
<p>Note that jQTouch sets <em>$.support.WebKitAnimationEvent</em> to false for Android 2.0 devices even though it does support WebKit animation. Make sure you set that to true. Replace the animatePage function in your jQtouch with the function in this post and now  you should be golden with iPhone and Android!</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/08/11/jqtouch-slide-transition-fix-for-android-2-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What&#8217;s weird about floats in objective-c?</title>
		<link>http://blazingcloud.net/2010/08/09/whats-weird-about-floats-in-objective-c/</link>
		<comments>http://blazingcloud.net/2010/08/09/whats-weird-about-floats-in-objective-c/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 18:56:12 +0000</pubDate>
		<dc:creator>lorien</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-c]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=1014</guid>
		<description><![CDATA[Aright, what&#8217;s up with this? This code using a double works just fine:

double myDouble = 2.2;
NSLog(@&#34;myDouble %f&#34;, myDouble);

[self testDouble:myDouble];

- (void) testDouble:(double)myDouble {
    NSLog(@&#34;testDouble %f&#34;, myDouble);
}

This code prints:
myDouble 2.200000
testDouble 2.200000
No surprises there. But the same code using a float behaves very strangely:

float myFloat = 3.3;
NSLog(@&#34;myFloat %f&#34;, myFloat);

[self testFloat:myFloat];

- (void) testFloat:(float)myFloat {
   [...]]]></description>
			<content:encoded><![CDATA[<p>Aright, what&#8217;s up with this? This code using a double works just fine:</p>
<pre class="brush: objc;">
double myDouble = 2.2;
NSLog(@&quot;myDouble %f&quot;, myDouble);

[self testDouble:myDouble];

- (void) testDouble:(double)myDouble {
    NSLog(@&quot;testDouble %f&quot;, myDouble);
}
</pre>
<p>This code prints:<br />
<strong><em>myDouble 2.200000<br />
testDouble 2.200000</em></strong></p>
<p>No surprises there. But the <em>same</em> code using a float behaves very strangely:</p>
<pre class="brush: objc;">
float myFloat = 3.3;
NSLog(@&quot;myFloat %f&quot;, myFloat);

[self testFloat:myFloat];

- (void) testFloat:(float)myFloat {
    NSLog(@&quot;testFloat %f&quot;, myFloat);
}
</pre>
<p><em>This</em> code prints<br />
<strong><em>myFloat 3.300000<br />
testFloat 36893488147419103232.000000</em></strong></p>
<p>So what happens to the float that is passed to the testFloat method? According to this Techtopia article about <a href="http://www.techotopia.com/index.php/Objective-C_2.0_Data_Types#float_Data_Type">Objective-C 2.0 Data Types</a> when you create a float like this:</p>
<pre class="brush: objc;">
float myFloat = 3.3;
</pre>
<p>It is internally stored as a double, which has greater precision. If you actually want to store something as a float you need to append an &#8220;f&#8221; to the number like this:</p>
<pre class="brush: objc;">
float myFloat = 3.3f;
</pre>
<p>So I thought perhaps that was the problem &#8211; that internally it was represented as a double, so when passed in to a method expecting a float there was a conversion error. But when I modified the code above to include the &#8220;f&#8221; I get the same result.</p>
<p>I also get the same result when I pass the float in directly to the method like this:</p>
<pre class="brush: objc;">
[self testFloat:3.3f];
</pre>
<p>So what the heck is going on here? Why can&#8217;t I pass a float to a method? What am I missing? I&#8217;ll follow up with a comment when I figure it out, but does anybody know why this is happening?</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/08/09/whats-weird-about-floats-in-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our First Chef Cookbook</title>
		<link>http://blazingcloud.net/2010/06/28/our-first-chef-cookbook/</link>
		<comments>http://blazingcloud.net/2010/06/28/our-first-chef-cookbook/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 23:37:14 +0000</pubDate>
		<dc:creator>pablo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[configuration management system]]></category>
		<category><![CDATA[opscode]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=947</guid>
		<description><![CDATA[We recently deployed an Amazon EC2 instance and I was tasked with installing and configuring Red5 and Openfire on the system. As I often do, I took careful notes of what I did on a wiki, which is useful to have in case another instance needs to be brought up later. Manual installation using notes, [...]]]></description>
			<content:encoded><![CDATA[<p>We recently deployed an <a href="http://aws.amazon.com/ec2/">Amazon EC2</a> instance and I was tasked with installing and configuring <a href="http://red5.org/">Red5</a> and <a href="http://www.igniterealtime.org/projects/openfire/">Openfire</a> on the system. As I often do, I took careful notes of what I did on a wiki, which is useful to have in case another instance needs to be brought up later. Manual installation using notes, however, can be an arduous and error prone process. This can be alleviated by adding automation, typically through shell scripts. The problem with writing shell scripts is that you can only run those scripts on a specific system. And often, running the same script twice can leave your system in an inconsistent state.</p>
<p>Enter <a href="http://www.opscode.com/chef/">Chef </a>, an open source systems integration framework written in Ruby. You can easily manage and configure your servers using what Chef calls <a href="http://wiki.opscode.com/display/chef/Cookbooks">cookbooks</a>. A cookbook contains all the things you need to automate the configuration of your server and basically consists of one or more recipes. The easiest way to familiarize yourself with Chef is by running it with <a href="http://wiki.opscode.com/display/chef/Chef+Solo">Chef Solo</a>, which is what I ended up doing. Running it this way allows you to run cookbooks without running a Chef server and client. You can read more about deploying Chef in this configuration by reading the <a href="http://wiki.opscode.com/display/chef/Chef+Architecture">Chef Architecture</a> documentation.</p>
<p>Before writing my cookbook, I had to have all the dependencies for Chef Solo installed on my Ubuntu 10.04 (Lucid Lynx) EC2 instance. Lucid Lynx already ships with Ruby so I didn&#8217;t need to install that. All I needed to do to get myself going was run these commands to install Chef Solo:</p>
<pre style="padding-left: 30px;">% sudo apt-get update
% sudo apt-get -y install ohai chef rubygems</pre>
<p>You should read the <a href="http://wiki.opscode.com/display/chef/Installation">Chef Installation </a>documentation if you&#8217;re on a different system.</p>
<p>The first thing I did was to create a directory to contain my cookbooks and configuration files:</p>
<pre style="padding-left: 30px;">% mkdir -p ~/chef/cookbooks
% mkdir -p ~/chef/config
</pre>
<p>The chef-solo command comes with two main options:</p>
<ul>
<li>-c &lt;configuration_file&gt;</li>
<li>-j &lt;json_attributes&gt;</li>
</ul>
<p>The <strong>-c</strong> option tells chef-solo which cookbooks to pick up. If not specified, chef-solo will read the configuration file at <em>/etc/chef/solo.rb</em>. The <strong>-j</strong> option specifies which recipes chef-solo should run, as well as set or override any recipe attributes. The format of the file that the <strong>-j</strong> option reads in is <a href="http://www.json.org/">JSON</a>.</p>
<p>I wanted chef-solo to pick up my recipes, so I wrote my own configuration file:</p>
<pre style="padding-left: 30px;">% cd ~/chef/config
% vim solo.rb
home_dir = File.expand_path(File.dirname(__FILE__) + "/..")
file_cache_path  home_dir
cookbook_path [ "#{home_dir}/cookbooks" ]
</pre>
<p>The <em>cookbook_path</em> specifies where my cookbooks are going to exist, which is an array of paths. The <em>file_cache_path</em> is the directory where remote cookbooks will be downloaded and installed into. Chef solo has a <strong>-r</strong> option to download remote recipes into your system. Both <em>cookbook_path</em> and <em>file_cache_path</em> need to be full paths.</p>
<p>I needed to install Openfire and Red5 on my system, which meant there was a Java dependency. I knew there was a Java Chef recipe, so I downloaded it and installed it in my cookbooks directory:</p>
<pre style="padding-left: 30px;">% cd ~/chef/cookbooks
% wget https://s3.amazonaws.com/opscode-community/cookbook_versions/tarballs/194/original/java.tar.gz
% tar zxf java.tar.gz
</pre>
<p>One of the great things about Chef is that a whole slew of recipes are available to be used. You can find them at <a href="http://cookbooks.opscode.com">http://cookbooks.opscode.com</a>.</p>
<p>I was now be able to install Java, but before doing that, I needed to create an attributes file telling chef-solo I wanted to run java as a recipe:</p>
<pre style="padding-left: 30px;">% cd ~/chef/config
% vim node.json
{
    "recipes": [ "java" ]
}
</pre>
<p>My first chef-solo run:</p>
<pre style="padding-left: 30px;">% cd ~/chef
% chef-solo -j config/node.json -c config/solo.rb
</pre>
<p>Voila! That installed Java on my system.</p>
<p>I was finally ready to write my first cookbook:</p>
<pre style="padding-left: 30px;">% cd ~/chef/cookbooks
% mkdir -p openfire/recipes
% cd openfire/recipes
% vi default.rb
tarball = "openfire_3_6_4.tar.gz"

<span style="text-decoration: line-through;">execute "wget" do
 tarball_url = "http://www.igniterealtime.org/downloadServlet?filename=openfire/#{tarball}"
 cwd "/tmp"
 command "wget #{tarball_url}"
 creates "/tmp/#{tarball}"
 action :run
end</span>

remote_file "/tmp/#{tarball}" do
 source "http://www.igniterealtime.org/downloadServlet?filename=openfire/#{tarball}"
 mode "0644"
 checksum "bc43e96d23dc865b624fd3ed2531b2a8a8ef3f0483e829dd087b08688d92ede2"
end

execute "tar" do
 user "ubuntu"
 group "ubuntu"

 installation_dir = "/home/ubuntu"
 cwd installation_dir
 command "tar zxf /tmp/#{tarball}"
 creates installation_dir + "/openfire"
 action :run
end
</pre>
<p>The <em>openfire/recipes/default.rb</em> file is the main recipe file that&#8217;s executed when the Openfire cookbook is referenced.  If you look in the Java cookbook, you&#8217;ll find<em> java/recipes/default.rb</em>. Each cookbook has a default.rb recipe.</p>
<p>A <a href="http://wiki.opscode.com/display/chef/Recipes">recipe</a> is essentially a list of commands or, in Chef speak, resources. A <a href="http://wiki.opscode.com/display/chef/Resources">resource</a> is a command abstraction that can be run on any platform. For example, there&#8217;s a <a href="http://wiki.opscode.com/display/chef/Resources#Resources-File">file</a> resource that allows you to create or delete a file, a <a href="http://wiki.opscode.com/display/chef/Resources#Resources-Package">package</a> resource that let&#8217;s you to install, remove or upgrade a package in your system. In the Openfire cookbook, I&#8217;m using the <a href="http://wiki.opscode.com/display/chef/Resources#Resources-Execute">execute</a> resource which runs a specific shell command. I found the terminology in Chef often confusing and turned to a  blog post called <a href="http://kallistec.com/2010/02/01/the-chef-way-episode-2-chef-speak/">The  Chef Way Episode 2: Chef Speak</a> to explain it all. I highly  recommend using it as reference while reading the <a href="http://wiki.opscode.com/display/chef/Documentation">Chef  documentation</a>.</p>
<p><span style="text-decoration: line-through;">What the wget execute resource does is:</span></p>
<ul>
<li><span style="text-decoration: line-through;">Changes the working directory to /tmp (cwd &#8220;/tmp&#8221;)</span></li>
<li><span style="text-decoration: line-through;">Runs wget to fetch the tarball (command &#8220;wget #{tarball_url}&#8221;)</span></li>
<li><span style="text-decoration: line-through;">Says that this action creates the tarball in the /tmp directory and, if it exists, not execute the resource (creates &#8220;/tmp/#{tarball}&#8221;</span></li>
<li><span style="text-decoration: line-through;">Lastly, says that the action for this command is to be run (action :run)</span></li>
</ul>
<p><span style="text-decoration: line-through;">The other valid action for execute is <em>:nothing</em> which basically tells the resource not to run the command. Each resource has its own set of actions and valid attributes. For more details, check out the <a href="http://wiki.opscode.com/display/chef/Resources">resources wiki</a>.</span></p>
<p><span style="text-decoration: line-through;">The only difference with the tar execute resource are the <em>user</em> and <em>group</em> attributes which says the resource should change to a  specific user and group id before running the command.</span></p>
<p>What the remote_file resource does is fetch the tarball from the remote  server into the /tmp directory and run a checksum. The tar execute resource:</p>
<ul>
<li>Sets a specific user  id to run the command (user &#8220;ubuntu&#8221;)</li>
<li>Sets a specific group id to run the command (group &#8220;ubuntu&#8221;)</li>
<li>Changes the working directory  (cwd installation_dir)</li>
<li>Runs tar to untar the tarball (command &#8220;tar zxf /tmp/#{tarball}&#8221;)</li>
<li>Says that this action creates the openfire directory in the installation directory. If the directory already exists, the resource will not execute. (creates installation_dir + &#8220;/openfire&#8221;)</li>
<li>Lastly, says that the action for this command is to be run  (action :run)</li>
</ul>
<p>Each resource has its own set of actions and valid attributes. For more  details, check out the <a href="http://wiki.opscode.com/display/chef/Resources">resources wiki</a>.</p>
<p>There were a lot of hard-coded values in the cookbook. So I decided to extract them out as much as possible into attributes. You can do that by creating a file in the attributes directory:</p>
<pre style="padding-left: 30px;">% cd ~/chef/cookbooks/openfire
% mkdir attributes
% vim attributes/openfire.rb
tarball = "openfire_3_6_4.tar.gz"

set_unless[:openfire][:installation_dir] = "/home/ubuntu"
set_unless[:openfire][:tarball_url] = "http://www.igniterealtime.org/downloadServlet?filename=openfire/#{tarball}"
set_unless[:openfire][:tarball_checksum] = "bc43e96d23dc865b624fd3ed2531b2a8a8ef3f0483e829dd087b08688d92ede2"
set_unless[:openfire][:tarball] = tarball
set_unless[:openfire][:dirname] = "openfire" # directory name of extracted tarball
set_unless[:openfire][:user] = "ubuntu"
set_unless[:openfire][:group] = "ubuntu"

% vim recipes/default.rb
tarball = node[:openfire][:tarball]

<span style="text-decoration: line-through;">execute "wget" do
 cwd "/tmp"
 command "wget #{node[:openfire][:tarball_url]}"
 creates "/tmp/#{tarball}"
 action :run
end</span>

remote_file "/tmp/#{tarball}" do
 source "#{node[:openfire][:tarball_url]}"
 mode "0644"
 checksum "#{node[:openfire][:tarball_checksum]}"
end

execute "tar" do
 user node[:openfire][:user]
 group node[:openfire][:group]

 installation_dir = node[:openfire][:installation_dir]
 cwd installation_dir
 command "tar zxf /tmp/#{tarball}"
 creates installation_dir + "/" + node[:openfire][:dirname]
 action :run
end
</pre>
<p>An <a href="http://wiki.opscode.com/display/chef/Attributes">attribute</a> is a  property that can be accessed via a hash called <em>node</em> in any  recipe. When Chef runs, every single file in the attributes directory is read in alphabetical order. The attribute values set in those files are set in <em>node</em>. You can set attributes using the <em>set </em>or <em>set_unless</em> methods: <em>set</em> assigns the value even if the attribute has already been set, <em>set_unless</em> only assigns the value if it hasn&#8217;t been set already. When running chef-solo, you can override attributes using the JSON attributes file. Check out the <a href="http://wiki.opscode.com/display/chef/Attributes">attributes wiki</a> for more information.</p>
<p>The Red5 cookbook is very similar to the Openfire cookbook, so I won&#8217;t include it here for brevity&#8217;s sake. To install Java, Openfire and Red5 using chef-solo:</p>
<pre style="padding-left: 30px;">% cd ~/chef/config
% vim node.json
{
    "recipes": [ "java", "openfire", "red5" ]</pre>
<pre style="padding-left: 30px;">}
% cd ~/chef
% chef-solo -j config/node.json -c config/solo.rb
</pre>
<p>In this case, only the Openfire and Red5 cookbook will run because we installed Java before. Chef is smart enough not to rerun installations that have already run.</p>
<p>These cookbooks are all checked into github at <a href="http://github.com/blazingcloud/chef">http://github.com/blazingcloud/chef</a> if you want to check it out.  I also recommend reading <a href="http://brainspl.at/articles/2009/01/31/cooking-with-chef-101">Cooking with Chef 101</a> for a great Chef Solo tutorial.</p>
<p>I know the cookbooks here could be factored out better and be less platform dependent on Ubuntu, but for the purposes of instruction, I hope this was useful. I&#8217;ll leave it at that for my first Blazing Cloud blog post. Thanks for reading!</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/28/our-first-chef-cookbook/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Objective-C Gets Blocks!</title>
		<link>http://blazingcloud.net/2010/06/28/objective-c-gets-blocks/</link>
		<comments>http://blazingcloud.net/2010/06/28/objective-c-gets-blocks/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 15:51:45 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Objective-c]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=858</guid>
		<description><![CDATA[New to Objective-C is the block syntax. A block is a section of code that is grouped together and designed to be treated like one statement. Blocks also package up the lexical scope of variables and functions within its environment. Blocks are found in many languages including, but not limited to, Ruby, Javascript and Lisp. [...]]]></description>
			<content:encoded><![CDATA[<p>New to Objective-C is the block syntax. A block is a section of code that is grouped together and designed to be treated like one statement. Blocks also package up the lexical scope of variables and functions within its environment. Blocks are found in many languages including, but not limited to, Ruby, Javascript and Lisp. Blocks are objects and should be treated like such!   </p>
<table border="1" cellpadding="2px">
<tr>
<th>Programming Language</th>
<th>Code Example</th>
<th>Colloquial</th>
</tr>
<tr>
<th>Ruby</th>
<td>
<pre>[1, 2, 3, 4].each do |i|
    puts i
end</pre>
</td>
<td>Block</td>
</tr>
<tr>
<th>Lisp</th>
<td>
<pre>((lambda (a b) (+ b a)) 1 2)</pre>
</td>
<td>Lambda function</td>
</tr>
<tr>
<th>Javascript</th>
<td>
<pre>var foo = function () {
   var j = 42;
}</pre>
</td>
<td>Anonymous Function, Closure</td>
</tr>
<tr>
<th>Objective-C</th>
<td>
<pre>^BOOL(num1,num2){
   return [num1 isEqualToNumber:num2];
}</pre>
</td>
<td>Block</td>
</tr>
</table>
<p>Now there are other block structured languages out there but the few listed here are used to provide a basis for understanding if you&#8217;re coming from another language where you may have experienced this concept.</p>
<p>Objective-C inherited blocks from the C language, which it is a superset of. Apple has created an extension of the C language implementing blocks.  Syntactically, blocks start with the carrot symbol, followed by its return type followed by arguments (enclosed by parenthesis) and finishing off with the code body defined between curly braces.</p>
<p>^Return Type (Arguments) {Code Body}</p>
<p> The blocks return type and arguments are both optional parameters, leaving them off will not effect the block.</p>
<p>^{Code Body}</p>
<p>You can pass blocks to a function:</p>
<pre>Repeat(12, ^{
   [str appendFormat:@"rand: %d", rand()];
});
</pre>
<p>Scoped variables (by default) are immutable in blocks. To make these mutable you prefix the keyword __block.</p>
<p>For example</p>
<pre>__block int count = 0; //mutable thanks to the __block keyword
int specialValue = 50;  //immutable inside the block

^{
  // do some calculation
   int newValue = someCalculatedValue + specialValue;
   count++; //increment the count every time we do this calculation
}</pre>
<p>A good example of when you might want to use a block may be a callback. Since callbacks are generally a grouping of code that will run after an operation.  </p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/28/objective-c-gets-blocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strategies on Improving Pair Programming</title>
		<link>http://blazingcloud.net/2010/06/20/strategies-on-improving-pair-programming/</link>
		<comments>http://blazingcloud.net/2010/06/20/strategies-on-improving-pair-programming/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 20:58:06 +0000</pubDate>
		<dc:creator>sarah</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=927</guid>
		<description><![CDATA[For last week&#8217;s retrospective, we decided to focus on strategies to improve our performance as pair programmers.  We chose the &#8220;Force Field Analysis&#8221; activity from the Agile Retrospectives book, an activity geared toward gaining insight.  I was pleased to hear at the end of the retrospective, one of the newer engineers remark:
&#8220;In my [...]]]></description>
			<content:encoded><![CDATA[<p>For last week&#8217;s retrospective, we decided to focus on strategies to improve our performance as pair programmers.  We chose the &#8220;Force Field Analysis&#8221; activity from the <a href="http://www.amazon.com/gp/product/0977616649?ie=UTF8&#038;tag=ultrasaurus-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0977616649">Agile Retrospectives</a> book, an activity geared toward gaining insight.  I was pleased to hear at the end of the retrospective, one of the newer engineers remark:</p>
<blockquote><p>&#8220;In my fifteen years of software industry experience, this is the first bullshit team exercise where I have actually learned something&#8221;</p></blockquote>
<p>There were six of us at Blazing Cloud on Friday, with Liah and Jen-Mei on vacation.  We split into two groups, making sure that the two engineers who had been here the longest were in different groups and the two newest engineers were also in different groups.  We then had 2 sessions, each 7 minutes long, where each group brainstormed things that would 1) drive and support better pairing and 2) inhibited us from becoming better at pairing.</p>
<p>Then we got back together and reported &#8220;round robin&#8221; from each team and I listed on the whiteboard (skipping over duplicates) with &#8220;drivers&#8221; on the left and &#8220;inhibitors&#8221; on the right.  After that we talked about what we think would help or inhibit us the most and drew fat and skinny arrows.<br />
<img src="http://img.skitch.com/20100620-qbxrnm4x9c59n8xf97a84ed2kc.png"/></p>
<blockquote><p>&#8220;Even if you can&#8217;t be the one on the keyboard, you need to feel responsible for those lines of code.&#8221;</p></blockquote>
<h2>Drive / Support Better Pair Programming</h2>
<ul>
<li>More Pairing
<ul>
<li>Pair should finish at least one feature (schedule for features, instead of allocating time in days)</li>
<li>Think about pairing partners when planning</li>
<li>Enforce/Plan Pair Programming</li>
<li>Pair overlap when shifting resources for on-going projects</li>
</ul>
</li>
<li>Get Advice
<ul>
<li>Ask <a href="http://www.rubyfocus.biz/">Wolf</a> to present his knowledge on the subject</li>
<li>Ask folks at <a href="http://pivotallabs.com/">Pivotal</a> about their experience teaching pairing to new hires and best practices</li>
</ul>
</li>
<li>Talk more while pairing
<ul>
<li>Talk first about the problem/give overview of project, before starting to code or look at Feature/Issue Tracker</li>
<li>The person typing should vocalize what they are doing</li>
<li>Ask &#8220;is this a requirement? Is this the thing we should be doing?&#8221;</li>
</ul>
</li>
<li>Experienced person types as an intro, then less experienced person types when familiar with the project</li>
<li>When brainstorming what approach to take, consider taking on different roles, such as one person looking up code and another documenting the plan that both are coming up with. </li>
<li>Switch up Pairs</li>
<li>Read books about PP &#8212; any suggestions here?</li>
<li>Pay attention to the other peson</li>
<li>Physical presence: pairs need to coordinate when they will be at the office</li>
<li>Project Consistency</li>
<li>Workstation availability</li>
<li> Parallel research at the same time by mutual agreement, but consider reading the found document together, benefits and drawback of reading difeerent things</li>
<li>Share experiences and talk to each other</li>
<li>One person responsible for drawing outlines, and taking notes while the other is writing the code (driving)</li>
<li>Write down strategy on paper before writing code</li>
<li>Participants pay attention to the other&#8217;s state of mind/focus area</li>
<li> If the partner is moving fast ask to slow down</li>
</ul>
<h2>Inhibits Pair Programming</h2>
<ul>
<li>Lack of context</li>
<li>Pairs working on different tasks</li>
<li>Lack of attention</li>
<li>Insufficient solo learning &#8211;> more experienced person is responsible for guidance:
<ul>
<li>               More experienced partner should suggest books, blog posts, articles for less experienced partner for solo learning.</br></li>
<li>               Note that less experienced programmer may still have specific relevant experience/reading to educate the more experienced partner and should feel obliged to recommend reading as well</li>
</ul>
</li>
<li>People using different tools</li>
<li>Interruptions</li>
<li>Noise</li>
</ul>
<p>I closed the retrospective with a &#8220;three H&#8221; exercise.  I handed out sticky notes and asked people to write down what they thought helped or hindered the exercise or if they has a hypothesis (idea) of what we could do better next time.</p>
<h2>Help</h2>
<ul>
<li>format of the exercise was productive</li>
<li>Like that we broke into smaller groups and later brainstormed with the whole group</li>
<li>Everyone seemed engaged</li>
<li>Structure was great, very clear instructions</li>
<li>Focused the team</li>
<li>Made everyone think and work together</li>
<li>Team have the same concerns that I do</li>
<li>I like the visual effects of the arrows to demonstrate significance</li>
</ul>
<h2>Hinder</h2>
<ul>
<li>Need larger whiteboard</li>
<li>Need larger whiteboard, difficult to read</li>
<li>Whiteboard difficult to read</li>
<li>Could have had more time</li>
<li>We see what is important on the board now, but unsure of how this will be enforced in the future</li>
<li>Can&#8217;t read whiteboard</li>
<li>Need a bigger whiteboard</li>
</ul>
<p>Lacking flip charts or more whiteboard space, we used the back of the office door to post stickies, which worked quite well:<br />
<img src="http://img.skitch.com/20100620-fqi6f8gyhspn16ic9t8yqjbhxb.png"/></p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/20/strategies-on-improving-pair-programming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Deploying a Redmine Wiki to Heroku</title>
		<link>http://blazingcloud.net/2010/06/18/deploying-a-redmine-wiki-to-heroku/</link>
		<comments>http://blazingcloud.net/2010/06/18/deploying-a-redmine-wiki-to-heroku/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 00:55:54 +0000</pubDate>
		<dc:creator>mkolenda</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=897</guid>
		<description><![CDATA[One of the recommendations that came out of our recent retrospective was to create a Blazing Cloud wiki where we would store all of our project information, best practices, how to&#8217;s, etc.  We wanted a wiki that was free, configurable/customizable and could be easily deployed to either Heroku or another hosting provider we are familiar [...]]]></description>
			<content:encoded><![CDATA[<p>One of the recommendations that came out of our recent <a href="http://blazingcloud.net/2010/06/10/retrospectives-the-fish-bone/" target="_self">retrospective</a> was to create a Blazing Cloud wiki where we would store all of our project information, best practices, how to&#8217;s, etc.  We wanted a wiki that was free, configurable/customizable and could be easily deployed to either Heroku or another hosting provider we are familiar with.  Additionally, it had to require users to log in to see content since some of the information may be confidential.</p>
<p>We decided to use the <a href="http://www.redmine.org">Redmine</a> wiki since we have team experience using it at <a href="http://wiki.railsbridge.org/">RailsBridge</a> and we like that it is a Rails app.  We have a wealth of Rails knowledge here at Blazing Cloud, so we can address any issues we run into ourselves.  Also, Redmine has an large development community, is <a href="http://github.com/edavis10/redmine">hosted on github</a>, good <a href="http://www.redmine.org/projects/redmine/wiki">documentation</a> and an active  <a href="http://www.redmine.org/projects/redmine/boards">online forum</a>.</p>
<p>Redmine is many things, including a wiki.  This post will focus on only on using RedMine for its wiki, specifically</p>
<ul>
<li><a href="#C1">Installation</a></li>
<li><a href="#C2">Configuration</a></li>
<li><a href="#C3">Deploying to Heroku</a></li>
</ul>
<p>Deploying Redmine on a development box was a snap.  However, moving it to Heroku wasn&#8217;t as straightforward.  Hopefully this post will help anyone out there looking to get a Redmine instance running on Heroku quickly.</p>
<h2><a name="C1">Installation</a></h2>
<p>Here is the easy part, getting Redmine running on a development box.  Note that I&#8217;m running a Mac OSX 10.6, Ruby EE 1.8.7.  You also need to have the Rails 2.3.5 gem installed on your system.  Obviously you will also need the heroku gem to interact with Heroku.  Finally you&#8217;ll need the taps gem to push your local database to Heroku.</p>
<h3>Get a copy of Redmine to you local development machine:</h3>
<pre class="brush: plain;">
cd &lt;some directory&gt;
git clone http://github.com/edavis10/redmine.git
cd redmine
cp config/database.yml.example config/database.yml
vim config/database.yml   # Change it to reflect the DBMS you want to use.  It is configured to use mysql by default.
rake config/initializers/session_store.rb
rake db:migrate
script/server
</pre>
<h2><a name="C2">Configuration</a></h2>
<p>Now that the Redmine server is running locally we need to configure the Wiki and change the security settings to meet our needs.</p>
<ol>
<li>In a browser navigate to http://localhost:3000</li>
<li>Redmine comes with a built in administrator account (admin/admin). Login as admin.</li>
</ol>
<h3>Make Redmine password protected:</h3>
<ol>
<li>Click on Settings -&gt; Authentication</li>
<li>Check the Authentication required checkbox and save.</li>
</ol>
<p>Now everyone must log in to access the wiki!</p>
<h3>Create the Redmine project and wiki</h3>
<ol>
<li>Click on the Administration link then New project</li>
<li>Name it whatever makes sense for your installation, I called mine Blazing Cloud Wiki, and the identifier is blazingcloudwiki.  I left all other options in their default state.</li>
<li>Now click on the &#8220;wiki&#8221; tab on the secondary navigation, not the &#8220;wiki&#8221; tab on the top navigation!</li>
<li>Notice the start page defaults to &#8220;Wiki&#8221;.  Name it whatever you like.  I kept the default name for this wiki.</li>
<li>Click save</li>
<li>Next click on the wiki tab on the top navigation</li>
<li>The &#8220;wiki&#8221; page editor should open by default.  Now add whatever content you want to the wiki home page.</li>
<li>Click save</li>
</ol>
<h3>Change the routes.rb file</h3>
<ol>
<li>Next you need to edit the routes.rb file</li>
<li>Replace the current &#8220;map.home&#8221; route with&#8230;</li>
</ol>
<pre class="brush: plain;">
map.home '', :controller =&gt; 'wiki', :id =&gt; '1'
</pre>
<p>Note that the :id parameter is the database project.id assigned to the project you created above.  If you run into issues later you may want to verify that the record in the &#8220;projects&#8221; table does have ID = 1.</p>
<h3>Restart the application server</h3>
<pre class="brush: plain;">
ctrl+c # on the console that is running the Redmine server to stop it
script/server # to restart it
</pre>
<h3>Verify that the wiki is the home page</h3>
<ol>
<li>In your browser log out and back in to Redmine</li>
<li>You should see the Wiki home page you created above.  Congrats, Redmine is running locally!</li>
</ol>
<h2><a name="C3">Deploying to Heroku</a></h2>
<p>Now that we have the Redmine server running the way we want it to locally we need to make some changes before we can deploy it to Heroku.<br />
In the &#8220;redmine&#8221; directory&#8230;</p>
<ol>
<li>Edit the .gitignore file</li>
<li>Remove the line &#8220;public/plugin_assets&#8221;</li>
</ol>
<h3>Add public/plugin_assets to git</h3>
<ol>
<li>If the public/plugin_assets folder does not exist, create this folder and add an empty file named &#8220;README&#8221; to it.  Why?  Because git tracks files not folders.  So to add the public/plugin_assets folder to git there needs to be a file in the folder for it to track.</li>
<li>If you need to create the README file just put some placeholder text in it.  The file just needs to exist, the content does not matter.</li>
</ol>
<h3>Configure Redmine Session Handling</h3>
<p>Redmine uses a &#8220;key&#8221; to encode cookie session data.  To deploy Redmine to Heroku you must modify the  config/environment.rb file.</p>
<ol>
<li>Open the config/environment.rb file and add this line within the Rails::Initializer.run do |config| block.  Note that the :key should be _myapp_session and the :secret should have no spaces.</li>
</ol>
<pre class="brush: plain;">
config.action_controller.session = { :key =&gt; &quot;_myapp_session&quot;, :secret =&gt; &quot;somesecretphrase&quot; }
</pre>
<p>IMPORTANT: your secret phrase should be &gt; 30 characters</p>
<h3>Update your git repository</h3>
<p>Next, add the new and updated files to your local git repopsitory:</p>
<pre class="brush: plain;">
git add .
git commit -m &quot;added the plugin_assets folder to git, updated the routes.rb for the new home page&quot;
</pre>
<h3>Push to Heroku</h3>
<pre class="brush: plain;">
heroku create
git push heroku master
</pre>
<h3>Create and update the database on Heroku</h3>
<p>Run this command to migrate the remote database</p>
<pre class="brush: plain;">
heroku rake db:migrate
</pre>
<p>Next push your local development database to Heroku so the project and wiki you created locally will be available to your users:</p>
<pre class="brush: plain;">
heroku db:push #Note that this step requires you have installed the &quot;taps&quot; gem.
</pre>
<h3>Test on Heroku</h3>
<ol>
<li>Finally go to the URL that the &#8220;heroku create&#8221; command reported.</li>
<li>Log in with admin/admin and verify that the wiki is the home page.</li>
</ol>
<p>&lt;/done!&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/18/deploying-a-redmine-wiki-to-heroku/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WWDC Day One</title>
		<link>http://blazingcloud.net/2010/06/14/wwdc-day-one/</link>
		<comments>http://blazingcloud.net/2010/06/14/wwdc-day-one/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:31:41 +0000</pubDate>
		<dc:creator>Lee</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[Objective-c]]></category>
		<category><![CDATA[WWDC]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=849</guid>
		<description><![CDATA[Apples annual conference kicked off last week and Blazing Cloud wasn&#8217;t about to miss it&#8217;s chance to attend. Many exciting things happened like a preview of the 4th generation iPhone, a preview of developer tools and a look into safari improvements. The keynote also offered up some interesting statistics and new device capabilities of iPhone [...]]]></description>
			<content:encoded><![CDATA[<p>Apples annual conference kicked off last week and Blazing Cloud wasn&#8217;t about to miss it&#8217;s chance to attend. Many exciting things happened like a preview of the 4th generation iPhone, a preview of developer tools and a look into safari improvements. The keynote also offered up some interesting statistics and new device capabilities of iPhone 4 that we wanted to share with you.</p>
<h2>iBooks</h2>
<p>In the first 65 days users have download over 5 million books</p>
<h3>Enhancement to iBooks</h3>
<p>Highlight sections<br />
Make notes<br />
Bookmark the page in the corner<br />
View and read PDFs</p>
<h2>AppStore</h2>
<p>Apple supports two platforms, HTML5 and AppStore (225,000 apps)<br />
15,000 apps submitted every week supporting up to 30 languages<br />
95% of apps are approved in 7 days<br />
5% of apps get rejected</p>
<h3>Reason why apps are rejected from the AppStore</h3>
<p>Use of private Apple APIs<br />
App doesn&#8217;t work like developer says it works<br />
The app crashes</p>
<p>Downloads from the AppStore total 5 billion<br />
$1 billion dollars have been paid out to developers thus far</p>
<h2>iPhone stats</h2>
<h3>Us smartphone market share Q1 of 2010</h3>
<p>RIM 35%<br />
iPhone 28%<br />
Winmo 19%<br />
Android 9%<br />
Other 9%</p>
<h3>US mobile browsers share Q1 of 2010</h3>
<p>iPhone 58.2%<br />
Android 22.7%<br />
Rim 12.7%<br />
Other 6.4%</p>
<h2>iPhone 4</h2>
<h3>1st new feature</h3>
<p>All new design<br />
9.3 mm thick<br />
&#8220;Thinnest smartphone on the planet&#8221;<br />
Camera and LED flash<br />
2nd mic for noise cancellation<br />
Integrated Antennas in the structure of the phone<br />
Stainless steel body<br />
Glass on front and back</p>
<h3>2nd new feature</h3>
<p>Retina display<br />
4 times as many pixels in the same area<br />
326 pixels per inch<br />
300 pixels per inch is the limit of the human retina to differentiate pixels<br />
3.5 inches 960&#215;640<br />
800:1 contrast ratio<br />
IPS technology<br />
78% of the pixels on the iPad on the iPhone</p>
<h3>3rd new featured</h3>
<p>Powered by the A4 processor<br />
3G talk time equals 7 hours<br />
3G browsing time equals 6 hours<br />
WIFI browsing time equals 10hours<br />
32G and 16G storage options</p>
<h3>4th new feature</h3>
<p>3 Axis Gyroscope<br />
Pitch, roll and yaw<br />
Rotation about gravity<br />
Gyro plus accelerometer provides 6 axis</p>
<h3>5th new feature</h3>
<p>New camera system<br />
5megapixel sensor<br />
Backside illuminated sensor<br />
5x digital zoom<br />
LED flash built in<br />
HD video recording 720p at 30 frames per sec<br />
Built in video editing (iMovie application)<br />
LED flash will stay on for video</p>
<h3>6th new feature</h3>
<p>Renaming iPhone OS to iOS 4<br />
1500 new developer APIs<br />
100 new user features<br />
Multitasking<br />
Folders<br />
Added bing as a search option (with google and yahoo)</p>
<p>Golden master candidate released June 7th</p>
<p>100th million iOS device (iPhone + ipads + iPods) sold</p>
<h3>7th new feature</h3>
<p>iBooks coming to iPhone<br />
Same features as the iPad<br />
Wireless sync between iPhone, iPad and iPod touch<br />
Same books for all devices at no extra charge</p>
<p>150 million accounts with credit cards (iBook store, AppStore and iTunes Store)<br />
Over 16 billion downloads from all three stores</p>
<h3>8th new feature</h3>
<p>iADs<br />
Ads keep you in your app which gives a better user experience<br />
Built right into iOS4<br />
Brands so far to sign up (within the last 8 weeks): Nissan, Citi, unilever, AT&#038;T, Chenel, GE, liberty mutual, State Farm, Gieco, Cambell, Sears, JCPennys, Target, Best Buy, DirecTV, tbs, and Disney</p>
<p>These companies committed 60 million dollars towards iAds</p>
<h3>9th new feature</h3>
<p>FaceTime video calling<br />
Uses wifi, no setup required<br />
Use front or rear camera<br />
Wifi only in 2010 have to work with the cellular companies to get their networks ready for video calling</p>
<h2>Price and availability</h2>
<p>2 colors white or black<br />
$299 for 32 gig $199 for 16 gig<br />
On sale June 24th<br />
Pre-sale June 15th</p>
<p>iOS 4 upgrades are free for everyone (iPhone + iPod Touch)!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/14/wwdc-day-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retrospectives: The Fish Bone</title>
		<link>http://blazingcloud.net/2010/06/10/retrospectives-the-fish-bone/</link>
		<comments>http://blazingcloud.net/2010/06/10/retrospectives-the-fish-bone/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 17:17:15 +0000</pubDate>
		<dc:creator>LiahHansen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blazingcloud.net/?p=838</guid>
		<description><![CDATA[Can a fish bone help make a good team great?  That depends on what kind of fish bone we are talking about&#8230;
Blazing Cloud recently purchased the book Agile  Retrospectives: Making Good Teams Great.  I skimmed through the book&#8217;s activities last week in preparation for leading a retrospective.  I picked the Fish Bone activity because [...]]]></description>
			<content:encoded><![CDATA[<p>Can a fish bone help make a good team great?  That depends on what kind of fish bone we are talking about&#8230;</p>
<p>Blazing Cloud recently purchased the book <em>Agile  Retrospectives: Making Good Teams Great</em>.  I skimmed through the book&#8217;s activities last week in preparation for leading a retrospective.  I picked the Fish Bone activity because it sounded light hearted and fun.  The activity is intended to help a team &#8220;Look past symptoms to identify root causes related to an issue&#8230;and find reasons behind problems and breakdowns&#8221;.  We brainstormed for a few minutes and decided on a topic to discuss:  Restarting Projects. We separated the potential issues surrounding restarting a project into three categories which we wrote down on each of the &#8220;bones&#8221;.   Then we brainstormed things we could change or improve in each category.  We ended up with a fish bone chart like this:</p>
<p><img src="http://blazingcloud.net/wordpress/wp-content/fishbone.jpg" alt="fishbone" /></p>
<p>I&#8217;d say the fish bone exercise helped us dig deeply into one important issue for Blazing Cloud.  Some members of the team didn&#8217;t like this exercise as much as other retrospective activities, mainly because they felt like there wasn&#8217;t enough of a positive ending or feeling of catharsis.  For me the most important role played by weekly retrospectives is building team moral and creating an atmosphere of good communication and openness.  Any time we get the team together and communicate openly, I think it is helpful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blazingcloud.net/2010/06/10/retrospectives-the-fish-bone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
