Latest Entries »

I am looking to hire a ColdFusion developer, on site in Addison, TX.

[Mon-Friday 40 hours per week.]

What you’d be doing:

  • Designing, coding, and deploying web applications.
  • Maintaining existing web applications.
  • Basic understanding of HTML, CSS, and JavaScript required.
  • Preferred experience with Eclipse-based IDE (e.g., ColdFusion Builder).
  • Preferred experience with JavaScript framework such as jQuery.
  • Strong working knowledge of SQL required.
  • Preferred some experience with mobile development.

 

Salary depends on experience.

Please contact me if you are interested, or if you have any questions.

I am looking to hire a .NET (C#) developer (full time) at my company.

QUALIFICATIONS:
• Required Technical Skills

  • .NET 3.5
  • C#
  • XML
  • Proficiency in SQL
  • Service Based Development

• Desirable Technical Skills

  • WCF
  • WPF

• Required Non-Technical Skills

  • Bachelor degree in related field
  • Excellent verbal and written communication skills
  • Ability to interact professionally with executives, managers, and subject matter experts
  • Strong organizational skills
  • Strong problem solving skills

Please contact me if you are interested, or if you have any questions.

-Aaron

I am looking to hire a ColdFusion developer (full time) at my company.

-       3 to 5 years’ experience of object oriented ColdFusion development.

-       Experience with Mach-II a major plus.

-       Knowledge of n-tier architecture concepts.

-       Salary depends on experience.

 

Please contact me if you are interested, or if you have any questions.

-Aaron


 

Dave and I have decided to pull the plug on our server (very soon I might add).  This change is making one of my little side projects homeless.   I will have the site hosted, parked really, on a Google App Engine instance until I either find a full ColdFusion host for it, or find a way to make the functionality work within the confines of the GAE runtime environment.

Here is a blurb describing what Scriptalizer.com does (or did I guess):

What does it do?

Turn this…

<script type="text/javascript" src="/js/jquery/jquery.js"></script> <script type="text/javascript" src="/js/jquery/jquery.form.js"></script> <script type="text/javascript" src="/js/myOwnScriptFile.js"></script><link rel="stylesheet" href="/style/longstylesheet.css" type="text/css" /> <link rel="stylesheet" href="/style/anotherlongstylesheet.css" type="text/css" />

Into this…

<script type="text/javascript" src="/js/scriptalizer.js" ></script><link rel="stylesheet" href="/style/scriptalizer.css" type="text/css" />

What?! It minifies too?!??!

Yep, thats right. The combined javscript file is minfied. How bout them apples?

OMG IT COMPRESSES CSS?!!!!!!!!!11

Yes, calm down. The generated CSS file is compressed. It’s going to be ok…really.

 

If you have an idea where I could host this app, or if you’d like to offer some hosting yourself, please let me know!

First post at my new home

With the ever approaching demise of InstantSpot.com (read here for more info), I had to move the blog to a new home.  I briefly toyed around with blogger, but opted for a wordpress site (hosted at wordpress.com for now).

I hope to keep this blog relatively active, maybe less tech-centric as it was in the past.  I think the fact that this new blog isn’t aggregated by any of the tech feeds, I feel a little more freedom as far as content is concerned.

 

Lately I have been digging in to application development for the Google App Engine running Open BlueDragon.  I encountered a need to rewrite and filter some URL’s.

The software: UrlRewriteFilter  (go get it here)  I used the Beta 3.2 version.

The Installation: (borrowed in part from tuckey.org’s instructions)

  1. Move the urlrewrite.xml to the /war/WEB-INF directory.
  2. Move the urlrewrite-3.2.0.jar to the /war/WEB-INF/lib directory.
  3. Add the following to your /war/WEB-INF/web.xml.
            <filter>
               <filter-name>UrlRewriteFilter</filter-name>
               <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
            </filter>
            <filter-mapping>
               <filter-name>UrlRewriteFilter</filter-name>
               <url-pattern>/*</url-pattern>
            </filter-mapping>
            
  4. Add your own configuration to the /war/WEB-INF/urlrewrite.xml that was created.
  5. Re-deploy your Google App.

Examples:

     <!--Redirect one url-->
        <rule>
            <from>/some/old/page.html</from>
            <to type="redirect">/very/new/page.html</to>
        </rule>

  <!--  Redirect a directory -->
        <rule>
            <from>/some/olddir/(.*)</from>
            <to type="redirect">/very/newdir/$1</to>
        </rule>

   <!-- Clean a url -->
        <rule>
            <from>/products/([0-9]+)</from>
            <to>/products/index.jsp?product_id=$1</to>
        </rule>
   <!--
    eg, /products/1234 will be passed on to /products/index.jsp?product_id=1234 without the user noticing.
   -->
    <!-- Browser detection -->
        <rule>
            <condition name="user-agent">Mozilla/[1-4]</condition>
            <from>/some/page.html</from>
            <to>/some/page-for-old-browsers.html</to>
        </rule>

 

The future is now!

A little melodramatic maybe, but this technology is exciting.  Free cfml app servers with clustering (including data and file storage).

First, if you don’t know what the Google App Engine is yet, go here first and do a little reading.  Once you have read enough of that to be sufficiently excited, we need to set up the development and deployment tools.  Paul Kukiel has put together a really nice demo on how to do this hereNOTE THERE IS ONE THING THAT IS INCORRECT IN THE VIDEO Do not delete the “war” directory, merely paste the openbd war over the existing one.  This is important.

Next, reading and writing data with the Google datastore.

Storing data in a scalable web application can be tricky. A user could be interacting with any of dozens of web servers at a given time, and the user’s next request could go to a different web server than the one that handled the previous request. All web servers need to be interacting with data that is also spread out across dozens of machines, possibly in different locations around the world.

Thanks to Google App Engine, you don’t have to worry about any of that. App Engine’s infrastructure takes care of all of the distribution, replication and load balancing of data behind a simple API—and you get a powerful query engine and transactions as well.

Thanks to the fine people at Open BlueDragon, this task is made very very simple.  Every cfc in the openBD GAE inherits the following methods from component.cfc.  GoogleWrite(), GoogleRead(), and GoogleKey().

 

– Example object Status.cfc:

 

<cfcomponent displayname="Status" output="false">

	<cfproperty name="Message" displayname="Message" type="string" />
	<cfproperty name="DateTimeCreated" displayname="DateTimeCreated" type="date" />

	<cffunction name="init" access="public" output="false" returntype="Status">
		<cfreturn this/>
	</cffunction>

	<cffunction name="getMessage" access="public" output="false" returntype="string">
		<cfreturn this.Message />
	</cffunction>

	<cffunction name="setMessage" access="public" output="false" returntype="void">
		<cfargument name="Message" type="string" required="true" />
		<cfset this.Message = arguments.Message />
		<cfreturn />
	</cffunction>

	<cffunction name="getDateTimeCreated" access="public" output="false" returntype="date">
		<cfreturn this.DateTimeCreated />
	</cffunction>

	<cffunction name="setDateTimeCreated" access="public" output="false" returntype="void">
		<cfargument name="DateTimeCreated" type="date" required="true" />
		<cfset this.DateTimeCreated = arguments.DateTimeCreated />
		<cfreturn />
	</cffunction>

</cfcomponent>

 

 

– Writing data to the datastore:

 

<cfscript>
//saving a new Status to Google datastore
Status = createObject( "component", "model.Status" ).init();
Status.setMessage( "I love Google App Engine and OpenBD!" );
Status.setDateTimeCreated( Now() );

/*now all we do is call the googleWrite() method on our object, notice this returns the objects new google key*/
googleKey = Status.googleWrite();
</cfscript>

 

 

– Querying the datastore: for more on this visit the openBD wiki page on the datastore

 

<!---
notice dbtype="google" and the quasi-SQL 
--->
<cfquery dbtype="google" name="result">
Select from Status
</cfquery>

<!---
The result of this query, is an array of matching Status objects.  Not the usual query recordset.
--->

 

 

Securing your new web app with the UserServiceFactory (com.google.appengine.api.users.UserServiceFactory)

Once I figured this step out, it was almost embarassingly easy to secure a page, allowing access only to validated Google account holders.

 

<cfscript>
UserServiceFactory = CreateObject("java","com.google.appengine.api.users.UserServiceFactory");

User = UserServiceFactory.getUserService().getCurrentUser();

/*Here I am doing a test to see if there is a valid user object returned, aka "logged in".  At this time, I haven't found the ideal solution for this*/

isLoggedIn = false;

try{
   user.getEmail();
   isLoggedIn = true;
}
catch (any excpt){}

</cfscript>

<!---

building login/logut links

--->

<cfif NOT isLoggedIn>
YOU NEED TO <a href="<cfoutput>#UserServiceFactory.getUserService().createLoginURL(toString("http://#cgi.SERVER_NAME#"))#</cfoutput>">LOGIN</a>
<cfelse>
	<cfoutput>#request.user.getEmail()#</cfoutput>:  All your email are belong to us 
	<br />
	<a href="<cfoutput>#UserServiceFactory.getUserService().createLogoutURL(toString("http://#cgi.SERVER_NAME#"))#</cfoutput>">LOGOUT</a>
</cfif>

 

 

Time to build some real applications. Early indications from some experimentation by Dave Shuck, are revealing that the Mach-ii MVC framework along with the Coldspring IOC framework are working on the Google App Engine.

Other features, new or otherwise:

 

There is just no reason that we as cfml developers shouldn’t be churning out app after app on this platform.

 

One of my latest projects was to create a little contact manager / sales tool to integrate with an existing system (written in Mach-II).  Requirements dictated that I needed to have access to my already logged in user (must be aware of client session). “Down the road” requirements, are that we’d like to make an AIR port of this new feature as a standalone application. As a big fan of Flex, I thought it would be a great opportunity to test the efficacy of writing this new feature as a drop in Flex mini-application.

Since security is handled by the existing application,  we needed to make sure the functionality of this app respected the existing security guidelines.  The best way I could think of was also the easiest…just start calling events and see what happens.

Lucky for me, it all just worked.  So here are a few examples that might help get you started if you are working on the same sort of project.

 

On creationComplete I call a method named “init()” to get that user’s set of contact data:

 

private var myLoader:URLLoader;

public function init():void
{
	var myReq:URLRequest = new URLRequest('/index.cfm/event/GetContactData);
	myLoader = new URLLoader()
	myLoader.addEventListener(Event.COMPLETE, dataComplete);
	myLoader.load(myReq);
}

 

Important:  Notice the event listener I added to call the dataComplete method once the request was completed.

 

Once we have that initial set of data, all that is left is to start POSTing the create/edit/deletes the user is making to his contacts.

Here is an example of doing an HTTP POST request and passing my Contact object to a Mach-II event:

 

private function saveContact(Contact:ContactVO):void {
	var myHTTPService:HTTPService = new HTTPService;
	myHTTPService.method= "POST";
	myHTTPService.url = '/index.cfm/event/SaveContact';
	myHTTPService.addEventListener(ResultEvent.RESULT,function():void{init()});
	myHTTPService.send(Contact);
	Alert.show('Contact has been saved.');
}

 

Note:  Check out how we send the Contact object without doing anything tricky?  All of the properties of my ContactVO are available as event Args in my Mach-II listener.

 

Here is another example of doing an HTTP POST request, but passing individual variables:

 

private function submitNote(htmlText:String,plainText:String,Contact:ContactVO):void
{
	var myHTTPService:HTTPService = new HTTPService;
	var obj:Object = new Object();
	myHTTPService.method= "POST";
	myHTTPService.url = '/index.cfm/event/saveNote';
	obj['notetext'] = htmlText;
	obj['notepreview'] = plainText;
	obj['contactid'] = Contact.ContactId;
	myHTTPService.addEventListener(ResultEvent.RESULT,function():void{init()});
	myHTTPService.send(obj);
}

 

Note:  Notice how we create an object and define the properties we want to send, and then pass that new object in the POST.

 

Minor update to Scriptalizer.com today.  I added the option to include a comment block in the generated file.

/*************************** 
File generated by Scriptalizer.com
DateTime: Thursday, March 5, 2009 2:24:36 PM CST

File list:
	SpryData.js
	SpryEffects.js
	SpryXML.js
	xpath.js
*****************************/

 

As you can see, this will help you remember what files you “squished” together :)

FYI, saved over 100K on those Spry files.

Javascript Filesize summary:

  • Size before: 217.45 KB
  • Size after: 113.64 KB
  • 103.80KB SAVED!

 

 

Ubuntu – 4 GB Ram on 32 bit machine

I have a 32bit machine at work, that has 4 gigs of RAM.  In order to get my kernel to recognize the correct amount of RAM I have _ALWAYS_ customized and recompiled a new kernel, which obviously removed my ability to upgrade to the latest/greatest from the repositories.

Well, those days are over for me!  This week I rebuilt my machine, and opted to use Ubuntu 9.04 Alpha 4 (which by the way is very stable and awesome).  And since I had a fresh system, I wanted to look around and see if there was an easier way to handle my RAM challenge.

Look no further.  Just install the following packages and then reboot, its just that easy.

linux-server

linux-image-server

linux-headers-server

linux-restricted-modules-server (I actually had to do the one for my kernel linux-restricted-modules-2.6.28-7-server)

The result is a nicely set up, compiz enabled, Gnome environment, but with a whopping 4 gb of memory.

 

sudo apt-get install linux-server linux-image-server linux-headers-server linux-restricted-modules-2.6.28-7-server

#
# Here is the Mem section from running 'top'
#
Mem:   4040568k total,  3833644k used,   206924k free,    87580k buffers

 

Follow

Get every new post delivered to your Inbox.