<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0MNRnc5eSp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498</id><updated>2011-11-27T19:18:17.921-05:00</updated><category term="future" /><category term="mobile" /><category term="sandbox" /><category term="transcode" /><category term="play framework" /><category term="android" /><category term="documentation" /><category term="git" /><category term="textile" /><category term="groovy" /><category term="collaboration" /><category term="secure" /><category term="script" /><category term="m4u" /><category term="developer" /><category term="cloud" /><category term="computing" /><category term="acs" /><title>Positively Disruptive</title><subtitle type="html">Insider's perspective on software that changes our world</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://positivelydisruptive.blogspot.com/" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PositivelyDisruptive" /><feedburner:info uri="positivelydisruptive" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUYBQXs-fyp7ImA9WhdbFkQ.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-7042608444493441340</id><published>2011-10-15T11:39:00.000-04:00</published><updated>2011-10-15T11:39:10.557-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-15T11:39:10.557-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="developer" /><category scheme="http://www.blogger.com/atom/ns#" term="textile" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="collaboration" /><category scheme="http://www.blogger.com/atom/ns#" term="play framework" /><title>Simple textile documentation site</title><content type="html">After spending a few hours trying to setup decent sites with Drupal, MediaWiki and a few others, I decided that this time would be better served by creating my own simple site for my needs. I based my work on Play Framework and reused a few lines of their documentation module to create a simple yet powerful developer documentation platform. You can have a look at &lt;a href="http://dev.ambientreflex.com/"&gt;http://dev.ambientreflex.com/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Play is a very powerful framework offering development cycles similar to what we may find with scripting languages like PHP, with the power of the Java platform (libraries, tooling, type-safety and more). I started my project yesterday at 11PM (talk about a nice way to spend a friday night!) and completed it this morning. Overall, from idea to production, it took me something like 6 hours of work... not bad! Ok, I already had an EC2 machine, already configured with Play, Gitosis and Lighttpd reverse proxy, but that would have add maybe an extra hour or so.&lt;br /&gt;
&lt;br /&gt;
The resulting workflow is very interesting. I've cloned my Git documentation repo and modify all textile files locally with my text editor. When I push my commits to my server, a post-update hook copy all files to a folder on my server where my Play app load them. This enables easy collaboration where all developers can easily &amp;nbsp;contribute to the platform documentation, while maintaining a strong integrity, revisions, branching, etc.&lt;br /&gt;
&lt;br /&gt;
I've open sourced the code under the MIT license, so, do whatever you want and try to contribute back if you create useful stuff! Use our &lt;a href="http://dev.ambientreflex.com/install_server"&gt;installation guide&lt;/a&gt; to get started!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-7042608444493441340?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Rlnis331Gl6uji89q6PpIbvVuqE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rlnis331Gl6uji89q6PpIbvVuqE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Rlnis331Gl6uji89q6PpIbvVuqE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rlnis331Gl6uji89q6PpIbvVuqE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/EpHRMkavW9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/7042608444493441340/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2011/10/simple-textile-documentation-site.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/7042608444493441340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/7042608444493441340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/EpHRMkavW9A/simple-textile-documentation-site.html" title="Simple textile documentation site" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2011/10/simple-textile-documentation-site.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08FRX45fyp7ImA9WhdSF0k.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-6493812322344746770</id><published>2011-07-27T00:43:00.000-04:00</published><updated>2011-07-27T00:43:34.027-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-27T00:43:34.027-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sandbox" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="secure" /><category scheme="http://www.blogger.com/atom/ns#" term="script" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Scripting in the cloud</title><content type="html">I decided to push a little bit more regarding executing script code in a shared server environment. For our Ambient Vibes platform, we're looking at letting user/developer create pattern sensors that will trigger an action based on certain patterns in a given user Vibes (a stream of business events). Actions may be anything as we dont' want to restrict to specific ones. So, naturally, the solution is to execute a script in the context of the given user. It's working well at the moment, we've selected the Groovy language, which is compatible with our Java VM and offer good support to write high-level DSLs to help users describe what they want to do instead of programming it.&amp;nbsp;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;But the barrier to opening Ambient Vibes to the public, is our incapacity, at the moment, to easily monitor script execution to detect misbehaving scripts and kill them. Of course, scripts run within a very limited sandbox, thanks to the solid security foundation inherited from the Java platform. But, while we may control the classpath, control what code can be executed, what resources may or may not be accessed by the script, we're still pretty open to dumb scripts performing tight loops, allocating tons of memory and other good jokes like these. By the very nature of our system, we let unsecured scripts enter our application space and we have to keep them secure.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;This is why we launch the Kevlar project with the goal to enable easy embedding of Groovy scripts within a monitored and secure environment. Our goal is to let developer configure the Kevlar Groovy shell to listen to specific events (high memory allocation for example) and respond accordingly (prevent the allocation, log a warning, etc).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Our goal is to gradually enhance our protections to include all memory or cpu "attacks" and also add a complete permission system , like Android, to control imports, or access to declared services. Our goal is to inject all indicated resources in the script environment and control its execution.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;For now, you may track the evolution of project Kevlar through this blog. We'll setup a GitHub project soon.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-6493812322344746770?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JHbpTHA5rUhDW30i90pPGh5wz1U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JHbpTHA5rUhDW30i90pPGh5wz1U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JHbpTHA5rUhDW30i90pPGh5wz1U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JHbpTHA5rUhDW30i90pPGh5wz1U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/aPv46PEVt10" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/6493812322344746770/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2011/07/scripting-in-cloud.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/6493812322344746770?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/6493812322344746770?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/aPv46PEVt10/scripting-in-cloud.html" title="Scripting in the cloud" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2011/07/scripting-in-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8HQXw5fSp7ImA9WhZXGUk.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-1295131785272200527</id><published>2011-05-09T08:40:00.000-04:00</published><updated>2011-05-09T08:40:30.225-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T08:40:30.225-04:00</app:edited><title>JQuery Mobile Ajax Caching</title><content type="html">JQuery Mobile is a very good mobile UI framework. I use it for mobile version of web sites or in conjunction with PhoneGap to create portable mobile apps. One interesting aspect of the framework is that you can mix and match local and remote pages. JQM seamlessly loads any remote pages from your server as if it was on the page. It's a cool feature.&lt;br /&gt;
&lt;br /&gt;
By default, the first time the page is loaded but further times, it is cached locally for performance. This is causing issues with dynamic content. For example, I have a Google Maps on a page and it's being shown only the first time. I get old pages with wrong state, pretty annoying.&lt;br /&gt;
&lt;br /&gt;
Documentation state that you may disable ajax loading in mobileinit bootstrap function, but doing this, you disable ALL ajax for all pages, which is not usually what you want.&lt;br /&gt;
&lt;br /&gt;
The real solution was proposed in this &lt;a href="http://forum.jquery.com/topic/using-jqurey-mobile-without-the-ajax-caching-stuff"&gt;post&lt;/a&gt;&amp;nbsp;and has been very helpful for me than. Just add this code in your primary HTML page (the one that is initially loaded when you start, index.html?)&lt;br /&gt;
&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;      $(function(){  
           $('div').live('pagehide', function (event, ui) {  
             var $this = $(this);  
             if ($this.attr('ID') !== undefined &amp;amp;&amp;amp; $this.attr('data-cache') !== undefined &amp;amp;&amp;amp; $this.attr('data-cache') == "never") {  
               var page = $this.attr('ID');  
               $(document.getElementById(page)).remove();  
             }  
           });  
      });  
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
With this code, you can now control caching on a per-page basis by adding &lt;b&gt;data-cache='never'&lt;/b&gt; to your page div.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-1295131785272200527?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PFb9kax1BiHPBm0bUed2MUdayzE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PFb9kax1BiHPBm0bUed2MUdayzE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PFb9kax1BiHPBm0bUed2MUdayzE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PFb9kax1BiHPBm0bUed2MUdayzE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/2yHQNUjMJKc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/1295131785272200527/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2011/05/jquery-mobile-ajax-caching.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/1295131785272200527?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/1295131785272200527?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/2yHQNUjMJKc/jquery-mobile-ajax-caching.html" title="JQuery Mobile Ajax Caching" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2011/05/jquery-mobile-ajax-caching.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIAQ347fSp7ImA9WhZTFU4.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-5102112597025145867</id><published>2011-03-14T19:51:00.001-04:00</published><updated>2011-03-19T08:09:02.005-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-19T08:09:02.005-04:00</app:edited><title>Upcoming Play Framework 1.2</title><content type="html">Those who think Java is dead may not be aware of the wonderful web framework developed by Guillaume Bort and his team: Play! I've been using it for more than one year now and I have to say that this is by far the most productive framework I've seen. I've used all Java frameworks (yes all!) in quest of fast build-cycles, easy testing and a complete yet not closed stack where I could concentrate on generating business value instead of messing with underlying dependencies. Play! is fast to learn (good doc) and you get to find advanced features available, easy to use, well packaged, each time you need something.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In &lt;a href="http://groups.google.com/group/play-framework/msg/ed1cae8ab39f15a8?pli=1"&gt;this post &lt;/a&gt;on their forum related to the upcoming Play! 1.2, Guillaume advertise a number of asynchronous features with the same user friendliness and nice packaging we've expected from Play! Play was already a nice solution for asynchronous web request processing, but with 1.2, they integrate WebSockets, a better continuation support and various other constructs that will make your life easier and your app incredibly fast and lightweight.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;If you're a Java developer and you need to create a powerful web site (including web services, json, xml and any RESTFul) give Play! a try!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-5102112597025145867?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TV8aQWJsHq-DQa0qQ4rtNN1E3cM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TV8aQWJsHq-DQa0qQ4rtNN1E3cM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TV8aQWJsHq-DQa0qQ4rtNN1E3cM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TV8aQWJsHq-DQa0qQ4rtNN1E3cM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/qlRhb9OYIMc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/5102112597025145867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2011/03/upcoming-play-framework-12.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/5102112597025145867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/5102112597025145867?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/qlRhb9OYIMc/upcoming-play-framework-12.html" title="Upcoming Play Framework 1.2" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2011/03/upcoming-play-framework-12.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EHQ34-cSp7ImA9Wx5RFU0.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-4705253963775053975</id><published>2010-08-18T11:14:00.002-04:00</published><updated>2010-08-22T15:33:52.059-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-22T15:33:52.059-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="future" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="computing" /><title>Computing Fragmentation</title><content type="html">With the rapid growth of intelligent phones and other mobile computing devices, the Internet is more and more used on the go. Morgan Stanley analysts &lt;a href="http://mashable.com/2010/04/13/mobile-web-stats/"&gt;predict&lt;/a&gt; that the mobile web will be bigger than the desktop web by 2015. I think that’s a believable projection, I would even say that it may be even faster.&lt;br /&gt;
&lt;br /&gt;
From the computing side, we need to go farther than the mobile or not concerns and understand what patterns of computing will emerge from this new paradigm. If you look at the computing trends of the past 30 years, people were installing applications and performing all separate tasks in each one. These limitations were often due to the lack of communication capacity and the way applications were distributed. But in the mobile web, people connect to the Internet, get whatever they need for a specific task and jump to the next. Our computing devices are more and more task or activity oriented (like Android), letting people assemble their applications as they need, for the current requirements.&lt;br /&gt;
&lt;br /&gt;
We see the same thing with web sites. You go to google, than google maps, than view photos in Flickr or video in Youtube, get a tips from Yelp and make a reservation using another web site. Web sites are more and more task oriented, integrating for the time of a transaction, to fit the current user needs. For me, this is where computing is going. Our mobile devices will become our assembling tool to create applications on the fly based on the task we want to achieve. We must think of our web applications as components in this big realtime application assembling game. Current mashup technologies are a good start toward supporting this, but they need to improve semantically and they most be extensible and customizable on a transaction basis.&lt;br /&gt;
&lt;br /&gt;
The mobile web is a realtime, personal, task-driven experience. For now, we’re mobile, with a glimpse of task orientation emerging on certain devices.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-4705253963775053975?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/siJmdqievOr3q3zcUMRBKk_wSgg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/siJmdqievOr3q3zcUMRBKk_wSgg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/siJmdqievOr3q3zcUMRBKk_wSgg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/siJmdqievOr3q3zcUMRBKk_wSgg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/DWZr_1tAYGY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/4705253963775053975/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2010/08/computing-fragmentation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/4705253963775053975?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/4705253963775053975?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/DWZr_1tAYGY/computing-fragmentation.html" title="Computing Fragmentation" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2010/08/computing-fragmentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AQ34_cCp7ImA9Wx5SE0U.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-9068575233059160079</id><published>2010-08-09T15:42:00.000-04:00</published><updated>2010-08-09T15:42:22.048-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-09T15:42:22.048-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="acs" /><category scheme="http://www.blogger.com/atom/ns#" term="transcode" /><category scheme="http://www.blogger.com/atom/ns#" term="m4u" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>ACS Transcode Sample available</title><content type="html">Following &lt;a href="http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html"&gt;my post&lt;/a&gt; on transcoding media files on the cloud with ACS, I'm happy to announce that you can now download the Transcode sample&amp;nbsp;&lt;a href="http://github.com/Pyxoid/acs/tree/master/samples/transcode/"&gt;source code&lt;/a&gt; and connect to ACS to transcode M4A files. To build the application, you just need to clone the ACS repository in your workspace using GIT and import acs-protocol, acsclient and transcode in Eclipse (or your preferred IDE). Of course, you need Android SDK and a 2.2 phone or emulator.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You can install the cloud-phone from the cloned GIT repo or simply install the latest production version from the Android market. You will be prompted to create a free account and as soon as your cloud-phone is connected, you're ready to transcode!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Keep in mind that ACS is still pretty young and you may encounter a few failures here and there. Just stop and restart the service from the CloudPhone status activity and tell me what happened!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-9068575233059160079?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xjyVP7DSmUxRU8sSAKBuwSmOic4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xjyVP7DSmUxRU8sSAKBuwSmOic4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xjyVP7DSmUxRU8sSAKBuwSmOic4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xjyVP7DSmUxRU8sSAKBuwSmOic4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/J4GPrjE2rSg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/9068575233059160079/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2010/08/acs-transcode-sample-available.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/9068575233059160079?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/9068575233059160079?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/J4GPrjE2rSg/acs-transcode-sample-available.html" title="ACS Transcode Sample available" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2010/08/acs-transcode-sample-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YGQ3c4eCp7ImA9Wx5SE08.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-3172469012712964581</id><published>2010-08-09T00:43:00.001-04:00</published><updated>2010-08-09T00:45:22.930-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-09T00:45:22.930-04:00</app:edited><title>Mixin in Java using Groovy</title><content type="html">I'm a big fan of the Groovy language. There are many new dynamic languages for the JVM, but for me, Groovy is the most natural one, simple yet very powerful. A powerful aspect of Groovy is that, even if you're not coding your classes in Groovy, you can &lt;i&gt;groove&lt;/i&gt; your Java code. Have a look at how simple it is to add a mixin to a Java class :&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;class MyClass {&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;public getVal1() { return 5; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Category&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;class ExtraBehavior {&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;private String extra;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;public void setExtra(String extra) { this.extra = extra; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;public String getExtra() { return "extra"; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Now, you apply Groovy magic :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;DefaultGroovyMethods. mixin( MyClass.class, ExtraBehavior.class);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;After this point, the getExtra method will be available from myClass instances. To set the extra value, just use the metaclass :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;GroovyObjectSupport.class.cast(anyInstance).getMetaClass().setProperty(anyInstance, "extra", "newVal");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;When calling anyInstance.getExtra ( using Reflection of course), you'll access the ExtraBehavior getter and internal state. Pretty cool stuff to inject behavior and state at runtime in your Java classes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-3172469012712964581?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Lsc3IzgRzqZqdd7th6QyjsegO4k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lsc3IzgRzqZqdd7th6QyjsegO4k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Lsc3IzgRzqZqdd7th6QyjsegO4k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lsc3IzgRzqZqdd7th6QyjsegO4k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/1jNskIYsbqE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/3172469012712964581/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2010/08/mixin-in-java-using-groovy.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/3172469012712964581?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/3172469012712964581?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/1jNskIYsbqE/mixin-in-java-using-groovy.html" title="Mixin in Java using Groovy" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2010/08/mixin-in-java-using-groovy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4NSXY_fip7ImA9Wx5SE08.&quot;"><id>tag:blogger.com,1999:blog-7577482648357005498.post-5403425835810360507</id><published>2010-08-08T23:19:00.000-04:00</published><updated>2010-08-08T23:19:58.846-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-08T23:19:58.846-04:00</app:edited><title>Streaming M4A files using Android Cloud Services</title><content type="html">&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;I was surprised, when developing a streaming music player for the Android phone, to discover a strange limitation. The platform Media Player is able to stream MP3 files (and many others), but M4A files (unprotected iTunes files) must be downloaded to the device before being played. After reading a few threads about this problem, I decided to apply ACS cloud capacity to solve this problem.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;About ACS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ACS stands for Android Cloud Services (http://www.androidcloudservices.com). This is a young cloud platform specialized for the Android platform on which I'm working right now. The goal is to extend the phone (or any Android device) capacity through tight integration with cloud resources. As of now, we're able to create cloud AsyncTask, Service, integrate storage and additional memory. This is still in early alpha, but stable enough to be used if you're not afraid of the unknown!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;ACS Transcoding&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ACS components executing in a cloud thread have access to the ACS framework, which exposes various tools like facebook &amp;amp; twitter access, YQL, S3 and various useful other tools not natively available on your Android device. We'll be using two of these tools to solve our streaming problem : Web and Media tools.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;div style="font-family: Times; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;The Transcoder class&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;After having integrated the acs-client library and configured your application (see the &lt;a href="http://github.com/Pyxoid/acs/tree/master/samples/transcode/"&gt;Transcoder sample code&lt;/a&gt; for more details), you need to create your transcoder client class in the assets folder.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;class Transcoder extends ScriptComponent &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * Transcoding implementation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def transcode(String sourceUrl) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Instantiate a transcoding task&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def task = new TranscodingTask(cloudDevice:cloudDevice, sourceUrl:sourceUrl, format:'mp3')&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Register this transcoding task on provided task server for single use (no timeout)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cloudDevice.web.register("audiotranscode.mp3", task, true)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;It exposes a single method with the sourceUrl of the M4A file and returning (implicitly) a new URL where the transcoded content will be available. As you can see, we use the cloudDevice object to access various framework tools. The register method of the &lt;b&gt;web&lt;/b&gt;&amp;nbsp;tool will create a temporary URL usable once by the phone running the ACS application. This is a convenient way to expose modified content to your phone from the web. This could be used to post-processed picture, videos, web pages and much more.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;The transcoding task is built over the ACS Media tool and will executed when ACS received an HTTP GET request to the provided URL.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;class TranscodingTask {&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def sourceUrl&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def format&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def cloudDevice&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * request.params contains all parameters&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * response.out is used to output our response&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * Use the internal audio tool to perform the actual transcoding&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;void execute(def request, def response) &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Indicate the audio type of our stream &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.addHeader("Content-Type", "audio/${format}")&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cloudDevice.mediaEngine.transcode(sourceUrl, format, response.outputStream)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The single execute method will receive the request and response from the HTTP server. The rest is simply set the right content type and call the transcode method from the ACS media engine. The transcode method will read the source media and will write the transcoded result directly to the HTTP request output stream. Easy.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Using the Transcoder&lt;/span&gt;&lt;/div&gt;&lt;div&gt;To execute this transcoding code in the cloud, we have to use ACS from our Android application. By using the standard CloudDevice service, you create a cloud execution context around your Transcoder implementation like this :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Establish the scripting context for the transcoder&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mTaskImpl = mDevice.createExecutionContext("audioTranscoder", this, TranscoderImplementation.class, BaseExecutionContextHandler.class);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The mTaskImpl member is now a proxy to your cloud implementation. Just call mTaskImpl.transcode with the source url in parameter to execute your transcoder.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public URL transcode(URL sourceUrl) throws IOException &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Delegate the execution to our task implementation&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new URL(mTaskImpl.transcode(sourceUrl));&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;As you can see, using cloud resources with ACS is really simple and feels native in your Android applications. You can now integrate the whole thing in the Media Player like this :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Create our transcoder instance&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mTranscoder = new Transcoder(mDevice);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer = new MediaPlayer();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer.setOnBufferingUpdateListener(mBufferingListener);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Retrieve the transcoding URL from our transcoder&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;URL transcodedUrl = mTranscoder.transcode(new URL(mSourceUrl.getText().toString()));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Configure the media player for streaming as usual&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer.setDataSource(transcodedUrl.toString());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer.prepare();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mMediaPlayer.start();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;} catch (Exception e) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; Log.e(LOG_TAG, "Unable to transcode media, e");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You're now able to stream any content in your Android by using ACS to transcode your media in real time in the cloud. ACS Media is built over the powerful ffmpeg, so we support about any audio and video transcoding. You can get more details about ACS on the &lt;a href="http://www.androidcloudservices.com/"&gt;web site&lt;/a&gt;&amp;nbsp;or visit &lt;a href="http://www.github.com/pyxoid/acs"&gt;GitHub&lt;/a&gt; to download the code and start integrating the cloud in your Android!&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7577482648357005498-5403425835810360507?l=positivelydisruptive.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/imigdmxB_8pEi8qL9GndI7GYJxI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/imigdmxB_8pEi8qL9GndI7GYJxI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/imigdmxB_8pEi8qL9GndI7GYJxI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/imigdmxB_8pEi8qL9GndI7GYJxI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PositivelyDisruptive/~4/TB5fZD4cF30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://positivelydisruptive.blogspot.com/feeds/5403425835810360507/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/5403425835810360507?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7577482648357005498/posts/default/5403425835810360507?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PositivelyDisruptive/~3/TB5fZD4cF30/streaming-m4a-files-using-android-cloud.html" title="Streaming M4A files using Android Cloud Services" /><author><name>Joel Grenon</name><uri>http://www.blogger.com/profile/05310053305489035842</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://4.bp.blogspot.com/-rN9890ppo7A/TX6seGpjBQI/AAAAAAAACJk/z4Ke-r_f_WM/s220/profile2011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html</feedburner:origLink></entry></feed>

