<?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>Ryan Vikander&apos;s Development Blog</title>
			<link>http://blog.ryanvikander.com/index.cfm</link>
			<description>Development blog that may contain but not limited to entries about Coldfusion, Javascript, Flex, and life. Maybe a splash of video games as well.</description>
			<language>en-us</language>
			<pubDate>Sun, 20 May 2012 19:29:58 -0500</pubDate>
			<lastBuildDate>Wed, 28 Mar 2012 13:45:00 -0500</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>r.vikander@gmail.com</managingEditor>
			<webMaster>r.vikander@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>r.vikander@gmail.com</itunes:email>
				<itunes:name></itunes:name>
			</itunes:owner>
			
			<itunes:explicit>no</itunes:explicit>
			
			<item>
				<title>Returning Dynamic Content In A PhoneGap App</title>
				<link>http://blog.ryanvikander.com/index.cfm/2012/3/28/Returning-Dynamic-Content-In-A-PhoneGap-App</link>
				<description>
				
				This is probably known to many but I was looking into this for fellow co-workers and I figured I would blog it so I don&apos;t forget it in the future. PhoneGap is great at making an HTML page into an mobile application. The thing with HTML is, it&apos;s static. You can&apos;t do direct database calls on load. Here is a quick solution I have found that seems to work. If other&apos;s have found a better solution, please post it.

index.html
&lt;code&gt;
&lt;!doctype html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=1.0, user-scalable=no, width=device-width&quot; /&gt;
		&lt;title&gt;My App&lt;/title&gt;
		&lt;script src=&quot;phonegap.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
		&lt;script src=&quot;jquery.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
		
		&lt;script type=&quot;text/javascript&quot;&gt;
			jQuery(document).ready(function() {
				$.ajax({
					url:&quot;http://www.ryanvikander.com/test.cfc?method=getdata&quot;,
					success: function(data){
						var content = $(&quot;#content&quot;);
						
						content.html(data);
					},
					error: function(e){
						console.log(e);
					}
				});
			});
		&lt;/script&gt;

	&lt;/head&gt;
	&lt;body&gt;
 		&lt;div id=&quot;title_bar&quot;&gt;Test&lt;/div&gt;
		This is a test
		&lt;div id=&quot;content&quot;&gt;&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/code&gt;

So really all I am doing is making a call to a cfc on load that returns some content and then adds that content to a div. Pretty simple. 
				</description>
				
				<category>Coldfusion</category>
				
				<category>PhoneGap</category>
				
				<pubDate>Wed, 28 Mar 2012 13:45:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2012/3/28/Returning-Dynamic-Content-In-A-PhoneGap-App</guid>
				
				
			</item>
			
			<item>
				<title>A Little JavaScript Formatting</title>
				<link>http://blog.ryanvikander.com/index.cfm/2012/3/13/A-Little-JavaScript-Formatting</link>
				<description>
				
				So I am a stickler when it comes to code formatting. If I see this:

&lt;code&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	function demo(){
		var hello = &quot;world&quot;;
		var someNumber = 132;
		var anotherString = &quot;some string value&quot;;
    }
&lt;/script&gt;
&lt;/code&gt;

I cringe and tell you to clean up your code. Instead of doing that you can do this:

&lt;code&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	function demo(){
		var hello = &quot;world&quot;,
			someNumber = 132,
			anotherString = &quot;some string value&quot;;
	}
&lt;/script&gt;
&lt;/code&gt;

Also, in development putting them on new lines is great for readability. Coldfusion Builder by default wants to format them to one line. 
				</description>
				
				<category>Javascript</category>
				
				<pubDate>Tue, 13 Mar 2012 17:45:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2012/3/13/A-Little-JavaScript-Formatting</guid>
				
				
			</item>
			
			<item>
				<title>Want To Speak At cf.Objective()?</title>
				<link>http://blog.ryanvikander.com/index.cfm/2012/3/8/Want-To-Speak-At-cfObjective</link>
				<description>
				
				Want To Speak At cf.Objective? Well now you can! Sign up today for lightning talks and Bird of a Feather session and you too can speak! 

&lt;a href=&quot;http://www.cfobjective.com/news/call-for-lightning-talk-speakers-and-bof-survey-for-2012-now-open/&quot;&gt;Call for Lightning Talk Speakers and BoF Survey for 2012 Now Open&lt;/a&gt; 
				</description>
				
				<pubDate>Thu, 08 Mar 2012 13:28:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2012/3/8/Want-To-Speak-At-cfObjective</guid>
				
				
			</item>
			
			<item>
				<title>Using Twitter Authentication in an Application</title>
				<link>http://blog.ryanvikander.com/index.cfm/2011/11/3/Using-Twitter-Authentication-in-an-Application</link>
				<description>
				
				I will begin with a little back story. So I manage an internal User Group inside the company I work for (ImageTrend, INC). I proposed a challenge to the attendees to come up with a cool implementation of an app using the Twitter API.

Myself being the proposer I feel I am not eligible for the prize but wanted to take on the challenge just for fun. I found a good blog post by Mr. Ray Camden &lt;a href=&quot;http://www.coldfusionjedi.com/index.cfm/2010/9/7/Adding-support-for-automated-tweets-with-OAuth&quot;&gt;Adding support for automated tweets with OAuth&lt;/a&gt; that was very helpful getting started. I won&apos;t go into detail on setting up the Twitter Application on Twitter it&apos;s in his blog post. But it&apos;s kind of an older post and Twitter4j was released newer versions that do not work with his implementation in the blog. Scanning through the comments on the post, Sean Ryan had posted a blog entry with the updated details using the latest version of Twitter4j. Here is the &lt;a href=&quot;http://techblog.troywebconsulting.com/2011/09/authenticating-to-twitter-using-oauth-and-twitter4j-2-2x-api-with-coldfusion/&quot;&gt;post&lt;/a&gt;

Now to some code examples. Setting up the application cfc I added this code snippet to my onApplicationStart method:
&lt;code&gt;
var paths = [this.siteroot &amp; &quot;twitter4j/twitter4j-core-2.2.6-SNAPSHOT.jar&quot;];
		application.javaloader = createObject(&quot;component&quot;, &quot;javaloader.JavaLoader&quot;).init(paths);
		
		application.RequestAccessToken = &quot;Consumer Key From Twitter&quot;;
		application.RequestAccessSecret = &quot;Consumer Secret From Twitter&quot;;
		
		application.Twitter = application.javaloader.create(&quot;twitter4j.TwitterFactory&quot;).init().getInstance();
		application.Twitter.setOAuthConsumer(application.RequestAccessToken,application.RequestAccessSecret);
		
&lt;/code&gt;

My callback URL on Twitter is setup to call http://www.ryanvikander.com/twitter/twitterlogin.cfm?mode=1 I created a CFM page to handle the twitter login. This file looks like this:

&lt;code&gt;
&lt;cfset userInfo = application.userController.getTwitterCredentials(session.userid) /&gt;

&lt;cfif userInfo.recordCount EQ 0 AND NOT structKeyExists(url,&apos;mode&apos;)&gt;
	&lt;cfif NOT structKeyExists(session, &quot;RequestToken&quot;)&gt;
		&lt;cfset Session.RequestToken = application.Twitter.getOAuthRequestToken(application.twitterlogin)&gt;
	&lt;/cfif&gt;
	
    &lt;cfset Session.oAuthRequestToken = Session.RequestToken.getToken()&gt;
    &lt;cfset Session.oAuthRequestTokenSecret = Session.RequestToken.getTokenSecret()&gt;
    	
    &lt;cflocation url=&quot;#Session.RequestToken.getAuthorizationURL()#&quot; addtoken=&quot;No&quot;&gt;
&lt;cfelseif userInfo.recordCount GT 0&gt;
    &lt;cfset session.StoredAccessToken = userinfo.token&gt;
    &lt;cfset session.StoredAccessSecret = userinfo.secret&gt;
    	
    &lt;cflocation url=&quot;index.cfm&quot; addtoken=&quot;false&quot; /&gt;
&lt;cfelse&gt;
    &lt;cfset AccessToken = application.Twitter.getOAuthAccessToken(Session.RequestToken,url.oauth_verifier)&gt;
    &lt;cfset session.StoredAccessToken = AccessToken.getToken()&gt;
    &lt;cfset session.StoredAccessSecret = AccessToken.getTokenSecret()&gt;
    
	&lt;cfset application.userController.saveTwitterCredentials(session.userID,AccessToken.getTokenSecret(), AccessToken.getToken()) /&gt;

    &lt;cflocation url=&quot;index.cfm&quot;  addtoken=&quot;false&quot;/&gt;
&lt;/cfif&gt;
&lt;/code&gt;

Very similar to Ray&apos;s code for the one time authentication but I wanted to database the tokens that Twitter returned so in the else if I check to see if the user exists and I have stored their token if they do not exist I database the token and secret so they don&apos;t have to authorize the app every time.

Once this is complete you can do pretty much whatever is available from the &lt;a href=&quot;http://twitter4j.org/en/index.html&quot;&gt;Twitter4J&lt;/a&gt; class library.

I apoligize if this is a scattered post wanted to do a quick write up. If you have any questions/concerns I am more than willing to try and answer. 
				</description>
				
				<category>Twitter</category>
				
				<category>Coldfusion</category>
				
				<pubDate>Thu, 03 Nov 2011 14:13:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2011/11/3/Using-Twitter-Authentication-in-an-Application</guid>
				
				
			</item>
			
			<item>
				<title>cf.Objective 2011!</title>
				<link>http://blog.ryanvikander.com/index.cfm/2011/5/12/cfObjective-2011</link>
				<description>
				
				I was blessed to be able to attend cf.Objective() again this year. I will be posting my notes as I did last year. I hope to meet any of the people that read this blog. I will be the guy with the big beard. 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Thu, 12 May 2011 13:06:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2011/5/12/cfObjective-2011</guid>
				
				
			</item>
			
			<item>
				<title>Using Local SQL Server Express 2008 Server with Coldfusion</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/8/11/Using-Local-SQL-Server-Express-2008-Server-with-Coldfusion</link>
				<description>
				
				So I know there are a few articles out there on this subject but I seem to have to reinstall sql server on my laptops often and I always have to hunt down how to do it so I thought I would post a blog so it would be a bit more recent. 

I won&apos;t go over installing SQL Server Express, it takes a while seems like a good 30 minutes. Anyways, once you install it you can connect to your local database by connecting to the server (depending on what you named your server) [PC_Name]\SQLEXPRESS and depending on if you are using windows authentication you would enter your user name and password.

&lt;img src=&quot;http://www.ryanvikander.com/images/connect.jpg&quot; /&gt;

Ok so once you&apos;ve gotten that installed there are some more tricky stuff you need to do within SQL Server. First you will need to turn on TCP/IP which is located under Start &gt; Microsoft SQL Server 2008 &gt; Configuration Tools &gt; SQL Server Configuration Manager. Once you open up the manager go under: SQL Server Network Configuration and click on Protocols for SQLExpress (I assume this the name of the server). By default TCP/IP is disabled. So enable it by right clicking and enabling it. You will be prompted to restart your server service but I would wait until finished to do so. Now double-click TCP/IP or right click and go to Properties. Go into the IP Addresses tab and for each IPs enter in under TCP Port 1433. This allows for Coldfusion to connect to your database. Now you can apply and restart your server service. 

A tip if you skip that last step you will get this annoying error message and this is why I needed to post this:

Connection verification failed for data source: rvikander
java.sql.SQLNonTransientConnectionException: [Macromedia][SQLServer JDBC Driver]Error establishing socket to host and port: localhost:1433. Reason: Connection refused: connect
The root cause was that: java.sql.SQLNonTransientConnectionException: [Macromedia][SQLServer JDBC Driver]Error establishing socket to host and port: localhost:1433. Reason: Connection refused: connect

If anyone has any thoughts or questions I would love the comments. Otherwise I hope this helps someone. 
				</description>
				
				<category>Coldfusion</category>
				
				<category>SQL Server</category>
				
				<pubDate>Wed, 11 Aug 2010 18:38:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/8/11/Using-Local-SQL-Server-Express-2008-Server-with-Coldfusion</guid>
				
				
			</item>
			
			<item>
				<title>Modal Helper for ColdMVC</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/7/15/Modal-Helper-for-ColdMVC</link>
				<description>
				
				So during my spare time I have been working on a wedding site for myself and its written in a coworker&apos;s Coldfusion framework ColdMVC. Within learning the language I decided I was going to create my own custom helper for a modal window. I went with the jQuery modal library jQModal. The way I created the helper you can use whatever modal window library you want this is just one that I like. But anyways enough with that let&apos;s look at some code.

So a typical ColdMVC directory will look like this. Inside I have a Helpers folder. This folder is where you will put your CFCs that contain your helper functions. I do believe you can override the built in functions if they are the same name and function name? I am not positive but I can find out.

&lt;img src=&quot;http://www.ryanvikander.com/images/directory.jpg&quot; /&gt;

My modal CFC contains one function called display and this is where you would put your HTML to render your modal window. Since I went with jQModal I have had to add some certain classes that only pertain to that library. Your function might be different.

&lt;code&gt;&lt;cffunction name=&quot;Display&quot; returntype=&quot;any&quot;&gt;
		&lt;cfargument name=&quot;ID&quot; required=&quot;true&quot; /&gt;
		&lt;cfargument name=&quot;URL&quot; required=&quot;false&quot; default=&quot;&quot; /&gt;
		&lt;cfargument name=&quot;Content&quot; required=&quot;false&quot; default=&quot;&quot; /&gt;
		&lt;cfargument name=&quot;Label&quot; required=&quot;false&quot; default=&quot;&quot; /&gt;
		&lt;cfargument name=&quot;Title&quot; required=&quot;false&quot; default=&quot;Modal Window&quot; /&gt;
		&lt;cfargument name=&quot;Loading&quot; required=&quot;false&quot; default=&quot;&quot; /&gt;
		
		&lt;cfset var html = &quot;&quot; /&gt;
		
		&lt;cfsavecontent variable=&quot;html&quot;&gt;
			&lt;cfoutput&gt;
			&lt;script type=&quot;text/javascript&quot;&gt;
				$(document).ready(function() {
					$(&apos;###arguments.ID#&apos;).jqm({
							modal: true, 
							trigger: &apos;a.modal_link#arguments.ID#&apos;
							&lt;cfif arguments.URL NEQ &quot;&quot;&gt;
								,ajax: &apos;#arguments.URL#&apos;
								,ajaxText: &quot;#arguments.Loading#&quot;
							&lt;/cfif&gt;
					});
				});
			&lt;/script&gt;
			
			&lt;div id=&quot;#arguments.ID#&quot; class=&quot;jqmWindow&quot;&gt;
				&lt;div class=&quot;modal_title&quot;&gt;#arguments.title# &lt;div class=&quot;floatright text_right&quot;&gt;&lt;a href=&quot;##&quot; class=&quot;jqmClose&quot;&gt;Close&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
				&lt;div class=&quot;text_left&quot;&gt;
					&lt;div class=&quot;modal_content content&quot;&gt;
						#arguments.Content#
					&lt;/div&gt;
				&lt;/div&gt;
			&lt;/div&gt;
			&lt;a href=&quot;##&quot; class=&quot;modal_link#arguments.ID#&quot;&gt;#arguments.label#&lt;/a&gt;
			&lt;/cfoutput&gt;
		&lt;/cfsavecontent&gt;
		
		&lt;cfreturn html&gt;
	&lt;/cffunction&gt;
&lt;/code&gt;

The function itself accepts an ID which is required and must be unique. This is for the fact that if you want to have multiple modal windows on your page we need them to be unique. The URL argument is used if you are doing an AJAX call. This will do a refresh every time you make a call to the modal window. The content argument is used if you want to send in content to the window by using cfsavecontent and passing the variable to the function. The label argument is used for the link. This can be modified if you want to do something different to display for the user to trigger the modal window. Title is the title of the argument. By default the window will just say &quot;Modal Window&quot; this is incase I forgot to include a title of course you don&apos;t HAVE to have a title, but I like it. Loading is just some HTML that I display for the AJAX calls so the user just doesn&apos;t see a blank window.

So that&apos;s the function now how do we use it? Well there are two ways I use the modal window. Well there is two different ways you can use it. First is if you want to take some content and pass it to the modal window. Here is how I do that:

&lt;code&gt;
&lt;cfsavecontent variable=&quot;text&quot;&gt;
Hello World!
&lt;/cfsavecontent&gt;

&lt;cfoutput&gt;
#$.modal.display(label=&quot;Click Me&quot;, Content=text, id=&quot;displaycontent&quot;, title=&quot;How We Met&quot;)#
&lt;/cfoutput&gt;
&lt;/code&gt;

Now if you are not familiar with ColdMVC I suggest visiting: &lt;a href=&quot;http://bears-eat-beets.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Tony Nelson&apos;s blog&lt;/a&gt; and read up on some of his posts explaining the ins and outs on the framework. But just for this blog I will explain that $ replaces the helper scope inside ColdMVC so you don&apos;t have to type out helpers every time. That&apos;s one way I call the modal helper. The next way is by making an AJAX request. 

This way is a bit more trickier:

&lt;code&gt;
#$.modal.display(ID=&quot;loginWindow&quot;, URL=&quot;#linkTo({controller=&apos;wedding&apos;,action=&apos;loginform&apos;},&apos;currentView=#cgi.path_info#&apos;)#&quot;,label=&quot;Login&quot;, loading=&quot;&lt;div class=&apos;text_left&apos;&gt;Loading&lt;marquee style=&apos;width: 1.5em;&apos;&gt;.....&lt;/marquee&gt;&quot;)#
&lt;/code&gt;

The first thing I do is use the built in ColdMVC linkTo() function to link to my controller and pass the action of loginform. Again, ColdMVC is going to know how to use that and render the correct view. The only other thing different is I pass in some HTML for loading so I can display loading to the user while the page loads. *note my best use of the marquee tag ;)* And that&apos;s pretty much it. I have some custom css for displaying the modal window and it comes out looking like this:

Example of non AJAX modal:

&lt;img src=&quot;http://www.ryanvikander.com/images/demo1.jpg&quot; /&gt;

Example of AJAX modal:

&lt;img src=&quot;http://www.ryanvikander.com/images/demo2.jpg&quot; /&gt;

Note I am in no way the best designer. I am sure someone could design a better window. I am up for suggestions.

Also here is a link to the jQuery plugin I used &lt;a href=&quot;http://dev.iceburg.net/jquery/jqModal/&quot; target=&quot;_blank&quot;&gt;jQModal&lt;/a&gt; 
				</description>
				
				<category>Coldfusion</category>
				
				<category>ColdMVC</category>
				
				<pubDate>Thu, 15 Jul 2010 18:00:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/7/15/Modal-Helper-for-ColdMVC</guid>
				
				
			</item>
			
			<item>
				<title>Reverse Loop An Array of Structs</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/5/28/Reverse-Loop-An-Array-of-Structs</link>
				<description>
				
				So I was trying to figure out how to loop an array of structs backwards. I found ways to loop arrays backwards but it only worked with using the reverse() function and that only works on a list of strings. Something that I was aware of until recently cfloop has a step attribute. So really it just came down like this, pretty simple:

&lt;code&gt;
&lt;cfloop from=&quot;#ArrayLen(ArrayofStructs)#&quot; to=&quot;1&quot; index=&quot;i&quot; step=&quot;-1&quot;&gt;
 &lt;cfdump var=&quot;#ArrayofStructs[i]#&quot; abort=&quot;true&quot; /&gt;
&lt;/cfloop&gt; 

&lt;/code&gt;

This is probably well known, but I wanted a reference so I can use it again later. Hope this helps someone. 
				</description>
				
				<category>Coldfusion</category>
				
				<pubDate>Fri, 28 May 2010 11:21:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/5/28/Reverse-Loop-An-Array-of-Structs</guid>
				
				
			</item>
			
			<item>
				<title>Weird Coldfusion Error</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/5/17/Weird-Coldfusion-Error</link>
				<description>
				
				So a coworker found this out if you run this test page Coldfusion will return that the cfcatch is not a struct even though when you dump the variable it says that it is a struct. Also on the argument in the function if you put a type=&quot;struct&quot; Coldfusion will error out saying that it is not a struct. I have filed a bug here: &lt;a target=&quot;_new&quot; href=&quot;http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=82915&quot;&gt;Bug&lt;/a&gt; Also it turns out that it is not just a CF9 issue I have seen it as well in my local CF8 instance.

&lt;code&gt;
&lt;cffunction name=&quot;testFunction&quot; output=&quot;true&quot;&gt;
	&lt;cfargument name=&quot;exception&quot; required=&quot;true&quot;/&gt;
	&lt;cfdump var=&quot;#arguments.exception#&quot;&gt;
	&lt;cfdump var=&quot;#isStruct(arguments.exception)#&quot;&gt;
&lt;/cffunction&gt;

&lt;cftry&gt;
	&lt;cfthrow message=&quot;Help!!!!&quot; /&gt;
	
	&lt;cfcatch type=&quot;any&quot;&gt;
		&lt;cfset testFunction(exception=cfcatch) /&gt;
	&lt;/cfcatch&gt;
&lt;/cftry&gt;
&lt;/code&gt; 
				</description>
				
				<category>Coldfusion</category>
				
				<pubDate>Mon, 17 May 2010 18:12:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/5/17/Weird-Coldfusion-Error</guid>
				
				
			</item>
			
			<item>
				<title>cfObjective(): SQLite Database Development for AIR with Raymond Camden</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-SQLite-Database-Development-for-AIR-with-Raymond-Camden</link>
				<description>
				
				Ray did a good job at talking about SQLite and the basic information on SQLite. I have not used SQLite before and wasn&apos;t aware of some of it&apos;s functionality and it&apos;s limitations.

&lt;span xmlns=&apos;&apos;&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Features
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Typeless
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;You can enter characters into an integer field
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;What&apos;s Missing?
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Right outer join, full outer join
&lt;/li&gt;&lt;li&gt;When altering tables only rename table and add column
&lt;/li&gt;&lt;li&gt;Views are read only
&lt;/li&gt;&lt;li&gt;No grant/revoke
&lt;/li&gt;&lt;li&gt;No stored procedures
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;What&apos;s Missing in AIR?
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;FK Constraints
&lt;/li&gt;&lt;li&gt;SQLite_Version(), Match()
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;SQLite In AIR
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Support in both FLEX and HTML
&lt;/li&gt;&lt;li&gt;Actionscript API
&lt;/li&gt;&lt;li&gt;Connecting/Performing Questions/Table Analysis
&lt;/li&gt;&lt;li&gt;Synchonous and Asynchronous
&lt;/li&gt;&lt;li&gt;Encryption for &quot;Sensitive&quot; Data
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Getting Started
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Creating a DB
&lt;/li&gt;&lt;li&gt;SQLConnection.open()
&lt;/li&gt;&lt;li&gt;SQLConnection.openAsync()
&lt;/li&gt;&lt;li&gt;Any filename is valid (and any extension)
&lt;/li&gt;&lt;li&gt;In memory database are supported
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Creating Tables
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;With SQL!
&lt;/li&gt;&lt;li&gt;Create Table if not exists
&lt;/li&gt;&lt;li&gt;Can also copy a &quot;seed&quot; db
&lt;/li&gt;&lt;li&gt;Types: Integer, real, text, blob, null
&lt;/li&gt;&lt;li&gt;Typeless: you can put text in integer
&lt;/li&gt;&lt;li&gt;Column &quot;Affinities&quot; are used as hints
&lt;/li&gt;&lt;li&gt;Affinities: Text, Numeric, Integer, real, Boolean, Date, XML, XMLList, Object, None
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Performing Queries
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Uses SQLStatement class
&lt;/li&gt;&lt;li&gt;Speicfy SQL, Parameters, Connection, events
&lt;/li&gt;&lt;li&gt;Returns a SQLResult Class
&lt;/li&gt;&lt;li&gt;Contains Complete, data
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Parameters
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Performance, typing, security
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Named
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Values(:name, @rank)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Ordered
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Values (?, ?)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Error Handling
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Uses SQLErrorEvent Class
&lt;/li&gt;&lt;li&gt;Focus on:Connection issues, sql syntax, constraint errors
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Selecting With Class
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Select results can be bound to ActionSCript Classes
&lt;/li&gt;&lt;li&gt;Allows for Typed Results
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Transactions
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Gives much better performance for multiple inserts/updates
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Paged Results
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Allows you to paginate through large result sets
&lt;/li&gt;&lt;li&gt;Stmt.execute(n)
&lt;/li&gt;&lt;li&gt;Stmt.next(n)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Encryption
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Uses a key for connection
&lt;/li&gt;&lt;li&gt;Must be done at creation!
&lt;/li&gt;&lt;li&gt;Can&apos;t change your mind...
&lt;/li&gt;&lt;li&gt;Keys can be changed (reencryption())
&lt;/li&gt;&lt;li&gt;Encryptions keys are bytearray (16 bytes)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Schema
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Gives you access to tables, views, columns.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Tips
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Using a pre-populated DB
&lt;/li&gt;&lt;li&gt;Use On SQLSTatement per action
&lt;/li&gt;&lt;li&gt;LITA is your friend
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Air 2?
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;DB Transactions have save points
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt; 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Fri, 23 Apr 2010 17:17:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-SQLite-Database-Development-for-AIR-with-Raymond-Camden</guid>
				
				
			</item>
			
			<item>
				<title>cfObjective(): Common Sense Approach to Object Orientated Coldfusion, 2010 Ed. with Brian Meloche</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-Common-Sense-Approach-to-Object-Orientated-Coldfusion-2010-Ed-with-Brian-Meloche</link>
				<description>
				
				I was unsure of what to expect at this presentation. But I agreed with Brian on a lot of how Object Orientation in Coldfusion has become over complicated when developing Coldfusion is supposed to be simpler.

&lt;span xmlns=&apos;&apos;&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Pre-MX Coldfusion
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Though OO Coldfusion didn&apos;t become popular until components, you could do using custom tags since CF 4 with some issues, Remember Spectra?
&lt;/li&gt;&lt;li&gt;You&apos;d typically write CF apps old school. Procedurally
&lt;/li&gt;&lt;li&gt;Many CF developers still build apps this way today
&lt;/li&gt;&lt;li&gt;Many more still build procedural
&lt;/li&gt;&lt;li&gt;Before MX you started seeing procedural MVC promoted mostly within the FuseBox community
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Modern OO CF 
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Mach-ii was the first modern framework written for OO CF (2003)
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Soon
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Model-Glue
&lt;/li&gt;&lt;li&gt;Coldbox
&lt;/li&gt;&lt;li&gt;Fusebox
&lt;/li&gt;&lt;li&gt;Coldfusion on Wheels
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Controller/view Based
&lt;/li&gt;&lt;li&gt;Steeper learning curve
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;We need design patterns
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;As we started building model, we started seeing accepted ways to build model we need:
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Beans
&lt;/li&gt;&lt;li&gt;DAOs
&lt;/li&gt;&lt;li&gt;Gateways
&lt;/li&gt;&lt;li&gt;Services
&lt;/li&gt;&lt;li&gt;Value Objects
&lt;/li&gt;&lt;li&gt;Validators
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;As our apps got more complex, we needed more design patterns:
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Singletons
&lt;/li&gt;&lt;li&gt;Object factories
&lt;/li&gt;&lt;li&gt;Dependencey injection
&lt;/li&gt;&lt;li&gt;Inversion of control
&lt;/li&gt;&lt;li&gt;Coldspring, Lightwire
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;OO Coldfusion
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Coldspring both simplified code, and added additional complexities to learn
&lt;/li&gt;&lt;li&gt;Models grew...we need something to manage all this data
&lt;/li&gt;&lt;li&gt;ORM! Reactor, transfer
&lt;/li&gt;&lt;li&gt;That&apos;s not to say that you need these frameworks to develop OO CF; all are optional.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Modern OO CF - The Good and the bad
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Good:
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Modular code
&lt;/li&gt;&lt;li&gt;Separation of business logic, data &amp;amp; presentation
&lt;/li&gt;&lt;li&gt;Easier to maintain as apps grow
&lt;/li&gt;&lt;li&gt;Encapsulate logic
&lt;/li&gt;&lt;li&gt;Reduces the dependences
&lt;/li&gt;&lt;li&gt;Predictable way of building apps
&lt;/li&gt;&lt;li&gt;Code generates: illudium, IDEs to generate CFCs CAN* help speed up development
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Bad (in currently accepted OO CF Practices)
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Adds a pretty steep learning curve over old school CF
&lt;/li&gt;&lt;li&gt;Greatly increases the amount of code needed
&lt;/li&gt;&lt;li&gt;Takes longer to develop (even with shortcuts)
&lt;/li&gt;&lt;li&gt;One small change could require changes in for or five files
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Frameworks have:
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Performance issues
&lt;/li&gt;&lt;li&gt;Instantiation Times
&lt;/li&gt;&lt;li&gt;Memory Requirements
&lt;/li&gt;&lt;li&gt;Some or all of above
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Beware of code generators!
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Tables = objects (a table is not an object)
&lt;/li&gt;&lt;li&gt;Beware of anti-patterns!!! Can over complexify the model
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Lightfront, lightfront.riaforge.org
&lt;/div&gt; 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Fri, 23 Apr 2010 12:59:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-Common-Sense-Approach-to-Object-Orientated-Coldfusion-2010-Ed-with-Brian-Meloche</guid>
				
				
			</item>
			
			<item>
				<title>cfObjective(): Understanding Security In Adobe Air Apps with Jason Dean</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-Understanding-Security-In-Adobe-Air-Apps-with-Jason-Dean</link>
				<description>
				
				Jason Dean did a very good job on this presentation. It was VERY informational on AIR security. 

&lt;span xmlns=&apos;&apos;&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Is Air secure?
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Air is not a web application
&lt;/li&gt;&lt;li&gt;Security is the Developer&apos;s Responsibility
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;AIR is client-side
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;100% client-side
&lt;/li&gt;&lt;li&gt;Just like a web browser
&lt;/li&gt;&lt;li&gt;Traffic to server can be intercepted
&lt;/li&gt;&lt;li&gt;Even if over SSL
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Installation and Security
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Install screen cannot be modified
&lt;/li&gt;&lt;li&gt;Except for the certificate 
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Code-signing Certificate
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Applied through a company like Versign
&lt;/li&gt;&lt;li&gt;Proves that the developer is you
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Updating
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Ye, updating is a security concern
&lt;/li&gt;&lt;li&gt;Do NOT count on your users
&lt;/li&gt;&lt;li&gt;YOU need to push new security fixes / features
&lt;/li&gt;&lt;li&gt;Update notifications are required
&lt;/li&gt;&lt;li&gt;If you do nothing else in your first version, make sure your app is self updating.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;File System
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Has same permissions as the user logged in
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Any permission to the files the user has the AIR app has as well
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Developers should not use the file system that could harm the system.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;File System Best Practices
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Apply to reading and writing
&lt;/li&gt;&lt;li&gt;Do not allow Dynamic paths to be set
&lt;/li&gt;&lt;li&gt;Try to use user and app specific file storage
&lt;/li&gt;&lt;li&gt;The Static flash.fileSystem.File class has properties for system locations
&lt;/li&gt;&lt;li&gt;Sensitive data should be encrypted before placing on the file system
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Open Files in Default Application
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;AIR 2.0 offers the ability
&lt;/li&gt;&lt;li&gt;&lt;div&gt;It does limits the type
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Does not allow execute zip, terminal, app, automater, exe, url, cdm, bat, csh, com, lnk, pif, jar, and more
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Encrypted Local Store
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Alternative to storing data on the file system or in the db
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Uses the OS sore
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Keychain for OSX
&lt;/li&gt;&lt;li&gt;DPAPI for Windows
&lt;/li&gt;&lt;li&gt;Either KeyRIng or Kwallet for Linux
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Stores Binary data
&lt;/li&gt;&lt;li&gt;Persistent Storage but can be lost.
&lt;/li&gt;&lt;li&gt;Great for small bits of data (severe performances issues at 10mb)
&lt;/li&gt;&lt;li&gt;Per-user, per-application store
&lt;/li&gt;&lt;li&gt;Uses 128-bit AES/CBC Encryption
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;ELS StronglyBound
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Normally, ELS certification is bound only to publisher ID
&lt;/li&gt;&lt;li&gt;The stronglyBound property allows you to more strongly bind the ELS
&lt;/li&gt;&lt;li&gt;Binds to the bits of app as well
&lt;/li&gt;&lt;li&gt;If the app changes, then the ELS data will be inaccessible and need to be re-created
&lt;/li&gt;&lt;li&gt;This includes when the app is updated
&lt;/li&gt;&lt;li&gt;Really does not offer additional security
&lt;/li&gt;&lt;li&gt;Better off not using it
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Certificate Replacement
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Vulnerability in the ELS
&lt;/li&gt;&lt;li&gt;Installed app get replaced by a copy with a different publisher certificate
&lt;/li&gt;&lt;li&gt;All Data prior to replace is safe
&lt;/li&gt;&lt;li&gt;All data after replacement is threatened
&lt;/li&gt;&lt;li&gt;Difficult to perform this attack
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Native Processes
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;AIR app must be packaged as a native installer
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;DMG,EXE,RPM,DEB
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Extended Desktop profile
&lt;/li&gt;&lt;li&gt;Uses the same type of code-signing certificate
&lt;/li&gt;&lt;li&gt;ANY executable can be run
&lt;/li&gt;&lt;li&gt;BAT files are still prohibited on Windows
&lt;/li&gt;&lt;li&gt;Is any part of the dynamic statement from a third-party?
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;AIR has sandboxes
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Used to separate content
&lt;/li&gt;&lt;li&gt;Used to separate permissions that your application
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Application Sandbox
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Directory where the application is installed
&lt;/li&gt;&lt;li&gt;Allowed full access to the AIR API
&lt;/li&gt;&lt;li&gt;All subfolders and files too
&lt;/li&gt;&lt;li&gt;Restricted from loading JS files from remote locations
&lt;/li&gt;&lt;li&gt;Only files in the sandbox can use the local file system
&lt;/li&gt;&lt;li&gt;Restricted from using code that converts string into executable code
&lt;/li&gt;&lt;li&gt;Except while the page is loading.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Non-Application Sandboxes
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Flash Player Security Model/Browser Model
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Remote
&lt;/li&gt;&lt;li&gt;Local-trusted
&lt;/li&gt;&lt;li&gt;Local-with-network
&lt;/li&gt;&lt;li&gt;Local with filesystem
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Have NO access to the AIR API
&lt;/li&gt;&lt;li&gt;Can run code that turns string into executable code
&lt;/li&gt;&lt;li&gt;Some other minor restrictions to JS apply
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Code restrictions
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Application Sandbox
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Eval
&lt;/li&gt;&lt;li&gt;innerHTML
&lt;/li&gt;&lt;li&gt;Src Attrib
&lt;/li&gt;&lt;li&gt;Javascript:
&lt;/li&gt;&lt;li&gt;setTimeout
&lt;/li&gt;&lt;li&gt;setInterval
&lt;/li&gt;&lt;li&gt;Document.write
&lt;/li&gt;&lt;li&gt;XMLHTTPRequest (onload)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Non-Application Sandbox
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;AIR API
&lt;/li&gt;&lt;li&gt;XMLHTTPRquest???
&lt;/li&gt;&lt;li&gt;Window.Open()
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Avoiding Restriction Errors
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Map app content to a different sandbox
&lt;/li&gt;&lt;li&gt;Rewrite code to not use EVAL
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Rewrite code for setTImeout and setInterval
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Pass in a unanymous function into settimeout
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Rewrite JS URL syntax
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Sandbox Bridge
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;A path for one sandbox to access properties and methods from another
&lt;/li&gt;&lt;li&gt;Involves a parent and a child
&lt;/li&gt;&lt;li&gt;Works both ways
&lt;/li&gt;&lt;li&gt;Uses properties childSandboxBridge and parentSandBoxBridge
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Cross-Domain Requests
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Request to a domain other than the originator
&lt;/li&gt;&lt;li&gt;AIR Apps can run on the desktop, so any request to remote resources are corss-domain
&lt;/li&gt;&lt;li&gt;Flash and Flex require cross-domain.xml
&lt;/li&gt;&lt;li&gt;HTML/JS apps do not.
&lt;/li&gt;&lt;li&gt;Of course just like in the browser, traffic is viewable.
&lt;/li&gt;&lt;li&gt;SSL will only protect from eaves droppers.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Inter-Application Communication
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Two applications on the local machine to talk with each other
&lt;/li&gt;&lt;li&gt;With AIR appps can be done through localConnection class
&lt;/li&gt;&lt;li&gt;Allows communication between an AIR app and a SWF in browser
&lt;/li&gt;&lt;li&gt;Communications between two LocalConnections(same domain) is Secure
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Traffic between domains can be allowed using
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;AllowDoman()
&lt;/li&gt;&lt;li&gt;AllowInsecureDomain() (allows non-SSL)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;In AIR 2.0 communication between AIR app and native app can be done using Sokcets
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Local Database
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;AIR and SQLite Security
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;By default not secure
&lt;/li&gt;&lt;li&gt;Unless locked in a closet
&lt;/li&gt;&lt;li&gt;Susceptible to SQL Injection
&lt;/li&gt;&lt;li&gt;Unencrypted, over-writable, and accessible by other apps
&lt;/li&gt;&lt;li&gt;Other apps can read contents or even all.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Encrypted Database
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Prevent Snooping
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;AIR provides support for Encrypted SQLLite DBs
&lt;/li&gt;&lt;li&gt;Easy to do
&lt;/li&gt;&lt;li&gt;Strong Encryptions (AES-128)
&lt;/li&gt;&lt;li&gt;Keeps other apps from being able to open the DB
&lt;/li&gt;&lt;li&gt;Will NOT prevent them from deleting or copying the DB
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Using an Encrypted Database
&lt;/li&gt;&lt;li&gt;Encrypted DB Considerations
&lt;/li&gt;&lt;li&gt;Don&apos;t hard-code the encryption key
&lt;/li&gt;&lt;li&gt;Weak Password == Weak Key
&lt;/li&gt;&lt;li&gt;Data in memory is unencrypted
&lt;/li&gt;&lt;li&gt;Shared DBs mean shared DB key
&lt;/li&gt;&lt;li&gt;Keys can be stored in the ELS
&lt;/li&gt;&lt;li&gt;If the key is lost, so is the data
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Coldfusion AIR Offline Support
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Coldfusion 9 introduced
&lt;/li&gt;&lt;li&gt;AIR Sync with CF9
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;User Input Validation
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Validate everything
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Code Transparacy
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Everything can be seen
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Best Practices
&lt;/li&gt;&lt;li&gt;Sign your code
&lt;/li&gt;&lt;li&gt;Validate, validate, validate
&lt;/li&gt;&lt;li&gt;Understand sandboxes
&lt;/li&gt;&lt;li&gt;Enable self-updating
&lt;/li&gt;&lt;li&gt;Use the ELS and Encrypted DBs
&lt;/li&gt;&lt;li&gt;Think wisely about sandbox bridges
&lt;/li&gt;&lt;li&gt;XML signature validator
&lt;/li&gt;&lt;li&gt;Use the EncyrptionKeyGenerator
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Read the docs and try things out
&lt;/div&gt; 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Fri, 23 Apr 2010 12:32:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/4/23/cfObjective-Understanding-Security-In-Adobe-Air-Apps-with-Jason-Dean</guid>
				
				
			</item>
			
			<item>
				<title>cfObjective(): Speedy Websites: Through Better Front-End Optimization with Peter Farrell</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/4/23/Speedy-Websites-Through-Better-FrontEnd-Optimization-with-Peter-Farrell</link>
				<description>
				
				The first of the sessions I attended. This session I really liked. I have never really looked at the different rules that websites can break causing pages to be slower. This session was VERY informational and probably one of my favorites. Peter Farrell did a really good job with this session. And here is the notes. Also this is just a copy paste from OneNote so I apologize for the weird icons.

&lt;span xmlns=&apos;&apos;&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;80% of the time a page loads is spent on HTTP request.
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;20% is spent on back end requests like queries.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Tools
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Firebug
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Yslow
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Developer.yahoo.com/yslow
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Google Page speed
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Code.google.com/speed/page-speed
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;The 34 Rules
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;It&apos;s not wise to violate rules until you know how to observe them - T.S. Elliot
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Content RUles
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Minimize HTTP requests
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Reduce # of components on files
&lt;/li&gt;&lt;li&gt;Combine JS files into 1 file.
&lt;/li&gt;&lt;li&gt;For images use CSS sprites
&lt;/li&gt;&lt;li&gt;Imagemaps
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Reduce the # of DNS lookups
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;20-100 seconds to do a DNS lookup
&lt;/li&gt;&lt;li&gt;IE caches DNS lookups for 20 minutes.
&lt;/li&gt;&lt;li&gt;Firefox caches for 1 minute
&lt;/li&gt;&lt;li&gt;Too many hosts can penalize a page. Limit to 2-4 hosts per page.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Avoid Redirects
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Redirects are slow
&lt;/li&gt;&lt;li&gt;Browsers will NOT cache redirects
&lt;/li&gt;&lt;li&gt;Trailing /s can cause penalties.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Make AJAX cacheable
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Set expires header with cfhttpheader
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Post loading components instead of pre loading
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Drag and drop features could be post loaded
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Photo gallery
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Load first image instead of the rest.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Preloading
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Unconditional Preload
&lt;/li&gt;&lt;li&gt;Conditional Preload
&lt;/li&gt;&lt;li&gt;Anticipated Preload
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Reduce the # of DOM elements
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Split your components across domains
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Ex: static.google.com
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Minimize iframes
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;If iFrame stalls out, your page stalls out
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;No 404 errors
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Slows down user experience
&lt;/li&gt;&lt;li&gt;Send back light 404 error pages
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Server Rules
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;User a Content Delivery Network (CDN)
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Using a CDN improved Yahoos load time by 20%
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Add Expires or Cache-Control Header
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Turn expire headers on specific static stuff (images)
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Gzip Components
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Configure Etags
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Turn eTags on when serving one host
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Flush Buffer Early
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Use GET for Ajax Requests
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;POSTs are 2 step process
&lt;/li&gt;&lt;li&gt;IE only allows for URLs that are 2KB long
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Avoid Empty Image Src
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Browsers do weird things with blank src tags
&lt;/li&gt;&lt;li&gt;Makes request to the directory of current page
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Cookie Rule
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Reduce the size of cookie
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;When making a request all the cookies get sent
&lt;/li&gt;&lt;li&gt;*.mydomain.com = bad. Be mindful of domains
&lt;/li&gt;&lt;li&gt;Set expire date
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Use Cookie-free domains
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;CSS Rules
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Put stylesheets in the head
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Allows for the page to load progressively
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Avoid CSS expression
&lt;/li&gt;&lt;li&gt;Choose to use XML link over at import
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Avoid filters
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;_ filter hack
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Javascript Rules
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Put Javascript rules as far on the page as possible
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Make css and js external files
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Cacheable
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Minify external css and js files
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Minimize can be a 21% reduction
&lt;/li&gt;&lt;li&gt;Jasmine
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Remove duplicate script
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;IE will request a file if it finds a duplicate 
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Minimize the access to the DOM
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Image
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Optimize Images
&lt;/li&gt;&lt;li&gt;Use CSS Sprites
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Don&apos;t scale with HTML
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Create thumbnail
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Make your favicon small and cacheable
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Under 1 Kb
&lt;/li&gt;&lt;li&gt;&lt;div&gt;Set an expires header
&lt;/div&gt; 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Fri, 23 Apr 2010 12:07:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/4/23/Speedy-Websites-Through-Better-FrontEnd-Optimization-with-Peter-Farrell</guid>
				
				
			</item>
			
			<item>
				<title>cfObjective 2010</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/4/22/cfObjective-2010</link>
				<description>
				
				I am currently attending this great conference. I will probably post my notes on here that I take throughout the conference. 
				</description>
				
				<category>cfObjective</category>
				
				<pubDate>Thu, 22 Apr 2010 19:13:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/4/22/cfObjective-2010</guid>
				
				
			</item>
			
			<item>
				<title>Switching Back To CFEclipse From CFBuilder</title>
				<link>http://blog.ryanvikander.com/index.cfm/2010/3/24/Switching-Back-To-CFEclipse</link>
				<description>
				
				So I have been on the private beta of CFBuilder since it was Bolt when it first went to private testing and have loved most of it. I love the Extensions, the RDS is pretty cool, and being able to manage my servers inside the IDE is pretty slick. Although I have dealt with all the performance issues between each release I do have to say that I am in love with CFBuilder. Unfortunately what has killed most of my love for Builder is the price tag. $300 is a bit much for an IDE. Especially since there are a few really good ones that are free. Now you don&apos;t get as much of the cool stuff Builder offers, but it is pretty darn close. Also, $300 is fine when you are purchasing one license and that is it. As some people know I work at a pretty big Coldfusion shop. There are probably about 50 CF developers maybe. And at $300 bucks its a bit much. Event if they could do half off that is that is still $7,500 total. I don&apos;t know, it hurts me to switch off but I think I will live. 
				</description>
				
				<category>CFBuilder</category>
				
				<category>Coldfusion</category>
				
				<pubDate>Wed, 24 Mar 2010 19:33:00 -0500</pubDate>
				<guid>http://blog.ryanvikander.com/index.cfm/2010/3/24/Switching-Back-To-CFEclipse</guid>
				
				
			</item>
			</channel></rss>
