<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Adobe Evangelists</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=9986e99f8fddeca8b8249cdc645583d2</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=9986e99f8fddeca8b8249cdc645583d2&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 21:48:39 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Sample Code for my Intro to ECMAScript 6 Session at Dreamforce</title>
         <link>http://coenraets.org/blog/2015/09/sample-code-for-my-intro-to-ecmascript-6-session-at-dreamforce/</link>
         <description>Thanks everybody for attending my &amp;#8220;Introduction to ECMAScript 6&amp;#8243; session at Dreamforce. The source code for the examples I used are available in this repository on Github. I also wrote this ECMAScript 6 tutorial that would be a great next step if you want to get started with ES6. Finally, the slides for a similar [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=9029</guid>
         <pubDate>Tue, 22 Sep 2015 14:11:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>Thanks everybody for attending my &#8220;Introduction to ECMAScript 6&#8243; session at Dreamforce. </p>
<p>The source code for the examples I used are available in <a rel="nofollow" target="_blank" href="https://github.com/ccoenraets/intro-to-es6">this repository</a> on Github.</p>
<p>I also wrote this <a rel="nofollow" target="_blank" href="http://ccoenraets.github.io/es6-tutorial/">ECMAScript 6 tutorial</a> that would be a great next step if you want to get started with ES6.</p>
<p>Finally, the slides for a similar ES6 presentation I delivered earlier this year are available <a rel="nofollow" target="_blank" href="http://coenraets.org/present/es6">here</a>. </p>
<p>&nbsp;</p>]]></content:encoded>
         <category>ECMAScript 6</category>
      </item>
      <item>
         <title>Sample Code for My Lightning Components Sessions at Dreamforce</title>
         <link>http://coenraets.org/blog/2015/09/sample-code-for-my-lightning-components-sessions-at-dreamforce/</link>
         <description>Thanks everybody for attending my Lightning Components sessions at Dreamforce. Many of you have asked for the source code of the examples I used. Here are the links to different blog posts that include the code for Summer 15 orgs. I&amp;#8217;ll post Winter 16 compatible unmanaged packages soon. Mortgage Calculator and Amortization Table The source [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=9021</guid>
         <pubDate>Tue, 22 Sep 2015 13:54:47 +0000</pubDate>
         <content:encoded><![CDATA[<p>Thanks everybody for attending my Lightning Components sessions at Dreamforce. Many of you have asked for the source code of the examples I used. Here are the links to different blog posts that include the code for Summer 15 orgs. I&#8217;ll post Winter 16 compatible unmanaged packages soon.</p>
<h3>Mortgage Calculator and Amortization Table</h3>
<p>The source code is available <a rel="nofollow" target="_blank" href="https://developer.salesforce.com/blogs/developer-relations/2015/07/lightning-components-2.html">here</a>. See it in action in this video:</p>
<p></p> 
<h3>Rating Component</h3>
<p>The source code is available <a rel="nofollow" target="_blank" href="https://developer.salesforce.com/blogs/developer-relations/2015/06/lightning-components-creating-rating-component-using-svg.html">here</a>. See it in action in this video:</p>
<p></p> 
<h3>Hotel Locator</h3>
<p>The source code is available <a rel="nofollow" target="_blank" href="https://developer.salesforce.com/blogs/developer-relations/2015/07/application-composition-using-lightning-components-app-builder.html">here</a>. See it in action in this video:</p>
<p></p>]]></content:encoded>
         <category>Lightning Components</category>
      </item>
      <item>
         <title>Sample PhoneGap App with ReactJS</title>
         <link>http://devgirl.org/2015/09/22/sample-phonegap-app-with-reactjs/</link>
         <description>ReactJS has been getting a lot of attention and recently I decided to dig in myself to see what all the hype is about. ReactJS comes from the developers at Facebook, which may contribute to the popularity of it due to being backed by a big company (think AngularJS and Google). For the purposes of [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=8116</guid>
         <pubDate>Tue, 22 Sep 2015 13:44:14 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="https://facebook.github.io/react/"><img src="http://devgirl.org/wp-content/uploads/2015/09/reactjs-logo2.png" alt="reactjs-logo2" width="140" height="124" class="alignleft size-full wp-image-8133"/></a><br />
<a rel="nofollow" target="_blank" href="https://facebook.github.io/react/">ReactJS</a> has been getting a lot of attention and recently I decided to dig in myself to see what all the hype is about. <a rel="nofollow" target="_blank" href="https://facebook.github.io/react/">ReactJS</a> comes from the developers at Facebook, which may contribute to the popularity of it due to being backed by a big company (think <a rel="nofollow" target="_blank" href="https://angularjs.org/">AngularJS</a> and Google). </p>
<p>For the purposes of this post, I focused on two main goals: 1) get my feet wet with ReactJS and 2) write a sample hybrid app using it. I haven&#8217;t seen many hybrid samples using ReactJS around and figured it may help to share my findings with others interested as well. </p>
<h2>Mobile UI Framework Choices</h2>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2015/09/ts-icon.png"><img src="http://devgirl.org/wp-content/uploads/2015/09/ts-icon.png" alt="ts-icon" width="100" height="100" class="alignright size-full wp-image-8119"/></a> </p>
<p>When looking into using a mobile UI framework, you should consider the different categories available and choose based on your needs and preferences. Below are some general categories of UI frameworks available when building for mobile:</p>
<ol>
<li><strong>Lightweight</strong> &#8211; frameworks that provide the CSS layer for the UI but have no specific JavaScript dependencies. <a rel="nofollow" target="_blank" href="http://goratchet.com/">Ratchet</a> and <a rel="nofollow" target="_blank" href="http://topcoat.io/">Topcoat</a> are some examples.
</li>
<p></p>
<li><strong>Responsive</strong> &#8211; frameworks built in a responsive manner but not necessarily designed for mobile specifically (<a rel="nofollow" target="_blank" href="http://getbootstrap.com">Bootstrap</a>, <a rel="nofollow" target="_blank" href="http://foundation.zurb.com/">Foundation by Zurb</a>).
</li>
<p></p>
<li><strong>Mimic Native SDK&#8217;s</strong> &#8211; JavaScript frameworks built to mimic the native SDK&#8217;s for mobile. These frameworks typically handle things like application state, view stacks, navigation and rich interactions along with a full set of mobile-optimized UI widgets using JavaScript. <a rel="nofollow" target="_blank" href="http://ionicframework.com">Ionic</a>, <a rel="nofollow" target="_blank" href="http://onsen.io/">Onsen UI</a>, <a rel="nofollow" target="_blank" href="http://www.telerik.com/kendo-ui/open-source-core">Kendo UI</a>, <a rel="nofollow" target="_blank" href="https://jquerymobile.com/">jQuery Mobile</a> and <a rel="nofollow" target="_blank" href="https://www.sencha.com/products/touch/download/">Sencha Touch </a>for instance.
</li>
</ol>
<p>I personally prefer the 3rd type of UI framework when building my own apps and have been a huge fan of the <a rel="nofollow" target="_blank" href="http://ionicframework.co">Ionic Framework</a> since discovering it. Since I&#8217;m building specifically for ReactJS in this case however, I started searching for what options were available based around React. I ran across <a rel="nofollow" target="_blank" href="http://touchstonejs.io/">TouchstoneJS</a> and decided to give it a whirl. </p>
<h3>TouchstoneJS &#8211; Mobile UI Framework for React</h3>
<p>TouchsoneJS is an early stage project built by <a rel="nofollow" target="_blank" href="http://www.thinkmill.com.au/">Thinkmill</a> and is described as a: </p>
<blockquote><p>&#8220;<em>React.js powered UI framework for developing beautiful hybrid mobile apps.</em>&#8220;</p></blockquote>
<div class="snvdshc"><div class="synved-box-message synved-box-info">Thinkmill also created <a rel="nofollow" target="_blank" href="http://elemental-ui.com/">Elemental UI</a> &#8211; a UI toolkit for building web apps/sites with React.js, <a rel="nofollow" target="_blank" href="http://keystonejs.com/">KeystoneJS</a> &#8211; a Node.js CMS and web app framework and the <a rel="nofollow" target="_blank" href="https://itunes.apple.com/us/app/reacteurope/id1008565762?mt=8">ReactEurope 2015 Conference Companion app</a>.</div></div>
<h4>TouchstoneJS Features</h4>
<p>Below is a list of high-level features:</p>
<ul>
<li><strong>Mobile UI Components</strong> (comprehensive set including headers, lists, tabs, popups, form controls, buttons etc)</li>
<li><strong>Application State Management</strong></li>
<li><strong>Navigation</strong></li>
<li><strong>View Transitions</strong></li>
<li><strong>View Stacks</strong></li>
<li><strong>Optimized Animations</strong></li>
<li><strong>Customizable Components</strong></li>
</ul>
<h3>Sample App &#8211; iTunes Media Finder</h3>
<p>To get started my sample I first cloned the <a rel="nofollow" target="_blank" href="https://github.com/touchstonejs/touchstonejs-starter">TouchstoneJS starter project</a> and went to work trying to figure out how it was built using the Touchstone framework since there currently aren&#8217;t any docs available. </p>
<p>For my sample app content, I decided to use the <a rel="nofollow" target="_blank" href="http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html">iTunes Search API</a> again since I&#8217;ve created a few others using it with other UI frameworks and it&#8217;s a good use case for trying out various UI components (lists, form controls, navigation). The previous samples I built against the iTunes Search API are listed below for reference:</p>
<ol>
<li><a rel="nofollow" target="_blank" href="http://devgirl.org/2014/03/12/sample-phonegap-application-itunes-explorer-with-angularjsionic/">Ionic iTunes Explorer</a></li>
<li><a rel="nofollow" target="_blank" href="http://devgirl.org/2014/05/13/sample-phonegap-application-with-angularjsonsenui/">Onsen UI iTunes Explorer</a></li>
<li><a rel="nofollow" target="_blank" href="http://devgirl.org/2013/03/21/fun-with-angularjs/">Twitter Bootstrap Sample (web-based)</a></li>
</ol>
<div class="snvdshc"><div class="synved-box-message synved-box-warning">These samples are a bit out of date and will be updated but you should still be able to get a general idea of how they&#8217;re used for now.</div></div>
<p>My new iTunes ReactJS/TouchstoneJS app is available in <a rel="nofollow" target="_blank" href="http://github.com/hollyschinsky/phonegap-app-touchstonejs">my github account</a> with instructions on how to use it. But I&#8217;ve also included this web app version below so you can try it out quickly:</p>
<p></p> 
<p>(A fullscreen version is also available <a rel="nofollow" target="_blank" href="http://devgirl.org/files/phonegap-react/">here</a>.) </p>
<div class="snvdshc"><div class="synved-box-message synved-box-info">My sample uses JSONP to communicate with the iTunes Search API so it could be hosted as a web app too for easier sampling and avoid XHR issues.</div></div>
<div class="snvdshc"><div class="synved-box-message synved-box-warning">One thing to make note of is that there are some things in the TouchstoneJS Starter project that are not in sync with the latest TouchstoneJS version at the moment but my sample IS in sync and I&#8217;ve made notes to things to be aware of in the code and README in the meantime. </div></div>
<h3>iTunes Media Finder &#8211; Sample Highlights</h3>
<p>Below are a list of features my sample app contains along with some code snippets to show a bit of detail on how it&#8217;s done:</p>
<ul>
<li><strong>Navigation</strong> &#8211; shows the use of titles, left/right buttons and action handling for switching between views</li>
<pre>
getNavigation (props,app) {
    return {
        title: 'Search Criteria',
        leftArrow: false,
        rightAction: () =&gt; { app.transitionTo('tabs:about', { transition: 'fade-expand' }) },
        rightIcon: 'ion-information-circled'
    }
}
</pre>

<li><strong>View Transitions </strong>&#8211; uses different types of transitions and ways to trigger them
<pre>
   this.context.app.transitionTo('tabs:media-list',
	{transition: 'show-from-right',viewProps:{prevView: 'criteria', mediaType: this.state.mediaType, searchTerm: this.state.searchTerm,
	numResults: this.state.numResults}})
</pre>
<li><strong>Tabs</strong> &#8211; implements a simple tabbed interface</li>
<pre>
&lt;UI.Tabs.Navigator&gt;
    &lt;UI.Tabs.Tab onTap={this.selectTab.bind(this, 'criteria')} selected={selectedTabSpan === 'criteria'}&gt;
          &lt;span className=&quot;Tabs-Icon Tabs-Icon--form&quot; /&gt;
      &lt;UI.Tabs.Label&gt;Search Media&lt;/UI.Tabs.Label&gt;
    &lt;/UI.Tabs.Tab&gt;

   &lt;UI.Tabs.Tab onTap={this.selectTab.bind(this, 'settings')} selected={selectedTabSpan === 'settings'}&gt;
         &lt;span className=&quot;Tabs-Icon Tabs-Icon--settings&quot; /&gt;
       &lt;UI.Tabs.Label&gt;Preferences&lt;/UI.Tabs.Label&gt;
   &lt;/UI.Tabs.Tab&gt;
&lt;/UI.Tabs.Navigator&gt;
</pre>
<li><strong>UI Controls</strong> &#8211; uses most of the UI controls available in the framework</li>
<li><strong>Loading Popup</strong> &#8211; shows the use of a spinner when loading the list of results</li>
<pre>
&lt;UI.Popup visible={this.state.popup.visible}&gt;
	&lt;UI.PopupIcon name={this.state.popup.iconName} type={this.state.popup.iconType} spinning={this.state.popup.loading} /&gt;
	&lt;div&gt;&lt;strong&gt;{this.state.popup.header}&lt;/strong&gt;&lt;/div&gt;
&lt;/UI.Popup&gt;
</pre>
<li><strong>Results Filtering</strong> &#8211; filters the results list with a matching string</li>
<li><strong>Alert</strong> &#8211; built-in animation property you can set to slide down/up upon show and hide</li>
<pre>
   &lt;UI.Alertbar type={alertbar.type || 'default'} visible={alertbar.visible} animated&gt;{alertbar.text}&lt;/UI.Alertbar&gt;
</pre>
<pre>
   &lt;UI.SearchField type=&quot;dark&quot; value={this.state.filterString} onSubmit={this.submitFilter} onChange={this.updateFilter}
   onCancel={this.clearFilter} onClear={this.clearFilter} placeholder=&quot;Filter...&quot; /&gt;
</pre>
<li><strong>Preferences support</strong> &#8211; ability so save settings between tabs</li>
<li><strong>Pre-configured</strong> &#8211; icons, splash screens, plugins and settings for Android and iOS already set in config.xml for your own reference.</li>
</ul>
<h2>Summary</h2>
<p>The TouchstoneJS framework is still in early stages, lacks documentation and some features you may be looking for specifically (side menus, OS specific support, themes). However it does provide view navigation, a comprehensive set of UI widgets and application state out of the box and is definitely worth checking out if you want a jump start to building hybrid apps with ReactJS.</p>
<p>Their <a rel="nofollow" target="_blank" href="https://github.com/touchstonejs/touchstonejs-starter">starter app</a> and <a rel="nofollow" target="_blank" href="https://github.com/touchstonejs/touchstonejs-tasks">touchstonejs-tasks</a> project are also really helpful for getting started quickly. If you use my sample iTunes app project or the TouchstoneJS starter project, it&#8217;s already configured to use the touchstonejs-tasks for taking care of the build process. The Thinkmill developers also wrote and included some other useful libraries for things like <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/react-tappable">tap event handling,</a> <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/react-container">flexible layout containers</a> and <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/tween.js">optimized tweens</a> so you don&#8217;t have to worry about it. </p>
<p>If you run into any issues with my sample, please post to the <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/phonegap-app-touchstonejs/issues">issue tracker</a> for the project and I&#8217;ll take a look. Also if you notice anything I could be doing better in it please submit a PR or mention in an issue. I&#8217;m still learning ReactJS myself and open to feedback :).</p>
<h2>Resources</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.thinkmill.com.au/react-europe">React Europe Showbag </a>&#8211; an open source set of projects developed by the authors of TouchstoneJS to build the ReactEurope 2015 conference app. </li>
<li><a rel="nofollow" target="_blank" href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">React Developer Tools for Chrome</a> &#8211; I highly recommend adding this to your Chrome Developer tools for debugging React apps.</li>
</ul>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F09%2F22%2Fsample-phonegap-app-with-reactjs%2F&amp;linkname=Sample%20PhoneGap%20App%20with%20ReactJS" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F09%2F22%2Fsample-phonegap-app-with-reactjs%2F&amp;linkname=Sample%20PhoneGap%20App%20with%20ReactJS" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F09%2F22%2Fsample-phonegap-app-with-reactjs%2F&amp;linkname=Sample%20PhoneGap%20App%20with%20ReactJS" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2015%2F09%2F22%2Fsample-phonegap-app-with-reactjs%2F&amp;title=Sample%20PhoneGap%20App%20with%20ReactJS" id="wpa2a_2"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>The New Salesforce Lightning Design System: Lightning Experience Everywhere</title>
         <link>http://coenraets.org/blog/2015/09/the-new-salesforce-lightning-design-system-lightning-experience-everywhere/</link>
         <description>I just wrote a blog post on the brand new Lightning Design System on the Salesforce UX blog on medium. Check it out here. It also includes videos and code for 3 sample apps built with the Lightning Design System.</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=9013</guid>
         <pubDate>Tue, 08 Sep 2015 19:43:04 +0000</pubDate>
         <content:encoded><![CDATA[<p>I just wrote a blog post on the brand new Lightning Design System on the Salesforce UX blog on medium. Check it out <a rel="nofollow" target="_blank" href="https://medium.com/salesforce-ux/salesforce-lightning-design-system-lightning-experience-everywhere-dd15400da69">here</a>. It also includes videos and code for 3 sample apps built with the Lightning Design System.</p>]]></content:encoded>
         <category>Lightning Design System</category>
      </item>
      <item>
         <title>Trader Desktop with React and the Lightning Design System on Heroku</title>
         <link>http://coenraets.org/blog/2015/09/trader-desktop-with-react-and-the-lightning-design-system-on-heroku/</link>
         <description>After the real estate sample application I shared last week, here is a React + Lightning Design System version of the Trader Desktop sample application I&amp;#8217;ve shared before using other frameworks. The Lightning Design System is the new CSS toolkit from Salesforce that provides a set of UI components, UI patterns and guidelines focused on [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=9000</guid>
         <pubDate>Thu, 03 Sep 2015 15:26:39 +0000</pubDate>
         <content:encoded><![CDATA[<p>After the <a rel="nofollow" target="_blank" href="http://coenraets.org/blog/2015/09/reference-application-with-react-node-js-and-the-lightning-design-system/">real estate sample application</a> I shared last week, here is a React + <a rel="nofollow" target="_blank" href="https://www.lightningdesignsystem.com">Lightning Design System</a> version of the Trader Desktop sample application I&#8217;ve shared before using other frameworks. The Lightning Design System is the new CSS toolkit from Salesforce that provides a set of UI components, UI patterns and guidelines focused on Business/Enterprise app development.</p>
<p>The back-end is built with Node.js and Socket.io.</p>
<p>Check out this video for a quick walkthrough:</p>
<p></p> 
<h3>Live Version</h3>
<p>Click <a rel="nofollow" target="_blank" href="http://lightning-trader.herokuapp.com/">here</a> to experience the application live on Heroku. You can go ahead and buy or sell stocks in the app: the feed and the orders are obviously simulated.</p>
<h3>Source Code and Installation Instructions</h3>
<p>The source code, installation and build instructions are available in <a rel="nofollow" target="_blank" href="https://github.com/ccoenraets/lightning-trader">this repository</a> on Github. </p>]]></content:encoded>
      </item>
      <item>
         <title>Reference Application with React, Node.js, and the Lightning Design System</title>
         <link>http://coenraets.org/blog/2015/09/reference-application-with-react-node-js-and-the-lightning-design-system/</link>
         <description>If you are building business apps with React, I created a reference application with React and the Lightning Design System: the new language, framework, and vendor-independent CSS toolkit from Salesforce that provides a set of UI components, UI patterns and guidelines focused on Business/Enterprise app development. Check out this video for a quick walkthrough: The [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8991</guid>
         <pubDate>Wed, 02 Sep 2015 14:31:50 +0000</pubDate>
         <content:encoded><![CDATA[<p>If you are building business apps with React, I created a reference application with React and the <a rel="nofollow" target="_blank" href="https://www.lightningdesignsystem.com">Lightning Design System</a>: the new language, framework, and vendor-independent CSS toolkit from Salesforce that provides a set of UI components, UI patterns and guidelines focused on Business/Enterprise app development.</p>
<p>Check out this video for a quick walkthrough:</p>
<p></p> 
<p>The application is built with:</p>
<ul>
<li>React</li>
<li>Lightning Design System</li>
<li>ECMAScript 6 including modules</li>
<li>Babel to transpile the ECMAScript 6 code</li>
<li>Browserify to support modules in your current browser</li>
<li>Node.js</li>
<li>A Postgres database</li>
</ul>
<p>The source code and installation instructions are available in <a rel="nofollow" target="_blank" href="https://github.com/ccoenraets/lightning-react-app">this</a> GitHub repo.</p>]]></content:encoded>
      </item>
      <item>
         <title>Building React Applications with Babel, ECMAScript 6 and Modules</title>
         <link>http://coenraets.org/blog/2015/07/building-react-applications-with-babel-ecmascript-6-and-modules/</link>
         <description>With the deprecation of the React tools, the availability of ECMAScript 6 features (natively or through transpilers), and the emergence of Babel as both the React tools replacement and the ECMAScript 6 transpiler of choice, I thought I&amp;#8217;d share a simple reference application built with this new stack. In this article, I&amp;#8217;ll share three versions [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8878</guid>
         <pubDate>Wed, 29 Jul 2015 15:21:30 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://coenraets.org/apps/react-mortgage-calc/"><img src="http://coenraets.org/blog/wp-content/uploads/2015/07/calc.png" class="aligncenter size-full"/></a></p>
<p>With the <a rel="nofollow" target="_blank" href="http://facebook.github.io/react/blog/2015/06/12/deprecating-jstransform-and-react-tools.html">deprecation of the React tools</a>, the availability of ECMAScript 6 features (natively or through transpilers), and the emergence of <a rel="nofollow" target="_blank" href="http://babeljs.io/">Babel</a> as both the React tools replacement and the ECMAScript 6 transpiler of choice, I thought I&#8217;d share a simple reference application built with this new stack. In this article, I&#8217;ll share three versions of a Mortgage Calculator application written with React and built with Babel:</p>
<ol>
<li>Version 1: React with ECMAScript 5</li>
<li>Version 2: React with ECMAScript 6</li>
<li>Version 3: React with ECMAScript 6 and Modules</li>
</ol>
<div class="woo-sc-box  normal   ">This is the React version of the plain JavaScript Mortgage Calculator built in the <a rel="nofollow" target="_blank" href="http://ccoenraets.github.io/es6-tutorial/">ECMAScript 6 Tutorial</a> I shared recently. Take a look at the tutorial if you are interested in the plain version, or if you want to learn more about the ES6 features used in the application.</div>
<h2>Running the Hosted Version</h2>
<p>Click <a rel="nofollow" target="_blank" href="http://coenraets.org/apps/react-mortgage-calc/">here</a> to run the hosted version of the application.</p>
<h2>Setting Up Your Environment</h2>
<p>To run the application on your own system, clone <a rel="nofollow" target="_blank" href="https://github.com/ccoenraets/react-mortgage-calc">this repository</a> or download and unzip <a rel="nofollow" target="_blank" href="https://github.com/ccoenraets/react-mortgage-calc/archive/master.zip">this file</a>.</p>
<div class="woo-sc-box  normal   ">This repository includes a directory for each version of the app. Each directory has its own package.json to work like the root directory of a normal project. This structure was chosen for simplicity and to avoid dependencies and prerequisites.</div>
<h2>Version 1: React with ECMAScript 5</h2>
<p>To run this version:</p>
<ol>
<li>In your code editor, open <strong>package.json</strong> in the <strong>react-mortgage-calc/version1</strong> directory, and examine the project dependencies: <strong>babel</strong> is the only dependency. Open a command prompt, navigate to the <strong>react-mortgage-calc/version1</strong> directory, and type the following command to install Babel:
<pre>
npm install
</pre>
</li>
<li>Back in <strong>package.json</strong>, look at the <strong>scripts</strong> section and notice that a script named <strong>build-app</strong> is defined to build the project with Babel. On the command line, make sure you are in the <strong>react-mortgage-calc/version1</strong> directory, and type the following command to run the build script:
<pre>
npm run build-app
</pre>
<p>The application is built using Babel as the JSX transformer.
</li>
<li>In a browser, open <strong>index.html</strong> in <strong>react-mortgage-calc/version1</strong> and test the application.</li>
</ol>
<div class="woo-sc-box  normal   ">
There are different approaches to install and run Babel. For example, you could also install Babel globally and run it from the command line. Refer to the <a rel="nofollow" target="_blank" href="http://babeljs.io/docs/setup/">Using Babel</a> documentation for more information.<br />
</div>
<p><strong>Code Walkthrough:</strong></p>
<p>In your code editor, open <strong>app.js</strong> in the <strong>react-mortgage-calc/version1 directory</strong>. This is a basic implementation of a React app. Variables are declared in the global namespace: we&#8217;ll fix that in version 3.</p>
<h2>Version 2: React with ECMAScript 6</h2>
<p>To run this version:</p>
<ol>
<li>Open a command prompt, navigate to the <strong>react-mortgage-calc/version2</strong> directory, and type the following command to install Babel:
<pre>
npm install
</pre>
</li>
<li>On the command line, make sure you are in the <strong>react-mortgage-calc/version2</strong> directory, and type the following command to build the application:
<pre>
npm run build-app
</pre>
<p>The application is built using Babel as the JSX transformer and as the ES6 transpiler.
</li>
<li>In a browser, open <strong>index.html</strong> in <strong>react-mortgage-calc/version2</strong> and test the application.</li>
</ol>
<p><strong>Code Walkthrough:</strong></p>
<p>In your code editor, open <strong>app.js</strong> in the <strong>react-mortgage-calc/version2 directory</strong>. The code has been modified to use ECMAScript 6 features. For example:</p>
<ol>
<li>New <strong>let</strong> block-scoped variables:
<pre>
let monthlyRate = rate / 100 / 12;
</pre>
<p>Instead of traditional <strong>var</strong> function-scoped variables:</p>
<pre>
var monthlyRate = rate / 100 / 12;
</pre>
</li>
<li>Object literals
<pre>
return {monthlyPayment, amortization};
</pre>
<p>as a shorthand for:</p>
<pre>
return {monthlyPayment: monthlyPayment, amortization: amortization};
</pre>
</li>
<li>Object destructuring
<pre>
let {monthlyPayment, amortization} = 
    calculatePayment(principal, years, rate);
</pre>
<p>as a shorthand for:</p>
<pre>
var payment = calculatePayment(principal, years, rate);
var monthlyPayment = payment.monthlyPayment;
var amortization = payment.amortization;
</pre>
</li>
<li>Object Literals (functions):
<pre>
React.createClass({
    render() {
        return (&lt;header&gt;
            &lt;h1&gt;{this.props.title}&lt;/h1&gt;
        &lt;/header&gt;);
    }
});
</pre>
<p>as a shorthand for:</p>
<pre>
React.createClass({
    render: function() {
        return (&lt;header&gt;
            &lt;h1&gt;{this.props.title}&lt;/h1&gt;
        &lt;/header&gt;);
    }
});
</pre>
</li>
<li>Arrow functions
<pre>
var calculatePayment = (principal, years, rate) =&gt; {}
</pre>
<p>instead of:</p>
<pre>
var calculatePayment = function(principal, years, rate) {}
</pre>
<p>In the AmortizationChart component, also look at the implementation of map() using the concise and elegant arrow function notation (without {} and return) that you can use when the function implementation consists of a single return statement:</p>
<pre>
let items = this.props.data.map((year, index) =&gt; &lt;tr&gt;&lt;/tr&gt;);
</pre>
</li>
</ol>
<h2>Version 3: React with ECMAScript 6 Modules</h2>
<p>To run this version:</p>
<ol>
<li>In your code editor, open <strong>package.json</strong> in the <strong>react-mortgage-calc/version3</strong> directory, and examine the project dependencies. Notice that <strong>browserify</strong> and <strong>babelify</strong> were added to the devDependencies. <a rel="nofollow" target="_blank" href="http://browserify.org/">Browserify</a> was added to support modules in the transpiled ES5 implementation (<a rel="nofollow" target="_blank" href="http://webpack.github.io/">Webpack</a> is another popular choice). Babelify adds Babel support to Browserify. Now that we are working with modules, we&#8217;ll also load React as a module, hence the new React dependency in package.json. Open a command prompt, navigate to the <strong>react-mortgage-calc/version3</strong> directory, and type the following command to install the project dependencies (react, babel, browserify, babelify):
<pre>
npm install
</pre>
</li>
<li>Back in <strong>package.json</strong>, look at the <strong>scripts</strong> section and notice that a script named <strong>build-modular-app</strong> is defined to build the project with Browserify and Babel (through the Babelify transform). On the command line, make sure you are in the <strong>react-mortgage-calc/version3</strong> directory, and type the following command to run the build script:
<pre>
npm run build-modular-app
</pre>
</li>
<li>In a browser, open <strong>index.html</strong> in <strong>react-mortgage-calc/version3</strong> and test the application.</li>
</ol>
<p><strong>Code Walkthrough:</strong></p>
<ul>
<li>The business logic for a mortgage is encapsulated in <strong>modules/mortgage.js</strong></li>
<li>The UI logic for the Header is now encapsulated in <strong>modules/Header.js</strong></li>
<li>The UI logic for the MortgageCalculator is now encapsulated in <strong>modules/MortgageCalculator.js</strong></li>
<li>The UI logic for the AmortizationChart is now encapsulated in <strong>modules/AmortizationChart.js</strong></li>
<li>Notice the <strong>export</strong> or <strong>export default</strong> syntax in the modules, and the <strong>import</strong> syntax to &#8220;require&#8221; a module.
</ul>]]></content:encoded>
      </item>
      <item>
         <title>ECMAScript 6 Tutorial with Babel and Browserify</title>
         <link>http://coenraets.org/blog/2015/07/ecmascript-6-tutorial-with-babel-and-browserify/</link>
         <description>In this tutorial, you create a Mortgage Calculator with amortization table using many of the new ECMAScript 6 features. You use Babel to transpile the ECMAScript 6 application and use it in current browsers. You also use Browserify to provide the module implementation. Start the tutorial here</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8872</guid>
         <pubDate>Mon, 27 Jul 2015 18:44:47 +0000</pubDate>
         <content:encoded><![CDATA[<p>In this tutorial, you create a Mortgage Calculator with amortization table using many of the new ECMAScript 6 features. You use <a rel="nofollow" target="_blank" href="http://babeljs.io/">Babel</a> to transpile the ECMAScript 6 application and use it in current browsers. You also use <a rel="nofollow" target="_blank" href="http://browserify.org/">Browserify</a> to provide the module implementation.</p>
<p>Start the tutorial <a rel="nofollow" target="_blank" href="http://ccoenraets.github.io/es6-tutorial/">here</a></p>]]></content:encoded>
      </item>
      <item>
         <title>Let’s stop trying to visualize cloud computing as physical hardware</title>
         <link>https://gregsramblings.com/2015/05/30/lets-stop-trying-to-visualize-cloud-computing-as-physical-hardware/</link>
         <description>Until recently, I thought of cloud computing as the virtualization of physical hardware. I thought of virtual machines as servers, cloud storage as a collection of Internet-connected disks, and so on. To show how deep this mental model went for me, take a look at the screenshot below — it’s from a tablet app (iPad [&amp;#8230;]</description>
         <guid isPermaLink="false">https://gregsramblings.com/?p=4144</guid>
         <pubDate>Sat, 30 May 2015 18:23:40 +0000</pubDate>
         <content:encoded><![CDATA[<p>Until recently, I thought of cloud computing as the virtualization of physical hardware. I thought of virtual machines as servers, cloud storage as a collection of Internet-connected disks, and so on. To show how deep this mental model went for me, take a look at the screenshot below — it’s from a tablet app (iPad and Android) called &#8220;<em>Greg’s Toolkit</em>&#8221; that I conceived in 2011 and built with two friends.  The app would introspect the user’s Amazon Web Services account and create a visual computer room — racks filled with servers that represented my EC2 instances, disks that represented my S3 buckets and attached devices, and on and on.  Our pitch was that it made the virtual world familiar again.</p>
<p><a rel="nofollow" target="_blank" href="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/05/GregsToolkit1.jpg"><img class="alignnone size-full wp-image-4158" src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/05/GregsToolkit1.jpg" alt="GregsToolkit1" width="600" height="450"/></a></p>
<p>The app did OK, but it never gained the traction we had hoped for, so after a few months, we shut it down and moved on.</p>
<h3>The epiphany</h3>
<p>When I conceived Greg’s Toolkit, cloud computing was mostly a hobby for me &#8211; the back end of several apps and websites I created.  About a year ago, I joined the <a rel="nofollow" target="_blank" href="https://cloud.google.com/">Google Cloud Platform</a> team and my fun hobby suddenly became my new day job!  During the first few months at Google, I still thought of cloud computing as infrastructure in terms of physical entities such as “servers”, “machines”, “CPUs”, and “disks”.  When I started learning about <a rel="nofollow" target="_blank" href="https://cloud.google.com/appengine/">Google App Engine</a>, however, I began to see flaws in my thinking.  App Engine is a true platform-as-a-service (PaaS) that enables you to deploy your code without giving any thought to what type of hardware it’s implemented on.  Important needs, including auto-scaling, security, and authentication, are taken care of for you.  So it doesn’t really work in my screenshot above that mapped to a physical environment.  My mental model was quickly falling apart.</p>
<p>Soon after, I started learning about <a rel="nofollow" target="_blank" href="https://cloud.google.com/container-engine/">containers</a> (including <a rel="nofollow" target="_blank" href="https://www.docker.com/">Docker</a> and <a rel="nofollow" target="_blank" href="http://kubernetes.io/">Kubernetes</a>).  Containers are similar to VMs in some ways, but unlike VMs, you’re not virtualizing an entire server.  Containers are very lightweight compared to VMs because the OS is not part of the container itself.  You can even run multiple containers on the same host, each of which has its application isolation from a user point of view.  Obviously my mental model was now fully invalidated.  This epiphany has me looking at the future of cloud computing in a much broader way.</p>
<p>With my new expanded, non-physically-constrained view of cloud computing, I’ve been thinking about what the future might look like.  Today, major cloud vendors still use many physical terms in the titles and description of services.</p>
<p>Let’s take a look at <strong>storage</strong>.  When you need virtual disks with high IOPS, you select “SSD-based” storage.  The fact that SSDs are the actual devices used to provide the desired high disk performance is an implementation detail.  The fact that the type of physical hardware being used is exposed to the user actually contradicts the real value proposition of cloud computing, which is that you don’t have to be concerned with the implementation details.  I suspect that “SSD” is used because in today’s world, SSDs are universally known to be faster than standard disks, so it’s a bit of a marketing play.  Looking toward the future, it’s easy to imagine a world where you choose the performance requirements, durability requirements, and access models you need for your storage without the use of any physical (legacy?) terms.  Behind the scenes, the storage solution will be implemented by various means including SSDs, high speed memory, or some other technology based on our needs, but we will no longer be concerned about what actual hardware implemented the solution.  We’ve already seen some progress here from the major cloud vendors.  For example, <a rel="nofollow" target="_blank" href="https://cloud.google.com/bigtable">Google Cloud Bigtable</a> provides a familiar interface (HBase) with very high reliability and extreme Google-level scalability, and Google Cloud Bigtable does it without exposing the underlying details on how it’s implemented.  It’s crazy fast, it’s super reliable, and it uses an established interface, and that’s all we should care about.</p>
<div id="attachment_4176" style="width:410px;" class="wp-caption alignright"><a rel="nofollow" target="_blank" href="http://www.google.com/about/datacenters/"><img class="wp-image-4176 size-full" src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/05/google-data-center400.jpg" alt="google-data-center400" width="400" height="267"/></a><p class="wp-caption-text">A glimpse at some of the hardware that you don&#8217;t have to manage &#8212; one of the Google data centers &#8212; Pryor, Oklahoma</p></div>
<p>Now let’s talk about the <strong>compute</strong> side of things.  When looking at the various offerings of the major cloud vendors, you’ll quickly run into references to physical hardware and other implementation details.  There are references to the type of CPUs (e.g. Ivy Bridge, Haswell, etc.), number of cores, and CPU clock speeds.  Are these the details we need in the future of cloud computing, or do we need a new vocabulary that is more closely related to how we will use the computing power?  Most of us struggle as it is to relate actual performance to the concepts of clock speed, multi-core processing, and hyper-threading.  For example, which MacBook Pro is faster? — the model with “<i>2.9GHz dual-core Intel Core i5 Turbo Boost up to 3.3GHz</i>“, or the model with “<i>2.2GHz quad-core Intel Core i7 Turbo Boost up to 3.4GHz</i>“?  Is the quad core model faster than the dual core for all types of computing tasks?   Is the i5 GHz value directly comparable to the i7 GHz value?  You have to do a lot of studying to understand the differences, and it gets very technical <em>very</em> fast.  For most, these specs mean very little.  We simply care how fast the stuff we do will get done.  Most of us just take the <em>wine approach</em> and assume that the more expensive one must be better.</p>
<h3>The need for better abstraction</h3>
<p>During my college years, I briefly pursued a degree in Computer Engineering until I realized that I’m more of a software guy than a hardware guy (whew!).  The curriculum had several required electrical engineering courses where I learned that electricity is extremely complicated… more complicated that many of us care to understand!  However, most applications of electricity have been abstracted to relatively simple plumbing concepts where we think of the “flowing” of current measured in amps &#8212; a relatively simple metaphor that most of us <i>can</i> understand.  This simplified abstraction provides an adequate level of understanding for most common applications without requiring an understanding of how electricity actually works at the atomic level.</p>
<p>Cloud computing needs similar abstractions that let us focus on how computing power is applied rather than how it’s implemented.  This got me thinking about how we would need to define our computing needs when configuring our future cloud services.  When you boil it down to the ones and zeros, we have a series of instructions that need executing with various inputs and outputs.   How will we distinguish the need for extremely fast execution of a single stream of instructions and instructions that can be parallelized across multiple CPUs?  Will we need to specify that a specialized CPU is needed for certain types of instructions (e.g. GPU), or will that be a detail that is determined by the service automatically?  I’m now over my head, but hopefully you get my point.  We need to start thinking of cloud computing in different ways using a different vocabulary.</p>
<p>All of this has me pondering a few things:</p>
<ul>
<li>How will our vocabulary change as cloud evolves?</li>
<li>Does this future vocabulary include terms like disks, drives, SSDs, and CPUs?</li>
<li>How will we describe our storage and compute needs?</li>
<li>As network speeds continue to improve, will the physical location of our data and computing matter as long as we get the performance and durability we need?  In other words, is location another implementation detail that we will no longer be concerned about?</li>
<li>Will the need for hybrid cloud solutions diminish as cloud performance improves and prices continue to drop?  Does this become an unneeded implementation detail?</li>
</ul>
<p>If you look at how things have changed in the past few years in cloud computing and extrapolate how things could look in the near future, it&#8217;s super exciting.</p>
<p>&nbsp;</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F05%2F30%2Flets-stop-trying-to-visualize-cloud-computing-as-physical-hardware%2F&amp;title=Let%E2%80%99s%20stop%20trying%20to%20visualize%20cloud%20computing%20as%20physical%20hardware" id="wpa2a_2"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Introduction to ECMAScript 6 Slides</title>
         <link>http://coenraets.org/blog/2015/05/introduction-to-ecmascript-6-slides/</link>
         <description>I had a great time presenting &amp;#8220;Introduction to ECMAScript 6&amp;#8243; at the TelerikNEXT conference. Thanks to everybody who attended. My slides are available here.</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8864</guid>
         <pubDate>Wed, 20 May 2015 13:54:11 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://coenraets.org/present/es6"><br />
<img src="http://coenraets.org/blog/wp-content/uploads/2015/05/es6-slides.jpg"/><br />
</a><br />
I had a great time presenting &#8220;Introduction to ECMAScript 6&#8243; at the TelerikNEXT conference. Thanks to everybody who attended.</p>
<p>My slides are available <a rel="nofollow" target="_blank" href="http://coenraets.org/present/es6">here</a>.</p>]]></content:encoded>
         <category>ECMAScript 6</category>
      </item>
      <item>
         <title>Introduction to React.js Slides</title>
         <link>http://coenraets.org/blog/2015/05/introduction-to-react-js-slides/</link>
         <description>I had a great time presenting &amp;#8220;Introduction to React&amp;#8221; at the TelerikNEXT conference. Thanks to everybody who attended. My slides are available here.</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8867</guid>
         <pubDate>Wed, 20 May 2015 13:53:16 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://coenraets.org/present/react"><br />
<img src="http://coenraets.org/blog/wp-content/uploads/2015/05/react-slides.jpg"/><br />
</a><br />
I had a great time presenting &#8220;Introduction to React&#8221; at the TelerikNEXT conference. Thanks to everybody who attended.</p>
<p>My slides are available <a rel="nofollow" target="_blank" href="http://coenraets.org/present/react">here</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Amazon Web Services to Google Cloud Platform Service Mapping</title>
         <link>https://gregsramblings.com/2015/05/07/aws-to-gcp-mapping/</link>
         <description>As a Developer Advocate on the Google Cloud Platform team, I am frequently asked what services we provide.  If the person I’m talking to is familiar with Amazon Web Services (AWS), the quickest way to jump start an explanation of Google Cloud Platform is to start with a comparison to AWS’s similar services, then cover [&amp;#8230;]</description>
         <guid isPermaLink="false">https://gregsramblings.com/?p=4122</guid>
         <pubDate>Thu, 07 May 2015 16:40:43 +0000</pubDate>
         <content:encoded><![CDATA[<p>As a Developer Advocate on the Google Cloud Platform team, I am frequently asked what services we provide.  If the person I’m talking to is familiar with Amazon Web Services (AWS), the quickest way to jump start an explanation of Google Cloud Platform is to start with a comparison to AWS’s similar services, then cover the differences.</p>
<p>Below is a simple map between some of the major services in AWS and Google Cloud Platform.  This is not intended to be a complete mapping.  It would be unfair to both platforms to list every service because Google and Amazon are taking different approaches in many areas, making direct comparisons practically impossible.  I’m only listing the services where the comparison is helpful.</p>
<p><span style="color:#ff0000;"><strong>Updated September 23, 2015</strong></span> as a result of Amazon launching S3 Standard &#8211; Infrequent Access (IA) and Google Cloud Dataproc</p>
<table>
<tbody>
<tr>
<th><b>Category</b></th>
<th><b>Amazon Web Services</b></th>
<th><b>Google Cloud Platform</b></th>
</tr>
<tr>
<td>Compute</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/ec2/">EC2</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/compute/">Compute Engine</a></td>
</tr>
<tr>
<td>Compute</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/ecs/">EC2 Container Service</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/container-engine/">Container Engine</a></td>
</tr>
<tr>
<td>Compute</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/elasticbeanstalk/">Elastic Beanstalk</a> **</td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/appengine/">App Engine</a>  **</td>
</tr>
<tr>
<td>Storage</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3/">S3</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/">Cloud Storage</a></td>
</tr>
<tr>
<td>Storage</td>
<td><a rel="nofollow" target="_blank" href="https://aws.amazon.com/s3/storage-classes/">Amazon S3 Standard &#8211;<br />
Infrequent Access (IA)</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage-nearline/">Cloud Storage Nearline</a></td>
</tr>
<tr>
<td>Storage</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/glacier/">Glacier</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage-nearline/">Cloud Storage Nearline</a></td>
</tr>
<tr>
<td>Storage</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/cloudfront/">CloudFront</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/concepts-techniques">Cloud Storage</a> (edge caching is provided for public buckets)</td>
</tr>
<tr>
<td>Database</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/rds/">RDS</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/sql/">Cloud SQL</a></td>
</tr>
<tr>
<td>Database</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/dynamodb/">DynamoDB</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/datastore/">Cloud Datastore</a> and <a rel="nofollow" target="_blank" href="https://cloud.google.com/bigtable/">Cloud Bigtable</a></td>
</tr>
<tr>
<td>Big Data</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/redshift/">Redshift</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/bigquery/">BigQuery</a></td>
</tr>
<tr>
<td>Big Data</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/sqs/">SQS</a>/<a rel="nofollow" target="_blank" href="http://aws.amazon.com/kinesis/">Kinesis</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/pubsub/">Cloud Pub/Sub</a></td>
</tr>
<tr>
<td>Big Data</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/elasticmapreduce/">EMR</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/dataproc/">Cloud Dataproc</a></td>
</tr>
<tr>
<td>Monitoring</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/cloudwatch/">CloudWatch</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/monitoring/">Cloud Monitoring</a> and <a rel="nofollow" target="_blank" href="https://cloud.google.com/logging/docs/">Cloud Logging</a></td>
</tr>
<tr>
<td>Networking</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/route53/">Route53</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/dns/">Cloud DNS</a> and <a rel="nofollow" target="_blank" href="http://domains.google.com">Google Domains</a></td>
</tr>
<tr>
<td>Networking</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/directconnect/">Direct Connect</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/networking/#interconnect">Cloud Interconnect</a></td>
</tr>
<tr>
<td>Other</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/cloudformation/">CloudFormation</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/deployment-manager/">Cloud Deployment Manager</a></td>
</tr>
<tr>
<td>Other</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/ses/">SES</a></td>
<td><a rel="nofollow" target="_blank" href="https://cloud.google.com/compute/docs/tutorials/sending-mail">SendGrid</a> (partner)</td>
</tr>
<tr>
<td>Other</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/workmail/">WorkMail</a></td>
<td><a rel="nofollow" target="_blank" href="http://mail.google.com">Gmail</a> (also see <a rel="nofollow" target="_blank" href="https://www.google.com/work/">Google for Work</a>)</td>
</tr>
<tr>
<td>Other</td>
<td><a rel="nofollow" target="_blank" href="http://aws.amazon.com/workdocs/">WorkDocs</a></td>
<td><a rel="nofollow" target="_blank" href="https://www.google.com/docs/about/">Google Docs</a> (also see <a rel="nofollow" target="_blank" href="https://www.google.com/work/">Google for Work</a>)</td>
</tr>
</tbody>
</table>
<p>** AWS Elastic Beanstalk and Google App Engine are often described as similar offerings, but there are significant differences in their approaches.  Both offer auto-scaling, load balancing, monitoring, etc., but unlike App Engine, Elastic Beanstalk requires the typical system administration that raw VMs require (OS updates, etc.).  Google App Engine is a PaaS, meaning that it’s fully managed, so all of these administrative tasks are handled by Google.  The basic App Engine setup includes built-in services such as Task Queues, Memcache, Users API, and more.</p>
<p>If you require unmanaged VMs, Google also has <a rel="nofollow" target="_blank" href="https://cloud.google.com/compute/docs/autoscaler/">auto-scaling</a>, <a rel="nofollow" target="_blank" href="https://cloud.google.com/compute/docs/load-balancing/">load balancing</a>, and <a rel="nofollow" target="_blank" href="https://cloud.google.com/monitoring/">monitoring</a> of unmanaged VMs as features of <a rel="nofollow" target="_blank" href="https://cloud.google.com/compute/">Google Compute Engine</a>.  There is also an alternative hosting model now available as part of Google App Engine called <a rel="nofollow" target="_blank" href="https://cloud.google.com/appengine/docs/managed-vms/">Managed VMs</a>.</p>
<p>My advice is to do your homework and understand these models thoroughly before diving in on either platform.  Each has unique advantages.</p>
<p>I&#8217;ll have more posts in the near future with more specifics on several of the offerings.  Stay tuned!</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F05%2F07%2Faws-to-gcp-mapping%2F&amp;title=Amazon%20Web%20Services%20to%20Google%20Cloud%20Platform%20Service%20Mapping" id="wpa2a_4"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Apache Cordova Newsflash!</title>
         <link>http://devgirl.org/2015/04/24/apache-cordova-newsflash/</link>
         <description>Recently there have been some significant updates in Cordova to be aware of if you haven&amp;#8217;t seen them already. These are included in the latest Cordova Android, Cordova Tools and Cordova Plugins releases this past week. Below is a summary of the highlights in case you missed them. Android 4.0.0 supports pluggable WebViews (hint: Crosswalk) [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7715</guid>
         <pubDate>Fri, 24 Apr 2015 13:24:44 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2015/04/news_128x128_32.png"><img src="http://devgirl.org/wp-content/uploads/2015/04/news_128x128_32.png" alt="news_128x128_32" width="128" height="128" class="alignleft size-full wp-image-7761"/></a>Recently there have been some significant updates in Cordova to be aware of if you haven&#8217;t seen them already. These are included in the latest <a rel="nofollow" target="_blank" href="https://cordova.apache.org/announcements/2015/04/15/cordova-android-4.0.0.html">Cordova Android</a>, <a rel="nofollow" target="_blank" href="https://cordova.apache.org/news/2015/04/21/tools-release.html">Cordova Tools</a> and <a rel="nofollow" target="_blank" href="https://cordova.apache.org/announcements/2015/04/21/plugins-release-and-move-to-npm.html">Cordova Plugins </a>releases this past week.<br />
<br />
Below is a summary of the highlights in case you missed them.</p>
<hr>
<ul>
<li></li>
<li>
<h4>Android 4.0.0 supports pluggable WebViews (hint: Crosswalk) </h4>
<p>Apache Cordova now supports pluggable WebViews for Android. This news feature allows you to easily use <a rel="nofollow" target="_blank" href="https://crosswalk-project.org/">Crosswalk</a> to replace the default WebView. To take advantage of Crosswalk you&#8217;ll just need to install the <a rel="nofollow" target="_blank" href="https://github.com/MobileChromeApps/cordova-crosswalk-engine">new Crosswalk plugin </a></p>
<div class="snvdshc"><div class="synved-box-message synved-box-info">Crosswalk is a modern WebView that can be used instead of the default Android WebView. It provides better support for the latest HTML5 features and allows you to provide a consistent experience across the various versions of Android and different manufacturers. </div></div>
<p>Read more in the <a rel="nofollow" target="_blank" href="http://cordova.apache.org/announcements/2015/04/15/cordova-android-4.0.0.html">cordova-android 4.0.0 release news here.</a>
</li>
<li>
<h4>Cordova Plugins in <a rel="nofollow" target="_blank" href="https://www.npmjs.com/">npm</a> and Renamed</h4>
<p>Cordova plugins are now stored in npm (node package manager) and renamed with id&#8217;s of <strong>cordova-plugin-*,</strong> rather than the form of <strong>org.apache.cordova.*</strong>. The new id is a bit shorter and easier to remember, which should be helpful. The CLI (version 5.0.0+) will fetch the plugin from either npm or the original <a rel="nofollow" target="_blank" href="http://cordova.plugins.io">Cordova Plugin Registry</a> based on the id you specify when you add your plugin. If you use <strong>cordova-plugin-device</strong> for instance, the CLI will fetch it from npm, otherwise from the <a rel="nofollow" target="_blank" href="http://cordova.plugins.io">Cordova Plugin Registry</a> when the (<strong>org.apache.cordova.device</strong>) is used. </p>
<p><div class="snvdshc"><div class="synved-box-message synved-box-warning">Developers are strongly encouraged to use the new id&#8217;s and add any existing or new plugins they&#8217;ve created there as well and add the <code>ecosystem:cordova</code> tag to their package.json file. Specific instructions on adding your plugin and details about this change can be found <a rel="nofollow" target="_blank" href="http://cordova.apache.org/announcements/2015/04/21/plugins-release-and-move-to-npm.html">here</a>. </div></div>
</li>
<li>
<h4>Whitelist Handling Change</h4>
<p>The whitelist code was moved out of core Cordova and into a <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/cordova-plugin-whitelist">new Cordova whitelist plugin</a>. This new whitelist is enhanced to be more secure and configurable, but the legacy whitelist behavior is still available <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/cordova-plugin-legacy-whitelist">via a separate legacy whitelist plugin</a> but NOT recommended. <a rel="nofollow" target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/Security/CSP/Introducing_Content_Security_Policy">Content-Security-Policy (CSP)</a> is now supported and is the recommended approach. As a result of the new whitelist handling, you may require some additional configuration settings in the config.xml file as shown below:</p>
<pre>
    &lt;plugin name=&quot;cordova-plugin-whitelist&quot; spec=&quot;1&quot; /&gt;
    &lt;access origin=&quot;*&quot; /&gt;
    &lt;allow-intent href=&quot;http://*/*&quot; /&gt;
    &lt;allow-intent href=&quot;https://*/*&quot; /&gt;
    &lt;allow-intent href=&quot;tel:*&quot; /&gt;
    &lt;allow-intent href=&quot;sms:*&quot; /&gt;
    &lt;allow-intent href=&quot;mailto:*&quot; /&gt;
    &lt;allow-intent href=&quot;geo:*&quot; /&gt;
    &lt;platform name=&quot;android&quot;&gt;
        &lt;allow-intent href=&quot;market:*&quot; /&gt;
    &lt;/platform&gt;
    &lt;platform name=&quot;ios&quot;&gt;
        &lt;allow-intent href=&quot;itms:*&quot; /&gt;
        &lt;allow-intent href=&quot;itms-apps:*&quot; /&gt;
    &lt;/platform&gt;
</pre>
<div class="snvdshc"><div class="synved-box-message synved-box-info"><strong>NOTE:</strong> When you create a new project based on the default hello world project, your config.xml will already be preconfigured with these settings.</div></div>
<div class="snvdshc"><div class="synved-box-message synved-box-warning"><strong>IMPORTANT:</strong> Network requests are blocked by default without <code>cordova-plugin-whitelist</code>, so install this plugin even to allow all requests, and even if you are using CSP.<br />
</div></div>
<p>More details can be found <a rel="nofollow" target="_blank" href="https://cordova.apache.org/announcements/2015/04/21/plugins-release-and-move-to-npm.html">here</a>.
</li>
<li>
<h4>Saving Plugins and Platforms</h4>
<p>You can save the plugins and platforms used in your project easily now a few different ways using either a <code>save</code> command or <code>--save</code> flag. Using these will cause new tags to be added to your config.xml to save the specific version so it can be auto-configured on another machine. This is super useful when working with a team or moving to another machine since you should never be checking those folders into your source control system. With this change, they are automatically added when the CLI finds them in the config.xml file during the <code>prepare</code> step (automatically done with a <code>build</code> or <code>run</code>) so it saves extra setup time. Note that when you remove a plugin or platform you should also specify the <code>--save</code> to cause it to be removed from the config.xml.<br />
<br />
Some examples of the different ways to use the new command or flag are shown below:</p>
<h4>Saving Plugins</h4>
<p> Using <code>--save</code> flag<br />
<code><br />
$ cordova plugin add cordova-plugin-device --save<br />
$ cordova plugin remove cordova-plugin-device --save<br />
</code></p>
<p>This results in the following line being written ore removed from the config.xml:</p>
<pre>
    &lt;plugin name=&quot;cordova-plugin-device&quot; spec=&quot;1&quot; /&gt;
</pre>
<p> Using <code>save</code> command<br />
<code><br />
$ cordova plugin save<br />
</code></p>
<p>The above line will save all plugins that have been added to your project at once. </p>
<div class="snvdshc"><div class="synved-box-message synved-box-success">Note: The plural version also works (ie: <code>$ cordova plugins save</code>)</div></div>
<p>Below are some examples and the resulting console output:<br />
<code><br />
$ cordova plugin add cordova-plugin-device --save<br />
Fetching plugin "cordova-plugin-device" via npm<br />
npm http GET https://registry.npmjs.org/cordova-plugin-device<br />
npm http 200 https://registry.npmjs.org/cordova-plugin-device<br />
npm http GET https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-1.0.0.tgz<br />
npm http 200 https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-1.0.0.tgz<br />
Saved plugin info for "cordova-plugin-device" to config.xml<br />
</code><br />
<code><br />
$ cordova plugin remove cordova-plugin-contacts --save<br />
Uninstalling cordova-plugin-contacts from ios<br />
Removing "cordova-plugin-contacts"<br />
config.xml entry for cordova-plugin-contacts is removed<br />
</code></p>
<h4>Saving Platforms</h4>
<p> Using <code>--save</code> flag<br />
<code><br />
$ cordova platform add ios --save<br />
$ cordova platform remove ios --save<br />
$ cordova platform update ios --save<br />
</code></p>
<p>This results in the following line being added to your config.xml:</p>
<pre>
    &lt;engine name=&quot;ios&quot; spec=&quot;3.8.0&quot; /&gt;
</pre>
<p> Using <code>save</code> command<br />
<code><br />
$ cordova platform save<br />
</code></p>
<p>The above line will save all platforms that have been added to your project at once. </p>
<div class="snvdshc"><div class="synved-box-message synved-box-success">Note: The plural version also works (i.e.:<code>$ cordova platforms save</code>).</div></div>
<p>Below are some examples and the resulting console output:</p>
<p><code><br />
$ cordova platform add firefoxos --save</p>
<p>Adding firefoxos project...<br />
Project Path platforms/firefoxos<br />
Package Name io.cordova.hellocordova<br />
Project Name HelloCordova<br />
Installing "cordova-plugin-whitelist" for firefoxos<br />
Installing "org.apache.cordova.console" for firefoxos<br />
Installing "org.apache.cordova.contacts" for firefoxos<br />
Installing "org.apache.cordova.device" for firefoxos<br />
--save flag or autosave detected<br />
Saving firefoxos@^3.6.3 into config.xml file ...`<br />
</code></p>
<div class="snvdshc"><div class="synved-box-message synved-box-info">Note how it also added any plugins added or found in the config.xml file to the added platform automatically as well.</div></div>
<p><code><br />
$ cordova platform remove firefoxos --save</p>
<p>Removing firefoxos from config.xml file ...<br />
</code></p>
<p>Read the <a rel="nofollow" target="_blank" href="https://cordova.apache.org/news/2015/04/21/tools-release.html">official blog post</a> for details and to find out the rest of the changes in the latest release.
</li>
<li>
<h4>Config.xml <code>&lt;feature&gt;</code> tag now <code>&lt;plugin&gt;</code> </h4>
<p>If you use the <code>&lt;feature&gt;</code> tag to specify custom configuration for a platform or version, you should now use the <code>&lt;plugin&gt;</code> tag. The <code>&lt;feature&gt;</code> tag will still be backwards compatible, but you should be using the <code>&lt;plugin&gt;</code> tag going forward. If you&#8217;re unsure of the details of the original <code>&lt;feature&gt;</code>  tag, check out an example and more details <a rel="nofollow" target="_blank" href="http://devgirl.org/files/config-app/">here</a>.
</li>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F04%2F24%2Fapache-cordova-newsflash%2F&amp;linkname=Apache%20Cordova%20Newsflash%21" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F04%2F24%2Fapache-cordova-newsflash%2F&amp;linkname=Apache%20Cordova%20Newsflash%21" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F04%2F24%2Fapache-cordova-newsflash%2F&amp;linkname=Apache%20Cordova%20Newsflash%21" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2015%2F04%2F24%2Fapache-cordova-newsflash%2F&amp;title=Apache%20Cordova%20Newsflash%21" id="wpa2a_4"></a></p></ul>]]></content:encoded>
      </item>
      <item>
         <title>Why Google Flights is Awesome – a Real-World Example</title>
         <link>https://gregsramblings.com/2015/04/21/why-google-flights-is-awesome/</link>
         <description>Google Flights does everything I&amp;#8217;ve ever wanted in a flight search tool.  You can of course search for all flights for a specific date, airline, departure airport, and destination airport, but you can also filter based on flight duration, number of stops, airline/alliances, flight times, etc..  Rather than list all of the features, I&amp;#8217;ll show a real-world [&amp;#8230;]</description>
         <guid isPermaLink="false">https://gregsramblings.com/?p=4104</guid>
         <pubDate>Tue, 21 Apr 2015 07:54:56 +0000</pubDate>
         <content:encoded><![CDATA[<p>Google Flights does everything I&#8217;ve ever wanted in a flight search tool.  You can of course search for all flights for a specific date, airline, departure airport, and destination airport, but you can also filter based on flight duration, number of stops, airline/alliances, flight times, etc..  Rather than list all of the features, I&#8217;ll show a real-world example.  Google Flights puts all of the search parameters in the URL, which makes it easy to share my complex flight search:</p>
<p><a rel="nofollow" target="_blank" href="https://www.google.com/flights/#search;f=SFO,OAK,SJC;t=TPA,MCO;d=2015-07-12;r=2015-07-16;s=1;ti=t0600-2100l1600-2300,t0800-1400l1300-2300;md=540">https://www.google.com/flights/#search;f=SFO,OAK,SJC;t=TPA,MCO;d=2015-07-12;r=2015-07-16;s=1;ti=t0600-2100l1600-2300,t0800-1400l1300-2300;md=540</a></p>
<p>Here&#8217;s what this search finds (you can find all of this in the above URL):</p>
<ul>
<li>Departing from San Francisco, Oakland, or San Jose airport (<strong>f=SFO,OAK,SJC;</strong>)</li>
<li>Flying to Tampa or Orlando airport (<strong>t=TPA,MCO;</strong>)</li>
<li>Departing on July 12, 2015, Returning on July 16, 2015 (<strong>d=2015-07-12;r=2015-07-16;</strong>)</li>
<li>No more than 1 stop (<strong>s=1;</strong>) (s=0; would return only direct flights)</li>
<li>Outbound flight departing between 6am and 9pm; Arriving between 4pm and 11pm; (<strong>ti=&#8230;</strong>)</li>
<li>Return flight departing between 8am and 2pm; Arriving between 1pm and 11pm; (<strong>ti=&#8230;</strong>)</li>
<li>Total flight time under 9 hours (<strong>md=540;</strong> [minutes])</li>
</ul>
<p>The results (as of this writing) are as below (screenshot).  Depending on when you are reading this article, you might need to tweak the dates to get some results.  Once you select your flights, you are taken directly to the airline&#8217;s website to book the flight, so this isn&#8217;t adding any unnecessary travel booking agencies.</p>
<p>Hopefully this gives you an idea of how powerful Google Flights really is.  I can also add filters based on price range, airlines/alliances, cabin class, etc..  It also has fantastic support for multi-city flights.</p>
<p><a rel="nofollow" target="_blank" href="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/04/googleflights.jpg"><img class=" size-full wp-image-4105 alignnone" src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/04/googleflights.jpg" alt="googleflights" width="700" height="819"/></a></p>
<p>&nbsp;</p>
<h3>Finding the cheapest dates to fly</h3>
<p>If your dates are flexible, Google Flights has another great feature to find the lowest fair.  By clicking the little bar-graph icon on the view above, I get the following:</p>
<p><a rel="nofollow" target="_blank" href="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/04/googleflights2.jpg"><img class="alignnone size-full wp-image-4109" src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/uploads/2015/04/googleflights2.jpg" alt="googleflights2" width="700" height="671"/></a></p>
<p>I&#8217;ve been using Google Flights for several months, and on several complex itineraries for both work and personal flights.  It&#8217;s been absolutely perfect and has simplified my travel booking significantly.</p>
<p>More info about Google Flights can be found at <a rel="nofollow" target="_blank" href="https://support.google.com/flights">https://support.google.com/flights</a>.</p>
<p>Full disclosure: I work for Google as part of the <a rel="nofollow" target="_blank" href="https://cloud.google.com">Google Cloud Platform</a> Developer Relations team.  However, I do not work with the <a rel="nofollow" target="_blank" href="https://flights.google.com">Google Flights</a> team, so this post is written purely to share the awesomeness of Google Flights.  The fact that it&#8217;s built by another team at Google is simply a happy coincidence.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F04%2F21%2Fwhy-google-flights-is-awesome%2F&amp;title=Why%20Google%20Flights%20is%20Awesome%20%E2%80%93%20a%20Real-World%20Example" id="wpa2a_6"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Creating a Salesforce Lightning Map Component</title>
         <link>http://coenraets.org/blog/2015/04/creating-a-salesforce-lightning-map-component/</link>
         <description>The best way to experiment with a new component framework is to create components, and a simple Map component is often one of the first candidates that come to mind. I this article, I share a Lightning Map Component built with the popular Leaflet open-source library. This component also provides an example of loading external [&amp;#8230;]</description>
         <guid isPermaLink="false">http://coenraets.org/blog/?p=8823</guid>
         <pubDate>Wed, 08 Apr 2015 15:40:14 +0000</pubDate>
         <content:encoded><![CDATA[<p>The best way to experiment with a new component framework is to create components, and a simple Map component is often one of the first candidates that come to mind.</p>
<div>
<img src="http://coenraets.org/blog/wp-content/uploads/2015/04/leaflet2.jpg" width="320" style="float:left;margin-right:10px;margin-bottom:10px;"/>
<p><img src="http://coenraets.org/blog/wp-content/uploads/2015/04/leaflet1.jpg" width="320" style="float:left;margin-right:10px;margin-bottom:10px;"/>
</div>
<p style="clear:both;">I this article, I share a Lightning Map Component built with the popular <a rel="nofollow" target="_blank" href="http://leafletjs.com/">Leaflet</a> open-source library.</p>
<p>This component also provides an example of loading external Javascript libraries and CSS stylesheets using the <strong>ltng:require</strong> tag.</p>
<p>Read the full article <a rel="nofollow" target="_blank" href="https://developer.salesforce.com/blogs/developer-relations/2015/04/creating-salesforce-lightning-map-component.html">here</a></p>]]></content:encoded>
         <category>Lightning Components</category>
      </item>
      <item>
         <title>Working with Google Cloud Storage Nearline using gsutil</title>
         <link>https://gregsramblings.com/2015/03/12/google-nearline-storage-demo/</link>
         <description>Yesterday, we announced Google Cloud Storage Nearline.  Here are a few simple examples of working with nearline storage using the gsutil command-line tool: Important links about Nearline storage: Nearline home page Nearline whitepaper Nearline documentation</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=4083</guid>
         <pubDate>Thu, 12 Mar 2015 08:14:05 +0000</pubDate>
         <content:encoded><![CDATA[<p>Yesterday, we <a rel="nofollow" title="Google Cloud Storage Nearline in 30 seconds" target="_blank" href="http://gregsramblings.com/2015/03/11/google-nearline-storage/">announced</a> Google Cloud Storage Nearline.  Here are a few simple examples of working with nearline storage using the <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/getting-started-gsutil">gsutil</a> command-line tool:</p>
<pre>
#Create a new bucket:
gsutil mb -c nearline gs://nearline-bucket

#rsync the current directory to our new nearline bucket:
gsutil -m rsync -r . gs://nearline-bucket

# Copy a specific file from the nearline bucket to a local directory:
gsutil cp gs://nearline-bucket/installers/build142.dmg ~/restore

# Copy the contents of another bucket to our new nearline bucket:
gsutil cp -r gs://mybucket/* gs://nearline-bucket
</pre>
<h3>Important links about Nearline storage:</h3>
<ul>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/nearline-storage">Nearline home page</a></li>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/files/GoogleCloudStorageNearline.pdf">Nearline whitepaper</a></li>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/storage-classes">Nearline documentation</a></li>
</ul>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F03%2F12%2Fgoogle-nearline-storage-demo%2F&amp;title=Working%20with%20Google%20Cloud%20Storage%20Nearline%20using%20gsutil" id="wpa2a_8"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Google Cloud Storage Nearline in 30 seconds</title>
         <link>https://gregsramblings.com/2015/03/11/google-nearline-storage/</link>
         <description>Today, we announced Google Cloud Storage Nearline.  The announcement and various docs have all of the details, but here&amp;#8217;s the quick scoop: It&amp;#8217;s storage at $0.01/GB/Month! &amp;#8212; so 1TB would be $10/month. Data retrieval is $0.01/GB (plus normal egres charges) Here&amp;#8217;s the important part &amp;#8212; Retrieval response time is only ~3 seconds (compared to 3 to 5 [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=4078</guid>
         <pubDate>Wed, 11 Mar 2015 14:45:02 +0000</pubDate>
         <content:encoded><![CDATA[<p>Today, we announced Google Cloud Storage Nearline.  The <a rel="nofollow" target="_blank" href="http://googlecloudplatform.blogspot.com/2015/03/introducing-Google-Cloud-Storage-Nearline-near-online-data-at-an-offline-price.html">announcement</a> and various docs have all of the details, but here&#8217;s the quick scoop:</p>
<ul>
<li>It&#8217;s storage at $0.01/GB/Month! &#8212; so 1TB would be $10/month.</li>
<li>Data retrieval is $0.01/GB (plus normal egres charges)</li>
<li>Here&#8217;s the important part &#8212; Retrieval response time is only ~3 seconds (compared to 3 to 5 hours for AWS Glacier).  After first byte, it&#8217;s 4 MB/s of throughput per TB of data stored.</li>
<li>It uses the same command-line tools and APIs as the other Google Cloud Storage &#8211; it&#8217;s simply a new storage class.</li>
<li>It&#8217;s available today (in beta) (it&#8217;s time to move my 120,000+ images to this new storage class!)</li>
<li>Did you see the part about it being $0.01/GB/Month?!</li>
</ul>
<h3>Important links about Nearline storage:</h3>
<ul>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/nearline-storage">Nearline home page</a></li>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/files/GoogleCloudStorageNearline.pdf">Nearline whitepaper</a></li>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/storage-classes">Nearline documentation</a></li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F03%2F11%2Fgoogle-nearline-storage%2F&amp;title=Google%20Cloud%20Storage%20Nearline%20in%2030%20seconds" id="wpa2a_10"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Google Cloud Storage – Lifecycle Management</title>
         <link>https://gregsramblings.com/2015/03/04/gcs-tutorial-2/</link>
         <description>In my last post, Google Cloud Storage – &amp;#8220;Initial setup, cp, and rsync&amp;#8220;, I showed how to get started with Google Cloud Storage (GCS) including how to copy and rsync files to and from storage. A common use-case for GCS is backups.  For example, I backup my blog content nightly to GCS, so after a year, I&amp;#8217;d [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=4068</guid>
         <pubDate>Wed, 04 Mar 2015 06:48:54 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://gregsramblings.com/wp-content/uploads/2015/02/gcslogo.png"><img class="alignright size-full wp-image-4050" src="http://gregsramblings.com/wp-content/uploads/2015/02/gcslogo.png" alt="gcslogo" width="180" height="180"/></a>In my last post, Google Cloud Storage – &#8220;<em><a rel="nofollow" title="Google Cloud Storage &#x002013; Initial setup, cp, and rsync" target="_blank" href="http://gregsramblings.com/2015/02/20/gcs-tutorial-1/">Initial setup, cp, and rsync</a></em>&#8220;, I showed how to get started with Google Cloud Storage (GCS) including how to copy and rsync files to and from storage.</p>
<p>A common use-case for GCS is backups.  For example, I backup my blog content nightly to GCS, so after a year, I&#8217;d have 365  <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/lifecycle">gregsramblings.tgz</a> files.  I could write a script to list the files in my bucket and automatically delete backups based on various conditions, but GCS&#8217;s Lifecycle Management features makes this super simple.</p>
<p>You can read about multiple types of conditional deletes in the excellent <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/lifecycle">GCS Lifecycle Management docs</a>.   In my particular case, I wanted to always have the last 30 day&#8217;s backups available, so I created a file named <strong>lifecycle_config.json</strong> as follows:</p>
<pre>
{
    &quot;rule&quot;:
    [
      {
        &quot;action&quot;: {&quot;type&quot;: &quot;Delete&quot;},
        &quot;numNewerVersions&quot;: 30
      }
    ]
}
</pre>
<p>To apply the rule to my bucket, I used:</p>
<pre>
gsutil versioning set on gs://gregsramblings-backup
gsutil lifecycle set lifecycle_config.json gs://gregsramblings-backups
</pre>
<p>Now when the 31st file is added, it deletes the older versions leaving me with the last 30 backups every day.</p>
<p>Other condition types allow you to delete based on age, etc.  The <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/lifecycle">docs</a> cover this.</p>
<p>In the next post, I&#8217;ll cover how to create public links for your bucket objects with extremely efficient edge caching and index.html/404.html behavior (static website).</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F03%2F04%2Fgcs-tutorial-2%2F&amp;title=Google%20Cloud%20Storage%20%E2%80%93%20Lifecycle%20Management" id="wpa2a_12"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Google Cloud Storage – Initial setup, cp, and rsync</title>
         <link>https://gregsramblings.com/2015/02/20/gcs-tutorial-1/</link>
         <description>During the past few days, I’ve been diving into Google Cloud Storage (GCS).  You might assume that this is a boring aspect of Google Cloud Platform because cloud storage has been around for awhile, but I found some pleasant surprises in my exploration.  Let’s start with a brief overview: Google Cloud Storage is not Google [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3978</guid>
         <pubDate>Sat, 21 Feb 2015 03:37:50 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://gregsramblings.com/wp-content/uploads/2015/02/Google-cloud-storage-logo.png"><img class="alignright size-full wp-image-4050" src="http://gregsramblings.com/wp-content/uploads/2015/02/gcslogo.png" alt="gcslogo" width="180" height="180"/></a>During the past few days, I’ve been diving into Google Cloud Storage (GCS).  You might assume that this is a boring aspect of Google Cloud Platform because cloud storage has been around for awhile, but I found some pleasant surprises in my exploration.  Let’s start with a brief overview:</p>
<ul>
<li><strong><a rel="nofollow" target="_blank" href="http://cloud.google.com/storage">Google Cloud Storage</a></strong> is not <strong><a rel="nofollow" target="_blank" href="https://www.google.com/drive/">Google Drive</a></strong>. Google Drive is a consumer-oriented file storage and synchronization service that allows users to store documents, share files, and edit documents with collaborators, and it has APIs that allow developers to extend it. Google Cloud Storage is file storage solution intended for developers and system admins and has APIs allowing apps to store and retrieve objects. It features global edge-caching, versioning, OAuth and granular access controls, configurable security, etc..</li>
<li>Google Cloud Storage is built on Google’s massive planet-wide infrastructure.  Think about all of the files that Google serves, including YouTube videos, etc.  The size and scale are beyond most people’s comprehension.  I’ve recently seen the inside of one of the many Google data centers (a very rare treat, even for Googlers!), and it gave me a tiny glimpse of the enormous scale that is Google, and it radically changed my definition of “scalable” and “fast”.</li>
<li>Google Cloud Storage has a web interface for the basic functionality, but it’s the command line tool, <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/gsutil">gsutil</a>, that I prefer to use.  Also, the command-line tool exposes many more features.  There are also <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/concepts-techniques">APIs (XML and JSON)</a> that we&#8217;ll cover in a later post.</li>
</ul>
<h4>Initial Setup:</h4>
<ul>
<li>If you don’t already have a Google Cloud Platform account, you’ll want to create one at <a rel="nofollow" target="_blank" href="http://cloud.google.com">http://cloud.google.com</a>.  If you’ve never signed up before, you can get a free trial that is $300 for 60 days (as of this writing).</li>
<li>Install the Google Cloud Platform SDK from <a rel="nofollow" target="_blank" href="http://cloud.google.com/sdk">http://cloud.google.com/sdk</a>.</li>
<li><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/signup">Create a project, and activate Google Cloud Storage for that project</a>  (A project is a logical grouping of Google Cloud resources &#8211; storage, services, users, instances, etc.).  Creating a project requires a web browser, but once you get it created, you can do most everything else using the command-line tools.  Make a note of your project ID.  I’ll use “<b>gwprojectid</b>” for the remainder of this article.</li>
<li>We need to set up our new project as the default for the Google Cloud command-line tools, otherwise we&#8217;ll have to use &#8220;<strong>-p gwprojectid</strong>&#8221; for each command.  To set the default project, type: <b>gcloud config set project gwprojectid</b></li>
</ul>
<h4>Working with the gsutil tool</h4>
<p>Below is a simple example of storing and retrieving files. First we need to create a bucket &#8211; the basic container used to store files.  Since all bucket names share the global name space, it needs to be unique across all of Google Cloud.  You’ll see why this is the case in a later post when we start sharing files publicly via http.   For this example, I’ll use a bucket named “gwbucket”.  When referencing a bucket you need to specify the URL &#8212; e.g. <strong>gs://[bucketname]</strong>.</p>
<pre>
#Create a bucket:
gsutil mb gs://gwbucket

#Copy some files to the bucket:
gsutil cp *.jpg gs://gwbucket

#List the files in the bucket:
gsutil ls -l gs://gwbucket

#Copy a specific file from our bucket back to the local /tmp directory
gsutil cp gs://gwbucket/sunset.jpg /tmp

#Delete the files:
gsutil rm gs://gwbucket/*

#Remove the bucket:
gsutil rb gs://gwbucket
</pre>
<p>Nothing too exciting yet, but you quickly see that the commands are familiar.  You can add “-r” to most commands to make it recursive, as expected.  Detailed help is available for all commands at <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/gsutil">https://cloud.google.com/storage/docs/gsutil</a> or from the command line &#8211; <b>gsutil help cp</b> Here&#8217;s another example using <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/gsutil/commands/rsync">rsync</a> and <a rel="nofollow">versioning</a>:</p>
<pre>
#Create a new bucket:
gsutil mb gs://gwbucket

#Turn on versioning for the bucket
gsutil versioning set on gs://gwbucket

#rsync the current directory to our new bucket
#Adding -m to run multiple parallel processes (speed boost)
gsutil -m rsync -r -d . gs://gwbucket

#List all of the files in the bucket:
gsutil ls -lr gs://gwbucket
</pre>
<p><a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/object-versioning">Learn more about object versioning</a><br />
<a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/gsutil/addlhelp/TopLevelCommandLineOptions">Learn more about the -m option</a></p>
<p>Note: The above examples use the default bucket class of &#8220;standard&#8221; and the default bucket location of &#8220;US&#8221;.  To learn about other options, see <a rel="nofollow" target="_blank" href="https://cloud.google.com/storage/docs/gsutil/commands/mb#bucket-storage-classes">these docs</a>. I used the last example above (except for the versioning line) to backup my 120,000+ image library to Google Cloud Storage. Anytime I add/modify/delete images, I simply repeat the <b>gsutil rsync.</b></p>
<span class="su-highlight" style="background:#fbfca4;color:#000000;">&nbsp;Be very careful using the -d option on rsync as it deletes any files from the destination that have been removed from the source.  I suggest using the <strong>-n</strong> option if you have any doubts.  The -n option causes rsync to run in “dry run” mode, i.e., just outputting what would be copied or deleted without actually doing any copying/deleting&nbsp;</span>.
<p>In my next blog post, I’ll show how to set up bucket object lifecycle management to configure automatic object deletion when it reaches a certain age, or to simply keep the last n versions of a specific object.  This becomes a key feature when doing regular backups such as archiving log files each night, etc.  Then I’ll show you how to share objects publicly via HTTP and how to utilize Google’s worldwide edge caching to provide very fast downloading of your files.  I now have all images on my blog being served this way. I&#8217;ll also cover how I configured WordPress to use GCS as the file host.</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2015%2F02%2F20%2Fgcs-tutorial-1%2F&amp;title=Google%20Cloud%20Storage%20%E2%80%93%20Initial%20setup%2C%20cp%2C%20and%20rsync" id="wpa2a_14"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Interactive Config Guide for PhoneGap/Cordova</title>
         <link>http://devgirl.org/2015/01/28/interactive-config-guide-for-phonegapcordova/</link>
         <description>One of the challenges we face as hybrid app developers is determining which configuration settings to use for any given app due to variances in operating systems and browser rendering engines across platforms. The config.xml file located in the root of your PhoneGap/Cordova projects when you create an app can have a variety of content [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7638</guid>
         <pubDate>Wed, 28 Jan 2015 19:03:14 +0000</pubDate>
         <content:encoded><![CDATA[<div>
<span style="background-color:#fbfac7;padding:0 2px;"> ** <a rel="nofollow" target="_blank" href="http://devgirl.org/files/config-app/"><strong>New updates to tool</strong></a> with more details, screenshots and videos. Continue to check back for more to come ** <br />
<hr>
</span>
</div>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/files/config-app/"><img src="http://devgirl.org/wp-content/uploads/2015/01/Screen-Shot-2015-01-28-at-1.48.12-PM-300x184.png" alt="Screen Shot 2015-01-28 at 1.48.12 PM" width="300" height="184" class="alignleft size-medium wp-image-7667"/></a>One of the challenges we face as hybrid app developers is determining which configuration settings to use for any given app due to variances in operating systems and browser rendering engines across platforms. The <code><strong>config.xml</strong></code> file located in the root of your PhoneGap/Cordova projects when you create an app can have a variety of content that can be confusing to developers. The documentation is often less than crystal clear as well.<br />
<br />
As a result, I&#8217;ve created a <a rel="nofollow" target="_blank" href="http://devgirl.org/files/config-app/">new interactive guide</a> to document it and help people understand what each element means as well as the defaults, valid values, required fields and supported platforms for each. You can hover over the elements on the left side in the config.xml file and the details for it will display on the right. You can click the buttons to display the different preferences by platform. I&#8217;ll be continuing to update it further as I find more details. </p>
<div class="snvdshc"><div class="synved-box-message synved-box-info">This guide is specific to those properties available to you when building your app with the <a rel="nofollow" target="_blank" href="http://phonegap.com/install/">PhoneGap</a> or <a rel="nofollow" target="_blank" href="https://www.npmjs.com/package/cordova">Cordova CLI</a>. If you are using <a rel="nofollow" target="_blank" href="http://build.phonegap.com">PhoneGap Build</a>, you will still be using this <code><strong>config.xml</strong></code> file as a configuration vehicle, however the names and support for different elements and preferences are completely different than when using the CLI&#8217;s and not to be confused. I also highly recommend the <a rel="nofollow" target="_blank" href="http://aj-software.com/configap/">ConfiGAP tool</a> or refer to the <a rel="nofollow" target="_blank" href="http://docs.build.phonegap.com/">PhoneGap Build documentation</a> <em>Configuration</em> section specifically for those details. </div></div>
<h2>Platform Details</h2>
<p>While on the subject of configuration, I also think it&#8217;s useful to explain a couple of things going on behind the scenes in terms of configuration content and your apps for at least iOS and Android in case there are some that want to dig in deeper. I will add Windows and other platforms as I learn about them myself.</p>
<h4>iOS</h4>
<p>If you look at the <code>yourApp/platforms/ios/CordovaLib/ClassesCleaver</code> folder in your project you&#8217;ll find classes where your config.xml file is used. It is parsed specifically in the <code><a rel="nofollow" target="_blank" href="https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/CDVConfigParser.m">CDVConfigParser.m</a></code> class and those properties are then set as needed in the <code><a rel="nofollow" target="_blank" href="https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/CDVWebViewDelegate.m">CDVViewController.m</a></code> class. You should also be aware of the <code>&lt;projectName&gt;.plist</code> file that is used by your iOS apps. It&#8217;s located in the <code>../platforms/ios/MyProject/MyProject.plist</code> path (if you open the .xcode project in Xcode then you will find it under the <em>Resources</em> folder) and has settings that affect orientation, icons, splash screens and other properties you may want to modify at some point. Here&#8217;s a sample of what it looks like:</p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2015/01/ss.png"><img src="http://devgirl.org/wp-content/uploads/2015/01/ss.png" alt="ss" width="650" height="517" class="aligncenter size-full wp-image-7693"/></a></p>
<h4>Android</h4>
<p>You will also find a <code>CordovaLib</code> folder in the Android platform of your project and the class used for parsing the <code>config.xml</code> file for Android is <code><a rel="nofollow" target="_blank" href="https://github.com/apache/cordova-android/blob/2e3e4ec3b246aae8fc89525dc061d15c70bb44ea/framework/src/org/apache/cordova/ConfigXmlParser.java">ConfigXmlParser.java.</a></code> Once parsed, the class that processes the settings is <code><a rel="nofollow" target="_blank" href="https://github.com/apache/cordova-android/blob/2e3e4ec3b246aae8fc89525dc061d15c70bb44ea/framework/src/org/apache/cordova/CordovaActivity.java">CordovaActivity.java</a></code>. You should also be aware of the <code>&lt;AndroidManifest.xml</code> file used by your Android apps. It&#8217;s located in the <code>../platforms/android/AndroidManifest.xml</code> path and the <code>Activity</code> element has settings that will affect a number of things. Here&#8217;s an example of the defaults:</p>
<pre>
&lt;activity android:configChanges=&quot;orientation|keyboardHidden|keyboard|screenSize|locale&quot; android:label=&quot;@string/activity_name&quot; android:launchMode=&quot;singleTop&quot; android:name=&quot;HelloWorld&quot; android:theme=&quot;@android:style/Theme.Black.NoTitleBar&quot; android:windowSoftInputMode=&quot;adjustResize&quot;&gt;
       &lt;intent-filter android:label=&quot;@string/launcher_name&quot;&gt;
           &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
           &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
       &lt;/intent-filter&gt;
&lt;/activity&gt;
</pre>
<p>Please feel free to provide any feedback on your own use with these preferences and settings if you have more information to contribute from your own experience. I&#8217;ve included the guide below for a preview, but you should <strong><a rel="nofollow" target="_blank" href="http://devgirl.org/files/config-app/">open the app here</a></strong> in a new full window for a better experience.  </p>
<p>
 &lt;br /&gt;<br />
</p> 
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F01%2F28%2Finteractive-config-guide-for-phonegapcordova%2F&amp;linkname=Interactive%20Config%20Guide%20for%20PhoneGap%2FCordova" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F01%2F28%2Finteractive-config-guide-for-phonegapcordova%2F&amp;linkname=Interactive%20Config%20Guide%20for%20PhoneGap%2FCordova" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2015%2F01%2F28%2Finteractive-config-guide-for-phonegapcordova%2F&amp;linkname=Interactive%20Config%20Guide%20for%20PhoneGap%2FCordova" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2015%2F01%2F28%2Finteractive-config-guide-for-phonegapcordova%2F&amp;title=Interactive%20Config%20Guide%20for%20PhoneGap%2FCordova" id="wpa2a_6"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Sync Data Using PouchDB In Your Ionic Framework App</title>
         <link>http://devgirl.org/2014/12/30/sync-data-using-pouchdb-in-your-ionic-framework-app/</link>
         <description>Syncing data with the cloud is all the hype lately.  Dropbox, Firebase, Parse, Couchbase, everyone is working towards having the easiest solution.  There are many others, but those are just a few off the top of my head. One of my subscribers recently asked if I knew how to get PouchDB working with an Apache [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7641</guid>
         <pubDate>Tue, 30 Dec 2014 16:19:47 +0000</pubDate>
         <content:encoded><![CDATA[<p>Syncing data with the cloud is all the hype lately.  <a rel="nofollow" title="Syncing Data With Dropbox Using Ionic Framework" target="_blank" href="https://blog.nraboy.com/2014/10/syncing-data-dropbox-using-ionicframework/">Dropbox</a>, <a rel="nofollow" title="Syncing Data With Firebase Using Ionic Framework" target="_blank" href="https://blog.nraboy.com/2014/12/syncing-data-firebase-using-ionic-framework/">Firebase</a>, Parse, Couchbase, everyone is working towards having the easiest solution.  There are many others, but those are just a few off the top of my head.</p>
<p>One of my subscribers recently asked if I knew how to get <a rel="nofollow" title="PouchDB" target="_blank" href="http://pouchdb.com">PouchDB</a> working with an Apache Cordova mobile application using <a rel="nofollow" title="Ionic Framework" target="_blank" href="http://www.ionicframework.com">Ionic Framework</a> in particular.  I didn&#8217;t immediately know what PouchDB was, but after some reading I found it was inspired by <a rel="nofollow" title="Apache CouchDB" target="_blank" href="http://couchdb.apache.org/">Apache CouchDB</a>.</p>
<p>In this guide, we&#8217;re going to see how to install CouchDB and use PouchDB in an Ionic Framework mobile application for cross platform synchronization.</p>
<p><span id="more-7641"></span></p>
<p>Since PouchDB is built upon Apache CouchDB, this guide will have two parts:</p>
<ol>
<li>Setting up a CouchDB server using Debian Linux</li>
<li>Using PouchDB in a mobile application</li>
</ol>
<p>When everything has been completed, you&#8217;ll have a simple application that can sync between devices and platforms.</p>
<p>&nbsp;</p>
<h3>Setting up a CouchDB server using Debian Linux</h3>
<p>Per the PouchDB and CouchDB documentation, most of what we need is already available on Debian and Ubuntu based Linux distributions.  For this example, I am using a fresh <a rel="nofollow" title="Digital Ocean" target="_blank" href="http://www.digitalocean.com">Digital Ocean</a> VPS with Debian 7 installed.  While using SSH with root access to your server, run the following to install CouchDB:</p>
<pre>apt-get install couchdb</pre>
<p>You&#8217;re going to have some Cross Origin Resource Sharing (CORS) errors out of the box so we need to install a special package.  However, this package requires NPM to have already been installed.  If it is not already installed you can run the following:</p>
<pre>curl -sL https://deb.nodesource.com/setup | bash -
apt-get install -y nodejs</pre>
<p>With NodeJS installed, run the following to install and run our CORS package:</p>
<pre>npm install -g add-cors-to-couchdb
add-cors-to-couchdb</pre>
<p>We&#8217;re not completely finished yet.  Currently only connections via localhost can be made to CouchDB.  For this example we&#8217;re going to open CouchDB to anyone.  You&#8217;re probably going to want to tweak this in the future.  As a root user, edit <strong>/etc/couchdb/local.ini</strong> and uncomment the <code>bind_address</code> line.  Also change <code>127.0.0.1</code> to <code>0.0.0.0</code>.  Now everyone can access the database.</p>
<p>Again, it is important to use a setup that meets your needs in a production environment.</p>
<p>You can confirm everything was set up correctly by entering <strong>http://serverip:5984/_utils</strong> into your web browser, exchanging <strong>serverip</strong> with the correct remote IP address.</p>
<p>&nbsp;</p>
<h3>Using PouchDB in a mobile application</h3>
<p>The first thing we want to do is create a fresh Ionic Android and iOS project to work with:</p>
<pre>ionic start PouchApp blank
cd PouchApp
ionic platform add android
ionic platform add ios</pre>
<p>Note, if you&#8217;re not using a Mac, you cannot add and build for the iOS platform.</p>
<p>The next thing we want to do is download the PouchDB JavaScript library and place it in the <strong>www/js</strong> directory of our Ionic project.  Once the file is in place, we can continue to adding it into our <strong>www/index.html</strong> file:</p>
<pre>&lt;script src=&quot;js/pouchdb-3.2.0.min.js&quot;&gt;&lt;/script&gt;</pre>
<p>Now I did some Google searches and found that there is an <a rel="nofollow" title="AngularJS" target="_blank" href="https://angularjs.org/">AngularJS</a> library for PouchDB, but I found the documentation to be very poor.  Because of this I&#8217;ve decided to use the official JavaScript library and make my own wrappers.</p>
<p>For simplicity, this application is going to be a to-do-list type application.  It will have one screen with a list, and users can choose to add to the list.  Open your <strong>www/index.html</strong> file and add the following between the <code>&lt;body&gt;</code> tags.</p>
<pre>&lt;ion-pane ng-controller=&quot;ExampleController&quot;&gt;
    &lt;ion-header-bar class=&quot;bar-stable&quot;&gt;
        &lt;h1 class=&quot;title&quot;&gt;Ionic Blank Starter&lt;/h1&gt;
        &lt;button class=&quot;right button button-icon icon ion-plus&quot; ng-click=&quot;create()&quot;&gt;&lt;/button&gt;
    &lt;/ion-header-bar&gt;
    &lt;ion-content&gt;
        &lt;ion-list&gt;
            &lt;ion-item ng-repeat=&quot;todo in todos&quot;&gt;
                {{todo.title}}
            &lt;/ion-item&gt;
        &lt;/ion-list&gt;
    &lt;/ion-content&gt;
&lt;/ion-pane&gt;</pre>
<p>Based on this UI, you can conclude that we will have one controller called <strong>ExampleController</strong>, an add button that calls <code>create()</code> when clicked, and a list of todo items.</p>
<p>Open <strong>www/js/app.js</strong> and make sure your <code>angular.module</code> is set to a variable name like the following:</p>
<pre>var example = angular.module('starter', ['ionic']);</pre>
<p>Right below this line, we need to declare our local and remote databases.  Later in our code we will be synchronizing them, but it doesn&#8217;t remove the need to declare them.  This can be done like so:</p>
<pre>var localDB = new PouchDB(&quot;todos&quot;);
var remoteDB = new PouchDB(&quot;http://serverip:5984/todos&quot;);</pre>
<p>Remember to swap out <strong>serverip</strong> with the IP of your server.</p>
<p>Inside the <code>$ionicPlatform.ready</code> of your <code>run()</code> method we need to start synchronizing.  This can be done by adding the following:</p>
<pre>localDB.sync(remoteDB, {live: true});</pre>
<p>The above line means that we&#8217;re constantly going to be listening for changes between databases and synchronizing them as they occur.</p>
<p>So how are we going to watch for data changes in our databases and refresh our UI list?  If you&#8217;re familiar with AngularJS, you can&#8217;t just watch a global JavaScript variable.  Some extra magic has to happen.  We will be making use of <code>$rootScope.$broadcast</code> to signal every time we&#8217;ve received some kind of data change.  Create the following factory in your code:</p>
<pre>example.factory('PouchDBListener', ['$rootScope', function($rootScope) {

    localDB.changes({
        continuous: true,
        onChange: function(change) {
            if (!change.deleted) {
                $rootScope.$apply(function() {
                    localDB.get(change.id, function(err, doc) {
                        $rootScope.$apply(function() {
                            if (err) console.log(err);
                            $rootScope.$broadcast('add', doc);
                        })
                    });
                })
            } else {
                $rootScope.$apply(function() {
                    $rootScope.$broadcast('delete', change.id);
                });
            }
        }
    });

    return true;
    
}]);</pre>
<p>The above code says the local database will look for changes.  If the change is not a delete, it is an add, so fire the <strong>add</strong> broadcast with the change data.  If the change is a delete, then fire the <strong>delete</strong> broadcast with the ID of the record.</p>
<p>Time to create our <strong>ExampleController</strong> which will look for changes and add new changes via an <code>$ionicPopup</code> prompt.  Add the following code to your <strong>www/js/app.js</strong> file:</p>
<pre>example.controller(&quot;ExampleController&quot;, function($scope, $ionicPopup, PouchDBListener) {

    $scope.todos = [];

    $scope.create = function() {
        $ionicPopup.prompt({
            title: 'Enter a new TODO item',
            inputType: 'text'
        })
        .then(function(result) {
            if(result !== &quot;&quot;) {
                if($scope.hasOwnProperty(&quot;todos&quot;) !== true) {
                    $scope.todos = [];
                }
                localDB.post({title: result});
            } else {
                console.log(&quot;Action not completed&quot;);
            }
        });
    }

    $scope.$on('add', function(event, todo) {
        $scope.todos.push(todo);
    });

    $scope.$on('delete', function(event, id) {
        for(var i = 0; i &lt; $scope.todos.length; i++) {
            if($scope.todos[i]._id === id) {
                $scope.todos.splice(i, 1);
            }
        }
    });

});</pre>
<p>If a delete is found, remove it from the list.  If an addition was found, add it to the list.  Creating a new item via the application will trigger the addition.</p>
<p>The full <strong>www/js/app.js</strong> code can be seen below:</p>
<pre>var example = angular.module('starter', ['ionic']);
var localDB = new PouchDB(&quot;todos&quot;);
var remoteDB = new PouchDB(&quot;http://serverip:5984/todos&quot;);

example.run(function($ionicPlatform) {
    $ionicPlatform.ready(function() {
        if(window.cordova &amp;amp;&amp;amp; window.cordova.plugins.Keyboard) {
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
        }
        if(window.StatusBar) {
            StatusBar.styleDefault();
        }
        localDB.sync(remoteDB, {live: true});
    });
});

example.controller(&quot;ExampleController&quot;, function($scope, $ionicPopup, PouchDBListener) {

    $scope.todos = [];

    $scope.create = function() {
        $ionicPopup.prompt({
            title: 'Enter a new TODO item',
            inputType: 'text'
        })
        .then(function(result) {
            if(result !== &quot;&quot;) {
                if($scope.hasOwnProperty(&quot;todos&quot;) !== true) {
                    $scope.todos = [];
                }
                localDB.post({title: result});
            } else {
                console.log(&quot;Action not completed&quot;);
            }
        });
    }

    $scope.$on('add', function(event, todo) {
        $scope.todos.push(todo);
    });

    $scope.$on('delete', function(event, id) {
        for(var i = 0; i &lt; $scope.todos.length; i++) {
            if($scope.todos[i]._id === id) {
                $scope.todos.splice(i, 1);
            }
        }
    });

});

example.factory('PouchDBListener', ['$rootScope', function($rootScope) {

    localDB.changes({
        continuous: true,
        onChange: function(change) {
            if (!change.deleted) {
                $rootScope.$apply(function() {
                    localDB.get(change.id, function(err, doc) {
                        $rootScope.$apply(function() {
                            if (err) console.log(err);
                            $rootScope.$broadcast('add', doc);
                        })
                    });
                })
            } else {
                $rootScope.$apply(function() {
                    $rootScope.$broadcast('delete', change.id);
                });
            }
        }
    });

    return true;

}]);</pre>
<p>A video version of this article can be seen below.</p>
<p></p> 
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F30%2Fsync-data-using-pouchdb-in-your-ionic-framework-app%2F&amp;linkname=Sync%20Data%20Using%20PouchDB%20In%20Your%20Ionic%20Framework%20App" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F30%2Fsync-data-using-pouchdb-in-your-ionic-framework-app%2F&amp;linkname=Sync%20Data%20Using%20PouchDB%20In%20Your%20Ionic%20Framework%20App" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F30%2Fsync-data-using-pouchdb-in-your-ionic-framework-app%2F&amp;linkname=Sync%20Data%20Using%20PouchDB%20In%20Your%20Ionic%20Framework%20App" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F30%2Fsync-data-using-pouchdb-in-your-ionic-framework-app%2F&amp;title=Sync%20Data%20Using%20PouchDB%20In%20Your%20Ionic%20Framework%20App" id="wpa2a_8"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Push Notifications Sample App with Ionic and ngCordova</title>
         <link>http://devgirl.org/2014/12/16/push-notifications-sample-app-with-ionic-and-ngcordova/</link>
         <description>I created a new sample push notification app recently to highlight some new changes in iOS 8 and show an example of implementing them with a currently popular stack of frameworks available to build hybrid mobile apps quickly. The sample app is built using Ionic with ngCordova to take advantage of the Cordova PushPlugin wrapper [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7588</guid>
         <pubDate>Tue, 16 Dec 2014 13:46:54 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/12/app-icon.png"><img src="http://devgirl.org/wp-content/uploads/2014/12/app-icon.png" alt="app-icon" width="128" height="128" class="alignleft size-full wp-image-7620"/></a>I created a <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample">new sample push notification app</a> recently to highlight some new changes in iOS 8 and show an example of implementing them with a currently popular stack of frameworks available to build hybrid mobile apps quickly. The sample app is built using <a rel="nofollow" target="_blank" href="http://ionicframework.com">Ionic</a> with <a rel="nofollow" target="_blank" href="http://ngcordova.com/">ngCordova</a> to take advantage of the <a rel="nofollow" target="_blank" href="http://ngcordova.com/docs/#Push">Cordova PushPlugin wrapper</a> (in addition to a few others noted on the <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample">GitHub Readme</a>) and currently works on iOS (including iOS8) and Android. If you&#8217;re not familiar with <a rel="nofollow" target="_blank" href="http://ngcordova.com/">ngCordova</a> and building PhoneGap/Cordova apps with AngularJS, I can&#8217;t recommend it enough. It&#8217;s basically wrappers for common Cordova plugins that dramatically simplify your code and keep it more testable, maintainable and efficient. There&#8217;s already a <a rel="nofollow" target="_blank" href="http://ngcordova.com/docs/">huge list of common plugins</a> supported with <a rel="nofollow" target="_blank" href="https://github.com/driftyco/ng-cordova/releases">more being added </a>all the time. </p>
<p>The app is nothing fancy, it simply registers your device when it runs and displays the device token returned from either APNs (<a rel="nofollow" target="_blank" href="https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9">Apple Push Notification Service for iOS</a>) or GCM (<a rel="nofollow" target="_blank" href="http://developer.android.com/google/gcm/gs.html">Google Cloud Messaging for Android</a>). Then when a notification is received, the app will display it in a list. The code handling is the more useful piece since it varies between platform and state (running in foreground, background, coldstart etc). </p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/12/push-server_Fotor_Collage.jpg"><img src="http://devgirl.org/wp-content/uploads/2014/12/push-server_Fotor_Collage.jpg" alt="push-server_Fotor_Collage" width="630" height="630" class="aligncenter size-full wp-image-7615"/></a></p>
<h2>What you can learn</h2>
<p>In general this sample can be useful to see how to:</p>
<ul>
<li>Add push notification support to your Ionic/Cordova app and take advantage of <a rel="nofollow" target="_blank" href="http://ngcordova.com/">ngCordova</a> to keep your angular code clean and maintainable.</li>
<p></p>
<li>Handle push notifications for different platforms and situations (iOS vs Android and if the app is running in the foreground, background or closed etc).</li>
<p></p>
<li>Create your own server-side solution for storing tokens and sending notifications using some nodeJS libraries available. </li>
</ul>
<h2>What to be aware of</h2>
<p>The <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample">details for the app</a> can be found in the readme on the <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample">GitHub project page</a> and I provided comments in the code to help explain things in more detail, however there are a few other details I&#8217;d like to point out:</p>
<ul>
<li><strong>Register Handling</strong> &#8211; The registration id is returned in a different manner for iOS and Android when using the PushPlugin and it may be confusing at first. Just be aware that the iOS registration id (aka device token) is returned as a response to the PushPlugin <code>register()</code> call, whereas the Android registration id is received in the <code>pushNotificationReceived()</code> handler. See the <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample/blob/master/www/js/controllers.js">controller.js</a> code for details. </li>
<li><strong>Unregister Handling</strong> &#8211; Currently the PushPlugin <code>unregister()</code> is not called in the code (commented out), for various reasons. Instead it&#8217;s calling to remove the device token from the 3rd party database. This may not be ultimate in production, but you should stop to read these links I&#8217;ve included for details on what is recommended:
<ul>
<li><a rel="nofollow" target="_blank" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/unregisterForRemoteNotifications ">Apple Unregister Details </a></li>
<li><a rel="nofollow" target="_blank" href="http://developer.android.com/google/gcm/adv.html#unreg-why">Android Unregister Details</a></li>
</ul>
</li>
</ul>
<h3>Message Payload Details</h3>
<p>A payload is the message (notification) that is sent thru the respective Cloud Service (APN/GCM) to the device where the app is registered. It contains custom data and settings and varies between OS. My sample app handles many different scenarios depending on what data and flags are found within the message payload that you should take a look at. </p>
<p>For instance, a typical sample message that might be received in your app is shown below in JSON format:</p>
<h4>iOS Message Example</h4>
<p><code>[{"badge":"0","sound":"soundName","alert":"Jennifer L liked your photo","foreground":"0"}]</code></p>
<h4>Android Message Example</h4>
<p><code>[{"message":"Tori432 commented on your photo: Awesome!","payload":{"message":"Tori432 commented on your photo: Awesome!"},"collapse_key":"optional","from":"824841663931","foreground":false,"event":"message","coldstart":false}]<br />
</code><br />
<div class="snvdshc"><div class="synved-box-message synved-box-info">The <a rel="nofollow" target="_blank" href="https://github.com/phonegap-build/PushPlugin/">Cordova PushPlugin</a> appends certain flags to the message data received, such as <code>foreground</code> and <code>coldstart</code> based on the current state and particular to platform. See the <a rel="nofollow" target="_blank" href="https://github.com/phonegap-build/PushPlugin/blob/f1fa935e476f9fecf6aff6459a4504e4b43cefcd/README.md">plugin readme</a> for specific details on these.</div></div>
<h4>Max Message Sizes</h4>
<p>The sizes of message payloads is different between platforms and recently changed in iOS 8:</p>
<ul>
<li>iOS Max Payload Size &#8211; <a rel="nofollow" target="_blank" href="https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html">iOS8 payload size</a> is 2 kilobytes, &lt; iOS8 is 256 bytes</li>
<li>Android max payload is <a rel="nofollow" target="_blank" href="http://developer.android.com/google/gcm/adv.html">4 kilobytes </a>.</li>
</ul>
<h3>Newbies</h3>
<p>If you&#8217;re new to push notifications you should go back and visit all of my <a rel="nofollow" target="_blank" href="http://devgirl.org/2013/07/17/tutorial-implement-push-notifications-in-your-phonegap-application/">previous posts</a> which go into great detail about different aspects of supporting the on different platforms. Some of the links to those posts and other useful ones are also included in the <a rel="nofollow" target="_blank" href="https://github.com/hollyschinsky/PushNotificationSample">GitHub Readme</a>. </p>
<p>
<div></div>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F16%2Fpush-notifications-sample-app-with-ionic-and-ngcordova%2F&amp;linkname=Push%20Notifications%20Sample%20App%20with%20Ionic%20and%20ngCordova" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F16%2Fpush-notifications-sample-app-with-ionic-and-ngcordova%2F&amp;linkname=Push%20Notifications%20Sample%20App%20with%20Ionic%20and%20ngCordova" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F16%2Fpush-notifications-sample-app-with-ionic-and-ngcordova%2F&amp;linkname=Push%20Notifications%20Sample%20App%20with%20Ionic%20and%20ngCordova" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F12%2F16%2Fpush-notifications-sample-app-with-ionic-and-ngcordova%2F&amp;title=Push%20Notifications%20Sample%20App%20with%20Ionic%20and%20ngCordova" id="wpa2a_10"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>PhoneGap CLI 3.6.3 Released with Significant Updates</title>
         <link>http://devgirl.org/2014/11/14/phonegap-cli-3-6-3-released-with-significant-updates/</link>
         <description>The PhoneGap CLI has undergone some significant changes recently to realign better with Cordova and a new version 3.6.3 has just been released. These changes will help to alleviate previous deviations between the two. Some of these updates are behind the scenes and will not necessarily be apparent to developers but will allow new features [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7544</guid>
         <pubDate>Fri, 14 Nov 2014 13:54:32 +0000</pubDate>
         <content:encoded><![CDATA[<p>The <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/11/13/phonegap-cli-3-6-3/">PhoneGap CLI</a> has undergone some <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/11/13/phonegap-cli-3-6-3/">significant changes</a> recently to realign better with <a rel="nofollow">Cordova</a> and a new <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/phonegap">version 3.6.3</a> has just been released. These changes will help to alleviate previous deviations between the two. Some of these updates are behind the scenes and will not necessarily be apparent to developers but will allow new features to be added quickly and the code to be more maintainable in the future. </p>
<p>Below are some highlights developers may be particularly interested in knowing about in this latest version. Please read <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/11/13/phonegap-cli-3-6-3/">the official release details</a> on the PhoneGap blog for everything you need to know. </p>
<h3>Highlights</h3>
<ul>
<li>All <code>cordova</code> commands and options are now supported directly via the <code>phonegap</code> command (including <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli/blob/master/doc/cli/help.create.txt"><code>--copy-from, --link-to</code> options</a> etc).
<p><div class="snvdshc"><div class="synved-box-message synved-box-info">I personally like to use <code>--copy-from</code> with the <code>create</code> command to quickly create a starter project from a base template I&#8217;ve created and <code>--link-to</code> when I want to easily create a symbolic link to another project without having to think about the syntax of how to do it each time.</div></div> </li>
<li>The <code>phonegap create</code> command allows you to use shortcut flags <code>-n</code> and <code>-i</code> to quickly specify the app name and id/package and can be used in any order.</li>
<p></p>
<li>The config.xml file now resides in the root project folder rather than the <strong><em>www</em></strong> folder.</li>
<p></p>
<li>The <code>remote</code> command still allows you to build with <a rel="nofollow" target="_blank" href="http://build.phonegap.com">PhoneGap Build</a> but the <code>local</code> command is no longer necessary (deprecated) and assumed.</li>
<p></p>
<li>Better help text, easier ways to get to the help text and more explanatory output/error handling.</li>
<p></p>
<li>Platforms (ios, android etc) are automatically added if they don&#8217;t exist upon <code>build</code> and <code>run</code> so you don&#8217;t have to explicitly type <code>phonegap platform add [platform]</code>. </li>
<p>     </p>
<li>And <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/11/13/phonegap-cli-3-6-3/">more!</a>&#8230; </li>
</ul>
<p>These changes are available now, so take a moment to grab the latest via one of the commands below:</p>
<p><code>$ sudo npm install -g phonegap</code><br />
<code>$ sudo npm update -g phonegap</code></p>
<p>Once again, be sure to read the <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/11/13/phonegap-cli-3-6-3/">detailed write-up just posted on the PhoneGap Blog</a> as I think even the most seasoned users will find something they were not previously aware of! </p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/Screen-Shot-2014-11-14-at-8.29.49-AM.png"><img src="http://devgirl.org/wp-content/uploads/2014/11/Screen-Shot-2014-11-14-at-8.29.49-AM-1024x594.png" alt="Screen Shot 2014-11-14 at 8.29.49 AM" width="1024" height="594" class="aligncenter size-large wp-image-7564"/></a></p>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F14%2Fphonegap-cli-3-6-3-released-with-significant-updates%2F&amp;linkname=PhoneGap%20CLI%203.6.3%20Released%20with%20Significant%20Updates" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F14%2Fphonegap-cli-3-6-3-released-with-significant-updates%2F&amp;linkname=PhoneGap%20CLI%203.6.3%20Released%20with%20Significant%20Updates" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F14%2Fphonegap-cli-3-6-3-released-with-significant-updates%2F&amp;linkname=PhoneGap%20CLI%203.6.3%20Released%20with%20Significant%20Updates" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F14%2Fphonegap-cli-3-6-3-released-with-significant-updates%2F&amp;title=PhoneGap%20CLI%203.6.3%20Released%20with%20Significant%20Updates" id="wpa2a_12"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Boost your iOS 8 Mobile App Performance with WKWebView</title>
         <link>http://devgirl.org/2014/11/10/boost-your-ios-8-mobile-app-performance-with-wkwebview/</link>
         <description>If you build hybrid apps using PhoneGap/Cordova for iOS, you are likely aware that Apple recently announced a new WKWebView for iOS 8 which has major performance optimizations over the UIWebView including access to the Nitro JIT JavaScript engine. Benchmark tests with Nitrous enabled report a 40%-80% performance spike. (See this link for more details). [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7409</guid>
         <pubDate>Mon, 10 Nov 2014 13:44:40 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/ios8.jpeg"><img src="http://devgirl.org/wp-content/uploads/2014/11/ios8.jpeg" alt="ios8" width="200" height="200" class="alignleft size-full wp-image-7411"/></a><br />
If you build hybrid apps using PhoneGap/Cordova for iOS, you are likely aware that <a rel="nofollow" target="_blank" href="http://9to5mac.com/2014/06/03/ios-8-webkit-changes-finally-allow-all-apps-to-have-the-same-performance-as-safari/">Apple recently announced </a>a new <a rel="nofollow" target="_blank" href="https://developer.apple.com/library/IOs/documentation/WebKit/Reference/WKWebView_Ref/index.html"><strong><code>WKWebView</code></strong></a> for iOS 8 which has major performance optimizations over the <a rel="nofollow" target="_blank" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/index.html"><strong><code>UIWebView</code></strong></a> including access to the Nitro JIT JavaScript engine. Benchmark tests with Nitrous enabled report a 40%-80% performance spike. (See <a rel="nofollow" target="_blank" href="http://www.techimperial.com/ios/cydia/nitrous-speed-boost-ios-just-in-time-compiler/">this link</a> for more details). Unfortunately this new <code>WKWebView</code> had some initial issues that needed to be resolved for PhoneGap/Cordova to be supported with it due to the <a rel="nofollow" target="_blank" href="http://shazronatadobe.wordpress.com/2014/09/18/cordova-ios-and-ios-8/">reasons explained here</a> by resident iOS expert <a rel="nofollow" target="_blank" href="https://twitter.com/shazron">Shazron</a> (essentially an issue with loading local file URLs). Apple has actually <a rel="nofollow" target="_blank" href="https://bugs.webkit.org/show_bug.cgi?id=137153">fixed this bug</a>, but it&#8217;s not yet been released and a target release date is unknown.</p>
<h2>WKWebView Plugin</h2>
<p>In the meantime there&#8217;s a new option (self-proclaimed <em>hack</em>) available to try. <a rel="nofollow" target="_blank" href="https://twitter.com/eddyverbruggen">Eddy Verbruggen</a> (author of the <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin">Social Sharing Plugin</a> and many other useful Cordova plugins) created <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview">a WKWebView plugin</a> that uses the <code><strong>WKWebView</strong></code> rather than the <code><strong>UIWebView</strong></code> and includes <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/blob/master/src/ios/MyMainViewController.m">code to fix the local file loading</a> issue. A screenshot from his demo app running a performance test in the standard Hello World app using the new plugin versus without it is shown below. Notice the difference in FPS (frames per second) and CPU by using this plugin:</p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/UIWebView-vs-WKWebView1.png"><img src="http://devgirl.org/wp-content/uploads/2014/11/UIWebView-vs-WKWebView1.png" alt="UIWebView-vs-WKWebView" width="600" height="544" class="aligncenter size-full wp-image-7512"/></a></p>
<div class="snvdshc"><div class="synved-box-message synved-box-success">I tried out Eddy&#8217;s plugin on my iPhone 6 running iOS 8.1 and saw similar FPS and CPU results to the screenshots above when including the plugin vs without it (defaulting to the standard UIWebView), pretty awesome!! Some of the community folks have been testing it with different types of apps (including some built with <a rel="nofollow" target="_blank" href="http://ionicframework.com">Ionic</a>) as well and after <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/issues?q=is%3Aissue+is%3Aclosed">a couple issues</a> have been worked out, it seems to be providing <a rel="nofollow" target="_blank" href="http://forum.ionicframework.com/t/cordova-support-for-wkwebview-in-ios8/10480/8">great results</a> to many and is an option for folks to consider until the Apple fix is released. The plugin is also supported on the iOS 8 simulator and simply defaults back to the <code><strong>UIWebView</strong></code> on iOS 7 and lower. Please keep in mind this plugin is new and beta currently and you can report any issues found to the <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/issues">issue tracker</a>.</div></div>
<h2>How does it work?</h2>
<p>To summarize how this works, the plugin includes an <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/blob/master/src/ios/AppDelegate%2BWKWebViewPolyfill.m">AppDelegate+WKWebViewPolyfill class</a> that checks to see if the app is running on iOS8 and if so will use a <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/blob/master/src/ios/MyMainViewController.m">different ViewController</a> with the <code>WKWebView</code> instead of the <code>UIWebView</code> as it&#8217;s <a rel="nofollow" target="_blank" href="https://github.com/EddyVerbruggen/cordova-plugin-wkwebview/blob/master/src/ios/CDVWebViewUIDelegate.m">WebView UI delegate</a>. This is done via <em><a rel="nofollow" target="_blank" href="http://nshipster.com/method-swizzling/">method swizzling (changing implementation at runtime)</a> as shown in the code snippet below:</em> </p>
<pre>
@implementation AppDelegate (WKWebViewPolyfill)

+ (void)load {
  // swap in our own viewcontroller which loads the wkwebview, but only in case we're running iOS 8+
  if (IsAtLeastiOSVersion(@&quot;8.0&quot;)) {
    swizzleMethod([AppDelegate class],
                  @selector(application:didFinishLaunchingWithOptions:),
                  @selector(my_application:didFinishLaunchingWithOptions:));
  }
}
</pre>
<p>To learn all about the <code><strong>WKWebView</strong></code>, check out this in-depth <a rel="nofollow" target="_blank" href="http://nshipster.com/wkwebkit/">informative post</a> by <a rel="nofollow" target="_blank" href="https://twitter.com/mattt">Mattt Thomspon</a>. Some interesting and inspirational quotes from the article are included below. <img src="http://devgirl.org/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height:1em;max-height:1em;"/></p>
<blockquote class="blockquote_end style02">
<span>
<p class="end-quote"> It&#8217;s a dirty secret that some stock apps like Messages use WebKit to render tricky content. The fact that you probably haven&#8217;t noticed should be an indicator that web views actually have a place in app development best practices. </p>
<p><cite></cite></p>
</span>
</blockquote>
<blockquote class="blockquote_end style02">
<span>
<p class="end-quote"> If your app is little more than a thin container around web content, WKWebView is a game-changer. All of that performance and compatibility that you&#8217;ve longed for is finally available. It&#8217;s everything you might have hoped for.</p>
<p><cite></cite></p>
</span>
</blockquote>
<h3>Useful Links</h3>
<ul>
<li><a rel="nofollow" target="_blank" href="https://issues.apache.org/jira/browse/CB-7043">General JIRA tracking issue</a> for Cordova iOS 8 support</li>
<li><a rel="nofollow" target="_blank" href="http://9to5mac.com/2014/06/03/ios-8-webkit-changes-finally-allow-all-apps-to-have-the-same-performance-as-safari/">9 to 5 Mac &#8211; iOS 8 WebKit changes finally allow all apps to have the same performance as Safari</a></li>
<li><a rel="nofollow" target="_blank" href="http://nshipster.com/wkwebkit/">Informative post with all the details on the new WKWebView and more</a> by <a rel="nofollow" target="_blank" href="https://twitter.com/mattt">Mattt Thomspon</a>.
<li><a rel="nofollow" target="_blank" href="https://twitter.com/tjvantoll">TJ Van Toll</a> from Telerik on <a rel="nofollow" target="_blank" href="http://developer.telerik.com/featured/why-ios-8s-wkwebview-is-a-big-deal-for-hybrid-development/">why WKWebView is a big deal</a></li>
<p>
</ul>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F10%2Fboost-your-ios-8-mobile-app-performance-with-wkwebview%2F&amp;linkname=Boost%20your%20iOS%208%20Mobile%20App%20Performance%20with%20WKWebView" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F10%2Fboost-your-ios-8-mobile-app-performance-with-wkwebview%2F&amp;linkname=Boost%20your%20iOS%208%20Mobile%20App%20Performance%20with%20WKWebView" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F10%2Fboost-your-ios-8-mobile-app-performance-with-wkwebview%2F&amp;linkname=Boost%20your%20iOS%208%20Mobile%20App%20Performance%20with%20WKWebView" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F10%2Fboost-your-ios-8-mobile-app-performance-with-wkwebview%2F&amp;title=Boost%20your%20iOS%208%20Mobile%20App%20Performance%20with%20WKWebView" id="wpa2a_14"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Cordova/PhoneGap Version Confusion</title>
         <link>http://devgirl.org/2014/11/07/cordovaphonegap-version-confusion/</link>
         <description>The different versions of all things Cordova and PhoneGap can be pretty confusing to keep track of at times. Everyone may not be aware that there have been some recent decisions and changes made to how things will be handled with the Cordova project going forward. In summary, the platform versions (ios, android etc) are [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7394</guid>
         <pubDate>Fri, 07 Nov 2014 18:38:48 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/confused-dog.jpg"><img src="http://devgirl.org/wp-content/uploads/2014/11/confused-dog-224x300.jpg" alt="confused-dog" width="224" height="300" class="alignleft size-medium wp-image-7395"/></a></p>
<p>The different versions of all things <a rel="nofollow" target="_blank" href="http://cordova.apache.org/">Cordova</a> and <a rel="nofollow" target="_blank" href="http://phonegap.com">PhoneGap</a> can be pretty confusing to keep track of at times. Everyone may not be aware that there have been <a rel="nofollow" target="_blank" href="https://www.mail-archive.com/dev@cordova.apache.org/msg22789.html">some recent decisions and changes made</a> to how things will be handled with the <a rel="nofollow" target="_blank" href="http://cordova.apache.org/">Cordova</a> project going forward. </p>
<p>In summary, the platform versions (ios, android etc) are now independent of CLI version (will no longer match) and the CLI version will likely be rising more rapidly. Read the <a rel="nofollow" target="_blank" href="https://www.mail-archive.com/dev@cordova.apache.org/msg22789.html">whole thread</a> if you&#8217;re curious about why this changed. This post is an attempt to explain the different versions and how you can find them for your projects.</p>
<h2>Cordova Versions</h2>
<p>We&#8217;ll start with Cordova since it&#8217;s the underlying version to so many different things including other vendors&#8217; offerings so you should always be aware of how to find these versions first and foremost.</p>
<p></p>
<ul>
<li><strong>Overall Version</strong> &#8211; find yours by typing:<br />
<br />
<code>$ cordova -v</code>
<p>When you install <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/cordova">cordova from npm</a> or click the <a rel="nofollow" target="_blank" href="http://cordova.io">download button from Cordova.io</a>, these versions are the same (currently 4.0.0) and represent a blanket identifier that includes:</p>
<ol>
<li><strong>The <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/cordova">CLI (command line interface) Tooling Version</a></strong> &#8211; The version of the tooling and commands you&#8217;re using to create, build and deploy your apps. For instance, if a new option is added to the <code>$ cordova create</code> command to allow you to specify a template URL.
<p>Use the same command as before to find the CLI version:<br />
<br />
<code>$ cordova -v</code></p>
<p>**<strong>Note:</strong> this number will always match the overall version.**
</li>
<p></p>
<li><strong>Set of Platform Versions</strong> &#8211; This is basically the version of <strong>cordova.js</strong> file copied in at build time for each supported platform (amazon-fireos, android, blackberry10, browser, firefoxos, ios, windows etc), since each has its own specific code.<br />
<br />
For instance, the current 4.0.0 version will install iOS 3.6.3, android 3.6.4, browser 3.6.0, firefox os 3.6.3 etc. 
<p>You can find the platform versions with the <span style="background-color:#DDF8FF;padding:0 2px;"><code>$ cordova platform list</code></span>  command such as:<br />
<br />
<code>$ cordova platform list<br />
Installed platforms: android 3.6.4, browser 3.5.2, firefoxos 3.6.3, ios 3.6.3<br />
Available platforms: amazon-fireos, blackberry10<br />
</code></p>
<p>To install a specific version, first remove the current one if a version was previously added via:<br />
<br />
<code>$ cordova platform remove ios</code></p>
<p>Then add the one you want by using the @ syntax:<br />
<br />
<code>$ cordova platform add ios@3.7.0</code></p>
<p><span style="background-color:#fbfac7;padding:0 2px;"> <strong>Tip:</strong> Always use the <code>$ cordova platform remove</code> command versus manually deleting a platform folder from the file system or you will likely cause yourself in some sort of pain down the road. :)</span><br />
<br />
<strong>NOTE: </strong>If there ever seems to be a mismatch with what&#8217;s returned from the <code>platform list</code> command, you can always just open the cordova.js file copied into the platforms www folder (for example ../platforms/ios/www/cordova.js) to see what&#8217;s specified in the following variable:</p>
<p><code>var PLATFORM_VERSION_BUILD_LABEL = '3.7.0';</code></p>
</li>
</ol>
<p></p>
<div>
 </li>
<li><strong>Plugin Version:</strong> Each plugin (file, device, media, contacts etc) also has a version. To see the versions of plugins for a given project, use the <span style="background-color:#DDF8FF;padding:0 2px;"><code>$ cordova plugin list</code></span>  command such as:<br />
<br />
<code>$ cordova plugin list<br />
org.apache.cordova.camera 0.3.3 "Camera"<br />
org.apache.cordova.contacts 0.2.14 "Contacts"<br />
org.apache.cordova.device 0.2.12 "Device"</code>
<p>To install a specific version, use the @ syntax:</p>
<p><code>$ cordova plugin add org.apache.cordova.camera@0.2.9</code></p>
<p>or to ensure the latest plugin version, use the <code>latest</code> alias:</p>
<p><code>$ cordova plugin add org.apache.cordova.camera@latest</code></p>
<span style="background-color:#fbfac7;padding:0 2px;"><strong>Tip:</strong> To quickly search the plugin registry and get the id for a plugin, use the <code>$ cordova plugin search</code> command with any search term: 
<p><code>$ cordova plugin search contacts<br />
com.blackberry.pim.contacts - BlackBerry 10 Contacts APIs<br />
com.kolwit.pickcontact - Native contact-picker overlay, accessing the address book<br />
org.apache.cordova.contacts - Cordova Contacts Plugin</code><br />
</span>
<p><span style="background-color:#fbfac7;padding:0 2px;"><strong>Another Tip:</strong> To get all the data including versions available for a specific plugin, use the <span style="background-color:#DDF8FF;padding:0 2px;"></span><code>$ plugman info</code> command with the id of the plugin in question (assuming you have <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/plugman">plugman installed</a>, and you should if you don&#8217;t):</span><br />
<br />
<code>$ plugman info org.apache.cordova.camera</code><br />
<br />
You&#8217;ll get a ton of info back and will need to scroll up a bit to find the versions array, such as:</p>
<p>versions:<br />
      [ &#8216;0.2.1&#8217;,<br />
        &#8216;0.2.3&#8217;,<br />
        &#8216;0.2.4&#8217;,<br />
        &#8216;0.2.5&#8217;,<br />
        &#8216;0.2.6&#8217;,<br />
        &#8216;0.2.7&#8217;,<br />
        &#8216;0.2.8&#8217;,<br />
        &#8216;0.2.9&#8217;,<br />
        &#8216;0.3.0&#8217;,<br />
        &#8216;0.3.1&#8217;,<br />
        &#8216;0.3.2&#8217;,<br />
        &#8216;0.3.3&#8217; ]</p>
<p>The <a rel="nofollow" target="_blank" href="http://plugins.cordova.io">Plugins Registry</a> also lists all the versions for any given plugin in a drop-down list on the top right corner.  </p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/registry.png"><img src="http://devgirl.org/wp-content/uploads/2014/11/registry.png" alt="registry" width="600" height="328" class="aligncenter size-full wp-image-7503"/></a>
</li>
<p><div class="snvdshc"><div class="synved-box-message synved-box-success">All of the above commands work with the <code>phonegap</code> CLI as well since it is just a wrapper around the Cordova tooling to provide some additional features. If you&#8217;re an <a rel="nofollow" target="_blank" href="http://ionicframework.com">Ionic Framework</a> user, the same applies for their CLI. So you could do <code>$ phonegap platform list</code> and <code>$ ionic platform list</code> etc. </div></div>
</ul>
<h2>PhoneGap Versions</h2>
<p>The main thing to know about the PhoneGap (Adobe-specific CLI) side of things is that the above applies except the <a rel="nofollow" target="_blank" href="http://phonegap.com/install/">overall PhoneGap version and CLI version (which are the same)</a> are generally a bit behind compared to the overall Cordova version due to the fact that the PhoneGap team needing to update it after the cordova version is available and testing needed to ensure compatibility with different things. Similar to cordova, to find the overall/CLI version of phonegap installed, type:<br />
<br />
<code>$ phonegap -v<br />
3.6.0-0.21.19<br />
</code></p>
<p>When using the PhoneGap CLI versus the Cordova CLI, again the set of platforms can be different and will be based specifically on  the version number above since it encompasses both the CLI and the certain set of platform versions as I explained previously, such as:<br />
<br />
<code>$ phonegap platform list<br />
Installed platforms: android 3.6.3, firefoxos 3.6.3, ios 3.6.3<br />
Available platforms: amazon-fireos, blackberry10, browser<br />
</code></p>
<p>In this case some of the platform versions happen to match what I got from 4.0.0 in the top of the post since no independent platform releases were done between 3.6.0 and 4.0.0 apparently. The point is that you should never assume they will be the same between overall versions.</p>
<p><strong>** NOTE:</strong> You can still add a specific platform version using the phonegap CLI with the @ syntax as described above:<br />
<br />
<code>$ phonegap platform add ios@3.7.0</code></p>
<div class="snvdshc"><div class="synved-box-message synved-box-warning"><strong>NOTE:</strong> The versions of platform to overall version can be particularly confusing since they may be close or similar in numbers. This is especially true right now with the PhoneGap overall/CLI version since it&#8217;s at 3.6.0 and many of the platforms are 3.6.x as noted above. Keep the context in mind when reading about a particular fix being in a version since it may just be referring to the platform version (ios etc) versus the overall. 
<p>For instance, this morning I installed <a rel="nofollow" target="_blank" href="http://cordova.apache.org/announcements/2014/11/06/cordova-ios-3.7.0.html">iOS v3.7.0</a> specifically to fix something since iOS 3.6.3 is the current default iOS version installed when you do <code>$ npm install cordova</code> and then add the iOS platform. This is because iOS v3.6.3 is the default version for overall/CLI version 4.0.0 currently the latest released, but iOS 3.7.0 will be the default when the overall (and CLI) <a rel="nofollow" target="_blank" href="http://cordova.apache.org/announcements/2014/11/06/cordova-ios-3.7.0.html">version 4.1.0</a> is released. </div></div>
<h2>PhoneGap Build Versions
<p><a rel="nofollow" target="_blank" href="http://build.phonegap.com">PhoneGap Build</a> supports an overall version of PhoneGap to do its compiling which is also typically behind the latest Cordova version a bit to ensure plugins are tested and compatible etc. For instance, right now it&#8217;s v3.6.3 which happens to match the PhoneGap Overall/CLI version, but this is not always the case. You can find the version used for your PhoneGap Build project in the UI for a given project such as shown with the arrow below:</p>
<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/11/pgb-version1.png"><img src="http://devgirl.org/wp-content/uploads/2014/11/pgb-version1.png" alt="pgb-version" width="600" height="210" class="aligncenter size-full wp-image-7425"/></a><br />
You may also notice a warning on the project to update if it&#8217;s an older project and a new version is available or recommended due to an important fix as shown in yellow above. </p>
<p>To build with a specific version of PhoneGap, specify it in the config.xml preferences tag:<br />
<br />
<code>&lt;preference name="phonegap-version" value="3.5.0" /&gt;</code><br />
</p>
<h3>PhoneGap Build &#8211; Plugin Versions</h3>
<p>You should also be aware of the version of plugin being used when building with PhoneGap Build. See <a rel="nofollow" target="_blank" href="https://build.phonegap.com/plugins">this link</a> for the latest default versions of plugins used by PhoneGap Build. It&#8217;s recommended to specify the plugin version you want to use in your config.xml as well in the <a rel="nofollow" target="_blank" href="http://docs.build.phonegap.com/en_US/configuring_plugins.md.html"><strong></strong> tag explained here</a>. </p>
<h2>Stay Informed!</h2>
<p>I <strong><em>HIGHLY</em></strong> recommend you follow these accounts on twitter to stay on top of all new updates:</p>
<h4>Twitter</h4>
<ul>
<li> <a rel="nofollow" target="_blank" href="http://twitter.com/@apachecordova">@apachecordova</a></li>
<li><a rel="nofollow" target="_blank" href="https://twitter.com/PhoneGap">@PhoneGap</a></li>
<li><a rel="nofollow" target="_blank" href="https://twitter.com/PhoneGapBuild">@PhoneGapBuild</a></li>

</ul>
<span style="background-color:#fbfac7;padding:0 2px;"> <strong>Tip:</strong> Even if you find twitter a distraction, you could set up an id just to follow important account as these since it truly is the easiest way to stay on top of the latest.<br />
</span>
<p></p>
<h4>Blogs / News / Mailing Lists</h4>
<ul>
<li> <a rel="nofollow" target="_blank" href="http://cordova.apache.org/#news">Apache Cordova News</a></li>
<li><a rel="nofollow" target="_blank" href="http://phonegap.com/blog/phonegap/">PhoneGap Blog</a></li>
<li><a rel="nofollow" target="_blank" href="http://phonegap.com/blog/phonegap-build/">PhoneGap Build Blog</a></li>
<li><a rel="nofollow" target="_blank" href="http://cordova.apache.org/#mailing-list">Cordova Mailing List</a></li>
<li><a rel="nofollow" target="_blank" href="http://phonegap.com/community/newsletter/">Sign up for the PhoneGap Newsletter</a></li>

</ul>
<h3>Related Links</h3>
<p>Please also see these related links to resources from my colleague <a rel="nofollow" target="_blank" href="https://twitter.com/raymondcamden">Ray Camden</a> in relation to all of the above:</p>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.raymondcamden.com/2014/4/24/Keeping-up-with-Cordova-and-PhoneGap">Keeping up with Cordova and PhoneGap</a> </li>
<li><a rel="nofollow" target="_blank" href="http://www.raymondcamden.com/2014/10/3/Figuring-out-what-version-of-Cordova-created-a-project">Ray&#8217;s recent versions post</a> </li>
</ul>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F07%2Fcordovaphonegap-version-confusion%2F&amp;linkname=Cordova%2FPhoneGap%20Version%20Confusion" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F07%2Fcordovaphonegap-version-confusion%2F&amp;linkname=Cordova%2FPhoneGap%20Version%20Confusion" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F07%2Fcordovaphonegap-version-confusion%2F&amp;linkname=Cordova%2FPhoneGap%20Version%20Confusion" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F11%2F07%2Fcordovaphonegap-version-confusion%2F&amp;title=Cordova%2FPhoneGap%20Version%20Confusion" id="wpa2a_16"></a></p></h2></div>]]></content:encoded>
      </item>
      <item>
         <title>New Icons and Splash Screen Help for Cordova/PhoneGap Apps</title>
         <link>http://devgirl.org/2014/09/29/new-icons-and-splash-screen-help-for-cordovaphonegap/</link>
         <description>The Cordova CLI recently included some updates developers may not be aware of but find helpful in configuring splash screens and icons for their mobile apps. There&amp;#8217;s now support for a</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7361</guid>
         <pubDate>Mon, 29 Sep 2014 14:05:39 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/02/cordova_bot.png"><img src="http://devgirl.org/wp-content/uploads/2014/02/cordova_bot-150x150.png" alt="cordova_bot" width="150" height="150" class="alignleft size-thumbnail wp-image-6568"/></a>The <a rel="nofollow" target="_blank" href="https://github.com/apache/cordova-cli/">Cordova CLI</a> recently included some updates developers may not be aware of but find helpful in configuring splash screens and icons for their mobile apps. There&#8217;s now support for a <a rel="nofollow" target="_blank" href="https://issues.apache.org/jira/browse/CB-3571"><code>&lt;splash&gt;</code> and <code><a rel="nofollow" target="_blank" href="https://issues.apache.org/jira/browse/CB-2606">&lt;icon&gt;</a></code> elements in the <strong>config.xml</strong> file. You can use these elements to specify each of the splash screen images and icons desired per platform and they will now be copied into their respective platform locations for you. Prior to this change you would need to use <a rel="nofollow" target="_blank" href="http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/">hook</a> or copy them down to their platform folders manually; not ideal. These changes also make it much better for managing your assets from a source control and team perspective since you don&#8217;t want to check in your platforms folders but can now keep them in their own folders along with the <em>www</em>. </p>
<p>The tags look like the following but you would include <a rel="nofollow" target="_blank" href="http://cordova.apache.org/docs/en/edge/config_ref_images.md.html#Icons%20and%20Splash%20Screens">a list of them</a> for all the sizes you want to support under each platform:</p>
<pre>
&lt;platform name=&quot;ios&quot;&gt;
     &lt;icon src=&quot;icons/myIcon.png&quot; width=&quot;80&quot; height=&quot;80&quot; /&gt;    	     
&lt;/platform&gt;
&lt;platform name=&quot;ios&quot;&gt;
     &lt;splash src=&quot;iphone/splash-default.png&quot; width=&quot;2048&quot; height=&quot;1536&quot;/&gt;
&lt;/platform&gt;
</pre>
<div class="snvdshc"><div class="synved-box-message synved-box-info">If specified, the icons and splash screens will get copied down when a platform is added (<code>cordova platform add ios)</code>. They will also get copied again upon build (<code>cordova build ios)</code> though if you specified them after a platform had been added.</div></div>
<p>Check out the <a rel="nofollow" target="_blank" href="http://cordova.apache.org/docs/en/edge/config_ref_images.md.html#Icons%20and%20Splash%20Screens">docs for details</a> on how to configure the icons splash screens for the different platforms and sizes. I tested this out on iOS and Android myself and it worked great. </p>
<p>Some things to be aware of&#8230; </p>
<ul>
<li>The image paths you specify are relative to the <em>root</em> project folder, NOT the <em>www</em> folder</li>
<p></p>
<li>The names of the images will change to what the CLI defaults them to in their final destination so don&#8217;t be confused if you don&#8217;t see the same file names. They are renamed to defaults based on the sizes or densities specified. For instance, if I have the following specified for a splash screen size for iOS pointing to my image in the <em><strong>rootProj/iphone</strong></em> folder named <code>mySplash.png</code>:
<pre>
&lt;platform name=&quot;ios&quot;&gt;
    &lt;splash src=&quot;iphone/mySplash.png&quot; width=&quot;320&quot; height=&quot;480&quot;/&gt;
&lt;/platform&gt;
</pre>
<p>It will be placed in the ios platform splash location (ie: <em>rootProj/platforms/ios/HelloCordova/Resources/splash</em>) as <code>Default~iphone.png</code> since that&#8217;s the size that it matched.
</li>
<p></p>
<li>
If you specify just one icon for a platform, that same icon will be used for all resolutions across the board. 
<pre>
&lt;platform name=&quot;android&quot;&gt;
    &lt;icon src=&quot;myIcon.png&quot;/&gt;
&lt;/platform&gt;

&lt;platform name=&quot;ios&quot;&gt;
    &lt;icon src=&quot;myIcon.png&quot;/&gt;
&lt;/platform&gt;
</pre>
<p><span style="background-color:#fbfac7;padding:0 2px;">  <strong>***Update: </strong></span> If you visited previously and saw a mention about support for <a rel="nofollow" target="_blank" href="http://www.imagemagick.org/">Imagemagick</a> to resize a single icon to all resolutions, this feature was not actually contained in the 3.6 version of the Cordova CLI as I explained it originally and I really apologize for any confusion. It was actually <a rel="nofollow" target="_blank" href="https://github.com/leahciMic/cordova-cli/commit/f36666ddb03c49e61ed123022dc8d55e0742aeba">a forked version </a>that was not included in the Cordova release. </p>
<p><strong>HOWEVER</strong>, this is still possible to achieve using this <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/cordova-icon">cordova-icon</a> package in a <a rel="nofollow" target="_blank" href="http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/">cordova hook</a> upon build with a single image file (1024&#215;1024 recommended). Your image file will be resized to all of the different icon sizes and copied down to the different platforms. The <a rel="nofollow" target="_blank" href="https://www.npmjs.org/package/cordova-icon">cordova-icon npm page</a> has a couple of instructions to follow to set this up but is very straightforward. You should also check out <a rel="nofollow" target="_blank" href="http://alexdisler.com/blog/how-to-develop-faster-with-ionic-and-cordova/">Alex&#8217;s blog post</a> about this topic for more details.</p>
<p><div class="snvdshc"><div class="synved-box-message synved-box-info">Remember the above is only needed if you want to use one image to be resized for your project. If you specify an icon element in your config.xml per density, the CLI will copy those in for you. If you want to use a UI tool to generate icon sizes for you originally to then manually add to the config.xml after, check out <a rel="nofollow" target="_blank" href="http://makeappicon.com/">MakeAppIcon</a>.</div></div>
</li>
<p></p>
<li>If you&#8217;re wondering about iOS8 support for <a rel="nofollow" target="_blank" href="https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/IconMatrix.html#//apple_ref/doc/uid/TP40006556-CH27-SW1">iPhone 6 and iPhone 6 Plus</a> icons and splash screens, it&#8217;s in progress and you can find out the latest status <a rel="nofollow" target="_blank" href="https://issues.apache.org/jira/browse/CB-7043">here</a> (see subtasks 48-53). This issue tracks all things being worked on for iOS8 support so you may want to bookmark it for general reference. </li>
<p></p>
<li>You can include both <em>splash</em> and <em>icon</em> elements in the same parent <em>platform</em> element in your config.xml file, such as:
<pre>
&lt;platform name=&quot;ios&quot;&gt;
    &lt;icon src=&quot;icons/myIcon.png&quot; width=&quot;80&quot; height=&quot;80&quot; /&gt;    	
    &lt;splash src=&quot;iphone/mySplash.png&quot; width=&quot;320&quot; height=&quot;480&quot;/&gt;
&lt;/platform&gt;
</pre>
<p>They don&#8217;t have to be separate unless you want to do so for readability.
</li>
<p></p>
<li>If you develop with the <a rel="nofollow" target="_blank" href="http://ionicframework.com">Ionic</a> framework this change is available to you since the Ionic CLI wraps the Cordova CLI. </li>
<p></p>
<li>This change has not landed in the <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli">PhoneGap CLI</a> yet but should be coming in the next version soon. </li>
<p></p>
<li>Don&#8217;t confuse this with the <a rel="nofollow" target="_blank" href="http://docs.build.phonegap.com/en_US/configuring_icons_and_splash.md.html">PhoneGap Build</a> elements that are used for icons and splash screens, though they offer similar support, they are separate and you should follow the <a rel="nofollow" target="_blank" href="http://cordova.apache.org/docs/en/edge/config_ref_images.md.html#Icons%20and%20Splash%20Screens">documentation for the CLI</a>. </li>
</ul>
<div class="snvdshc"><div class="synved-box-message synved-box-success">The <code>&lt;icon&gt;</code> support appeared in version 3.5, a bit prior to the <code>&lt;splash&gt;</code> screen element support, but I still wanted to point out both in case some were not aware of it.</div></div>
<p>I posted about <a rel="nofollow" target="_blank" href="http://devgirl.org/2013/09/12/phonegap-icons-and-splash-screens-help/">icons and splash screens help awhile back here</a> in case it&#8217;s useful as a related reference. </p>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F29%2Fnew-icons-and-splash-screen-help-for-cordovaphonegap%2F&amp;linkname=New%20Icons%20and%20Splash%20Screen%20Help%20for%20Cordova%2FPhoneGap%20Apps" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F29%2Fnew-icons-and-splash-screen-help-for-cordovaphonegap%2F&amp;linkname=New%20Icons%20and%20Splash%20Screen%20Help%20for%20Cordova%2FPhoneGap%20Apps" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F29%2Fnew-icons-and-splash-screen-help-for-cordovaphonegap%2F&amp;linkname=New%20Icons%20and%20Splash%20Screen%20Help%20for%20Cordova%2FPhoneGap%20Apps" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F29%2Fnew-icons-and-splash-screen-help-for-cordovaphonegap%2F&amp;title=New%20Icons%20and%20Splash%20Screen%20Help%20for%20Cordova%2FPhoneGap%20Apps" id="wpa2a_18"></a></p></a>]]></content:encoded>
      </item>
      <item>
         <title>Quick Tip: Testing Ionic Apps with the PhoneGap Developer App</title>
         <link>http://devgirl.org/2014/09/08/quick-tip-testing-ionic-apps-with-the-phonegap-developer-app/</link>
         <description>The PhoneGap Developer App is a great tool for testing PhoneGap and Cordova apps quickly with no platform SDK setup required on your machine. You just download the PhoneGap App from the app store, run a PhoneGap CLI command from your machine to serve up the application you want to test on any iOS, Android [&amp;#8230;]</description>
         <guid isPermaLink="false">http://devgirl.org/?p=7343</guid>
         <pubDate>Mon, 08 Sep 2014 12:31:35 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://devgirl.org/wp-content/uploads/2014/09/pg-dev-app.jpg"><img src="http://devgirl.org/wp-content/uploads/2014/09/pg-dev-app-150x150.jpg" alt="pg-dev-app" width="150" height="150" class="alignleft size-thumbnail wp-image-7349"/></a>The <a rel="nofollow" target="_blank" href="http://app.phonegap.com/">PhoneGap Developer App</a> is a great tool for testing PhoneGap and Cordova apps quickly with no platform SDK setup required on your machine. You just download the PhoneGap App from the app store, run a <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli">PhoneGap CLI</a> command from your machine to serve up the application you want to test on any <a rel="nofollow" target="_blank" href="https://itunes.apple.com/app/id843536693">iOS</a>, <a rel="nofollow" target="_blank" href="https://play.google.com/store/apps/details?id=com.adobe.phonegap.app">Android</a> or <a rel="nofollow" target="_blank" href="http://www.windowsphone.com/en-us/store/app/phonegap-developer/5c6a2d1e-4fad-4bf8-aaf7-71380cc84fe3">Win Phone</a> device and <a rel="nofollow">sync to it</a> from the app running on the device. It also includes live reloading so you can see any changes to your app immediately reflected on your device while running it. </p>
<p>If you&#8217;re using the <a rel="nofollow" target="_blank" href="http://ionicframework.com/">Ionic framework</a> for your mobile development, you may not be aware that you can still use the PhoneGap Developer app to test your apps built with Ionic on different devices as well with a couple quick tips. You will need to use the <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli">PhoneGap CLI</a> to serve your application rather than the <a rel="nofollow" target="_blank" href="https://github.com/driftyco/ionic-cli">Ionic CLI</a> for this case and create an empty <code>.cordova </code>folder in the root of your Ionic project. The PhoneGap CLI currently looks for the existence of a <code>.cordova </code>folder, so it will only properly connect if it&#8217;s there <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli/issues/300">until this dependency is removed</a>. It should be removed in the near future but for now I wanted to give this tip on how to make it work. </p>
<div class="snvdshc"><div class="synved-box-message synved-box-info"><strong>Note:</strong> If you have the the latest <a rel="nofollow" target="_blank" href="https://github.com/driftyco/ionic-cli">Ionic CLI</a> update (version 1.2) and are using the <a rel="nofollow" target="_blank" href="http://ionicframework.com/blog/live-reload-all-things-ionic-cli/">live reload</a> flag upon run (<code>ionic run ios -l</code>), you can try to connect to the URL it returns from the PhoneGap Developer App as well. In my testing it worked to connect and run my app though I did find some things not working quite right which I will investigate further. For now I would recommend using the <a rel="nofollow" target="_blank" href="https://github.com/phonegap/phonegap-cli">PhoneGap CLI</a> for this workflow. </div></div>
<p>For further details on the PhoneGap Developer App and how to use it, please see the <a rel="nofollow" target="_blank" href="http://phonegap.com/blog/2014/04/23/phonegap-developer-app/">detailed announcement post</a> or my <a rel="nofollow" target="_blank" href="http://devgirl.org/2014/04/22/introducing-the-phonegap-developer-app/">previous post</a> on this topic. </p>
<p><a rel="nofollow" class="a2a_button_twitter" target="_blank" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F08%2Fquick-tip-testing-ionic-apps-with-the-phonegap-developer-app%2F&amp;linkname=Quick%20Tip%3A%20Testing%20Ionic%20Apps%20with%20the%20PhoneGap%20Developer%20App" title="Twitter"></a><a rel="nofollow" class="a2a_button_google_plus" target="_blank" href="http://www.addtoany.com/add_to/google_plus?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F08%2Fquick-tip-testing-ionic-apps-with-the-phonegap-developer-app%2F&amp;linkname=Quick%20Tip%3A%20Testing%20Ionic%20Apps%20with%20the%20PhoneGap%20Developer%20App" title="Google+"></a><a rel="nofollow" class="a2a_button_facebook" target="_blank" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F08%2Fquick-tip-testing-ionic-apps-with-the-phonegap-developer-app%2F&amp;linkname=Quick%20Tip%3A%20Testing%20Ionic%20Apps%20with%20the%20PhoneGap%20Developer%20App" title="Facebook"></a><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=http%3A%2F%2Fdevgirl.org%2F2014%2F09%2F08%2Fquick-tip-testing-ionic-apps-with-the-phonegap-developer-app%2F&amp;title=Quick%20Tip%3A%20Testing%20Ionic%20Apps%20with%20the%20PhoneGap%20Developer%20App" id="wpa2a_20"></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Jazz: Eldar Djangirov – my favorite jazz piano player</title>
         <link>https://gregsramblings.com/2014/07/01/jazz-eldar-djangirov-my-fav-jazz-piano-player-currently/</link>
         <description>I first heard this guy in 2006 while listening to late-night Jazz radio in the car. It caught my attention immediately.  I later learned he was only 18 years old at the time of the recording!  Unbelievable!  He&amp;#8217;s in his mid-20&amp;#8217;s now, and getting better every recording.  He has a very interesting history. This is a track [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3942</guid>
         <pubDate>Tue, 01 Jul 2014 21:16:06 +0000</pubDate>
         <content:encoded><![CDATA[<p>I first heard this guy in 2006 while listening to late-night Jazz radio in the car. It caught my attention immediately.  I later learned he was only 18 years old at the time of the recording!  Unbelievable!  He&#8217;s in his mid-20&#8217;s now, and getting better every recording.  He has a very interesting <a rel="nofollow" target="_blank" href="http://eldarmusic.com/about/">history</a>.</p>
<p>This is a track from his 2013 CD called <a rel="nofollow" target="_blank" href="http://eldarmusic.com/">Breakthrough</a>. What you are seeing is the actual recording that made it on the CD and is one of my favorites.</p>
<p></p> 
<p>I&#8217;ve seen him live twice, and both times, it was phenomenal.  If you get a chance to see him on <a rel="nofollow" target="_blank" href="http://eldarmusic.com/tour/">tour</a>, do it.</p>
<p>By the way, he always has an album where he plays exclusively classical music, &#8220;BACH/BRAHMS/PROKOFIEV&#8221;.</p>
<hr />
<p>&nbsp;</p>
<p>Eldar on Spotify:</p>
<p></p> 
<p><a rel="nofollow" target="_blank" href="https://www.facebook.com/Eldar">Eldar on Facebook</a></p>
<p><a rel="nofollow" target="_blank" href="https://play.google.com/music/m/Af43fil2iq5uec4cezeetuvnoz4">Eldar on Google Play</a></p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2014%2F07%2F01%2Fjazz-eldar-djangirov-my-fav-jazz-piano-player-currently%2F&amp;title=Jazz%3A%20Eldar%20Djangirov%20%E2%80%93%20my%20favorite%20jazz%20piano%20player" id="wpa2a_16"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Learn with me – Google Cloud Platform – Compute Instance</title>
         <link>https://gregsramblings.com/2014/06/29/learn-with-me-google-cloud-platform-compute-instance/</link>
         <description>As I announced a few days ago, I&amp;#8217;ve joined Google&amp;#8217;s developer advocacy team focused on the Google Cloud Platform.   It&amp;#8217;s been over 15 years since I was the &amp;#8220;new guy&amp;#8221; at any company, so it&amp;#8217;s going to be a huge adventure for me.  In addition to the radical culture and technology shift, my wife and [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3932</guid>
         <pubDate>Mon, 30 Jun 2014 00:33:38 +0000</pubDate>
         <content:encoded><![CDATA[<p>As I <a rel="nofollow" target="_blank" href="http://gregsramblings.com/2014/06/27/ive-joined-google/">announced</a> a few days ago, I&#8217;ve joined Google&#8217;s developer advocacy team focused on the <a rel="nofollow" target="_blank" href="http://cloud.google.com">Google Cloud Platform</a>.   It&#8217;s been over 15 years since I was the &#8220;new guy&#8221; at any company, so it&#8217;s going to be a huge adventure for me.  In addition to the radical culture and technology shift, my wife and I are moving from Tampa, FL to San Francisco, so my life is crazyland!  In between packing boxes, attending Noogler (new Googler) orientation, attending Google IO, and exploring the Google campuses.  I&#8217;m also trying to get myself familiar with the Google Cloud Platform technology so I can actually perform my job soon!  As I dive into this amazing platform, I thought I&#8217;d share my learning path with you.</p>
<p>I&#8217;ve been an Amazon Web Services user for many years and spent most of my time in Amazon EC2, so I decided to start with Google&#8217;s equivalent, <a rel="nofollow" target="_blank" href="https://cloud.google.com/products/compute-engine/">Compute Engine</a>.  As expected, there are multiple instance types of varying memory size, CPU power, and price.  Getting up and going was painless.  I quickly discovered that I can do anything I need using either the command-line interface or the web UI.  One feature that I especially like is that I can configure my instance in the Web UI and then see the equivalent command-line syntax.  (Last week, I learned more about the command-line interface for Google Cloud Platform from one of the Google IO videos, <a rel="nofollow" target="_blank" href="https://www.google.com/events/io/io14videos/23d7d095-92d0-e311-b297-00155d5066d7">Command Your Cloud with gCloud</a>.)</p>
<p>The concepts of Compute Engine were familiar and I had no problems spinning up a small instance for this blog (did you notice how fast it loads?).  I also noticed that pricing is simpler than Amazon&#8217;s.  The one thing that really stood out to me was the &#8220;<a rel="nofollow" target="_blank" href="https://developers.google.com/compute/pricing?_ga=1.196945708.1200202906.1396491013#sustained_use">sustained use discounts</a>&#8220;.  Basically, we apply a discount to your bill at the end of the billing period based on the sustained usage of your instances.  If you are running a 24/7 app server, blog, etc., then you are at 100% sustained use and you&#8217;ll receive a 40% discount on the base price.  This is much easier to budget for and eliminates the up-front payment that Amazon&#8217;s reserved instances require (I wrote about <a rel="nofollow" target="_blank" href="http://gregsramblings.com/2013/06/04/ec2-reserved-pricing-advantages/">reserved instance</a> prior to joining Google).</p>
<h3>Resources I used to learn more:</h3>
<p>Another member of the developer advocacy team, Brian Dorsey (<a rel="nofollow" target="_blank" href="https://plus.google.com/+BrianDorsey">G+</a>/<a rel="nofollow" target="_blank" href="https://twitter.com/briandorsey">Twitter</a>), put together a great 4 minute video overview:<br />
</p> 
<p>I read the various resources listed on the <a rel="nofollow" target="_blank" href="https://cloud.google.com/products/compute-engine/">Compute Engine webpage</a>.</p>
<p>I found a great video from ChefConf 2014 where Google Technical Program Manager Eric Johnson (<a rel="nofollow" target="_blank" href="https://plus.google.com/+EricJohnson_erjohnso">G+</a>) did a very in-depth overview of Computer Engine:</p>
<p>&nbsp;</p>
<p></p> 
<p>Then I dove into the <a rel="nofollow" target="_blank" href="https://developers.google.com/compute/?_ga=1.32810174.1200202906.1396491013">getting started guide</a> and finally <a rel="nofollow" target="_blank" href="https://developers.google.com/compute/docs/overview">the docs</a>.</p>
<p>I&#8217;ll soon be diving into BigQuery, App Engine, Cloud Storage, Cloud SQL, and Cloud Datastore.  It&#8217;s an interesting time to dig into all of this because new stuff is coming out rapidly.  Hopefully I can catch up!</p>
<p>Stay tuned for more&#8230;</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2014%2F06%2F29%2Flearn-with-me-google-cloud-platform-compute-instance%2F&amp;title=Learn%20with%20me%20%E2%80%93%20Google%20Cloud%20Platform%20%E2%80%93%20Compute%20Instance" id="wpa2a_18"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Jazz: Arturo Sandoval “There Will Never Be Another You”</title>
         <link>https://gregsramblings.com/2014/06/27/jazz-arturo-sandoval-there-will-never-be-another-you/</link>
         <description>Expanding my blog to include one of my other passions &amp;#8211; Jazz. Just discovered this fairy recent video. I&amp;#8217;ve seen Arturo in concert twice. Really great trumpet player with an amazing history. Absolutely amazing. Piano player blew me away. Piano: Mahesh Balasooyria Sax: Zane Musa Bass: John Belzaguy Drums: Johnny Friday</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3926</guid>
         <pubDate>Sat, 28 Jun 2014 03:53:58 +0000</pubDate>
         <content:encoded><![CDATA[<p>Expanding my blog to include one of my other passions &#8211; Jazz. Just discovered this fairy recent video. I&#8217;ve seen Arturo in concert twice. Really great trumpet player with an amazing <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Arturo_Sandoval">history</a>. Absolutely amazing. Piano player blew me away.</p>
<p>Piano: Mahesh Balasooyria<br />
Sax: Zane Musa<br />
Bass: John Belzaguy<br />
Drums: Johnny Friday</p>
<p></p> 
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2014%2F06%2F27%2Fjazz-arturo-sandoval-there-will-never-be-another-you%2F&amp;title=Jazz%3A%20Arturo%20Sandoval%20%E2%80%9CThere%20Will%20Never%20Be%20Another%20You%E2%80%9D" id="wpa2a_20"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>I’ve joined Google</title>
         <link>https://gregsramblings.com/2014/06/27/ive-joined-google/</link>
         <description>After 10 incredible years at Adobe, I&amp;#8217;ve decided to get back to my developer roots and move to Google. I&amp;#8217;ll be heading up the developer advocacy team for Google Cloud Platform.  If you haven&amp;#8217;t looked at GCP lately, you might be surprised (I was!).  You can also get a sense of the amazing momentum at the [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3919</guid>
         <pubDate>Fri, 27 Jun 2014 18:37:36 +0000</pubDate>
         <content:encoded><![CDATA[<p>After 10 incredible years at Adobe, I&#8217;ve decided to get back to my developer roots and move to Google. I&#8217;ll be heading up the developer advocacy team for <a rel="nofollow" target="_blank" href="http://cloud.google.com">Google Cloud Platform</a>.  If you haven&#8217;t looked at GCP lately, you might be surprised (I was!).  You can also get a sense of the amazing momentum at the <a rel="nofollow" target="_blank" href="http://googlecloudplatform.blogspot.com">Google Cloud Platform Blog</a>.</p>
<p>Stay tuned!</p>
<p>PS: My blog has been moved to a Google Compute Instance (so fast!).  I&#8217;ll be moving it to a managed VM soon and will share the details/benefits/etc.</p>
<p><img class="alignnone" src="https://cloud.google.com/_static/images/gcp-logo.png" alt="" width="383" height="48"/></p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2014%2F06%2F27%2Five-joined-google%2F&amp;title=I%E2%80%99ve%20joined%20Google" id="wpa2a_22"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Tricks with Google Mail Addresses with dots and pluses</title>
         <link>https://gregsramblings.com/2013/06/22/tricks-with-google-mail-addresses-dots-pluses/</link>
         <description>Most people don&amp;#8217;t know that Google Mail has some unique &amp;#8220;features&amp;#8221; when it comes to your email address. All of the following email addresses are exactly the same from Google&amp;#8217;s point of view.  All of them will end up in my gmail inbox: greg.wilson@gmail.com (what I commonly share) gregwilson@gmail.com (what some other Greg Wilson commonly [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3887</guid>
         <pubDate>Sat, 22 Jun 2013 18:36:44 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-3892" alt="gmaillogosquare" src="http://gregsramblings.com/wp-content/uploads/2013/06/gmaillogosquare-150x150.png" width="150" height="150"/>Most people don&#8217;t know that Google Mail has some unique &#8220;features&#8221; when it comes to your email address.</p>
<p>All of the following email addresses are exactly the same from Google&#8217;s point of view.  All of them will end up in my gmail inbox:</p>
<ul>
<li><span style="line-height:13px;">greg.wilson@gmail.com (what I commonly share)</span></li>
<li>gregwilson@gmail.com (what some other Greg Wilson commonly shares so I get his email!)</li>
<li>g.r.e.g.w.i.l.s.o.n@gmail.com</li>
<li>g.regwilson@gmail.com</li>
<li>greg.wilson+whatever@gmail.com</li>
<li>greg.wilson+somethingelse@gmail.com</li>
<li>greg.wilson+anotherthing@gmail.com</li>
</ul>
<p>As you probably figured out, Google Mail ignores dots &#8220;.&#8221; and it ignores anything after the &#8220;+&#8221;.</p>
<p>It&#8217;s a good way to determine if a site is sharing your email address.  I once registered as greg.wilson+abccompany-newsletter@gmail.com.  A few weeks later, I started getting spam addressed to greg.wilson+abccompany-newsletter@gmail.com so I know for a fact that abccompany shared or sold my email address.</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F06%2F22%2Ftricks-with-google-mail-addresses-dots-pluses%2F&amp;title=Tricks%20with%20Google%20Mail%20Addresses%20with%20dots%20and%20pluses" id="wpa2a_24"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Simple server backups with Amazon S3 and Glacier</title>
         <link>https://gregsramblings.com/2013/06/07/simple-server-backups-with-amazon-s3-lifecycle-rules-and-glacier/</link>
         <description>Amazon recently announced a new feature in Amazon S3 called Lifecycle.  It allows you to create a rule that does one or both of the following based on the age of the objects in the S3 bucket: Move the object to Glacier (super-cheap offline storage) Delete the object permanently from the bucket I decided to [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3875</guid>
         <pubDate>Fri, 07 Jun 2013 15:55:37 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://aws.amazon.com/"><img class="size-full wp-image-3855 alignright" style="margin-left:5px;margin-right:5px;" alt="nav_main_sprite" src="http://gregsramblings.com/wp-content/uploads/2013/06/nav_main_sprite.png" width="162" height="64"/></a>Amazon recently announced a new feature in <a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3">Amazon S3</a> called <a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3/#managing">Lifecycle</a>.  It allows you to create a rule that does one or both of the following based on the age of the objects in the S3 bucket:</p>
<ul>
<li><span style="line-height:13px;">Move the object to Glacier (super-cheap offline storage)</span></li>
<li>Delete the object permanently from the bucket</li>
</ul>
<p>I decided to use this to simplify backups of some of the servers I maintain.  Here&#8217;s my script (without error checking and other non-relevant code):</p>
<pre>
#!/bin/bash
tar -czf backup_$(date +%Y%m%d).tgz myStuffToBackupFolder/
s3cmd --reduced-redundancy put backup_$(date +%Y%m%d).tgz s3://mys3backupbucket
rm backup_$(date +%Y%m%d).tgz
</pre>
<p>Basically, my script creates a .tgz file that contains all of the files that I want to backup.  The script names the tgz file using the current date (e.g. backup_20130607.tgz). It then copies the tgz file to my Amazon S3 bucket using <a rel="nofollow" target="_blank" href="http://s3tools.org/s3cmd">s3cmd</a> and removes the tgz file from my local filesystem.</p>
<p>If you haven&#8217;t used the s3cmd before, you should check it out. It gives you a very simple command-line interface to Amazon S3 buckets. You can read more at <a rel="nofollow" target="_blank" href="http://s3tools.org/s3cmd">http://s3tools.org/s3cmd</a>.  You&#8217;ll find versions for Linux and Mac OS.</p>
<p>Typically, I would add some code to the backup script that keeps x backups and deletes anything older than y days.  Amazon&#8217;s new lifecycle feature really makes this super simple.  If I go to the properties of my S3 bucket on the Amazon Web Services console, I can create the following lifecycle rule:</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-3877" style="border:1px solid black;" alt="s3lifecycledialog1" src="http://gregsramblings.com/wp-content/uploads/2013/06/s3lifecycledialog1.jpg" width="608" height="352"/></p>
<p>My rule specifies that each backup file is available from the S3 bucket for the first 10 days.  Then, after 10 days, the file is moved to Amazon Glacier (to reduce cost dramatically &#8211; about 80% cheaper than leaving the file in an S3 bucket).  Then, after a year, the file is automatically deleted.</p>
<p>If you are not familiar with Amazon Glacier, here are a few facts you need to know:</p>
<ul>
<li><span style="line-height:13px;">It&#8217;s crazy cheap storage &#8211; currently it&#8217;s $0.01/GB/month (compared to $0.09/GB/month for S3 storage), so a terabyte would only cost $10/month in Glacier.</span></li>
<li>Files in Glacier are not immediately accessible.  It takes 3-5 hours for a restore request to be completed.  Just think of it as a tape backup (I have no idea what type of media Amazon is actually using for Glacier storage).</li>
<li>There is a minimum three month storage policy on Glacier and there is a restore fee for anything beyond 5% of your stored data.  A lot of people miss this fine print.  Amazon words it like this: &#8220;<em>Glacier is designed with the expectation that restores are infrequent and unusual, and data will be stored for extended periods of time. You can restore up to 5% of your average monthly Glacier storage (pro-rated daily) for free each month. If you choose to restore more than this amount of data in a month, you are charged a restore fee starting at $0.01 per gigabyte</em>.&#8221;.  We&#8217;re not talking a lot of money so it&#8217;s not really a factor for my use case unless I suddenly need to restore some very large files (which typically means something bad has happened).</li>
<li>Files moved to Glacier still show up in your S3 bucket, but with a storage type of  &#8220;Glacier&#8221;.  I like this because I get a complete picture of how all of my files are stored.  Even tools I use like <a rel="nofollow" target="_blank" href="http://panic.com/transmit/">Transmit FTP</a>, <a rel="nofollow" target="_blank" href="https://trac.cyberduck.ch/">CyberDuck</a> and other FTP-like tools that support Amazon S3 buckets still show the files.  However, if you try to download Glacier-stored files using these tools, you&#8217;ll get a permission error until you do a restore via the Amazon Web Services console.</li>
<li>You&#8217;ll see other pricing parameters on the <a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3/pricing">S3 pricing page</a> &#8212; charges for PUT, POST, LIST, GET, etc., but when you&#8217;re only archiving a handful of files, it&#8217;s a rounding error.  For example, if I ran my backup daily, it would be 365 PUTs which doesn&#8217;t even add up to one cent!  So basically, you can ignore these unless you are backing up 100k+ files.  If you are really nervous about what your real cost is going to be at the end of the month, simply check the Amazon Web Services account activity page after a backup or two and extrapolate your monthly cost.</li>
<li>You can learn more about S3 and Glacier at <a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3/">http://aws.amazon.com/s3/</a>.</li>
</ul>
<p>One other note &#8212; you&#8217;ll see that my script uses the s3cmd parameter &#8220;&#8211;reduced-redundancy&#8221;.  Amazon has two classes of storage (other than Glacier) &#8212; normal and reduced redundancy.  Reduced redundancy is a bit cheaper, but offers less reliability.  Their site claims 99.99% durability vs the 99.999999999% durability of normal S3 storage.  For my particular needs, 99.99% is fine, especially since I&#8217;m quickly moving the files to Glacier.</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F06%2F07%2Fsimple-server-backups-with-amazon-s3-lifecycle-rules-and-glacier%2F&amp;title=Simple%20server%20backups%20with%20Amazon%20S3%20and%20Glacier" id="wpa2a_26"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Amazon EC2 user?  Don’t ignore reserved instances.</title>
         <link>https://gregsramblings.com/2013/06/04/ec2-reserved-pricing-advantages/</link>
         <description>There are many Amazon EC2 users like me &amp;#8211; those with a handful of micro, small, or medium instances to run various web services, etc.   I have a personal account with Amazon with a single EC2 small instance for my aerial photography business website as well as various websites for friends and family.  I recently [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3854</guid>
         <pubDate>Wed, 05 Jun 2013 00:24:24 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://aws.amazon.com/"><img class="size-full wp-image-3855 alignleft" style="margin:2px 9px;" alt="nav_main_sprite" src="http://gregsramblings.com/wp-content/uploads/2013/06/nav_main_sprite.png" width="162" height="64"/></a>There are many Amazon EC2 users like me &#8211; those with a handful of micro, small, or medium instances to run various web services, etc.   I have a personal account with Amazon with a single EC2 small instance for my <a rel="nofollow" target="_blank" href="http://tigeraerial.com">aerial photography business</a> website as well as various websites for friends and family.  I recently realized that when I set up my instance, I neglected to consider reserved instance pricing that Amazon offers.  I&#8217;m betting that many of you are like me &#8211; lightweight EC2 users who are missing out on the discount, so I thought I would share my analysis.</p>
<p>My personal situation is basically line 2 of the chart below (the small instance).  I&#8217;ve been paying $0.06/hour for more than a year, so about $43/month.  If I had taken the time to look into the reserved pricing advantage, I could have saved about $233 over the year.  I would have needed to pay $169 up front, but then I would have received reserved pricing at $0.014/hour instead of $0.06/hour.</p>
<div id="attachment_3872" style="width:630px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="https://docs.google.com/spreadsheet/ccc?key=0Ar_fODIJfKJSdFFNdC1GOXMtT1AxSXV5ZHRtNUM3VlE#gid=0"><img class="size-full wp-image-3872 " alt="ec2reservedpricinganalysiscorrected" src="http://gregsramblings.com/wp-content/uploads/2013/06/ec2reservedpricinganalysiscorrected.jpg" width="620" height="109"/></a><p class="wp-caption-text">based on June 4, 2013 pricing from AWS – Linux – US East – Heavy Utilization – 1 year term</p></div>
<p>Amazon offers three flavors of Reserved instance pricing &#8211; <em>Light Utilization</em>, <em>Medium Utilization</em>, and <em>Heavy Utilization</em> (used in the chart above).  Basically, it&#8217;s three different combinations of upfront pricing vs lower hourly rates.  Since I&#8217;m running basic web servers, the instance is up 24 hours per day (about 730 hours per month or 8765 hours per year), so the best pricing for me (and most people) is the heavy utilization option.</p>
<p>Amazon is effectively rewarding you for being consistent with your EC2 demands.</p>
<h3>When is reserved not a good option?</h3>
<p>The upfront cost is non-refundable, so if you only plan to use the instance for three months, you&#8217;ll lose money compared to the normal on-demand instance pricing.  For example, you might choose a micro instance for the development phase of a project and then upgrade three months later to a medium.  If you do a reserved instance on the micro instance, and then you upgrade the instance to a medium, you do not get reserved pricing on the medium instance because you locked into the micro pricing.  Only do reserved when you know that you are good to go for enough months to justify the upfront cost.</p>
<h3>How do I convert an existing instance to reserved pricing?</h3>
<p>One common misconception about reserved instances is that they are a different type of instance.  The instance itself is exactly the same so no change is needed.  Using reserved instances is all about billing.  When Amazon calculates your bill, they check to see if you have reserved any instances of the  same criteria (type, zone, etc.), and if you do, they apply the reserved pricing.  In order to get the discounted hourly rate of reserved instances, you simply need to buy a reserved instance that matches your existing instance.  In my case, I had a m1.small instance running in the us-east-1d availability zone.  I simply went to the Reserved Instance page in the EC2 console, clicked &#8220;Purchase Reserved Instances&#8221; and filled in the following dialog to match my existing image criteria:</p>
<p style="text-align:center;"><img class="size-full wp-image-3859 aligncenter" style="border:1px solid black;" alt="ec2reservedinstancedialog" src="http://gregsramblings.com/wp-content/uploads/2013/06/ec2reservedinstancedialog.jpg" width="620" height="112"/></p>
<p>After going through the checkout process and paying the upfront cost, I was all set.  Any future hours are now billed at the discounted rate.</p>
<h3>Other options</h3>
<p>I could have gone with a 3-year term, but that felt a little long for my situation and the additional savings wasn&#8217;t substantial. Also, when you go with a reserved instance, you are locking into the current price, so if the price of EC2 reserved instances goes down, you won&#8217;t be able to take advantage of it mid-term. So, a one year term seems best in my opinion.</p>
<p>To see detailed pricing in all zones, all instance types and other terms, go to the <a rel="nofollow" target="_blank" href="http://aws.amazon.com/ec2/pricing/">Amazon EC2 pricing page</a>.</p>
<p><strong>IMPORTANT</strong>: If you are new to Amazon EC2, be sure to check out the Free Tier.  Free is always better than discounted pricing!  The free tier gives you a year of micro instance usage, 30GB of space, 15GB of bandwidth and more.   See the <a rel="nofollow" target="_blank" href="http://aws.amazon.com/ec2/pricing/">Amazon EC2 pricing page</a> for more details.</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F06%2F04%2Fec2-reserved-pricing-advantages%2F&amp;title=Amazon%20EC2%20user%3F%20%20Don%E2%80%99t%20ignore%20reserved%20instances." id="wpa2a_28"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Find UI/UX Designers on Behance</title>
         <link>https://gregsramblings.com/2013/04/21/find-uiux-designers-on-behance/</link>
         <description>Behance is described on http://www.behance.net/about as &amp;#8220;The leading online platform to showcase &amp;#38; discover creative work. The creative world updates their work in one place to broadcast it widely and efficiently. Companies explore the work and access talent on a global scale.&amp;#8220;. Of course, you&amp;#8217;ll find amazing work in graphic design, architecture, photography, illustration, etc., but what [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3826</guid>
         <pubDate>Mon, 22 Apr 2013 03:24:47 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://behance.net">Behance</a> is described on <a rel="nofollow" target="_blank" href="http://www.behance.net/about">http://www.behance.net/about</a> as &#8220;<em>The leading online platform to showcase &amp; discover creative work. The creative world updates their work in one place to broadcast it widely and efficiently. Companies explore the work and access talent on a global scale.</em>&#8220;.</p>
<p>Of course, you&#8217;ll find amazing work in graphic design, architecture, photography, illustration, etc., but what you may not know is that Behance is a great place to find really good UI/UX designers too.</p>
<p>Check out some of the portfolios in the UI/UX category &#8212; <a rel="nofollow" target="_blank" href="http://www.behance.net/search?field=132">http://www.behance.net/search?field=132</a> &#8212;</p>
<p><a rel="nofollow" target="_blank" href="http://www.behance.net/search?field=132"><img class="alignnone size-full wp-image-3830" alt="UI/UX Designers on Behance" src="http://gregsramblings.com/wp-content/uploads/2013/04/Online-Portfolios-on-Behance2.jpg" width="700" height="2699"/></a></p>
<p>&nbsp;</p>
<p>The community of Behance users is huge and growing.  Check out these stats &#8212; <a rel="nofollow" target="_blank" href="http://www.behance.net/facts">http://www.behance.net/facts</a></p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F21%2Ffind-uiux-designers-on-behance%2F&amp;title=Find%20UI%2FUX%20Designers%20on%20Behance" id="wpa2a_30"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Fantastic Sneak peek at Photoshop Camera Shake Reduction</title>
         <link>https://gregsramblings.com/2013/04/18/sneak-peek-at-photoshop-camera-shake-reduction/</link>
         <description>Watch the following video now. It&amp;#8217;s only 45 seconds long. Yes, it&amp;#8217;s real and it&amp;#8217;s killer. You&amp;#8217;re coming to Adobe MAX to see more exciting developments, right? This MAX is a MUST. Use discount code MXSM13 to save $300.</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3814</guid>
         <pubDate>Thu, 18 Apr 2013 04:46:10 +0000</pubDate>
         <content:encoded><![CDATA[<p>Watch the following video now.  It&#8217;s only 45 seconds long.  Yes, it&#8217;s real and it&#8217;s killer.  You&#8217;re coming to <a rel="nofollow" target="_blank" href="http://max.adobe.com/">Adobe MAX</a> to see more exciting developments, right?  This MAX is a MUST.  Use discount code <strong><a rel="nofollow" target="_blank" href="https://www.adobe-max.com/portal/newreg.ww?scid=social7049754">MXSM13</a></strong> to save $300.</p>
<p></p> 
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F18%2Fsneak-peek-at-photoshop-camera-shake-reduction%2F&amp;title=Fantastic%20Sneak%20peek%20at%20Photoshop%20Camera%20Shake%20Reduction" id="wpa2a_32"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Adobe Marketing Cloud Videos approaching 2 million views</title>
         <link>https://gregsramblings.com/2013/04/16/adobe-marketing-cloud-videos-approaching-2-million-views/</link>
         <description>One of the best enterprise marketing campaigns I&amp;#8217;ve ever seen. Funny AND True! Learn more about the Adobe Marketing Cloud. More videos on this and other topics can be found on Adobe&amp;#8217;s YouTube channel.</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3801</guid>
         <pubDate>Tue, 16 Apr 2013 20:44:56 +0000</pubDate>
         <content:encoded><![CDATA[<p>One of the best enterprise marketing campaigns I&#8217;ve ever seen. Funny AND True!  <a rel="nofollow" target="_blank" href="http://www.adobe.com/solutions/digital-marketing.html">Learn more about the Adobe Marketing Cloud</a>.  More videos on this and other topics can be found on <a rel="nofollow" target="_blank" href="http://www.youtube.com/user/AdobeSystems">Adobe&#8217;s YouTube channel</a>.</p>
<p></p> 
<p></p> 
<p></p> 
<p></p> 
<p></p> 
<p></p> 
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F16%2Fadobe-marketing-cloud-videos-approaching-2-million-views%2F&amp;title=Adobe%20Marketing%20Cloud%20Videos%20approaching%202%20million%20views" id="wpa2a_34"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Sony NEX-6 Review – my entry into mirrorless</title>
         <link>https://gregsramblings.com/2013/04/16/sony-nex-6-review/</link>
         <description>I&amp;#8217;ve been an active photographer for over 25 years both as a hobby and for hire.  During the past 9 years, I&amp;#8217;ve had a very active aerial photography business, Tiger Aerial Photography.  I&amp;#8217;ve always owned two types of cameras &amp;#8212; SLRs (recently the Nikon D70, D200, and D300) and compacts (recently the Panasonic DMC-LX3 and [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3750</guid>
         <pubDate>Tue, 16 Apr 2013 19:20:14 +0000</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve been an active photographer for over 25 years both as a hobby and for hire.  During the past 9 years, I&#8217;ve had a very active aerial photography business, <a rel="nofollow" target="_blank" href="http://tigeraerial.com">Tiger Aerial Photography</a>.  I&#8217;ve always owned two types of cameras &#8212; SLRs (recently the Nikon <a rel="nofollow" target="_blank" href="http://gregsramblings.com/2009/01/18/nikon-d70-rediscovering-my-first-digital-slr/">D70</a>, <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/nikond200">D200</a>, and <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/nikond300">D300</a>) and compacts (recently the Panasonic <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/panasonicdmclx3">DMC-LX3</a> and <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/q42010highendcompactgroup/">DMC-LX5</a>).  Both my Nikon D300 and Panasonic DMC-LX5 were starting to feel a little aged, so I&#8217;ve been looking to upgrade.  I&#8217;ve had my eye on the Nikon <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/nikon-d800-d800e">D800</a> and the Panasonic <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/panasonic-lumix-dmc-lx7/">DMC-LX7</a> as natural upgrades to both cameras.  I&#8217;ve also been occasionally looking at several mirrorless models from Nikon, Panasonic and others, but the features and reviews were always lacking.  I had concluded that the benefits of interchangeable lenses didn&#8217;t out weigh the lack of features and performance.<br />
<img class="alignright size-full wp-image-3772" alt="Sony NEX-6" src="http://gregsramblings.com/wp-content/uploads/2013/04/nex6-feature.png" width="250" height="176"/><br />
The <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/sony-alpha-nex-6">Sony NEX-6</a> is game changing for me.  There are many good reviews of this camera (see links below) so I&#8217;m not going to waste your time by simply replicating their long list of features.  I&#8217;ll just focus on the aspects that are important to me.</p>
<p>Here are the key features that sold me on the NEX-6:</p>
<ul>
<li><span style="line-height:13px;">It supports RAW and RAW+JPG (and allows me to switch back and forth with one button).  If I&#8217;m doing snapshots, I&#8217;ll shoot JPG.  However, if I need maximum dynamic range and quality, I&#8217;ll shoot RAW and use Adobe Lightroom and Adobe Camera Raw to perfect the images.  Every camera I&#8217;ve owned in the last 10 years has had this capability.</span></li>
<li>Like most modern compact cameras, the NEX-6 has sophisticated auto features but it also has aperture priority, shutter priority, and full manual.</li>
<li>Instant response when pressing the shutter button.</li>
<li>The interface doesn&#8217;t require me to go into the menus to make common setting changes (a show stopper for me with many cameras).  It has a simple mode-dial, and two dials I can turn with my thumb to change shutter speed and aperture.  Changing ISO is also very convenient.  There are also programmable buttons that allow me to put other setting changes a button press away.</li>
<li>Fantastic low-light performance.  ISO 3200 on this camera is better than ISO 800 on my D300!  This is like a free lens upgrade in many ways!  The max ISO is 25,600 and it&#8217;s actually somewhat usable!</li>
<li>Really good 16MP resolution using a APS-C (23.5 x 15.6 mm) sensor.  That&#8217;s about the same size sensor as my D300 and a lot bigger than the Panasonic DMC-LX3/5/7 and most other smaller cameras.</li>
<li>Wi-Fi support &#8211; I can transfer images from the camera to my iPhone or iPad (or Android device) with no Wi-Fi network nearby.  The camera basically becomes a Wi-Fi hotspot that your mobile device can connect to, and with the help of a mobile app, download the images from the camera.  The camera also has the ability to push images to a computer if there is an available Wi-Fi network.  DPReview covers this in great detail <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/sony-alpha-nex-6/10">here</a>.  I honestly wasn&#8217;t looking for this feature, but I have to admit, it&#8217;s very useful.  NOTE: The NEX-7 doesn&#8217;t have this feature.</li>
<li>1080/60p HD movies &#8211; and they look fantastic.  Surprisingly, you can change the camera settings during the recording of the video.  I&#8217;ll post some samples later.  There are several good ones on YouTube already.</li>
</ul>
<p>The camera also has a ton of  bells and whistles that didn&#8217;t really play into my decision, but I do enjoy them &#8212; Auto HDR, Sweep Panorama (both horizontal and vertical sweeps), apps, and hand-held anti motion blur.</p>
<p>There were four unexpected features in the NEX-6 that surprised me:</p>
<ol>
<li><span style="line-height:13px;"><strong>Focus Peaking</strong> &#8211; The NEX-6 offers focus peaking which highlights the in-focus details of the image in yellow (or red or white &#8211; it&#8217;s customizable).  Sam Mallery has a great article that demonstrates this <a rel="nofollow" target="_blank" href="http://www.bhphotovideo.com/indepth/sony/news/new-sony-nex-6-compact-interchangeable-lens-digital-camera">here</a>.</span></li>
<li><strong>AEL Toggle</strong> &#8211; There is a AEL button on the back of the camera that works as you would expect &#8211; when you hold down the button, it locks the exposure until you let it go.  However, I discovered in the menus that you can turn this button into a toggle.  When set to toggle, you point the camera and press the AEL button and it will lock the exposure until you press it again.</li>
<li><strong>Customizable Settings</strong> &#8211; the NEX-6 allows you to customize several buttons on the camera.  I think Mike Hendron covers this really well <a rel="nofollow" target="_blank" href="http://sonyalphalab.com/2012/12/essential-settings-for-the-nex-6-make-it-work-the-way-you-do/">here</a> (along with details on his own customizations)</li>
<li><strong>Apps</strong> &#8211; I honesty snickered at the idea of &#8220;camera apps&#8221; when I first noticed this feature, but then I discovered that there are indeed some really cool apps for this camera.  An app basically adds new functionality to the camera.  You can see the entire list of available apps at <a rel="nofollow" target="_blank" href="https://www.playmemoriescameraapps.com">https://www.playmemoriescameraapps.com</a>.  Be sure to check out the <a rel="nofollow" target="_blank" href="https://www.playmemoriescameraapps.com/portal/usbdetail.php?eid=IS9104-NPIA09014_00-000003">Time-lapse app</a>!  Note: The NEX-7 doesn&#8217;t support apps.</li>
</ol>
<p><strong>Why not the <a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/sonynex7">NEX-7</a>?</strong>  I looked at the NEX-7 because it offers even higher resolution (24MP), but it&#8217;s lacking Wi-Fi capabilities and app support.  The NEX-6 also has higher ISO available.  There is a good comparison <a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-7">SnapSort</a>.</p>
<p>Another pleasant surprise is that Adobe Lightroom already has a lens profile for the 16-50mm lens that came with the camera:</p>
<div id="attachment_3782" style="width:256px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="http://www.adobe.com/products/photoshop-lightroom.html"><img class="size-full wp-image-3782 " alt="lightroom-dialog-sony-nex6" src="http://gregsramblings.com/wp-content/uploads/2013/04/lightroom-dialog-sony-nex6.jpg" width="246" height="271"/></a><p class="wp-caption-text">Lightrooom 4 Lens Correction Dialog</p></div>
<h3>Disappointments:</h3>
<p>I love this camera, but there are a few disappointments:</p>
<ul>
<li><span style="line-height:13px;">Auto-focus sometimes gets confused in low light and takes a second or two to lock-in.  Maybe I&#8217;m spoiled by the near-instant focusing of my D300, but I wish the NEX-6 was a little better.  It&#8217;s still better than most compact cameras, but not up to high-end SLR-levels just yet.</span></li>
<li>The battery life is a little disappointing.  It&#8217;s not terrible, but it&#8217;s not as good as my D300 or my DMC-LX5.</li>
<li>My D300 and DMC-LX5 each have a feature that allows me to specify the lowest acceptable shutter speed when the camera is set to full auto exposure.  I&#8217;m actually decent at shooting hand-held at 1/15th of a second with the 16-50mm lens, but the camera assumes that I need some ISO boost when the shutter goes below 1/60th of a second.  It&#8217;s not a big deal since I can quickly switch to manual mode but I&#8217;m hoping that a future firmware update will add this level of customization like many of my other cameras.</li>
<li>I find it almost impossible to stop a video recording without shaking the camera forcing me to cut out the final second of the video post-shoot.  It&#8217;s not a big deal, but I think the button should be a little easier to press.</li>
</ul>
<p>Despite these disappointments, I am very happy with the camera.  I&#8217;ll definitely take it on my next <a rel="nofollow" target="_blank" href="http://tigeraerial.com">Aerial Photography assignment</a>, but my D300 will be nearby just in case!  There&#8217;s a huge difference between taking a few photos around the house and shooting from 1500 feet while moving at 120MPH!  I suspect the NEX-6 will work out.</p>
<h3>Other Reviews and Info</h3>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.dpreview.com/reviews/sony-alpha-nex-6">DPReview.com&#8217;s review of the NEX-6</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.docs.sony.com/release/NEX6_brochure.pdf">Sony NEX-6 Brochure (PDF)</a></li>
<li><a rel="nofollow" target="_blank" href="http://store.sony.com/webapp/wcs/stores/servlet/CategoryDisplay?storeId=10151&amp;langId=-1&amp;catalogId=10551&amp;Ntx&amp;N=4294938986&amp;Nao&amp;No&amp;rpp=60&amp;Ns=Prod.isNewProduct%7C1&amp;Nf&amp;minPrice&amp;maxPrice&amp;navigation&amp;categoryId=8198552921644718503">List of all Sony brand e-mount lenses (all work NEX-6)</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.dpreview.com/forums/1042">DPReview.com&#8217;s Sony NEX forum</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.cameralabs.com/reviews/Sony_Alpha_NEX_6/">Camera Labs Review</a></li>
<li><a rel="nofollow" target="_blank" href="http://store.sony.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&amp;storeId=10151&amp;langId=-1&amp;categoryId=8198552921644884016">Sony&#8217;s home page for the NEX-6</a></li>
<li><a rel="nofollow" target="_blank" href="http://sonyalphalab.com/2012/12/essential-settings-for-the-nex-6-make-it-work-the-way-you-do/">Great article on customizing the NEX-6</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Nikon-1-V2-vs-Sony-Alpha-NEX-6">Comparison of the NEX-6 with the Nikon 1 V2</a> (if you are a Nikon fan like me, this might hurt a bit)</li>
<li><a rel="nofollow" target="_blank" href="https://www.facebook.com/Nex6TipsAndTricks">NEX-6 Tips and Tricks page on Facebook</a> (my own creation so go LIKE it!)</li>
<li><a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B0096W1OKS/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0096W1OKS&amp;linkCode=as2&amp;tag=gregsramb-20">Amazon.com&#8217;s page for the NEX-6</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/explore/best-mirrorless/24-months-recent">Other recent mirrorless camera options</a></li>
</ul>
<h3>Comparing it to other Sony NEX models (<a rel="nofollow">snapsort.com</a>)</h3>
<ul>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-5N"><span style="line-height:13px;">NEX-6 vs NEX-5N</span></a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-5R">NEX-6 vs NEX-5R</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-7">NEX-6 vs NEX-7</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-7n">NEX-6 vs NEX-7N</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony_Alpha_NEX-3">NEX-6 vs NEX-3</a></li>
<li><a rel="nofollow" target="_blank" href="http://snapsort.com/compare/Sony-Alpha-NEX-6-vs-Sony-NEX-C3">NEX-6 vs C3</a></li>
</ul>
<h3>Using my Nikon Lenses (lens adapter)</h3>
<p>I have several Nikon/Nikkor lenses, including a <a rel="nofollow" target="_blank" href="http://www.dpreview.com/lensreviews/nikon_50_1p4_n15">50mm f1.4</a>, <a rel="nofollow" target="_blank" href="http://www.dpreview.com/lensreviews/tamron_18-270_3p5-6p3_vc_n15">Tamron 18-270mm</a> and various others.  After some research, I found that there are several choices of adpaters that allow you to use your Nikon lenses on the NEX-6.  I purchased <a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B003Y2YE3A/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B003Y2YE3A&amp;linkCode=as2&amp;tag=gregsramb-20">this one</a> and so far, it seems to work really well.  I&#8217;ll do a separate blog post on the specifics soon.  There is a catch to this type of adapter however &#8212; you have to manually focus and manually control the aperture, but that&#8217;s no big deal, especially with the NEX-6&#8217;s focus peaking feature.</p>
<h3>Summary</h3>
<p>This camera could easily become my walk-around camera and also my pro camera for many types of assignments.  It&#8217;s awesome to have a camera with this many features fit into my computer bag.  I&#8217;m still in the honeymoon phase, so I&#8217;ll let you know how I feel about it in a few weeks. <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="&#x00d83d;&#x00de09;" class="wp-smiley" style="height:1em;max-height:1em;"/></p>
<h3>Sample Photos</h3>
<p>I have only had the camera for 4 days, so I haven&#8217;t had a lot of time to experiment but I do have a handful of shots to give you an idea.  If you click on any of the following photos, you will go to a larger version where you can view the original image and see the camera EXIF data.  I&#8217;ll do a followup blog post after the honeymoon period and will include many more pictures and some videos.  In the meantime, the reviews above have tons of sample images.  You can find good NEX-6 video samples on YouTube.</p>
<div style="width:610px;" class="wp-caption alignnone"><a rel="nofollow" target="_blank" href="http://gallery.tigeraerial.com/Pets/Wilson-Dog-Pack-2013-04/28927828_TJdvrJ#!i=2458592108&amp;k=6FQG5xT&amp;lb=1&amp;s=X3"><img class=" " alt="" src="http://gallery.tigeraerial.com/photos/i-6FQG5xT/0/M/i-6FQG5xT-M.jpg" width="600" height="399"/></a><p class="wp-caption-text">55-200mm lens, manual exposure, ISO 400, 1/125th at f7.1</p></div>
<div style="width:610px;" class="wp-caption alignnone"><a rel="nofollow" target="_blank" href="http://gallery.tigeraerial.com/Pets/Wilson-Dog-Pack-2013-04/28927828_TJdvrJ#!i=2458591963&amp;k=vffmBQ4&amp;lb=1&amp;s=X3"><img class=" " alt="" src="http://gallery.tigeraerial.com/photos/i-vffmBQ4/0/M/i-vffmBQ4-M.jpg" width="600" height="399"/></a><p class="wp-caption-text">55-200mm lens, manual exposure, ISO 400, 1/160th at f7.1</p></div>
<div style="width:610px;" class="wp-caption alignnone"><a rel="nofollow" target="_blank" href="http://gallery.tigeraerial.com/Pets/Wilson-Dog-Pack-2013-04/28927828_TJdvrJ#!i=2459861084&amp;k=WtJfCxS&amp;lb=1&amp;s=X3"><img alt="" src="http://gallery.tigeraerial.com/photos/i-WtJfCxS/0/M/i-WtJfCxS-M.jpg" width="600" height="399"/></a><p class="wp-caption-text">Full auto &#8211; untouched</p></div>
<div style="width:610px;" class="wp-caption alignnone"><a rel="nofollow" target="_blank" href="http://gallery.tigeraerial.com/Photography/SonyNEX6/Sony-NEX-6-Samples/28952189_44QS8C#!i=2461203918&amp;k=sXP67Vc&amp;lb=1&amp;s=X3"><img alt="" src="http://gallery.tigeraerial.com/photos/i-sXP67Vc/0/M/i-sXP67Vc-M.jpg" width="600" height="399"/></a><p class="wp-caption-text">Manual focus, Nikon mount Tamron 18-270mm lens with adapter</p></div>
<div style="width:610px;" class="wp-caption alignnone"><a rel="nofollow" target="_blank" href="http://gallery.tigeraerial.com/Pets/Wilson-Dog-Pack-2013-04/28927828_TJdvrJ#!i=2459696863&amp;k=V6jj2Bb&amp;lb=1&amp;s=X3"><img class=" " alt="" src="http://gallery.tigeraerial.com/photos/i-V6jj2Bb/0/M/i-V6jj2Bb-M.jpg" width="600" height="399"/></a><p class="wp-caption-text">ISO 3200! Click to see a larger version and original image.</p></div>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F16%2Fsony-nex-6-review%2F&amp;title=Sony%20NEX-6%20Review%20%E2%80%93%20my%20entry%20into%20mirrorless" id="wpa2a_36"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Keeping up with the Adobe Creative Cloud Evangelists</title>
         <link>https://gregsramblings.com/2013/04/02/keeping-up-with-the-adobe-creative-cloud-evangelists/</link>
         <description>As we approach Adobe MAX, it can become challenging to keep up with all of the Adobe news!  A couple of years ago, our team created something to help &amp;#8212; http://adobeevangelists.com (or RSS version) and now, we&amp;#8217;ve improved it. This blog is an aggregation of all of our blogs in chronological order.  When you click an [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3743</guid>
         <pubDate>Tue, 02 Apr 2013 16:17:50 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://adobeevangelists.com"><img class="alignright size-medium wp-image-3744" alt="adobeevangelistsblog-lg" src="http://gregsramblings.com/wp-content/uploads/2013/04/adobeevangelistsblog-lg-300x191.jpg" width="300" height="191"/></a>As we approach <a rel="nofollow" target="_blank" href="http://max.adobe.com">Adobe MAX</a>, it can become challenging to keep up with all of the Adobe news!  A couple of years ago, our team created something to help &#8212; <a rel="nofollow" target="_blank" href="http://adobeevangelists.com">http://adobeevangelists.com</a> (or <a rel="nofollow" target="_blank" href="http://adobeevangelists.com/feed">RSS version</a>) and now, we&#8217;ve improved it.</p>
<p>This blog is an aggregation of all of our blogs in chronological order.  When you click an individual article, you will go to the original source article  on the author&#8217;s blog.</p>
<p>You&#8217;ll also notice a combined Twitter feed that is from this <a rel="nofollow" target="_blank" href="https://twitter.com/gregsramblings/ccevangelists">Twitter list</a> (<a rel="nofollow" target="_blank" href="https://twitter.com/gregsramblings/ccevangelists/members">member list</a>)</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F02%2Fkeeping-up-with-the-adobe-creative-cloud-evangelists%2F&amp;title=Keeping%20up%20with%20the%20Adobe%20Creative%20Cloud%20Evangelists" id="wpa2a_38"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Creative Cloud Customer Video</title>
         <link>https://gregsramblings.com/2013/04/01/creative-cloud-customer-video/</link>
         <description>Recently, we added this video to the Adobe Creative Cloud Home Page but I thought it was worth republishing here. Yes, it&amp;#8217;s a polished, Adobe-created video, but it matches what I&amp;#8217;m hearing from similar customers as they learn about Creative Cloud and start using it. I&amp;#8217;ll be posting some of my own customer videos and [&amp;#8230;]</description>
         <guid isPermaLink="false">http://gregsramblings.com/?p=3734</guid>
         <pubDate>Mon, 01 Apr 2013 16:38:02 +0000</pubDate>
         <content:encoded><![CDATA[<p>Recently, we added this video to the <a rel="nofollow" target="_blank" href="http://www.adobe.com/products/creativecloud.html">Adobe Creative Cloud Home Page</a> but I thought it was worth republishing here. Yes, it&#8217;s a polished, Adobe-created video, but it matches what I&#8217;m hearing from similar customers as they learn about Creative Cloud and start using it. I&#8217;ll be posting some of my own customer videos and interviews shortly that will have less polish but will drill down on some specific features in Creative Cloud and how those features are used in the &#8220;real world&#8221;.</p>
<p><a rel="nofollow" class="a2a_dd a2a_target addtoany_share_save" target="_blank" href="https://www.addtoany.com/share_save#url=https%3A%2F%2Fgregsramblings.com%2F2013%2F04%2F01%2Fcreative-cloud-customer-video%2F&amp;title=Creative%20Cloud%20Customer%20Video" id="wpa2a_40"><img src="https://storage.googleapis.com/gcs.gregsramblings.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
      </item>
      <item>
         <title>Appliness: digital magazine</title>
         <link>http://www.riagora.com/2012/03/appliness-digital-magazine/</link>
         <description>Hi guys! I&amp;#8217;ve been working on a new project for several weeks. As my team is now extending its audience and its skills, we were looking for innovative ways to reach web application developers. To address the Flex community, our blogs and our events remain the best ways to deliver our messaging and get your [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=926</guid>
         <pubDate>Wed, 28 Mar 2012 13:19:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>Hi guys! I&#8217;ve been working on a new project for several weeks. As my team is now extending its audience and its skills, we were looking for innovative ways to reach web application developers. To address the Flex community, our blogs and our events remain the best ways to deliver our messaging and get your feedback. With HTML developers, it&#8217;s a different story. Adobe is not the only actor in the HTML world, that&#8217;s why we need to find innovative ways of communication. <strong><span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://www.appliness.com"><span style="color:#3366ff;">Appliness</span></a></span></strong> is one of them. It&#8217;s a digital magazine, actually the first one created for web application developers. Available on iPad and Android tablets, Appliness contains technical tutorials, news, applications showcased, video tutorials, exclusive interviews and more.</p>
<p></p> 
<h3>Website and links</h3>
<p>Appliness is now alive and has its own dedicated website: <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://www.appliness.com"><span style="color:#3366ff;">http://www.appliness.com</span></a></span></p>
<p>If you have an iPad, you can download the magazine on the app store. It will appear in the Newsstand application: <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://itunes.apple.com/au/app/appliness/id510636049"><span style="color:#3366ff;">http://itunes.apple.com/au/app/appliness/id510636049</span></a></span></p>
<p>If you have an Android tablet, Appliness is available as a standalone application on Google Play. <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="https://play.google.com/store/apps/details?id=com.appliness.applinessAndroid"><span style="color:#3366ff;">https://play.google.com/store/apps/details?id=com.appliness.applinessAndroid</span></a></span></p>
<p>I&#8217;m currently working with Amazon to put it on the Amazon Appstore.</p>
<h3>Digital Publishing Suite</h3>
<p>To create this magazine, I used<span style="color:#3366ff;"> <a rel="nofollow" target="_blank" href="http://www.adobe.com/products/digital-publishing-suite-family.html"><span style="color:#3366ff;">Adobe Digital Publishing Suite</span></a></span> (DPS). First, I had to install and learn how to use InDesign CS5.5. I was happily surprised by the number of video tutorials available on the web. DPS adds some components and features to InDesign to create digital magazines. The extensions are free and you can create and test a magazine for free on your tablet. Basically, you create static articles and then you add interactive parts. At any time you can save and upload your work on acrobat.com. The free application &#8220;Adobe Content Viewer&#8221; available on the app store and on the android market lets you test your work on your tablet.</p>
<h3>Add interactive content with DPS</h3>
<p>The first panel with DPS installed is called &#8220;Overlay creator&#8221;. It&#8217;s a list of interactive components: slideshow, image sequence, Video, Panorama, Pan &amp; Zoom and Web content. The last one was the most interesting for Appliness. It lets you load HTML content in a page. That&#8217;s why in some technical tutorials, you&#8217;ll find the source code of a sample and its execution right next to it. It&#8217;s an instant preview of HTML and JS code! You can even make it interactive so that the reader plays with your HTML samples. It&#8217;s a great way to share tutorials and learn new development tricks. DPS stores your HTML samples in a HTMLresources folder. You can update its content uploading a HTMLresources.zip file. The files will be embedded in your magazine and rendered even if the user if offline. Otherwise you can chose to execute remote HTML files hosted on your own server.</p>
<h3>Organize your folio</h3>
<p>The other panel that comes with DPS in InDesign is the &#8220;Folio Builder&#8221;. A folio is an issue of your magazine. It consists in a list of articles <em>(InDesign files)</em>. Every time you modify the ordering of your articles and their metadata, the changes are synced on acrobat.com. By the way, a hosted version of the folio builder exists and it&#8217;s a fantastic Flex app. Once you sign-in on <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://digitalpublishing.acrobat.com"><span style="color:#3366ff;">digitalpublishing.acrobat.com</span></a>,</span> you can access this app and order your articles, enter the descriptions, etc&#8230;</p>
<h3>Create a native viewer</h3>
<p>A viewer is a native application that you can customize <em>(splash screen, icons&#8230;)</em> and that will consume your folios published on acrobat.com. The Viewer Builder application is a desktop AIR app that lets you create a viewer for iPad or Android tablets. Basically, it&#8217;s a wizard to upload the icons of your application, the splash screen, the certificates&#8230; At the end of the process, this AIR application sends information to acrobat.com that will return an .ipa or an .apk file. You have the choice between several kinds of viewer applications: the single edition <em>(one viewer per folio)</em>, the multi-folio, the multi-folio with subscriptions&#8230; You have a lot of options too: enable push notifications, in-app purchase, presence in the Apple Newsstand application.</p>
<h3>Contribute</h3>
<p>I&#8217;ve also launched a dedicated website: <strong><span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://www.appliness.com"><span style="color:#3366ff;">http://www.appliness.com</span></a>.</span></strong> This magazine for developers and is edited by passionate developers and bloggers. That&#8217;s why it would be great to get your feedback. If you want to contribute, publish a tutorial or showcase your application, use the <span style="color:#3366ff;"><strong><a rel="nofollow" target="_blank" href="http://appliness.com/give-us-feedback/"><span style="color:#3366ff;">feedback form</span></a></strong></span> on appliness.com.</p>
<p>&nbsp;</p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2012/03/appliness-digital-magazine/&text=Appliness%3A+digital+magazine&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Apache Flex and the community</title>
         <link>http://www.riagora.com/2012/01/apache-flex-and-the-community/</link>
         <description>Flex is now an Apache project in incubation (as PhoneGap under the name &amp;#8216;Cordova&amp;#8217;). The community is hyper-active and it&amp;#8217;s not a surprise. If you look at what the community has achieved around Flex since its creation, you&amp;#8217;ll directly understand why Apache Flex will be successful. Macromedia, and then Adobe, defined Flex&amp;#8217;s vision, launching and [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=921</guid>
         <pubDate>Mon, 23 Jan 2012 15:18:45 +0000</pubDate>
         <content:encoded><![CDATA[<p>Flex is now an Apache project in incubation <em>(as PhoneGap under the name &#8216;Cordova&#8217;)</em>. The community is hyper-active and it&#8217;s not a surprise. If you look at what the community has achieved around Flex since its creation, you&#8217;ll directly understand why Apache Flex will be successful. Macromedia, and then Adobe, defined Flex&#8217;s vision, launching and promoting the concept of Rich Internet Applications. Basically, this trend promotes the development of &#8220;software-like&#8221; interfaces in web browsers. RIA can answer large organizations needs who want to migrate legacy client-server applications to a modern web architecture. That&#8217;s why the Flex community is so unique and developed very specific and valuable skills. In my opinion, the only serious competitor on that market is/was Microsoft with SilverLight: great technology combined with a huge community of software developers (VB, .Net, C++&#8230;). They even introduced the concept <em>(or the utopia)</em> or a seamless workflow between designers and developers with Blend. I guess that this healthy competition boosted the Spark architecture in Flex 4 <em>(and the birth of Flash Catalyst)</em>. JavaFX by Sun <em>(and then Oracle)</em> is also trying to embrace this market.</p>
<p>But today, the Flex community is by far the strongest one on the RIA market and it&#8217;s not only due to Adobe. Flex is still the first-choice to build RIA because it&#8217;s consistent and because&#8230; it works. You should all read <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="https://plus.google.com/109047477151984864676/posts/CVGJKLMMehs"><span style="color:#3366ff;">this fantastic article by Joao</span></a></span> <em>(RIA expert in Portugal)</em>. It&#8217;s also due to the fact that a lot of Flex developers were coming from various technical backgrounds: Java (mainly), PHP, AS3, .NET&#8230; And they tried to bring and translate their knowledge investing in areas not covered by Adobe&#8217;s engineers: data-visualization, backend integration, continuous integration, micro-architectures&#8230; As a tribute, I just wanted to summarize on one graph <em>(inspired by Michell Zappa)</em> some compelling projects developed by the community around Flex. All these projects are used by large organizations in strategic Enterprise applications. All these talents can now become official Flex contributors thanks to the Apache foundation. Flex is successful thanks to this constellation of talents, not thanks to Adobe.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2012/01/flexCommunity.png"><img class="alignnone  wp-image-923" title="flexCommunity" src="http://www.riagora.com/wp-content/uploads/2012/01/flexCommunity.png" alt="" width="570"/></a></p>
<p>Some projects are of course missing, I&#8217;m sorry for that, it&#8217;s not an exhaustive list; but this graph expresses all the efforts made by the community to make Flex a successful framework in a professional Enterprise environment. Just a few projects, such as BlazeDS, were initiated by Adobe on this map. Flex has been successful in the past thanks to the involvement of its vibrant community of talented developers&#8230; why would it change?  If you want to follow the Apache Flex project and get involved, check this page: <a rel="nofollow" target="_blank" href="http://incubator.apache.org/flex/">http://incubator.apache.org/flex/</a></p>
<p><em>Thanks to all the folks who helped me build this list on Google Docs.</em></p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2012/01/apache-flex-and-the-community/&text=Apache+Flex+and+the+community&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Flex mobile and music apps</title>
         <link>http://www.riagora.com/2012/01/flex-mobile-and-music-apps/</link>
         <description>Flash (and then Flex) has always been the first choice technology for streaming audio content. I had the chance to work on a very cool mobile application for Radio X-Track. In this article, I&amp;#8217;ll showcase this mobile app and share with you some tips on developping this type of application. As I was developing the [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=906</guid>
         <pubDate>Thu, 19 Jan 2012 13:34:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>Flash <em>(and then Flex)</em> has always been the first choice technology for streaming audio content. I had the chance to work on a very cool mobile application for Radio X-Track. In this article, I&#8217;ll showcase this mobile app and share with you some tips on developping this type of application. As I was developing the Radio X-Track mobile apps, <a rel="nofollow" target="_blank" href="http://www.ckti.com/">Christophe Keromen</a> presented to me another Flex mobile app developed for Mioozic, which I&#8217;ll also cover in this article. Lastly, I&#8217;ll end by presenting a very cool Flex mobile app named &#8220;What&#8217;s that track?&#8221;, a multiplayer music quiz game.</p>
<h2>Radio X-Track</h2>
<h3>UI considerations</h3>
<p>Radio X-Track is a great project led by true music lovers. DJs, painters, actresses and sound designers work together to publish creative playlists of music, covering various styles and  stimulating your eyes with massive paintings. The web radio is also a place for networking with music lovers. Once logged-in with your Facebook account, you can start chatting directly on the website. This arty space is directed by X-Track, a famous sound design studio in France. You can visit the web radio here: <a rel="nofollow" target="_blank" href="http://radio.x-track.net/EN/">http://radio.x-track.net/EN/</a></p>
<p>The development of the mobile application was challenging as the web radio is a Flash application connected to FMS. Thanks to the recent updates of Adobe AIR, I&#8217;ve been able to use Flex to stream the playlists on smartphones and tablets. First, I&#8217;ve decided to use <a rel="nofollow" target="_blank" href="http://www.riagora.com/2011/06/adaptive-ui-mobile-vs-tablet/">my adaptive layout technique</a> to code one UI and target both mobile and tablet screens. Here is a video that explains the trick. I&#8217;m playing with two view navigators that dynamically adapt their dimensions and their coordinates at runtime, depending on the screen resolution and the screen orientation.</p>
<p></p> 
<p>That&#8217;s why on Android, you have a very simple user experience. The first view is the list of DJs, the second view displays a scrollable picture, streams the playlist and displays the title of the song.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2012/01/androidRadioXtrack.jpg"><img class="alignnone size-full wp-image-910" title="androidRadioXtrack" src="http://www.riagora.com/wp-content/uploads/2012/01/androidRadioXtrack.jpg" alt="" width="570" height="259"/></a></p>
<p><em><strong>Here is the link to the Android application:</strong></em></p>
<p><a rel="nofollow" target="_blank" href="https://market.android.com/details?id=air.com.riagora.Xtrack">https://market.android.com/details?id=air.com.riagora.Xtrack</a></p>
<p>With Flex, you code one project and then can publish it on both Android and iOS. So I submitted this application to Apple.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2012/01/iphoneRadioXtrac.jpg"><img class="alignleft size-full wp-image-911" title="iphoneRadioXtrack" src="http://www.riagora.com/wp-content/uploads/2012/01/iphoneRadioXtrac.jpg" alt="" width="257" height="300"/></a>The App Store reviewers rejected the initial application for UI reasons. They told me that displaying a list and then a view could be done in the browser, and that it doesn&#8217;t justify the development of an application. They wanted me to develop the application using HTML5&#8230; well&#8230; live audio&#8230; html5&#8230; I had to consider a new strategy and worked on a totally different UI. I started studying the UI patterns of approved radio application and ended up with a new user experience. I&#8217;ve also added some features such as a twitter feed and the biographies of the artists. The application has been directly approved by Apple and is now available for iPhone and iPad users.</p>
<p><em><strong>Here is the link to the iOS application:</strong></em></p>
<p><a rel="nofollow" target="_blank" href="http://itunes.apple.com/fr/app/radio-x-track/id467964868?mt=8">http://itunes.apple.com/fr/app/radio-x-track/id467964868?mt=8</a></p>
<p>&nbsp;</p>
<h3>Some technical tips to manage audio content</h3>
<p>As the music is streamed by FMS, you can use the classic NetConnection and NetStream object of the Flash API. When the user wants to hear another playlist, I kill the current NetStream object and create a new one<em> (I keep in memory the NetConnection instance)</em>. FMS fires a RTMP message every time a new song is streamed. The client catches the message and displays the title of the song on the screen. The main challenge was to mimic the behavior of the iPod. If you shutdown the screen of your iPhone, or if you switch to another application, the radio is still supposed to stream audio. AIR 3 introduced a new feature to enable this behavior. At the end of the application descriptor of your Flex mobile application, you have a dedicated section for iPhone settings. You can set iOS keys such as <strong>UIApplicationExistsOnSuspend</strong>. All the iOS settings for Adobe AIR are <a rel="nofollow" target="_blank" href="http://help.adobe.com/en_US/air/build/WSfffb011ac560372f7e64a7f12cd2dd1867-8000.html">listed on this page</a>. In this case, I&#8217;m setting the UIBackgroundModes key to audio.</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_1" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_1" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display:block;"><pre class="xml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;iPhone<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;InfoAdditions<span class="re2">&gt;</span></span></span><span class="sc2">&lt;![CDATA[</span>
<span class="sc2">			&lt;key&gt;UIDeviceFamily&lt;/key&gt;</span>
<span class="sc2">			&lt;array&gt;</span>
<span class="sc2">				&lt;string&gt;1&lt;/string&gt;</span>
&nbsp;
<span class="sc2">			&lt;/array&gt;</span>
<span class="sc2">			&lt;key&gt;UIBackgroundModes&lt;/key&gt;</span>
<span class="sc2">			&lt;array&gt;</span>
<span class="sc2">				&lt;string&gt;audio&lt;/string&gt;</span>
<span class="sc2">			&lt;/array&gt;</span>
<span class="sc2">		]]&gt;</span><span class="sc3"><span class="re1">&lt;/InfoAdditions<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;requestedDisplayResolution<span class="re2">&gt;</span></span></span>high<span class="sc3"><span class="re1">&lt;/requestedDisplayResolution<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/iPhone<span class="re2">&gt;</span></span></span></pre></div></div>
<p>Unfortunately, it won&#8217;t display the &#8220;play&#8221; icon in the status bar of iOS. I guess it would require the development of a native extension. Radio X-Track is a free application. Enjoy !</p>
<h2>Mioozic</h2>
<p>Mioozic is also a Flex mobile application available on both Android and iOS. You start by choosing a theme or a category, and it will start streaming music on your device. This Flex application has been developed by Samir Moussouni (<a rel="nofollow" target="_blank" href="http://www.tezqa.com/">www.tezqa.com</a>). It&#8217;s a great example of a high-performance Flex application running on smartphones.</p>
<p style="text-align:center;"><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2012/01/mioozic.jpg"><img class="size-full wp-image-913 aligncenter" title="mioozic" src="http://www.riagora.com/wp-content/uploads/2012/01/mioozic.jpg" alt="" width="530" height="300"/></a></p>
<p>Mioozic on Android : <a rel="nofollow" target="_blank" href="https://market.android.com/details?id=air.netrix.air.mioozic">https://market.android.com/details?id=air.netrix.air.mioozic</a></p>
<p>Mioozix on the app store: <a rel="nofollow" target="_blank" href="http://itunes.apple.com/fr/app/mioozic/id479503574?mt=8">http://itunes.apple.com/fr/app/mioozic/id479503574?mt=8</a></p>
<h2>What&#8217;s that track</h2>
<p>This game developed by Orange Labs and Deezer is also a very cool Flex mobile application. It&#8217;s a quiz game. You can play alone or with friends. The goal is very basic: hear a song, tap the screen if you think that you know the artist, and select the correct artist in a list of four. It&#8217;s a very cool game with a nice 70s UI. It&#8217;s already a popular app on Android (only). Have fun.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2012/01/android-mioozic.jpg"><img class="alignnone size-full wp-image-915" title="android-mioozic" src="http://www.riagora.com/wp-content/uploads/2012/01/android-mioozic.jpg" alt="" width="530" height="300"/></a></p>
<p>What&#8217;s that track on Android: <a rel="nofollow" target="_blank" href="https://market.android.com/details?id=air.com.orange.labs.whatsthattrack&amp;hl=fr">https://market.android.com/details?id=air.com.orange.labs.whatsthattrack&amp;hl=fr</a></p>
<p>&nbsp;</p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2012/01/flex-mobile-and-music-apps/&text=Flex+mobile+and+music+apps&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>GradleFx automated builds</title>
         <link>http://www.riagora.com/2011/12/gradlefx-automated-builds/</link>
         <description>I&amp;#8217;ve just attended the Flex summit, a great event with 40 members of the Flex community. It was the opportunity to brainstorm about future contributions and it went very well. Some members of the community already posted great articles about what have been said. You can read this remarkable article by Adam Flater, another one by [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=898</guid>
         <pubDate>Fri, 16 Dec 2011 01:02:43 +0000</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve just attended the <span style="color:#0000ff;"><strong><a rel="nofollow" target="_blank" href="http://www.spoon.as/category/announcements/"><span style="color:#0000ff;">Flex summit</span></a></strong></span>, a great event with 40 members of the Flex community. It was the opportunity to brainstorm about future contributions and it went very well. Some members of the community already posted great articles about what have been said. You can read this <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://www.adamflater.net/2011/12/14/apache-flex-beginning/"><span style="color:#0000ff;">remarkable article</span></a></span> by Adam Flater, <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://www.peterelst.com/blog/2011/12/13/flex-summit-updates-on-the-open-source-strategy-and-runtimes/"><span style="color:#0000ff;">another one by Peter Elst</span></a></span>  and some <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://blog.nerdradio.com/tagged/Flex-Community-Summit"><span style="color:#0000ff;">great interviews on Nerd Radio</span></a></span>. I&#8217;m very confident in the future of Flex because of the level of maturity of our community, and also because it&#8217;s a passionate one. To showcase this excitement, I&#8217;m working on a graph that will express all the work already done by the community. I&#8217;m currently listing several major community projects in a Google Doc. If you want to review this document and add comments, <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="https://docs.google.com/document/d/1V8kP5eT22oK2Jwd2Zrn_vmcJ5MIoRB6vcxj-kfLSfnk/edit"><span style="color:#0000ff;">feel free to review this document</span></a></span>.</p>
<p><strong>We are looking for committers!!!</strong> If you want to participate in the success of Apache Flex, <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://blogs.adobe.com/flex/2011/12/call-for-committers.html"><span style="color:#0000ff;">check this blog post</span></a></span>. Yennick is one of these talented Flex developers who could become Apache Flex committers. He&#8217;s the project leader of GradleFx. I met him in Belgium during the Devoxx conference and he has been kind enough to accept an interview.</p>
<p><strong>&#8220;Hi Yennick, can you introduce yourself, your background and your relationship with Flex:&#8221;</strong></p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/12/2011new-058.jpeg"><img class="size-thumbnail wp-image-901 alignleft" style="border-color:initial;border-width:0px;margin:5px;" title="2011new-058" src="http://www.riagora.com/wp-content/uploads/2011/12/2011new-058-150x150.jpg" alt="" width="150" height="150"/></a>Hi, my name is Yennick Trevels and together with Steven Dick I started the GradleFx plugin. I work as a RIA Consultant at iDA MediaFoundry in Belgium where I do most of my projects in Java and Flex <em>(desktop, web, mobile, &#8230;)</em>.</p>
<p>I started out as a Java developer for 3 years, but soon found out that I wanted to focus on frontend development and that&#8217;s how I got started with Flex. Flex has been somewhat of a passion for me now because it allows me to create good looking applications with lots of custom components and there are still a lot of oppertunities to create libraries which make our lives easier.</p>
<p><strong>&#8220;GradleFx is a Gradle plugin. Can you explain us what Gradle is and who is using it today?&#8221;</strong></p>
<p>Gradle is a new build tool which combines the best features of Ant and Maven and leaves the bad things behind. It has dependency management, convention-over-configuration, multi-project support and lot&#8217;s of other cool features. Build scripts are written in Groovy where you have access to the Gradle API, which gives your build scripts a lot of flexibility.</p>
<p>Lots of plugins are already available for Gradle, like the Java plugin, Maven plugin, Eclipse &amp; Intellij plugins, Sonar plugin etc. These plugins make your build scripts a lot easier because most of the time the only thing you have to do is configure some variables. So build script in Gradle are shorter/easier and more flexible than Maven or Ant build scripts.</p>
<p>GradleFx uses these same principles because it&#8217;s a plugin for Gradle.</p>
<p><strong>&#8220;Then I guess that GradleFx is just an extension for building Flex applications. How does it work and what do I need to make it run?&#8221;</strong></p>
<p>GradleFx is indeed a plugin to build Flex applications.</p>
<p>First you&#8217;ll need to install the Gradle and Flex SDK, add the Gradle bin directory to your PATH environment variable and create a FLEX_HOME environment variable which points to your Flex SDK. Once you have these setup you can start to write your build script (in a build.gradle file). You don&#8217;t have to manually download GradleFx because it&#8217;s available on the Maven Central repository, so just specify it as a dependency for your build script and apply the plugin, that&#8217;s it.</p>
<p><strong>&#8220;What are the features that the GradleFx plugin adds to Gradle.&#8221;</strong></p>
<p>Right now the plugin has tasks to compile SWC, SWF and AIR projects, clean the build directory, copy your resources to the build directory, create an html wrapper and run FlexUnit tests.</p>
<p><strong>&#8220;Automated builds are more and more strategic in our industry and most of the Flex projects are industrialized. In your opinion, what are the key differentiators of GradleFx compared to Ant or Maven for instance?&#8221;</strong></p>
<p>Because GradleFx uses convention-over-configuration and builds scripts are written in Groovy your average build script will be a lot shorter and easier to read.</p>
<p>Another big advantage is the flexibility that Groovy offers, if you need to perform some custom functionality that isn&#8217;t available yet in any plugin then it&#8217;s much easier to write this yourself compared to Ant or Maven. Simple tasks like copying some files can be added in just a few lines of code.</p>
<p>GradleFx can use Ivy or Maven repositories to get its dependencies so you don&#8217;t need a separate repository for your existing Maven or Ant based build scripts.</p>
<p><strong>&#8220;Can you share with us a sample to manage several project and comment the code?&#8221;</strong></p>
<p>Ok, I&#8217;ll show you an example of a multi-project build which uses all the conventions provided by GradleFx.</p>
<p>This is the build script of the parent project and these settings are used by all sub-projects. This project doesn&#8217;t compile to a SWC or SWF.</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_2" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_2" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display:block;"><pre class="groovy" style="font-family:monospace;"><span class="co1">//specify the GradleFx plugin as a dependency for this build script. Maven Central will be used to get it.</span>
buildscript <span class="br0">&#123;</span>
	repositories <span class="br0">&#123;</span>
		mavenCentral<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#125;</span>
	dependencies <span class="br0">&#123;</span>
		classpath group: <span class="st0">'org.gradlefx'</span>, name: <span class="st0">'gradlefx'</span>, version: <span class="st0">'0.3.2'</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//specify settings common to all subprojects</span>
subprojects <span class="br0">&#123;</span>
&nbsp;
	<span class="co1">//apply the GradleFx plugin to this project</span>
	apply plugin: <span class="st0">'gradlefx'</span>
&nbsp;
	version <span class="sy0">=</span> <span class="st0">'1.0-SNAPSHOT'</span>
&nbsp;
	<span class="co1">//define the repositories from which the project dependencies</span>
	<span class="co1">//should be downloaded</span>
    	repositories <span class="br0">&#123;</span>
        		mavenCentral<span class="br0">&#40;</span><span class="br0">&#41;</span>
        		mavenRepo name: <span class="st0">'yoolab-releases'</span>,      url: <span class="st0">&quot;http://projects.yoolab.org/maven/content/repositories/releases&quot;</span>
        		mavenRepo name: <span class="st0">'yoolab-snapshots'</span>,     url: <span class="st0">&quot;http://projects.yoolab.org/maven/content/repositories/snapshots&quot;</span>
    	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// specify the project dependencies. Notice the 'external' marker,</span>
	<span class="co1">// which means that the library will not be compiled in the</span>
	<span class="co1">// swc of the subprojects</span>
   	dependencies <span class="br0">&#123;</span>
        		external group: <span class="st0">'org.as3commons'</span>, name: <span class="st0">'as3commons-collections'</span>,
			version: <span class="st0">'1.1'</span>, ext: <span class="st0">'swc'</span>
        		external group: <span class="st0">'org.as3commons'</span>, name: <span class="st0">'as3commons-lang'</span>,
			version: <span class="st0">'0.3.2'</span>, ext: <span class="st0">'swc'</span>
    	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Then we have the build script of a library subproject which will compile to a SWC.</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_3" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_3" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display:block;"><pre class="groovy" style="font-family:monospace;"><span class="co1">//specify the type of flex project</span>
type <span class="sy0">=</span> <span class="st0">'swc'</span>
&nbsp;
dependencies <span class="br0">&#123;</span>
	<span class="co1">// specifies a dependency to another subproject. This will compile</span>
	<span class="co1">// the other project before compiling this one and use its</span>
	<span class="co1">// compiled SWC in this project.</span>
	external project<span class="br0">&#40;</span><span class="st0">':util'</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>And finally we have the build script of the application project which compiles to a SWF.</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_4" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_4" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display:block;"><pre class="groovy" style="font-family:monospace;"><span class="co1">//specify the type of flex project</span>
type <span class="sy0">=</span> <span class="st0">'swf'</span>
&nbsp;
dependencies <span class="br0">&#123;</span>
	<span class="co1">// specify two dependencies to library projects. These will be compiled</span>
	<span class="co1">// into the SWF file since they belong to the &quot;merged&quot; configuration.</span>
	merged project<span class="br0">&#40;</span><span class="st0">':util'</span><span class="br0">&#41;</span>
	merged project<span class="br0">&#40;</span><span class="st0">':domain'</span><span class="br0">&#41;</span>
&nbsp;
	<span class="co1">//override the dependencies specified in the parent project so they</span>
	<span class="co1">//use the &quot;merged&quot; configuration</span>
	merged group: <span class="st0">'org.as3commons'</span>, name: <span class="st0">'as3commons-collections'</span>,
		version: as3commons_collections_version, ext: <span class="st0">'swc'</span>
	merged group: <span class="st0">'org.as3commons'</span>, name: <span class="st0">'as3commons-lang'</span>,
		version: as3commons_lang_version, ext: <span class="st0">'swc'</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// add another source directory for the locale files. The srcDirs property is a</span>
<span class="co1">// GradleFx property which by default has the value ['src/main/actionscript']. This</span>
<span class="co1">// is the directory where you need to put your actionscript and mxml files.</span>
srcDirs.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">'src/main/locales/{locale}'</span><span class="br0">&#41;</span>
&nbsp;
additionalCompilerOptions <span class="sy0">=</span> <span class="br0">[</span>
		<span class="st0">'-locale=en_US'</span>
<span class="br0">]</span></pre></div></div>
<p>That&#8217;s it for this example. You can find more examples in our GradleFx examples repository: <a rel="nofollow" target="_blank" href="https://github.com/GradleFx/GradleFx-Examples">https://github.com/GradleFx/GradleFx-Examples</a></p>
<p><strong>&#8220;What are you working on and what will be the next features of GradleFx?&#8221;</strong></p>
<p>I just released version 0.4 which contains support for AIR projects.</p>
<p>Upcoming features are mobile projects support, project file generation for Eclipse and Intellij IDEA, automatic downloading of the Flex SDK and AS3Doc generation.</p>
<p><strong>&#8220;GradleFx is open-source. How can we contribute?&#8221;</strong></p>
<p>You can contribute in a number of ways.</p>
<p>One is by trying out the project and giving feedback on our support forum and/or log issues in our issue tracker on Github.  Or if you feel some documentation is missing, feel free to add it to our wiki on Github (or just tell us so we can add it). It&#8217;s the feedback that we get that also makes this project better and we always try to do something with it.</p>
<p>Another way is by forking the project on GitHub, add a feature or improve the code and apply a &#8220;pull request&#8221;. Then we can integrate those changes and put them in an official release.</p>
<p><strong>&#8220;How do we know when a new version of GradleFx is released?&#8221;</strong></p>
<p>You can follow me or Steven on twitter, this is where we announce all things related to GradleFx.<br />
Yennick: @SlevinBE<br />
Steven: @stevendick</p>
<p>Some useful links to get started:</p>
<ul>
<li>Site: <a rel="nofollow" target="_blank" href="http://gradlefx.github.com/">http://gradlefx.github.com/</a></li>
<li>Documentation: <a rel="nofollow" target="_blank" href="https://github.com/GradleFx/GradleFx/wiki">https://github.com/GradleFx/GradleFx/wiki</a></li>
<li>Examples: <a rel="nofollow" target="_blank" href="https://github.com/GradleFx/GradleFx-Examples">https://github.com/GradleFx/GradleFx-Examples</a></li>
<li>Help &amp; Support: <a rel="nofollow" target="_blank" href="http://gradlefx.tenderapp.com/home">http://gradlefx.tenderapp.com/home</a></li>
<li>Bug Tracking: <a rel="nofollow" target="_blank" href="https://github.com/GradleFx/GradleFx/issues">https://github.com/GradleFx/GradleFx/issues</a></li>
<li>Changelog: <a rel="nofollow" target="_blank" href="https://github.com/GradleFx/GradleFx/blob/master/CHANGELOG.textile">https://github.com/GradleFx/GradleFx/blob/master/CHANGELOG.textile</a></li>
</ul>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/12/gradlefx-automated-builds/&text=GradleFx+automated+builds&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>“Game of Flex” on tablets</title>
         <link>http://www.riagora.com/2011/12/game-of-flex-on-tablets/</link>
         <description>I&amp;#8217;m very happy to announce that &amp;#8220;Game of Flex&amp;#8221; is available for iPad and Android tablets users (it will be soon available for BlackBerry PlayBook users). Last week, we released Flex 4.6 with great additions to build cross-platform tablet applications. &amp;#8220;Game of Flex&amp;#8221; is a game built with Flex 4.6 and inspired by Tour de [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=881</guid>
         <pubDate>Wed, 07 Dec 2011 12:23:15 +0000</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;m very happy to announce that <strong>&#8220;Game of Flex&#8221;</strong> is available for iPad and Android tablets users <em>(it will be soon available for BlackBerry PlayBook users)</em>. Last week, we released Flex 4.6 with great additions to build cross-platform tablet applications. &#8220;Game of Flex&#8221; is a game built with Flex 4.6 and inspired by Tour de Mobile Flex. As you may know, Tour de Mobile Flex has never been available on the App Store. Let me tell you why: the application has been rejected by Apple because it&#8217;s a demo application which violates the developer guidelines. That&#8217;s why I had to find another way to showcase Flex on iOS devices using&#8230; a game! Gamification is so trendy that it worked! It has been directly approved by Apple. It&#8217;s actually a quiz with 16 questions, and it&#8217;s a real game, which means that if you correctly answer all the questions, you get a chance to win a copy of Flash Builder 4.6!!!</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/12/screenshotRiagora.png"><img class="aligncenter size-full wp-image-882" title="screenshotRiagora" src="http://www.riagora.com/wp-content/uploads/2011/12/screenshotRiagora.png" alt="" width="570" height="356"/></a></p>
<p>&#8220;Game of Flex&#8221; is not just a game, it&#8217;s also a great way for us to <strong>showcase the great performance of Flex</strong> on tablet devices, and for you to discover the new components and features of our latest release of Flex! Indeed, Game of Flex is also a learning tool. At anytime, you can click on the &#8220;Snippet&#8221; button and read the source code of the current sample. You can also click on &#8220;Tutorial&#8221; to read an online tutorial about the current sample.</p>
<h3>Download the game and the source code</h3>
<p><a rel="nofollow" target="_blank" href="https://market.android.com/details?id=air.com.riagora.flexgame"><img class="size-full wp-image-883 alignnone" style="border-color:initial;border-width:0px;margin:0px;" title="dlAndroid" src="http://www.riagora.com/wp-content/uploads/2011/12/dlAndroid.png" alt="" width="205" height="269"/></a><a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/game-of-flex/id483389384"><img class="alignnone size-full wp-image-884" style="border-color:initial;border-width:0px;margin:0px;" title="dlIpad" src="http://www.riagora.com/wp-content/uploads/2011/12/dlIpad.png" alt="" width="190" height="269"/></a><img class="alignnone size-full wp-image-885" style="border-color:initial;border-width:0px;margin:0px;" title="dlPlaybook" src="http://www.riagora.com/wp-content/uploads/2011/12/dlPlaybook.png" alt="" width="150"/></p>
<p>The direct links to the application are:</p>
<p><strong>Android tablets: </strong><a rel="nofollow" target="_blank" href="https://market.android.com/details?id=air.com.riagora.flexgame">https://market.android.com/details?id=air.com.riagora.flexgame<br />
</a><strong>iPad:</strong> <a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/game-of-flex/id483389384?ls=1&amp;mt=8">http://itunes.apple.com/us/app/game-of-flex/id483389384<br />
</a><strong>BlackBerry Playbook:</strong> soon</p>
<p>You can also download the source code of the application. Install Flash Builder 4.6 and import this Flash Builder Project (FXP file): <a rel="nofollow" target="_blank" href="http://riagora.com/pvt_content/flexgame/FlexGame-source.fxp">FLEXGAME.FXP</a></p>
<p>&nbsp;</p>
<h3>Some tips inside the code</h3>
<p>If you want to check the source code of the app, you&#8217;ll learn&#8230;:</p>
<ul>
<li>How to use the new SplitViewNavigator architecture (portrait and landscape layouts on tablet devices)</li>
<li>How to display HTML content inside a Flex app</li>
<li>How to access the camera to take pictures</li>
<li>How to use the BusyIndicator, ToggleSwitch and List components</li>
<li>How to enable multi-touch</li>
<li>How to manage your views</li>
<li>How to use the accelerometer</li>
<li>How to create custom AS3 item renderers for your lists</li>
<li>How to access the local SQLite database</li>
<li>How to use native extensions</li>
<li>How to set up the new DateSpinner component</li>
<li>How to display callout popups</li>
<li>How to set up the software keyboard to match your needs</li>
<li>How to declare spinner lists</li>
</ul>
<div>Have fun !!!</div>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/12/game-of-flex-on-tablets/&text=%E2%80%9CGame+of+Flex%E2%80%9D+on+tablets&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Flex 4.6 is out!</title>
         <link>http://www.riagora.com/2011/11/flex-4-6-is-out/</link>
         <description>The Flex 4.6 SDK is available for download here. If you are using Flash Builder 4.5, download and upgrade your IDE for free. You can download Flash Builder 4.6 here. Since Flex 4.5, you can develop desktop AND mobile applications with a native experience on iOS, Android and BlackBerry devices. Flex mobile applications aim to perform [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=872</guid>
         <pubDate>Wed, 30 Nov 2011 15:08:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>The Flex 4.6 SDK is available for <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=flexsdk"><span style="color:#0000ff;">download here</span></a></span>. If you are using Flash Builder 4.5, download and upgrade your IDE <strong>for free</strong>. You can <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder"><span style="color:#0000ff;">download Flash Builder 4.6 here</span></a></span>. Since Flex 4.5, you can develop desktop AND mobile applications with a native experience on iOS, Android and BlackBerry devices. Flex mobile applications aim to perform and look like native applications. The new features of Flex 4.6 will help you to achieve great performance and experience. If you take your existing Flex 4.5 mobile project and recompile it with Flex 4.6, you should feel great performance improvements, especially with scrolling lists and transitions between views. But the Flex SDK team also worked on new components. Here are the list of some new features available in Flex 4.6 and Flash Builder 4.6:</p>
<h2>New set of mobile components</h2>
<p>Tablet devices are incredibly successful. The Apple iPad introduced new ways to structure applications and new user interactions. The new set of components available in Flex 4.6 is inspired by classic tablet applications. As you&#8217;re targeting a larger screen than a smartphone, you need to review your UI navigation. I&#8217;ve already shared some thoughts on this in my <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://www.riagora.com/2011/06/adaptive-ui-mobile-vs-tablet/"><span style="color:#0000ff;">post named &#8220;Adaptive UI&#8221;</span></a></span>. Thanks to the new SplitViewNavigator, you can manage the layout of multiple views. The &#8216;Adaptive UI&#8217; is managed by the component and is based on the device orientation.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/11/adaptiveSplit.png"><img class="aligncenter size-full wp-image-873" title="adaptiveSplit" src="http://www.riagora.com/wp-content/uploads/2011/11/adaptiveSplit.png" alt="" width="550" height="302"/></a></p>
<p>How to use SpitViewNavigator:</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_5" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_5" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display:block;"><pre class="mxml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;s:SplitViewNavigator</span> width=<span class="st0">&quot;100%&quot;</span> height=<span class="st0">&quot;100%&quot;</span> id=<span class="st0">&quot;splitViewNavigator&quot;</span> autoHideFirstViewNavigator=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;s:ViewNavigator</span> id=<span class="st0">&quot;vnList&quot;</span> firstView=<span class="st0">&quot;views.ListQuestions&quot;</span> width=<span class="st0">&quot;300&quot;</span> height=<span class="st0">&quot;100%&quot;</span><span class="re2">/&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;s:ViewNavigator</span> id=<span class="st0">&quot;vnFull&quot;</span> firstView=<span class="st0">&quot;views.FullView&quot;</span> width=<span class="st0">&quot;100%&quot;</span> height=<span class="st0">&quot;100%&quot;</span><span class="re2">&gt;</span></span>
&nbsp;
			<span class="sc3"><span class="re1">&lt;s:actionContent</span>.portrait<span class="re2">&gt;</span></span>
				<span class="sc3"><span class="re1">&lt;s:Button</span> id=<span class="st0">&quot;navigatorButton&quot;</span>   label=<span class="st0">&quot;Show questions&quot;</span> click=<span class="st0">&quot;splitViewNavigator.showFirstViewNavigatorInPopUp(navigatorButton)&quot;</span> <span class="re2">/&gt;</span></span>	
			<span class="sc3"><span class="re1">&lt;/s:actionContent</span>.portrait<span class="re2">&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;/s:ViewNavigator</span><span class="re2">&gt;</span></span>
	<span class="sc3"><span class="re1">&lt;/s:SplitViewNavigator</span><span class="re2">&gt;</span></span></pre></div></div>
<p>More components are also available and directly inspired from iOS applications: the CallOutButton (popup related to a component), the SpinnerList, the ToggleSwitch and the famous DateSpinner.</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/11/compo.png"><img class="aligncenter size-full wp-image-874" title="compo" src="http://www.riagora.com/wp-content/uploads/2011/11/compo.png" alt="" width="550" height="175"/></a></p>
<h2>Soft keyboard parameters</h2>
<p>You can easily enhance the behavior of your soft keyboard. If you&#8217;re building a form, with a text input field that is waiting for a phone number, then you can modify the look of your mobile/tablet soft keyboard to display numbers only. You can also customize the label of the &#8220;return&#8221; key on the soft keyboard (and display &#8220;Join&#8221;, &#8220;Go&#8221; or &#8220;Search&#8221; for example). It&#8217;s a very nice feature <a rel="nofollow" target="_blank" href="http://devgirl.org/2011/11/29/flex-mobile-development-flex-4-6-cool-new-soft-keyboard-features-sample-w-source/">detailed by Holly in this post</a>.</p>
<p>You can set different values for the softKeyboardType property: number, email, punctuation, url, contact or default. For instance, to display numbers on the keyboard, just add a parameter to your TextInput component:</p>
<p><code> </code><code>&lt;</code><code>s:TextInput</code> <code>softKeyboardType</code><code>=</code><code>"number"</code> <code>width</code><code>=</code><code>"180"</code><code>/&gt;</code></p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/11/number-keyboard.png"><img class="aligncenter size-full wp-image-875" title="number-keyboard" src="http://www.riagora.com/wp-content/uploads/2011/11/number-keyboard.png" alt="" width="500" height="333"/></a></p>
<h2>AIR 3, native extensions and captive runtime</h2>
<p>Air 3.1 is attached to Flex 4.6 developments. It means that you can easily embed ActionScript Native Extensions within your Flex mobile project. ANE are a bridge between your Flex mobile app and a native library that can extend the capabilities of the Flex SDK. A <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://www.adobe.com/devnet/air/native-extensions-for-air.html"><span style="color:#0000ff;">list of native extensions are available on adobe.com </span></a></span>such as the Gyroscope API, Vibration, Notification, Kinnect&#8230; To import an ActionScript Native Extension within your project, just open the new tab in Flash Builder 4.6 dedicated to ANE.</p>
<p style="text-align:center;"><a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/11/Screen-shot-2011-11-30-at-3.46.22-PM1.png"><img class="aligncenter size-full wp-image-877" title="Screen shot 2011-11-30 at 3.46.22 PM" src="http://www.riagora.com/wp-content/uploads/2011/11/Screen-shot-2011-11-30-at-3.46.22-PM1.png" alt="" width="550"/></a></p>
<p>Remember that you can also use the new captive runtime option while packaging a mobile application OR a desktop application. It will create a standalone application that is embedding the AIR runtime. On the desktop, it means that you can actually copy your application on a USB stick and launch it without administration rights! It&#8217;s a fantastic new way for deploying AIR apps. On mobile devices, we were already using this technic on iOS. Now you can use the same technic on Android and generate an .apk file that will embed a specific version of the AIR runtime.</p>
<h2>Test Flex 4.6 apps on your device</h2>
<p>There are already some Flex 4.6 apps available on the Android Market and on the App Store. If you have an iPhone, you can download the free music application called <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://itunes.apple.com/tw/app/radio-x-track/id467964868?mt=8"><span style="color:#0000ff;">&#8220;Radio X-track&#8221;</span></a></span>. It&#8217;s a Flex 4.6 app I&#8217;ve been working on, I&#8217;ll share more information about this app soon on this blog. <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/narcissus/id472974421?mt=8"><span style="color:#0000ff;">Narcissus</span></a></span> is also compiled with Flex 4.6 by the way and offers great performance on iPad tablets. Christophe and Holly shared <span style="color:#0000ff;"><a rel="nofollow" target="_blank" href="http://devgirl.org/2011/10/31/flex-mobile-development-building-tablet-apps-full-example-with-source-code/"><span style="color:#0000ff;">an open-source tablet application</span></a></span> to manage your expenses.I&#8217;ve also been working on a Flex 4.6 application for tablet users and Flex developers&#8230; This application is already secretly available on the Android Market but the app is still &#8220;in review&#8221; on the app store. As soon as it&#8217;s available for both iPad and Android tablets, I&#8217;ll showcase this application. More to come&#8230;</p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/11/flex-4-6-is-out/&text=Flex+4.6+is+out%21&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Flexcursion with Apache</title>
         <link>http://www.riagora.com/2011/11/flex-is-open/</link>
         <description>What a week! Adobe made a lot of announcements which raised a lot of questions on the web, and led to a lot of WTF (which meant&amp;#8221;What The Flex&amp;#8221; right?). I feel that since MAX, the Flex community was expecting some clarification about the future of Flex. The strategic shift made by Adobe precipitated our [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=857</guid>
         <pubDate>Thu, 17 Nov 2011 16:59:08 +0000</pubDate>
         <content:encoded><![CDATA[<p>What a week! Adobe made a lot of announcements which raised a lot of questions on the web, and led to a lot of WTF <em>(which meant&#8221;What The Flex&#8221; right?)</em>. I feel that since MAX, the Flex community was expecting some clarification about the future of Flex. The strategic shift made by Adobe precipitated our communication to unveil the overall plan. Unfortunately, it has been shared in the middle of a wave of changes <em>(the lay-off, the Flash mobile story, the HTML5 commitment&#8230;)</em>. There was a lot of misunderstanding, so let me give you <strong>my personal opinion</strong> on this as a Flex developer and as an Adobe Evangelist. First, here is the official article that provides details about the future of Flex: <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://www.adobe.com/devnet/flex/articles/flex-announcements.html"><span style="color:#3366ff;">http://www.adobe.com/devnet/flex/articles/flex-announcements.html</span></a> </span></p>
<h2>The evolution of Flex</h2>
<p>This is a fairly long post, if you don’t have time to read it all right now, you may want to skip directly to What’s next for Flex. I&#8217;m French, I talk too much, and I&#8217;m not Victor Hugo&#8230; Whatever <img src="http://www.riagora.com/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height:1em;max-height:1em;"/> So feel free to skip this paragraph to focus on our future. But the history of Flex might help you understanding the difference between our past strategy and the new one.</p>
<p>Flex 1 was released in 2004. To develop and deploy a Flex app, you had to use a 15000$ server. I remember that I started looking at Flex 1.5 in 2005 at my previous company. Because of this economic model, I didn&#8217;t even try to develop a prototype. Then, after the acquisition of Macromedia, Flex 2 was launched with a free business model and an IDE based on Eclipse. It was 2006, when I started coding Flex projects and when I joined Adobe to promote this technology. In 2007, Flex 3 was open-sourced under the MPL license. Flex 4 introduced the Spark architecture that lets you skin visual components very easily and with a lot of freedom. Thanks to Flex 4.5.1 (and soon Flex 4.6) you can build &#8220;native-like&#8221; mobile apps and deploy them on Android, iOS and QNX. So what&#8217;s next?</p>
<p>I&#8217;m very close to the Java and the PHP community <em>(I&#8217;m currently writing this post from the fantastic DEVOXX conference with 3200 Java developers around me)</em>. When we used to present Flex as an open-source technology, it was more a &#8220;you can view my source&#8221; one. That was a huge step, and it helped our community to understand how the framework works. After a few months, it also generated some frustration. Flex developers and strategic customers who are Flex masters wanted to contribute actively, optimize the code, etc&#8230; Some of them even started their own branches. The Spoon project is the expression of this will and the expression of our lack of efficiency in accepting contributions, which I think was because Flex was perceived and promoted as a product. What I want to express is that we were defining the new Flex features on our side, to (somewhat) surprise our community and generate excitement. It was of course based on customer and user feedback, but then the new features were only shared during main conferences <em>(360Flex or MAX for instance)</em>, and this was related sometimes to our product strategy. And this system works very well to spur adoption and generate a lot of excitement: Flex is very successful in the Enterprise today thanks to this strategy.</p>
<h2>What&#8217;s next for Flex ?</h2>
<p>At the same time, HTML5 is moving very very fast &#8212; faster than most anyone would have predicted two years ago. This is mainly due to the success of the iPad. That&#8217;s why Adobe believes that within 3 to 5 years, depending on the complexity of your RIA, HTML5 should be able to enable decent Enterprise Application user experiences for desktop users, associated with a professional coding experience. What I would add, as an Enterprise consultant, is that we can easily add 2 or 3 years to this period of time. A significant part of the Enterprise customers I&#8217;m interacting with are still running on Windows XP. This is a reflection of the tempo of the Enterprise world that cannot be synced with the outside world for security, maintenance, training, and auditing reasons. So even if HTML5 integrates some key RIA concepts within 5 years, it means that browsers still have to implement them and that companies need to update to a recent browser&#8230; well, you know the story.</p>
<p>Flex is and will remain the leading framework for first-class Enterprise applications for many years. And by the way, don&#8217;t be scared. We&#8217;re not blind and we must accept the fact that HTML5 is making fantastic progress. That&#8217;s GREAT! And our community has A LOT of time to anticipate this shift and make the most of this transition. Adobe won&#8217;t let you down. We&#8217;ll contribute to open standards, and at the same time, Adobe, starting with my team, will make sure that you&#8217;ll make it through &#8212; and even thrive during &#8212; any shift in our industry. Don&#8217;t worry, if HTML5 becomes the standard for RIA apps, then the best HTML5 RIA developers of tomorrow will be today&#8217;s Flex developers. Why? Because RIA development is not just a matter of language. RIA developers have a lot of specific skills<em> (design awareness, client-side architectures, service exposure architecture, user-experience, mobile applications conception and optimization to name a few)</em>. You have a unique knowledge of the market that goes beyond knowing a technology inside and out. Adobe is already a key player in the HTML industry, and we&#8217;ll deliver more and more advanced tools and technologies (you can already look at PhoneGap, Edge&#8230;).</p>
<p>That&#8217;s why we need to define the best strategy for the Flex framework and establish it as an Enterprise standard today! There are two options. The first option is to invest in more new features and hire more engineers on the Flex SDK team. For the long term, I don&#8217;t believe in this strategy. It&#8217;s the traditional way to proceed for software products but not for application development frameworks. The more committed and talented developers you have in the community, the more you need to let them interact with the source code of your technology. The more you have mission critical Flex apps deployed in large organizations, the more strategic customers need to trust the future of your technology. Open source can fulfill these needs. We all know that Flex is deeply linked to the Flash Player which boosted the innovation on the web, and then, consequently, in Rich Internet Applications. I believe that the Flex framework is very mature in terms of features and can answer pretty much all the current Enterprise needs. It can also answer  future needs as we can now rapidly build native apps for iOS, Android and QNX since Flex 4.5.</p>
<p>The second option is to consolidate the current SDK and transition to the next level of openness. That&#8217;s why we decided to propose incubating the Flex SDK to the Apache Software Foundation. I&#8217;m very happy and excited about this move for several reasons:</p>
<ul>
<li>Apache is a very respected foundation by developers and by large organizations. A lot of mission-critical Enterprise applications are already relying on Apache software: Axis, Ant, Maven, JackRabbit, Tomcat, Geronimo, ActiveMQ, Felix&#8230;</li>
<li>We are not only proposing the Flex SDK, we&#8217;re also pushing BlazeDS <em>(Java server libraries for data serialization and real-time messaging)</em>. In 2012, we&#8217;ll propose Falcon, a new generation compiler. We&#8217;ll also unveil and propose FalconJS, an experimental and advanced Flex to JavaScript compiler. More projects may also be proposed to Apache to build a first-class open Enterprise RIA stack.</li>
<li>For the first time, Adobe won&#8217;t be the sole influencer on the Flex roadmap. We&#8217;ll still have engineers working on it but the effort will also be advanced directly by work of top Flex developers in the community <em>(join the Spoon project if you&#8217;re one of them)</em>.</li>
</ul>
<div>
<h2>So Flex or HTML5 ?</h2>
<p>I&#8217;ve been working on Rich Enterprise applications for more than 6 years and I can tell you that it requires a lot of different skills and specialized knowledge. RIA developers, and especially Flex developers, know how complex it is to combine an efficient user experience with a maintainable client architecture. Flex is really the only cross-platform solutions on the desktop for rich applications. Today, 90% of Flex applications are internal apps <em>(statistics from what I see on the field)</em> available on the intranet and on the extranet to share the screens with external partners or customers. Flex apps won&#8217;t run in mobile browsers as Apple and MSFT don&#8217;t host plugins on their tablets<em> (we&#8217;re still waiting for the MSFT one by the way)</em> and as Adobe announced its intent to discontinue Flash in mobile browsers. Thanks to this decision, Adobe engineers are now focusing on Adobe AIR, the runtime that can execute and package your Flex applications as native iOS, Android and QNX (BlackBerry) apps. With the arrival of Flex 4.6 at the end of November, Flex apps will perform even better to deliver &#8220;native-like&#8221; experiences on smartphones and tablet devices. So what&#8217;s the market for Flex? Well it&#8217;s huge because we are focusing on Enterprise apps and not on Customer apps, we&#8217;re focusing on Enterprise data-driven apps, on rebranding and re-architecting existing Enterprise apps developed with Web 1.0 technologies or even client-server ones. That&#8217;s a growing market in all industries. Tablets will accelerate this need of user-oriented architectures, because if you deliver a bad user experience on tablets, you&#8217;ll immediately fail. The potential of RIA for desktop and tablet users is higher than ever because it unlocks ROI <em>(increase the productivity of your company, improve the decision making processes, reduce the learning curve and then the training costs for employees&#8230;)</em>. I know that today you&#8217;ll hear a lot of people talking about the growing role of tablet devices in our daily life, that tablets will replace PCs, etc&#8230; Who cannot agree? I&#8217;d like just to add that the Enterprise world is evolving at a different tempo. Believe me, you won&#8217;t see large organizations replacing all PCs by tablets next year. If it happens and if it makes sense, it will take years, maybe decades. Desktop users will still represent the main population of Enterprise apps end users for a very long time. With Flex, you can already target 100% of your desktop users without migrating to a new operating system or a new browser, and you can target 99% of tablet devices as you can now generate iOS and Android native apps.</p>
<p>This is regarding the market for Flex, but there&#8217;s also the &#8220;developer experience&#8221;. Flex has been designed for Enterprise developers who are used to working with object-oriented languages like Java, first-class debugging experiences (on the desktop and on mobile devices), continuous integration, agile development, modular applications managed by several development teams, productive tools based on Enterprise standard IDEs like Eclipse, etc&#8230; It&#8217;s by far the best and the most efficient coding experience on the market and that&#8217;s not trivial. Before developing a mission-critical application, you have to measure/estimate the development time. Flex is usually way faster than other solutions, for a better result at the end. That&#8217;s why it&#8217;s considered the leading RIA framework on the market. So, don&#8217;t be scared, Flex is not dead. I was not surprised to see some posts on the web promoting this idea. It&#8217;s a classic trend in our industry. Just to illustrate that point, I googled some queries. Here is my TOP 5 list of the dead technologies:</p>
<ol>
<li>&#8220;.NET is dead&#8221; is the big winner with 576000 search results on Google. Congratulations.</li>
<li>&#8220;JAVA is dead&#8221; is following with 138.000 results. I can hardly feel this trend from Devoxx and the 3200 Java developers around me <img src="http://www.riagora.com/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height:1em;max-height:1em;"/></li>
<li>&#8220;PHP is dead&#8221; is a little child with only 35.600 results.</li>
<li>&#8220;Ruby is dead&#8221; is in the same range with 30.700 results.</li>
<li>&#8220;AJAX is dead&#8221; generates 6500 results.</li>
</ol>
<div>So we are newbies in this competition as &#8220;Flex is dead&#8221; only displays 5000 results <img src="http://www.riagora.com/wp-includes/images/smilies/frownie.png" alt=":(" class="wp-smiley" style="height:1em;max-height:1em;"/> I&#8217;m kidding of course, it&#8217;s a stupid analysis but it highlights that you shouldn&#8217;t always trust online articles about technologies lives. Try it with Flash, you&#8217;ll be amazed. Flash is a damned zombie :). Ok&#8230; no more stupid games, let me go back to the future of Flex.</div>
<div>
<h2>How can I contribute ?</h2>
<p>After the announcement of our proposal to the Apache foundation, I received several emails from Flex developers and customers who want to contribute, to play a role in the roadmap, to fix bugs, etc&#8230; We&#8217;re still defining the process, so I cannot share any information on that today. But as soon as everything is defined, I&#8217;ll be the first writing tutorials to explain how to contribute. It&#8217;s such a big opportunity for the Flex community. It&#8217;s also a huge change of strategy and I&#8217;m aware of that, and some of you may be a little bit nervous. But Flex won&#8217;t be the only project in collaboration with Apache. We acquired Day software, and the engineers at Day are Apache masters, true open-source contributors. I like that. PhoneGap will also become an Apache project. Adobe is one of the top contributing companies to the Apache Foundation, and I fully embrace this strategy. I want Flex to become as popular as Tomcat in Enterprise architecture!</p>
<p>Let&#8217;s embrace this strategy together. Adobe is proud of Flex and super proud of what you achieve everyday with this framework. Based on the emotional reactions perceived on social networks this week, I can tell that we are all true and passionate Flex lovers. So let&#8217;s continue to build on that passion and work together on the future of Flex.</p>
</div>
</div>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/11/flex-is-open/&text=Flexcursion+with+Apache&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Narcissus, segment your followers</title>
         <link>http://www.riagora.com/2011/10/narcissus-segment-your-followers/</link>
         <description>UPDATE: Twitter modified its API in the night. The desktop version has been updated (1.0.2). I&amp;#8217;m still waiting for Apple to review my update 1.0.2.  I&amp;#8217;ve been working on a Flex mobile application called Narcissus, and I finally found the time to finalize and publish it on the App Store. Narcissus is a free application, [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=835</guid>
         <pubDate>Mon, 31 Oct 2011 13:17:22 +0000</pubDate>
         <content:encoded><![CDATA[<p><em><span style="text-decoration:underline;">UPDATE</span>: Twitter modified its API in the night. The desktop version has been updated (1.0.2). I&#8217;m still waiting for Apple to review my update 1.0.2. </em></p>
<p>I&#8217;ve been working on a <strong>Flex mobile application</strong> called Narcissus, and I finally found the time to finalize and <a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/narcissus/id472974421?mt=8">publish it on the App Store</a>. Narcissus is a free application, available <a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/narcissus/id472974421?mt=8">on the App Store</a> for iPad users, and <a rel="nofollow" target="_blank" href="http://www.riagora.com/narcissus/Narcissus.air">on your desktop</a> thanks to the Adobe AIR runtime. Narcissus can analyze and segments the followers of a Twitter account. Inspired by Google + circles, Narcissus categorizes your followers in circles based on their activity on twitter (the number of tweets they sent) and their influence (the number of followers they get). It helps to understand who&#8217;s following you, how active your followers are on Twitter  and how influential they are. If you want your content to be re-tweeted and seen by a maximum of Twitter users, you&#8217;ll discover that you just need to focus on few people of your network. I&#8217;ve recorded a video that showcases the basic features of Narcissus.</p>
<p><embed width="580" height="423" type="application/x-shockwave-flash" src="http://www.youtube.com/v/2ZEfBlLGdXk?version=3&amp;hl=en_US"/></p> 
<p>This application has been developed with the Flex 4.5.1 framework and Flash Builder. It performs very well on all platforms (iPad, Android and the PlayBook), that&#8217;s why I want to share some tricks I&#8217;ve learnt building this app.</p>
<h3>Design Driven Development</h3>
<p>I&#8217;m clearly not a designer, but as I was the only person involved in this project, I forced myself to use the <strong>Design Driven Development</strong> methodology. It implies designing the full user-experience before writing one single line of code. As this project is a &#8220;data-visualization&#8221; application, the design process was obvious. The goal of a dashboard is to<strong> transform data into information</strong>. I know the data I can get from Twitter and I know what&#8217;s the user problem which is in this case: &#8220;how can I know better who&#8217;s following me on Twitter to be more efficient on my social network ?&#8221;. The UI of the application must bring solutions to that question. As it&#8217;s a dashboard application, I decided to use the &#8220;drill-down&#8221; strategy: start with a global view <em>(using circles)</em> and give the ability to drill-down <em>(analyze the list of followers per category and get the details about a follower)</em>. I think I spent at least <strong>4 hours in Photoshop</strong> to design the main screen, place the elements, design the circles, the callout popups, the icons&#8230; Then the second step is &#8220;what&#8217;s the best UI architecture to serve this design?&#8221;. I rapidly decided to use the new ViewNavigator class of Flex 4.5 and the IconItemRenderer to get the best performance on tablet devices. So I&#8217;m using a classic &lt;s:Application&gt; root tag that contains eight &lt;s:ViewNavigator&gt; components, one per circle. I spent two days on coding the application. Then I tested it on an iPAD, optimized the code <em>(mainly my database code)</em> and fixed some bugs.</p>
<h3>Optimizing SQLite calls</h3>
<p>When you test your application on your PC, SQLite always acts very well. When Narcissus retrieves the list of followers for one account, it needs to save all the ids in one table. So, if you analyze an account that has 2000 followers, it means that you need to fire 2000 INSERT SQL queries. On the desktop, it&#8217;s okay, it takes less than one second to Adobe AIR to save these 2000 lines. On the iPAD 1, it&#8217;s another story. It takes more or less 10 seconds, and it can freeze the UI. Very bad user-experience. That&#8217;s why I decided to use SQLite transactions. If you need to execute a batch of INSERT, DELETE or UPDATE queries, always use transactions. In other words, if you need to execute SQL queries that don&#8217;t return a result, you can use transactions. <strong>It reduced the SQLite processing time by 90% in my case.</strong> Here is a <span style="color:#3366ff;"><a rel="nofollow" target="_blank" href="http://help.adobe.com/en_US/AIR/1.5/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7d47.html"><span style="color:#3366ff;">link to the doc</span></a></span> that explains how it works, and the code I&#8217;m using in the application.</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_6" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_6" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="kw2">var</span> sqlS<span class="sy0">:</span>SQLStatement = <span class="kw1">new</span> SQLStatement<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			sqlS<span class="sy0">.</span>sqlConnection = sqlc<span class="sy0">;</span>
			sqlS<span class="sy0">.</span><span class="kw7">text</span> = <span class="st0">&quot;INSERT INTO &quot;</span><span class="sy0">+</span> tableName<span class="sy0">+</span><span class="st0">&quot;(idUser,screenName,name,url,description,circle,nbFollowers,statusCount,picture) VALUES (@IDUSER,@SCREENNAME,@NAME,@URL,@DESCRIPTION,@CIRCLE,@NBFOLLOWERS,@STATUSCOUNT,@PICTURE)&quot;</span><span class="sy0">;</span>
&nbsp;
			sqlc<span class="sy0">.</span>begin<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i<span class="sy0">:</span><a rel="nofollow" target="_blank" href="http://www.google.com/search?q=int%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:int.html"><span class="kw5">int</span></a> = <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> arrayFollowers<span class="sy0">.</span><span class="kw7">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
			<span class="br0">&#123;</span>
				objUser = arrayFollowers<span class="sy0">.</span>getItemAt<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@IDUSER'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>idUser<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@SCREENNAME'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>screenName<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@NAME'</span><span class="br0">]</span> = objUser<span class="sy0">.</span><span class="kw7">name</span><span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@URL'</span><span class="br0">]</span> = objUser<span class="sy0">.</span><span class="kw7">url</span><span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@DESCRIPTION'</span><span class="br0">]</span> = myDescription<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@CIRCLE'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>circle<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@NBFOLLOWERS'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>nbFollowers<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@STATUSCOUNT'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>statusCount<span class="sy0">;</span>
				sqlS<span class="sy0">.</span><span class="kw7">parameters</span><span class="br0">[</span><span class="st0">'@PICTURE'</span><span class="br0">]</span> = objUser<span class="sy0">.</span>picture<span class="sy0">;</span>
				sqlS<span class="sy0">.</span>execute<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
			sqlc<span class="sy0">.</span>commit<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>I&#8217;m also using incremental savings (auto-save) for performance and user-experience reasons.</p>
<p>&nbsp;</p>
<h3>How to persist simple parameters</h3>
<p>I wanted to persist the settings <em>(activity and influence thresholds)</em> in a cleaner way than using a SQLite database. I started using the classic File API. The only directory that works on tablet devices is the Documents one. Here is some code that works both on desktop and tablet apps:</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_7" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_7" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="kw2">var</span> file<span class="sy0">:</span>File = File<span class="sy0">.</span>documentsDirectory<span class="sy0">.</span>resolvePath<span class="br0">&#40;</span><span class="st0">'settingsNarcissus.inf'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span>file<span class="sy0">.</span>exists<span class="br0">&#41;</span> file<span class="sy0">.</span>deleteFile<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw2">var</span> fileStream<span class="sy0">:</span>FileStream = <span class="kw1">new</span> FileStream<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//create a file stream</span>
	fileStream<span class="sy0">.</span><span class="kw7">open</span><span class="br0">&#40;</span>file<span class="sy0">,</span> FileMode<span class="sy0">.</span>WRITE<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// and open the file for write</span>
	fileStream<span class="sy0">.</span><span class="kw7">writeObject</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//write the object to the file</span>
	fileStream<span class="sy0">.</span><span class="kw7">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>But I&#8217;m not a big fan of the Files approach. That&#8217;s why I decided to use the Persitence Manager API. This class is so easy to use and so efficient!!! Here is how you can easily save and load settings from anywhere in your mobile project:</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_8" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_8" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="co1">//SAVE</span>
&nbsp;
<span class="kw2">var</span> object<span class="sy0">:</span>SettingsObj = <span class="kw1">new</span> SettingsObj<span class="br0">&#40;</span>thresholdTweets<span class="sy0">,</span>thresholdFollowers<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">var</span> persistenceMan<span class="sy0">:</span>PersistenceManager = <span class="kw1">new</span> PersistenceManager<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	persistenceMan<span class="sy0">.</span><span class="kw7">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;settings&quot;</span><span class="sy0">,</span>object<span class="br0">&#41;</span><span class="sy0">;</span>
	persistenceMan<span class="sy0">.</span><span class="kw7">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">//LOAD</span>
&nbsp;
<span class="kw2">var</span> persistenceMan<span class="sy0">:</span>PersistenceManager = <span class="kw1">new</span> PersistenceManager<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">try</span><span class="br0">&#123;</span>
		<span class="kw2">var</span> object<span class="sy0">:</span><a rel="nofollow" target="_blank" href="http://www.google.com/search?q=object%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:object.html"><span class="kw5">Object</span></a> = persistenceMan<span class="sy0">.</span><span class="kw7">getProperty</span><span class="br0">&#40;</span><span class="st0">&quot;settings&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		thresholdFollowers = object<span class="sy0">.</span>savedThresholdFollowers<span class="sy0">;</span>
		thresholdTweets = object<span class="sy0">.</span>savedThresholdTweets<span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span>e<span class="sy0">:</span><a rel="nofollow" target="_blank" href="http://www.google.com/search?q=error%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:error.html"><span class="kw5">Error</span></a><span class="br0">&#41;</span><span class="br0">&#123;</span>
		<span class="co1">//error management if empty</span>
	<span class="br0">&#125;</span></pre></div></div>
<h3>Animations</h3>
<p>Some developers asked me how I managed the animations and the transitions with the circles. For the animations, I&#8217;m simply declaring basic MXML sequences. When I get the profile image picture of a Twitter account, I&#8217;m assigning it to a circle, and then I change the xTo and yTo coordinates of the &#8216;moveProfile&#8217; object. Here is how I declared the sequence.</p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_9" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_9" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display:block;"><pre class="mxml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;s:Sequence</span> id=<span class="st0">&quot;seqAnimationProfile&quot;</span> target=<span class="st0">&quot;{profileImageComp}&quot;</span> effectEnd=<span class="st0">&quot;seqAnimationProfile_effectEndHandler(event)&quot;</span><span class="re2">&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;s:Fade</span>  alphaFrom=<span class="st0">&quot;0&quot;</span> alphaTo=<span class="st0">&quot;100&quot;</span> duration=<span class="st0">&quot;500&quot;</span><span class="re2">/&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;s:Move</span> id=<span class="st0">'moveProfile'</span>  xFrom=<span class="st0">&quot;480&quot;</span> yFrom=<span class="st0">&quot;380&quot;</span> duration=<span class="st0">&quot;800&quot;</span><span class="re2">&gt;</span></span>
				<span class="sc3"><span class="re1">&lt;s:easer</span><span class="re2">&gt;</span></span>
&nbsp;
					<span class="sc3"><span class="re1">&lt;s:Sine</span><span class="re2">/&gt;</span></span>
&nbsp;
				<span class="sc3"><span class="re1">&lt;/s:easer</span><span class="re2">&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;/s:Move</span><span class="re2">&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;s:Fade</span> alphaFrom=<span class="st0">&quot;100&quot;</span> alphaTo=<span class="st0">&quot;0&quot;</span> duration=<span class="st0">&quot;500&quot;</span><span class="re2">/&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;s:Move</span>  xTo=<span class="st0">&quot;480&quot;</span> yTo=<span class="st0">&quot;380&quot;</span> duration=<span class="st0">&quot;50&quot;</span><span class="re2">/&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;/s:Sequence</span><span class="re2">&gt;</span></span></pre></div></div>
<p>Regarding the circles, I&#8217;m using the default transitions of the ViewNavigator object. To enjoy the background image, I&#8217;m placing eight ViewNavigator with a transparent background which load views with transparent background. Just set the backgroundAlpha property to 0 in the ViewNavigator tags AND in the View tags. The circles are also animated. To do so, I&#8217;m playing with MXML graphic properties. The static parts are PNG files (the background and the reflection effet at the top of the circle), the animated part is a Spark Graphic component. Here is the MXML code for a circle:</p>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_10" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_10" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display:block;"><pre class="mxml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;s:Image</span> horizontalCenter=<span class="st0">&quot;0&quot;</span> source=<span class="st0">&quot;assets/images/circleBack.png&quot;</span>   verticalCenter=<span class="st0">&quot;-20&quot;</span><span class="re2">/&gt;</span></span>
	<span class="sc3"><span class="re1">&lt;s:Graphic</span> id=<span class="st0">&quot;theCircle&quot;</span>  version=<span class="st0">&quot;2&quot;</span> horizontalCenter=<span class="st0">&quot;0&quot;</span> verticalCenter=<span class="st0">&quot;-20&quot;</span><span class="re2">&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;s:Ellipse</span> height=<span class="st0">&quot;{radiusCircle}&quot;</span> width=<span class="st0">&quot;{radiusCircle}&quot;</span><span class="re2">&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;s:fill</span><span class="re2">&gt;</span></span>
				<span class="sc3"><span class="re1">&lt;s:SolidColor</span> color=<span class="st0">&quot;{data.colorCircle}&quot;</span><span class="re2">/&gt;</span></span>
			<span class="sc3"><span class="re1">&lt;/s:fill</span><span class="re2">&gt;</span></span>
		<span class="sc3"><span class="re1">&lt;/s:Ellipse</span><span class="re2">&gt;</span></span>
	<span class="sc3"><span class="re1">&lt;/s:Graphic</span><span class="re2">&gt;</span></span>
	<span class="sc3"><span class="re1">&lt;s:Image</span> horizontalCenter=<span class="st0">&quot;0&quot;</span> source=<span class="st0">&quot;assets/images/circleReflect.png&quot;</span> verticalCenter=<span class="st0">&quot;-87&quot;</span><span class="re2">/&gt;</span></span></pre></div></div>
<p>To animate the circles with some easing, I declared a Resize effect.</p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_11" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_11" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="sy0">&lt;</span>fx<span class="sy0">:</span>Declarations<span class="sy0">&gt;</span>
		<span class="sy0">&lt;!--</span> Place non<span class="sy0">-</span>visual <span class="kw7">elements</span> <span class="br0">&#40;</span>e<span class="sy0">.</span>g<span class="sy0">.,</span> services<span class="sy0">,</span> <span class="kw7">value</span> objects<span class="br0">&#41;</span> here <span class="sy0">--&gt;</span>
		<span class="sy0">&lt;</span>s<span class="sy0">:</span>Resize id=<span class="st0">&quot;fxResize&quot;</span>  duration=<span class="st0">&quot;500&quot;</span>  <span class="kw7">target</span>=<span class="st0">&quot;{theCircle}&quot;</span><span class="sy0">&gt;</span>
			<span class="sy0">&lt;</span>s<span class="sy0">:</span>easer<span class="sy0">&gt;</span>
&nbsp;
				<span class="sy0">&lt;</span>s<span class="sy0">:</span>Sine<span class="sy0">/&gt;</span>
&nbsp;
			<span class="sy0">&lt;/</span>s<span class="sy0">:</span>easer<span class="sy0">&gt;</span>
		<span class="sy0">&lt;/</span>s<span class="sy0">:</span>Resize<span class="sy0">&gt;</span>
&nbsp;
	<span class="sy0">&lt;/</span>fx<span class="sy0">:</span>Declarations<span class="sy0">&gt;</span></pre></div></div>
<p>Leveraging the MXML tags of the Flex framework, you can very quickly build a professional iPAD application. Narcissus has been immediately approved by Apple on the App Store.</p>
<h3>Links</h3>
<p>If you want to use Narcissus on your desktop (MAC &amp; Windows), install this AIR application:</p>
<p><a rel="nofollow" target="_blank" href="http://www.riagora.com/narcissus/Narcissus.air">http://www.riagora.com/narcissus/Narcissus.air</a></p>
<p>If you have an iPAD, then you can find it on the App Store:</p>
<p><a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/narcissus/id472974421?mt=8">http://itunes.apple.com/us/app/narcissus/id472974421?mt=8</a></p>
<p><strong>Feel free to add a nice review on the App Store.</strong> If you don&#8217;t like the app, don&#8217;t say anything <img src="http://www.riagora.com/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height:1em;max-height:1em;"/></p>
<p>Narcissus is just a small app that showcases how creative you can be with basic Flex components on tablet devices. I&#8217;m working on the Android version <em>(I just need to fix some relative coordinates stuff to accept all screen resolutions)</em>.</p>
<p>I hope you&#8217;ll like it. Enjoy  !</p>
<p>&nbsp;</p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/10/narcissus-segment-your-followers/&text=Narcissus%2C+segment+your+followers&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Analytics in your Flex mobile apps</title>
         <link>http://www.riagora.com/2011/10/analytics-in-your-flex-mobile-apps/</link>
         <description>Analytics is a natural asset of an efficient website. If you don&amp;#8217;t collect, measure and analyze your internet data, you cannot maintain and optimize your web applications. Surprisingly, analytics are rarely used for Enterprise applications, and that&amp;#8217;s shocking. IT services deliver complex applications, with a lot of screens, tabs and advanced navigation components and they [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=826</guid>
         <pubDate>Thu, 20 Oct 2011 08:54:31 +0000</pubDate>
         <content:encoded><![CDATA[<p>Analytics is a natural asset of an efficient website. If you don&#8217;t collect, measure and analyze your internet data, you cannot maintain and optimize your web applications. Surprisingly, analytics are rarely used for Enterprise applications, and that&#8217;s shocking. IT services deliver complex applications, with a lot of screens, tabs and advanced navigation components and they just never analyze how their RIAs are used. Internal apps would benefit so much from analytics solutions. I feel that we are reproducing the same mistake with mobile applications. As we are living the early-ages of mobile apps, it&#8217;s time so standardize analytics in Flex mobile apps. Adobe Omniture is the most professional analytics solution of the market. As you can guess, it&#8217;s very easy to add analytics tags in a Flex application. We even developed an Omniture extension for Flash Builder. Check this article is you are Omniture customers: <a rel="nofollow" target="_blank" href="http://www.adobe.com/devnet/flex/articles/sitecatalyst_extension_flashbuilder.html">http://www.adobe.com/devnet/flex/articles/sitecatalyst_extension_flashbuilder.html</a> I know that you are not all Omniture customers, and for simple needs you may choose a free solution such as Google Analytics that would answer your basic needs.</p>
<p>Google Analytics is also trying to ease the addition of tracking events inside Flex applications. Unfortunately, the current version of the<a rel="nofollow" target="_blank" href="http://code.google.com/apis/analytics/docs/tracking/flashTrackingIntro.html"> Google Analytics Tracker library</a> doesn&#8217;t support Flex mobile projects. As I really needed this feature for a mobile app (that I will unveil next week), I modified the source code of the GATracker library and now it works like a charm. You can track everything, I mean everything:</p>
<p>&#8211; If you have HTTPService requests, you can track how many successful results your users get and  compared this number with the number HTTP fault events.</p>
<p>&#8211; If you have 5 tabs in your mobile apps, measure what is the most used tab, check if they are all used. You can also imagine to track the most common path for your app and track scenarios such as &#8220;the user hits tab 1, then tab 3 and then tab 2, is the main use case&#8221;.</p>
<p>Your mission is to defined what makes sense in your application, and which information will help optimizing it. Here are the steps I used to add Google Analytics tracking information in my mobile application:</p>
<p>1. Download the source (not the SWC) of the Google Analytics for Flash library:  <a rel="nofollow" target="_blank" href="http://code.google.com/p/gaforflash/">http://code.google.com/p/gaforflash/</a></p>
<p>2. Open your Flex mobile project and add the code inside your project. It will create a com.google.analytics package with a lot of AS3 classes.</p>
<p>In your Google Analytics console, you need to measure an existing website (in my case riagora.com) and add the classic Google Analytics JavaScript library. Then your website will be validated and you&#8217;ll be given an ID for your website by Google. We&#8217;ll surcharge the tracking information of your website with mobile tracking information. The ID of your website should look like this chain of characters: UA-2999999-2.</p>
<p>3. On the application level (your root MXML file), create an AnalyticsTracker variable and instantiate a GATracker. The tracking variable is public. Add this code for instance:</p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_12" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_12" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw2">var</span> tracker<span class="sy0">:</span>AnalyticsTracker<span class="sy0">;</span>
<span class="kw1">protected</span> <span class="kw3">function</span> viewnavigatorapplication1_creationCompleteHandler<span class="br0">&#40;</span>event<span class="sy0">:</span>FlexEvent<span class="br0">&#41;</span><span class="sy0">:</span><span class="kw1">void</span>
<span class="br0">&#123;</span>
	<span class="co1">// TODO Auto-generated method stub</span>
	tracker = <span class="kw1">new</span> GATracker<span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span><span class="st0">&quot;YOUR_GOOGLE_ANALYTICS_WEBSITE_ID&quot;</span><span class="sy0">,</span><span class="st0">&quot;AS3&quot;</span><span class="sy0">,</span><span class="kw1">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>4. If you want to track something, just call the trackPageview method. It&#8217;s waiting for the name of the HTML page as a parameter. Create custom names such as &#8220;/mobileApp-Success&#8221;, or &#8220;/mobileApp-tab1&#8243;.</p>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_13" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_13" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="kw1">protected</span> <span class="kw3">function</span> button1_clickHandler<span class="br0">&#40;</span>event<span class="sy0">:</span><a rel="nofollow" target="_blank" href="http://www.google.com/search?q=mouseevent%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:mouseevent.html"><span class="kw5">MouseEvent</span></a><span class="br0">&#41;</span><span class="sy0">:</span><span class="kw1">void</span>
<span class="br0">&#123;</span>
	<span class="co1">// TODO Auto-generated method stub</span>
					FlexGlobals<span class="sy0">.</span>topLevelApplication<span class="sy0">.</span>tracker<span class="sy0">.</span>trackPageview<span class="br0">&#40;</span><span class="st0">'/mobileApp-tab1'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>5. Now if you compile your project, you&#8217;ll get error messages such as the famous TypeError #1009, also known as &#8220;the error that doesn&#8217;t help&#8221;. Let&#8217;s start modifying the Google Analytics code.</p>
<p>6. Open the class components/FlexTracker.as</p>
<p>7. Search and replace this code:</p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_14" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_14" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="kw2">var</span> appclass<span class="sy0">:</span><a rel="nofollow" target="_blank" href="http://www.google.com/search?q=object%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:object.html"><span class="kw5">Object</span></a> = <span class="kw7">getDefinitionByName</span><span class="br0">&#40;</span> <span class="st0">&quot;mx.core::Application&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
 _app = appclass<span class="sy0">.</span>application<span class="sy0">;</span></pre></div></div>
<p>by code that doesn&#8217;t refer to MX Application. In Flex 4.5, we don&#8217;t use MX applications anymore, but we can use the FlexGlobals class <img src="http://s.w.org/images/core/emoji/72x72/1f609.png" alt="&#x00d83d;&#x00de09;" class="wp-smiley" style="height:1em;max-height:1em;"/></p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_15" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_15" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;">appclass = <span class="kw7">getDefinitionByName</span><span class="br0">&#40;</span> <span class="st0">&quot;mx.core::FlexGlobals&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
_app = appclass<span class="sy0">.</span>topLevelApplication<span class="sy0">;</span></pre></div></div>
<p>8. Then we need to add the root URL of our virtual website (in my case riagora.com). By default, the library tries to get the URL from browser information&#8230; well this cannot work with a mobile app running in AIR, so we&#8217;ll hard-code the URL Open the GATracker.as class. Comment the _env.url line and add your own root URL.</p>
<div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdt_16" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_16" class="wp-synhighlighter-title" href="#codesyntax_16" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_16" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_16" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;"><span class="co1">//_env.url = _display.stage.loaderInfo.url;</span>
_env<span class="sy0">.</span><span class="kw7">url</span> = <span class="st0">&quot;http://www.riagora.com/&quot;</span><span class="sy0">;</span></pre></div></div>
<p>9. We still have to deal with small &#8216;stage&#8217; issues. Open the core/IdleTimer.as class and comment two lines of code that deal with the Stage:</p>
<div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdt_17" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a rel="nofollow"></a><a rel="nofollow" id="wpshat_17" class="wp-synhighlighter-title" href="#codesyntax_17" title="Click to show/hide code block">Code block</a></td><td align="right"><a rel="nofollow" href="#codesyntax_17" title="Show code only"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png"/></a>&nbsp;<a rel="nofollow" href="#codesyntax_17" title="Print code"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png"/></a>&nbsp;<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/plugins/wp-synhighlight/About.html" title="Show plugin information"><img border="0" style="border:0 none;" src="http://www.riagora.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif"/></a>&nbsp;</td></tr></table></div><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display:block;"><pre class="actionscript3" style="font-family:monospace;">_debug      = debug<span class="sy0">;</span>
         <span class="co1">//   _stage      = display.stage;</span>
            _buffer     = buffer<span class="sy0">;</span>
            _lastMove   = <span class="kw7">getTimer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            _inactivity = inactivity <span class="sy0">*</span> <span class="nu0">1000</span><span class="sy0">;</span> <span class="co1">//milliseconds</span>
&nbsp;
            _loop<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span> <a rel="nofollow" target="_blank" href="http://www.google.com/search?q=timerevent%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:timerevent.html"><span class="kw5">TimerEvent</span></a><span class="sy0">.</span><span class="kw8">TIMER</span><span class="sy0">,</span> checkForIdle <span class="br0">&#41;</span><span class="sy0">;</span>
            _session<span class="sy0">.</span><span class="kw7">addEventListener</span><span class="br0">&#40;</span> <a rel="nofollow" target="_blank" href="http://www.google.com/search?q=timerevent%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:timerevent.html"><span class="kw5">TimerEvent</span></a><span class="sy0">.</span><span class="kw8">TIMER_COMPLETE</span><span class="sy0">,</span> endSession <span class="br0">&#41;</span><span class="sy0">;</span>
          <span class="co1">//  _stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMove );</span></pre></div></div>
<p>10. And that&#8217;s it!!! Within the Google Analytics console, you can now create custom dashboards, filtering the visited pages that starts with &#8220;/mobileApp&#8221;.<a rel="nofollow" target="_blank" href="http://www.riagora.com/wp-content/uploads/2011/10/analyticsTracking.jpg"><br />
</a></p>
<p>11. You can download this sample Flex 4.5.1 project that contains my updated Google Analytics library. Here is the link to this Flash Builder project: <a rel="nofollow" target="_blank" href="http://riagora.com/pvt_content/android/GoogleAnalytics.fxp">http://riagora.com/pvt_content/android/GoogleAnalytics.fxp</a></p>
<p><strong>WARNING:</strong> Google Analytics doesn&#8217;t display the results in real-time ! You have to wait for 24 hours before seeing some tracking results.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/10/analytics-in-your-flex-mobile-apps/&text=Analytics+in+your+Flex+mobile+apps&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
      <item>
         <title>Tablet devices and Enterprise apps</title>
         <link>http://www.riagora.com/2011/10/tablet-devices-and-enterprise-apps/</link>
         <description>My talk at Adobe MAX was about the future role of tablet devices in large organizations, and the impact of this new generation of devices on IT services. Tablets will rapidly become a tremendous business opportunity for Flex developers. I was happily surprised by the number of sessions about tablets at MAX. A lot of [&amp;#8230;]</description>
         <guid isPermaLink="false">http://www.riagora.com/?p=816</guid>
         <pubDate>Fri, 14 Oct 2011 10:10:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>My talk at Adobe MAX was about the future role of tablet devices in large organizations, and the impact of this new generation of devices on IT services. Tablets will rapidly become a tremendous business opportunity for Flex developers. I was happily surprised by the number of sessions about tablets at MAX. A lot of Flex developers such as Christophe gave some nice technical tips on how to develop engaging mobile apps. For my session, I wanted to give some tips but also to explain why tablet devices will play a key role.</p>
<p>When you look at how humans have interacted with enterprise knowledge over the years and even today, paper is still very present. You often interact directly with the knowledge on a horizontal plan using a pen, but this can hardly be centralized. Collaboration on a whiteboard is also an interesting case. You share and review the knowledge on a vertical plane. Often this knowledge is lost as collaboration is thought of as a temporary step in an enterprise workflow or a decision making process. These two interactions (paper and whiteboard) are still very common in large organizations, and that&#8217;s how we learn things at school. Personal computers introduced a different approach due to the rise of mice and keyboards. You move your mouse on an horizontal plane, it acts on a vertical plane that hosts the knowledge. For the first time the knowledge could be easily centralized and shared beyond the firewall (the extended company) with partners and external customers. Inspired by typewriters, PCs are not mobile at all, even less mobile than paper. The laptop was the first attempt of mobility. It automatically extended our work area and let us interact with the enterprise knowledge from home and on the road. But it also introduced some of the worst interactions ever (trackpad, balls, etc&#8230;). Smartphones are the real truly mobile device, the first that can answer the &#8220;anywhere and at any time&#8221; requirement. But the typing experience is bad and the small screens don&#8217;t let you review documents for instance. For all these reasons, you can see why tablets are a natural evolution. Although there&#8217;s still progress to be made, tablets are fully mobile, the typing experience is good, the large screen lets you review documents, and for the first time, and you can combine pleasure and work on the same device.</p>
<p>The rise of tablet devices in large organizations introduces new challenges for IT services. They have to define new processes to secure the configuration and deployment of apps, they have to ensure that mobile apps are auditable and compliant, and, most of all, they have to run existing applications. On the other side, end users are already tablet ninjas. That&#8217;s why there will be a gap between what IT services can deliver and users&#8217; expectations. I also believe that native applications deliver the experience that people expect. If you deliver a classic web app on a tablet, employees won&#8217;t feel the benefits and they will wait until they are in front of a PC to interact with your app. By the way, I don&#8217;t think that tablet devices will replace laptops or PC. Sometimes, it will be complementary, and sometimes yes, there will be some cannibalization. If you look at the enterprise apps developed on tablets in 2011, they were mainly targeting three populations: the top managers, the sales force and the inspectors. Top managers need a real-time access to strategic information. They want dashboards to accelerate and improve their decision making time. The sales force uses tablets for two reasons. It&#8217;s a fantastic device to showcase the products  you&#8217;re selling, and it&#8217;s also a nice way to interact with the CRM. Inspectors, or employees that need to audit external environments, are naturally using tablets to access technical information, capture data in the field and collaborate. Tomorrow, anyone is a potential tablet candidate. Even I as a developer, I can imagine having a tablet with a companion app, helping me browsing the AS3 doc for instance (I think that someone had this idea before me&#8230; more to come&#8230;).</p>
<p>Flex developers can answer these new needs very easily. We are in pole position. If we embrace a Design-Driven Development methodology, we&#8217;ll be very successful. DDD consists of defining the technical infrastructure of your solution based on the user experience. The UI is here to solve end users&#8217; problems, and the system serves the UI. If you build a system-centric application on a tablet, with a UI that reflects the system, then you&#8217;ll fail. I hope that tablets will boost the Design-Driven methodology in large organizations. It would also increase the number of Rich Internet Applications. Today, RIA frameworks (and especially Flex) are much more mature than enterprise IT services.  Even with the best technology, if IT services stick to their traditional way of developing products, they will fail again and again. Flex developers need to become DDD sponsors.</p>
<p>Here is the recording of my presentation. You&#8217;ll also find my slides (hosted by SlideShare) at the end of this article.</p>
<p>&nbsp;</p>
<p></p> 
<div id="__ss_9558667" style="width:425px;"><strong style="display:block;margin:12px 0 4px;"><a rel="nofollow" title="Enterprise Flex applications on tablet devices" target="_blank" href="http://www.slideshare.net/mchaize/enterprise-flex-applications-on-tablet-devices">Enterprise Flex applications on tablet devices</a></strong> <embed id="__sse9558667" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=adobemaxtablets-111005095326-phpapp02&amp;stripped_title=enterprise-flex-applications-on-tablet-devices&amp;userName=mchaize"/> 
<div style="padding:5px 0 12px;">View more <a rel="nofollow" target="_blank" href="http://www.slideshare.net/">presentations</a> from <a rel="nofollow" target="_blank" href="http://www.slideshare.net/mchaize">Michael Chaize</a></div>
</div>
<div class="tweetthis" style="text-align:left;"><p> <a rel="nofollow" class="tt" target="_blank" href="http://twitter.com/share?url=http://www.riagora.com/2011/10/tablet-devices-and-enterprise-apps/&text=Tablet+devices+and+Enterprise+apps&via=mchaize&related=richardxthripp%2Ctweetthisplugin" title="Post to Twitter"><img class="nothumb" src="http://www.riagora.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-micro3.png" alt="Post to Twitter"/></a></p></div><div id="google_plus_one"></div>]]></content:encoded>
      </item>
   </channel>
</rss>
<!-- fe2.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 21:48:37 UTC 2015 -->
