<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -15,10 +15,10 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;main&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.AIRBrowser&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;main&lt;/filename&gt;
+	&lt;filename&gt;AIRBrowser&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
 	&lt;name&gt;main&lt;/name&gt;</diff>
      <filename>01_AIRBrowser/air/bin-debug/main-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,10 +15,10 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;main&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.AIRBrowser&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;main&lt;/filename&gt;
+	&lt;filename&gt;AIRBrowser&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
 	&lt;name&gt;main&lt;/name&gt;</diff>
      <filename>01_AIRBrowser/air/src/main-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,10 +15,10 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;main-simple&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.AIRBrowserSimple&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;main_simple&lt;/filename&gt;
+	&lt;filename&gt;AIRBrowserSimple&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
 	&lt;name&gt;main_simple&lt;/name&gt;</diff>
      <filename>01_AIRBrowser/air/src/main_simple-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,10 +15,10 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;main-tabbed&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.AIRBrowserTabbed&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;main_tabbed&lt;/filename&gt;
+	&lt;filename&gt;AIRBrowserTabbed&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
 	&lt;name&gt;main_tabbed&lt;/name&gt;</diff>
      <filename>01_AIRBrowser/air/src/main_tabbed-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;HelloBlog&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.HelloBlog&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;HelloBlog&lt;/filename&gt;</diff>
      <filename>02_HelloBlog/air/src/application-html.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;WebSnippet&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.WebSnippet&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;WebSnippet&lt;/filename&gt;</diff>
      <filename>03_WebSnippet/air/src/WebSnippet-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,8 @@ class AssetsController &lt; ApplicationController
   # GET /assets/1.xml
   def show
     @asset = Asset.find(params[:id])
-    redirect_to @asset.authenticated_s3_url
+    redirect_to @asset.attachment_options[:storage] == :s3 ? 
+                  @asset.authenticated_s3_url : @asset.public_filename
   end
 
   # GET /assets/new</diff>
      <filename>06_S3Browser/rails/app/controllers/assets_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 class Asset &lt; ActiveRecord::Base
   belongs_to :account
   
-  has_attachment :storage =&gt; :s3,
+  has_attachment :storage =&gt; :s3, #:file_system
                  :use_ssl =&gt; true,
                  :s3_access =&gt; :private,
                  :min_size =&gt; 1,</diff>
      <filename>06_S3Browser/rails/app/models/asset.rb</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>06_S3Browser/rails/db/development.sqlite3</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;PhotoBooth&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.PhotoBooth&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;PhotoBooth&lt;/filename&gt;
@@ -63,13 +63,13 @@
 		&lt;width&gt;690&lt;/width&gt;
 
 		&lt;!-- The window's initial height. Optional. --&gt;
-		&lt;height&gt;740&lt;/height&gt;
+		&lt;height&gt;720&lt;/height&gt;
 
 		&lt;!-- The window's initial x position. Optional. --&gt;
-		&lt;!-- &lt;x&gt;&lt;/x&gt; --&gt;
+		&lt;x&gt;10&lt;/x&gt;
 
 		&lt;!-- The window's initial y position. Optional. --&gt;
-		&lt;!-- &lt;y&gt;&lt;/y&gt; --&gt;
+		&lt;y&gt;10&lt;/y&gt;
 
 		&lt;!-- The window's minimum size, specified as a width/height pair, such as &quot;400 200&quot;. Optional. --&gt;
 		&lt;!-- &lt;minSize&gt;&lt;/minSize&gt; --&gt;</diff>
      <filename>08_PhotoBooth/air/src/PhotoBooth-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
 &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
 &lt;mx:WindowedApplication xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;vertical&quot;
 	applicationComplete=&quot;insertWebcamVideo();&quot;
-	&gt;
+	 width=&quot;690&quot; height=&quot;720&quot;
+	 verticalScrollPolicy=&quot;off&quot; horizontalScrollPolicy=&quot;off&quot;&gt;
 &lt;mx:Script&gt;
 	&lt;![CDATA[
 	import mx.graphics.codec.PNGEncoder;</diff>
      <filename>08_PhotoBooth/air/src/PhotoBooth.mxml</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,7 @@ ActionController::Routing::Routes.draw do |map|
   #   end
 
   # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
-  # map.root :controller =&gt; &quot;welcome&quot;
+  map.root :controller =&gt; &quot;photos&quot;
 
   # See how all your routes lay out with &quot;rake routes&quot;
 </diff>
      <filename>08_PhotoBooth/rails/config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,13 +15,13 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;TwitterSucker&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.TwitterSpider&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;TwitterSucker&lt;/filename&gt;
+	&lt;filename&gt;TwitterSpider&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
-	&lt;name&gt;TwitterSucker&lt;/name&gt;
+	&lt;name&gt;TwitterSpider&lt;/name&gt;
 
 	&lt;!-- An application version designator (such as &quot;v1&quot;, &quot;2.5&quot;, or &quot;Alpha 1&quot;). Required. --&gt;
 	&lt;version&gt;v1&lt;/version&gt;</diff>
      <filename>09_TwitterSpider/air/src/TwitterSpider-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -49,12 +49,17 @@
 		
 		[Bindable]
 		private var tweets:ArrayCollection;
+		[Bindable]
+		private var fromDate:Number;
+		[Bindable]
+		private var toDate:Number;
 		
 		private var dataAggregator:TweetDataAggregator;
 				
 		private function filterByDates(fromDate:Number, toDate:Number):void {
 			dataAggregator.aggregateForDateRange(fromDate, toDate);
-			tweets = new ArrayCollection(dataAggregator.getTweets());
+			tweets = new ArrayCollection(dataAggregator.getTweetsInTimeRange());
+			list.filter();
 		}
 		
 		private function accountSelected(dataAggregator:TweetDataAggregator):void {
@@ -85,21 +90,22 @@
 	&lt;account:AccountList width=&quot;230&quot; height=&quot;100%&quot;  
 		accountSelected=&quot;accountSelected(event.account as TweetDataAggregator);&quot; 
 		loadAccount=&quot;loadAccount(event.account as TweetDataAggregator)&quot;/&gt;
-	&lt;mx:TabNavigator id=&quot;view&quot; width=&quot;100%&quot; height=&quot;100%&quot; creationPolicy=&quot;all&quot;&gt;
-		&lt;data:HTMLSpider id=&quot;loader&quot; width=&quot;100%&quot;  height=&quot;100%&quot; label=&quot;Progress&quot; 
-					loaded=&quot;accountSelected(loader.dataAggregator)&quot; /&gt;
-		&lt;tweetList:TweetList label=&quot;Tweets ({tweets.length})&quot; 
-							 tweets=&quot;{tweets}&quot;
-							 width=&quot;100%&quot; height=&quot;100%&quot; /&gt;	    					
-		&lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot; label=&quot;Stats&quot; creationPolicy=&quot;all&quot;&gt;
-			&lt;mx:HBox width=&quot;100%&quot; height=&quot;33%&quot;&gt;
-				&lt;charts:ReplyChart id=&quot;replyChart&quot; width=&quot;50%&quot; height=&quot;100%&quot; /&gt;
-				&lt;charts:HoursAndDayChart id=&quot;hoursAndDayChart&quot; width=&quot;50%&quot; height=&quot;100%&quot; /&gt;			
-			&lt;/mx:HBox&gt;
-			&lt;charts:DayWeekMonthBreakdownChart id=&quot;dwmChart&quot; width=&quot;100%&quot; height=&quot;33%&quot; /&gt;
-			&lt;charts:ChartSlider id=&quot;fullChart&quot; width=&quot;100%&quot; height=&quot;33%&quot;  dateRangeChanged=&quot;filterByDates(event.fromRange, event.toRange)&quot; /&gt;		
-		&lt;/mx:VBox&gt;
-		
-	&lt;/mx:TabNavigator&gt;
+	&lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;
+		&lt;mx:TabNavigator id=&quot;view&quot; width=&quot;100%&quot; height=&quot;100%&quot; creationPolicy=&quot;all&quot;&gt;
+			&lt;data:HTMLSpider id=&quot;loader&quot; width=&quot;100%&quot;  height=&quot;100%&quot; label=&quot;Progress&quot; 
+						loaded=&quot;accountSelected(loader.dataAggregator)&quot; /&gt;
+			&lt;tweetList:TweetList id=&quot;list&quot; label=&quot;Tweets ({tweets.length})&quot; 
+								 tweets=&quot;{tweets}&quot;
+								 width=&quot;100%&quot; height=&quot;100%&quot; /&gt;	    					
+			&lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot; label=&quot;Stats&quot; creationPolicy=&quot;all&quot;&gt;
+				&lt;mx:HBox width=&quot;100%&quot; height=&quot;33%&quot;&gt;
+					&lt;charts:ReplyChart id=&quot;replyChart&quot; width=&quot;50%&quot; height=&quot;100%&quot; /&gt;
+					&lt;charts:HoursAndDayChart id=&quot;hoursAndDayChart&quot; width=&quot;50%&quot; height=&quot;100%&quot; /&gt;			
+				&lt;/mx:HBox&gt;
+				&lt;charts:DayWeekMonthBreakdownChart id=&quot;dwmChart&quot; width=&quot;100%&quot; height=&quot;33%&quot; /&gt;
+			&lt;/mx:VBox&gt;		
+		&lt;/mx:TabNavigator&gt;
+		&lt;charts:ChartSlider id=&quot;fullChart&quot; width=&quot;100%&quot; height=&quot;33%&quot;  dateRangeChanged=&quot;filterByDates(event.fromRange, event.toRange)&quot; /&gt;				
+	&lt;/mx:VBox&gt;	
 &lt;/mx:HDividedBox&gt;
 &lt;/mx:WindowedApplication&gt;</diff>
      <filename>09_TwitterSpider/air/src/TwitterSpider.mxml</filename>
    </modified>
    <modified>
      <diff>@@ -8,6 +8,7 @@ package data
 	public class TweetDataAggregator
 	{
 		private var tweets:Array;
+		private var tweetsInTimeRange:Array;
 		private var ids:Object;
 		private var account:String;
 		
@@ -49,6 +50,9 @@ package data
 		public function getTweets():Array {
 			return tweets;
 		}
+		public function getTweetsInTimeRange():Array {
+			return tweetsInTimeRange;
+		}
 		public function setTweets(tweets:Array):void {
 			this.tweets = tweets;
 			aggregate(); // resets ids
@@ -63,10 +67,12 @@ package data
 			}
 		}
 		public function aggregate():void {
+			tweetsInTimeRange = [];
 			var agg:Object = getAggregationStructure();
 			for each (var tweet:Object in tweets) {
 				if (tweet.time_breakdown==null) tweet.time_breakdown = timeBreakdown(tweet.time);
 				if (ids[tweet.id] == null) ids[tweet.id] = tweet;
+				tweetsInTimeRange.push(tweet);
 				increment(agg.tweetsPerDay, tweet.time_breakdown.date);
 				increment(agg.tweetsDayOfWeek, tweet.time_breakdown.w);
 				increment(agg.tweetsDateOfMonth, tweet.time_breakdown.d);
@@ -91,12 +97,14 @@ package data
 			tweetsHourAndDay = new ArrayCollection(mapHourAndDayToArray(agg.tweetsHourAndDay));
 		}
 		
-		//FIXME: refactor with above
+		//FIXME: refactor with above to remove duplicate code.
 		public function aggregateForDateRange(fromDate:Number, toDate:Number):void {
+			tweetsInTimeRange = [];
 			var agg:Object = getAggregationStructure();
 			for each (var tweet:Object in tweets) {
 				if (tweet.time_breakdown==null) tweet.time_breakdown = timeBreakdown(tweet.time);
 				if (tweet.time_breakdown.date&lt;fromDate || tweet.time_breakdown.date&gt;toDate) continue;
+				tweetsInTimeRange.push(tweet);
 				//increment(agg.tweetsPerDay, tweet.time_breakdown.date);
 				increment(agg.tweetsDayOfWeek, tweet.time_breakdown.w);
 				increment(agg.tweetsDateOfMonth, tweet.time_breakdown.d);</diff>
      <filename>09_TwitterSpider/air/src/data/TweetDataAggregator.as</filename>
    </modified>
    <modified>
      <diff>@@ -15,13 +15,13 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;com.flexonrails.TwitterConnections&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.TwitterFriends&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
-	&lt;filename&gt;TwitterConnections&lt;/filename&gt;
+	&lt;filename&gt;TwitterFriends&lt;/filename&gt;
 
 	&lt;!-- The name that is displayed in the AIR application installer. Optional. --&gt;
-	&lt;name&gt;TwitterConnections&lt;/name&gt;
+	&lt;name&gt;TwitterFriends&lt;/name&gt;
 
 	&lt;!-- An application version designator (such as &quot;v1&quot;, &quot;2.5&quot;, or &quot;Alpha 1&quot;). Required. --&gt;
 	&lt;version&gt;v1&lt;/version&gt;</diff>
      <filename>10_TwitterFriends/air/src/TwitterConnections-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;VideoMessenger&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.VideoMessenger&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;VideoMessenger&lt;/filename&gt;</diff>
      <filename>research/07_VideoMessenger/air/src/VideoMessenger-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;com.flexonrails.railsconf.VideoMessengerWithStreaming&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.VideoMessengerWithStreaming&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;VideoMessenger&lt;/filename&gt;</diff>
      <filename>research/07_VideoMessengerWithStreaming/air/src/VideoMessenger-app.xml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 --&gt;
 
 	&lt;!-- The application identifier string, unique to this application. Required. --&gt;
-	&lt;id&gt;com.flexonrails.PortfolioViewer&lt;/id&gt;
+	&lt;id&gt;com.flexonrails.railsconf2008.PortfolioViewer&lt;/id&gt;
 
 	&lt;!-- Used as the filename for the application. Required. --&gt;
 	&lt;filename&gt;PortfolioViewer&lt;/filename&gt;</diff>
      <filename>research/09_PortfolioViewer/air/src/PortfolioViewer-app.xml</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>08_PhotoBooth/rails/public/index.html</filename>
    </removed>
    <removed>
      <filename>10_TwitterFriends/air/src/TC-app.xml</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>eca3052bb7ce3a1f3901fa8cb9864638c7ad6b3f</id>
    </parent>
  </parents>
  <author>
    <name>Daniel Wanja</name>
    <email>d@n-so.com</email>
  </author>
  <url>http://github.com/danielwanja/railsconf2008/commit/e0136528156742c4aae38b137bab88136bff4c72</url>
  <id>e0136528156742c4aae38b137bab88136bff4c72</id>
  <committed-date>2008-05-28T22:04:04-07:00</committed-date>
  <authored-date>2008-05-28T22:04:04-07:00</authored-date>
  <message>Code cleanup</message>
  <tree>bf75e670814d394b14f29310e124bdd5375861f1</tree>
  <committer>
    <name>Daniel Wanja</name>
    <email>d@n-so.com</email>
  </committer>
</commit>
