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

<channel>
	<title>Appcelerator Developer Center</title>
	<atom:link href="http://developer.appcelerator.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://developer.appcelerator.com/blog</link>
	<description>Appcelerator Developer Blog</description>
	<lastBuildDate>Mon, 17 Jun 2013 22:23:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Announcing Titanium 3.1.1 Production Release</title>
		<link>http://developer.appcelerator.com/blog/2013/06/announcing-titanium-3-1-1-production-release.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/06/announcing-titanium-3-1-1-production-release.html#comments</comments>
		<pubDate>Mon, 17 Jun 2013 22:22:43 +0000</pubDate>
		<dc:creator>Ingo Muschenetz</dc:creator>
				<category><![CDATA[ @en]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mobile Web]]></category>
		<category><![CDATA[release_3.1]]></category>
		<category><![CDATA[Tizen]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21251</guid>
		<description><![CDATA[I am pleased to announce the general availability of our latest Titanium release, version 3.1.1.  In this minor release we addressed over 125 bugs fixes and included several enhancements. For a full list of all changes and improvements in this release, please read the release notes. Android Enhancements Google Maps v2  Support “userLocationButton” property Allows developers to [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce the general availability of our latest Titanium release, version 3.1.1.  In this minor release we addressed over 125 bugs fixes and included several enhancements. For a full list of all changes and improvements in this release, please read the <a href="http://docs.appcelerator.com/titanium/release-notes/?version=3.1.1.GA">release notes</a>.</p>
<h3>Android Enhancements</h3>
<ul>
<li>Google Maps v2
<ul>
<li> Support “userLocationButton” property
<ul>
<li>Allows developers to turn on/off the user location button.</li>
</ul>
</li>
<li> Support “regionchanged” event
<ul>
<li>Provides the delta of the latitude and longitude.</li>
</ul>
</li>
<li>Support “isGooglePlayServicesAvailable”
<ul>
<li>Allow developers to determine if Google Play Services are available for the app</li>
</ul>
</li>
</ul>
</li>
<li>Camera
<ul>
<li>Support “savePhotoToGallery” property. Previously, photos were automatically stored in the gallery. This property gives you the control to store or not store the photos.</li>
</ul>
</li>
</ul>
<h3>BlackBerry Beta</h3>
<p>This release also includes the latest version of our BlackBerry SDK beta, with integrated Studio support for creating and running BlackBerry apps.</p>
<h3>Changes That Require Your Attention</h3>
<ul>
<li>Android SDK 2.3.3
<ul>
<li>We have increased the minimum Android SDK support from 2.2 to 2.3.3.</li>
</ul>
</li>
<li>iOS 5.x
<ul>
<li>We have increased the minimum supported version of iOS from 4.3.x to 5.x.</li>
</ul>
</li>
<li>Change of the calendar namespace
<ul>
<li>If you are using the calendar in Android our namespace has changed from Titanium.Android.Calendar to Titanium.Calendar. This means that you will have to change any areas of your code referencing Titanium.Android.Calendar to Titanium.Calendar.</li>
</ul>
</li>
</ul>
<h3>Downloading 3.1.1</h3>
<p>For new users, download Titanium 3.1.1 by clicking <a title="Signup for Titanium" href="https://my.appcelerator.com/auth/signup" target="_blank">here</a>.</p>
<p>For existing Titanium Studio users, you will be prompted to update automatically on the next restart. You can also manually check for updates by selecting the “Check for Titanium SDK Updates” from the “Help” menu within Titanium Studio.</p>
<p><strong>If you previously installed the Release Candidate versions of the Titanium CLI and Alloy</strong>, that is, <em>npm install titanium@3.1.1-cr</em>, or any -beta or -cr packages, you need to first uninstall these components before installing or updating to 3.1.1.GA. The <a href="http://docs.appcelerator.com/titanium/release-notes/?version=3.1.1.GA">release notes</a> contain specific instructions on how to do so.</p>
<p>As always I want to thank our 470,000 strong community of developers for your constant feedback and support.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/06/announcing-titanium-3-1-1-production-release.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Upcoming ACS changes: user session and geo query</title>
		<link>http://developer.appcelerator.com/blog/2013/06/upcoming-acs-changes-user-session-and-geo-query.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/06/upcoming-acs-changes-user-session-and-geo-query.html#comments</comments>
		<pubDate>Wed, 12 Jun 2013 05:56:42 +0000</pubDate>
		<dc:creator>Wei Kong</dc:creator>
				<category><![CDATA[ACS]]></category>
		<category><![CDATA[Node.ACS]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21209</guid>
		<description><![CDATA[We try to be as transparent as possible about important changes that could impact your development. To that end, we are planning to roll out two ACS changes in next couple of months that may impact your application. Application User Session Expiration An application user session never expires today.  We are introducing the policy of [...]]]></description>
			<content:encoded><![CDATA[<p>We try to be as transparent as possible about important changes that could impact your development. To that end, we are planning to roll out two ACS changes in next couple of months that may impact your application.</p>
<h3><strong>Application User Session Expiration</strong></h3>
<p>An application user session never expires today.  We are introducing the policy of expiring and removing sessions that have been inactive for 6 months.</p>
<p>How does it affect your application?  If your application logins a user and saves the session_id, normally stored in a cookie, every time it makes a <a href="http://docs.appcelerator.com/cloud/latest/#!/api">REST call</a> to ACS using the same session_id, the expiry clock is reset and the user gets another 6 months. As long as the ACS user is active using the same session_id within 6 months, there is no impact on your application and current logged in user. If an application user is completely inactive for 6 months or more, this user session is removed and any subsequent ACS call that requires user login such as create.json, update.json and delete.json will get a 404 error. We recommend your application can handle an invalid user session error and prompts a login screen to the user to login again.</p>
<h3><span style="font-size: 1.17em;">Geo Query</span></h3>
<p>ACS also currently supports MongoDB’s <a href="http://docs.mongodb.org/manual/reference/operator/nearSphere/">$nearSphere</a> Geo Query.  Geo Query requires a field to be indexed with a geo index.  The ACS fields you can perform $nearSphere on are <em>lnglat</em> (pre-defined location data and only available in <a href="http://docs.appcelerator.com/cloud/latest/#!/api/Places">places</a> and <a href="http://docs.appcelerator.com/cloud/latest/#!/api/Events">events</a>) and <em>coordinates</em> (list of custom defined location data and available in all objects).  It implies that places and events have two geo indexes in the same collection and that prevents us from supporting <a href="http://docs.mongodb.org/manual/reference/command/geoNear/">$geoNear</a> operation that is more powerful than $nearSphere.  We will consolidate <em>lnglat</em> value with <em>coordinates</em> values and remove geo index on <em>lnglat</em> field.</p>
<p>How does it affect your application?  For events and places, even if you never explicitly copied <em>lnglat</em> value to coordinates, <em>lnglat</em> will appear as the first element of <em>coordinates</em>.  Performing $nearSphere on <em>coordinates</em> field will return a match if it matches the <em>lnglat</em> value.  $nearSphere query on <em>lnglat</em> or <em>coordinates</em> will continue to work as before.</p>
<h3>Questions?</h3>
<p>Please post your questions on Appcelerator <a href="http://developer.appcelerator.com/questions/tag/acs">Q&amp;A forum</a> with &#8220;ACS&#8221; tag or leave your comments on this blog post.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/06/upcoming-acs-changes-user-session-and-geo-query.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a custom front-end to ACS using Node.ACS [Part 2]</title>
		<link>http://developer.appcelerator.com/blog/2013/06/building-a-custom-front-end-to-acs-using-node-acs-part-2.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/06/building-a-custom-front-end-to-acs-using-node-acs-part-2.html#comments</comments>
		<pubDate>Tue, 11 Jun 2013 21:47:23 +0000</pubDate>
		<dc:creator>Ricardo Alcocer</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21121</guid>
		<description><![CDATA[On my previous post we went through the process of setting up a Node.ACS app, and understanding the basics of its built-in MVC framework. It&#8217;s now time to integrate ACS back-end services. Our main goal for this mini-project is to use a responsive framework (Bootstrap) to provide a custom, clutter-free front-end for ACS. Think about [...]]]></description>
			<content:encoded><![CDATA[<style>
.appc_code{
background-color: #000;
color: #f2f2f2;
padding: 5px;
margin: 5px;
}
</style>
<p>On my <a href="/blog/2013/05/building-a-custom-front-end-to-acs-using-node-acs-part-1.html" target="_blank">previous post</a> we went through the process of setting up a Node.ACS app, and understanding the basics of its built-in MVC framework. It&#8217;s now time to integrate ACS back-end services. Our main goal for this mini-project is to use a responsive framework (<a href="http://twitter.github.io/bootstrap/" target="_blank">Bootstrap</a>) to provide a custom, clutter-free front-end for ACS. Think about it this way: You&#8217;re using ACS to store locations. Why give your client access to ALL of ACS, just to curate data? ACS&#8217; interface is designed for the developer, not for the end-user. We&#8217;ll build a phone and tablet-friendly web user interface what will allow them to easily enter data into the system. So let&#8217;s get started!</p>
<h2>Structure of our website:</h2>
<p><center><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/nodeacs3.png" alt="" /></center></p>
<p>We&#8217;ll have a Login screen that will be used to login against the ACS User service. Upon successful login, the user will see a screen displaying a list of places that will be part of the ACS Places service. This screen will provide options for Adding and Deleting places, as well as launching a &#8220;Google Map&#8221; when a location is clicked. On the top navigation area we&#8217;ll have two links, About and Contact with sample content only to illustrate linking and session management. The website will look like this:</p>
<p><center><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/nodeacs4.png" alt="" /></center></p>
<h2>App.js</h2>
<p>In this file you initialize your website and your session with ACS.</p>
<div class="appc_code">
<pre>var ACS = require('acs').ACS;
var ACS_KEY='YOUR_ACS_KEY';
var ACS_SECRET='YOUR_ACS_SECRET';

// initialize app
function start(app, express) {
     app.use(express.favicon(__dirname + '/public/images/favicon.ico'));          //set favicon

     // this line is explained @
     // http://docs.appcelerator.com/cloud/latest/#!/guide/node_mvc
     app.use(express.session({ key: 'node.acs', secret: ACS_SECRET }));

     ACS.init(ACS_KEY, ACS_SECRET);
}</pre>
</div>
<h2>Config.json</h2>
<div class="appc_code">
<pre>{
  "routes":
  [
    { "path": "/", "callback": "application#index" },
    { "path": "/error", "callback": "application#error" },
    { "path": "/home", "callback": "home#home" },
    { "path": "/login", "method":"post", "callback": "useraccess#login" },
    { "path": "/logoff", "callback": "useraccess#logoff" },
    { "path": "/about", "callback": "application#about" },
    { "path": "/contact", "callback": "application#contact" },
    { "path": "/api/delete", "callback": "api#deleterec" },
    { "path": "/api/addplace", "method":"post","callback": "api#addrec" }
  ],
  "filters":
  [
    {"path": "/home", "callback": "session_filter#validateSession"},
    {"path": "/about", "callback": "session_filter#validateSession"},
    {"path": "/contact", "callback": "session_filter#validateSession"},
    {"path": "/api/delete", "callback": "session_filter#validateSession"},
    {"path": "/api/add", "callback": "session_filter#validateSession"}
  ],
  "websockets":
  [
    { "event": "", "callback": ""}
  ]
}</pre>
</div>
<p>This file is in many ways the heart of your app. Here you define how the user is allowed to interact with the website, or how a page should interact with another. The first section, the routes, are a fundamental part of an MVC website. Defining this section is part of your website planning process and provides you a clear idea of how your website will behave.</p>
<table style="border: 1px solid;" width="75%">
<thead>
<tr>
<th>Path</th>
<th>Method</th>
<th>File</th>
<th>Function</th>
</tr>
<tr>
<td>/</td>
<td>GET</td>
<td>application</td>
<td>index</td>
</tr>
<tr>
<td>/error</td>
<td>GET</td>
<td>application</td>
<td>error</td>
</tr>
<tr>
<td>/home</td>
<td>GET</td>
<td>home</td>
<td>home</td>
</tr>
<tr>
<td>/login</td>
<td>POST</td>
<td>useraccess</td>
<td>login</td>
</tr>
<tr>
<td>/logoff</td>
<td>GET</td>
<td>useraccess</td>
<td>logoff</td>
</tr>
<tr>
<td>/about</td>
<td>GET</td>
<td>application</td>
<td>about</td>
</tr>
<tr>
<td>/contact</td>
<td>GET</td>
<td>application</td>
<td>contact</td>
</tr>
<tr>
<td>/api/delete</td>
<td>GET</td>
<td>api</td>
<td>deleterec</td>
</tr>
<tr>
<td>/api/addplace</td>
<td>POST</td>
<td>api</td>
<td>addrec</td>
</tr>
</thead>
</table>
<p>&nbsp;</p>
<p>I have stored functions in different files, but only for organization purposes. This is more an issue of your personal programming style. You can certainly use a single file for all your functions. This table should be read like: When the user browses to /home, I will execute the home function inside /controllers/home.js and the data will be available via GET.</p>
<p>Now let&#8217;s look at the filters section, which has a similar format.</p>
<table style="border: 1px solid;" width="75%">
<thead>
<tr>
<th>Path</th>
<th>File</th>
<th>Function</th>
</tr>
<tr>
<td>/home</td>
<td>session_filter</td>
<td>validateSession</td>
</tr>
<tr>
<td>/about</td>
<td>session_filter</td>
<td>validateSession</td>
</tr>
<tr>
<td>/contact</td>
<td>session_filter</td>
<td>validateSession</td>
</tr>
<tr>
<td>/api/delete</td>
<td>session_filter</td>
<td>validateSession</td>
</tr>
<tr>
<td>/api/add</td>
<td>session_filter</td>
<td>validateSession</td>
</tr>
</thead>
</table>
<p>All entries are using the same function inside the same file. This block is actually providing a way for us to protect certain areas of our website. Instead of having to validate the user session by code on every page, we set a filter on the pages we want to protect. The validateSession function simply verifies the validity of the session. If invalid redirects to error page, if valid, control is returned to the page controller.</p>
<div class="appc_code">
<pre>
function validateSession(req, res, next) {
  if(!req.session.session_id) {
    res.redirect('/error');
  } else {
    next();
  }
}
</pre>
</div>
<h2>ACS</h2>
<p>Access to ACS methods is consistent with <a href="http://developer.appcelerator.com/blog/2013/05/using-acs-as-a-back-end-for-your-app.html" target="_blank">the way you&#8217;d used them with Titanium</a>, where you call the method and pass an object and a callback.</p>
<p>For our login method, we grab data from the HTTP POST and then send to ACS.</p>
<div class="appc_code">
<pre>
function login(req,res){
    ACS.Users.login({
        // grab data from http post
        login: req.body.username,
        password: req.body.password
    }, function(data) {
    	if (data.success){
    		// set session data to be used later througout the app
		req.session.session_id=data.meta.session_id;
                req.session.user_id=data.users[0].id;
		req.session.fullname=data.users[0].first_name + ' ' +
data.users[0].last_name;
                // the "home" controller will pick it up
		res.redirect('/home');
    	}else{
    		res.redirect('/error');
    	}
    });
}
</pre>
</div>
<p>When the user successfully logs in, he/she is taken to Home, where a list of Places is displayed. The controller for the &#8220;Home&#8221; template looks like this:</p>
<div class="appc_code">
<pre>
function home(req, res) {
	ACS.Places.query({
        order: "-created_at" // new on top
    }, function(data) {
        if(data.success) {
            console.log(data);
            res.render('home', {
                                title: 'Beer Places',
                                places:data.places,
                                page:'Home',
                                fullname:req.session.fullname
                                });
        } else {
            res.send('Error occured. Error code: ' + data.error + '.
Message: ' + data.message);
        }
    })
}
</pre>
</div>
<p>The line that reads <strong>res.render(&#8216;home&#8217;,{})</strong> is sending some data to the View, and one of these pieces is the actual places array that was returned by ACS. This Array is send as a static, client-side array to the view. The templating engine can now loop through the array and write the rows in HTML.</p>
<div class="appc_code">
<pre>
&lt;tbody&gt;
&lt;% places.forEach(function(place){ %&gt;
  &lt;tr id="&lt;%=place.id%&gt;"&gt;
    &lt;td&gt;&lt;%=place.name%&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%=place.city%&gt;&lt;/td&gt;
    &lt;td&gt;&lt;%=place.phone_number%&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href="http://maps.google.com/?q=&lt;%=place.name%&gt;@
&lt;%=place.latitude%&gt;,&lt;%=place.longitude%&gt;" target="_blank"
title="Map"&gt;Map&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href="javascript:void(0);" onClick="deleterec('&lt;%=place.id%&gt;')"
title="Delete"&gt;&lt;div style="text-align: center"&gt;
&lt;i class="icon-remove-circle"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/a&gt;
&lt;/td&gt;
  &lt;/tr&gt;
&lt;%    }) %&gt;
&lt;/tbody&gt;
</pre>
</div>
<p>If you look closely, you&#8217;ll see that the <strong>places</strong> array effectively is available to the template. Also notice that you can execute Javascript code by encapsulating it in <strong></strong>tags, in this case performing a forEach loop on the Places array, and displaying HTML rows. Just remember, when you want to execute Javascript code you use <strong>&lt;%= your_code %&gt;</strong> and to echo values you use <strong>&lt;% your_variable %&gt;</strong>.</p>
<h2>An API on top of an API</h2>
<p>You could use Node.ACS to provide high-level methods, an API if you like, that interact with the ACS API. An example of this technique is providing a &#8220;delete&#8221; method that in turn will call the ACS delete place method. Why do this? Well, for one, you don&#8217;t want to have your API key available in your Javascript source. With this method, your API key resides inside Node.ACS, that is in the server-side. Another reason could be because you&#8217;d like to perform other operations with the data returned by ACS, perhaps even return a new JSON string to your front-end. If you look at our Javascript code for deleting a record, it looks like this:</p>
<div class="appc_code">
<pre>
function deleterec(recid){
      var r=confirm("Delete this record?");
      if (r==true){
          $.ajax({
            url: '/api/delete/?id=' + recid,
            type: 'GET',
            success: function(data) {
              location.href='/home';
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                //alert("Status: " + textStatus);
                //alert("Error: " + errorThrown);
            }
        });
      }
    }
</pre>
</div>
<p>NOTE: In a real-world scenario you&#8217;d want to provide a more secure way of deleting your records and not by simply calling a Delete URL with your record id, but those security measures are out of the scope of this post.</p>
<p>Using Node.ACS&#8217; built-in is really fun.  The fact of not having to install a web server is a very convenient feature, and being able to take advantage of node.js definitely provides virtually endless possibilities. </p>
<p>The full source code for this example is available at <a href="https://github.com/ricardoalcocer/nodeacs_sample_website" target="_blank">https://github.com/ricardoalcocer/nodeacs_sample_website</a>, simply fork/clone, add your own ACS Key and Secret, and hack away. This is a sample/proof-of-concept so feel free to send me pull request with error corrections or features you&#8217;ve added to the project.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/06/building-a-custom-front-end-to-acs-using-node-acs-part-2.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Support for iOS 7</title>
		<link>http://developer.appcelerator.com/blog/2013/06/support-for-ios-7.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/06/support-for-ios-7.html#comments</comments>
		<pubDate>Tue, 11 Jun 2013 14:49:42 +0000</pubDate>
		<dc:creator>Neeraj Gupta</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21191</guid>
		<description><![CDATA[The big news of the day at WWDC in San Francisco was the unveiling of iOS 7. Judging from the reaction, there&#8217;s no reason to believe that iOS 7 won&#8217;t fulfill Tim Cook&#8217;s promise of being &#8220;the most significant update to the mobile operating system since its introduction on the iPhone in 2007&#8243;. New features [...]]]></description>
			<content:encoded><![CDATA[<p>The big news of the day at WWDC in San Francisco was the unveiling of iOS 7.</p>
<p>Judging from the reaction, there&#8217;s no reason to believe that iOS 7 won&#8217;t fulfill Tim Cook&#8217;s promise of being &#8220;the most significant update to the mobile operating system since its introduction on the iPhone in 2007&#8243;.</p>
<p>New features in this release include:</p>
<ul>
<li>Improved controls and notifications</li>
<li>Multi-tasking interface and responsiveness to motion for apps</li>
<li>AirDrop content sharing</li>
<li>In-car integration</li>
<li>Personal security enhancements</li>
</ul>
<p>&nbsp;</p>
<p>We have already downloaded the beta and have successfully recompiled and run a few simple apps on top of it. No doubt you&#8217;ll be doing the same and looking for new and innovative ways to take advantage of these new capabilities.</p>
<p>Rest assured that we are committed to delivering support in the Appcelerator Platform and Titanium on the day it is released.</p>
<p>In the meantime, please share with us and the rest of the community your feature requests and requirements for iOS7-specific support, as well as any issues, via the Titanium Community JIRA. <a href="https://jira.appcelerator.org/browse/TC" target="_blank">https://jira.<wbr>appcelerator.org/browse/TC</wbr></a></p>
<p>Stay tuned for more information as we get closer to the general availability of iOS 7 in the fall.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/06/support-for-ios-7.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Featured App Spotlight &#8211; SV Waldhof Mannheim</title>
		<link>http://developer.appcelerator.com/blog/2013/06/featured-app-spotlight-sv-waldhof-mannheim.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/06/featured-app-spotlight-sv-waldhof-mannheim.html#comments</comments>
		<pubDate>Mon, 10 Jun 2013 15:48:38 +0000</pubDate>
		<dc:creator>Gregory DiPaolo</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21164</guid>
		<description><![CDATA[Today’s featured spotlight comes from Kenan Sulayman. Kenan and his team built a slick soccer app that enables users to follow multiple teams in one app and get live feeds and extensive player information on the go. Hear more about how Kenan tackled this feat using Titanium. Why did you pick Titanium for your development [...]]]></description>
			<content:encoded><![CDATA[<p><em>Today’s featured spotlight comes from Kenan Sulayman. Kenan and his team built a <a title="SV Waldhof Mannheim" href="https://itunes.apple.com/de/app/sv-waldhof-mannheim/id570686656?mt=8" target="_blank">slick soccer app</a> that enables users to follow multiple teams in one app and get live feeds and extensive player information on the go. Hear more about how Kenan tackled this feat using Titanium.</em></p>
<hr />
<p><strong>Why did you pick Titanium for your development needs?</strong></p>
<p><img style="float: left; height: 128px; padding-right: 20px;" src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/waldhof_002.png" alt="Waldhof" /> Titanium is awesome. It&#8217;s open unlike other platforms and can be modified as we want, when we want.</p>
<p>We didn&#8217;t chose native SDKs because we wanted flexibility, fast development speed and extensibility; we are Javascript-gurus and have background as architects using node.js-powered Cloud-solutions. (scalable web-apps, innovative database solutions and real time communication)</p>
<p><strong>Tell us a little bit about choosing your development option</strong></p>
<p>So we had the basic concept of &#8220;that&#8221; soccer app. We asked how we could do something really innovative and beautiful, while keeping spent resources low, and creativity and flexibility at maximum.</p>
<p>There were many development options we considered, including Sencha Touch and PhoneGap. We even considered Adobe’s “Publish to iOS” feature. We explored these options because everyone on our team feared the Objective-C mess that would happen if we tried to use it in an extremely dynamic way.</p>
<p>Ultimately, this is why we chose Titanium and the ability to leverage Javascript to build solid and native experiences for mobile devices.</p>
<p><strong>Can you describe the app in more detail?</strong></p>
<p>We wanted an innovative <a title="SV Waldhof Mannheim" href="https://itunes.apple.com/de/app/sv-waldhof-mannheim/id570686656?mt=8" target="_blank">soccer app</a> that combined real-time information with user-interaction. This includes information about every player &#8211; his interests, pictures, per-game information, live-ticker, etc. and a platform on which everything could thrive.</p>
<p>We didn&#8217;t just build an app, we built an app sandbox! Titanium makes it extremely easy to customize an app so that we could not only implement several teams into one app, but also have the opportunity to easily extend the app to be a white-label product: this allows us to build unique experiences for as many teams as possible — without reinventing the wheel each time.</p>
<p><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/waldhof.png" alt="" /></p>
<p><strong>What development problems did you face prior to using Titanium?</strong></p>
<p>We faced several problems with the app including memory leaks that we had to chase down, the complexity of plain Objective-C compromising our creativity and lastly the deployment time of updates and hotfixes.</p>
<p><strong>Can you walk me through how your team developed this application?</strong></p>
<p>We sat down with our designer and built a concept for many pages. We then decided on the the most efficient way of implementation. Do we use deep-nested Views, templated Views, etc. We even thought about using UIWebViews.</p>
<p>We wanted a truly dynamic application, so we built a skeleton which got data from the server and outputted it. Then we made that data redundant, making it available offline.</p>
<p>We then started the design of the app. First, we got the navigation bar beautiful, then we placed the logo on top of everything. We split our scrum into each window and feature. It was astonishingly easy from there on &#8211; development from top to bottom.</p>
<p>We even were able to build functions generating a whole window subsystem … something which would be extremely messy and complex in Objective-C. For instance, when we want to display game information, we have a global controller which dynamically checks every parameter before the window is generated: orientation, current page, usage history, etc. This generates each window as dynamically as possible.</p>
<p>The development took 6 months, which boils down to 3 1/2 months if we leave out logistical problems (contact with the team, their ideas and feedback, and of course other projects).</p>
<p><strong>How does Titanium fit into your future development plans?</strong></p>
<p>Through this process we gained a ton of experience using Titanium. To keep our skills sharp, we have a hackathon each month and recently we were able to build an app in just 5 hours. It was a home automation application (the backend was implemented with node.js, a few Raspberry Pi&#8217;s, serial connectors and some hacked-together on-off controllers (for light) and one thermometer sensor).</p>
<p>The development is so easy and straightforward that we can build everything our creativity allows us to do. We go from idea to concept in one or two days, and then to a finished app in one month (depending on complexity — the dynamic nature of the soccer app is waaay more complicated than the home-automation system).</p>
<p><strong>What kind of database, content, or cloud services are you accessing?</strong></p>
<p>For the database we&#8217;re using PHP/MySQL on one server as a data aggregation for news and other static data. For dynamic data (i.e. publish-subscribe messaging system for the live-ticker), it’s determined based on the device (performance, capacity, internet speed, etc.) what type of connection routine is used. We also use a server side parser of the static data and data streams from third-party sources, a content provider for dynamic data like games and we use a plain Node.js / LevelDB configuration for everything which has to be quick and fast.</p>
<p>For the content we’re using a database for in-app data. We built an update distribution system which can update the app without losing our AppStore rating. With Titanium this is easy since we are unable leave the Javascript-sandbox and can’t in any way execute malicious code.</p>
<p>We&#8217;re using Titanium Analytics, Google Analytics and a self-built analytics system. Our own backends and cloud-solutions are backed by Level3, AWS EC2 and Elastic Load Balancing.</p>
<p><strong>What kind of native features are you using in your app?</strong></p>
<p>We’re using the native UI, video (MP4s from YouTube), the camera, a SQL database and geolocation for analytics and cache data using direct file system access with indices stored as JSON.</p>
<hr />
<p>Big thanks to Kenan for taking the time to give us some insight into his experience and success with Titanium app development. Interested in having your Titanium app showcased? Send us an email at community@appcelerator.com and share your story with us!</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/06/featured-app-spotlight-sv-waldhof-mannheim.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Building a custom front-end to ACS using Node.ACS [Part 1]</title>
		<link>http://developer.appcelerator.com/blog/2013/05/building-a-custom-front-end-to-acs-using-node-acs-part-1.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/05/building-a-custom-front-end-to-acs-using-node-acs-part-1.html#comments</comments>
		<pubDate>Fri, 31 May 2013 21:28:42 +0000</pubDate>
		<dc:creator>Ricardo Alcocer</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21059</guid>
		<description><![CDATA[With Titanium you use Javascript to build native mobile Apps. With Node.ACS you now can use Javascript to write your back-end code, with super easy access to ACS database and storage, all hosted on our secure and scalable cloud infrastructure. As an added advantage, your local Node.ACS installation is a self-contained environment, that doesn&#8217;t require [...]]]></description>
			<content:encoded><![CDATA[<style>
.appc_code{
background-color: #000;
color: #f2f2f2;
padding: 5px;
margin: 5px;
}
</style>
<p>With Titanium you use Javascript to build native mobile Apps.  With Node.ACS you now can use Javascript to write your <a href="http://developer.appcelerator.com/blog/2013/05/appcelerator-node-acs-financial-stock-watch-list.html" target="_blank">back-end code</a>, with super easy access to <a href="http://www.appcelerator.com/cloud/" target="_blank">ACS database and storage</a>, all hosted on our secure and scalable cloud infrastructure.  As an added advantage, your local Node.ACS installation is a self-contained environment, that doesn&#8217;t require you to install a local web server for testing.  As you will see later on, when you run a Node.ACS app, it is automatically listening for requests on a given HTTP Port; you just have to point your browser to it!</p>
<h2>Getting started</h2>
<p>Assuming you have <a href="http://docs.appcelerator.com/titanium/latest/#!/guide/Installing_Node" target="_blank">Node and NPM</a>, open up a terminal/command window and type:</p>
<div class="appc_code">
$ sudo npm install -g acs
</div>
<p>This will install Node.ACS globally on your computer.  To start using it you need to login to your appcelerator account by typing:</p>
<div class="appc_code">
$ acs login
</div>
<p>Now that you have successfully logged in, you&#8217;re ready to create your first app.  Change to the folder where you&#8217;d like your app to live, for example <b>cd ~/Documents/MyApps</b> and type:</p>
<div class="appc_code">
$ acs new MyFirstApp
</div>
<p>This command will create for you a new folder with the name of your new app.  Now change to that folder (<b>cd MyFirstApp</b>) and you&#8217;ll see the files that were created for you.  I&#8217;ll explain them later.
<p>To run the app, simply type:</p>
<div class="appc_code">
$ acs run
</div>
<p>Your terminal/command window will show something like this:</p>
<p><center><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/nodeacs0.png" /></center></p>
<p>When you run your app, Node.ACS is actually setting up a local server for you and at this point it is waiting for connections.  As you can see in the screenshot above, ACS is listening on port 8080.  This means that all you need to do is browse to that address.  Launch up your web browser and point it to http://localhost:8080 and you&#8217;ll see this:</p>
<p><center><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/nodeacs1.png" /></center></p>
<p>This HTML page is being served by your local Node.ACS server, but it&#8217;s much more than this.  Node.ACS has a full-featured MVC framework based on <a href="http://expressjs.com/" target="_blank">ExpressJS</a>.  If you go to your application folder you&#8217;ll see that some files and folders were created for you.</p>
<p><center><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/nodeacs2.png" /></center></p>
<p>These folders/files are explained in more detail in <a href="http://docs.appcelerator.com/cloud/latest/#!/guide/node_mvc" target="_blank">this page</a>, so make sure you check it out.  However, I&#8217;ll explain how to work with some of these files from a practical standpoint, and in the process we&#8217;ll create a complete website.</p>
<h2>Building a Website </h2>
<p>If you&#8217;re new to MVC this will probably take some time reading the code, testing and re-reading, but simply because of how MVC separates concerns.  With an MVC framework, your pages(views) are static.  When you want to make them dynamic, you pass static information to them.  A templating engine then takes over to render the static page with new dynamic data.  If you come from a background of developing websites using a &#8220;traditional&#8221; paradigm, MVC may feel weird at first.  If you have worked with other MVC frameworks before, they you will feel right at home.  In any case, MVC is arguably the best way of writing scalable applications.</p>
<p>If you go to your &#8220;Views&#8221; folder, you&#8217;ll see a file named &#8220;index.ejs&#8221;.  Instead of an HTML extension, it is using EJS.  The reason for this is that Node.ACS is using <a href="http://embeddedjs.com/" target="_blank">Embedded Javascript</a> as its templating engine.</p>
<div class="appc_code">
<pre>
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
     &lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;
    &lt;link rel='stylesheet' href='/css/style.css' /&gt;
  &lt;/head&gt;
  &lt;body&gt;
       &lt;h2&gt;Node.ACS&lt;/h2&gt;
    &lt;p&gt;&lt;%= title %&gt;&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
</div>
<p>Notice <b><%= title %></b> inside the Title Tag and the Body.  This is the way you tell EJS to insert dynamic data into your template.  <b>Title</b> in this case is a variable that was sent to the template before getting it rendered and sent to the browser.  The benefit of using these templates is that you build your HTML as a static page, and use placeholders during your design process to represent dynamic data.  When your page is ready to be implemented, you simply change the dynamic parts to use the corresponding variable name and save the file with .ejs extension.  To show the page with dynamic data, you use the page controller, which you can find under controllers/application.js.</p>
<div class="appc_code">
<pre>
function index(req, res) {
     res.render('index', { title: 'Welcome to Node.ACS!' });
}
</pre>
</div>
<p>This function is receiving two objects: req and res.  As their names imply, req has information about how the user got here (the request), and res holds information and provides methods to take the user some place else (the response).</p>
<p>In this example we&#8217;re using the &#8220;render&#8221; method of the res object.  This method is receiving the name of the view, and an object with all the variables that you&#8217;d like to make available to your view, in this case title, and the static template gets rendered with this new data.  If you change the value of title, you&#8217;ll see it changing on the browser.  However your server is still running with a previous version of your files.  You need to stop the server and restart it because that part of the Javascript function is already running and changes will not take effect until you run it again.  This is as simple as going to your terminal, hitting CTRL+C to break the execution, and running &#8220;acs run&#8221; again; or simply pressing the &#8220;up&#8221; key on your keyboard which will type it for you.</p>
<p>We&#8217;re still missing one important detail.  How do we tell the framework that the &#8220;main&#8221; page of your app will be handled by the <b>index</b> function that lives inside application.js?  You configure these mapping (or route as they&#8217;re called) in config.json.
<div class="appc_code">
<pre>
{
  "routes":
  [
    { "path": "/", "callback": "application#index" }
  ],
  "filters":
  [
        { "path": "/", "callback": "" }
  ],
  "websockets":
  [
       { "event": "", "callback": ""}
  ]
}
</pre>
</div>
<p>In this file we&#8217;re saying that when you browse to the home page, it will execute the function index inside application.js.  We&#8217;ll see more about filters in the second part of this post, and websockets are explained <a href="http://docs.appcelerator.com/cloud/latest/#!/guide/node_quickstart-section-3" target="_blank">here</a>.</p>
<p>For simplicity, let&#8217;s create a trivial page that will be displayed when navigating to /newpage.</p>
<h3>Step 1:  Create your route by adding it to your config.json</h3>
<div class="appc_code">
<pre>
[
    { "path": "/", "callback": "application#index" },
    { "path": "/newpage", "callback": "newpage#newpage" }
]
</pre>
</div>
<h3>Step 2: Write the &#8220;newpage&#8221; function in newpage.js.  I&#8217;m using a separate file for illustration purposes.</h3>
<div class="appc_code">
<pre>
function newpage(req,res){
     res.render('newpage', { greeting: 'I am the new page' });
}
</pre>
</div>
<h3>Step 3: Create the template called newpage and make sure it is using the new variable &#8220;greeting&#8221;.</h3>
<div class="appc_code">
<pre>
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
     &lt;title&gt;&lt;%= greeting %&gt;&lt;/title&gt;
    &lt;link rel='stylesheet' href='/css/style.css' /&gt;
  &lt;/head&gt;
  &lt;body&gt;
       &lt;h2&gt;Node.ACS&lt;/h2&gt;
    &lt;p&gt;&lt;%= greeting %&gt;&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
</div>
<p>Restart your server and browse to your page.  Then change the URL to http://localhost:8080/newpage and you&#8217;ll see the new page.</p>
<p>These are the basic principles for building websites using Node.ACS.  To learn more about the EJS templating engine and how you can use loops, arrays and other fun Javascript features, go to <a href="http://embeddedjs.com/getting_started.html" target="_blank">http://embeddedjs.com/getting_started.html</a>.  To learn more about the &#8220;response&#8221; and &#8220;request&#8221; objects, you can go to <a href="http://expressjs.com/api.html#req.params" target="_blank">http://expressjs.com/api.html#req.params</a>.  </p>
<p>If you want to publish your website for everyone to see, simply type</p>
<div class="appc_code">
$ acs publish
</div>
<p>Node.ACS will give you a public URL in return.  The next time you publish, use the &#45;&#45;force parameter to tell Node.ACS to overwrite your previous pages.</p>
<h2>Final thoughts</h2>
<p>This is a full-featured web MVC framework.  You can use anything you&#8217;d normally use when developing websites, such as JQuery or Bootstrap.  Just make sure that any library you use, or any dependency for that matter, is saved in the /public folder.  From your views, the /public folder is the root folder, so if you placed an image at /public/image.png, from your view you would reference it like &lt;img src=&#8221;/image.png&#8221; /&gt;</p>
<p>Stay tuned for the second part of this post, where we&#8217;ll apply this concepts to build a custom front-end to ACS.</p>
<h3>Have fun!</h3>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/05/building-a-custom-front-end-to-acs-using-node-acs-part-1.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>3.1.1 Release Candidate of Titanium SDK/Studio Now Available</title>
		<link>http://developer.appcelerator.com/blog/2013/05/3-1-1-release-candidate-of-titanium-sdkstudio-now-available.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/05/3-1-1-release-candidate-of-titanium-sdkstudio-now-available.html#comments</comments>
		<pubDate>Fri, 24 May 2013 21:53:12 +0000</pubDate>
		<dc:creator>Ingo Muschenetz</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile Web]]></category>
		<category><![CDATA[release_3.1]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[Tizen]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21047</guid>
		<description><![CDATA[We&#8217;re pleased to announce the release candidate of an update to our 3.1.0 version of Titanium SDK/Studio. Version 3.1.1 brings hundreds of fixes and improvements across both products. Today, we&#8217;re asking you to help test out the release and provide feedback before it becomes generally available in early June. Note: This is a pre-production release, [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re pleased to announce the release candidate of an update to our 3.1.0 version of Titanium SDK/Studio. Version 3.1.1 brings hundreds of fixes and improvements across both products. Today, we&#8217;re asking you to help test out the release and provide feedback before it becomes generally available in early June.</p>
<p>Note: This is a pre-production release, and as such may contain regressions or other issues. Please do not use it in production, and keep backups of all important projects and data. <strong>If you find an issue, please report it in <a href="http://jira.appcelerator.org">JIRA</a></strong> with a reproducible test case. <strong>We ask you provide feedback by Wednesday, 5/29.</strong></p>
<h3>How to Update</h3>
<p>These are links to continuous integration builds. To install them, choose &#8220;Help Menu &gt; Install Specific Titanium SDK…&#8221; from inside Titanium Studio.</p>
<ul>
<li><a href="http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_1_X/mobilesdk-3.1.1.v20130523143543-osx.zip">OSX</a></li>
<li><a href="http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_1_X/mobilesdk-3.1.1.v20130523143543-linux.zip">Linux</a></li>
<li><a href="http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_1_X/mobilesdk-3.1.1.v20130523143543-win32.zip">Windows</a></li>
</ul>
<p>To update Studio, please visit <a href="http://preview.appcelerator.com/">http://preview.appcelerator.com</a> and follow the instructions to update to the RC stream, or to download a new install.</p>
<h3>NPM Packages</h3>
<div><em>Note: You may need to use &#8216;sudo&#8217; before these terminal commands on OSX and Linux</em></div>
<pre>npm install -g <a href="mailto:alloy@1.1.3-alpha">alloy@1.1.3-alpha</a>
npm install -g <a href="mailto:titanium@3.1.1-alpha">titanium@3.1.1-alpha</a></pre>
<div>To revert back to stable versions:</div>
<pre>npm remove -g titanium
npm install -g titanium
npm remove -g alloy
npm install -g alloy</pre>
<h3>Updates in Titanium 3.1.1</h3>
<p>Read the complete <a href="http://docs.appcelerator.com/titanium/release-notes/?version=3.1.1.RC">Release Notes</a>. A full list of updates is available <a href="http://jira.appcelerator.org/secure/IssueNavigator.jspa?mode=hide&amp;requestId=15204">here</a>.</p>
<p><strong>Changes in supported OS versions</strong></p>
<p>3.1.1 now has a minimum supported Android version of 2.3.3 (API level 10). The minimum iOS supported version is 5.x, which requires Xcode 4.3 or later.</p>
<p><strong>API Changes</strong></p>
<p>We&#8217;ve updated Titanium.Calendar, and deprecated Titanium.Android.Calendar.</p>
<p><strong>Tooling updates</strong></p>
<p>Support for Android r22 tooling. See <a href="http://developer.appcelerator.com/blog/2013/05/updating-to-android-r22-tools.html">Updating to Android r22 Tools</a> for information about supporting older SDKs. Note that this beta still has some issues with r22 tooling on Windows, but this will be addressed in the final release.</p>
<p><strong>Google Maps Support</strong></p>
<p>We added a new userLocationButton property and updated the regionchanged event.</p>
<p><strong>BlackBerry Support</strong></p>
<p>We&#8217;ve folded in the latest version of our BlackBerry platform to this release. It&#8217;s no longer a separate download.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/05/3-1-1-release-candidate-of-titanium-sdkstudio-now-available.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Updating to Android r22 Tools</title>
		<link>http://developer.appcelerator.com/blog/2013/05/updating-to-android-r22-tools.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/05/updating-to-android-r22-tools.html#comments</comments>
		<pubDate>Thu, 23 May 2013 21:06:15 +0000</pubDate>
		<dc:creator>Ingo Muschenetz</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21038</guid>
		<description><![CDATA[Recently Google released an update (r22) to their Android developer tooling. This update has rearranged the directory structure of the tools and breaks the building of Android projects both from the CLI and inside Titanium Studio. Unless you need the updated functionality we recommend you hold off updating for now. How do I know if [...]]]></description>
			<content:encoded><![CDATA[<p>Recently Google released an update (r22) to their Android developer tooling. This update has rearranged the directory structure of the tools and breaks the building of Android projects both from the CLI and inside Titanium Studio. Unless you need the updated functionality we recommend you hold off updating for now.</p>
<h3>How do I know if I&#8217;ve run into this issue?</h3>
<p>See <a href="https://jira.appcelerator.org/browse/TIMOB-13944" target="_blank">TIMOB-13944</a>. You&#8217;ll get a failure similar to &#8220;TypeError: argument of type &#8216;NoneType&#8217; is not iterable&#8221;</p>
<h3>How do I fix this problem?</h3>
<p>There are a number of different ways to address the issue, depending on your goals:</p>
<p>If you want to use just the very latest version of the SDK, download the pre-release 3.1.1 build from <a href="http://builds.appcelerator.com.s3.amazonaws.com/index.html#3_1_X" target="_blank">http://builds.appcelerator.com.s3.amazonaws.com/index.html#3_1_X</a></p>
<p>If you need  to use prior versions of the SDK:</p>
<ul>
<li>You can create symlinks between the old and new locations of the test tools:
<ul>
<li>ln -s /Applications/Android-sdk/build-tools/17.0.0/aapt aapt ln -s /Applications/Android-sdk/build-tools/17.0.0/dx dx</li>
</ul>
</li>
<li>You can download the previous version of the tools:
<ul>
<li><strong>Linux</strong>: <a href="http://dl.google.com/android/android-sdk_r21.1-linux.tgz" target="_blank">http://dl.google.com/android/android-sdk_r21.1-linux.tgz</a></li>
<li><strong>OS X:</strong> <a href="http://dl.google.com/android/android-sdk_r21.1-macosx.zip" target="_blank">http://dl.google.com/android/android-sdk_r21.1-macosx.zip</a></li>
<li><strong>Windows:</strong> <a href="http://dl.google.com/android/android-sdk_r21.1-windows.zip" target="_blank">http://dl.google.com/android/android-sdk_r21.1-windows.zip</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/05/updating-to-android-r22-tools.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Featured Developer &#8211; ArtistBox</title>
		<link>http://developer.appcelerator.com/blog/2013/05/featured-developer-artistbox.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/05/featured-developer-artistbox.html#comments</comments>
		<pubDate>Thu, 23 May 2013 20:14:46 +0000</pubDate>
		<dc:creator>Gregory DiPaolo</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=21024</guid>
		<description><![CDATA[Today&#8217;s featured blog post comes from the creators of ArtistBox, Lucica Ibanescu and Titan Dan Tamas. ArtistBox is a sexy Titanium app that provides detailed information, news and music from your favorite artists. Learn more about their experience with Titanium below. We&#8217;d like to share with you our story on how we built ArtistBox and [...]]]></description>
			<content:encoded><![CDATA[<p><em>Today&#8217;s featured blog post comes from the creators of <a title="ArtistBox" href="https://itunes.apple.com/us/app/artistbox/id636197114?ls=1&amp;mt=8" target="_blank">ArtistBox</a>, <a title="Lucica" href="https://twitter.com/nosoloweb" target="_blank">Lucica Ibanescu</a> and Titan <a title="Dan Tamas" href="http://twitter.com/dan_tamas" target="_blank">Dan Tamas</a>. ArtistBox is a sexy Titanium app that provides detailed information, news and music from your favorite artists. Learn more about their experience with Titanium below.</em></p>
<hr />
<p>We&#8217;d like to share with you our story on how we built <a title="ArtistBox" href="https://itunes.apple.com/us/app/artistbox/id636197114?ls=1&amp;mt=8" target="_blank">ArtistBox</a> and to give you some insights on how we solved the (not a few) issues that we had.</p>
<p><strong>What&#8217;s ArtistBox?</strong></p>
<p>Artistbox is an iPhone application that finds the most complete information about your favourite artists: their biography, discography, news, concerts in your area and worldwide, videoclips, pictures and similar artists.</p>
<p>We strive to gather way more information than any other music discovery app on the market &#8211; for example by adding up-to-date news or hi-res pictures &#8211; and for the next versions we will add more cool features.</p>
<p><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/artistbox-bg.png" alt="" /></p>
<p><strong>Why Titanium and why not native?</strong></p>
<p>The app has two components: a client side &#8211; the app itself &#8211; and a server side. The whole app was build in five months by just two programmers <a title="Dan Tamas" href="http://twitter.com/dan_tamas" target="_blank">@dan_tamas</a> and <a title="Nosoloweb" href="https://twitter.com/nosoloweb" target="_blank">@nosoloweb</a> and we feel that coding it in objC wouldn&#8217;t have given us such an advantage from the time point of view.</p>
<p>There are many other reasons we chose Titanium:</p>
<ul>
<li>depending on how the app sells we might want to go cross platform and build an Android version. In this case we will only have to work on the UI side of the app while anything else will remain untouched and working out of the box.</li>
<li>the fact that with a few lines of code we could have a working proof of concept was an amazing advantage over doing mockups and then implementing them in the code.</li>
<li>we are very proficient with Appcelerator but we don&#8217;t know objC so we used what we knew best</li>
<li>we bootstrapped this so the development cost was only in hours of work and not having to pay one or more objC programmers was a real boost.</li>
<li>we developed the server in NodeJS at the same time with the app. Developing both the app and the server side in Javascript instead of JS and objC helped us keep the focus on the building proccess.</li>
</ul>
<p>&nbsp;<br />
&nbsp;</p>
<p><strong>What issues did you need to overcome</strong></p>
<p>At this point we&#8217;d like to get a little more technical and explain how we managed to overcome the problems we had with the app.</p>
<p>One issue was the amount of the XHR calls we had to make. When the app opens it fetches all the artists in the device&#8217;s music library and also basic data for each of them. As you can see in the screenshot the application is very visual, we have a lot of images and each artis will have a lot of information:</p>
<p><img src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/artistbox-activemenu.png"></p>
<p><strong>Way too many XHR calls</strong></p>
<p>Our main goal was to make a very responsive app and due to the amount of server calls we had to find a balance between the information sent from the server and the number of calls. So we decided to go with many calls that return a small amount of information. The overall time the user has to wait might be bigger in this case but the app doesn&#8217;t lock and the feedback received is really fast.</p>
<p>We hit a wall here because the ASIHttpRequest &#8211; the objC library Titanium uses on the native side &#8211; has a limit of 4 concurrent requests. The rest of the requests are put in a queue and executed when the previous calls finish.</p>
<p>What ASI does is perfectly correct, there is no point in overloading the network with too may concurrent requests but in our case the user would have had to wait for ALL the images from the previous windows to load in order to be able to receive the current window information.</p>
<p>We modified the <a title="XHR Library" href="https://github.com/raulriera/XHR" target="_blank">XHR</a> library to be able to handle a queue and priorities and we set the images to have the lowest priority while the artist information (JSON data) has the highest priority. At the JS level we limit the simultaneous requests for the images at only 3 so we always have a free slot on the native side for the data &#8211; higher priority requests are passed to ASI immediately.</p>
<p>Of course we take advantage of the caching that XHR does and we have a request to the server only once: the first time a new resources is requested or when the time to live expired. This way after the initial load the number of global requests decreases drastically.</p>
<p><strong>Blocking the UI</strong></p>
<p>The images are diplayed in tableViewRows and if we had put the source of the image directy in the imageView the UI would have locked until the image was loaded.</p>
<p>What we did was create the image **but without** the source property, download the image locally and save it then populate the source with the local file URL. This way the table will scroll normally and the pictures will be loaded one by one giving the user a way better experience.</p>
<p><strong>Youtube clips</strong></p>
<p>We have to display lots of videoclips from Youtube which can be done in two ways:</p>
<ol>
<li>open the clip in mobile Safari or the Youtube app. This meant making the user leave ArtistBox and it was not an acceptable option.</li>
<li>use webviews to load the clip &#8211; not a good approach as we had to keep the memory footprint as low as possible.</li>
</ol>
<p>We came with a different approach: each time the user taps on a clip the app makes a call to the mobile version of the Youtube site, finds the streaming link and opens a videoplayer with the source URL set to this streaming link.</p>
<p>The disadvantage is that the user will have to wait for an extra request to the Youtube servers but the overhead is not too big. The fact that he/she can see the videoclip right inside the app makes it worth it.</p>
<p>There were a few more aspects we had to take care of. The first one was to show very clearly that the videos are coming from Youtube so we designed the thumbnails with the big &#8220;Youtube&#8221; watermark. We also had to filter the results within the Youtube APIs to return only the videos allowed to run on mobile and also in the user&#8217;s country.</p>
<p>You can <a title="Titanium YT Player module" href="https://github.com/rborn/TitaniumYoutubePlayer" target="_blank">download the module from Github</a>, it is MIT licensed.</p>
<p>We believe that the complexity of <a title="ArtistBox" href="https://itunes.apple.com/us/app/artistbox/id636197114?ls=1&amp;mt=8" target="_blank">ArtistBox</a> pushed the Titanium framework to the limits as we are using a large number of its APIs in our app (tableViews, videoPlayer, audioPlayer, lots of imageViews, scrollableViews, httpClient, localStorage, UI transtions, webviews, etc) and not always in a common way. But we also believe that Titanium was the right choice and it reached our expectations :)</p>
<p>There are also a few modules we used and we want to thank their creators:</p>
<p>- a modified version of <a title="XHR" href="https://github.com/raulriera/XHR" target="_blank">XHR</a> by Raul Riera<br />
- <a title="TiNetworkHelpers" href="https://github.com/benbahrenburg/TiNetworkHelpers" target="_blank">TiNetworkHelpers</a> by Ben Bahrenburg<br />
- a modified version of <a title="Ti Mini Browser" href="https://github.com/Nyvra/TiMiniBrowser" target="_blank">TiMiniBrowser</a> by Rafael Kellermann Streit</p>
<p><strong>Enough talking, let&#8217;s see some action</strong></p>
<p><iframe src="http://player.vimeo.com/video/64870332" width="250" height="430" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/64870332">ArtistBoxApp</a> from <a href="http://vimeo.com/artistboxapp">ArtistBox App</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><a href="http://vimeo.com/64870332">ArtistBoxApp</a> from <a href="http://vimeo.com/artistboxapp">ArtistBox App</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>Final words</strong></p>
<p><a title="ArtistBox" href="https://itunes.apple.com/us/app/artistbox/id636197114?ls=1&amp;mt=8" target="_blank">ArtistBox</a> is a very complex application that has to deal with a huge amount of information while also being memory leaks free. Making it stable and very fast were our main purposes because the users are very sensitive when it comes to huge loading times and repeated crashes. Being able to offer them so much info about their favourite artists while displaying the UI in an instant were two very challenging tasks that we hope we completed successfully. You can see we&#8217;re not trying to be modest here, test the app for yourselves and <a title="ArtistBox feedback" href="https://twitter.com/artistboxapp" target="_blank">let us know what you think</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/05/featured-developer-artistbox.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Appcelerator Participates in NASA’s International Space Apps Challenge</title>
		<link>http://developer.appcelerator.com/blog/2013/05/appcelerator-participates-in-nasas-international-space-apps-challenge.html</link>
		<comments>http://developer.appcelerator.com/blog/2013/05/appcelerator-participates-in-nasas-international-space-apps-challenge.html#comments</comments>
		<pubDate>Thu, 16 May 2013 21:11:55 +0000</pubDate>
		<dc:creator>Gregory DiPaolo</dc:creator>
				<category><![CDATA[ @en]]></category>

		<guid isPermaLink="false">http://developer.appcelerator.com/blog/?p=20988</guid>
		<description><![CDATA[Last month, NASA hosted the International Space Apps Challenge &#8211; a 48-hour hackathon that invited citizens from around the world to collaborate to create open-source solutions for problems NASA faces both in space and here on Earth. NASA released a list of more than 50 challenges for hackathon teams to tackle, including a wide range [...]]]></description>
			<content:encoded><![CDATA[<p>Last month, NASA hosted the <a title="Space Apps Challenge" href="http://spaceappschallenge.org/" target="_blank">International Space Apps Challenge</a> &#8211; a 48-hour hackathon that invited citizens from around the world to collaborate to create open-source solutions for problems NASA faces both in space and here on Earth. NASA released a list of more than 50 challenges for hackathon teams to tackle, including a wide range of topics such as solar flare, star maps, space stations and renewable energy. Teams could sign up to participate virtually from anywhere  in the world.</p>
<p>We are proud that a few teams from the Appcelerator community participated in the International Space Apps Challenge, and we are excited to showcase their work. Great job, everyone!</p>
<hr />
<p><em>by Ketan Majmudar</em></p>
<p><a title="Project T-10" href="http://spaceappschallenge.org/project/t-10/" target="_blank">Project: T-10</a> (pronounced “T-Minus Ten”)</p>
<p><strong>Team (Appcelerator community): </strong><br />
Kate Arkless Gray <a title="SpaceKate" href="https://twitter.com/SpaceKate" target="_blank">@SpaceKate</a><br />
João Neves <a title="jpgneves" href="https://twitter.com/jpgneves" target="_blank">@jpgneves</a><br />
Ketan Majmudar <a title="ketan" href="https://twitter.com/ketan" target="_blank">@ketan</a><br />
Dario Lofish <a title="dariolofish" href="https://twitter.com/dariolofish" target="_blank">@dariolofish</a></p>
<p><strong>The Challenge</strong>: <a title="Spot the Station" href="http://spaceappschallenge.org/challenge/spot-the-station/ " target="_blank">Spot the Station</a></p>
<p>NASA recently launched the <a title="Spot the station" href="http://spotthestation.nasa.gov" target="_blank">Spot the Station website</a>, which allows people to spot the space station and sign up for alerts when it flies overhead. The tasks were to:</p>
<ul>
<li>“Extend the functionality of the Spot the Station site by building an app that allows you to share your sightings with others.”</li>
<li>“Create a visualization with Spot the Station data.”</li>
</ul>
<p><strong>The Solution:</strong></p>
<p><iframe src="http://player.vimeo.com/video/65257119" frameborder="0" width="500" height="281"></iframe></p>
<p><a href="http://vimeo.com/65257119">T-10</a> from <a href="http://vimeo.com/user2099078">João Neves</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>Overview</strong></p>
<p>Our goal was to set up an alert to help astronauts on the International Space Station (ISS) take images of planet Earth under their specific desired circumstances. For example, they might want a picture of London with clear skies or a picture of New York during a thunderstorm.</p>
<p>The T-10 app allows astronauts to select cities of interest, time of day and the weather condition required. This data is then sent to our server, which waits for the correct conditions and finds the next scheduled times the ISS will be over the city in question. When both city and weather conditions are met, a push notice is sent to the app and provides an alert 10 minutes before the ISS will enter visibility of that city, giving astronauts enough time to prepare to take the photo.</p>
<p><img class="aligncenter" src="http://www.appcelerator.com.s3.amazonaws.com/blog/dev/t-10-blog.jpg" alt="" /></p>
<p>When the T-10 countdown begins, it also sends a push alert to any ground users who have the app installed and would like to send a digital wave back to the ISS and the astronauts aboard. This two-way communication creates a social connection and sense of unity, promoting the knowledge that people on Earth and in space are waving at each other.</p>
<p>In future updates, we hope to add the ability to add the #ISSWave hashtag to share pictures to and from the ISS and Earth. We also intend to add more complex controls to manage when and how alerts get stored and shared with others.</p>
<p><strong>Getting Started</strong></p>
<p>I signed up for the International Space Apps Challenge in London, held at the Google Campus in East London. I had been invited to take part in a European space apps hack recently, but due to working commitments, I completely missed it. When I saw the announcement for the International Space Apps challenge, I signed up as quickly as I could. Being a NASA-driven event just added to the awesomeness of the hackathon. My main goal was just to participate, and I wasn&#8217;t even intending to take part seriously in the challenge aspect. I was more than happy to network and tinker with some cool ideas and people over the weekend.</p>
<p>A very early start on Saturday morning was a challenge in itself, having been up late every night for the past two weeks working on the SCI-FI-LONDON film festival app, but I felt it was my duty to make the effort for this hackathon. To be honest, I didn&#8217;t know what kind of people would be present or if I would have the energy to stick through a whole weekend. I went in expecting to build an app using the Patino game engine for Titanium, as I’m on the private beta &#8211; perhaps a cosmic windchime or mapping related to a comet or near-Earth object. But in the midst of the opening pitches and the multitude of available broad challenges to choose from, fate and social connections led us to form our team and the app T-10.</p>
<p>I tweeted Kate Arkless Gray (<a title="SpaceKate" href="https://twitter.com/SpaceKate" target="_blank">@SpaceKate</a>) &#8211; whom I&#8217;d met through Bill Thompson (<a title="billt" href="https://twitter.com/billt" target="_blank">@billt</a>), a technology journalist who works for the BBC Click Radio programme &#8211; and we connected with an idea to build an alerting app system which related to current earth weather patterns. Although my original idea was more Earth-bound, Kate had actually asked astronauts from the ISS if they would use an app that would tell them when the weather was good so they could take snaps of the planet! This was a cool plan, and we set it in motion.</p>
<p>Kate&#8217;s friend Joao Neves (<a title="jpgneves" href="https://twitter.com/jpgneves" target="_blank">@jpgneves</a>), a software engineer and Android hacker from Stockholm, came on board, and we decided to use Titanium as the core of the application and build a server component. What I most enjoy about the Titanium platform is that it allows me to take the foundation of my learned skill sets and apply it to something amazing that is inclusive within the mobile community. Targeting multiple platforms is awesome, and being JavaScript-based, Titanium has helped me embrace the language in a way I never would have before.</p>
<p><strong>The Process</strong></p>
<p>We had to make sure we had the right APIs on hand and a suitable user-flow. We found a table that would be our home for the next 12 hours and had an open recruitment office in the form of stickies on the edge of our table. We sat and began coding an app that would use ACS push notifications and a bunch of open-source Titanium scripts. We had so much fun building, designing and conceptualising the app and solution that we wanted to weave a few more ideas in, knowing that we could never achieve the Flickr pool upload, share integration and Earth-based &#8220;wave&#8221; functionality that would enable people on the ground to send a virtual wave to the ISS as it flew over.</p>
<p>When our fourth team member, designer Dario Lofish (<a title="Dariolofish" href="https://twitter.com/dariolofish" target="_blank">@dariolofish</a>), logged on, our dream team was complete. We all connected online, made sure we were in tune with the concept and approach, then got back to our roles.</p>
<p>As fate would have it, the ISS was due to fly over London at around 9:30, and Kate dragged us (plus about 10 others) so we could see it fly over. Then back to the hacking. Under normal circumstances, we would have stayed all night, but by 22:30, I bailed to the far recesses of North London, promising to return the following morning.</p>
<p>App design during hackathons can be crazy, but we managed to have clear roles and had a simple core concept that we were all behind. Titanium made it easy to prototype ideas and integrate design ideas on the fly quickly.</p>
<p><strong>Highlights &amp; Insights</strong></p>
<p>Our demo at the end of the day went really well, and I demonstrated the functionality of setting and sending the event from my iPhone 4S plugged directly into the projector, with push notification responses. It was a real joy to be part of the team behind T-10, and I&#8217;m proud of the ease and speed with which our team locked into the development process and how easy we made all of our jobs seem.</p>
<p>I was pleased to see a lot of mobile solutions come out of the weekend, many of them trying to take complex space data and put them into the hands of ordinary people in a way that makes sense. There were some superb, inspiring solutions that bridged the gap between software and hardware. It was also incredible to see the cooperation and coordination of people, some in the same room, some located all over the world. Since I was 10, I have had this odd dream to become a developer &#8211; back then it was just a desire to be a computer programmer. Mobile development has suddenly become a huge business and one that has moved in from the fringe of society into an evolving and ever-shifting set of features and parameters. With every year, new concepts, gestures and devices evolve and play a role in how our societies interact with the world around us. It is very cool and exciting to be part of that change.</p>
<p>At the end of the hackathon, we were so excited when they announced that we had been chosen by the judges as one of the two winning London Challenge teams! We are hoping that we will do well in the global round coming up and that our app will be featured in the Victoria and Albert Museum as part of the Digital Futures: <a title="Urban Open Street Event" href="http://www.vam.ac.uk/whatson/event/2481/digital-futures-urban-open-space-3776/" target="_blank">Urban Open Space event</a>.</p>
<p>We are now in the People&#8217;s Choice voting phase, so you can vote for <a title="Project voting" href="http://spaceappschallenge.org/project/t-10/" target="_blank">T-10 via Twitter</a>. Wish us luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://developer.appcelerator.com/blog/2013/05/appcelerator-participates-in-nasas-international-space-apps-challenge.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
