<?xml version="1.0" encoding="utf-8"?>

			<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">

			<channel>
			<title>Raymond Camden&apos;s Blog - Mobile</title>
			<link>http://www.raymondcamden.com/index.cfm</link>
			<description>Raymond Camden&apos;s personal blog covering jQuery, Mobile, ColdFusion, and Web Development.</description>
			<language>en-us</language>
			<pubDate>Mon, 20 May 2013 17:05:32 -0400</pubDate>
			<lastBuildDate>Thu, 09 May 2013 21:49:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>raymondcamden@gmail.com</managingEditor>
			<webMaster>raymondcamden@gmail.com</webMaster>
			<itunes:subtitle></itunes:subtitle>
			<itunes:summary></itunes:summary>
			<itunes:category text="Technology" />
			<itunes:category text="Technology">
				<itunes:category text="Podcasting" />
			</itunes:category>
			<itunes:category text="Technology">
				<itunes:category text="Tech News" />
			</itunes:category>
			<itunes:keywords></itunes:keywords>
			<itunes:author></itunes:author>
			<itunes:owner>
				<itunes:email>raymondcamden@gmail.com</itunes:email>
				<itunes:name></itunes:name>
			</itunes:owner>
			
			<itunes:explicit>no</itunes:explicit>
			
			
			
			
			
			<item>
				<title>MAX Session: Advanced PhoneGap Build</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/5/9/MAX-Session-Advanced-PhoneGap-Build</link>
				<description>
				
				Oddly, the &lt;i&gt;last&lt;/i&gt; of my Adobe MAX sessions is available online now but none of my earlier ones. I assume they will show up in the next day or so. But for now, enjoy my eloquent presentation on the more advanced aspects of using PhoneGap Build. You can download the source code for the sample apps and slide deck as well.&lt;iframe title=&quot;AdobeTV Video Player&quot; width=&quot;600&quot; height=&quot;345&quot; src=&quot;http://tv.adobe.com/embed/1217/18506/&quot; frameborder=&quot;0&quot; allowfullscreen scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;

As always, I hope this is helpful!
				</description>
				
				
				<category>Mobile</category>
				
				<category>HTML5</category>
				
				<pubDate>Thu, 09 May 2013 21:49:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/5/9/MAX-Session-Advanced-PhoneGap-Build</guid>
				
				
				<enclosure url="http://www.raymondcamden.com/enclosures/APB.zip" length="7832632" type="application/zip"/>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Update to my Edge Inspect Viewer</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/5/7/Update-to-my-Edge-Inspect-Viewer</link>
				<description>
				
				Many moons ago I &lt;a href=&quot;http://www.raymondcamden.com/index.cfm/2012/11/6/Proof-of-Concept--An-Edge-Inspect-Screenshot-Viewer&quot;&gt;blogged&lt;/a&gt; about a proof of concept I built that allowed you to view Edge Inspect screen shots via a nice web interface. This was built in Node using the Express framework. I&apos;ve finally gotten around to doing some updates to it as well as pushing it up to Github.First, I applied the &lt;a href=&quot;http://topcoat.io/&quot;&gt;Topcoat&lt;/a&gt; UI framework. This is an open source UI framework for desktop and mobile available for forking on Github. 

Here is a screen shot of the app in action:

&lt;img src=&quot;http://www.raymondcamden.com/images/one.png&quot; /&gt;

And here is a shot of the detail view (I&apos;d like to add a bit more detail here):

&lt;img src=&quot;http://www.raymondcamden.com/images/onepointfive.png&quot; /&gt;

New features include the ability to filter by operating system or device. Here&apos;s a filter on Android:

&lt;img src=&quot;http://www.raymondcamden.com/images/two.png&quot; /&gt;

So, like it? As I&apos;ve said before, I&apos;m still rather new to Node so take this code with a grain of salt. You can download (or fork and improve!) here: &lt;a href=&quot;https://github.com/cfjedimaster/inspectviewer&quot;&gt;https://github.com/cfjedimaster/inspectviewer&lt;/a&gt;
				</description>
				
				
				<category>Mobile</category>
				
				<category>Development</category>
				
				<pubDate>Tue, 07 May 2013 14:55:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/5/7/Update-to-my-Edge-Inspect-Viewer</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Visual comparisons of PhoneGap Notification UIs</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/5/5/Visual-comparisons-of-PhoneGap-Notification-UIs</link>
				<description>
				
				If you are a PhoneGap users,  hopefully you know about the various aspects of the &lt;a href=&quot;http://docs.phonegap.com/en/2.7.0/cordova_notification_notification.md.html&quot;&gt;Notification API&lt;/a&gt;. The Notification API allows for visual, audio, and tactile notifications. In this post I want to focus on the visual notifications and how they differ from the built in web view notifications.To begin, I created a simple HTML interface with buttons that would let me test &lt;strong&gt;alerts, confirms, and prompts&lt;/strong&gt;. These are the three forms of visual notifications both in vanilla JavaScript as well as PhoneGap&apos;s Notification API.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5520779.js&quot;&gt;&lt;/script&gt;

I used my epic CSS skills to make this a bit more touch friendly:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.57.40 AM.png&quot; /&gt;

Now let&apos;s look at the JavaScript.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5520791.js&quot;&gt;&lt;/script&gt;

The first three event handlers are for the vanilla JavaScript notifications. Notice how in confirm and prompt the result is handed back to a variable. The only real customization available is with the prompt method which allows for a default.

Here is the alert being fired:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.57.45 AM.png&quot; /&gt;

Here is the confirm:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.57.51 AM.png&quot; /&gt;

And finally the prompt:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.57.56 AM.png&quot; /&gt;

Now let&apos;s consider the native options. First note that they allow for customization. In each one you can tweak the button (or buttons) as well as the title. Be aware that confirm takes a list of button labels while prompt takes an array. (I consider that a bug and I hope they fix that soon.) Also note that all three have callbacks for handling button presses. I&apos;ve used null as a way of signifying I don&apos;t want to do anything, but you would normally have some kind of logic there.

Here is the native alert:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.58.07 AM.png&quot; /&gt;

Here is the native confirm:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.58.13 AM.png&quot; /&gt;

And lastly, the native prompt:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 5, 2013 7.58.19 AM.png&quot; /&gt;

Just to be clear, do remember that you can build your own alerts, confirms, and prompts as well if you feel like it.
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Sun, 05 May 2013 08:03:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/5/5/Visual-comparisons-of-PhoneGap-Notification-UIs</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Recording and Assets from my PhoneGap Presentation</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/5/2/Recording-and-Assets-from-my-PhoneGap-Presentation</link>
				<description>
				
				For those who attended my PhoneGap presentation earlier this week (or those who just want to hear the sound of my silky-smooth almost Billy Dee Williams voice) you can view the recording at the URL below. Note that if you did not register for the event you will be asked to register before you can view it. To be clear, this is &lt;b&gt;free&lt;/b&gt;. 

&lt;a href=&quot;http://w.on24.com/r.htm?e=582941&amp;s=1&amp;k=A3BCF648B71580CC093EF1264D5D27B1&quot;&gt;http://w.on24.com/r.htm?e=582941&amp;s=1&amp;k=A3BCF648B71580CC093EF1264D5D27B1&lt;/a&gt;

For folks who want a copy of the demos I used, you can get the source code and the slide deck here: &lt;a href=&quot;https://github.com/cfjedimaster/Introduction-to-PhoneGap&quot;&gt;https://github.com/cfjedimaster/Introduction-to-PhoneGap&lt;/a&gt;

As always, thank you to everyone who showed up (apparently near 900) and I hope you enjoyed it.
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Thu, 02 May 2013 16:34:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/5/2/Recording-and-Assets-from-my-PhoneGap-Presentation</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Using the Progress event in PhoneGap file transfers</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/5/1/Using-the-Progress-event-in-PhoneGap-file-transfers</link>
				<description>
				
				Earlier today I was happy to hear that &lt;a href=&quot;http://phonegap.com/blog/2013/04/30/pg-270-released/&quot;&gt;PhoneGap 2.7&lt;/a&gt; was released. While perusing the changelist, I thought I read that progress events for file transfers were added in this release. However, I was wrong. &lt;a href=&quot;http://docs.phonegap.com/en/2.7.0/cordova_file_file.md.html#FileTransfer&quot;&gt;FileTransfer&lt;/a&gt; has supported a progress event for a few months now. But since I figured this out while halfway through a demo, I figured I&apos;d finish it up anyway and share it on my blog.As you can imagine, the onprogress event is a property of the FileTransfer object. It is passed a progressEvent that is - unfortunately - not documented as far as I can see. The code example though gives you enough information I think to deal with it:

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5498492.js&quot;&gt;&lt;/script&gt;

So from what I can see - you get a property that determines if the total size is known, and if so, you can get a percentage by using it with the loaded property. Otherwise you&apos;re just guessing at the time left, but at least you know &lt;i&gt;something&lt;/i&gt; is going on.

For my demo, I thought I&apos;d build a simple MP3 downloader/player. I googled for &apos;free open source music&apos; and came across this incredible MP3 by Kansas Joe McCoy and Memphis Minnie: &lt;a href=&quot;http://publicdomain4u.com/kansas-joe-mccoy-memphis-minnie-when-the-levee-breaks/mp3-download&quot;&gt;When the Levee Breaks&lt;/a&gt;. Go ahead and listen to it. As much as I love indie music and trance, the sound of old recordings like this is like pure gold to the ears. 

Anyway - I began by creating an incredibly simple web page. It lists the name of the artists and the song along with a picture. I&apos;ve included a button that will trigger the download. Also make note of the status div I&apos;ll be using for - you guessed it - progress events.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5498519.js&quot;&gt;&lt;/script&gt;

Here&apos;s a screen shot of it in action.

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot May 1, 2013 4.28.35 PM.png&quot; /&gt;

Ok, now let&apos;s take a look at the code.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5498530.js&quot;&gt;&lt;/script&gt;

Starting from the top, the first thing that may interest you is the file system request. I ask for the temporary file system so I have a place to store the mp3. Once I&apos;ve got a hook to the file system I then enable the button in my web page and start listening for a touch event.

The function that handles the download, startDl, creates the FileTransfer object and points it to the remote MP3. I&apos;ve used almost the exact same onprogress event as demonstrated in the PhoneGap docs. I changed it to write out a percentage when possible and in other cases, simply append dots to the end of a string. That way people know something is still being transferred.

The final portion simply handles the media portion. I didn&apos;t bother adding any real controls so it just begins to play the track and that&apos;s it. (To be clear, this wouldn&apos;t be hard to add, just check the &lt;a href=&quot;http://docs.phonegap.com/en/2.7.0/cordova_media_media.md.html#Media&quot;&gt;Media API&lt;/a&gt; for more information.)

Watch the video below to see it in action:

&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/DrGAlizaf_8&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/DrGAlizaf_8&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

As a last tip, note that the docs for Media seem to imply that you need a URI, not a file path. On iOS it seems to require a path, not a URI. Thanks to &lt;a href=&quot;http://simonmacdonald.blogspot.com/&quot;&gt;Simon MacDonald&lt;/a&gt; for helping me with this.
				</description>
				
				
				<category>Mobile</category>
				
				<category>Development</category>
				
				<pubDate>Wed, 01 May 2013 16:08:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/5/1/Using-the-Progress-event-in-PhoneGap-file-transfers</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Note about PhoneGap Build and Splash Screens</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/4/23/Note-about-PhoneGap-Build-and-Splash-Screens</link>
				<description>
				
				I&apos;m currently working on my MAX &lt;a href=&quot;https://bit.ly/Wc52VD&quot;&gt;Advanced PhoneGap Build&lt;/a&gt; presentation (wait, scratch that, of course I&apos;m done already, I mean, who waits to the last minute???) and ran into an interesting issue. Using a splash screen is rather easy via the PhoneGap Build &lt;a href=&quot;https://build.phonegap.com/docs/config-xml&quot;&gt;config.xml&lt;/a&gt; file.To test this feature, I used &lt;a href=&quot;http://www.placekitten.com&quot;&gt;Placekitten.com&lt;/a&gt; to quickly create an image sizes 320x480. PhoneGap Build supports multiple splash screens of multiple sizes and densities, but I wanted to see how well a default splash screen would work. I dropped the kitten in my folder and added this to config.xml:

&amp;lt;gap:splash src=&quot;splash.png&quot; /&amp;gt;

I zipped up my folder, uploaded to PGB, and everything worked fine. I noticed, though, that my splash screen only lasted for about a second. I did some digging and found that you can disable the automatic hide of the splash screen by doing this:

&amp;lt;preference name=&quot;auto-hide-splash-screen&quot; value=&quot;false&quot; /&amp;gt;

I then wrote a bit of JavaScript that made use of the PhoneGap Splash Screen API:

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5445504.js&quot;&gt;&lt;/script&gt;

In theory, that should be it, but I noticed something odd. I launched my app, and then saw this:

&lt;img src=&quot;http://www.raymondcamden.com/images/2013-04-23 11.43.15.png&quot; /&gt;

What the heck? At first I thought I had broken something, but then I noticed the image went away after 5 seconds. I then realized what my issue was... size. 

When using the a default splash screen, PhoneGap is able to size it correctly for any device (afaik), but if you keep the splash screen around, it then reverts to the proper size for the device. In my case, I was testing on an iPhone 5. So I created a new image sized 640 by 1136 and added this to my config.xml:

&amp;lt;gap:splash src=&quot;retina.png&quot; width=&quot;640&quot; height=&quot;1136&quot; /&amp;gt;

And it worked perfectly. You can see via this exciting YouTube video:

&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/KQpbMmS9JW8&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/KQpbMmS9JW8&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

So I guess the take away from this is - while a default splash screen may work on multiple devices, if you are doing anything with the splash screen (like keeping it on screen longer), you want to ensure you build out properly sized images for your supported platforms. Frankly, that&apos;s probably the best idea in general anyway.
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Tue, 23 Apr 2013 11:54:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/4/23/Note-about-PhoneGap-Build-and-Splash-Screens</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Presenting on PhoneGap Next Week</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/4/23/Presenting-on-PhoneGap-Next-Week</link>
				<description>
				
				On Tuesday, April 30th, I&apos;ll be giving a free, online presentation about &lt;a href=&quot;http://www.phonegap.com&quot;&gt;PhoneGap&lt;/a&gt; as a preview of my &lt;a href=&quot;http://fluentconf.com/fluent2013&quot;&gt;Fluent 2013&lt;/a&gt; presentation in San Francisco next month. This presentation will be your basic &quot;What the frak is PhoneGap&quot;-type presentation, but if you are looking for a chance to get introduced to the product, please join me.

&lt;a href=&quot;http://oreillynet.com/pub/e/2608&quot;&gt;Developing Mobile Applications with PhoneGap&lt;/a&gt;

(Wow - I need to update my &lt;a href=&quot;http://www.oreillynet.com/pub/au/3437&quot;&gt;bio&lt;/a&gt; there. Apparently I&apos;m still an independent contractor focused on ColdFusion.)
				</description>
				
				
				<category>Mobile</category>
				
				<category>JavaScript</category>
				
				<pubDate>Tue, 23 Apr 2013 10:15:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/4/23/Presenting-on-PhoneGap-Next-Week</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Recording from my PhoneGap Build Ask a Pro Session</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/4/2/Recording-from-my-PhoneGap-Build-Ask-a-Pro-Session</link>
				<description>
				
				Miss my presentation last week? You can watch the recording below. If you would like the slide deck or any code samples from what I demonstrated, just ask.

&lt;a href=&quot;http://seminars.adobeconnect.com/p8cm5w6pyyx/&quot;&gt;http://seminars.adobeconnect.com/p8cm5w6pyyx/&lt;/a&gt;

As always, if you have any questions, just let me know. If you have any suggestions, let me know as well.

&lt;img src=&quot;http://www.raymondcamden.com/images/Build-Bot.png&quot; /&gt;
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Tue, 02 Apr 2013 16:24:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/4/2/Recording-from-my-PhoneGap-Build-Ask-a-Pro-Session</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Google Analytics and PhoneGap</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/28/Google-Analytics-and-PhoneGap</link>
				<description>
				
				Today I decided to try out the Google Analytics plugin with PhoneGap, and more specifically, PhoneGap Build. It is one of the plugins &lt;a href=&quot;https://build.phonegap.com/docs/plugins&quot;&gt;supported&lt;/a&gt; by PhoneGap Build and being somewhat of a data nerd, I was curious to see how well it worked. Unfortunately, my &quot;quick little experiment&quot; turned out pretty horrid so I thought I&apos;d write up my experiences to help others avoid the same mistakes I made.Based on the docs for PhoneGap Build and this plugin, I was directed to the plugin&apos;s &lt;a href=&quot;https://github.com/bobeast/GAPlugin/blob/master/README.md&quot;&gt;README&lt;/a&gt; file. The API to initialize, and track, events was rather darn simple. It&apos;s all asynchronous, but in most cases, you can probably just ignore the results. You want to log crap and forget about it. You&apos;ve got support to register events and pages, and set up custom data as well. (Note that free accounts are limited to 4 custom variables.) 

I whipped up a sample application that would let me test custom events and pages. I didn&apos;t want to bother setting up jQuery Mobile or a custom Single Page Architecture, I decided to just fake everything. So here is the index.html file:

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5266572.js&quot;&gt;&lt;/script&gt;

Note the two buttons. I&apos;m going to use one to trigger an event and one to trigger a page load. Now let&apos;s look at the JavaScript.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5266589.js&quot;&gt;&lt;/script&gt;

Again, fairly simple. You can see the initialization, you can see the button event handlers, etc. In theory, that should be it, right?

The Google Analytics number came from, well, Google Analytics of course. I created a new site and used the &quot;App&quot; setting (since I was building a mobile app):

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot82.png&quot; /&gt;

Easy peasy. I pushed up my bits to PhoneGap Build, pointed my iDevice at the QR code (they &lt;i&gt;do&lt;/i&gt; have a purpose), ran the app, and everything worked great. And by that I mean I didn&apos;t see the error handler firing. I went over to Google Analytics, switched to the Real-Time view, and waited.

And waited some more.

&lt;img src=&quot;http://www.raymondcamden.com/images/stillwaiting.png&quot; /&gt;

I knew Google Analytics, in general, took some time to process crap, but Real-Time is supposed to be, well, &lt;b&gt;real time!&lt;/b&gt; I put it aside, did some other stuff, and every now and then I&apos;d run the app, click some buttons with my fat fingers, check the Google Analytics site, and curse.

Eventually I began to Google around for some solutions. By some random luck I found this page on the PhoneGap Build support site: &lt;a href=&quot;http://community.phonegap.com/nitobi/topics/build_2_3_and_analytics_plugin&quot;&gt;Build 2.3 and Analytics Plugin &lt;/a&gt;. Specifically, one of the support folks posted a link to a GitHub demo of the feature in action (&lt;a href=&quot;https://github.com/amirudin/pgb-analytic&quot;&gt;amirudin / pgb-analytic&lt;/a&gt;), and right there in the README was...

&lt;blockquote&gt;
1- When creating new Analytics account, choose &apos;Website&apos; under &apos;What do you like to track&apos;
&lt;/blockquote&gt;

*sigh*

So.... yeah... that&apos;s frustrating. I created a new GA site, put in a fake URL as they suggested, switched the GA variable in my code, and voila - I began to see data immediately.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot83.png&quot; /&gt;

Surprisingly - or maybe I shouldn&apos;t be surprised - the geo data was right as well.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot84.png&quot; /&gt;

That orange blob isn&apos;t &lt;i&gt;terribly&lt;/i&gt; accurate, but I do live inside of it. Actually, and I just found this, it did get more accurate over time:

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot85.png&quot; /&gt;

If I had to guess, I&apos;d say it took about one hour before data showed up in the non-Real-Time portion, but once it did, it seemed to update rather quickly. I tested on my Android device (more on that in the notes below) and it showed up pretty quickly.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot86.png&quot; /&gt;

Also, both my events and page data were recorded. As I don&apos;t have a lot of either, I won&apos;t bother to show a screen shot, but they are showing up. 

So - it works.... but I&apos;ve got some issues (as well as general questions out there for anyone who wants to help).

1) Number one thing is to ensure you make a GA account for a site, not an app. I&apos;ve already got an email out to the PhoneGap team to see if we can document that better. I can see a lot of people making that mistake.

2) This is probably covered in the Google Analytics docs, but I&apos;m pretty sure I screwed up by sending &quot;new Date()&quot; as my event value. First, GA already knows when an event occurs. So that&apos;s kinda dumb on my part. Secondly, it looks like the dates were converted into milliseconds since epoch. I&apos;ve got some wonky big values for them in the GA dashboard. I&apos;m thinking that if my intent was just to log the &quot;event&quot; of hitting a UI item, I&apos;d be ok with a value of 1 there. If the event was something like, submitting a form for the # of beers you drank, then the value could be dynamic.

3) I tried to use the plugin locally - the one linked to from the PhoneGap Build docs. It never worked, and apparently is dead. But this isn&apos;t documented, and the PhoneGap Build docs link to it, so it... yeah... confusing. I was told that this is the new site for the repo: &lt;a href=&quot;https://github.com/phonegap-build/GAPlugin&quot;&gt;https://github.com/phonegap-build/GAPlugin&lt;/a&gt;. I haven&apos;t tried these bits.

4) Unfortunately, the Android version of this is throwing errors. Immediately on loading up the error handler is thrown, but all I get is a &quot;JSON Error&quot;. Yeah, that&apos;s it. At the same time, &lt;i&gt;some&lt;/i&gt; functionality worked (you can see in the screenshot above the device was recorded). My plan is to hook up DDMS (or whatever they call it now) and see if I can figure out the issue there.

5) I think you could do some interesting stuff with the variables aspect, especially if you have a paid account. You could make use of the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_device_device.md.html#Device&quot;&gt;device&lt;/a&gt; API and the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_connection_connection.md.html#Connection&quot;&gt;connection&lt;/a&gt; API to log some additional information about your users.
				</description>
				
				
				<category>Mobile</category>
				
				<category>Development</category>
				
				<pubDate>Thu, 28 Mar 2013 15:19:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/28/Google-Analytics-and-PhoneGap</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>&quot;Ask a Pro&quot; presentation this Friday</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/26/Ask-a-Pro-presentation-this-Friday</link>
				<description>
				
				This Friday, March 29th, I&apos;ll be giving an &quot;Ask a Pro&quot; online webinar on PhoneGap Build. I&apos;ll be talking about the site and demonstrating how to use it -- both by itself, and with Dreamweaver CS6 and Edge Code. To attend, simply register at the link below.

&lt;a href=&quot;http://www.adobe.com/cfusion/event/index.cfm?event=detail&amp;id=2008488&amp;loc=en_us&quot;&gt;Building Mobile Apps with Adobe PhoneGap Build&lt;/a&gt;

&lt;img src=&quot;http://www.raymondcamden.com/images/askapro.jpg&quot; /&gt;
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Tue, 26 Mar 2013 11:39:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/26/Ask-a-Pro-presentation-this-Friday</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Building &quot;Robust&quot; PhoneGap Applications</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/18/Building-Robust-PhoneGap-Applications</link>
				<description>
				
				Lately I&apos;ve been thinking more about how to make my PhoneGap applications more robust. By robust, I&apos;m not necessarily talking about performance. While that is important (see my coworker&apos;s excellent blog post on the topic: &lt;a href=&quot;http://www.tricedesigns.com/2013/03/11/performance-ux-considerations-for-successful-phonegap-apps/&quot;&gt;Performance &amp; UX Considerations For Successful PhoneGap Apps&lt;/a&gt;), I&apos;m thinking more about the general stability of the application as a whole. This is especially important for applications that need, or desire, data only available on the network. How you handle network conditions is just as important as how you handle the UX and performance of your application. (Well, that may be up to debate. :) In this blog post I&apos;m going to share some thoughts and examples of what I mean by this and - as always - I look forward to your comments, suggestions, and corrections.&lt;h2&gt;Net-Using PhoneGap Apps&lt;/h2&gt;

It may seem silly to specify &quot;Net-Using&quot; PhoneGap applications, but to be clear, you are perfectly able to build a PhoneGap application that doesn&apos;t require any assets from the Internet. All of your HTML, CSS, and JavaScript can be packaged up with the application and if you have no real need to hit any remote sources, then don&apos;t! If you&apos;re used to loading the CDN version of JavaScript or CSS libraries, replace them with local copies. 

That being said, if you do need to use the Internet in your application, how can you handle network issues? PhoneGap provides two different ways to handle this.

First is the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_connection_connection.md.html#Connection&quot;&gt;Connection API&lt;/a&gt;. This isn&apos;t really an &quot;API&quot;, but simply a constant you can check in your code to determine the connection status. There are various results that allow you to not only check for &lt;i&gt;any&lt;/i&gt; connection but the relative strength of the connection. This would be useful, for example, to determine what quality of a YouTube video you want to display - standard or HD.

Here are the possible values for this constant:

&lt;ul&gt;
&lt;li&gt;Connection.UNKNOWN
&lt;li&gt;Connection.ETHERNET
&lt;li&gt;Connection.WIFI
&lt;li&gt;Connection.CELL_2G
&lt;li&gt;Connection.CELL_3G
&lt;li&gt;Connection.CELL_4G
&lt;li&gt;Connection.NONE
&lt;/ul&gt;

One of the constant values for the Connection object is UNKNOWN. How you handle that is really up to you. In general, I think it is safer to be pessimistic and assume UNKNOWN is the same as OFFLINE, but I go back and forth on that.

The second thing PhoneGap provides is an event system that can recognize network changes. You have both an &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_events_events.md.html#offline&quot;&gt;offline&lt;/a&gt; and &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_events_events.md.html#online&quot;&gt;online&lt;/a&gt; event your code could listen to. 

In general, I think it makes sense for an application to check network status on startup, &lt;b&gt;and&lt;/b&gt; have event listeners for changes. You can&apos;t assume that a network connection that exists when the application starts up will be there for as long as the application is alive.

In order to test this, I build an application that supports Twitter searches. If you are online, then you can enter a search term, hit the button, and see the results from the Twitter API. If you are offline, the application responds correctly. The code I used also handles your device going on and offline. Here is a portion of the code.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5190645.js&quot;&gt;&lt;/script&gt;

For the most part, this should just &quot;make sense&quot;, but definitely let me know if you have questions. (I&apos;ve included the &lt;i&gt;entire&lt;/i&gt; application as a zip attached to this blog entry. It really isn&apos;t much more than this, but if you want to see it, just download the bits.)

Here&apos;s an example of the application running in Ripple. Notice that I&apos;ve done a search already. 

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot79.png&quot; /&gt;

I can now use Ripple to take my device offline. Notice that Ripple fakes an in-device notification with a simple HTML element overlaying the device.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot80.png&quot; /&gt;

It may be a bit hard to see, but the button has been disabled as well. This way the user can&apos;t accidentally click it again. When network access is restored, the button will be re-enabled. 

&lt;h2&gt;Error Handling&lt;/h2&gt;

Here is something that I&apos;ve really done a poor job of. Many of PhoneGap&apos;s APIs, and most remote APIs, have some way of handling errors. But I&apos;d be willing to bet most of your error handlers look something like this.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5190717.js&quot;&gt;&lt;/script&gt;

Ignoring for a moment that the message is a bit rude, note that no attempt was made to diagnose the form of the error and make a logical decision as to what should be done. Not every error is a &quot;Throw your hands up in the air and give up&quot; exception. In many cases, it may be something that is purely temporary and you should prompt your user to try again. In other cases it may be so bad you would want your application to shut down. The main point I&apos;d want you to take from this is to consider the types of errors you may be handling and try to react to them as nicely as possible.  If you have error gotten a weird, obtuse error in an application before and wanted to pull your hair out, keep in mind that you&apos;re a developer. Imagine what the normal people think.

Remember that JavaScript has full exception handling with &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/try...catch&quot;&gt;try/catch&lt;/a&gt; support, the ability to &lt;a href=&quot;https://developer.mozilla.org/en/JavaScript/Reference/Statements/throw&quot;&gt;throw&lt;/a&gt; your own exceptions, as well as listening for errors at the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/DOM/window.onerror&quot;&gt;window&lt;/a&gt; level.

Finally, don&apos;t forget you can Lint/JSHint your code. For folks new to JavaScript that can be a bit intimidating, but if you go in with the mindset that you don&apos;t necessarily need to agree with everything the Lint/Hint says, then the experience isn&apos;t quite as jarring. Of course, if you use &lt;a href=&quot;http://brackets.io/&quot;&gt;Brackets&lt;/a&gt; you get JSLint built in. (You can also find an extension for &lt;a href=&quot;https://github.com/cfjedimaster/brackets-jshint&quot;&gt;JSHint&lt;/a&gt;.)

&lt;h2&gt;Tracking/Reporting Issues&lt;/h2&gt;

So here&apos;s an interesting one. Imagine you&apos;ve got your application making use of the CowBell API. You&apos;ve got nice error handling/connection handling in place. You&apos;ve made the experience great for the end user. But are you responding to these errors and events? Are you cognizant of just how often the CowBell API goes down? Maybe it isn&apos;t so bad. Maybe it is pretty crappy. But until you start getting a bunch of 1-Star reviews you may not necessarily be aware of it. 

Maybe it isn&apos;t &lt;i&gt;too&lt;/i&gt; bad. For example, only 10% of the calls fail. That isn&apos;t terrible, but it is probably enough to warrant looking into app-side caching. You can make use of LocalStorage or the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage&quot;&gt;Storage API&lt;/a&gt;. Heck you can use the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_file_file.md.html#File&quot;&gt;File system&lt;/a&gt; too. On the flip side, if your API has something like 100% uptime and your users are in an an area with darn good coverage, it may not be worth your development time to worry about it.

The point is - how do you know?

During internal testing, you could make use of simple code that logs to a local file. You can add a temporary button to upload that file to a central server. While your users are testing, they can make use of that button then to upload their local logs when something is acting up.

Of course, you could do the same thing on a released, production application as well. How much you track and how you upload is more an ethical question than a technical one, but that option exists as well.

You can consider using a third party JavaScript error-handling solution, like &lt;a href=&quot;http://errorception.com/&quot;&gt;{errorception}&lt;/a&gt;. &lt;b&gt;However - I do not know if they support PhoneGap apps. When I find out, I&apos;ll edit this post.&lt;/b&gt; I&apos;ve found their results to be &lt;i&gt;incredibly&lt;/i&gt; detailed and useful for my desktop apps.

&lt;h2&gt;What else?&lt;/h2&gt;

So I know I&apos;m missing other suggestions. Leave a comment below!
				</description>
				
				
				<category>Mobile</category>
				
				<category>JavaScript</category>
				
				<pubDate>Mon, 18 Mar 2013 15:11:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/18/Building-Robust-PhoneGap-Applications</guid>
				
				
				<enclosure url="http://www.raymondcamden.com/enclosures/connection.zip" length="116347" type="application/zip"/>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Free ColdFusion 10 and jQuery Mobile Tutorial</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/12/Free-ColdFusion-10-and-jQuery-Mobile-Tutorial</link>
				<description>
				
				Thanks to reader Mikel Shilling for pointing this out to me. The most excellent (as Bill would say) folks at &lt;a href=&quot;http://www.figleaf.com&quot;&gt;FigLeaf&lt;/a&gt; have released a &lt;b&gt;free&lt;/b&gt; ColdFusion 10 and jQuery Mobile tutorial. You can download the bits here: 

&lt;a href=&quot;http://training.figleaf.com/curriculum/cfjqm.cfm&quot;&gt;http://training.figleaf.com/curriculum/cfjqm.cfm&lt;/a&gt;

Objectives for the course are:

&lt;ul&gt;
&lt;li&gt;Define and use AJAX/JSON(P) web services using ColdFusion 10
&lt;li&gt;Define and use REST web services using ColdFusion 10
&lt;li&gt;Using REST services with jQuery Mobile
&lt;li&gt;Implement real-time communications with HTML5 web sockets
&lt;/ul&gt;
				</description>
				
				
				<category>Mobile</category>
				
				<category>JavaScript</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Tue, 12 Mar 2013 12:29:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/12/Free-ColdFusion-10-and-jQuery-Mobile-Tutorial</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Testing PhoneGap, Parse, and Push? Read This</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/7/Testing-PhoneGap-Parse-and-Push-Read-This</link>
				<description>
				
				Back in October of last year I wrote a &lt;a href=&quot;http://www.raymondcamden.com/index.cfm/2012/10/10/PhoneGap-Parsecom-and-Push-Notifications&quot;&gt;guide&lt;/a&gt; to integrating PhoneGap, &lt;a href=&quot;http://www.parse.com&quot;&gt;Parse&lt;/a&gt;, and push notifications. Recently a reader noticed that my guide no longer worked and asked me to dig into it. I did today and have found the root of the issue.I began by creating a new PhoneGap 2.5.0 project at the command line and adding in the Android platform. I then followed the directions from my blog post. Since I wasn&apos;t testing intents, just notifications, I only followed about half of the guide. Basically the portions where I updated AndroidManifest.xml and the Java source. 

I deployed this to my Android device, went to the Parse dashboard, and sent a push. As my reader noted, the push did &lt;b&gt;not&lt;/b&gt; show up. I began my investigation by looking at the Data Browser. Part of the Data Browser is a grid of &quot;Installation&quot; objects. These are all the people who have installed your app. It also includes a channels array that signifies what push channels, if any, the device is subscribed to.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot73.png&quot; /&gt;

Notice that every single device is subscribed to &quot;&quot;, which represents the broadcast channel. I.e., everyone should get it. On a whim, I decided to try subscribing to a channel called foo. You can see it in the list above. I did this by simply adding one additional line of Java code:

PushService.subscribe(this, &quot;&quot;, testpush2.class);&lt;br/&gt;
PushService.subscribe(this, &quot;foo&quot;, testpush2.class);

I then went to the Parse dashboard and tweaked &quot;Send to&quot; to specify a segment.

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot74.png&quot; /&gt;

Notice that foo shows up. That&apos;s cool. It meant my Java code was definitely working, and Parse recognized that foo was a possible channel. I selected foo, entered some text, hit send, and...

Boom. It worked. WTF, right?

I then wondered - what would have happened if I had selected &quot;Broadcast&quot; in the drop down? I did... and it worked!

From what I can tell, something about Parse&apos;s dashboard has changed. The default option to send to everyone wasn&apos;t the same as sending to the Broadcast channel, but it was in the past. Here&apos;s a visual representation of my tests. 

&lt;img src=&quot;http://www.raymondcamden.com/images/screenshot75.png&quot; /&gt;

So as far as I know, everything still works just the same as before, it is just the dashboard that has changed in terms of how you test. I&apos;m going to post to Parse&apos;s forums about this to see what the specific difference is and if I get an answer, I&apos;ll post a link to it in the comments below.
				</description>
				
				
				<category>Mobile</category>
				
				<pubDate>Thu, 07 Mar 2013 09:57:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/7/Testing-PhoneGap-Parse-and-Push-Read-This</guid>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>PhoneGap Sample - Diary (Database and Camera support)</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/3/4/PhoneGap-Sample--Diary-Database-and-Camera-support</link>
				<description>
				
				Last week a reader wrote in with an interesting problem. They had a simple application that made use of PhoneGap&apos;s &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage&quot;&gt;database&lt;/a&gt; support. They wanted to add &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_camera_camera.md.html#Camera&quot;&gt;camera&lt;/a&gt; support as well. Their idea was that a picture could be associated with their content. But then they ran into this issue:&lt;blockquote&gt;
iOS Quirks:&lt;br&gt;
When destinationType.FILE_URI is used, photos are saved in the application&apos;s temporary directory. Developers may delete the contents of this directory using the navigator.fileMgr APIs if storage space is a concern.
&lt;/blockquote&gt;

So, right away, this brings up a useful reminder. Most things you do with PhoneGap will work cross platform, but it is crucial that you pay attention to the individual quirks for each platform. In this case, something that works fine in Android will cause problems in iOS. Even worse, because the images aren&apos;t removed immediately, you may think there isn&apos;t a problem at all. (As a side note, navigator.fileMgr is &lt;i&gt;old&lt;/i&gt; code that has not been removed from the docs yet. I&apos;ve filed a bug report to get this updated.)

I thought I&apos;d help out the reader by building a simple application that made use of both technologies and then work out how I&apos;d handle the iOS issue. I started off by building a simple Diary application. The Diary would allow you to write basic content entries, each with a title, body, and a creation date. I built a &lt;i&gt;very&lt;/i&gt; simple &quot;Single Page Architecture&quot; framework to handle my application views and routing. I won&apos;t even call it a framework. Really it is just one simple JavaScript function that lets me load a page into the DOM. 

Here&apos;s the home page - a simple list of entries with the ability to view an entry and add a new entry.

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot Mar 4, 2013 1.29.17 PM.png&quot; /&gt;

And the amazingly well-designed entry page:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot Mar 4, 2013 1.30.02 PM.png&quot; /&gt;

Finally, the form to write entries:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot Mar 4, 2013 1.31.03 PM.png&quot; /&gt;

I also built a wrapper for my Diary class that would abstract out the persistence for me. Here is that wrapper. Please don&apos;t laugh at my pitiful object-oriented-ish JavaScript code.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5084789.js&quot;&gt;&lt;/script&gt;

This wrapper class is used by index.js, which handles my views, adding and requesting data, etc. Basically, index.js acts like a controller in your typical MVC setup. I&apos;m not going to share all of that file (to be clear, everything is shared via a Download link below), but here is an example. 

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5084814.js&quot;&gt;&lt;/script&gt;

So - nothing too terribly complex. I took this as a starting point (in the zip you can download, this may be found in www1) and then began to integrate camera functionality. I started by adding a new button to my entry field. This button, &quot;Add Picture&quot;, would request the device camera and store the resulting image in a hidden form field. I began by using FILE_URIs even though I knew it would be an issue with iOS. In almost everything I do I start slowly, take baby steps, and try to build one thing at a time. So with that in mind, I went ahead and just built it in. 

Here is that code:

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5084843.js&quot;&gt;&lt;/script&gt;

Note that I&apos;ve updated my form to include a preview and the entry detail view (not shown here) has been updated to display it.

&lt;img src=&quot;http://www.raymondcamden.com/images/2013-03-04 13.45.11.png&quot; /&gt;

Ok, so at this point, the core functionality is done. (You can find this version in the www2 folder.)  I can add and view content (I didn&apos;t bother with edit/delete, but that would be trivial) and I can use the device camera to assign a picture to a diary entry. Now to look into the bug.

My initial thought was to make use of the &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_file_file.md.html#File&quot;&gt;File API&lt;/a&gt; to copy the image to a nice location. Even though Android didn&apos;t really need this feature, I thought I&apos;d keep things simple and just use the same logic for all. (To be fair, when I say &quot;all&quot;, I really was just testing Android and iOS.)

However, I ran into an interesting issue. When requesting the persistent file system, iOS gave me a directory that was customized for my application:

/var/mobile/Applications/362CC22A-BA60-4D81-876C-21072A06CE16/Documents

Unfortunately, the Android version of the exact same code returned a more generic folder. I could then make a folder for my Android app that was specific to the application itself, but that seemed to be a bit too much work. (Really, it wasn&apos;t, I was being lazy.) 

I rang up &lt;a href=&quot;http://simonmacdonald.blogspot.com/&quot;&gt;Simon MacDonald&lt;/a&gt;, my goto guy for PhoneGap questions (or at least until I annoy him ;) and in discussions with him, I discovered that right now there isn&apos;t a simple way, cross platform, to ask the file system for &quot;a safe application-specific place to store my crap.&quot; (My words, not his.) 

I made a decision at this point. Even though it felt a bit wrong, I decided I&apos;d write code just for iOS. I figured the &apos;forked&apos; code would be pretty small and therefore it wouldn&apos;t &quot;pollute&quot; my code too much. This smells like one of those decisions I may regret later, but for now, it is what I&apos;m going with. 

I began by sniffing the device using PhoneGap&apos;s &lt;a href=&quot;http://docs.phonegap.com/en/2.5.0/cordova_device_device.md.html#Device&quot;&gt;Device&lt;/a&gt; API.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5085445.js&quot;&gt;&lt;/script&gt;

Nothing too complex here. If I detect iOS, I request the persistent file system and remember the root directory it gives me.

Next - before I store the Diary entry, if I am on iOS, I simply copy the image over.

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5085467.js&quot;&gt;&lt;/script&gt;

Overall, not as messy as I thought. You can find the complete source code attached below. Enjoy.
				</description>
				
				
				<category>Mobile</category>
				
				<category>JavaScript</category>
				
				<pubDate>Mon, 04 Mar 2013 13:14:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/3/4/PhoneGap-Sample--Diary-Database-and-Camera-support</guid>
				
				
				<enclosure url="http://www.raymondcamden.com/enclosures/Archive29.zip" length="157770" type="application/zip"/>
				
				
			</item>
			
		 	
			
			
			<item>
				<title>Quick Tip - Make Apache&apos;s Directory Indexes look nicer on mobile</title>
				<link>http://www.raymondcamden.com/index.cfm/2013/2/27/Quick-Tip--Make-Apaches-Directory-Indexes-look-nicer-on-mobile</link>
				<description>
				
				If you use Apache, then you most likely have DirectoryIndex enabled on your development server. This is the feature that lets you request a directory without a home document and see a list of folders and files. This is &lt;i&gt;not&lt;/i&gt; normally enabled in production, but in certain circumstances it may be. (For a file download directory perhaps.) If you do any testing with mobile devices though you will probably find this index to a be a bit hard to read. Here&apos;s an example.&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot Feb 27, 2013 2.16.22 PM.png&quot; /&gt;

You can pinch and zoom to make that a bit easier to read, but it&apos;s a pain in the rear. Turns out Apache has a few options that allow you to customize how this index file is created. One of them, &lt;a href=&quot;http://httpd.apache.org/docs/2.2/mod/mod_autoindex.html#indexheadinsert&quot;&gt;IndexHeaderInsert&lt;/a&gt;, allows you to add HTML to the head section of the document. I added the following to my Apache httpd.conf file:

&lt;script src=&quot;https://gist.github.com/cfjedimaster/5051337.js&quot;&gt;&lt;/script&gt;

And the result was exactly what I needed:

&lt;img src=&quot;http://www.raymondcamden.com/images/iOS Simulator Screen shot Feb 27, 2013 2.16.28 PM.png&quot; /&gt;

Hope this helps!
				</description>
				
				
				<category>Mobile</category>
				
				<category>Development</category>
				
				<pubDate>Wed, 27 Feb 2013 14:12:00 -0400</pubDate>
				<guid>http://www.raymondcamden.com/index.cfm/2013/2/27/Quick-Tip--Make-Apaches-Directory-Indexes-look-nicer-on-mobile</guid>
				
				
			</item>
			
		 	
			</channel></rss>