tag:blogger.com,1999:blog-7291228961539213772024-03-05T01:02:24.911-08:00Code: Sean Gilligan on Software DevelopmentA blog about Software Development: iUI Framework, Mobile WebApps, JavaScript, AJAX, iPhone SDK, Groovy, Grails, Gaelyk and more.Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-729122896153921377.post-48077835462427796932012-07-13T11:23:00.000-07:002012-07-13T11:23:05.954-07:00Xerox System Integration Standard - Internet Transport Protocols (aka the "Gray Book")<div class="separator" style="clear: both; text-align: left;">
My friend and colleague <a href="https://www.facebook.com/mike.peltzer">Mike Peltzer</a> found this on the <a href="http://nextspace.us/">NextSpace</a> <q>free</q> counter this morning. Back when I was a lad at <a href="http://en.wikipedia.org/wiki/3Com">3Com</a> this was my bible for about 6 months. Known as the Xerox "Gray Book" it is officially titled <cite>Xerox System Integration Standard - Internet Transport Protocols (Xerox, Stamford, 1981)</cite>. The book specifies the core protocols of the <a href="http://en.wikipedia.org/wiki/Xerox_Network_Systems">Xerox Network Systems (XNS)</a> protocol suite. Among other things I used it to implement the <a href="http://www.techopedia.com/definition/25930/sequenced-packet-protocol-spp">Sequenced Packet Protocol (SPP)</a> on Mac OS. I'm happy to have this fine, thin volume on my work bookshelf in the nostalgia section.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig1t714bgivEivB1EHDAgogX-2DIfgaZ4Qf8zP_0jy20wkW_FLbpkyC2ANeqcPVoBPq7D_pMDsFria3zThPr_iBb1H8jU9q3A3BWDZx4mu9vNTMptkdfRtpwU-uBQupXlr8ElzepkryKY/s1600/IMG_3967.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig1t714bgivEivB1EHDAgogX-2DIfgaZ4Qf8zP_0jy20wkW_FLbpkyC2ANeqcPVoBPq7D_pMDsFria3zThPr_iBb1H8jU9q3A3BWDZx4mu9vNTMptkdfRtpwU-uBQupXlr8ElzepkryKY/s320/IMG_3967.jpg" width="249" /></a></div>
<br />Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-3628828730592904742012-07-08T12:14:00.001-07:002012-07-08T12:16:13.614-07:00iUI Source on GitHubThe iUI source code has been <a href="https://github.com/iui/iUI">mirrored on GitHub</a> for a few months now. Although both GitHub and Google Code support Git, it has become more clear to me that GitHub provides a superior user interface and workflow. <br />
<br />
One feature of GitHub that is particularly nice is the <a href="https://github.com/blog/39-say-hello-to-the-network-graph-visualizer">network graph visualizer</a> that graphically shows all commits in a network of repositories (e.g. the iUI repo and forks created by users/contributors.) The lack of this feature on Google Code makes it much harder to keep track of what is happening on the various "clone" repositories on Google Code. (Google Code uses the term "clone" repository for what is analogous to a "forked" repository on GitHub.)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRyR5TdE_o_TFJ1c6iwFTBbQOBZg1fVmP_rt1Ok8Y1QNpA1VSKruWOE9-dWrM4zDsTR5iPNbLt47bZz4QUVUTHzkInK_Iy7VesfF3RWO5fbK-0psSX6NlXmFs2cB62tbmFF7niyDU2NA/s1600/Screen+shot+2012-07-08+at+1.15.29+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRyR5TdE_o_TFJ1c6iwFTBbQOBZg1fVmP_rt1Ok8Y1QNpA1VSKruWOE9-dWrM4zDsTR5iPNbLt47bZz4QUVUTHzkInK_Iy7VesfF3RWO5fbK-0psSX6NlXmFs2cB62tbmFF7niyDU2NA/s400/Screen+shot+2012-07-08+at+1.15.29+AM.png" width="400" /></a></div>
<br />
The <a href="https://help.github.com/articles/using-pull-requests">pull request</a> feature of GitHub looks like an improvement over Google Code which has no web user-interface for requesting that code from a clone repository be pulled in to the master. For iUI we have asked that pull requests either be done via the <a href="http://groups.google.com/group/iui-developers">iui-developers</a> Google Group or via the Google Code <a href="https://code.google.com/p/iui/issues/list">Issues Database</a>.<br />
<br />
The iUI project is ready and I am anxiously awaiting the first <a href="https://help.github.com/articles/using-pull-requests">pull request</a> on GitHub. After a few successful pulls and merges on GitHub it is likely we'll make GitHub the preferred place for forking, pulling, and merging code changes to iUI. However, we'll continue to use Google Code for it's <a href="https://code.google.com/p/iui/w/list">wiki</a>, <a href="https://code.google.com/p/iui/issues/list">issues</a>, and <a href="https://code.google.com/p/iui/downloads/list">downloads</a> features.Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-68582635190161956312012-05-14T23:05:00.002-07:002012-05-14T23:25:21.890-07:00How (not) to do an HTML 5 WebView Mobile App: Facebook vs. LinkedInAs a user I've long been annoyed by the current Facebook iOS App (especially on my original-model iPad.) As a developer I've also been disappointed by what a poor example of an HTML-based mobile app Facebook has provided. Hacker News has a <a href="http://news.ycombinator.com/item?id=3974213">post</a> today which links an article called <a href="http://blog.mobtest.com/2012/05/heres-why-the-facebook-ios-app-is-so-bad-uiwebviews-and-no-nitro/">Here’s why the Facebook iOS app is so bad</a> that explains why.<br />
<br />
Among other interesting commentary on the Hacker News post, is a link to an article by LinkedIn about <a href="http://engineering.linkedin.com/mobile/linkedin-ipad-using-local-storage-snappy-mobile-apps">LinkedIn for iPad</a>, that provides some details about their architecture. If you haven't tried the LinkedIn app, it's worth looking at -- if only to cure the feeling of sadness you get from the Facebook App.Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-74392792197301205002012-03-08T15:55:00.005-08:002012-03-08T16:11:06.884-08:00The Bootstrap RevolutionTwitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework has been wildly successful. I am using it on some (behind-the-firewall, unfortunately) consulting projects and am very happy with it.<br />
<br />
Like anything else successful in tech, it has its detractors, but I'm truly surprised by the lack of substantial criticism. The <a href="http://drawar.com/d/great-another-bootstrap-site/">biggest complaint</a>, which I've made myself and have cautioned clients about, is that if you're not careful your site will end up looking too much like <a href="http://builtwithbootstrap.com/">all the other Bootstrap sites</a> that are out there. This problem occurs if you don't take the time to customize Bootstrap -- something that is relatively easy to do with a little <a href="http://twitter.github.com/bootstrap/less.html">tinkering with LESS</a>.<br />
<br />
In <a href="http://scripting.com/stories/2012/03/07/whyBootstrapMightBeVeryImp.html">Why Bootstrap might be very important</a> Dave Winer argues that this apparent drawback is actually a good thing and draws a comparison between Bootstrap and the original <a href="http://en.wikipedia.org/wiki/Macintosh_Toolbox">Macintosh Toolbox</a>. In short, he's reminding us that UI standardization is beneficial. Read the whole (short) thing and skim the <a href="http://news.ycombinator.com/item?id=3676179">Hacker News discussion</a> it spawned and draw your own conclusions.<br />
<br />
Another valid complaint is that sites that use Bootstrap don't completely separate content from presentation in part because key Bootstrap CSS classnames <a href="http://jgthms.com/bootstrap-is-for-programmers.html">describe layout, not content</a>. In practice this is only a minor issue and is probably unavoidable with a CSS framework, but it might upset a Semantic Web pilkunnussija.<br />
<br />
Bootstrap (and <a href="http://lesscss.org/">LESS</a>) have changed my perspective on front-end development. I'd like to apply some of the lessons learned to the <a href="http://www.iui-js.org/">iUI Framework</a>, but that's a subject for another time.Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-77409909764647801142012-01-06T18:05:00.000-08:002012-01-06T18:23:20.301-08:00Grails Ajax Proxy PluginThe <a href="https://github.com/msgilligan/grails-ajax-proxy-plugin">Grails Ajax Proxy Plugin</a> is now on GitHub.<br />
<br />
Over 2 years ago I <a href="http://grails.1312388.n4.nabble.com/Plugin-for-Cross-Domain-Ajax-Proxy-td1387007.html">asked on the grails-user list</a> if there was a Proxy Plugin available for <a href="http://grails.org/">Grails</a> that was suitable for Ajax apps to work around the <a href="http://en.wikipedia.org/wiki/Same_origin_policy">same origin policy</a>. I was told that nothing was available, so with a <a href="http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt">tip</a> from <a href="http://raibledesigns.com/">Matt Raible's blog</a>, I quickly wrote one using the<a href="http://edwardstx.net/2010/06/http-proxy-servlet/"> proxy servlet</a> from <a href="http://EdwardsTx.net/">EdwardsTx.net</a>. It worked for my needs at the time, but nobody on the list had expressed much interest in it and I had a bad experience trying to publish an update to the <a href="http://grails.org/iUI+Plugin">Grails iUI Plugin</a>, so I gave up.<br />
<div><br />
</div><div>Recently, I needed the plugin on another project, so I told my client that I'd put the <a href="https://github.com/msgilligan/grails-ajax-proxy-plugin">source on GitHub</a> in case they ever needed to modify it. This week, I mentioned it on the grails-user list and on Twitter and <a href="http://burtbeckwith.com/blog/">Burt Beckwith</a> submitted a <a href="https://github.com/msgilligan/grails-ajax-proxy-plugin/pull/1">pull request</a> that cleans things up quite a bit. He also changed the name to <a href="https://github.com/msgilligan/grails-ajax-proxy-plugin">Grails Ajax Proxy Plugin</a>. (I renamed the GitHub repo accordingly and GitHub doesn't provide forwarding -- so if you get a 404 looking for it you're using the old URL.)</div><div><br />
</div><div>With Burt's help, we may even get it published into the <a href="http://grails.org/plugins/">Grails Plugins Portal</a>.</div><div><br />
</div><div>(It's enough to make me consider updating the Grails iUI plugin after we release version 0.4...)</div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com3tag:blogger.com,1999:blog-729122896153921377.post-23368607924702218972010-04-13T16:00:00.000-07:002010-04-13T16:02:17.522-07:00iUI and mobile HTML5 at iPadDevCamp<div class="separator" style="clear: both; text-align: center;"><a href="http://www.iphonedevcamp.org/images/ipaddevcamp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="66" src="http://www.iphonedevcamp.org/images/ipaddevcamp.png" width="320" /></a></div><br />
<a href="http://www.iphonedevcamp.org/2010/01/27/announcing-ipaddevcamp/">iPadDevCamp</a> is this weekend. (It is produced by the wonderful <a href="http://www.iphonedevcamp.org/">iPhoneDevCamp</a> team.) It is at eBay in San Jose, CA but there are some <a href="http://www.iphonedevcamp.org/satellites/">satellite</a> locations as well. I went to iPhoneDevCamp in 2008 and 2009 and highly recommend it to both <a href="http://groups.google.com/group/iphonesdkdevelopment">Cocoa</a> and <a href="http://groups.google.com/group/iphonewebdev">Web</a> developers. I've been talking to a few folks about adapting <a href="http://code.google.com/p/iui/">iUI</a> for creating iPad (or iPad-like) webapps similar to what Apple is doing in <a href="http://almost.done21.com/2010/04/adlib-apples-secret-ipad-web-framework/">AdLib</a>. Any takers?<br />
<br />
We will be entering '<a href="http://code.google.com/p/iui/wiki/iuiPad">iuiPad</a>' in the <a href="http://www.iphonedevcamp.org/2010/04/11/participating-in-the-hackathon/">Hackathon</a>. (Someone will need to volunteer to do the demo, because I will not be there on Sunday.) Of course, anyone will be welcome to contribute to the project, whether they attend iPadDevCamp or not. <br />
<br />
If you're interested in contributing to this project, please do one or more of the following:<br />
<br />
<ol><li><a href="http://ipaddevcamp.eventbrite.com/?ref=ecount">Register</a> for iPadDevCamp</li>
<li>Follow <a href="http://twitter.com/#search?q=%23iuipad">#iuipad</a> on Twitter</li>
<li>Join the <a href="http://groups.google.com/group/iui-developers">iui-developers</a> Google Group</li>
<li>Check the <a href="http://code.google.com/p/iui/">iUI project site</a> (we've added a <a href="http://code.google.com/p/iui/wiki/iuiPad">wiki page</a> and will be updating it shortly)</li>
</ol><div>Comments welcome...</div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com2tag:blogger.com,1999:blog-729122896153921377.post-43673292932266243382010-04-11T22:11:00.000-07:002010-04-11T22:12:27.152-07:00TXJS: JavaScript conference in Austin, Texas<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgffc428OyBo31NBrZV2RK-Bj5WSGKwsiOie8FmHrBQulB7aQOf5dKBsaQXwNwvHO5GMgMQvnNaTzoFOTFIpG6V19Oc0POvm48TKSPgHiwSmc3QtA0QaipcZJX83wDqdsT3V50c2WXdsvw/s1600/txjsflag.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgffc428OyBo31NBrZV2RK-Bj5WSGKwsiOie8FmHrBQulB7aQOf5dKBsaQXwNwvHO5GMgMQvnNaTzoFOTFIpG6V19Oc0POvm48TKSPgHiwSmc3QtA0QaipcZJX83wDqdsT3V50c2WXdsvw/s320/txjsflag.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="color: #002655; font-family: 'helvetica neue', helvetica, verdana, arial, sans-serif; font-size: 19px; line-height: 26px;"><a href="http://texasjavascript.com/">TXJS</a> is a full-day conference in Austin, Texas, featuring some of the best minds in JavaScript.</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="color: #002655; font-family: 'helvetica neue', helvetica, verdana, arial, sans-serif; font-size: x-large;"><span class="Apple-style-span" style="font-size: 19px; line-height: 26px;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="color: #002655; font-family: 'helvetica neue', helvetica, verdana, arial, sans-serif; font-size: x-large;"><span class="Apple-style-span" style="font-size: 19px; line-height: 26px;">They just added more spots, so I signed up. I'm looking forward to visiting Austin again.</span></span></div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-78424631596233882462009-11-23T12:58:00.000-08:002009-11-23T12:58:52.199-08:00Storing Persistent Data in Hybrid iPhone WebappsI'm in the process of adding some persistence to a hybrid iPhone webapp. It looks like I'll be using the <a href="http://www.w3.org/TR/webstorage/">HTML5 Web Storage</a> capability. I googled around and didn't find any comparisons of the alternatives or suggested best practices. Apple has a document called <a href="http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Introduction/Introduction.html">Safari Client-Side Storage and Offline Applications</a>, which covers <a href="http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Name-ValueStorage/Name-ValueStorage.html">Key-Value storage</a> and the <a href="http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/UsingtheJavascriptDatabase/UsingtheJavascriptDatabase.html">JavaScript Database</a> -- but makes no mention of hybrid applications.<br />
<br />
It seems there are four possible options:<br />
<ol><li>Web Database</li>
<li>Key-value storage</li>
<li>Cookies</li>
<li>Use a JavaScript to Cocoa bridge to access native persistence</li>
</ol><div>I've given a little thought to the advantages and disadvantages of each (enough to decide to give HTML 5 Web storage a try.) I'll update this document if I get any good feedback.<br />
<b><br />
</b><br />
<b>Web Database</b><br />
</div><div><br />
</div><div>Advantages<br />
</div><div><ul><li>Can be used in hybrid, online and offline webapps.</li>
<li>Supported in iPhone OS 2.0 and later.</li>
<li>SQL is familiar and powerful for those who know it and need it.</li>
</ul><div>Disadvantages<br />
</div><div><ul><li>Use of SQL is overkill for simple persistence</li>
</ul><div><b>Key-value Storage</b><br />
</div><div><br />
</div><div>Advantages<br />
</div><div><ul><li>Simple conceptual model than SQL</li>
<li>Has both "session"and "local" modes</li>
</ul><div>Disadvantages<br />
</div><div><ul><li>Only supported in iPhone 3.0 and later (although Apple isn't very clear on this)</li>
</ul><div><b>Cookies</b><br />
</div><div><br />
</div><div>Advantages<br />
</div><div><ul><li>Tried and true web technology</li>
</ul><div>Disadvantages<br />
</div><div><ul><li>Either not supported in Hybrid mode or requires extra Cocoa code to support. (Does anybody have a definitive answer, details, or an example?)</li>
<li>Extra data is transmitted to the server on each request</li>
<li>Others?</li>
</ul><div><b>Custom JavaScript to Cocoa Bridge Option</b><br />
</div><div><br />
</div><div>Advantages<br />
</div><div><ul><li>You can use any iPhone native mechanism for persistence</li>
</ul><div>Disadvantages<br />
</div><div><ul><li>Requires custom Cocoa code</li>
<li>JavaScript to Cocoa bridge options are fairly clunky</li>
<li>Will not work for pure online/offline webapp</li>
</ul></div></div></div></div></div></div><div><br />
</div></div></div><div><br />
</div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com10tag:blogger.com,1999:blog-729122896153921377.post-75224559179657299242009-11-10T10:22:00.000-08:002009-11-10T10:33:11.995-08:00Issues in Serving iUI Sample Apps using MercurialSince Google Code does not provide general-purpose web hosting to projects, iUI has long used the SVN repository as an HTTP server to server the sample webapps. For example the URL <a href="http://iui.googlecode.com/svn/tags/REL-0.30/samples/music.html">http://iui.googlecode.com/svn/tags/REL-0.30/samples/music.html</a> serves the Music Sample from the 0.30 release of iUI. We had been using the tag REL-current to always server the latest stable release. We can't (easily) do this with Mercurial because the tag is passed in the query string. The URL <a href="http://iui.googlecode.com/hg/samples/music.html?r=REL-current">http://iui.googlecode.com/hg/samples/music.html?r=REL-current</a> will serve the HTML for the version tagged 'REL-current, but will then try to pull iui.css and iui.js from the 'tip' (at the time of writing, iui.css and iui.js are in a different directory on the 'tip' then they are in REL-current, so the files are not even found. If they hadn't been moved, then the wrong versions would be pulled.)<br />
<br />
I'm not sure there is an easy solution to this problem, but if anyone has any ideas, please let me know.<br />
<br />
Since we are now deploying the samples to Google App Engine (at <a href="http://iui-js.appspot.com">http://iui-js.appspot.com</a>), we'll have to have a 'tip' version and a 'REL-current' version on AppEngine, as well. Google App Engine does support deploying multiple versions of a webapp, but I think this is only intended for fallback purposes and not designed for serving multiple versions simultaneously. The other advantage to using AppEngine, of course, is that the dynamic pages used in the Samples and Tests will actually work.Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com2tag:blogger.com,1999:blog-729122896153921377.post-83311287996881400422009-11-05T22:17:00.000-08:002009-11-05T22:22:08.077-08:00XSLT Book RecommendationsI learned <a href="http://en.wikipedia.org/wiki/XSL_Transformations">XSLT</a> using Jeni Tennison's <a href="http://www.amazon.com/gp/product/1590592603?ie=UTF8&tag=msgilligancom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1590592603">Beginning XSLT</a><img src="http://www.assoc-amazon.com/e/ir?t=msgilligancom-20&l=as2&o=1&a=1590592603" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />as a tutorial and <a href="http://www.amazon.com/gp/product/0470192747?ie=UTF8&tag=msgilligancom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470192747">Michael Kay's XSLT book</a><img src="http://www.assoc-amazon.com/e/ir?t=msgilligancom-20&l=as2&o=1&a=0470192747" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />as a reference. Tennison has a newer book entitled <a href="http://www.amazon.com/gp/product/1590593243?ie=UTF8&tag=msgilligancom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1590593243">Beginning XSLT 2.0</a><img src="http://www.assoc-amazon.com/e/ir?t=msgilligancom-20&l=as2&o=1&a=1590593243" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. I'd take a look at her newer book, but keep in mind most XSLT implementations in use today still do not implement XLST 2.0, so don't reject the older book simply because it doesn't cover XSLT 2.0. If you're hardcore or plan on becoming hardcore, I'd recommend <a href="http://www.amazon.com/gp/product/0470192747?ie=UTF8&tag=msgilligancom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470192747">XSLT 2.0 and XPath 2.0</a><img src="http://www.assoc-amazon.com/e/ir?t=msgilligancom-20&l=as2&o=1&a=0470192747" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> (it's up to the 4th Edition now.)<br />
<br />
<br />
<br />
<iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=msgilligancom-20&o=1&p=8&l=as1&m=amazon&f=ifr&md=10FE9736YVPPT7A0FBG2&asins=1590592603" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=msgilligancom-20&o=1&p=8&l=as1&m=amazon&f=ifr&md=10FE9736YVPPT7A0FBG2&asins=1590593243" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=msgilligancom-20&o=1&p=8&l=as1&m=amazon&f=ifr&md=10FE9736YVPPT7A0FBG2&asins=0470192747" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><br />
<br />
<br />
If anyone has any other recommendations for learning XSLT, please post a comment...Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-61418287140886398172009-09-29T00:05:00.000-07:002009-09-29T01:18:40.288-07:00iUI Sample WebApp using HTML 5 Offline Cache on Google App EngineI've pushed a new development build of the <a href="http://code.google.com/p/iui">iUI</a> sample and test apps to Google App Engine (<a href="http://iui-js.appspot.com/index.gtpl">iui-js.appspot.com</a>)<br />
<br />
Among other changes in this build, the <a href="http://iui-js.appspot.com/samples/music/music.html">Music Sample</a> web application now supports offline operation on the iPhone ('airplane mode'.) It has been updated to <a href="http://www.w3.org/TR/html5/">HTML 5</a> and includes an <a href="http://www.w3.org/TR/html5/offline.html#appcache">application cache</a> <a href="http://www.w3.org/TR/html5/offline.html#concept-appcache-manifest">manifest</a> (<a href="http://iui-js.appspot.com/samples/music/music.manifest">music.manifest</a>) Although the Music Sample is fairly simple it has two dynamic 'pages' (they're actually <br />
<div>elements) that are loaded via Ajax. The <i>Search Results</i> page simply inserts the search string into three sample list entries. The <i>Stats</i> page returns static HTML content but is served up via a dynamic URI that delays for two seconds before returning the content. The purpose of the delay is to demonstrate the loading spinner. Both of these pages have "fallback" pages that are displayed in offline mode. The screenshots below show what each page looks like in online and offline mode.<br />
<br />
If you have an iPhone and want to try it out, here are the steps:<br />
<br />
<ol><li>Load the <a href="http://iui-js.appspot.com/samples/music/music.html">Music Sample</a> in Mobile Safari.</li>
<li>Touch the "+" button on the bottom toolbar.</li>
<li>Touch the "Add to Home Screen" button on the action sheet that pops up.</li>
<li>(Optional) Edit the name that will appear under the icon on your home screen.</li>
<li>Touch the "Add" button (top right)</li>
<li>Launch the WebApp from your newly created Home Screen button.</li>
<li>Browse around</li>
<li>Exit the WebApp and load the iPhone "Settings" application</li>
<li>Turn on "Airplane Mode"</li>
<li>Return to the Music Sample WebApp.</li>
<li>Browse around making sure to visit the Stats and Search Results pages</li>
<li>Turn off "Airplane Mode"</li>
</ol><div>Wasn't that cool? There are two 'themes' configured in the application and the resources for both are listed in the manifest, so you can actually change themes while offline (this is a cool demo, but may not be the optimal handling of themes for offline WebApps)<br />
</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSMhxoM4iDMg1smbA4rPX1LN1qEiUPxHWl5hlenHVt662hBTtpPhzv4ymQmRH17pXXPWqIh70RYNV-FgPLV48m5ugvNv7SEQ9Hk9MEQNzdfGVkPcwzaXbhgebAZ9Di9pZqTNFezNeIWO0/s1600-h/IMG_1883.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSMhxoM4iDMg1smbA4rPX1LN1qEiUPxHWl5hlenHVt662hBTtpPhzv4ymQmRH17pXXPWqIh70RYNV-FgPLV48m5ugvNv7SEQ9Hk9MEQNzdfGVkPcwzaXbhgebAZ9Di9pZqTNFezNeIWO0/s200/IMG_1883.PNG" /><span style="-webkit-text-decorations-in-effect: none; color: black;"></span></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSYit47R0xH-DyzCL9F3P5-mQ9bslJLaPm1-hHgZXLmwGbjFW30S_3GQtmiFxpeRWywow1geTuYQxyQLpkoYrFD-FggwcqMMy8D_hSkSYat6zgKOMGIftpcjcrcuS_u0BQkR5PCPMGlr0/s1600-h/IMG_1885.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSYit47R0xH-DyzCL9F3P5-mQ9bslJLaPm1-hHgZXLmwGbjFW30S_3GQtmiFxpeRWywow1geTuYQxyQLpkoYrFD-FggwcqMMy8D_hSkSYat6zgKOMGIftpcjcrcuS_u0BQkR5PCPMGlr0/s200/IMG_1885.PNG" /></a><br />
</div><div><br />
</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4cxe5dc7N8BNxspsw_aaW1oTieaSnZ4pOqp166NZZl3XclzMXe4nOXdTYV8ex9QLMW69f-CZ8NR0bfVg8lIDjNMi_fbNnv2p4tVmYNOaHKzrwf35t9RBzhF9RHk0zjgcFEAvwcsnS8vM/s1600-h/IMG_1886.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4cxe5dc7N8BNxspsw_aaW1oTieaSnZ4pOqp166NZZl3XclzMXe4nOXdTYV8ex9QLMW69f-CZ8NR0bfVg8lIDjNMi_fbNnv2p4tVmYNOaHKzrwf35t9RBzhF9RHk0zjgcFEAvwcsnS8vM/s200/IMG_1886.PNG" /><span style="-webkit-text-decorations-in-effect: none; color: black;"></span></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRwPQsRg4OFbyl5Z72454m6w_t-7-R7ZdSCAQvb7OAtPjeDT2KydpxLuHr4MKIuQGwDslvrUoo61kBplSFjjjko0wdCsLAkA07jODZJJNaHhg82tUOlph5UoeqNA_XJ7SB4b7dfxUNtlE/s1600-h/IMG_1884.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRwPQsRg4OFbyl5Z72454m6w_t-7-R7ZdSCAQvb7OAtPjeDT2KydpxLuHr4MKIuQGwDslvrUoo61kBplSFjjjko0wdCsLAkA07jODZJJNaHhg82tUOlph5UoeqNA_XJ7SB4b7dfxUNtlE/s200/IMG_1884.PNG" /></a><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">For further details, please see my <a href="http://code.msgilligan.com/2009/09/iui-on-google-app-engine-using-gaelyk.html">previous blog post</a> or the <a href="http://code.google.com/p/iui/wiki/iUIOnGoogleAppEngine">iUI on Google App Engine</a> wiki page. There's also a nice blog article about the <a href="http://www.technetra.com/2009/08/17/countdown-html5-cache-version/">Countdown 2.0</a> webapp that helped motivate me to do this. The initial version of Countdown was written at i<a href="http://www.iphonedevcamp.org/2009/08/02/iphonedevcamp-3-hackathon-winners/">PhoneDevCamp 3</a>.<br />
</div></div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-22979966720208453722009-09-17T00:39:00.000-07:002009-09-17T00:54:46.526-07:00Mobile Best Practices in the iPhone Era?A friend e-mailed me this evening asking about what the current best practices are for mobile web access. My immediate, flip response is "Make it look good on mobile <a href="http://webkit.org/">WebKit</a> and if the others can't read it, that's their problem."<br />
<br />
I've been so focused on iPhone (and compatible sites) over the last year, that I have almost no idea what people are doing to support other devices. Maybe the best practice is (essentially) to make it look good on the iPhone. Most of the other devices are using Mobile Safari and are pretty close to the iPhone in capabilities. Those that aren't are moving quickly to catch up. WebKit is pretty much standards-based and when you look at actual mobile web usage statistics all the other phones don't add up to much.<br />
<br />
She asked about a specific client that has an existing site that currently uses Flash navigation and has a limited budget. The client wants improved mobile support. Without knowing any details on the implementation of the site, the clients needs or budget, I'd guess there are four possibilities:<br />
<br />
<br />
<ol><li>Remove the Flash navigation and replace with HTML and CSS navigation that is as modern as possible given the structure and complexity of the existing site and the customers budget. Use the iPhone viewport tag and other techniques to make the site iPhone-compatible.</li>
<li>Create an alternative mobile site using XHTML that can be viewed by iPhones and other mobile devices, even older ones with limited web browsers. Redirect mobile users to the mobile site (giving them an option to return to the main site, of course)</li>
<li>Redirect users to an iPhone-optimized site using <a href="http://code.google.com/p/iui/">iUI</a> or another of the iPhone-centric mobile libraries.</li>
<li>Create an XHTML and an iPhone-centric site (In other words #2 and #3) (Optionally remove the Flash navigation on the desktop site, as well.)</li>
</ol><div>I would recommend #1 or #3 depending upon the budget. But I'm an iPhone bigot (or at least Mobile WebKit bigot.) Ultimately, it's a matter of return on investment. For a relatively small site, why make the huge investment of supporting all the older phones with small screens and lousy browsers that no one uses anyway?<br />
<br />
</div><div></div><div>Whichever strategy is chosen, testing needs to be performed starting with the most popular devices and extending as far down the "long tail" as the testing budget and ROI calculations can justify.</div><div></div><div><br />
<br />
Am I too much of an Apple fan boy? Does anyone else have some pragmatic alternative best practices?</div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com8tag:blogger.com,1999:blog-729122896153921377.post-15550461049801811682009-09-14T16:52:00.000-07:002009-09-16T14:02:46.883-07:00iUI on Google App Engine Using Gaelyk<div class="separator" style="clear: both; text-align: center;"></div>Since Google Code project hosting doesn't provide web hosting other than wiki pages, <a href="http://code.google.com/p/iui/">iUI</a> has been using SVN to host the sample applications, like the <a href="http://iui.googlecode.com/svn/tags/REL-current/samples/music.html">music sample</a>. The problem is that neither of these solutions allows PHP or any other server-side solution to run properly (e.g. <a href="http://iui.googlecode.com/svn/tags/REL-current/samples/search.php">Search</a> or <a href="http://iui.googlecode.com/svn/tags/REL-current/samples/stats.php">Stats</a> in the music sample)<br />
<br />
<div></div><div>I wanted a free hosting solution for the project and also am a big fan of the <a href="http://groovy.codehaus.org/">Groovy</a> programming language (my Java background showing) So, I thought I'd try using <a href="http://gaelyk.appspot.com/">Gaelyk</a> on <a href="http://code.google.com/appengine/">Google App Engine</a>. I first pushed a test version several months ago, but I've just pushed a new version to <a href="http://iui-js.appspot.com/index.gtpl">iui-js.appspot.com</a> and also <a href="http://code.google.com/p/iui/source/detail?r=13d3f32841f2775e59c3e2ea70140f777428f7ee">checked in</a> my work-in-progress to revision control.<br />
<br />
</div><div></div><div>I've also created a wiki page called <a href="http://code.google.com/p/iui/wiki/iUIOnGoogleAppEngine">iUI on Google App Engine</a>. The wiki page has (hastily-written) draft instructions on "<a href="http://www.youtube.com/watch?v=laRHIU_Uvt8">How I Did It</a>" -- as well as a to do list. Please let me know if you have any suggestions on the to do list.</div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://code.google.com/p/iui/"><img border="0" src="http://code.google.com/p/iui/logo?logo_id=1238443620" /></a><a href="http://gaelyk.appspot.com/" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="http://gaelyk.appspot.com/images/gaelyk.png" width="200" /></a><a href="http://code.google.com/appengine/" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="73" src="http://code.google.com/appengine/images/appengine_lowres.gif" width="96" /></a></div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com1tag:blogger.com,1999:blog-729122896153921377.post-29662407586810073392009-09-14T16:20:00.000-07:002009-09-16T13:54:07.771-07:00iUI Design PhilosophyThe forthcoming release of <a href="http://code.google.com/p/iui/">iUI</a> (<a href="http://code.google.com/p/iui/wiki/Roadmap">version 0.40</a>) is going to be the first release of iUI that add significant architectural changes. iUI today is not that different from the original release of iUI over 2 years ago. The major reason for lack of change has been simple: lack of human resources on the iUI team.<br />
<br />
There have been many great contributions from the community, from <a href="http://code.google.com/p/iui/issues/detail?id=56&q=content-length">simple bug fixes</a> to <a href="http://masochismtango.com/2009/08/03/mobile-webapps-iui-framework-extensions/">beautifully crafted patches</a> that add multiple features and almost double the size of the codebase. I have also read and heard many opinions on the value of iUI, both positive and negative. I'd like to write a formal statement defining the design philosophy of iUI so that users, developers, and even critics can better understand what iUI is and what it wants to be when it grows up. This philosophy comes from three sources:<br />
<br />
<ol><li><a href="http://www.joehewitt.com/blog/introducing_iui.php">Joe Hewitt's original vision</a> and source code</li>
<li>The experience and feedback of the <a href="http://groups.google.com/group/iphonewebdev">community</a> as it has developed applications with iUI</li>
<li>My understanding of the above sources and desire to move the project forward while staying true to its roots and to the loyal community.</li>
</ol><div>Here are some of the key points in outline form:</div><div><ol><li>iUI is a micro-framework (small, no underlying framework)</li>
<li>iUI is standards-based, but Safari focused (no IE)</li>
<li>iUI is lightweight.</li>
<li>iUI is a great starting point for any iPhone-optimized mobile site</li>
<li>iUI is a great starting point for those who want to learn modern mobile Web Dev.</li>
<li>iUI provides a functional core that is extensible through plugins</li>
<li>iUI is independent of server side technology.</li>
</ol><div>I'd like to add a little more detail on these points (and was holding off on blogging this until I did) but I'm going to publish it now as it may answer some questions I've received recently. Comments are very welcome. This should eventually end up on the iUI project site.</div><div></div></div>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com3tag:blogger.com,1999:blog-729122896153921377.post-50359579184279956782009-09-06T20:27:00.000-07:002009-09-07T15:02:03.725-07:00Goal: I Wanna Be a JavaScript Ninja<span style="font-family: inherit;">I've wanted to create a blog that focuses specifically on software development, with a focus on JavaScript development for some time now. Since Apple's introduction of the iPhone and initial announcement that all iPhone applications would be </span><a href="http://www.apple.com/webapps/whatarewebapps.html"><span style="font-family: inherit;">Web Applications</span></a><span style="font-family: inherit;">, I've been interested in improving my knowledge of JavaScript and have made solid progress, but still have much to learn. Someday I hope to be a </span><a href="http://jsninja.com/"><span style="font-family: inherit;">JavaScript Ninja</span></a><span style="font-family: inherit;"> (I bought the early access edition of the book, last week.)</span><br />
<span style="font-family: inherit;"><br />
</span><br />
<span style="font-family: inherit;">I became involved in the </span><a href="http://code.google.com/p/iui/"><span style="font-family: inherit;">iUI</span></a><span style="font-family: inherit;"> project over two years ago, and offered my skills as in the areas of </span><a href="http://code.google.com/p/iui/source/browse/"><span style="font-family: inherit;">revision control</span></a><span style="font-family: inherit;">, </span><a href="http://code.google.com/p/iui/wiki/ReleaseProcess"><span style="font-family: inherit;">release management</span></a><span style="font-family: inherit;">, and </span><a href="http://code.google.com/p/iui/w/list"><span style="font-family: inherit;">documentation</span></a><span style="font-family: inherit;">. I had hoped to learn more about JavaScript by assisting other experts on the project where I could. </span><a href="http://www.joehewitt.com/"><span style="font-family: inherit;">Joe Hewitt</span></a><span style="font-family: inherit;">, who </span><a href="http://www.joehewitt.com/blog/introducing_iui.php"><span style="font-family: inherit;">created iUI</span></a><span style="font-family: inherit;"> had moved on to Facebook and was working insane hours on the initial </span><a href="http://iphone.facebook.com/"><span style="font-family: inherit;">Facebook iPhone Web Application</span></a><span style="font-family: inherit;">. A handful of </span><a href="http://code.google.com/p/iui/people/list"><span style="font-family: inherit;">other developers</span></a><span style="font-family: inherit;"> made contributions to the project but it didn't turn out to be the apprenticeship opportunity that I had hoped. I used iUI on several consulting projects and over time learned much more about JavaScript and came to understand the iUI code base quite well. Recently, I've decided that I have the expertise and can make the time to begin moving iUI forward and have made a few </span><a href="http://code.google.com/p/iui/wiki/ReleaseHistory"><span style="font-family: inherit;">releases</span></a><span style="font-family: inherit;">, fixed a few bugs, and added some minor features. I'm hoping to get more developers involved with iUI and I'm also hoping to interact with and learn from the wider JavaScript community.</span><br />
<span style="font-family: inherit;"><br />
</span><br />
<span style="font-family: inherit;">I've also had an interest in teaching JavaScript programming. JavaScript is the de facto language of the Internet and is (at least indirectly) a part of everyone's daily online life. In some ways it is well suited for beginners, in others it isn't. I would like to write some posts for beginners or new developers as well.</span><br />
<span style="font-family: inherit;"><br />
</span><br />
<span style="font-family: inherit;">I've debated whether I should use </span><a href="http://roller.apache.org/"><span style="font-family: inherit;">Apache Roller</span></a><span style="font-family: inherit;">, </span><a href="http://wordpress.org/"><span style="font-family: inherit;">Wordpress</span></a><span style="font-family: inherit;">, or </span><a href="http://www.blogger.com/"><span style="font-family: inherit;">Blogger</span></a><span style="font-family: inherit;"> to do it. Apache Roller is a great piece of software, I have a server side Java background, and there is a great team of helpful developers working on the project. But ultimately, I didn't want to commit to maintaining a blog on an instance of Tomcat or on a hosted Java Servlet environment. I may revisit this in the future, as I'd love to be able to be able to get under the hood of the blogging software I am using.</span><br />
<span style="font-family: inherit;"><br />
</span><br />
<span style="font-family: inherit;">Blogger is overall the quickest and cheapest way to get started and now is the time as I have several subjects I want to discuss.</span>Anonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0tag:blogger.com,1999:blog-729122896153921377.post-56723214733483879772009-01-02T13:40:00.000-08:002009-01-02T15:20:11.476-08:00New BlogI've wanted to start a blog about some of the JavaScript, iPhone, and AJAX work I've been doingAnonymoushttp://www.blogger.com/profile/06181527168884904362noreply@blogger.com0