<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>竹部落</title><description>My studying notebook</description><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><pubDate>Wed, 15 Apr 2026 15:55:44 +0800</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">68</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://bamboobig.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:image href="http://lh6.ggpht.com/cage.chung/SEf7GW49R_I/AAAAAAAADnE/n2kgZpHnrJU/CoffeeCup_Feed_76x76.png"/><itunes:subtitle>My studying notebook</itunes:subtitle><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>[notebook] Google Push Notification API</title><link>http://bamboobig.blogspot.com/2015/02/notebook-google-push-notification-api.html</link><category>API</category><category>Google</category><category>Google Calendar API</category><category>Google Drive API</category><category>Push Notification</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 26 Feb 2015 10:06:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-6069466078187300573</guid><description>&lt;h3 id="google-push-notification"&gt;
Google Push Notification&lt;/h3&gt;
&lt;blockquote&gt;
The Google APIs provides push notification that let you watch for changes to resources&lt;/blockquote&gt;
&lt;h4 id="google-drive-push-notification"&gt;
Google Drive Push Notification&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=r3g_oT03nmQ"&gt;https://www.youtube.com/watch?v=r3g_oT03nmQ&lt;/a&gt; (Google Drive SDK: Push notifications - YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googledrive/pushnotifications-playground"&gt;https://github.com/googledrive/pushnotifications-playground&lt;/a&gt; (googledrive/pushnotifications-playground)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="google-apis-provides-push-notification"&gt;
Google APIs provides Push Notification&lt;/h4&gt;
You can visit &lt;a href="https://developers.google.com/apis-explorer/#search/watch/"&gt;Google APIs Explorer - search watch&lt;/a&gt;. There are few APIs support push notification now. Not all of them.&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td align="left"&gt;&lt;div&gt;
&lt;div class="content"&gt;
&lt;table class="DP2MEN-h-b"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;calendar.settings.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Calendar API v3&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes to Settings resources.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;calendar.acl.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Calendar API v3&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes to ACL resources.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;calendar.calendarList.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Calendar API v3&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes to CalendarList resources.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;calendar.events.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Calendar API v3&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes to Events resources.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;storage.objects.watchAll&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Cloud Storage API v1beta2&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes on all objects in a bucket.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;reports.activities.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Admin Reports API reports_v1&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Push changes to activities&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;directory.users.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Admin Directory API directory_v1&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes in users list&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;directory.users.aliases.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Admin Directory API directory_v1&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes in user aliases list&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;storage.objects.watchAll&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Cloud Storage API v1&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Watch for changes on all objects in a bucket.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;youtube.playlistItems.update&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;YouTube Data API v3&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Modifies a playlist item. For example, you could update the item’s position in the playlist.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;drive.files.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Drive API v2&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Subscribe to changes on a file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="DP2MEN-h-c"&gt;&lt;span class="gwt-InlineLabel"&gt;drive.changes.watch&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="gwt-InlineLabel"&gt;Drive API v2&lt;/span&gt;&lt;/td&gt;&lt;td class="DP2MEN-h-a"&gt;&lt;span class="gwt-InlineLabel"&gt;Subscribe to changes for a user.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">78</thr:total></item><item><title>AngularJs, RequireJs, Grunt and Bower Part4 - How to extend your own code with ASP.NET MVC</title><link>http://bamboobig.blogspot.com/2014/07/angularjs-requirejs-grunt-and-bower_15.html</link><category>AngularJs</category><category>ASP.NET</category><category>Bower</category><category>Github</category><category>Grunt</category><category>MVC</category><category>RequireJs</category><category>Yoeman</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Tue, 15 Jul 2014 16:33:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-643316988166545602</guid><description>&lt;p&gt;This article is part of a series of posts on RequireJs, AnguarJs, Grunt and Bower. Here are the parts so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/06/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part2 - Grunt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_14.html"&gt;AngularJs, RequireJs, Grunt and Bower Part3 - generator-angular-requirejs-grunt-bower with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AngularJs, RequireJs, Grunt and Bower Part4 - How to extend your own code with ASP.NET MVC&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;AngularJs, RequireJs, Grunt and Bower Part5 - generator-angular-requirejs-grunt-bower with Express.js &lt;strong&gt;//to be done&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;In previou aticles that we talked about how to integrate AngularJs, Requirejs, Grunt and bower with ASP.NET MVC. If you don’t want to create those file structure manual. You can install &lt;code&gt;generator-angular-requirejs-grunt-bower&lt;/code&gt; yeoman generator.&lt;/p&gt;

&lt;h4 id="simple-step-to-install-yeoman-generator"&gt;Simple step to install yeoman generator&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;install generator: &lt;code&gt;npm install -g generator-angular-requirejs-grunt-bower&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; to project root folder&lt;/li&gt;
&lt;li&gt;execute command &lt;code&gt;yo angular-requirejs-grunt-bower&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="scenario"&gt;Scenario&lt;/h3&gt;

&lt;p&gt;As basic concept we mentioned that we want to treat &lt;code&gt;ControllerName/actionName&lt;/code&gt; as single page application and try to reuse shared code as possible base on this file structure. Now, let’s create a new ASP.NET MVC &lt;code&gt;controller&lt;/code&gt; and extend new AngularJs application.&lt;/p&gt;

&lt;h4 id="step-1-create-new-aspnet-mvc-controller"&gt;Step 1: create new ASP.NET MVC &lt;code&gt;controller&lt;/code&gt;&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;please create a new &lt;code&gt;controller&lt;/code&gt; named &lt;code&gt;ProjectController&lt;/code&gt; via Visual studio.&lt;/li&gt;
&lt;li&gt;Add new view named &lt;code&gt;Index.cshtml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;modify &lt;code&gt;Views/Project/Index.cshtml&lt;/code&gt;. The only thing you need to do is add Angular route directive &lt;code&gt;ng-view&lt;/code&gt;. We will handle UI in AngularJs partile view.&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="pun"&gt;@{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="typ"&gt;ViewBag&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Title&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"Product"&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;

&lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;div ng&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;view&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="pln"&gt;div&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="se-section-delimiter"&gt;&lt;/div&gt;

&lt;h4 id="step-2-create-new-angularjs-application"&gt;Step 2: create new AngularJs application&lt;/h4&gt;

&lt;p&gt;create file structure as following.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Public/js/views/Project&lt;/code&gt;, AngularJs application container and named same as &lt;code&gt;Controller&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Public/js/views/Project/index.js&lt;/code&gt;, application entry point&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Public/js/views/Project/patials&lt;/code&gt;, we will put all partials view HTML here&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Public/js/views/Project/patials/project-index.html&lt;/code&gt;, default AngulaJs route view.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Public/js/controllers/product-controller.js&lt;/code&gt;, Product controller. &lt;/li&gt;
&lt;/ol&gt;

&lt;h5 id="project-indexhtml-product-partials-view"&gt;&lt;code&gt;project-index.html&lt;/code&gt;: Product partials view&lt;/h5&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="tag"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
    this is Project Index page.
&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h5 id="product-controllerjs-product-controller"&gt;&lt;code&gt;product-controller.js&lt;/code&gt;: Product controller&lt;/h5&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt;define&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="str"&gt;'controllers/controllers'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;controllers&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    controllers&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ProjectIndexCtrl'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$scope'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            console&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;log&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ProjectIndexCtrl execute.'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="indexjs-product-angularjs-single-page-application-entry-point"&gt;&lt;code&gt;index.js&lt;/code&gt;: Product AngularJs single page application entry point.&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="str"&gt;'use strict'&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;

&lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'app'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'domReady'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'controllers/product-controller'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; domReady&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; root &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;toUrl&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'.'&lt;/span&gt;&lt;span class="pun"&gt;).&lt;/span&gt;&lt;span class="pln"&gt;split&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'.'&lt;/span&gt;&lt;span class="pun"&gt;)[&lt;/span&gt;&lt;span class="lit"&gt;0&lt;/span&gt;&lt;span class="pun"&gt;];&lt;/span&gt;&lt;span class="pln"&gt;
        app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;config&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="str"&gt;'$routeProvider'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'$httpProvider'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'$sceDelegateProvider'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'$locationProvider'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$routeProvider&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; $httpProvider&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; $sceDelegateProvider&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; $locationProvider&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="com"&gt;// sec&lt;/span&gt;&lt;span class="pln"&gt;
                $sceDelegateProvider&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;resourceUrlWhitelist&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="str"&gt;'self'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'.*'&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

                &lt;/span&gt;&lt;span class="com"&gt;// route&lt;/span&gt;&lt;span class="pln"&gt;
                $routeProvider&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="kwd"&gt;when&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'/'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                    templateUrl&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'/public/js/views/Product/partials/product-index.html'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
                    controller&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'ProjectIndexCtrl'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
                    resolve&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{}&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="pun"&gt;}).&lt;/span&gt;&lt;span class="pln"&gt;
                otherwise&lt;/span&gt;&lt;span class="pun"&gt;({&lt;/span&gt;&lt;span class="pln"&gt;
                    redirectTo&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'/'&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;]).&lt;/span&gt;&lt;span class="pln"&gt;run&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="str"&gt;'$rootScope'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$rootScope&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="com"&gt;// global variable&lt;/span&gt;&lt;span class="pln"&gt;

                $rootScope&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;$safeApply &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; fn&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                    $scope &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; $scope &lt;/span&gt;&lt;span class="pun"&gt;||&lt;/span&gt;&lt;span class="pln"&gt; $rootScope&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
                    fn &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; fn &lt;/span&gt;&lt;span class="pun"&gt;||&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;span class="pln"&gt;
                    &lt;/span&gt;&lt;span class="kwd"&gt;if&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;$$phase&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                        fn&lt;/span&gt;&lt;span class="pun"&gt;();&lt;/span&gt;&lt;span class="pln"&gt;
                    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;else&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                        $scope&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;$apply&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;fn&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
                    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;]).&lt;/span&gt;&lt;span class="pln"&gt;constant&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'$'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; $&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

        domReady&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;bootstrap&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;document&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;body&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'myAngularApp'&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

            $&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'html'&lt;/span&gt;&lt;span class="pun"&gt;).&lt;/span&gt;&lt;span class="pln"&gt;addClass&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ng-app: myAngularApp'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="preview"&gt;Preview&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsf4ukRlrQ1rRRb7TjCTEqJV96Q-mD-u818zs3lVNdgnklX2Zt5q5woPNbPul_9tPQhs8qKQEvGR2jYGDBIdlLaSyUxuaErY4gJyWMrK5R_XtHnyDAU31rfcW0QF9j28_qU8pL18-QMU5l/s800/a.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DIv9Xo8OIIrTPwlA3_820AcnELdiLaGj2RcOWd4swFVwthOCNwYwixSz6wQo1v5Q0jgr246_XtFZSYFRUCCDy7ds5nIpzZtbyMxhC0NLBzpKwRcapTQhDW17K4J9evalBxizrjxIKg-G/s600/" alt="Product" title="a.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="step-3-lets-extend-shared-service-for-different-single-page-application"&gt;Step 3: Let’s extend shared service for different single page application&lt;/h3&gt;

&lt;p&gt;Till now, we have two AngularJs single page application &lt;code&gt;HomeController&lt;/code&gt; and &lt;code&gt;ProductController&lt;/code&gt; and they don’t include any AngularJs service, directive or filter module.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a new ASP.NET MVC BookController &lt;code&gt;ApiController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add a AngularJs server named &lt;code&gt;/Public/js/services/bookService.js&lt;/code&gt;. Using &lt;code&gt;ng-source&lt;/code&gt; to call &lt;code&gt;API&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Inject &lt;code&gt;book-service.js&lt;/code&gt; to &lt;code&gt;Product&lt;/code&gt; application&lt;/li&gt;
&lt;li&gt;Inject &lt;code&gt;book-service.js&lt;/code&gt; to &lt;code&gt;Home&lt;/code&gt; application&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="add-bookcontroller-apicontroller"&gt;Add &lt;code&gt;BookController&lt;/code&gt; ApiController&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="com"&gt;// GET: api/Book&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="kwd"&gt;public&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;IEnumerable&lt;/span&gt;&lt;span class="str"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Get&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;new&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;string&lt;/span&gt;&lt;span class="pun"&gt;[]&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"ABookApart.CSS3.For.Web.Designers.2010"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"AngularJS Directives"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="se-section-delimiter"&gt;&lt;/div&gt;

&lt;h4 id="book-servicejs"&gt;&lt;code&gt;book-service.js&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Add a new AngularJs service locate in &lt;code&gt;Public/js/service/book-service.js&lt;/code&gt;. &lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt;define&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="str"&gt;'services/services'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;services&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="com"&gt;// Book resource&lt;/span&gt;&lt;span class="pln"&gt;
    services&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;factory&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'BOOK'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$resource'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$resource&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; resetUrl &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'/api/Book'&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; resource &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; $resource&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;resetUrl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{},&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;get&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt; method&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'GET'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; isArray&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;true&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;

        &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; resource&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}]);&lt;/span&gt;&lt;span class="pln"&gt;

    &lt;/span&gt;&lt;span class="com"&gt;// BookLoader&lt;/span&gt;&lt;span class="pln"&gt;
    services&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;factory&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'BookLoader'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$q'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'BOOK'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$q&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; BOOK&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; delay &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; $q&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;defer&lt;/span&gt;&lt;span class="pun"&gt;();&lt;/span&gt;&lt;span class="pln"&gt;
            BOOK&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;get&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;data&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                delay&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;resolve&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;data&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;error&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                delay&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;reject&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'Unable to fetch Book list'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; delay&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;promise&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}]);&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="inject-book-servicejs-bookloader-to-angularjs-route-resolve"&gt;Inject &lt;code&gt;book-service.js&lt;/code&gt; &lt;code&gt;BookLoader&lt;/code&gt; to AngularJs route resolve&lt;/h4&gt;

&lt;p&gt;If you are familier with AngularJs. There is a &lt;a href="https://docs.angularjs.org/api/ngRoute/provider/%24routeProvider"&gt;resolve&lt;/a&gt; function you can call in AngularJs route. We define a &lt;code&gt;BookLoader&lt;/code&gt; function that implement with promise pattern. Then, we can inject the result to our controller. Resolve can help us to fetch API before controller called.&lt;/p&gt;

&lt;p&gt;How can we inject book service to AngularJs application via &lt;code&gt;RequireJs&lt;/code&gt; require feature. That’s mean we can inject different feature in other application easily.&lt;/p&gt;

&lt;h4 id="jsviewsproductindexjs"&gt;&lt;code&gt;js/views/Product/index.js&lt;/code&gt;&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pun"&gt;....&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'controllers/product-controller'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'services/book-service'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="controllerproduct-controllerjs"&gt;&lt;code&gt;controller/Product-controller.js&lt;/code&gt;&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt;controllers&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ProjectIndexCtrl'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$scope'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'books'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; books&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    console&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;log&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ProjectIndexCtrl execute.'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

    $scope&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;books &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; books&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;}]);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Preview &lt;br&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVjYipSCLXgjVXyCrMWe6SXFNjvGUhqYCZr08HF668BKJv7cndsING-8se0VresKYy09Bjkxedv9IyhZtoJGtJ3DLCvmP9v200atay381_9MbhQsXCu6Sh5Tzb9RLvi3r9whCi55ghiuEF/s800/b.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVjYipSCLXgjVXyCrMWe6SXFNjvGUhqYCZr08HF668BKJv7cndsING-8se0VresKYy09Bjkxedv9IyhZtoJGtJ3DLCvmP9v200atay381_9MbhQsXCu6Sh5Tzb9RLvi3r9whCi55ghiuEF/s600/b.png" alt="preview" title="b.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4 id="inject-book-servicejs-book-service-to-angularjs-route-resolve"&gt;Inject &lt;code&gt;book-service.js&lt;/code&gt; &lt;code&gt;BOOK&lt;/code&gt; service to AngularJs route resolve&lt;/h4&gt;

&lt;p&gt;We have defined &lt;code&gt;BOOK&lt;/code&gt; AngularJs service. Different with &lt;code&gt;Product&lt;/code&gt; application. We use &lt;code&gt;BOOK&lt;/code&gt; service instead of &lt;code&gt;BooKloader&lt;/code&gt; promise service. &lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// js/views/Home/index.js&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'domReady'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'controllers/home-controller'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'services/book-service'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// js/controller/home-controller.js&lt;/span&gt;&lt;span class="pln"&gt;
define&lt;/span&gt;&lt;span class="pun"&gt;([&lt;/span&gt;&lt;span class="str"&gt;'controllers/controllers'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;controllers&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    controllers&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'HomeCtrl'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$scope'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'BOOK'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; BOOK&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            console&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;log&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'HomeCtrl execute.'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

            $scope&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;books &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; BOOK&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;get&lt;/span&gt;&lt;span class="pun"&gt;({},&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;books&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; books&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}]);&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We inject &lt;code&gt;BOOK&lt;/code&gt; service in &lt;code&gt;controller&lt;/code&gt; directly and bind &lt;code&gt;Book.get()&lt;/code&gt; to &lt;code&gt;$scope.books&lt;/code&gt;. Whatever we use AngularJs route resolve or inject service directly. They points to same service we defined. &lt;/p&gt;

&lt;p&gt;Preview &lt;br&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-jQXus8qQNUvqKtDz40P9Z3rnuI1A711rD-tT-sBnYpUKUIQ1QHD2RKZZhSZTaFYZ4pW6mGnCUoG3_V2nfX7U4LtmjMlSo4RieuZVbY1ETsjB3XSPVdvTtJaV5iSG6Tl9xl1uvHrqEDy/s800/c.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-jQXus8qQNUvqKtDz40P9Z3rnuI1A711rD-tT-sBnYpUKUIQ1QHD2RKZZhSZTaFYZ4pW6mGnCUoG3_V2nfX7U4LtmjMlSo4RieuZVbY1ETsjB3XSPVdvTtJaV5iSG6Tl9xl1uvHrqEDy/s600/c.png" alt="Preview" title="c.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="grunt"&gt;Grunt&lt;/h3&gt;

&lt;p&gt;As we mentioned before. we still can build for every AngularJs we defined. Befere we build our application, we need to modify &lt;code&gt;Gruntfile.js&lt;/code&gt; manual.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
 modules&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[{&lt;/span&gt;&lt;span class="pln"&gt;
        name&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'views/Home/index'&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        name&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'views/Product/index'&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}],&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="pln"&gt;grunt &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="github-source-code"&gt;Github Source Code&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/cage1016/AngularJsRequireJsGruntBower"&gt;cage1016/AngularJsRequireJsGruntBower&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you clone source code from github repo, you can run following command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-0&lt;/code&gt; is status project created&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-1&lt;/code&gt; is status Nuget install Require.js.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-2&lt;/code&gt; is status project Add AngularJs, RequireJs, Grunt and Bower to Public folder.       &lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-3&lt;/code&gt; is status modify _Layout.chtml to render RequireJs. You will see the final result.  &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;bower install&lt;/code&gt; to restore those library project included.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f setp-4&lt;/code&gt; is status ready to do grunt tasks. &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;npm install&lt;/code&gt; to restore &lt;code&gt;grunt&lt;/code&gt; required libraries. &lt;/li&gt;
&lt;li&gt;execute command &lt;code&gt;grunt&lt;/code&gt; to do grunt tasks.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-5&lt;/code&gt; extend &lt;code&gt;Product&lt;/code&gt; application&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-6&lt;/code&gt; extend AngularJs service &lt;code&gt;book-service&lt;/code&gt; and add &lt;code&gt;BookLoader&lt;/code&gt; to route resolve&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-7&lt;/code&gt; extend AngularJs service &lt;code&gt;book-service&lt;/code&gt; and inject &lt;code&gt;BOOK&lt;/code&gt; service to controller&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-8&lt;/code&gt; add &lt;code&gt;Product&lt;/code&gt; to &lt;code&gt;Gruntfile.js&lt;/code&gt; module block&lt;/li&gt;
&lt;/ul&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DIv9Xo8OIIrTPwlA3_820AcnELdiLaGj2RcOWd4swFVwthOCNwYwixSz6wQo1v5Q0jgr246_XtFZSYFRUCCDy7ds5nIpzZtbyMxhC0NLBzpKwRcapTQhDW17K4J9evalBxizrjxIKg-G/s72-c/" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total></item><item><title>AngularJs, RequireJs, Grunt and Bower Part3 -  generator-angular-requirejs-grunt-bower with ASP.NET MVC (Updatd 2014/7/15)</title><link>http://bamboobig.blogspot.com/2014/07/angularjs-requirejs-grunt-and-bower_14.html</link><category>AngularJs</category><category>ASP.NET</category><category>Bower</category><category>Github</category><category>Grunt</category><category>MVC</category><category>RequireJs</category><category>Yoeman</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Mon, 14 Jul 2014 16:29:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-145898947496704999</guid><description>&lt;p&gt;This article is part of a series of posts on RequireJs, AnguarJs, Grunt and Bower. Here are the parts so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/06/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part2 - Grunt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AngularJs, RequireJs, Grunt and Bower Part3 - generator-angular-requirejs-grunt-bower with ASP.NET MVC&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_15.html"&gt;AngularJs, RequireJs, Grunt and Bower Part4 - How to extend your own code with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;AngularJs, RequireJs, Grunt and Bower Part5 - generator-angular-requirejs-grunt-bower with Express.js &lt;strong&gt;//to be done&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;We are talking about integrate AngularJs, RequireJs, Grunt and Bower in ASP.NET MVC project in previous part.&lt;/p&gt;&lt;div class="se-section-delimiter"&gt;&lt;/div&gt;

&lt;h4 id="javascript-file-structure"&gt;Javascript file structure&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="typ"&gt;Public&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; js
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; controllers
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; css
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; directives
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; services
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; vendor
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; filters
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; views
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; config&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
    &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; release
        &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; views
        &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
        &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; config&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js       &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Above is the font-end file structure we mentioned in previous articles. It’s dozens of files we need to create. So, i put those of work to &lt;code&gt;yeoman generator-angular-requirejs-grunt-bower&lt;/code&gt;. &lt;/p&gt;

&lt;h3 id="getting-started"&gt;Getting started&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; to project root&lt;/li&gt;
&lt;li&gt;Install the generator: &lt;code&gt;npm install -g generator-angular-requirejs-grunt-bower&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run: &lt;code&gt;yo angular-requirejs-grunt-bower&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="yeoman-generator-angular-requirejs-grunt-bower"&gt;Yeoman Generator: angular-requirejs-grunt-bower&lt;/h3&gt;

&lt;p&gt;Github: &lt;br&gt;
&lt;a href="https://github.com/cage1016/generator-angular-requirejs-grunt-bower"&gt;cage1016/generator-angular-requirejs-grunt-bower&lt;/a&gt;&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">22</thr:total></item><item><title>AngularJs, RequireJs, Grunt and Bower Part2 - Grunt (Update: 2014/7/15)</title><link>http://bamboobig.blogspot.com/2014/07/angularjs-requirejs-grunt-and-bower.html</link><category>AngularJs</category><category>ASP.NET</category><category>Bower</category><category>Github</category><category>Grunt</category><category>MVC</category><category>RequireJs</category><category>Yoeman</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 2 Jul 2014 11:29:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-465665583914685382</guid><description>&lt;p&gt;This article is part of a series of posts on RequireJs, AnguarJs, Grunt and Bower. Here are the parts so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/06/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AngularJs, RequireJs, Grunt and Bower Part2 - Grunt&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_14.html"&gt;AngularJs, RequireJs, Grunt and Bower Part3 - generator-angular-requirejs-grunt-bower with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_15.html"&gt;AngularJs, RequireJs, Grunt and Bower Part4 - How to extend your own code with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;AngularJs, RequireJs, Grunt and Bower Part5 - generator-angular-requirejs-grunt-bower with Express.js &lt;strong&gt;//to be done&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;&lt;div class="se-section-delimiter"&gt;&lt;/div&gt;

&lt;h3 id="grunt"&gt;Grunt&lt;/h3&gt;

&lt;p&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmC3skxYdwnlcm14sUR_qWESHHX71_dytuHUZUMl1UsM_yeOVyofVA7QZhEtS9AmUZ1gTzXRxcax2LUyxmusp2fhmTzQ6Z7pZpQaa8qfZ0Bl6hwGvw86Pj15pqqKlUz64epQH_iu7z_3kP/s288/grunt.png" alt="Grunt" title=""&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h4 id="why-use-a-task-runner"&gt;Why use a task runner?&lt;/h4&gt;
  
  &lt;p&gt;In one word: automation. The less work you have to do when performing repetitive tasks like minification, compilation, unit testing, linting, etc, the easier your job becomes. After you’ve configured it, a task runner can do most of that mundane work for you—and your team—with basically zero effort.&lt;/p&gt;
  
  &lt;h4 id="why-use-grunt"&gt;Why use Grunt?&lt;/h4&gt;
  
  &lt;p&gt;The Grunt ecosystem is huge and it’s growing every day. With literally hundreds of plugins to choose from, you can use Grunt to automate just about anything with a minimum of effort. If someone hasn’t already built what you need, authoring and publishing your own Grunt plugin to npm is a breeze.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are familiar with &lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt;. You could feel how powerful it is, how could it reduce your repetitive tasks and make your work more easier.&lt;/p&gt;

&lt;h3 id="grunt-with-our-aspnet-mvc-project"&gt;Grunt with our ASP.NET MVC Project&lt;/h3&gt;

&lt;h4 id="concept"&gt;Concept&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-markup"&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="typ"&gt;Public&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; js
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; controllers
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; css
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; directives
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; services
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; vendor
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; filters
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; views
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; config&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
    &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; release
        &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; views
        &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
        &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; config&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js       &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAu1d_N6OePsm9y_SN25UWgqHQX2rtzPRaRsLd_g3m9FqPmnHtQpfaSveNIdMMUc2qyOWh6uOC1i0npoFl_xZXlNHd09zzYW5kz8tSyrNvibN0Y0o-I7_L5ksSQ5CXpJTwY2_ih74KEB7/s960/AnguarJs%2520RequireJs%252C%2520Grunt%2520and%2520Bower%2520%25281%2529.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAu1d_N6OePsm9y_SN25UWgqHQX2rtzPRaRsLd_g3m9FqPmnHtQpfaSveNIdMMUc2qyOWh6uOC1i0npoFl_xZXlNHd09zzYW5kz8tSyrNvibN0Y0o-I7_L5ksSQ5CXpJTwY2_ih74KEB7/s600/AnguarJs%2520RequireJs%252C%2520Grunt%2520and%2520Bower%2520%25281%2529.png" alt="RequireJs, AnguarJs, Grunt, Bower overview" title=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://bamboobig.blogspot.tw/2014/06/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC ~ 竹部落&lt;/a&gt; post. We talk about how to integrate AngularJs, RequireJs, Grunt and Bower with our ASP.NET MVC project and put all of code in &lt;code&gt;Public/js&lt;/code&gt; folder. Browser will load those files one by one by following RequireJs definition and dependencies we define in &lt;code&gt;Public/js/config.js&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Be a large AngularJs single page application, you might include a lots of file to the project. For example: in our ASP.NET MVC project. Implement the file structure i mentioned in last post. Browser will load more the 20 file. Web page loading speed will increase if browser load more files. During development, separation of concerns (SoC) will help us to break down the problem to smaller. So, we need a solution to help us to combine related file and decrease web page loding speed in release mode. That’s Rquirejs + Grunt.&lt;/p&gt;

&lt;h4 id="requirejs-grunt"&gt;RequireJs + Grunt&lt;/h4&gt;

&lt;p&gt;Our gold is improve page loading speed by reduce include file count in our project in final release/product. RequireJs has an optimization tool can help us to combine related file and minifies them and &lt;code&gt;grunt-contrib-requirejs&lt;/code&gt; and put &lt;a href="http://requirejs.org/"&gt;RequireJs&lt;/a&gt; work with &lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt; well.&lt;/p&gt;

&lt;h5 id="requirejs-optimizer"&gt;REQUIREJS OPTIMIZER&lt;/h5&gt;

&lt;blockquote&gt;
  &lt;p&gt;Combines related scripts together into build layers and minifies them via &lt;a href="https://github.com/mishoo/UglifyJS"&gt;UglifyJS&lt;/a&gt; (the default) or &lt;a href="http://code.google.com/closure/compiler/"&gt;Closure Compiler&lt;/a&gt; (an option when using Java). &lt;br&gt;
  Optimizes CSS by inlining CSS files referenced by @import and removing comments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id="gruntfilejs"&gt;Gruntfile.js&lt;/h5&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;exports &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;grunt&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;'use strict'&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'load-grunt-tasks'&lt;/span&gt;&lt;span class="pun"&gt;)(&lt;/span&gt;&lt;span class="pln"&gt;grunt&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

    &lt;/span&gt;&lt;span class="com"&gt;// configurable paths&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; mvcConfig &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        js&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'js'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        release&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'release'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        tmp&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'tmp'&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;span class="pln"&gt;

    grunt&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;initConfig&lt;/span&gt;&lt;span class="pun"&gt;({&lt;/span&gt;&lt;span class="pln"&gt;
        mvc&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; mvcConfig&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        clean&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        copy&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        requirejs&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        concat&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        uglify&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        htmlmin&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        jshint&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...},&lt;/span&gt;&lt;span class="pln"&gt;
        cssmin&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{...}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;

    &lt;/span&gt;&lt;span class="com"&gt;// task&lt;/span&gt;&lt;span class="pln"&gt;
    grunt&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;registerTask&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'build'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'clean:release'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'clean:tmp'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'copy:vendor'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'copy:module'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'requirejs'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'copy:basic'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'copy:css'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'cssmin'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'clean:tmp'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'htmlmin'&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

    grunt&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;registerTask&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'default'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'jshint'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'build'&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGEWgX1epaD7nmi0GsQQZxhBxq3XPlJ9orO7i20NAuyts3JN1y0KyhhH_Gaf_9Zge1HLMo2E4Vr1afEYgdiPpG9_M2RdOjBqxBii-nRbAUpjfp8kUYmn4p6rExl0kQsAwnZBfCHJoYebEw/s1000/AngularJs%252C+RequireJs%252C+Grunt+and+Bower+Part2+-+Grunt-+Gruntfile.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGEWgX1epaD7nmi0GsQQZxhBxq3XPlJ9orO7i20NAuyts3JN1y0KyhhH_Gaf_9Zge1HLMo2E4Vr1afEYgdiPpG9_M2RdOjBqxBii-nRbAUpjfp8kUYmn4p6rExl0kQsAwnZBfCHJoYebEw/s600/AngularJs%252C+RequireJs%252C+Grunt+and+Bower+Part2+-+Grunt-+Gruntfile.png" alt="Grunt scenario" title="AngularJs, RequireJs, Grunt and Bower Part2 - Grunt- Gruntfile.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can define multiple grunt tasks in &lt;code&gt;Gruntfile.js&lt;/code&gt;. All you need to do is executing command &lt;code&gt;grunt&lt;/code&gt;. Grunt will execute all of tasks one by one. How, let we check before doing the grunt task.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using &lt;code&gt;bower&lt;/code&gt; package manager to handle what library we include and put all libraries in &lt;code&gt;vendor&lt;/code&gt;. Ex: AngularJs, jQuery , moment ects.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.js&lt;/code&gt; define the library dependencies and library path.&lt;/li&gt;
&lt;li&gt;implement file structure as we mentioned before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our Grunt scenario is copy required file from &lt;code&gt;public/js/...&lt;/code&gt; to &lt;code&gt;public/tmp/...&lt;/code&gt; folder.  Grunt task &lt;code&gt;requirejs:complie&lt;/code&gt; will combine scripts together and put it in &lt;code&gt;public/release&lt;/code&gt; folder. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;grunt-contrib-requirejs&lt;/code&gt; optimize RequireJS projects using r.js. Most of needed configuration is same as RequireJs required but file path. We need to modify file path to our temporary folder &lt;code&gt;tmp&lt;/code&gt;.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt; paths&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'../&amp;lt;%= mvc.tmp %&amp;gt;/vendor/angular'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'jquery'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'../&amp;lt;%= mvc.tmp %&amp;gt;/vendor/jquery.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One more thing. We need to replace file path in our release RequireJs &lt;code&gt;config.js&lt;/code&gt; from &lt;code&gt;js&lt;/code&gt; to &lt;code&gt;release&lt;/code&gt;. It will make sure relese RequireJs &lt;code&gt;config.js&lt;/code&gt; is reference to current source folder.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt;onBuildRead&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;moduleName&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; path&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; contents&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;if&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;moduleName &lt;/span&gt;&lt;span class="pun"&gt;===&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'config'&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; x &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;contents&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; regex &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;/'(vendor|libs)[^']*'/&lt;/span&gt;&lt;span class="pln"&gt;gm&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; matches &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; contents&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;match&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;regex&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;for&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; i &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;0&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt; i &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt; matches&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;length&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt; i&lt;/span&gt;&lt;span class="pun"&gt;++)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; match &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; matches&lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;i&lt;/span&gt;&lt;span class="pun"&gt;];&lt;/span&gt;&lt;span class="pln"&gt;
                &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; m &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; matches&lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;i&lt;/span&gt;&lt;span class="pun"&gt;].&lt;/span&gt;&lt;span class="pln"&gt;split&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'/'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
                contents &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; contents&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;replace&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;match&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'\'vendor/'&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; m&lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;m&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;length &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;].&lt;/span&gt;&lt;span class="pln"&gt;toLowerCase&lt;/span&gt;&lt;span class="pun"&gt;());&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; contents&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;})(&lt;/span&gt;&lt;span class="pln"&gt;contents&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

        &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; x&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;replace&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;/\/public\/js/&lt;/span&gt;&lt;span class="pln"&gt;g&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'/public/release'&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; contents&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Visit to Github to check whole &lt;a href="https://github.com/cage1016/AngularJsRequireJsGruntBower/blob/master/AngularJsRequireJsGruntBower/Public/Gruntfile.js"&gt;Gruntfile.js&lt;/a&gt; file. &lt;/p&gt;

&lt;h5 id="buildtxt"&gt;build.txt&lt;/h5&gt;

&lt;p&gt;After you execute command &lt;code&gt;grunt&lt;/code&gt;. &lt;code&gt;build.txt&lt;/code&gt; will be created automatically.  It is a &lt;code&gt;requirejs:complie&lt;/code&gt; log file and show you a list what libraries and user define scripts are combined together base on &lt;code&gt;Gruntfile.js&lt;/code&gt; &lt;code&gt;requirejs&lt;/code&gt; complie module setting.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// config.js&lt;/span&gt;&lt;span class="pln"&gt;
requirejs&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    compile&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        options&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
            modules&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[{&lt;/span&gt;&lt;span class="pln"&gt;
                name&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'views/Home/index'&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;}],&lt;/span&gt;&lt;span class="pln"&gt;
            &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// build.txt&lt;/span&gt;&lt;span class="pln"&gt;
views&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="typ"&gt;Home&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;----------------&lt;/span&gt;&lt;span class="pln"&gt;
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;jquery&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;min&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;moment&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;min&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;respond&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
controllers&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;controllers&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
filters&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;filters&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
directives&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;directives&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;resource&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
services&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;services&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;animate&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;cookies&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;route&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;sanitize&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;angular&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;touch&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;bootstrap&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;min&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;ui&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;bootstrap&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;min&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;ui&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;bootstrap&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;tpls&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;min&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
vendor&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;domReady&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
controllers&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;home&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
views&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="typ"&gt;Home&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="preview"&gt;Preview&lt;/h3&gt;

&lt;p&gt;Final step, we need to change solution configuration from &lt;code&gt;Debug&lt;/code&gt; to &lt;code&gt;Release&lt;/code&gt; in Visual Studio toolbar and rebuild the project. Open Chrome Developer tools and switch to Network panel. You will see browser load two files &lt;code&gt;config.js&lt;/code&gt; and &lt;code&gt;index.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiU5hVYBpPjY_VhmpYdv4ExshQO3VW5T7yTYk0EGRi6DMPp7Qzb1YlnRoTSOpQQbSNR18sWVTF7HnPbeyZDNY4uW87bAsvScpe9uHnrdhotTf9t3faoKPQPAq149av2EjMQIImZmgNTSGB/s1000/%25E8%259E%25A2%25E5%25B9%2595%25E6%2593%25B7%25E5%258F%2596%25E7%2595%25AB%25E9%259D%25A2_070114_045705_PM.jpg"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiU5hVYBpPjY_VhmpYdv4ExshQO3VW5T7yTYk0EGRi6DMPp7Qzb1YlnRoTSOpQQbSNR18sWVTF7HnPbeyZDNY4uW87bAsvScpe9uHnrdhotTf9t3faoKPQPAq149av2EjMQIImZmgNTSGB/s600/%25E8%259E%25A2%25E5%25B9%2595%25E6%2593%25B7%25E5%258F%2596%25E7%2595%25AB%25E9%259D%25A2_070114_045705_PM.jpg" alt="Release mode" title="螢幕擷取畫面_070114_045705_PM.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="reference"&gt;Reference&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://gruntjs.com/"&gt;Grunt: The JavaScript Task Runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://requirejs.org/"&gt;RequireJs&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="github-source-code"&gt;Github Source Code&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/cage1016/AngularJsRequireJsGruntBower"&gt;cage1016/AngularJsRequireJsGruntBower&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you clone source code from github repo, you can run following command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-0&lt;/code&gt; is status project created&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-1&lt;/code&gt; is status Nuget install Require.js.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-2&lt;/code&gt; is status project Add AngularJs, RequireJs, Grunt and Bower to Public folder.       &lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-3&lt;/code&gt; is status modify _Layout.chtml to render RequireJs. You will see the final result.  &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;bower install&lt;/code&gt; to restore those library project included.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f setp-4&lt;/code&gt; is status ready to do grunt tasks. &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;npm install&lt;/code&gt; to restore &lt;code&gt;grunt&lt;/code&gt; required libraries. &lt;/li&gt;
&lt;li&gt;execute command &lt;code&gt;grunt&lt;/code&gt; to do grunt tasks.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmC3skxYdwnlcm14sUR_qWESHHX71_dytuHUZUMl1UsM_yeOVyofVA7QZhEtS9AmUZ1gTzXRxcax2LUyxmusp2fhmTzQ6Z7pZpQaa8qfZ0Bl6hwGvw86Pj15pqqKlUz64epQH_iu7z_3kP/s72-c/grunt.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">52</thr:total></item><item><title>AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC (update:2014/7/16)</title><link>http://bamboobig.blogspot.com/2014/06/angularjs-requirejs-grunt-and-bower.html</link><category>AngularJs</category><category>ASP.NET</category><category>Bower</category><category>Github</category><category>Grunt</category><category>MVC</category><category>RequireJs</category><category>Yoeman</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sat, 28 Jun 2014 13:20:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-1881533787916943875</guid><description>&lt;p&gt;This article is part of a series of posts on RequireJs, AnguarJs, Grunt and Bower. Here are the parts so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AngularJs, RequireJs, Grunt and Bower Part1 - Getting Started and concept with ASP.NET MVC.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower.html"&gt;AngularJs, RequireJs, Grunt and Bower Part2 -  Grunt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_14.html"&gt;AngularJs, RequireJs, Grunt and Bower Part3 -  generator-angular-requirejs-grunt-bower with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bamboobig.blogspot.tw/2014/07/angularjs-requirejs-grunt-and-bower_15.html"&gt;AngularJs, RequireJs, Grunt and Bower Part4 - How to extend your own code with ASP.NET MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;AngularJs, RequireJs, Grunt and Bower Part5 - Yoeman generator-angular-requirejs-grunt-bower with Express.js &lt;strong&gt;//to be done&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;There are more and more fancy web applications. Developers have one same gold that they want their visitors have better user experience. So, they start working with heave JavaScript. (&lt;a href="https://angularjs.org/"&gt;AngularJs&lt;/a&gt;, &lt;a href="http://backbonejs.org/"&gt;Backbone.js&lt;/a&gt;, &lt;a href="http://emberjs.com/"&gt;Emberjs&lt;/a&gt; etc.).&lt;/p&gt;

&lt;p&gt;There are dozen of awesome Javascript frameworks now, You can choose the suitable one for your project. In my company, we use ASP.NET MVC to develop web application. From ASP.NET MVC 2, 3, 4 to 5. I am looking a good practice to implement a good Javascript framework to my project till i meet &lt;a href="https://angularjs.org/" title="AngularJS — Superheroic JavaScript MVW Framework"&gt;AngularJs&lt;/a&gt;. AngularJs Javascript is top 10 Github repo until now and hosted by Google.&lt;/p&gt;

&lt;p&gt;It’s very easy to use AngularJs in your web application &lt;strong&gt;&lt;em&gt;page&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-markup"&gt;&lt;span class="dec"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;html&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;ng-app&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;src&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.13/angular.min.js"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
      &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;Name:&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
      &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;input&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;type&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"text"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;ng-model&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"yourName"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;placeholder&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"Enter a name here"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
      &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;hr&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
      &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;Hello {{yourName}}!&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Above is a simple sample code from &lt;a href="https://angularjs.org/"&gt;AngularJs&lt;/a&gt; official page. live demo &lt;a href="https://angularjs.org/#the-basics"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MVVM concept and powerful two-way databinding can help you solve the problem you might working hard with &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. But for the large web application. Is a better way to integrate AngularJs in your project? &lt;strong&gt;&lt;em&gt;YES&lt;/em&gt;&lt;/strong&gt;, you can re-factor your code to module and include it to project.&lt;/p&gt;&lt;div class="se-section-delimiter"&gt;&lt;/div&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// i define a ui.tiff module to hanle tiff viewer&lt;/span&gt;&lt;span class="pln"&gt;
angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.controller'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.service'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.directive'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.filter'&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;
angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.controller'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[]).&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'_aCtrl'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$scope'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$scope&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.service'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[]).&lt;/span&gt;&lt;span class="pln"&gt;factory&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ImageInfo'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'$resource'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;$resource&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.directive'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[]).&lt;/span&gt;&lt;span class="pln"&gt;directive&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'tiffClick'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;]);&lt;/span&gt;&lt;span class="pln"&gt;

angular&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'ui.tiff.filter'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[]).&lt;/span&gt;&lt;span class="pln"&gt;filter&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'thumbnail'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="concept"&gt;Concept&lt;/h3&gt;

&lt;p&gt;Be an ASP.NET MVC developer. How can we integrate APS.NET MVC with AngulaJs as well? ASP.NET MVC can render &lt;code&gt;view&lt;/code&gt; page for each &lt;code&gt;controller&lt;/code&gt; method. for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Views/&lt;code&gt;Home&lt;/code&gt;/Index&lt;/li&gt;
&lt;li&gt;Views/&lt;code&gt;Home&lt;/code&gt;/About&lt;/li&gt;
&lt;li&gt;Views/&lt;code&gt;Management&lt;/code&gt;/Index&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Above route URL, we can get different ASP.NET MVC view page. But, i want to treat each of them as individual &lt;strong&gt;SPA&lt;/strong&gt; (single page appliation) and share the same code (AngluarJs server or AngularJs filter modules etc.) for different &lt;strong&gt;SPA&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Views/&lt;code&gt;Home&lt;/code&gt;/Index (&lt;strong&gt;SPA&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Views/&lt;code&gt;Home&lt;/code&gt;/About (&lt;strong&gt;SPA&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Views/Home/Contact&lt;/li&gt;
&lt;li&gt;Views/&lt;code&gt;Management&lt;/code&gt;/Index (&lt;strong&gt;SPA&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Dan Wahlin&lt;/strong&gt; has many awesome articles talk about ASP.NET MVC with AngularJs&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin"&gt;Dan Wahlin - Dan Wahlin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://flipboard.com/section/the-angularjs-magazine-bbIMWS"&gt;The AngularJS Magazine - Flipboard&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3 id="scenario"&gt;Scenario&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Yngve Bakken Nilsen&lt;/strong&gt; has a awesome article talk about &lt;a href="http://blog.novanet.no/making-requirejs-play-nice-with-aspnet-mvc/"&gt;Making RequireJS play nice with ASP.NET MVC&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="requirejs"&gt;RequireJs&lt;/h4&gt;

&lt;p&gt;In a heavey Javascript project. you might load more than 10 Javascript libraries easily. One of most important issues is to figure out Javascript library dependency and library synchronous loading. &lt;a href="http://requirejs.org/"&gt;RequireJs&lt;/a&gt; is a &lt;code&gt;JavaScript file and module loader.&lt;/code&gt;You can define library dependency (not worry which library should be loaded earlier than another one.) and avoid page loading block problem.&lt;/p&gt;

&lt;p&gt;My solution is base on &lt;strong&gt;Yngve Bakken Nilsen&lt;/strong&gt; article (RequierJs with ASP.NET MVC) but integrate with AngularJs, Grunt and Bower.&lt;/p&gt;

&lt;h4 id="aspnet-mvc-file-structure"&gt;ASP.NET MVC File Structure&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-markup"&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Controller&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;HomeController&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Views&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Home&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;About&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;cshtml
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Contact&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;cshtml
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;cshtml
&lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Models&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Above is ASP.NET MVC normal file structure. You can add &lt;code&gt;NameController&lt;/code&gt; and assign view template &lt;code&gt;views/ControllerName/ActionName&lt;/code&gt; to render view page. As i menetioned before, i’ll like to treat &lt;code&gt;Views/Controler&lt;/code&gt; as &lt;strong&gt;SPA&lt;/strong&gt;. so, i rearrange the basic file strcutre and put all of Javscript file in &lt;code&gt;Public&lt;/code&gt; folder.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;for the &lt;code&gt;controller&lt;/code&gt; has more than one action view page. I move those page to front-end AngularJs framework. AngularJs route will handle this part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="angularjs-requirejs-grunt-and-bower-overview"&gt;AngularJs, RequireJs, Grunt and Bower OverView&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi76CluVsC9cs0gTt8P2AWWVAx9p2GkheDkxo6XnPpBGCdM-tu18S-ANHh4gwPlrB-90pBHVyp1i4QTWC6SRGuMlIIFrCNyOVt99YlzSCFX73r1xkf0ULbjQ3nveWmDWp_4mV4gjuFy-Uku/s960/AnguarJs%2520RequireJs%252C%2520Grunt%2520and%2520Bower.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi76CluVsC9cs0gTt8P2AWWVAx9p2GkheDkxo6XnPpBGCdM-tu18S-ANHh4gwPlrB-90pBHVyp1i4QTWC6SRGuMlIIFrCNyOVt99YlzSCFX73r1xkf0ULbjQ3nveWmDWp_4mV4gjuFy-Uku/s600/AnguarJs%2520RequireJs%252C%2520Grunt%2520and%2520Bower.png" alt="RequireJs, AnguarJs, Grunt, Bower overview" title=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above diagram is whole project overview. RequireJs let us can include specific library we needed. All Javascript codes are put in &lt;code&gt;Public&lt;/code&gt; folder. &lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-markup"&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="typ"&gt;Public&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; controllers
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; controllers&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; home&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;controller&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; css
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; directives
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; directives&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; home&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;directive&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; services
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; services&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; vendor
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; filters
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; filters&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; common&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;filer&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; views
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Management&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; partials
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; management&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;html
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Home&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; partials
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; home&lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt;index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;html
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; app&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; config&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;js
&lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; release
&lt;/span&gt;&lt;span class="typ"&gt;Views&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;├──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Management&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;   &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;cshtml    
    &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Home&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;└──&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Index&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;cshtml    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see the modified file structure. &lt;code&gt;Public/js/views&lt;/code&gt; file structure like ASP.NET MVC &lt;code&gt;Views&lt;/code&gt;. So, we could dynamic to load &lt;strong&gt;SPA&lt;/strong&gt; by RequireJs if we have defined it in &lt;code&gt;Public/js/views/mapping to ASP.NET MVC controller&lt;/code&gt;.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;// Route: http://localhost/Home/Index&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"/public/js/config.js"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"views/Home/Index"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt; 
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;span class="pln"&gt;

&lt;/span&gt;&lt;span class="com"&gt;// Route: http://localhost/Account/Index&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="com"&gt;// no any AngularJs application will be loaded.&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"/public/js/config.js"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;function&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt; 
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="angularjs-application"&gt;Angularjs Application&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuC8li1uMT6y1E9esvpArZAgJPKAyA3ZkBZYHY2IFyB5nzrUnMkFWunSgbDznUhgTtzNVjURbRKCmDxe9MUQOQHSJTwp-iUqU3I8B2UwjHxgasDbbBdP1u8nU9T6dry1VFctiYE2FxzYks/s1350/AngularJs%2520Application%2520Diagram.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuC8li1uMT6y1E9esvpArZAgJPKAyA3ZkBZYHY2IFyB5nzrUnMkFWunSgbDznUhgTtzNVjURbRKCmDxe9MUQOQHSJTwp-iUqU3I8B2UwjHxgasDbbBdP1u8nU9T6dry1VFctiYE2FxzYks/s600/AngularJs%2520Application%2520Diagram.png" alt="AngularJs, RequireJs concept" title=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic concept is that i want to treat ASP.NET MVC route &lt;code&gt;Views/ControllerName&lt;/code&gt; as a individual  AngularJs &lt;strong&gt;SPA&lt;/strong&gt; and &lt;em&gt;Dynamic&lt;/em&gt; be loaded if i have defined it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define AngularJs module using RequireJs &lt;code&gt;define&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Include needed module with RequireJs &lt;code&gt;require&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can define task orientation AngularJs module as you can see in above diagram. It’s easy to include specific controller, service, filter and direcitve that inherent from &lt;code&gt;controllers/controllers&lt;/code&gt;, &lt;code&gt;services/services&lt;/code&gt;, &lt;code&gt;filters/filters&lt;/code&gt; and &lt;code&gt;directives/directives&lt;/code&gt; in application. Put all together and bootstrap AngularJs application when DOM ready.&lt;/p&gt;

&lt;p&gt;Everything looks so good but RequireJs &lt;code&gt;config.js&lt;/code&gt;. I have to tell RequireJs the external libraries path and module name i include to the application. There are more information about RequireJs configuration in &lt;a href="http://requirejs.org/docs/api.html#config"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;config&lt;/span&gt;&lt;span class="pun"&gt;({&lt;/span&gt;&lt;span class="pln"&gt;
    baseUrl&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"/public/js"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    waitSeconds&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;200&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    paths&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular/angular.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.zh-tw'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-i18n/angular-locale_zh-tw'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.route'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-route/angular-route.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.resource'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-resource/angular-resource.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.animate'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-animate/angular-animate.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.sanitize'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-sanitize/angular-sanitize.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.cookies'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-cookies/angular-cookies.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;

        &lt;/span&gt;&lt;span class="str"&gt;'jquery'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/jquery/jquery.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'moment'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/momentjs/min/moment.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'respond'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/respond/dest/respond.src'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'domReady'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/requirejs-domready/domReady'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;

        &lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/bootstrap/dist/js/bootstrap.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrap'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-ui-bootstrap-bower/ui-bootstrap.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrapTpl'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'vendor/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
    shim&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'moment'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            exports&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'moment'&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            deps&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'jquery'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'moment'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
            exports&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.zh-tw'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.route'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.resource'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.sanitize'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.animate'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'angular.cookies'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'respond'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            exports&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'respond'&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            deps&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'jquery'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
            exports&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrap'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            deps&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'bootstrap'&lt;/span&gt;&lt;span class="pun"&gt;],&lt;/span&gt;&lt;span class="pln"&gt;
            exports&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrap'&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrapTpl'&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
            deps&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'angular'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'uiBootstrap'&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="com"&gt;//urlArgs: "bust=" + (new Date()).getTime()&lt;/span&gt;&lt;span class="pln"&gt;
    urlArgs&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"bust=v8"&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s very convenient to integrate &lt;a href="http://bower.io/"&gt;Bower&lt;/a&gt; package manager with your project. I put all of external libraries in &lt;code&gt;vendor&lt;/code&gt; and save those library in &lt;code&gt;bower.json&lt;/code&gt;. You can restore those libaries by execute command &lt;code&gt;bower install&lt;/code&gt;&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="com"&gt;//bower.json&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="str"&gt;"name"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"application name"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="str"&gt;"version"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"0.0.1"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="str"&gt;"dependencies"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{},&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="str"&gt;"devDependencies"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"requirejs-domready"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~2.0.1"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-route"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-resource"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-sanitize"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-cookies"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"momentjs"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~2.5.1"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-animate"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"respond"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.4.2"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"jquery"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"1.10.2"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"bootstrap"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~3.1.1"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-i18n"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular-ui-bootstrap-bower"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~0.11.0"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"moment"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~2.6.0"&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="pun"&gt;},&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="str"&gt;"resolutions"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="str"&gt;"angular"&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"~1.2.16"&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="intergrate-with-aspnet-mvc"&gt;Intergrate with ASP.NET MVC&lt;/h4&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code class="language-javascript"&gt;&lt;span class="pln"&gt;    &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; action &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; helper&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;ViewContext&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;RouteData&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Values&lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;"action"&lt;/span&gt;&lt;span class="pun"&gt;];&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; controller &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; helper&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;ViewContext&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;RouteData&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Values&lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;"controller"&lt;/span&gt;&lt;span class="pun"&gt;];&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;string&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;string&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Format&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"views/{0}/{1}"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; controller&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; action&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;

    &lt;/span&gt;&lt;span class="kwd"&gt;string&lt;/span&gt;&lt;span class="pln"&gt; jsLocation &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"/public/js/"&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;if&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="typ"&gt;File&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Exists&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;helper&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;ViewContext&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;HttpContext&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Server&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;MapPath&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="typ"&gt;Path&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Combine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;jsLocation&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;".js"&lt;/span&gt;&lt;span class="pun"&gt;))))&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"require( [ \""&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; jsLocation &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; core &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"\" ], function() {"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"    require( [ \""&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;module&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"\"] );"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"});"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="kwd"&gt;else&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"require( [ \""&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; jsLocation &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; core &lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"\" ], function() {"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"    require( [ \"jquery\", \"bootstrap\" ] );"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="kwd"&gt;require&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;AppendLine&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"});"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;
    &lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Final step. All you need to do is go &lt;code&gt;Views/Shared/_Layout.cshtml&lt;/code&gt; and add &lt;code&gt;@Html.ViewSpecificRequireJS()&lt;/code&gt; before body close tag. &lt;code&gt;@Html.ViewSpecificRequireJS()&lt;/code&gt; is a ASP.NET MVC static method and it will read your project file structure. If you define an application in &lt;code&gt;/public/js/view/Home&lt;/code&gt; and ASP.NET MVC route is mapping to &lt;code&gt;views/controllerName&lt;/code&gt;. &lt;code&gt;@Html.ViewSpecificRequireJS()&lt;/code&gt; static method will redener it, otherwise not. Don’t forget to include &lt;code&gt;@Html.ViewSpecificRequireJS()&lt;/code&gt; Namespace &lt;code&gt;@using Requirejs.Helpers&lt;/code&gt; in top of &lt;code&gt;Views/Shared/_Layout.cshtml&lt;/code&gt; page.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;you have to add &lt;code&gt;&amp;lt;div ng-view&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt; to thoes ASP.NET MVC &lt;code&gt;views&lt;/code&gt; page for AngularJs route.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="preview"&gt;Preview&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwwHv0aEDZy8S3Y6rEc8DrDI7EhRiXW_vQ-DauLGCTIgJJbkOBKDIAMn79F2BbasPy3bdHENGdfGauHwDtg5zyQI4s2NmpsdmNrDl5WMvqIx8PkQJnPHgXPcUqXOpsw5a1hJQqMPTezoRF/s2048/AngularJsRequireJsGruntBower-Network.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwwHv0aEDZy8S3Y6rEc8DrDI7EhRiXW_vQ-DauLGCTIgJJbkOBKDIAMn79F2BbasPy3bdHENGdfGauHwDtg5zyQI4s2NmpsdmNrDl5WMvqIx8PkQJnPHgXPcUqXOpsw5a1hJQqMPTezoRF/s600/AngularJsRequireJsGruntBower-Network.png" alt="AngularJs, RequireJs concept" title=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyM6ZgIglMNZfoLzCdVIu2XFb2JekUq_U0LdMQxayJloKJz0B5vfsP_bqv58CRyhUEw1JXuPMtqoJzWIuiet32xk7QpzzP4xJjnYfz-nPTaDpInjzhK9HK5GlLb2vcRn9dPRtG_37aorSG/s800/Home%2520Page%2520-%2520My%2520ASP%2520NET%2520Application.png"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyM6ZgIglMNZfoLzCdVIu2XFb2JekUq_U0LdMQxayJloKJz0B5vfsP_bqv58CRyhUEw1JXuPMtqoJzWIuiet32xk7QpzzP4xJjnYfz-nPTaDpInjzhK9HK5GlLb2vcRn9dPRtG_37aorSG/s500/Home%2520Page%2520-%2520My%2520ASP%2520NET%2520Application.png" alt="AngularJs, RequireJs concept" title=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="reference"&gt;Reference&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://goo.gl/qgkapf"&gt;Making RequireJS play nice with ASP.NET MVC&lt;/a&gt; by &lt;strong&gt;Yngve Bakken Nilsen&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://requirejs.org/docs/api.html#config"&gt;RequireJS API config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bower.io/"&gt;Bower&lt;/a&gt; Package manager&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin"&gt;Dan Wahlin - Dan Wahlin&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="github-source-code"&gt;Github Source Code&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/cage1016/AngularJsRequireJsGruntBower"&gt;cage1016/AngularJsRequireJsGruntBower&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you clone source code from github repo, you can run following command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-0&lt;/code&gt; is status project created&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-1&lt;/code&gt; is status Nuget install Require.js.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-2&lt;/code&gt; is status project Add AngularJs, RequireJs, Grunt and Bower to Public folder.       &lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f step-3&lt;/code&gt; is status modify _Layout.chtml to render RequireJs. You will see the final result.  &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;bower install&lt;/code&gt; to restore those library project included.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -f setp-4&lt;/code&gt; is status ready to do grunt tasks. &lt;br&gt;
&lt;ul&gt;&lt;li&gt;Please cd to &lt;code&gt;AngularJsRequireJsGruntBower\AngularJsRequireJsGruntBower\Public&lt;/code&gt; and execute &lt;code&gt;npm install&lt;/code&gt; to restore &lt;code&gt;grunt&lt;/code&gt; required libraries. &lt;/li&gt;
&lt;li&gt;execute command &lt;code&gt;grunt&lt;/code&gt; to do grunt tasks.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi76CluVsC9cs0gTt8P2AWWVAx9p2GkheDkxo6XnPpBGCdM-tu18S-ANHh4gwPlrB-90pBHVyp1i4QTWC6SRGuMlIIFrCNyOVt99YlzSCFX73r1xkf0ULbjQ3nveWmDWp_4mV4gjuFy-Uku/s72-c/AnguarJs%2520RequireJs%252C%2520Grunt%2520and%2520Bower.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">28</thr:total></item><item><title>Welcome document</title><link>http://bamboobig.blogspot.com/2014/06/welcome-document.html</link><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 4 Jun 2014 21:07:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-1075785254682940347</guid><description>&lt;h1 id="welcome"&gt;Welcome to StackEdit!  &lt;/h1&gt;

&lt;p&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg70BVdnj1NOpAbAf2nIfVe-w4AdAAGiLRf2px7w6NZBpJ06dPf9xV51YRTSoI10PVUC9cvBWa8rw0D0arUz_J0T5Cjta2KUosff2eDQzRm8omEU0bHFgI5fW42fztdSLaxn3QyaBPl_0Lb/s400/" alt="this id d" title="2014-03-26"&gt;&lt;/p&gt;

&lt;p&gt;Hello, I am your first Markdown document within &lt;strong&gt;StackEdit&lt;/strong&gt;&lt;a href="#fn:stackedit" id="fnref:stackedit" title="See footnote" class="footnote"&gt;1&lt;/a&gt;. Don’t delete me, I can be helpful. I can be recovered anyway in the &lt;code&gt;Utils&lt;/code&gt; tab of the &lt;i class="icon-cog"&gt;&lt;/i&gt; &lt;code&gt;Settings&lt;/code&gt; dialog.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id="documents"&gt;Documents&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StackEdit&lt;/strong&gt; stores your documents in your browser, which means all your documents are automatically saved locally and are accessible &lt;strong&gt;offline!&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;StackEdit is accessible offline after the application has been loaded for the first time.&lt;/li&gt;
  &lt;li&gt;Your local documents are not shared between different browsers or computers.&lt;/li&gt;
  &lt;li&gt;Clearing your browser’s data may &lt;strong&gt;delete all your local documents!&lt;/strong&gt; Make sure your documents are backed up using &lt;strong&gt;Google Drive&lt;/strong&gt; or &lt;strong&gt;Dropbox&lt;/strong&gt; synchronization (see &lt;a href="#synchronization"&gt;&lt;i class="fa fa-share-square-o"&gt;&lt;/i&gt; Synchronization&lt;/a&gt; section).&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h4 id="create-a-document"&gt;&lt;i class="icon-file"&gt;&lt;/i&gt; Create a document&lt;/h4&gt;

&lt;p&gt;You can create a new document by clicking the &lt;i class="icon-file"&gt;&lt;/i&gt; button in the navigation bar. It will switch from the current document to the new one.&lt;/p&gt;

&lt;h4 id="switch-to-another-document"&gt;&lt;i class="icon-folder-open"&gt;&lt;/i&gt; Switch to another document&lt;/h4&gt;

&lt;p&gt;You can list all your local documents and switch from one to another by clicking the &lt;i class="icon-folder-open"&gt;&lt;/i&gt; button in the navigation bar.&lt;/p&gt;

&lt;h4 id="rename-a-document"&gt;&lt;i class="icon-pencil"&gt;&lt;/i&gt; Rename a document&lt;/h4&gt;

&lt;p&gt;You can rename the current document by clicking the document title in the navigation bar.&lt;/p&gt;

&lt;h4 id="delete-a-document"&gt;&lt;i class="icon-trash"&gt;&lt;/i&gt; Delete a document&lt;/h4&gt;

&lt;p&gt;You can delete the current document by clicking the &lt;i class="icon-trash"&gt;&lt;/i&gt; button in the navigation bar.&lt;/p&gt;

&lt;h4 id="save-a-document"&gt;&lt;i class="icon-hdd"&gt;&lt;/i&gt; Save a document&lt;/h4&gt;

&lt;p&gt;You can save the current document to a file using the &lt;i class="icon-hdd"&gt;&lt;/i&gt; &lt;code&gt;Save as...&lt;/code&gt; sub-menu from the &lt;i class="icon-provider-stackedit"&gt;&lt;/i&gt; menu.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; See &lt;a href="#publish-a-document"&gt;&lt;i class="icon-share"&gt;&lt;/i&gt; Publish a document&lt;/a&gt; section for a description of the different output formats.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h2 id="synchronization"&gt;Synchronization&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StackEdit&lt;/strong&gt; can be combined with &lt;strong&gt;Google Drive&lt;/strong&gt; and &lt;strong&gt;Dropbox&lt;/strong&gt; to have your documents centralized in the &lt;em&gt;Cloud&lt;/em&gt;. The synchronization mechanism will take care of uploading your modifications or downloading the latest version of your documents.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;Full access to &lt;strong&gt;Google Drive&lt;/strong&gt; or &lt;strong&gt;Dropbox&lt;/strong&gt; is required to be able to import any document in StackEdit.&lt;/li&gt;
  &lt;li&gt;Imported documents are downloaded in your browser and are not transmitted to a server.&lt;/li&gt;
  &lt;li&gt;If you experience problems exporting documents to Google Drive, check and optionally disable browser extensions, such as Disconnect.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h4 id="import-a-document"&gt;&lt;i class="icon-download"&gt;&lt;/i&gt; Import a document&lt;/h4&gt;

&lt;p&gt;You can import a document from the &lt;em&gt;Cloud&lt;/em&gt; by going to the &lt;i class="icon-provider-gdrive"&gt;&lt;/i&gt; &lt;code&gt;Google Drive&lt;/code&gt; or the &lt;i class="icon-provider-dropbox"&gt;&lt;/i&gt; &lt;code&gt;Dropbox&lt;/code&gt; sub-menu and by clicking &lt;code&gt;Import from...&lt;/code&gt;. Once imported, your document will be automatically synchronized with the &lt;strong&gt;Google Drive&lt;/strong&gt; / &lt;strong&gt;Dropbox&lt;/strong&gt; file.&lt;/p&gt;

&lt;h4 id="export-a-document"&gt;&lt;i class="icon-upload"&gt;&lt;/i&gt; Export a document&lt;/h4&gt;

&lt;p&gt;You can export any document by going to the &lt;i class="icon-provider-gdrive"&gt;&lt;/i&gt; &lt;code&gt;Google Drive&lt;/code&gt; or the &lt;i class="icon-provider-dropbox"&gt;&lt;/i&gt; &lt;code&gt;Dropbox&lt;/code&gt; sub-menu and by clicking &lt;code&gt;Export to...&lt;/code&gt;. Even if your document is already synchronized with &lt;strong&gt;Google Drive&lt;/strong&gt; or &lt;strong&gt;Dropbox&lt;/strong&gt;, you can export it to a another location. &lt;strong&gt;StackEdit&lt;/strong&gt; can synchronize one document with multiple locations.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Using &lt;strong&gt;Google Drive&lt;/strong&gt;, you can create collaborative documents to work in real time with other users. Just check the box &lt;code&gt;Create a real time collaborative document&lt;/code&gt; in the dialog options when exporting to Google Drive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="synchronize-a-document"&gt;&lt;i class="icon-refresh"&gt;&lt;/i&gt; Synchronize a document&lt;/h4&gt;

&lt;p&gt;Once your document is linked to a &lt;strong&gt;Google Drive&lt;/strong&gt; or a &lt;strong&gt;Dropbox&lt;/strong&gt; file, &lt;strong&gt;StackEdit&lt;/strong&gt; will periodically (every 3 minutes) synchronize it by downloading/uploading any modification. Any conflict will be detected, and a local copy of your document will be created as a backup if necessary.&lt;/p&gt;

&lt;p&gt;If you just have modified your document and you want to force the synchronization, click the &lt;i class="icon-refresh"&gt;&lt;/i&gt; button in the navigation bar.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The &lt;i class="icon-refresh"&gt;&lt;/i&gt; button is disabled when you have no document to synchronize.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="manage-document-synchronization"&gt;&lt;i class="icon-refresh"&gt;&lt;/i&gt; Manage document synchronization&lt;/h4&gt;

&lt;p&gt;Since one document can be synchronized with multiple locations, you can list and manage synchronized locations by clicking &lt;i class="icon-refresh"&gt;&lt;/i&gt; &lt;code&gt;Manage synchronization&lt;/code&gt; in the &lt;i class="icon-provider-stackedit"&gt;&lt;/i&gt; menu. This will open a dialog box allowing you to add or remove synchronization links that are associated to your document.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; If you delete the file from &lt;strong&gt;Google Drive&lt;/strong&gt; or from &lt;strong&gt;Dropbox&lt;/strong&gt;, the document will no longer be synchronized with that location.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h2 id="publication"&gt;Publication&lt;/h2&gt;

&lt;p&gt;Once you are happy with your document, you can publish it on different websites directly from &lt;strong&gt;StackEdit&lt;/strong&gt;. As for now, &lt;strong&gt;StackEdit&lt;/strong&gt; can publish on &lt;strong&gt;Blogger&lt;/strong&gt;, &lt;strong&gt;Dropbox&lt;/strong&gt;, &lt;strong&gt;Gist&lt;/strong&gt;, &lt;strong&gt;GitHub&lt;/strong&gt;, &lt;strong&gt;Google Drive&lt;/strong&gt;, &lt;strong&gt;Tumblr&lt;/strong&gt;, &lt;strong&gt;WordPress&lt;/strong&gt; and on any SSH server.&lt;/p&gt;

&lt;h4 id="publish-a-document"&gt;&lt;i class="icon-share"&gt;&lt;/i&gt; Publish a document&lt;/h4&gt;

&lt;p&gt;You can publish your document by going to the &lt;i class="icon-share"&gt;&lt;/i&gt; &lt;code&gt;Publish on&lt;/code&gt; sub-menu and by choosing a website. In the dialog box, you can choose the publication format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown, to publish the Markdown text on a website that can interpret it (&lt;strong&gt;GitHub&lt;/strong&gt; for instance),&lt;/li&gt;
&lt;li&gt;HTML, to publish the document converted into HTML (on a blog for instance),&lt;/li&gt;
&lt;li&gt;Template, to have a full control of the output.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The default template is a simple webpage wrapping your document in HTML format. You can customize it in the &lt;code&gt;Services&lt;/code&gt; tab of the &lt;i class="icon-cog"&gt;&lt;/i&gt; &lt;code&gt;Settings&lt;/code&gt; dialog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="update-a-publication"&gt;&lt;i class="icon-share"&gt;&lt;/i&gt; Update a publication&lt;/h4&gt;

&lt;p&gt;After publishing, &lt;strong&gt;StackEdit&lt;/strong&gt; will keep your document linked to that publish location so that you can update it easily. Once you have modified your document and you want to update your publication, click on the &lt;i class="icon-share"&gt;&lt;/i&gt; button in the navigation bar.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The &lt;i class="icon-share"&gt;&lt;/i&gt; button is disabled when the document has not been published yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="manage-document-publication"&gt;&lt;i class="icon-share"&gt;&lt;/i&gt; Manage document publication&lt;/h4&gt;

&lt;p&gt;Since one document can be published on multiple locations, you can list and manage publish locations by clicking &lt;i class="icon-share"&gt;&lt;/i&gt; &lt;code&gt;Manage publication&lt;/code&gt; in the &lt;i class="icon-provider-stackedit"&gt;&lt;/i&gt; menu. This will open a dialog box allowing you to remove publication links that are associated to your document.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; In some cases, if the file has been removed from the website or the blog, the document will no longer be published on that location.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h2 id="markdown-extra"&gt;Markdown Extra&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StackEdit&lt;/strong&gt; supports &lt;strong&gt;Markdown Extra&lt;/strong&gt;, which extends &lt;strong&gt;Markdown&lt;/strong&gt; syntax with some nice features.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can disable any &lt;strong&gt;Markdown Extra&lt;/strong&gt; feature in the &lt;code&gt;Extensions&lt;/code&gt; tab of the &lt;i class="icon-cog"&gt;&lt;/i&gt; &lt;code&gt;Settings&lt;/code&gt; dialog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="tables"&gt;Tables&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Markdown Extra&lt;/strong&gt; has a special syntax for tables:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
  &lt;th&gt;Item&lt;/th&gt;
  &lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
  &lt;td&gt;Computer&lt;/td&gt;
  &lt;td&gt;1600 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Phone&lt;/td&gt;
  &lt;td&gt;12 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Pipe&lt;/td&gt;
  &lt;td&gt;1 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;


&lt;p&gt;You can specify column alignment with one or two colons:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
  &lt;th style="text-align:left;"&gt;Item&lt;/th&gt;
  &lt;th style="text-align:right;"&gt;Value&lt;/th&gt;
  &lt;th style="text-align:center;"&gt;Qty&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
  &lt;td style="text-align:left;"&gt;Computer&lt;/td&gt;
  &lt;td style="text-align:right;"&gt;1600 USD&lt;/td&gt;
  &lt;td style="text-align:center;"&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td style="text-align:left;"&gt;Phone&lt;/td&gt;
  &lt;td style="text-align:right;"&gt;12 USD&lt;/td&gt;
  &lt;td style="text-align:center;"&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td style="text-align:left;"&gt;Pipe&lt;/td&gt;
  &lt;td style="text-align:right;"&gt;1 USD&lt;/td&gt;
  &lt;td style="text-align:center;"&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;


&lt;h3 id="definition-lists"&gt;Definition Lists&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Markdown Extra&lt;/strong&gt; has a special syntax for definition lists too:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;Term 1&lt;/dt&gt;
&lt;dt&gt;Term 2&lt;/dt&gt;
&lt;dd&gt;Definition A&lt;/dd&gt;

&lt;dd&gt;Definition B&lt;/dd&gt;

&lt;dt&gt;Term 3&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Definition C&lt;/p&gt;
&lt;/dd&gt;

&lt;dd&gt;
&lt;p&gt;Definition D&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;part of definition D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id="fenced-code-blocks"&gt;Fenced code blocks&lt;/h3&gt;

&lt;p&gt;GitHub’s fenced code blocks&lt;a href="#fn:gfm" id="fnref:gfm" title="See footnote" class="footnote"&gt;2&lt;/a&gt; are also supported with &lt;strong&gt;Prettify&lt;/strong&gt; syntax highlighting:&lt;/p&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="com"&gt;// Foo&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; bar &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;0&lt;/span&gt;&lt;span class="pun"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; To use &lt;strong&gt;Highlight.js&lt;/strong&gt; instead of &lt;strong&gt;Prettify&lt;/strong&gt;, just configure the &lt;code&gt;Markdown Extra&lt;/code&gt; extension in the &lt;i class="icon-cog"&gt;&lt;/i&gt; &lt;code&gt;Settings&lt;/code&gt; dialog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="footnotes"&gt;Footnotes&lt;/h3&gt;

&lt;p&gt;You can create footnotes like this&lt;a href="#fn:footnote" id="fnref:footnote" title="See footnote" class="footnote"&gt;3&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="smartypants"&gt;SmartyPants&lt;/h3&gt;

&lt;p&gt;SmartyPants converts ASCII punctuation characters into “smart” typographic punctuation HTML entities. For example:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
  &lt;th&gt;&lt;/th&gt;
  &lt;th&gt;ASCII&lt;/th&gt;
  &lt;th&gt;HTML&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
  &lt;td&gt;Single backticks&lt;/td&gt;
  &lt;td&gt;&lt;code&gt;'Isn't this fun?'&lt;/code&gt;&lt;/td&gt;
  &lt;td&gt;‘Isn’t this fun?’&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Quotes&lt;/td&gt;
  &lt;td&gt;&lt;code&gt;"Isn't this fun?"&lt;/code&gt;&lt;/td&gt;
  &lt;td&gt;“Isn’t this fun?”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Dashes&lt;/td&gt;
  &lt;td&gt;&lt;code&gt;-- is an en-dash and --- is an em-dash&lt;/code&gt;&lt;/td&gt;
  &lt;td&gt;– is an en-dash and — is an em-dash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;


&lt;h3 id="table-of-contents"&gt;Table of contents&lt;/h3&gt;

&lt;p&gt;You can insert a table of contents using the marker &lt;code&gt;[TOC]&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;div class="toc"&gt;&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#welcome"&gt;Welcome to StackEdit!  &lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#documents"&gt;Documents&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#create-a-document"&gt; Create a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#switch-to-another-document"&gt; Switch to another document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rename-a-document"&gt; Rename a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#delete-a-document"&gt; Delete a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#save-a-document"&gt; Save a document&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#synchronization"&gt;Synchronization&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#import-a-document"&gt; Import a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#export-a-document"&gt; Export a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#synchronize-a-document"&gt; Synchronize a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#manage-document-synchronization"&gt; Manage document synchronization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#publication"&gt;Publication&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#publish-a-document"&gt; Publish a document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-a-publication"&gt; Update a publication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#manage-document-publication"&gt; Manage document publication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#markdown-extra"&gt;Markdown Extra&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#tables"&gt;Tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#definition-lists"&gt;Definition Lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fenced-code-blocks"&gt;Fenced code blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#footnotes"&gt;Footnotes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#smartypants"&gt;SmartyPants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#table-of-contents"&gt;Table of contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#comments"&gt;Comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mathjax"&gt;MathJax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;h3 id="comments"&gt;Comments&lt;/h3&gt;

&lt;p&gt;Usually, comments in Markdown are just standard HTML comments. &lt;!-- like this --&gt; &lt;br&gt;
&lt;strong&gt;StackEdit&lt;/strong&gt; extends HTML comments in order to produce useful, highlighted comments in the preview but not in your exported documents. &lt;/p&gt;

&lt;h3 id="mathjax"&gt;MathJax&lt;/h3&gt;

&lt;p&gt;You can render &lt;em&gt;LaTeX&lt;/em&gt; mathematical expressions using &lt;strong&gt;MathJax&lt;/strong&gt;, as on &lt;a href="http://math.stackexchange.com/"&gt;math.stackexchange.com&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Gamma function&lt;/em&gt; satisfying &lt;span class="MathJax_Preview"&gt;&lt;/span&gt;&lt;span class="MathJax" id="MathJax-Element-9-Frame" role="textbox" aria-readonly="true"&gt;&lt;nobr&gt;&lt;span class="math" id="MathJax-Span-193" style="width: 13.403em; display: inline-block;"&gt;&lt;span style="display: inline-block; position: relative; width: 11.042em; height: 0px; font-size: 121%;"&gt;&lt;span style="position: absolute; clip: rect(1.538em 1000.003em 2.896em -0.528em); top: -2.476em; left: 0.003em;"&gt;&lt;span class="mrow" id="MathJax-Span-194"&gt;&lt;span class="mi" id="MathJax-Span-195" style="font-family: MathJax_Main;"&gt;Γ&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-196" style="font-family: MathJax_Main;"&gt;(&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-197" style="font-family: MathJax_Math; font-style: italic;"&gt;n&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-198" style="font-family: MathJax_Main;"&gt;)&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-199" style="font-family: MathJax_Main; padding-left: 0.298em;"&gt;=&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-200" style="font-family: MathJax_Main; padding-left: 0.298em;"&gt;(&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-201" style="font-family: MathJax_Math; font-style: italic;"&gt;n&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-202" style="font-family: MathJax_Main; padding-left: 0.239em;"&gt;−&lt;/span&gt;&lt;span class="mn" id="MathJax-Span-203" style="font-family: MathJax_Main; padding-left: 0.239em;"&gt;1&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-204" style="font-family: MathJax_Main;"&gt;)&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-205" style="font-family: MathJax_Main;"&gt;!&lt;/span&gt;&lt;span class="mspace" id="MathJax-Span-206" style="height: 0.003em; vertical-align: 0.003em; width: 1.006em; display: inline-block; overflow: hidden;"&gt;&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-207" style="font-family: MathJax_Main;"&gt;∀&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-208" style="font-family: MathJax_Math; font-style: italic;"&gt;n&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-209" style="font-family: MathJax_Main; padding-left: 0.298em;"&gt;∈&lt;/span&gt;&lt;span class="texatom" id="MathJax-Span-210" style="padding-left: 0.298em;"&gt;&lt;span class="mrow" id="MathJax-Span-211"&gt;&lt;span class="mi" id="MathJax-Span-212" style="font-family: MathJax_AMS;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.482em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="border-left-width: 0.004em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.361em; vertical-align: -0.354em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;script type="math/tex" id="MathJax-Element-9"&gt;\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N&lt;/script&gt; is via the Euler integral&lt;/p&gt;

&lt;p&gt;&lt;span class="MathJax_Preview"&gt;&lt;/span&gt;&lt;div class="MathJax_Display" role="textbox" aria-readonly="true" style="text-align: center;"&gt;&lt;span class="MathJax" id="MathJax-Element-10-Frame"&gt;&lt;nobr&gt;&lt;span class="math" id="MathJax-Span-213" style="width: 11.927em; display: inline-block;"&gt;&lt;span style="display: inline-block; position: relative; width: 9.861em; height: 0px; font-size: 121%;"&gt;&lt;span style="position: absolute; clip: rect(0.593em 1000.003em 3.25em -0.528em); top: -2.181em; left: 0.003em;"&gt;&lt;span class="mrow" id="MathJax-Span-214"&gt;&lt;span class="mi" id="MathJax-Span-215" style="font-family: MathJax_Main;"&gt;Γ&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-216" style="font-family: MathJax_Main;"&gt;(&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-217" style="font-family: MathJax_Math; font-style: italic;"&gt;z&lt;span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-218" style="font-family: MathJax_Main;"&gt;)&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-219" style="font-family: MathJax_Main; padding-left: 0.298em;"&gt;=&lt;/span&gt;&lt;span class="msubsup" id="MathJax-Span-220" style="padding-left: 0.298em;"&gt;&lt;span style="display: inline-block; position: relative; width: 1.951em; height: 0px;"&gt;&lt;span style="position: absolute; clip: rect(1.656em 1000.003em 4.253em -0.469em); top: -3.185em; left: 0.003em;"&gt;&lt;span class="mo" id="MathJax-Span-221" style="font-family: MathJax_Size2; vertical-align: 0.003em;"&gt;∫&lt;span style="display: inline-block; overflow: hidden; height: 1px; width: 0.416em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 3.191em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="position: absolute; clip: rect(1.656em 1000.003em 2.305em -0.469em); top: -3.185em; left: 1.184em;"&gt;&lt;span class="mi" id="MathJax-Span-222" style="font-size: 70.7%; font-family: MathJax_Main;"&gt;∞&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="position: absolute; clip: rect(1.479em 1000.003em 2.305em -0.528em); top: -1.237em; left: 0.593em;"&gt;&lt;span class="mn" id="MathJax-Span-223" style="font-size: 70.7%; font-family: MathJax_Main;"&gt;0&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msubsup" id="MathJax-Span-224" style="padding-left: 0.18em;"&gt;&lt;span style="display: inline-block; position: relative; width: 1.715em; height: 0px;"&gt;&lt;span style="position: absolute; clip: rect(1.302em 1000.003em 2.305em -0.528em); top: -2.122em; left: 0.003em;"&gt;&lt;span class="mi" id="MathJax-Span-225" style="font-family: MathJax_Math; font-style: italic;"&gt;t&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="position: absolute; top: -2.535em; left: 0.357em;"&gt;&lt;span class="texatom" id="MathJax-Span-226"&gt;&lt;span class="mrow" id="MathJax-Span-227"&gt;&lt;span class="mi" id="MathJax-Span-228" style="font-size: 70.7%; font-family: MathJax_Math; font-style: italic;"&gt;z&lt;span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-229" style="font-size: 70.7%; font-family: MathJax_Main;"&gt;−&lt;/span&gt;&lt;span class="mn" id="MathJax-Span-230" style="font-size: 70.7%; font-family: MathJax_Main;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msubsup" id="MathJax-Span-231"&gt;&lt;span style="display: inline-block; position: relative; width: 1.302em; height: 0px;"&gt;&lt;span style="position: absolute; clip: rect(1.538em 1000.003em 2.305em -0.469em); top: -2.122em; left: 0.003em;"&gt;&lt;span class="mi" id="MathJax-Span-232" style="font-family: MathJax_Math; font-style: italic;"&gt;e&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="position: absolute; top: -2.535em; left: 0.475em;"&gt;&lt;span class="texatom" id="MathJax-Span-233"&gt;&lt;span class="mrow" id="MathJax-Span-234"&gt;&lt;span class="mo" id="MathJax-Span-235" style="font-size: 70.7%; font-family: MathJax_Main;"&gt;−&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-236" style="font-size: 70.7%; font-family: MathJax_Math; font-style: italic;"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.128em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-237" style="font-family: MathJax_Math; font-style: italic;"&gt;d&lt;span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mi" id="MathJax-Span-238" style="font-family: MathJax_Math; font-style: italic;"&gt;t&lt;/span&gt;&lt;span class="mspace" id="MathJax-Span-239" style="height: 0.003em; vertical-align: 0.003em; width: 0.18em; display: inline-block; overflow: hidden;"&gt;&lt;/span&gt;&lt;span class="mo" id="MathJax-Span-240" style="font-family: MathJax_Main;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="display: inline-block; width: 0px; height: 2.187em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="border-left-width: 0.004em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 2.932em; vertical-align: -1.139em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;&lt;script type="math/tex; mode=display" id="MathJax-Element-10"&gt;
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
&lt;/script&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Make sure you include MathJax into your publications to render mathematical expression correctly. Your page/template should include something like: &lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class="prettyprint prettyprinted"&gt;&lt;code&gt;&lt;span class="tag"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;type&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"text/javascript"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;src&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"https://stackedit.io/libs/MathJax/MathJax.js?config=TeX-AMS_HTML"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You can find more information:&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;about &lt;strong&gt;Markdown&lt;/strong&gt; syntax &lt;a href="http://daringfireball.net/projects/markdown/syntax" title="Markdown"&gt;here&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;about &lt;strong&gt;Markdown Extra&lt;/strong&gt; extension &lt;a href="https://github.com/jmcmanus/pagedown-extra" title="Pagedown Extra"&gt;here&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;about &lt;strong&gt;LaTeX&lt;/strong&gt; mathematical expressions &lt;a href="http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference"&gt;here&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;about &lt;strong&gt;Prettify&lt;/strong&gt; syntax highlighting &lt;a href="https://code.google.com/p/google-code-prettify/"&gt;here&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;about &lt;strong&gt;Highlight.js&lt;/strong&gt; syntax highlighting &lt;a href="http://highlightjs.org/"&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class="language-javascript"&gt;
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var flash = require('express-flash');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var oauth = require('./routes/oauth');
&lt;/code&gt;
&lt;/pre&gt;

&lt;div class="footnotes"&gt;&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:stackedit"&gt;&lt;a href="https://stackedit.io/"&gt;StackEdit&lt;/a&gt; is a full-featured, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites. &lt;a href="#fnref:stackedit" title="Return to article" class="reversefootnote"&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id="fn:gfm"&gt;&lt;strong&gt;GitHub Flavored Markdown&lt;/strong&gt; (GFM) is supported by StackEdit. &lt;a href="#fnref:gfm" title="Return to article" class="reversefootnote"&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id="fn:footnote"&gt;Here is the &lt;em&gt;text&lt;/em&gt; of the &lt;strong&gt;footnote&lt;/strong&gt;. &lt;a href="#fnref:footnote" title="Return to article" class="reversefootnote"&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg70BVdnj1NOpAbAf2nIfVe-w4AdAAGiLRf2px7w6NZBpJ06dPf9xV51YRTSoI10PVUC9cvBWa8rw0D0arUz_J0T5Cjta2KUosff2eDQzRm8omEU0bHFgI5fW42fztdSLaxn3QyaBPl_0Lb/s72-c/" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>[Cydia] How to export Audio Record m4a directly.</title><link>http://bamboobig.blogspot.com/2014/02/cydia-how-to-export-audio-record-m4a.html</link><category>AudioRecorder</category><category>cydia</category><category>iOS</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sun, 2 Feb 2014 23:19:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-1364485210314497583</guid><description>&lt;div&gt;
iOS Audio Record Cydia tweak is very a awesome tool to record voice phone call with ease. You all need to do is clicking the record button. There is a more detail introduction ( Record iPhone Calls With Audio Recorder – Free &amp;amp; No Warning | iPhone4idiots : &lt;a href="http://www.iphone4idiots.com/2013/04/record-iphone-calls-with-audio-recorder-free-no-warning/" target="_blank"&gt;http://www.iphone4idiots.com/2013/04/record-iphone-calls-with-audio-recorder-free-no-warning/&lt;/a&gt;)&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Send m4a file via Email&lt;/b&gt;&lt;/h3&gt;
Audio Record tweak default let you can send voice recording via email as following snapshot show. But you will not be able to send voice recording m4a file when file is too big.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq09jYPsIREmaCXnnZzS6j87UCY1wtVJkF9w2_9PkvuphmOboVlkAflJZNVqbVlorwka4QsQqFEJWQaPdPahFdNSo1MmU00N6YMcXliTi-SELs9wTJ_d2cEtlooV7GWB3wCzMPpakfHYOH/s1600/IMAGE_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq09jYPsIREmaCXnnZzS6j87UCY1wtVJkF9w2_9PkvuphmOboVlkAflJZNVqbVlorwka4QsQqFEJWQaPdPahFdNSo1MmU00N6YMcXliTi-SELs9wTJ_d2cEtlooV7GWB3wCzMPpakfHYOH/s1600/IMAGE_2.png" height="400" width="225" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;b&gt;Export m4a file via iFile/iTools etc tools&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
If we can not send voice recording file via email. You might think that we could get file directly. How do we do? In Audio Recorder list view. When you click shark button. Audio Recorder might take some time prepare data (m4a file) for sending via Email. Audio Recorder will create two m4a file in /var/tmp as following snapshot show. Both of them are same.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUQ6XDC-J6hK0E8P0q-9XdWMxICT5JIy-55rLw7iMe9VY8WPjRG1UlkyoIYMM29UaPCApTkV3gJp9urN64AAvZIGZW6XD0ecF7ns1mh4o6YhMjEDJj-M4zpP-YH02F1x11k-hfSd2qGZQS/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E6%2593%25B7%25E5%258F%2596%25E7%2595%25AB%25E9%259D%25A2_020214_103620_PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUQ6XDC-J6hK0E8P0q-9XdWMxICT5JIy-55rLw7iMe9VY8WPjRG1UlkyoIYMM29UaPCApTkV3gJp9urN64AAvZIGZW6XD0ecF7ns1mh4o6YhMjEDJj-M4zpP-YH02F1x11k-hfSd2qGZQS/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E6%2593%25B7%25E5%258F%2596%25E7%2595%25AB%25E9%259D%25A2_020214_103620_PM.jpg" height="416" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;b&gt;Audio Recorder m4a file path&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote&gt;
/var/tmp&lt;/blockquote&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq09jYPsIREmaCXnnZzS6j87UCY1wtVJkF9w2_9PkvuphmOboVlkAflJZNVqbVlorwka4QsQqFEJWQaPdPahFdNSo1MmU00N6YMcXliTi-SELs9wTJ_d2cEtlooV7GWB3wCzMPpakfHYOH/s72-c/IMAGE_2.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>ASP.NET MVC 4 using Google Calendar API via OAuth 2</title><link>http://bamboobig.blogspot.com/2014/01/aspnet-mvc-4-using-google-calendar-api.html</link><category>AngularJs</category><category>API</category><category>C#</category><category>Calendar</category><category>Google Calendar API</category><category>MVC</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 16 Jan 2014 22:26:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-5037020144352757624</guid><description>&lt;h3&gt;
&lt;b&gt;&lt;span style="font-family: inherit;"&gt;Scenario&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
It's more easily to log in your application via OAuth and OpenID provider in &amp;nbsp;ASP.NET MVC 4 now. Microsoft has few build-in client for Microsoft, Twitter, Facebook, Google.&amp;nbsp;The Google client is based on OpenID and not OAuth. That's mean you can not access Google Data API. There is a post talk about how to implement custom Google client with Google+ login via OAuth in ASP.NET MVC 4. (&lt;a href="http://www.beabigrockstar.com/google-signin-for-asp-net-mvc/"&gt;http://www.beabigrockstar.com/google-signin-for-asp-net-mvc/&lt;/a&gt;&amp;nbsp;Google+ Signin for ASP.NET MVC - Be A Big Rockstar )&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;
&lt;span style="font-family: inherit;"&gt;Register a Client ID for web application in Google Developer Console&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
In order to access Google Data API for web application. You need to register a Client ID to get Client ID an Client Secret for setting in your application.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5YuSoRm_rqOiv6LQcuHORfyzPSxep_sKeoEmDGMwO2f5rPcSkWnCisPPbVHM9YG_2jcFpRL86HB6-Ez6xrHlyRwE-iRle3czGp53Xvn2QiQpkHTWM8s2zq_x7KgYqrGf5WxuAlNwmuQAP/s1600/Google+Developers+Console.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5YuSoRm_rqOiv6LQcuHORfyzPSxep_sKeoEmDGMwO2f5rPcSkWnCisPPbVHM9YG_2jcFpRL86HB6-Ez6xrHlyRwE-iRle3czGp53Xvn2QiQpkHTWM8s2zq_x7KgYqrGf5WxuAlNwmuQAP/s1600/Google+Developers+Console.jpg" height="564" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
As above snapshot show, you need to assign redirect URIs for grap OAuth access token callback also. Here we setup Rirect URIs as&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt; http://localhost:57271/Account/ExternalLoginCallback &lt;/pre&gt;
&lt;h3&gt;
&lt;b&gt;&lt;span style="font-family: inherit;"&gt;Google Client Library for .NET&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote&gt;
The Google APIs Client Library for .NET is generic .NET runtime client for Google Services. The library supports OAuth2.0 authentication, and is able to generate strongly typed client libraries for Discovery-based services.&lt;/blockquote&gt;
Google Client library is a higher level library for using Google Data API. You can download beta version from Nuget in visual studio.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt; https://www.nuget.org/packages/Google.Apis.Calendar.v3/ &lt;/pre&gt;
It's more difficult to handle Google Client Library for .NET with few documents and sample now. Here, just using Google.Apis.Calendar.v3.Data namespace to our strong type class for data binding in deserialize object from API response.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;        private Event GoogleEventHandle(string token, string method, string requestURL, string requestBody = null)
        {
            var jsonSerializer = new JavaScriptSerializer();
            var request = WebRequest.Create(requestURL) as HttpWebRequest;
            request.KeepAlive = true;
            request.ContentType = "application/json";
            request.Method = method;
            request.Headers.Add("Authorization", "Bearer " + token);

            if(requestBody != null)
            {
                Stream ws = request.GetRequestStream();
                using (var streamWriter = new StreamWriter(ws, new UTF8Encoding(false)))
                {
                    streamWriter.Write(requestBody);
                }
            }

            var response = request.GetResponse();
            var stream = new StreamReader(response.GetResponseStream());

            var googleEvent = Newtonsoft.Json.JsonConvert.DeserializeObject&lt;event&gt;(stream.ReadToEnd().Trim());

            return googleEvent;  
        }

        private Event CreateGoogleEvent(string token, string calendarId, string requestBody)
        {
            var requestURL = string.Format("https://www.googleapis.com/calendar/v3/calendars/{0}/events", calendarId);
            return GoogleEventHandle(token, "POST", requestURL, requestBody);              
        }
&lt;/event&gt;&lt;/pre&gt;
Above is methods how we are accessing Google Calendar v3 API via webrequest.&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;MVC view&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
Now, we are be able to access Google Calendar API via OAuth. Nest step, we will create a simple CRUD UI by AngularJS.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvLkkHfORULSa3S8RQduYMJp_w0ZjJftfbMU4B83oWzyu696mWJqedTF4krSj-qiOgIxvyDvNVAqIS-e_LyhyphenhyphenoV6fF3aKIzkOSPG1jj_2M103Q4V2Qr-hA-Z22aApKJ7odp2xBgLPxSBGh/s1600/Index+-+My+ASP+NET+MVC+Application+%25281%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvLkkHfORULSa3S8RQduYMJp_w0ZjJftfbMU4B83oWzyu696mWJqedTF4krSj-qiOgIxvyDvNVAqIS-e_LyhyphenhyphenoV6fF3aKIzkOSPG1jj_2M103Q4V2Qr-hA-Z22aApKJ7odp2xBgLPxSBGh/s1600/Index+-+My+ASP+NET+MVC+Application+%25281%2529.jpg" height="569" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
The Google Event we created and save to database also.&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBQqBJC0hzVL045JF_2qiMxk1fQLlIuxQbHWuKlb1Gkb9h42YwutjhTSQj3Y4of8sgiHFfvJnEOcA-ewnqsUge0J_48Cuex91iPhIVbj3dwe1y7Qi3fRgFHPl1_Y5snyo3rYzsTBcOEmv9/s1600/Index+-+My+ASP+NET+MVC+Application.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBQqBJC0hzVL045JF_2qiMxk1fQLlIuxQbHWuKlb1Gkb9h42YwutjhTSQj3Y4of8sgiHFfvJnEOcA-ewnqsUge0J_48Cuex91iPhIVbj3dwe1y7Qi3fRgFHPl1_Y5snyo3rYzsTBcOEmv9/s1600/Index+-+My+ASP+NET+MVC+Application.jpg" height="640" width="553" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
You should choose which calendar you want to create a new event.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyNhwcSGpkqsCQi4Cj5xg9K8-0Mnvt9AsuHbZmllfMDbAVJtrkvx6CAsWaNjPH-NeMYhwU_BfC0P8RrGUkHn4M-pcDOA6HZVktdoiMH8b_A4xkMNcqNPWDHaFuHCKTqTFUByVZqsR7p18u/s1600/Index+-+My+ASP+NET+MVC+Application+%25282%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyNhwcSGpkqsCQi4Cj5xg9K8-0Mnvt9AsuHbZmllfMDbAVJtrkvx6CAsWaNjPH-NeMYhwU_BfC0P8RrGUkHn4M-pcDOA6HZVktdoiMH8b_A4xkMNcqNPWDHaFuHCKTqTFUByVZqsR7p18u/s1600/Index+-+My+ASP+NET+MVC+Application+%25282%2529.jpg" height="569" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
You can modify event anytime you want.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMCjFrSbvkdZKmJXpdluonQFSqdzslMUUsToM2Z2cOjVLDG3uE_P9y5ffRrNm3RhEyCP1cNEwIfxymuy57RJmGNfOpl-SXKBllFRp5d47WyX3wsnD6RzsDXVBOx2yjTlWXgTDAnJe7_LnU/s1600/Google+%25E6%2597%25A5%25E6%259B%2586.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMCjFrSbvkdZKmJXpdluonQFSqdzslMUUsToM2Z2cOjVLDG3uE_P9y5ffRrNm3RhEyCP1cNEwIfxymuy57RJmGNfOpl-SXKBllFRp5d47WyX3wsnD6RzsDXVBOx2yjTlWXgTDAnJe7_LnU/s1600/Google+%25E6%2597%25A5%25E6%259B%2586.jpg" height="569" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
What you will see in your Google Calendar.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;b&gt;Summary&lt;/b&gt;&lt;/h3&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;It a good topic to discuss where do you store the Access token from Google OAuth. Session or database?&lt;/li&gt;
&lt;li&gt;Google Client Library for .NET is a convienient library to access Google Data API with OAuth include. It's still in developing and i hope that there have more documents and samples to show how to use it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
&lt;b&gt;Reference&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/tutorials/security/using-oauth-providers-with-mvc"&gt;http://www.asp.net/mvc/tutorials/security/using-oauth-providers-with-mvc&lt;/a&gt; (Using OAuth Providers with MVC 4 : The Official Microsoft ASP.NET Site)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.beabigrockstar.com/google-signin-for-asp-net-mvc/"&gt;http://www.beabigrockstar.com/google-signin-for-asp-net-mvc/&lt;/a&gt; (Google+ Signin for ASP.NET MVC - Be A Big Rockstar)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coding.anyun.tw/2012/03/14/asp-net-mvc-using-oauth-2-0-connect-google-api/"&gt;http://coding.anyun.tw/2012/03/14/asp-net-mvc-using-oauth-2-0-connect-google-api/&lt;/a&gt; (【oAuth 2.0 實作系列】ASP.Net MVC 實作使用 oAuth 2.0 連接 Google API « Coding 之路，不由分說)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/google-api-dotnet-client/"&gt;https://code.google.com/p/google-api-dotnet-client/&lt;/a&gt; (google-api-dotnet-client - Google APIs Client Library for .NET - Google Project Hosting)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;b&gt;Github repository&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
As always, all source code can be found in Github in the repository&lt;br /&gt;
&amp;nbsp;&lt;a href="https://github.com/cage1016/ASPNETMvc4GoogleOAuth"&gt;https://github.com/cage1016/ASPNETMvc4GoogleOAuth&lt;/a&gt;&lt;/div&gt;
&lt;div style="font-weight: bold;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5YuSoRm_rqOiv6LQcuHORfyzPSxep_sKeoEmDGMwO2f5rPcSkWnCisPPbVHM9YG_2jcFpRL86HB6-Ez6xrHlyRwE-iRle3czGp53Xvn2QiQpkHTWM8s2zq_x7KgYqrGf5WxuAlNwmuQAP/s72-c/Google+Developers+Console.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">12</thr:total></item><item><title>[Titanium]iOS: App build fails on Snow Leopard/iOS 4.3 configured machine</title><link>http://bamboobig.blogspot.com/2012/05/titaniumios-app-build-fails-on-snow.html</link><category>Error</category><category>iOS</category><category>Titanium</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sat, 26 May 2012 16:55:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-4024050599614097142</guid><description>&lt;div&gt;
&lt;b&gt;OS&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Lion 10.7.4&lt;/li&gt;
&lt;li&gt;xCode 4.3&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;iPhone Simulator&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Titanium SDK 1.7.5, 1.8.2, 2.0.1GA and 2.0.1.GA2. Everything does work on iPhone Simulator. But, it is very SLOW when you want to rebuild project or debug it.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Install to iOS Device&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
I got an error message below when i want to install project to iOS device in the couple days. &amp;nbsp;It success when i choose Titanium SDK lower 1.8x.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class="prettyprint linenums"&gt;[ERROR] /Users/timothy/Documents/Titanium Studio Workspace/Scratch/build/iphone/Classes/NetworkModule.m:252:44: error: use of undeclared identifier 'UIRemoteNotificationTypeNewsstandContentAvailability' [2]
[ERROR] /Users/timothy/Documents/Titanium Studio Workspace/Scratch/build/iphone/Classes/NetworkModule.m:304:33: error: use of undeclared identifier 'UIRemoteNotificationTypeNewsstandContentAvailability' [2]
[ERROR] 
[ERROR] Error: Traceback (most recent call last):
File "/Library/Application Support/Titanium/mobilesdk/osx/2.0.1.v20120410131722/iphone/builder.py", line 1318, in main
execute_xcode("iphonesimulator%s" % link_version,["GCC_PREPROCESSOR_DEFINITIONS=__LOG__ID__=%s DEPLOYTYPE=development TI_DEVELOPMENT=1 DEBUG=1 TI_VERSION=%s %s %s" % (log_id,sdk_version,debugstr,kroll_coverage)],False)
File "/Library/Application Support/Titanium/mobilesdk/osx/2.0.1.v20120410131722/iphone/builder.py", line 1224, in execute_xcode
output = run.run(args,False,False,o)
File "/Library/Application Support/Titanium/mobilesdk/osx/2.0.1.v20120410131722/iphone/run.py", line 41, in run
sys.exit(rc)
SystemExit: 65&lt;/pre&gt;
&lt;br /&gt;
Finally, i got the solution when i search an issue tracker in appcelerator. This bug has fixed in Release 2.1.0.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Reference&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jira.appcelerator.org/browse/TIMOB-8769"&gt;iOS: App build fails on Snow Leopard/iOS 4.3 configured machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://builds.appcelerator.com.s3.amazonaws.com/index.html"&gt;appcelerator Continuous Builds&lt;/a&gt;&amp;nbsp;where you can download 2.1.x builds.&lt;/li&gt;
&lt;/ul&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>[Notebook] How to setup iphoneofflinemap on your iPhone, cydia requirement.</title><link>http://bamboobig.blogspot.com/2011/09/notebook-how-to-setup-iphoneofflinemap.html</link><category>cydia</category><category>Google Map</category><category>iOS</category><category>iphone</category><category>offlinemap</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 22 Sep 2011 23:47:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-4254225209475212993</guid><description>&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Smart phone map App may have already improved your life experience if you ever used it. You can check map anytime and anywhere on your smart phone but internet&amp;nbsp;necessary.&amp;nbsp;Offlinemap let you can check map without internet. It's very&amp;nbsp;convenient to you when you are in oversea or can't access the internet.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br clear="none" /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://code.google.com/p/iphoneofflinemap/"&gt;iphoneofflinemap&lt;/a&gt;&amp;nbsp;is an iphone cydia app that you can put offline map grabbed from Google map using&amp;nbsp;GMDL (Global Map Download Tool)&lt;/div&gt;
&lt;div&gt;
&lt;br clear="none" /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong&gt;&lt;span class="Apple-style-span" style="color: #6fa8dc; font-size: large;"&gt;simple scenario&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong&gt;&lt;br clear="none" /&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
preparing necessary tools → backup current iphone cache map →&amp;nbsp;Download target offline map → modify downloaded map → upload to iPhone → setup bookmark → respring&lt;/div&gt;
&lt;div&gt;
&lt;br clear="none" /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step1.Getting started. You need to download few tools.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.in7ane.com/psp/"&gt;GMDL&lt;/a&gt; (Global Map Download Tool). In iphoneofflinemap project. issues 59 reported: downloaded map doesn't work with ios4. Someone update a&amp;nbsp;GMDL ip4 v10 hack. You can download hacked version &lt;a href="http://d.pr/2HRn"&gt;here&lt;/a&gt; that you don't need to convert maps by&amp;nbsp;mapconverter anymore.&lt;/li&gt;
&lt;li&gt;SQLite manager Firefox extension that you can modify downloaded map.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.i-funbox.com/"&gt;iFunbox&lt;/a&gt; that you can upload offline maps to your iPhone very easily.&lt;/li&gt;
&lt;li&gt;install iphoneofflinemap app in cydia&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;Step2. backup iPhone current cache map.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Attache iPhone to computer and backup "&lt;strong&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;/var/mobile/Library/Caches/Map/MapTiles&lt;/span&gt;/&lt;/strong&gt;MapTiles.sqlitedb" &amp;nbsp;(this is original iPhone cache map)&amp;nbsp; by iFunbox.&lt;/div&gt;
&lt;div&gt;
&lt;br clear="none" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step3. Grab target offline map you want to download.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Download maps by GMDL.&lt;/li&gt;
&lt;li&gt;Convert maps tiles in an SQLite DB. The only one thing you should notice is locale. "en_TW" for example.&lt;br /&gt;&lt;br /&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIS3kg_1EOGGz4lYfT_iuXK6PoDIk7KV7zFrFzGThE0kkVz_e7pXMsUeM1d11jdB2C4Z6TZqJkVGwi9FVlmsPPJ-bB_YufCGk4kZupPL6SC68K8nniiz5gWMIu1swVtCSh1zRFk1akuTQA/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" title="Convert maps tiles in an SQLite DB"&gt;&lt;img border="0" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIS3kg_1EOGGz4lYfT_iuXK6PoDIk7KV7zFrFzGThE0kkVz_e7pXMsUeM1d11jdB2C4Z6TZqJkVGwi9FVlmsPPJ-bB_YufCGk4kZupPL6SC68K8nniiz5gWMIu1swVtCSh1zRFk1akuTQA/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In output folder. You can see "com.apple.Maps" and "MapTiles.sqlitedb". done.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step4. Modify download maps.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Open backup cache map earlier (original MapTiles.sqlitedb) by Firefox SQLite manager can check &lt;b&gt;version &lt;/b&gt;and &lt;b&gt;locale&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkA_CwLV1eEbDEl3RXMo2JuKtxGUrxXoLh57U9mukItDX0H3BBADKxnrsvSMwMBiYQpAUr1GoOx03QnKeNwnHF2FTyvhtQwjU-T9HJOijQwIxAJDAku0Zp0-jY9OKlMgTgPxdMQfyXUKLB/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" title="SQLite manager"&gt;&lt;img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkA_CwLV1eEbDEl3RXMo2JuKtxGUrxXoLh57U9mukItDX0H3BBADKxnrsvSMwMBiYQpAUr1GoOx03QnKeNwnHF2FTyvhtQwjU-T9HJOijQwIxAJDAku0Zp0-jY9OKlMgTgPxdMQfyXUKLB/s320/8.jpg" width="320" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Modify downloaded MapTiles.sqlistedb version and locale same as cache map.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;Step5. Upload offline map to your iPhone.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;put target offline maps&amp;nbsp;MapTiles.sqlitedb to "&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;/var/mobile/Media/Maps/ChiMai&lt;/span&gt;&lt;/b&gt;". If Media don't have "&lt;b&gt;Maps&lt;/b&gt;" folder, create one and put maps on folder you want by iFunbox.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step6. Setup offline map bookmark.&lt;/b&gt;&lt;br /&gt;
Without internet access. you still can view map with GPS but search and direction. Therefore, it's better to put some map books in offline map also.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;you can visit Google Map (my places) and make some placemarks in maps called "Thailand trip" for example.&lt;br /&gt;&lt;br /&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx3iJZiSn3t2UbVygsL_6tkWJd1E4wBm-WdnYdiQ2Et7L3Utkb8K_cqt7xU5M7LZnIkMEPvf06UN_w-K1VIpMo07FaWPTY7p40O3h-9Vuz_aBtTcZyhi1vQixp0Vi5ZvJZS1W7iehadtll/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" title="Google Map My place"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx3iJZiSn3t2UbVygsL_6tkWJd1E4wBm-WdnYdiQ2Et7L3Utkb8K_cqt7xU5M7LZnIkMEPvf06UN_w-K1VIpMo07FaWPTY7p40O3h-9Vuz_aBtTcZyhi1vQixp0Vi5ZvJZS1W7iehadtll/s320/6.png" width="190" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;copy KML address and visit (&lt;a data-mce-href="http://vcenter.iis.sinica.edu.tw/mobile/kml/loadkml_map.html" href="http://vcenter.iis.sinica.edu.tw/mobile/kml/loadkml_map.html" shape="rect" target="_blank"&gt;http://vcenter.iis.sinica.edu.tw/mobile/kml/loadkml_map.html&lt;/a&gt;) to convert those placemarks to iPhone plist.&lt;br /&gt;&lt;br /&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaFWY3TSKFEJLXyQhVUzziPsuahZrBzR9IjTLUhDlFkke2EyoVA3MaZcgU6X_sQtKb5B7GSeH570OH-_Zd9mVeHNHxdZbsH5nnwc0IlOR2Q10jZmln4gTmOXWiYMdm6-dhzPztMbeteNTb/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" title="KML2Plist"&gt;&lt;img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaFWY3TSKFEJLXyQhVUzziPsuahZrBzR9IjTLUhDlFkke2EyoVA3MaZcgU6X_sQtKb5B7GSeH570OH-_Zd9mVeHNHxdZbsH5nnwc0IlOR2Q10jZmln4gTmOXWiYMdm6-dhzPztMbeteNTb/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;upload Bookmarks.plist to&amp;nbsp;"&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;/var/mobile/Library/Map&lt;/span&gt;&lt;/b&gt;" (it's better to backup original one)&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div data-mce-style="margin-left: 30px;" style="margin-left: 30px;"&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step7. respring (it's very important).&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;open iphoneofflinemap (atlas) on iphone and "&lt;b&gt;remove all &amp;nbsp;caches&lt;/b&gt;".&lt;/li&gt;
&lt;li&gt;type your map and select copy&lt;/li&gt;
&lt;li&gt;select "Continues". &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Do NOT&lt;/span&gt;&lt;/b&gt; select "Map" directly.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;respring your iPhone&amp;nbsp;&lt;/li&gt;
&lt;li&gt;turn off 3G, WiFi and Data. You can use offline map now.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;b&gt;Result.&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5IeDk9YDXueGVs4_AqOtoDq6yQTTdeXtimEcMyOiIGVUky4tT9Ifd2woyp7t4Ot4oZtDqewwj6UWBsJoI10onnRJ59MN0vZ3p66vTknxnB8YMBAhNmYSpbRjaY8wgrpkuDEYB_h-rpFj/s1600/Photo+11-9-22+23+35+27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5IeDk9YDXueGVs4_AqOtoDq6yQTTdeXtimEcMyOiIGVUky4tT9Ifd2woyp7t4Ot4oZtDqewwj6UWBsJoI10onnRJ59MN0vZ3p66vTknxnB8YMBAhNmYSpbRjaY8wgrpkuDEYB_h-rpFj/s320/Photo+11-9-22+23+35+27.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzXWUi3KsGwoVQzZHlRSexh500VJjvOWSYAAZAsqcx2KGp1k7b6uKx4LKYS4NhVJ1NWSiDoLYiixDZ1NWl1hgWf_anMUgrT0hCqrdpwAcnLR5ZKXuTZ-k-oLUUvhfiCkRa8u8uCBHuIjze/s1600/Photo+11-9-22+23+35+36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzXWUi3KsGwoVQzZHlRSexh500VJjvOWSYAAZAsqcx2KGp1k7b6uKx4LKYS4NhVJ1NWSiDoLYiixDZ1NWl1hgWf_anMUgrT0hCqrdpwAcnLR5ZKXuTZ-k-oLUUvhfiCkRa8u8uCBHuIjze/s320/Photo+11-9-22+23+35+36.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIS3kg_1EOGGz4lYfT_iuXK6PoDIk7KV7zFrFzGThE0kkVz_e7pXMsUeM1d11jdB2C4Z6TZqJkVGwi9FVlmsPPJ-bB_YufCGk4kZupPL6SC68K8nniiz5gWMIu1swVtCSh1zRFk1akuTQA/s72-c/4.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><title>[Notebook] Using jQuery templates in Google AppEngine</title><link>http://bamboobig.blogspot.com/2011/09/notebook-using-jquery-templates-in.html</link><category>AppEngine</category><category>Django</category><category>GAE</category><category>Google</category><category>jquery</category><category>Python</category><category>templates</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sun, 4 Sep 2011 22:52:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-2011955155996665649</guid><description>&lt;div&gt;
jQuery is a powerful javascript library that you can improve web browser experience just add some js codes. jQuery also has a lot of useful plugin you can add. lightbox, autocomplete etc.&lt;br /&gt;
&lt;br /&gt;
jQuery supports Templates plugin now that you can render HTML code very&amp;nbsp;simply. &lt;a href="http://api.jquery.com/category/plugins/templates/"&gt;Here&lt;/a&gt; has very detail document and tutorial. Today, i will talk about how to use jQuery templates in Google AppEngine. What is the problem using jQuery templates in Google AppEngine web application.?&amp;nbsp;&lt;b&gt;Braces {}&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Templates syntax.&lt;/b&gt;&lt;br /&gt;
Google AppEngine Django template.&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;
{% for item in objs %}
 {{item}},
{% endfor %}
&lt;/pre&gt;
&lt;br /&gt;
jQuery Templates&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;
&amp;lt;script id="doclistTmp" type="text/x-jquery-tmpl"&amp;gt;
        {{each(i, o) obj}}
        &amp;lt;tr class="{{if i%2== 0}}odd{{else}}even{{/if}}"&amp;gt;
            &amp;lt;td&amp;gt; ${title}&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;${type}&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;${folders}&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        {{/each}}
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
They both use brases is problem that you will meet it if you want to use jQuery templates via ajax in Google AppEngine. Then, how to setup jQuery templates in Google AppEngine.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step1.&lt;/b&gt;&lt;br /&gt;
Register a tag in a py file called "&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;verbatim_templatetag.py&lt;/span&gt;" {{if condition}} print something{{/if}}. Tell Django don't change anything within this tag.&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;"""
jQuery templates use constructs like:

    {{if condition}} print something{{/if}}

This, of course, completely screws up Django templates,
because Django thinks {{ and }} mean something.

Wrap {% verbatim %} and {% endverbatim %} around those
blocks of jQuery templates and this will try its best
to output the contents with no changes.
"""

from django import template

register = template.Library()

class VerbatimNode(template.Node):

    def __init__(self, text):
        self.text = text

    def render(self, context):
        return self.text

@register.tag
def verbatim(parser, token):
    text = []
    while 1:
        token = parser.tokens.pop(0)
        if token.contents == 'endverbatim':
            break
        if token.token_type == template.TOKEN_VAR:
            text.append('{{')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('{%')
        text.append(token.contents)
        if token.token_type == template.TOKEN_VAR:
            text.append('}}')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('%}')
    return VerbatimNode(''.join(text))&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Step2.&lt;/b&gt;&lt;br /&gt;
Include custom tag in your py file that you use web template&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt; template.register_template_library('verbatim_templatetag') &lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Step3.&lt;/b&gt;&lt;br /&gt;
Add you jQuery template to html page.&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt; {% verbatim %}
        &amp;lt;script id="movieTemplate" type="text/x-jquery-tmpl"&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;${posted}&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;a href="${link}"&amp;gt;${response_count}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;{{html content}}&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/script&amp;gt;
 {% endverbatim %} &lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Step.4&lt;/b&gt;&lt;br /&gt;
call jQuery templates.&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;  $("#movieList").html($("#movieTemplate").tmpl( plurks )); &lt;/pre&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Reference&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://api.jquery.com/category/plugins/templates/"&gt;jQuery Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/jquery/jquery-tmpl"&gt;jQuery Templates (github)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">343</thr:total></item><item><title>Manage ebooks download list with Google Reader and RTM</title><link>http://bamboobig.blogspot.com/2011/05/manage-ebooks-download-list-with-google.html</link><category>RTM</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Mon, 9 May 2011 23:29:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-7342061739102425501</guid><description>&lt;meta charset="utf-8"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: arial, helvetica, sans-serif; font-size: 12px; line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;cause tablet computer like iPad etc. It's very convenient to read ebook (epub, pdf, etc) in your tablet computer anywhere. I like to download pdf ebook from websites and upload to my Google Docs. Then, i have my own ebook bookshelf on the cloud. I subscript few ebooks shared website. Most of those ebooks shared from web spaces that is limited download if you don't pay money. So, i create a RTM list to manage how many ebooks i haven't download. Once i downad it and i will mark it complete.
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;simple scenario is:&lt;/b&gt;
&lt;br /&gt;Google Reader → send to function → RTM
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;step:&lt;/b&gt;
&lt;br /&gt;&lt;ol&gt;&lt;li&gt;RTM setting: create a list called "ebook"&lt;/li&gt;&lt;li&gt;viste: https://m.rememberthemilk.com/add
&lt;br /&gt;after login your RTM. you will see the a simple form.
&lt;br /&gt;you can get "List" dropdown list value(id) by viewing sources code. ebook&lt;/li&gt;&lt;li&gt;Google Reader setting:
&lt;br /&gt;options &amp;gt; Reader settings &amp;gt; Send To, Create a custom link&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Name: RTM(ebook download)&lt;/li&gt;&lt;li&gt;URL: https://m.rememberthemilk.com/add?name=${title}&amp;amp;url=${url}&amp;amp;due=2 days&amp;amp;priority=3&amp;amp;repeat=0&amp;amp;estimate=5 minutes&amp;amp;tags=download&amp;amp;list=[your ebook list id]&lt;/li&gt;&lt;li&gt;Icon url: http://www.rememberthemilk.com/favicon.ico&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;fill form out with above value. You might notice that you can assign due, priority etc. The most important here is your ebook list id (you can get it at step 2). After finishing and save.
&lt;br /&gt;
&lt;br /&gt;All settings done.
&lt;br /&gt;Now, you can subscript ebook download site (http://www.wowebook.com/ for example) RSS. Once you get a new RSS and want to add to your RTM ebook download list. Just click "send to &amp;gt; RTM(ebook download)". You will redirect to http://m.rememberthemilk.com. Click "Add Task". done.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: arial, helvetica, sans-serif; font-size: 12px; line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;
&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: arial, helvetica, sans-serif; font-size: 12px; line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;i post it to RTM forum&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 15px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;https://www.rememberthemilk.com/forums/tips/12673/&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Google Reader's Toggle Icon</title><link>http://bamboobig.blogspot.com/2010/07/google-readers-toggle-icon.html</link><category>Css</category><category>icon</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 7 Jul 2010 15:13:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-954677878881817257</guid><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJemfB1cnZsQigrcoLL_k6egHjrzrCSabAU4xagFhS9Xiiw2VVfo-itzIVhYJDtnrlt9beFTpMQ1js_9EbCECv8MXyrYu0wYGL0N13OLM7Mn4XCzOwbaeBI4PPdDsvA02ny9_0wks6_kXJ/s1600/toggleIcon.png" imageanchor="1" rel="20100707" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJemfB1cnZsQigrcoLL_k6egHjrzrCSabAU4xagFhS9Xiiw2VVfo-itzIVhYJDtnrlt9beFTpMQ1js_9EbCECv8MXyrYu0wYGL0N13OLM7Mn4XCzOwbaeBI4PPdDsvA02ny9_0wks6_kXJ/s320/toggleIcon.png" width="154" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
If you have used &lt;a href="http://www.google.com/reader"&gt;Google Reader&lt;/a&gt;. There is a toggle icon you can click and expand all items view size. This toggle icon is a small blue arrow. Is it a image? No. It's just a CSS tips and tricks. How does CSS do it?&lt;br /&gt;
&lt;div&gt;&lt;b&gt;Toggle icon DOM element&lt;/b&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;...
＜td id="chrome-lhn-toggle"＞
    ＜div id="chrome-lhn-toggle-icon"＞＜/div＞
＜/td＞
...
&lt;/pre&gt;&lt;br /&gt;
&lt;div&gt;&lt;b&gt;Toggle icon CSS&lt;/b&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;{
    width: 0;
    height: 0;
    border-color: #ebeff9 #68e #ebeff9 #ebeff9;
    border-style: solid;
    border-width: 5px 5px 5px 0;
}
&lt;/pre&gt;&lt;br /&gt;
You just need to assign the "&lt;b&gt;border&lt;/b&gt;" CSS to toggle icon DOM element like ahove. &lt;br /&gt;
You may have to assign others CSS if you want this toggle icon in that correct position you want.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVcQ09u467FXWboqbhmjKnGbq6HRcJ4cOkFoSruIAWoUtLkeOt1Mz3FtvKaOX6LcBy32Dd9Mz7dG8jY4N3xElOMUfVxq2OBLJufmPEu2FLyrC4r83wwCn7O9bHbPJHMvosk7yTmj87N3_u/s1600/2010-07-07_142936.png" imageanchor="1" rel="20100707" style="margin-left: 1em; margin-right: 1em;" title="border CSS order"&gt;&lt;img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVcQ09u467FXWboqbhmjKnGbq6HRcJ4cOkFoSruIAWoUtLkeOt1Mz3FtvKaOX6LcBy32Dd9Mz7dG8jY4N3xElOMUfVxq2OBLJufmPEu2FLyrC4r83wwCn7O9bHbPJHMvosk7yTmj87N3_u/s320/2010-07-07_142936.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;b&gt;border Css order style&lt;/b&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;#right{
border-style:solid;
border-color: red green blue yellow;
border-style: solid;
border-width: 50px 50px 50px 50px;
width:0;
height:0;
display:inline-block;
}
#left{
border-style:solid;
border-color: #ebeff9 #68e #ebeff9 #ebeff9;
border-style: solid;
border-width: 50px 50px 50px 50px;
width:0;
height:0;
display:inline-block;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;Whole DOM and CSS code&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;//DOM
...
＜td id="chrome-lhn-toggle"＞
    ＜div id="chrome-lhn-toggle-icon"＞＜/div＞
＜/td＞
...
//CSS
#chrome-lhn-toggle:hover {
background: #C2CFF1;
}
#chrome-lhn-toggle, #chrome-viewer {
padding: 0px;
vertical-align: top;
}
#chrome-lhn-toggle {
background: #EBEFF9;
cursor: pointer;
width: 8px;
}
#chrome-lhn-toggle:hover #chrome-lhn-toggle-icon {
border-color: #C2CFF1 white #C2CFF1 #C2CFF1;
}
#chrome-lhn-toggle-icon {
border-color: #EBEFF9 #68E #EBEFF9 #EBEFF9;
border-style: solid;
border-width: 5px 5px 5px 0px;
height: 0px;
margin-left: 1px;
margin-top: -5px;
position: absolute;
top: 50%;
width: 0px;
}
#chrome-lhn-toggle-icon {
font-size: 1px;
line-height: 1px;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;This is a simple way to make a arrow icon by pure CSS instead of assigning image.</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJemfB1cnZsQigrcoLL_k6egHjrzrCSabAU4xagFhS9Xiiw2VVfo-itzIVhYJDtnrlt9beFTpMQ1js_9EbCECv8MXyrYu0wYGL0N13OLM7Mn4XCzOwbaeBI4PPdDsvA02ny9_0wks6_kXJ/s72-c/toggleIcon.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Convert rgb color to hex color</title><link>http://bamboobig.blogspot.com/2010/07/convert-rgb-color-to-hex-color.html</link><category>color</category><category>hex</category><category>Javscript</category><category>rgb</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Fri, 2 Jul 2010 11:00:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-8068517200685591876</guid><description>&lt;div&gt;If you have written HTML file, you must know that how to assign color to DOM element. You just need to assign CSS style to &lt;/div&gt;&lt;div&gt;DOM element like&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;＜span style="color:#ff0000"＞This is text＜/span＞&lt;br /&gt;&lt;/pre&gt;It is very simple. But, we may want to change the color &lt;/div&gt;&lt;div&gt;by Javascript like color picker. What's the problem? You may get the "rgb(255, 0, 0)" color value by Javascript.&lt;/div&gt;&lt;div&gt;Then, you have to convert rgb to hex color or convert hex to rgb color. The following is simple code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;rgb to hex&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;function rgb2hex(rgb){&lt;br /&gt;   var hexDigits = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");&lt;br /&gt;   var hex = function(x){&lt;br /&gt;       return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];&lt;br /&gt;   };&lt;br /&gt;   var tmp = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);&lt;br /&gt;   var color = hex(tmp[1]) + hex(tmp[2]) + hex(tmp[3]);&lt;br /&gt;   return color;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;hex to rgb&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;function hex2rgb(v){&lt;br /&gt;   if (/^[0-9A-F]{3}$|^[0-9A-F]{6}$/.test(v.toUpperCase())) {&lt;br /&gt;       if (v.length == 3) {&lt;br /&gt;           v = v.match(/[0-9A-F]/g);&lt;br /&gt;           v = v[0] + v[0] + v[1] + v[1] + v[2] + v[2];&lt;br /&gt;           this.value = v;&lt;br /&gt;       }&lt;br /&gt;      &lt;br /&gt;       var r = parseInt(v.substr(0, 2), 16);&lt;br /&gt;       var g = parseInt(v.substr(2, 2), 16);&lt;br /&gt;       var b = parseInt(v.substr(4, 2), 16);&lt;br /&gt;       return [r, g, b].join(',');&lt;br /&gt;   }&lt;br /&gt;   return v;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;Result&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;var input = $(this).css('color'); // rgb(255,0,0)&lt;br /&gt;&lt;br /&gt;var hex = rgb2hex(input); //ff0000&lt;br /&gt;var rgb = hex2rgb(hex);   //255,0,0&lt;br /&gt;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>[Chrome Extensions] QuietRead V2.1.0 Released</title><link>http://bamboobig.blogspot.com/2010/05/chrome-extensions-quietread-v210.html</link><category>Chrome</category><category>Docs</category><category>Extensions</category><category>Google</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sat, 1 May 2010 16:49:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-6753660195074046677</guid><description>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #0000ee;"&gt;&lt;u&gt;&lt;br /&gt;
&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;b&gt;Chrome Extension - Quietread V2.1.0 Released&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
My last updated (v2.0.1) was one month ago. The biggest changed on Chrome extension Quietread V2.x was using Google OAuth for authorization. The Users don't type their Google Account and Password. It's more convenient and safe to access user's data on Google Spreadsheet. &lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Then, what's updated at version V2.1.0. The following list is simple summary. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Add Tags and Notes feature for each Item. Now, you could add tags or notes to help you find out specific item you haven't finished. &lt;/li&gt;
&lt;li&gt;Search and tags support auto complete. You could use multiple keywords (ex: tags:jquery 2010). The results will highlight also. &lt;/li&gt;
&lt;li&gt;Quietread supports auto fetch your data from Google Docs spreadsheet in background in specific period. Default setting is 300 secs. You also could update immediately by clicking refresh button.&lt;/li&gt;
&lt;li&gt;You could share link what you read to your friend by email button. &lt;/li&gt;
&lt;li&gt;Add page and remove page by keyboard short keys. &lt;/li&gt;
&lt;/ul&gt;The summary above are new features. Then, what features are pull off at this version.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Sorting. I take searching instead of sorting. &lt;/li&gt;
&lt;li&gt;Show list by keyboard short keys. This feature does not work very well because of some specific pages like Chrome Home page.&lt;/li&gt;
&lt;li&gt;Automatic add page by clicking Quietread icon. It seems a little bit annoy.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Layout&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKx69bE75Y32rFVNsO-9dWONWtbFTtrX6yIj84YJrKxy7YHXaKdLS_qbaNz6_rVxxU12Ab3noOYPo4u_dhWk_lfUiLhyphenhyphenfYsVPauD24fBTTP5R1XhyTwdIHuJwQ6RifqGxltTe7Liw3zqsD/s1600/1-1.png" rel="20100430"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5466208818525043570" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKx69bE75Y32rFVNsO-9dWONWtbFTtrX6yIj84YJrKxy7YHXaKdLS_qbaNz6_rVxxU12Ab3noOYPo4u_dhWk_lfUiLhyphenhyphenfYsVPauD24fBTTP5R1XhyTwdIHuJwQ6RifqGxltTe7Liw3zqsD/s400/1-1.png" style="cursor: pointer; display: block; height: 400px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 314px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;Edit Notes&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi37Ro7Tl7BO_9cY2cXInAP1_MKcw9KkUxUDX8DkOYxmIMh-JqHnt5OxX8iCKD3Za8N_8GZ7aOZ2NSDqFJpwUum5Fpj7pp_fb3qEc_CmpR3F2HI72Op89OOeeGTU-HzoawEV8Qg_EstE-SH/s1600/2.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi37Ro7Tl7BO_9cY2cXInAP1_MKcw9KkUxUDX8DkOYxmIMh-JqHnt5OxX8iCKD3Za8N_8GZ7aOZ2NSDqFJpwUum5Fpj7pp_fb3qEc_CmpR3F2HI72Op89OOeeGTU-HzoawEV8Qg_EstE-SH/s400/2.png" width="311" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Edit Tags&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuJWHRG098hNxSJwfhn3ygo1ImAHfU-LaKnK21ygvrDXuppMe-SNNUaLbR6DWA7wLLhyphenhyphenhyphenhyphen8OY9LNM0Xckry_kxnkS4nxWjtf3Q6PyRRCtJpLggN9yhMDiZhyZQ-KfzErmJ9P2-itPIJ0Xf/s1600/3.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuJWHRG098hNxSJwfhn3ygo1ImAHfU-LaKnK21ygvrDXuppMe-SNNUaLbR6DWA7wLLhyphenhyphenhyphenhyphen8OY9LNM0Xckry_kxnkS4nxWjtf3Q6PyRRCtJpLggN9yhMDiZhyZQ-KfzErmJ9P2-itPIJ0Xf/s400/3.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;Search box&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgYk3C5WwyNhg_YSphGjBK6GqPPVO0qvDQTD7YLZUsrbJDdl4DvDJhk11usPbneXaXDa9aUauj6rs5eUb2BBoP3pWsN8f0BAXSyeSuGNwsgvjhyphenhyphenKKC2ISuK9XhgeFjAOxt5V0Yf0FW5lY/s1600/4.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgYk3C5WwyNhg_YSphGjBK6GqPPVO0qvDQTD7YLZUsrbJDdl4DvDJhk11usPbneXaXDa9aUauj6rs5eUb2BBoP3pWsN8f0BAXSyeSuGNwsgvjhyphenhyphenKKC2ISuK9XhgeFjAOxt5V0Yf0FW5lY/s400/4.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Search for specific tag&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyY_WnXrAZaKJG6mpPw01eWgDAqp6fcSWw2Qt80DB4jyqWYtgSesuK7O5SZxPGKq8M9di2Zqc8hc32R0AxvTntLc5vYLWh0pWp9TMajqvdwKvJmqGd1SoeUR8UvdcrGFSkUv_itm3YdvH7/s1600/5.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyY_WnXrAZaKJG6mpPw01eWgDAqp6fcSWw2Qt80DB4jyqWYtgSesuK7O5SZxPGKq8M9di2Zqc8hc32R0AxvTntLc5vYLWh0pWp9TMajqvdwKvJmqGd1SoeUR8UvdcrGFSkUv_itm3YdvH7/s400/5.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Search for specific tag and keyword&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7DY3hAILWSVviC_Y04fIgGWXuDOLr2J9LI3eUIyTRf9rlp-yynVSvJYFbaja7WQEZ6OrRuAfI6752MgVPhOnBL7kvhMxZKGMx3sXcGxwzxGnlUK1EGrQi6oSQuo2t-uM8emoQGOdQhgJC/s1600/6.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7DY3hAILWSVviC_Y04fIgGWXuDOLr2J9LI3eUIyTRf9rlp-yynVSvJYFbaja7WQEZ6OrRuAfI6752MgVPhOnBL7kvhMxZKGMx3sXcGxwzxGnlUK1EGrQi6oSQuo2t-uM8emoQGOdQhgJC/s400/6.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Options&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhftjbKyqdWOkoklfuKSAHJ3xCce44ongVxZxdPSPilL3yga1Z7vpIEaajC4dvK89in8ThUztjSANVVN1MFDvxl7H4CAfporTVrbnonWPXSeuvSr5lYS2NVwZ90dzNXSsDoH_b7IRkRAd5y/s1600/7.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhftjbKyqdWOkoklfuKSAHJ3xCce44ongVxZxdPSPilL3yga1Z7vpIEaajC4dvK89in8ThUztjSANVVN1MFDvxl7H4CAfporTVrbnonWPXSeuvSr5lYS2NVwZ90dzNXSsDoH_b7IRkRAd5y/s400/7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Notices&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="zoom" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZt-PSPSmI7mrca-WkS5W9u_tWVKJrHKUF1yB2V28L2nsWtaD50yt00UIQWTuetjw0mTmIwr5GZLzW1u7oN7yugMEIJWnav3iVbjpEhwN-zEFOnN8ap7T_-qBy1LfKFF6QjI7zZMTT9FRS/s1600/8-1.png" imageanchor="1" rel="20100430" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZt-PSPSmI7mrca-WkS5W9u_tWVKJrHKUF1yB2V28L2nsWtaD50yt00UIQWTuetjw0mTmIwr5GZLzW1u7oN7yugMEIJWnav3iVbjpEhwN-zEFOnN8ap7T_-qBy1LfKFF6QjI7zZMTT9FRS/s400/8-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;There may have problem when you update Quietread to version 2.1.0. You have to make sure "QuietreadQueue" that on your Google Docs has 7 columns at least.&lt;/div&gt;&lt;div class="btn"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;p class="btn"&gt;&lt;a href="https://chrome.google.com/extensions/detail/jcompkbkkcdgjigcmedmeggjbjelcojn"&gt;Download Quietread V2.1.0&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKx69bE75Y32rFVNsO-9dWONWtbFTtrX6yIj84YJrKxy7YHXaKdLS_qbaNz6_rVxxU12Ab3noOYPo4u_dhWk_lfUiLhyphenhyphenfYsVPauD24fBTTP5R1XhyTwdIHuJwQ6RifqGxltTe7Liw3zqsD/s72-c/1-1.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Blogger Template Testing</title><link>http://bamboobig.blogspot.com/2010/03/blogger-template-testing.html</link><category>tset</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 24 Mar 2010 00:06:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-4527777308403438005</guid><description>&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;section subject&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p class="btn"&gt;&lt;br /&gt;&lt;a href="http://www.google.com"&gt;Google Search&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rearrange related posts code.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt; blockquote area&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;this.etag = json.gd$etag;&lt;br /&gt;var row = {};&lt;br /&gt;row.faviconurl = Url.decode(json.entry.gsx$faviconurl.$t);&lt;br /&gt;row.url        = Url.decode(json.entry.gsx$url.$t);&lt;br /&gt;row.title      = Url.decode(json.entry.gsx$title.$t);&lt;br /&gt;row.createdate = json.entry.gsx$createdate.$t;&lt;br /&gt;row.click      = json.entry.gsx$click.$t;&lt;br /&gt;row.edit       = json.entry.link[1].href;&lt;br /&gt;row.etag       = json.entry.gd$etag.$t;&lt;br /&gt;result.push(row);&lt;br /&gt;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[Chrome Extensions] QuietRead</title><link>http://bamboobig.blogspot.com/2009/12/chrome-extensions-quietread.html</link><category>API</category><category>Chrome</category><category>Extensions</category><category>Google</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 24 Dec 2009 19:55:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-6174992440404423522</guid><description>&lt;div style="text-align: left;"&gt;Two weeks ago. I went to join &lt;a href="http://www.taipei-gtug.org/home"&gt;Taipei GTUG&lt;/a&gt; (Google Technology User Group) &lt;a href="http://www.taipei-gtug.org/events/google-chrome-hackathon-2009"&gt;Google Chrome Hackathon&lt;/a&gt;. At the Chrome Hackathon, the people who attended want to developed few useful, interesting, funny Google Chrome extensions.&lt;/div&gt;&lt;div&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:Arial, Verdana, sans-serif;font-size:13px;"&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;In my team (although 2 members) want to develop a useful chrome extensions. Nowadays, it's very convenient to search anything on the internet. Shopping, documents, and news for instance.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;You might browse a lot links in one day. How come you could remember all of that links. You might say that you can use bookmark to keep the URL you haven't read it but you interested in it. It's a good method. I use the bookmarks in different browsers too. But, i will keep the link to my bookmarks i thought it's helpful to me. So, i need to any way to keep the URL for a while. That's why QuieRead from. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;What's QuietRread?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;QuietRead is very simple concept. You might have used the similar service on the internet. What's different between they and QuietRead. I assume you already have a Google Account (If you haven't. Have one). Because QuietRead use Google Documnet List Data API &amp;amp; Google SpreadSheet Data API to save the URL in your Google Docs SpreadSheet. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;What does QuietRead do?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;Quick answer: Add and remove URL on Google Docs specific SpreadSheet. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;How does QuietRead work?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because QuietRead use Google Documnet List Data API &amp;amp; Google SpreadSheet Data API, you have to login your Google account first in QuietRead extensions Option page. Following are simple step.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Login in your Google Account.&lt;/li&gt;&lt;li&gt;If login is succeed. Then, QuietRead will try to get Google Document List Data API &amp;amp; Google SpreadSheet Data API authorization. &lt;/li&gt;&lt;li&gt;Check "QuietreadQueue" spreadsheet file on your Google Docs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If "QuietreadQueue" is exist, loading data. If "QuietreadQueue" isn't exist. create new one.&lt;/li&gt;&lt;li&gt;now, you can add and remove URL in Chrome QuietRead Extensions.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a class="zoom" rel="20091224" title="QuietRead Icon" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0m_D3-hgJmfWDteQSXd0dharBzTE12JbogXfEkxgvCn5C-390gdC2yiBYK6iVwKQ5FXgIlJw5FybUpvG0H6F5Jc4Bx23fpEJQiMC_zE6JPm8elu7mPqB7dJ49Tj393z-TLDq-r4eE6aer/"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0m_D3-hgJmfWDteQSXd0dharBzTE12JbogXfEkxgvCn5C-390gdC2yiBYK6iVwKQ5FXgIlJw5FybUpvG0H6F5Jc4Bx23fpEJQiMC_zE6JPm8elu7mPqB7dJ49Tj393z-TLDq-r4eE6aer/s400/01.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5418787415791161618" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 305px; height: 132px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a class="zoom" rel="20091224" title="QuietRead Popup" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_o4vjFA4Culvp2oX4Ya10mPVY5EziVaF9TdDP9hgop1c6mK43a_7d5QcgeUCi3VwwoNfHTpnJboY2WngJf1Zo43z5EQBjJNknSFY8p4cQBnUNlLdYsMze3Z-7XatFI2KCa-nq7QzRCFj_/"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_o4vjFA4Culvp2oX4Ya10mPVY5EziVaF9TdDP9hgop1c6mK43a_7d5QcgeUCi3VwwoNfHTpnJboY2WngJf1Zo43z5EQBjJNknSFY8p4cQBnUNlLdYsMze3Z-7XatFI2KCa-nq7QzRCFj_/s400/02.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5418787419308234882" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 371px; height: 400px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a class="zoom" rel="20091224" title="QuietRead Option page" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKImfqN-qQToslnw1U8KGHFKkahfxIkGNTdYqrweHhAvGC1xiJaTRAt4iT1UeCCZljphGaCy9VRHxnIngJgOtmQZNz7vJDOrKqQ7Z47GrJy680drw9rXtwXwtC49FButV6dCPa1a2AW3C_/"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKImfqN-qQToslnw1U8KGHFKkahfxIkGNTdYqrweHhAvGC1xiJaTRAt4iT1UeCCZljphGaCy9VRHxnIngJgOtmQZNz7vJDOrKqQ7Z47GrJy680drw9rXtwXwtC49FButV6dCPa1a2AW3C_/s400/04.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5418787421639002322" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 246px; " /&gt;&lt;/a&gt;&lt;a class="zoom" rel="20091224" title="the links you saved in your Google Docs" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu3UvWc_12Z1chfMRveWdXV7HtWv4IRrICPxfbZYGiA2AiP4IS5LePCqyn8Bm_U-Ma-9fjAqmU5G9jP54AXn9UIygMQU_Ws6X6eFmMrp2AmM26I0BaG08eaBY7Qo3rbO65ILMBoifX1QKI/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 254px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu3UvWc_12Z1chfMRveWdXV7HtWv4IRrICPxfbZYGiA2AiP4IS5LePCqyn8Bm_U-Ma-9fjAqmU5G9jP54AXn9UIygMQU_Ws6X6eFmMrp2AmM26I0BaG08eaBY7Qo3rbO65ILMBoifX1QKI/s400/05.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5418818720457787506" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p class="btn"&gt;&lt;br /&gt;&lt;a href="https://chrome.google.com/extensions/detail/jcompkbkkcdgjigcmedmeggjbjelcojn"&gt;Google Chrome QuietRead Extensions&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0m_D3-hgJmfWDteQSXd0dharBzTE12JbogXfEkxgvCn5C-390gdC2yiBYK6iVwKQ5FXgIlJw5FybUpvG0H6F5Jc4Bx23fpEJQiMC_zE6JPm8elu7mPqB7dJ49Tj393z-TLDq-r4eE6aer/s72-c/01.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[Web Tool] SpriteMe</title><link>http://bamboobig.blogspot.com/2009/11/web-tool-spriteme.html</link><category>Css</category><category>WebTool</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 12 Nov 2009 22:51:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-526014978140939354</guid><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" class="zoom" title="SpriteMe" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeBG_sG3KzXJmLKNZD4gq2DNUKJka11ldBEf2Y4QWxi2LhLceC9uquz7BcrD_d1yoSIA4zIePhjtEtFnDOCxsEkts7cX2mUaEn4-Ax6T8qcfpqn0elGD4YOksZBoCL0XvAIbMCA0TW8Vxi/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 256px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeBG_sG3KzXJmLKNZD4gq2DNUKJka11ldBEf2Y4QWxi2LhLceC9uquz7BcrD_d1yoSIA4zIePhjtEtFnDOCxsEkts7cX2mUaEn4-Ax6T8qcfpqn0elGD4YOksZBoCL0XvAIbMCA0TW8Vxi/s400/SpriteMe.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5403234849060616130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Recently, I read two books about performance article "High performance web sites: essential knowledge for frontend engineers"[1] and "Even Faster Web Sites: Essential Knowledge for Frontend Engineers"[2] by Steve Souders.&lt;/p&gt;&lt;p&gt;hat two books are very good books let you can understand how to increase web performance. I found few web tools in my searching. SpriteMe is one my want to share you guys. What is SpriteMe?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Background images make pages look good, but also make them slower. Each background image is an extra HTTP request. There's a fix: combine background images into a CSS sprite. But creating sprites is hard, requiring arcane knowledge and lots of trial and error. SpriteMe removes the hassles with the click of a button.&lt;/p&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Reference&lt;br/&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://books.google.com/books?id=jRVlgNDOr60C&amp;printsec=frontcover&amp;hl=zh-TW#v=onepage&amp;q=&amp;f=false"&gt;High performance web sites: essential knowledge for frontend engineers [1]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://books.google.com/books?id=E7p-07kNfXYC&amp;printsec=frontcover&amp;hl=zh-TW#v=onepage&amp;q=&amp;f=false"&gt;Even Faster Web Sites: Essential Knowledge for Frontend Engineers [2]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://spriteme.org/"&gt;SpriteMe&lt;/a&gt;&lt;/ul&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeBG_sG3KzXJmLKNZD4gq2DNUKJka11ldBEf2Y4QWxi2LhLceC9uquz7BcrD_d1yoSIA4zIePhjtEtFnDOCxsEkts7cX2mUaEn4-Ax6T8qcfpqn0elGD4YOksZBoCL0XvAIbMCA0TW8Vxi/s72-c/SpriteMe.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Rearrange Blogger Template Related Post &amp; Add New Features</title><link>http://bamboobig.blogspot.com/2009/11/rearrange-blogger-template-related-post.html</link><category>Blogger</category><category>Tip</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sat, 7 Nov 2009 22:42:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-7724665992786501790</guid><description>&lt;p&gt;Today i spent few time to modify Blogger template like:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Rearrange related posts code.&lt;/li&gt;&lt;li&gt;prettyprint code syntax highlight.&lt;/li&gt;&lt;li&gt;Adding FancyBox lightBox and modify new.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I will keep on arranging my Blogger template and help it can more friendly. There had three parts on the above list. Second list is google code pretttify. I change my code syntax from &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;syntaxhighligher&lt;/a&gt; to &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;google-code-prettify&lt;/a&gt;. Google-code-prettify is using easier than syntaxhighlighter. You can just include two file(prettify.js &amp;amp; prettify.css) add function to execute prettify. Done!! Third list is &lt;a href="http://fancybox.net/"&gt;FancyBox&lt;/a&gt; lightBox jQuery plugin.  If you are familiar with jQuery. I think it's easy to add that plugin to your web page. About first list is what i want to share how do i arrange the Related Posts.&lt;/p&gt;&lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Related Posts&lt;/span&gt;&lt;/span&gt;&lt;p&gt;Until now, Blogger haven't support related posts in your blogger template. If you want to add that feature, you have to modify some template code and add few javascript function to do that.&lt;/p&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Scenario&lt;/span&gt;&lt;/b&gt;&lt;p&gt;How does related posts work? The scenario is easy to understand. When you want to write new post, you will add Labels for this post on the bottom of Blogger editor. You add tags for the post you wrote. When web user visit your blog, related posts feature will list other relation posts following post content by specific tag. (&lt;span&gt;&lt;span&gt;you have three types can show related posts on your blog depending Blogger template pageType: 'item', 'archive', or 'index').[1]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;b:if cond='data:blog.pageType == &amp;amp;quot;item&amp;amp;quot;'&amp;gt;&lt;br /&gt;    &amp;lt;script expr:src='&amp;amp;quot;/feeds/posts/default/-/&amp;amp;quot; + data:label.name + &amp;amp;quot;?alt=json-in-script&amp;amp;amp;callback=RelatedLabels&amp;amp;amp;max-results=10&amp;amp;quot;'&lt;br /&gt;    type='text/javascript'&amp;gt;&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/b:if&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I want to show related posts in user view specific page. So, i assign pageType is 'item'. As you can see. you can receive specific tag post content by callback function using Google Data Protocol[2].  Following is complete code to get all tage you add.&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;b:loop values='data:post.labels' var='label'&amp;gt;&lt;br /&gt;&amp;lt;!-- Fixed for Related Posts --&amp;gt;&lt;br /&gt;&amp;lt;b:if cond='data:blog.pageType == &amp;amp;quot;item&amp;amp;quot;'&amp;gt;&lt;br /&gt;  &amp;lt;script expr:src='&amp;amp;quot;/feeds/posts/default/-/&amp;amp;quot; + data:label.name + &amp;amp;quot;?alt=json-in-script&amp;amp;amp;callback=RelatedLabels&amp;amp;amp;max-results=10&amp;amp;quot;'&lt;br /&gt;  type='text/javascript'&amp;gt;&lt;br /&gt;  &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/b:if&amp;gt;&lt;br /&gt;&amp;lt;/b:loop&amp;gt;&lt;/pre&gt;&lt;p&gt;Finial, you need to render those data to web page. You can have simple function to do that like this.&lt;/p&gt;&lt;p&gt;After solving how receive data from Blogger template Layout data and render to web page. The key point of Related posts is parse data you need.&lt;/p&gt;&lt;p&gt;We receive Blogger template Layout data by callback function and return JSON data. The render data include post url, post title and post date (depending what you need). It's better to keep value in an object. Object is easier to understand and manipulate.&lt;/p&gt;&lt;pre class="prettyprint"&gt;function RelatedLabels(json) {&lt;br /&gt;var entries = json.feed.entry;&lt;br /&gt;for (var key in entries) {&lt;br /&gt;if (entries[key]) {&lt;br /&gt;var item = {};&lt;br /&gt;item.title = entries[key].title.$t;&lt;br /&gt;item.url = entries[key].link[4].href;&lt;br /&gt;item.date = entries[key].published.$t.substr(0, 10);&lt;br /&gt;relatedPosts.push(item);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;You might add multiple tags in different posts, and therefore might receive the same post in different tag by loop. There are many solutions to solve duplicate post in an object.&lt;p&gt;&lt;a class="zoom" title="related posts object" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4sV53Qu-XYA7Q1RuNEE7V_N7nrZ3at5tDVEeWeqttl2UsnWDh0bWaHXRpt1H32NNIRiweddtLKdhodxbDUSB4ZiVePM60FTDuEVshgeZraEzXzKv2HoSbmd_KRdvxt5q3YyQICmDEU8qD/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4sV53Qu-XYA7Q1RuNEE7V_N7nrZ3at5tDVEeWeqttl2UsnWDh0bWaHXRpt1H32NNIRiweddtLKdhodxbDUSB4ZiVePM60FTDuEVshgeZraEzXzKv2HoSbmd_KRdvxt5q3YyQICmDEU8qD/s400/a.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5401524217782701522" /&gt;&lt;/a&gt;&lt;/p&gt;I push related post in one object. We can extend Array.prototype.push() function to detect should we add this post to our object. If you are familiar with Javascript syntax. It's simple to manipulate DOM using Javascript like document.write(). If you concern web page performance, you should decrease manipulate DOM directly[3]. Following is complete code.&lt;/p&gt;&lt;pre class="prettyprint"&gt;var relatedPosts = [];&lt;br /&gt;relatedPosts.push = function (data) {&lt;br /&gt; var _push = true;&lt;br /&gt; var length = this.length;&lt;br /&gt; for (var i = 0; i &amp;lt; length; i++) {&lt;br /&gt;     if (this[i].url == data.url) _push = false;&lt;br /&gt; }&lt;br /&gt; if (_push) return Array.prototype.push.call(this, data);&lt;br /&gt; else return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function RelatedLabels(json) {&lt;br /&gt; var entries = json.feed.entry;&lt;br /&gt; for (var key in entries) {&lt;br /&gt;     if (entries[key]) {&lt;br /&gt;         var item = {};&lt;br /&gt;         item.title = entries[key].title.$t;&lt;br /&gt;         item.url = entries[key].link[4].href;&lt;br /&gt;         item.date = entries[key].published.$t.substr(0, 10);&lt;br /&gt;         relatedPosts.push(item);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ShowRelatedPosts(PostUrl) {&lt;br /&gt; var count = 0;&lt;br /&gt; var eleLi, link, date, fragment = document.createDocumentFragment();&lt;br /&gt; for (var key in relatedPosts) {&lt;br /&gt;     if (typeof(relatedPosts[key].url) != 'undefined' &amp;amp;&amp;amp; relatedPosts[key].url != PostUrl &amp;amp;&amp;amp; count &amp;lt; 5) {&lt;br /&gt;         eleLi = document.createElement('li');&lt;br /&gt;         link = document.createElement('a');&lt;br /&gt;         date = document.createTextNode(' (' + relatedPosts[key].date + ')');&lt;br /&gt;         link.setAttribute('href', relatedPosts[key].url);&lt;br /&gt;         link.innerHTML = relatedPosts[key].title;&lt;br /&gt;         eleLi.appendChild(link);&lt;br /&gt;         eleLi.appendChild(date);&lt;br /&gt;         fragment.appendChild(eleLi);&lt;br /&gt;&lt;br /&gt;         count++;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt; var eleOl = document.createElement('ol');&lt;br /&gt; eleOl.appendChild(fragment);&lt;br /&gt; document.getElementById('relatedPosts').appendChild(eleOl);&lt;br /&gt;}&lt;/pre&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;reference&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.google.com/support/blogger/bin/answer.py?hlrm=b5&amp;amp;answer=47270"&gt;Blogger Layout Data Tage&lt;/a&gt;s [1]&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/en/apis/gdata/docs/2.0/reference.html"&gt;Google Data Protocol Reference&lt;/a&gt; [2]&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/zh-TW/speed/articles/javascript-dom.html"&gt;Speeding up JavaScript :Working with the DOM&lt;/a&gt; [3]&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"   style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Arial, Helvetica, sans-serif;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style=" -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;  font-family:Georgia, serif;font-size:16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4sV53Qu-XYA7Q1RuNEE7V_N7nrZ3at5tDVEeWeqttl2UsnWDh0bWaHXRpt1H32NNIRiweddtLKdhodxbDUSB4ZiVePM60FTDuEVshgeZraEzXzKv2HoSbmd_KRdvxt5q3YyQICmDEU8qD/s72-c/a.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Inner Google Docs Quickly View Alternate URL by Chrome Extensions</title><link>http://bamboobig.blogspot.com/2009/11/inner-google-docs-quickly-view.html</link><category>Chrome</category><category>Docs</category><category>Google</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 4 Nov 2009 23:43:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-370719780574928282</guid><description>&lt;p style="color: rgb(51, 51, 51);"&gt;If you paid your attention at Google Docs service, you will found Google Docs team announce few new feature like &lt;a href="http://feedproxy.google.com/%7Er/OfficialGoogleDocsBlog/%7E3/-5zLlyoUAiw/view-online-files-using-google-docs.html"&gt;&lt;b&gt;&lt;i&gt;View online files using Google Doc Viewer&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;, &lt;a href="http://feedproxy.google.com/%7Er/OfficialGoogleDocsBlog/%7E3/ixjYBD7JHr4/shared-folders-and-more-in-google-docs.html"&gt;&lt;b&gt;&lt;i&gt;Shared folders and more in Google Docs&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;, &lt;a href="http://feedproxy.google.com/%7Er/OfficialGoogleDocsBlog/%7E3/z_bNTKg7im4/taking-charge-of-your-document-sharing.html"&gt;&lt;i&gt;&lt;b&gt;Taking charge of your document sharing&lt;/b&gt;&lt;/i&gt;&lt;/a&gt; &lt;span&gt;&lt;span&gt;etc. One of my favorite new feature is Google Docs Viewer. Google Docs Viewer let you quickly view documents online without leaving your browser. You don't need to download it if you just want quick it.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(51, 51, 51);"&gt;&lt;a href="http://docs.google.com/viewer"&gt;Google Docs Viewer&lt;/a&gt; is a very convenience tool let you increase browser experience. But, it's still have few restrained. It's just support three file format: &lt;span style="font-weight: bold; font-style: italic;"&gt;PDF documents, PowerPoint presentations, and TIFF files now&lt;/span&gt;. Beside file type part, you need put documents on the internet.&lt;/p&gt;&lt;p style="color: rgb(51, 51, 51);"&gt;I like search documents on the internet when i don't know somethings. I type keyword in search engine and combine search file type. Google search engine started support QuickView new feature few weeks ago. It does work very well. But, there isn't every pdf or ppt item has QuickView button on the list. It's a easy way to solve this problem. Copy target doucment URL and paste it in Google Docs Quickly View. Then, Done!! It sounds great, right? Not at all, how could we do this job more convenience. I choose Chorme Extensions.&lt;/p&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);font-size:100%;" &gt;What's Chrome Extensions&lt;/span&gt;&lt;span style="color: rgb(102, 0, 204); font-weight: bold;"&gt;?&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 51, 51);"&gt;&lt;p&gt;Extensions are small software programs that can modify and enhance the functionality of Google Chrome.&lt;/p&gt;&lt;p&gt;You write them using web technologies like HTML, JavaScript, and CSS. So if you know how to write web pages, you already know most of what you need to know to write extensions." - Defintion in Google Chrome Extension: Development Documentation&lt;/p&gt;&lt;/blockquote&gt;&lt;span style="color: rgb(102, 0, 204);font-size:100%;" &gt;&lt;span style="font-weight: bold;"&gt;The Basic of Chrome Extentsion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 51, 51);"&gt;&lt;p&gt;"An extension is a zipped bundle of files — HTML, CSS, JavaScript, images, and anything else you need — that adds functionality to the Google Chrome browser. Extensions are essentially web pages, and they can use all the APIs that the browser provides to web pages, from XMLHttpRequest to JSON to HTML5 local storage.&lt;/p&gt;&lt;p&gt;Many extensions add UI to Google Chrome, in the form of toolstrips (toolbar additions) or page actions (clickable badges in the address bar). Extensions can also interact programmatically with browser features such as bookmarks and tabs. To interact with web pages or servers, extensions can use content scripts or cross-origin XMLHttpRequests." - &lt;a href="http://code.google.com/chrome/extensions/overview.html"&gt;OverView&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As you can see above paragraph. We can almost do anythng you want from add Google Chrome UI to use content script to manipulate DOM tree. How do we slove problem we told in Chrome extension? The scenario is very simple. Using content script manipulate DOM tree and innert Google Docs Quick View URL in each target document.&lt;/p&gt;&lt;span style="color: rgb(102, 0, 204); font-weight: bold;"&gt;Content Script&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 51, 51);"&gt;&lt;p&gt;Content scripts are JavaScript files that run in the context of web pages. By using the standard Document Object Model (DOM)," - &lt;a href="http://code.google.com/chrome/extensions/content_scripts.html"&gt;Content Script&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="color: rgb(51, 51, 51);"&gt;At my last post. There has a new search engine let you can search PDF file type ebooks. So, i holp content script can execute in two part. "Google Search Engine" and "PDFBooks search engine". First, we need to get target documnet url in DOM tree. There are few tools can help me to inspect current location in DOM Tree. I chose Google Chrome Developr tools (Ctrl+Shift+J).&lt;/p&gt;&lt;div style="text-align: center;"&gt;PDFBooks&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a class="zoom" rel="20091104" title="pdfBooks Dom inspector" style="color: rgb(51, 51, 51);" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpphyphenhyphenVvZN7URL7QPwgLfQOMLSF-Ee0zv0hDUCvdN2NeX9oARoCA8rbu075eiuP_bzvHOkE82bToA2EkSBJ3dFQW7TCN637vm5FpQv5ZOoFkT12Ri2ZLz2IbVhRvcs7_Gnk661JDSmdyvoA/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpphyphenhyphenVvZN7URL7QPwgLfQOMLSF-Ee0zv0hDUCvdN2NeX9oARoCA8rbu075eiuP_bzvHOkE82bToA2EkSBJ3dFQW7TCN637vm5FpQv5ZOoFkT12Ri2ZLz2IbVhRvcs7_Gnk661JDSmdyvoA/s400/2009-11-05_105654.png" alt="" id="BLOGGER_PHOTO_ID_5400502215811361506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google Search Engine&lt;br /&gt;&lt;/div&gt;&lt;a class="zoom" rel="20091104" title="Google Search Engine Dom inspector" style="color: rgb(51, 51, 51);" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJvFZSVYhbr9sWcxgGVmOZs-XD-igIq0scU4k02DNmRSvx0vkq3OW8BPkmTVcY3shNwi18zRIUP7gfzTwwvBBm-9kRnDWko7vlFNjDXD3d61ECDfslvKiVI4j9b2ClKX0JTgeU9Eg2Bt7Q/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJvFZSVYhbr9sWcxgGVmOZs-XD-igIq0scU4k02DNmRSvx0vkq3OW8BPkmTVcY3shNwi18zRIUP7gfzTwwvBBm-9kRnDWko7vlFNjDXD3d61ECDfslvKiVI4j9b2ClKX0JTgeU9Eg2Bt7Q/s400/2009-11-05_105345.png" alt="" id="BLOGGER_PHOTO_ID_5400502206866086034" border="0" /&gt;&lt;/a&gt;&lt;pre class="prettyprint"&gt;if (doc.URL.toString().match(/^http:\/\/www.google.com/)) {&lt;br /&gt;    links = doc.querySelectorAll('h3 &gt; a.l');&lt;br /&gt;}&lt;br /&gt;if (doc.URL.toString().match(/^http://pdfbook-s.com/)) {&lt;br /&gt;    links = doc.querySelectorAll('div#menu + a');&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;We inspect target documents url by querySelectorAll.&lt;/p&gt;&lt;pre class="prettyprint"&gt;for (var i = 0, len = links.length; i &lt; len; i++) {&lt;br /&gt;    var link = links[i];&lt;br /&gt;    if (link.toString().match(/pdf$/) || link.toString().match(/ppt$/)) {&lt;br /&gt;        var docViewer = document.createElement('a');&lt;br /&gt;        docViewer.setAttribute('href', 'http://docs.google.com/viewer?url=' + link);&lt;br /&gt;        docViewer.setAttribute('target', 'blank');&lt;br /&gt;&lt;br /&gt;        var favicon = document.createElement('img');&lt;br /&gt;        favicon.src = 'http://docs.google.com/favicon.ico';&lt;br /&gt;&lt;br /&gt;        docViewer.appendChild(favicon);&lt;br /&gt;        link.parentNode.insertBefore(docViewer, link);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Then, we can parse each hyperlink to insert alternate Google Docs Quick View URL if hyperlink has "PDF" or "PPT" keyword in a simple loop.&lt;p&gt;&lt;/p&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);font-size:100%;" &gt;Registered your content script&lt;/span&gt;&lt;p&gt;Content script needs to register in a extension's manifest.json file. like so:&lt;/p&gt;&lt;pre class="prettyprint"&gt;{&lt;br /&gt;  "name": "Insert Google Doc Quickly View URL", &lt;br /&gt;  "version": "0.1",&lt;br /&gt;  "description": "Insert Google Docs Quickly View for PDF &amp; PPT file format link",&lt;br /&gt;  "content_scripts": [&lt;br /&gt;    {&lt;br /&gt;      "matches": [&lt;br /&gt;        "http://www.google.com/search*",&lt;br /&gt;        "http://www.google.com.tw/search*",&lt;br /&gt;        "http://pdfbook-s.com/*"&lt;br /&gt;      ],&lt;br /&gt;      "js": ["insert_docs_quickly_view_url.js"]&lt;br /&gt;    }&lt;br /&gt;  ]&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Everything you done. What's different after using this extension.&lt;/p&gt;&lt;a class="zoom" rel="20091104" title="pdfBooks embed docs alternate url"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7kwqQ2nD4G_2cmwbggXxbvzd8EDMuzwV0Ezvax-NWVeBhWCGcJ_ewHv2_3I7zt-W5qIhUMFSnl524BQj5_1p9hTHdwvU25EAKT36pzTx3G9HQorpOfZw1iooajBCUAaYsdFl8YK_x4wp0/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 251px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7kwqQ2nD4G_2cmwbggXxbvzd8EDMuzwV0Ezvax-NWVeBhWCGcJ_ewHv2_3I7zt-W5qIhUMFSnl524BQj5_1p9hTHdwvU25EAKT36pzTx3G9HQorpOfZw1iooajBCUAaYsdFl8YK_x4wp0/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5400511225809343474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a class="zoom" rel="20091104" title="Google Search Engine embed Docs alternate url" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-Ade7fC0ZoqaaM1zUcm8pw8fyKA5Bp28vg_QY5oCQ3hBOYUYja0rXN-gNeFPvfhqBPy6WwsJd5D6BzGLWdS4NP7KWbC518IAhAysEsBujru1q5LdfktN2xy8x9FdTeyZHdgEWGuiZQjg/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 243px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-Ade7fC0ZoqaaM1zUcm8pw8fyKA5Bp28vg_QY5oCQ3hBOYUYja0rXN-gNeFPvfhqBPy6WwsJd5D6BzGLWdS4NP7KWbC518IAhAysEsBujru1q5LdfktN2xy8x9FdTeyZHdgEWGuiZQjg/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5400511221097760626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reference&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://code.google.com/chrome/extensions/index.html"&gt;Google Chrome Extensions: Developer Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pdfbook-s.com/"&gt;pdfBooks - Pdf Books search engine&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class="btn"&gt;&lt;a href="http://cage.chung.googlepages.com/insert_docs_quickly_view_url.js"&gt;Download: insert_docs_quickly_view_url.js&lt;/a&gt;&lt;/p&gt;&lt;p class="btn"&gt;&lt;a href="http://cage.chung.googlepages.com/insert_docs_quickly_view_url.crx"&gt;Download: insert_docs_quickly_view_url.crx&lt;/a&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpphyphenhyphenVvZN7URL7QPwgLfQOMLSF-Ee0zv0hDUCvdN2NeX9oARoCA8rbu075eiuP_bzvHOkE82bToA2EkSBJ3dFQW7TCN637vm5FpQv5ZOoFkT12Ri2ZLz2IbVhRvcs7_Gnk661JDSmdyvoA/s72-c/2009-11-05_105654.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><enclosure length="-1" type="*/*;charset=utf-8" url="http://pdfbook-s.com/"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>If you paid your attention at Google Docs service, you will found Google Docs team announce few new feature like View online files using Google Doc Viewer, Shared folders and more in Google Docs, Taking charge of your document sharing etc. One of my favorite new feature is Google Docs Viewer. Google Docs Viewer let you quickly view documents online without leaving your browser. You don't need to download it if you just want quick it.Google Docs Viewer is a very convenience tool let you increase browser experience. But, it's still have few restrained. It's just support three file format: PDF documents, PowerPoint presentations, and TIFF files now. Beside file type part, you need put documents on the internet.I like search documents on the internet when i don't know somethings. I type keyword in search engine and combine search file type. Google search engine started support QuickView new feature few weeks ago. It does work very well. But, there isn't every pdf or ppt item has QuickView button on the list. It's a easy way to solve this problem. Copy target doucment URL and paste it in Google Docs Quickly View. Then, Done!! It sounds great, right? Not at all, how could we do this job more convenience. I choose Chorme Extensions.What's Chrome Extensions? Extensions are small software programs that can modify and enhance the functionality of Google Chrome. You write them using web technologies like HTML, JavaScript, and CSS. So if you know how to write web pages, you already know most of what you need to know to write extensions." - Defintion in Google Chrome Extension: Development DocumentationThe Basic of Chrome Extentsion "An extension is a zipped bundle of files — HTML, CSS, JavaScript, images, and anything else you need — that adds functionality to the Google Chrome browser. Extensions are essentially web pages, and they can use all the APIs that the browser provides to web pages, from XMLHttpRequest to JSON to HTML5 local storage. Many extensions add UI to Google Chrome, in the form of toolstrips (toolbar additions) or page actions (clickable badges in the address bar). Extensions can also interact programmatically with browser features such as bookmarks and tabs. To interact with web pages or servers, extensions can use content scripts or cross-origin XMLHttpRequests." - OverView As you can see above paragraph. We can almost do anythng you want from add Google Chrome UI to use content script to manipulate DOM tree. How do we slove problem we told in Chrome extension? The scenario is very simple. Using content script manipulate DOM tree and innert Google Docs Quick View URL in each target document.Content Script Content scripts are JavaScript files that run in the context of web pages. By using the standard Document Object Model (DOM)," - Content ScriptAt my last post. There has a new search engine let you can search PDF file type ebooks. So, i holp content script can execute in two part. "Google Search Engine" and "PDFBooks search engine". First, we need to get target documnet url in DOM tree. There are few tools can help me to inspect current location in DOM Tree. I chose Google Chrome Developr tools (Ctrl+Shift+J).PDFBooks Google Search Engine if (doc.URL.toString().match(/^http:\/\/www.google.com/)) { links = doc.querySelectorAll('h3 a.l'); } if (doc.URL.toString().match(/^http://pdfbook-s.com/)) { links = doc.querySelectorAll('div#menu + a'); } We inspect target documents url by querySelectorAll.for (var i = 0, len = links.length; i Then, we can parse each hyperlink to insert alternate Google Docs Quick View URL if hyperlink has "PDF" or "PPT" keyword in a simple loop. Registered your content script Content script needs to register in a extension's manifest.json file. like so:{ "name": "Insert Google Doc Quickly View URL", "version": "0.1", "description": "Insert Google Docs Quickly View for PDF &amp; PPT file format link", "content_scripts": [ { "matches": [ "http://www.google.com/search*", "http://www.google.com.tw/search*", "http://pdfbook-s.com/*" ], "js": ["insert_docs_quickly_view_url.js"] } ] } Everything you done. What's different after using this extension. Reference Google Chrome Extensions: Developer DocumentationpdfBooks - Pdf Books search engineDownload: insert_docs_quickly_view_url.jsDownload: insert_docs_quickly_view_url.crx</itunes:subtitle><itunes:author>noreply@blogger.com (Anonymous)</itunes:author><itunes:summary>If you paid your attention at Google Docs service, you will found Google Docs team announce few new feature like View online files using Google Doc Viewer, Shared folders and more in Google Docs, Taking charge of your document sharing etc. One of my favorite new feature is Google Docs Viewer. Google Docs Viewer let you quickly view documents online without leaving your browser. You don't need to download it if you just want quick it.Google Docs Viewer is a very convenience tool let you increase browser experience. But, it's still have few restrained. It's just support three file format: PDF documents, PowerPoint presentations, and TIFF files now. Beside file type part, you need put documents on the internet.I like search documents on the internet when i don't know somethings. I type keyword in search engine and combine search file type. Google search engine started support QuickView new feature few weeks ago. It does work very well. But, there isn't every pdf or ppt item has QuickView button on the list. It's a easy way to solve this problem. Copy target doucment URL and paste it in Google Docs Quickly View. Then, Done!! It sounds great, right? Not at all, how could we do this job more convenience. I choose Chorme Extensions.What's Chrome Extensions? Extensions are small software programs that can modify and enhance the functionality of Google Chrome. You write them using web technologies like HTML, JavaScript, and CSS. So if you know how to write web pages, you already know most of what you need to know to write extensions." - Defintion in Google Chrome Extension: Development DocumentationThe Basic of Chrome Extentsion "An extension is a zipped bundle of files — HTML, CSS, JavaScript, images, and anything else you need — that adds functionality to the Google Chrome browser. Extensions are essentially web pages, and they can use all the APIs that the browser provides to web pages, from XMLHttpRequest to JSON to HTML5 local storage. Many extensions add UI to Google Chrome, in the form of toolstrips (toolbar additions) or page actions (clickable badges in the address bar). Extensions can also interact programmatically with browser features such as bookmarks and tabs. To interact with web pages or servers, extensions can use content scripts or cross-origin XMLHttpRequests." - OverView As you can see above paragraph. We can almost do anythng you want from add Google Chrome UI to use content script to manipulate DOM tree. How do we slove problem we told in Chrome extension? The scenario is very simple. Using content script manipulate DOM tree and innert Google Docs Quick View URL in each target document.Content Script Content scripts are JavaScript files that run in the context of web pages. By using the standard Document Object Model (DOM)," - Content ScriptAt my last post. There has a new search engine let you can search PDF file type ebooks. So, i holp content script can execute in two part. "Google Search Engine" and "PDFBooks search engine". First, we need to get target documnet url in DOM tree. There are few tools can help me to inspect current location in DOM Tree. I chose Google Chrome Developr tools (Ctrl+Shift+J).PDFBooks Google Search Engine if (doc.URL.toString().match(/^http:\/\/www.google.com/)) { links = doc.querySelectorAll('h3 a.l'); } if (doc.URL.toString().match(/^http://pdfbook-s.com/)) { links = doc.querySelectorAll('div#menu + a'); } We inspect target documents url by querySelectorAll.for (var i = 0, len = links.length; i Then, we can parse each hyperlink to insert alternate Google Docs Quick View URL if hyperlink has "PDF" or "PPT" keyword in a simple loop. Registered your content script Content script needs to register in a extension's manifest.json file. like so:{ "name": "Insert Google Doc Quickly View URL", "version": "0.1", "description": "Insert Google Docs Quickly View for PDF &amp; PPT file format link", "content_scripts": [ { "matches": [ "http://www.google.com/search*", "http://www.google.com.tw/search*", "http://pdfbook-s.com/*" ], "js": ["insert_docs_quickly_view_url.js"] } ] } Everything you done. What's different after using this extension. Reference Google Chrome Extensions: Developer DocumentationpdfBooks - Pdf Books search engineDownload: insert_docs_quickly_view_url.jsDownload: insert_docs_quickly_view_url.crx</itunes:summary><itunes:keywords>Chrome, Docs, Google</itunes:keywords></item><item><title>PDFBooks</title><link>http://bamboobig.blogspot.com/2009/11/pdfbooks.html</link><category>free</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Wed, 4 Nov 2009 23:26:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-5755685323662538160</guid><description>&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit2b1vY8u1KCERR9k-4i9J7FOxQlg3EFQ79YTIm3m8yLpu57BbOC0c1nSr0sw2UYBPJBNABH8vjTX-0YsRYjGnR6Gs0OdfTd-6WngBTN7WwShTEfDW-j5nSfL7ENJJy-6_IclH9Ij07reU/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-11-04+%E4%B8%8B%E5%8D%8811.27.37.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 187px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5400270657095660674" /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;u&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNgvwXnaCAVVTYBpNBudocR037rc2Cbwk0u1XCyEEt56JPwaOOnWCEasYq-qlcgGq2kCQY_Q5YgKN8hr6p6xsZlNgO1v424Msr2VDCRn6Hg5AMUk72UgNWJS34DkTKSLb9OWMQ9QwnDBD6/s1600-h/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-11-04+%E4%B8%8B%E5%8D%8811.25.14.png"&gt;&lt;br /&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNgvwXnaCAVVTYBpNBudocR037rc2Cbwk0u1XCyEEt56JPwaOOnWCEasYq-qlcgGq2kCQY_Q5YgKN8hr6p6xsZlNgO1v424Msr2VDCRn6Hg5AMUk72UgNWJS34DkTKSLb9OWMQ9QwnDBD6/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-11-04+%E4%B8%8B%E5%8D%8811.25.14.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5400270662271083058" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 157px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I think you guys have searched any kink file type in Google search engine or others search engine. I often search PDF file on the Internet like &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;PDF&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;PPT&lt;/span&gt;&lt;/b&gt; etc. It's a good choice to research something you don't know on the Internet. You might get few information on the way!!&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;There has another way you can find many PDF file type books on the specific search engine. It's PDFBooks. Type the keyword you want and click the search button. You will get PDF file type list. You can &lt;b&gt;&lt;i&gt;download&lt;/i&gt;&lt;/b&gt; that file to your local disk or&lt;b&gt;&lt;i&gt; view it online&lt;/i&gt;&lt;/b&gt; (It's using &lt;a href="http://www.scribd.com/"&gt;Scribd&lt;/a&gt; flash viewer).&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Link&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://pdfbook-s.com/"&gt;PDFBooks&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit2b1vY8u1KCERR9k-4i9J7FOxQlg3EFQ79YTIm3m8yLpu57BbOC0c1nSr0sw2UYBPJBNABH8vjTX-0YsRYjGnR6Gs0OdfTd-6WngBTN7WwShTEfDW-j5nSfL7ENJJy-6_IclH9Ij07reU/s72-c/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-11-04+%E4%B8%8B%E5%8D%8811.27.37.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><enclosure length="-1" type="*/*;charset=utf-8" url="http://pdfbook-s.com/"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>I think you guys have searched any kink file type in Google search engine or others search engine. I often search PDF file on the Internet like PDF, PPT etc. It's a good choice to research something you don't know on the Internet. You might get few information on the way!! There has another way you can find many PDF file type books on the specific search engine. It's PDFBooks. Type the keyword you want and click the search button. You will get PDF file type list. You can download that file to your local disk or view it online (It's using Scribd flash viewer). LinkPDFBooks</itunes:subtitle><itunes:author>noreply@blogger.com (Anonymous)</itunes:author><itunes:summary>I think you guys have searched any kink file type in Google search engine or others search engine. I often search PDF file on the Internet like PDF, PPT etc. It's a good choice to research something you don't know on the Internet. You might get few information on the way!! There has another way you can find many PDF file type books on the specific search engine. It's PDFBooks. Type the keyword you want and click the search button. You will get PDF file type list. You can download that file to your local disk or view it online (It's using Scribd flash viewer). LinkPDFBooks</itunes:summary><itunes:keywords>free</itunes:keywords></item><item><title>JSONC Of Picasa Web Ablum</title><link>http://bamboobig.blogspot.com/2009/11/jsonc-of-picasa-web-ablum.html</link><category>Google</category><category>Javscript</category><category>JSONC</category><category>Picasa Web Ablum</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Mon, 2 Nov 2009 23:14:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-2011394562230878942</guid><description>&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;What is JSON and JSONC?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="color:#333333;"&gt;JSON, short for JavaScript Object Notation, is a lightweight computer data interchange format. It is a text-based, human-readable format for representing simple data structures and associative arrays (called objects). - &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;&lt;span class="Apple-style-span"  style="color:#333333;"&gt;wiki&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="color:#333333;"&gt;JSONC: Clean, Compact, and Customizable. Minimize the number of JavaScript objects&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;You guys might have used a lot of JSON data in your web page, web application etc. If you are familiar with Blogger template, you might ever received your Picasa web album JSON  format data by calling Javascript function in your blogger by using this URL&lt;div&gt;&lt;pre class="prettyprint"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;http://picasaweb.google.com/data/feed/api/user/userID?alt=json&amp;amp;callback=?&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whatever you receive JSON data by Javascript callback function or jQuery Ajax callback funtion. You need to parse callback json data and get the data what you need.  There are too many objects in that data. It's a little complicate to get current fields you need.&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/apis/gdata/"&gt;Google Data Protocol&lt;/a&gt; support JSONC data format return in Google Web Album. That let you guys can receive data from Google Web Album more easy than before. What do we receive the JSONC format data. Changing feed URL to&lt;/div&gt;&lt;div&gt;&lt;pre class="prettyprint"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;http://picasaweb.google.com/data/feed/api/user/userID?&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;v=2&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&amp;amp;alt=&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;jsonc&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&amp;amp;callback=?&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a easy way to receive your Google Web Album data by modify feed URL arguments. The simple object data means you can decrease callback response time and increase the web page performance. If you are interested in performance articles, you should read following link&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/gdata/docs/2.0/migration_guide.html"&gt;Data APIs Version 2 Migration Guide &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/events/io/2009/sessions/EvolutionGoogleDataProtocol.html"&gt;Evolution of the Google Data Protocol: New Features for Building more Efficient Applications&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Our Earth Need Your Help!!</title><link>http://bamboobig.blogspot.com/2009/10/our-earth-need-your-help.html</link><category>Blog Action Day</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Thu, 15 Oct 2009 10:02:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-4607520534640967815</guid><description>&lt;div&gt;Aug 8th, 2009. It's a really a longest and very worse Fathers Day for most Taiwanese. In south of Taiwan attacked by super typhoon Moraka and caused the most serious damaged in Taiwan history. It rains over 3000 mm one year annual rainfall only in three days. Many people were homeless in the aftermath of typhoon Moraka. Unfortunately, my parent and others family members were one of the homeless people. We lose anything expect life.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Until now, i can't accept the truth sometimes. but, i have to learn accept that and thinking what should we do after damaging? Rebuild our home and back to normal life as soon as possible.  What do we learn aftermath the typhoon Moraka?  What are reasons cause such as this damage? Something are changed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think you guys have heard some issue about Global warming. Our atmosphere has too much carbon dioxide  and cause the Earth temperature growth up too fast. You may think some big issues like that should be government's responsibility. Because most people can't  lead relation political policies. Climate change is a human issue. What could we do be a person living in the Earth?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many resources you can find on the internet. Visit Climate change in the Google Earth, Explore the Climate Orb to concern what company learn for the stories behind the human face of climate change, Educate our kids about science of global warming etc. You can follow the tail of above issues and think about what "You" really can do to help the Earth. For me, i try to reduce my "carbon footprint" in my life. What's carbon footprint?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;"A carbon footprint is "the total set of greenhouse gas (GHG) emissions caused directly and indirectly by an individual, organization, event or product". For simplicity of reporting, it is often expressed in terms of the amount of carbon dioxide, or its equivalent of other GHGs, emitted." - definition by wikipedia&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many online carbon calculator you can figure out what yours is. You can understand that your impact is on climate change. Those online carbon calculators may not to help you figure out your carbon emission. It can remind you to change your life style to reduce the impact on climate change. Try to take public transportation, try to buy product from local area,  chose low-power electric equipments etc. You could fine you way!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our Earth need your help!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;ol style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt; &lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="cme-" href="http://www.blogactionday.org/" title="Blog Action Day '09 Climate Change web site" style="color: rgb(85, 26, 139); "&gt;Blog Action Day '09 Climate Change web site&lt;/a&gt;&lt;/li&gt;  &lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="hsyw" href="http://www.google.com/landing/cop15/#intro" title="Visit - Climate change in Google Earth" style="color: rgb(85, 26, 139); "&gt;Visit - Climate change in Google Earth&lt;/a&gt;&lt;/li&gt;  &lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="j7ye" href="http://tcktcktck.org/people/time-is-now/explore-climate-orb" title="Visit - Explore the Climate Orb"&gt;Visit - Explore the Climate Orb&lt;/a&gt;&lt;/li&gt;  &lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="msok" href="http://www.mnn.com/earth-matters/climate-change/stories/the-15-best-carbon-calculators" title="MNN's 15 Best Carbon Calculators" style="color: rgb(85, 26, 139); "&gt;MNN's 15 Best Carbon Calculators&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Few New Google Chrome Video From GoogleJapan</title><link>http://bamboobig.blogspot.com/2009/10/few-new-google-chrome-video-from.html</link><category>Chrome</category><category>Google</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Mon, 12 Oct 2009 19:22:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-5903558946558018946</guid><description>&lt;div&gt;Have you seen the so~~~~~o cute Google Street View Video by Google Japan. If you haven't seen that video. Click &lt;a href="http://www.youtube.com/watch?v=PQGrIsYUm4c&amp;amp;feature=channel"&gt;here &lt;/a&gt;to see that. I very recommend  you guys to have a look even you just a end user. The video can give you a skeleton concept of Google Street View.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see. It's a good introduction video from Google Japan. It's show time again but the main character change to new super star "&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;Chrome&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;". I think that "&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;b&gt;Speed&lt;/b&gt;&lt;/span&gt;" will be one of the good browser experience of Chrome for you guys. You guys may have few browsers in the computers like me. That mean you are pay attention in browser developing. If you should be. Following has few new Chrome video by Google Japan. Have a look!!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;速い + SUPER MONKEY BALL: Google Chrome アーティストテーマ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vpNFjDDg7mk&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/vpNFjDDg7mk&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Google Chrome アーティスト テーマ スライドショー&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/B0wdXIaY1Bc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/B0wdXIaY1Bc&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;速い + NINTEA: Google Chrome アーティストテーマ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/StTTFNPMxcg&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/StTTFNPMxcg&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;速い + ART: Google Chrome アーティストテーマ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lNDKKaq9SyY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/lNDKKaq9SyY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/user/googlejapan"&gt;More Videos From Google Japan &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>WhatTheFont</title><link>http://bamboobig.blogspot.com/2009/10/whatthefont.html</link><category>iPhone Apps</category><author>noreply@blogger.com (Anonymous)</author><pubDate>Sun, 11 Oct 2009 14:20:00 +0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-569131076581403375.post-8977235741893227546</guid><description>I wrote a article (&lt;a href="http://bamboobig.blogspot.com/2008/06/javascript-countdown.html"&gt;[Javascript &amp;amp; Css] CountDown&lt;/a&gt;) about Google Code Jam 2008 main page countdown. It does work using Javascript + CSS + DHTML and following is sniper image.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIbF95d59UbHC-fzyy5iGzZMttXL0cncfxufNtMVvmC6zbezP4s354BjKjuLZvWK7trUBc11itwlh8JYPmPtaUxlAxvwmltcibzsRKcypURjL7Is_0o9iDCV8wovPyJ_YqXHad0tve8kfk/s400/codejamCountDown.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After i wrote this article. I try to search this font on the inter and  ask my colleagues. What's this font? Until today i still haven't gotten exactly this font.  But, i found iPhone app WhatTheFont in one iPhone Home screens of First &amp;amp; 20. &lt;a href="http://www.firstand20.com/"&gt;First &amp;amp; 20&lt;/a&gt; is a collection of Home screens of some of the best and brightest developers, designers and tech writers.&lt;br /&gt;&lt;br /&gt;What does &lt;a href="http://new.myfonts.com/WhatTheFont/"&gt;WhatTheFont&lt;/a&gt;[&lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=304304134&amp;amp;mt=8"&gt;app store link&lt;/a&gt;]  do? It's very clear to understand as app name - Identify the fonts in a photo or web graphic!! Following is the simple step i try to identify the font i didn't know.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt; &lt;span style="font-weight: bold;"&gt;Using WhatTheFont app on your iPhone or iPhone touch.&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Sniper the photo of font and crop image. Then click upload&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG3mwodJjSi-VhLjNEE8CdKluOiUZvymlW2KBxWrNp8HOiMAiyuhxKRrdnrT8fGfJR1t-BGyH04nEL0x373GVTlSkO6_fqhbx9m3PCjDoHRBvAfMn7n2rUotIfNZMAihNUyn7XWjZ72NVf/s1600-h/IMG_0664.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG3mwodJjSi-VhLjNEE8CdKluOiUZvymlW2KBxWrNp8HOiMAiyuhxKRrdnrT8fGfJR1t-BGyH04nEL0x373GVTlSkO6_fqhbx9m3PCjDoHRBvAfMn7n2rUotIfNZMAihNUyn7XWjZ72NVf/s400/IMG_0664.PNG" alt="" id="BLOGGER_PHOTO_ID_5391241174679541202" border="0" /&gt;&lt;/a&gt;Check Chars and click identify!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg240vjX0SsPZE-jvWjnNoOvgtP6zkuo2O4IdgPCm2mzMkqOcysI8PonfnofzaYrHnX8gW6oHmB8iCAZVDtpJM2t1EnRLnpJMawaVlhQnLApuxzocA_qqHNrlFJzw-0T18fqFkFcVyayTf1/s1600-h/IMG_0665.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg240vjX0SsPZE-jvWjnNoOvgtP6zkuo2O4IdgPCm2mzMkqOcysI8PonfnofzaYrHnX8gW6oHmB8iCAZVDtpJM2t1EnRLnpJMawaVlhQnLApuxzocA_qqHNrlFJzw-0T18fqFkFcVyayTf1/s400/IMG_0665.PNG" alt="" id="BLOGGER_PHOTO_ID_5391241180402623810" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;You will get few font matches.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj196qHZOPu9FWxN6P06gSkITrhKx8yoBjyACjf00G0Cg1nAiRUspLjSPoKaHcHd2yaRZBRmyfSBOcQujsgUiXHCGPHMkTK4pZXhXTsDl0SZYHkFDxMyuz1ZBPfcGtlLPBblv60vniG1X11/s1600-h/IMG_0662.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj196qHZOPu9FWxN6P06gSkITrhKx8yoBjyACjf00G0Cg1nAiRUspLjSPoKaHcHd2yaRZBRmyfSBOcQujsgUiXHCGPHMkTK4pZXhXTsDl0SZYHkFDxMyuz1ZBPfcGtlLPBblv60vniG1X11/s400/IMG_0662.PNG" alt="" id="BLOGGER_PHOTO_ID_5391245133466366418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt; &lt;span style="font-weight: bold;"&gt;Using WhatTheFont web page to identify the fonts.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can upload a file or paste a specify image url.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqUOz4PH_tvWbgRqGUiVOD6-x3pjr3svA73mDsCUxuT1r0gVkVzB6zgXBUSF5ZJpwuHq0y3ietkXJ9bco7Bvxr9hOvs_ta1JV5A2xodiqo3M-uqMX1Z-WmOIThjTTm3JDoAyLF0zpH2Lb-/s1600-h/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.40.22.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 195px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqUOz4PH_tvWbgRqGUiVOD6-x3pjr3svA73mDsCUxuT1r0gVkVzB6zgXBUSF5ZJpwuHq0y3ietkXJ9bco7Bvxr9hOvs_ta1JV5A2xodiqo3M-uqMX1Z-WmOIThjTTm3JDoAyLF0zpH2Lb-/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.40.22.png" alt="" id="BLOGGER_PHOTO_ID_5391244441310535570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Check selection characters.  Leave character boxes blank if no valid character is highlighted. Then, click continue.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhabBMl8iqdZfFvysoLPOtTqiGqtfjloIKAh8zAPz_OFf10zRjM2p1NB5Bg9jRFzcnDM_NxWwEaZPJuU2VbIUiJmrZiERDOiRWBifExTa_TJZvgfB67oGCbLk1E7zzTo44SXLqreJKT6PjR/s1600-h/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.41.03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 255px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhabBMl8iqdZfFvysoLPOtTqiGqtfjloIKAh8zAPz_OFf10zRjM2p1NB5Bg9jRFzcnDM_NxWwEaZPJuU2VbIUiJmrZiERDOiRWBifExTa_TJZvgfB67oGCbLk1E7zzTo44SXLqreJKT6PjR/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.41.03.png" alt="" id="BLOGGER_PHOTO_ID_5391244439097875122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You will get few font matches as App version.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEWm3FmabaLPSG6_gtn-bj7q-E9-IvNc1o7vJ_2NlEE9zDAmkn99zQAiP5DFK8mTaGDcBpe2A-Komdv1_fhoGQeFEDi39jwWKsarUHGyTyGTlF3nvePUQjQCoQzQK1Shif9WBRC6remojJ/s1600-h/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.13.33.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 262px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEWm3FmabaLPSG6_gtn-bj7q-E9-IvNc1o7vJ_2NlEE9zDAmkn99zQAiP5DFK8mTaGDcBpe2A-Komdv1_fhoGQeFEDi39jwWKsarUHGyTyGTlF3nvePUQjQCoQzQK1Shif9WBRC6remojJ/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7+2009-10-11+%E4%B8%8B%E5%8D%883.13.33.png" alt="" id="BLOGGER_PHOTO_ID_5391244450588893314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Compare WhatTheFont App version and WhatTheFont web page font identify. I get more font matches by using App version than using web page font identify. But, as you can see. Using web page font identify is more easy  than App version. Whatever you chose which one. If you get the anwser like me. I think it's a good solution at least.</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIbF95d59UbHC-fzyy5iGzZMttXL0cncfxufNtMVvmC6zbezP4s354BjKjuLZvWK7trUBc11itwlh8JYPmPtaUxlAxvwmltcibzsRKcypURjL7Is_0o9iDCV8wovPyJ_YqXHad0tve8kfk/s72-c/codejamCountDown.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><enclosure length="-1" type="*/*;charset=utf-8" url="http://www.firstand20.com/"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>I wrote a article ([Javascript &amp;amp; Css] CountDown) about Google Code Jam 2008 main page countdown. It does work using Javascript + CSS + DHTML and following is sniper image. After i wrote this article. I try to search this font on the inter and ask my colleagues. What's this font? Until today i still haven't gotten exactly this font. But, i found iPhone app WhatTheFont in one iPhone Home screens of First &amp;amp; 20. First &amp;amp; 20 is a collection of Home screens of some of the best and brightest developers, designers and tech writers. What does WhatTheFont[app store link] do? It's very clear to understand as app name - Identify the fonts in a photo or web graphic!! Following is the simple step i try to identify the font i didn't know. Using WhatTheFont app on your iPhone or iPhone touch.Sniper the photo of font and crop image. Then click upload Check Chars and click identify! You will get few font matches. Using WhatTheFont web page to identify the fonts. You can upload a file or paste a specify image url. Check selection characters. Leave character boxes blank if no valid character is highlighted. Then, click continue. You will get few font matches as App version. Summary Compare WhatTheFont App version and WhatTheFont web page font identify. I get more font matches by using App version than using web page font identify. But, as you can see. Using web page font identify is more easy than App version. Whatever you chose which one. If you get the anwser like me. I think it's a good solution at least.</itunes:subtitle><itunes:author>noreply@blogger.com (Anonymous)</itunes:author><itunes:summary>I wrote a article ([Javascript &amp;amp; Css] CountDown) about Google Code Jam 2008 main page countdown. It does work using Javascript + CSS + DHTML and following is sniper image. After i wrote this article. I try to search this font on the inter and ask my colleagues. What's this font? Until today i still haven't gotten exactly this font. But, i found iPhone app WhatTheFont in one iPhone Home screens of First &amp;amp; 20. First &amp;amp; 20 is a collection of Home screens of some of the best and brightest developers, designers and tech writers. What does WhatTheFont[app store link] do? It's very clear to understand as app name - Identify the fonts in a photo or web graphic!! Following is the simple step i try to identify the font i didn't know. Using WhatTheFont app on your iPhone or iPhone touch.Sniper the photo of font and crop image. Then click upload Check Chars and click identify! You will get few font matches. Using WhatTheFont web page to identify the fonts. You can upload a file or paste a specify image url. Check selection characters. Leave character boxes blank if no valid character is highlighted. Then, click continue. You will get few font matches as App version. Summary Compare WhatTheFont App version and WhatTheFont web page font identify. I get more font matches by using App version than using web page font identify. But, as you can see. Using web page font identify is more easy than App version. Whatever you chose which one. If you get the anwser like me. I think it's a good solution at least.</itunes:summary><itunes:keywords>iPhone Apps</itunes:keywords></item></channel></rss>