Tuesday, July 14, 2009

ColdFusion 9 - AIR SQLite Offline Support

In this Article, I will be explaining about the new feature, AIR Offline Support, introduced in ColdFusion 9. This Article will try to cover, most of the aspects of the feature with Code snippets to simplify the subject.

Now, before explaining this feature I would like to cover a few basic questions which user may have in mind.


Is this a client side feature or server side feature?


This is mainly a client side feature which could be used for Flex based AIR applications. Browser based Flex applications can not take advantage of this feature as it needs client side SQLite DB which is offered only by AIR platform.

Also, There are a few ColdFusion Interfaces defined on server side, which user need to comply with while writing their CFC having “Fecth” and “Sync” methods.


Why Offline Support in ColdFusion 9 where as AIR also provides it?


One may argue that AIR provides Offline SQLite DB support, then why ColdFusion 9 is redoing it? To clarify on this, ColdFusion 9 is not redoing it, but rather making it more simplified by introducing an ActionScript persistence framework which could help in taking all the complexities and pain away from user to deal with Client side DB/Tables/SQL Queries etc...


Why should I use Offline feature of ColdFusion 9 ?


By using the ActionScript persistence framework introduced in ColdFusion 9, user doesnt need to create the client side DB Schema, Tables and also user doesn’t need to write even a Single line of SQLite Query to store/update/retrieve data from Offline DB. Isn’t it simplified ?


How can ColdFusion 9 Offline feature do it without writing Queries?


This ActionScript Persistence Framework, comes with many Metadata tags to assist user in defining their client side classes which should be mapped with Client side DB. See the few basic Metadata tags information in the following table.

MetaData Tags

Purpose

[Entity]

Specifies that instances of this class can be persisted to the SQLite database. This element is
required.

[Table( name = "tableName")]

The name of the SQLite table in which the object is to be stored. Defaults to the name of the

class.

[Id]

Precedes a field definition. Indicates that the field is a primary key in the table. For composite

keys, use Id tags on all the primary key fields.

[Column(name="name",

columnDefinition="TEXT INTEGER

FLOAT BOOLEAN VARCHACHAR",

nullable = true false, unique = true false ) ] ),

Specifies the SQLite database column that contains data for this field.

name Column name. If not specified, defaults to the property name.

columnDefinition The SQL Datatype to use for the column.

nullable Specifies whether a field can have a null value.

unique Specifies whether the value for each field must be unique within the

column.


This framework also offers Relationship Metadata tags, like [OneToOne],[OneToMany],[ManyToMany],[JoinTable],[JoinColumn],[InverseJoinColumn] which are used to define relationships between the AS classes, which is also being followed while creating Offline tables for these classes. Refer ColdFusion9 AIR Offline Documentation for more information on these Relationship metadata tags.


Let’s have a look at a Simple AIR Offline Application Example ….


Given is the Screenshot of the Application. Application has mainly 2 sections, top section is used for performing the CRUD operations and Bottom datagrid panel provides user to view the local SQLite data for Customer and Address tables. Also it provides 2 buttons for Fetching data from server and Syncing local data changes back to server.







This Application demonstrates working of two Objects, Customer and Address, having One-To-One relationship.


It also demonstrates concepts of CASCADING, LAZY Loading, FETCHing and PERSISTing Server data on client side SQLite DB.


CONFLICT management is also one of the important concept for Offline applications, as user may be working in offline mode for a long time and when user tries to sync the data back to server it may happen that those datasets are already updated or deleted by other clients.


Also on server side it uses, newly introduced feature of ColdFusion 9, ORM, for Fetch() and Sync() methods. To get to know more on ORM feature of ColdFusion 9 refer the documentation.


How to setup this example as a project ?


Download this application from below link.






-->After extracting the ZIP file, put “AIRIntegration” folder directly under your ColdFusion 9 wwwroot


-->Create a DataSource called ‘AIROffline’ in CF Admin on “AIRIntegration\

ServerSideDB_AIROfflineExample.mdb” using MS Access with Unicode as driver.


--> Import ‘CFAIROfflineCustomerManagerApp.zip’ as Flex Project into your Flex Builder.


--> Once Imported you may need to change ‘cfair.swc’ path from Project->Properties-> Flex build Path -> Library path. Adding this SWC file into your library path is very important in order to use AIR Offline feature of Coldfusion 9. You may also want to change your compiler arguments to set the right path for services-config.xml file.

--> Change the SyncManager CF Server credentials in application, as per your CF Server IP/Port/ContextRoot.

Following above steps should be good to go for launching this Application.


Let’s have a look at Client Side ActionScript Classes…


I have explained the constructs of the class by providing inline comments, so read through it.


Customer.as


package onetoone

{

[Bindable]

// corresponding Server side class

[RemoteClass(alias="AIRIntegration.customer")]

// This tag is required to create a client side Table for Class

[Entity]

// Optional. If table name is not provided, class name will be

//considered as default name for creating table

[Table(name=”Customer”)]

public class Customer

{

//Define PK for Offline “Customer” table, “cid” will be PK

[Id]

public var cid:int;

public var name:String;

// Defines OneToOne relationship with Address class

[OneToOne(cascadeType='ALL',fetchType="EAGER")]

// Foreign Key Column which will be referring to Address table

// name="add_id" --> FK Column Name

// referencedColumnName="aid" --> Refers to the Address Table PK

[JoinColumn(name="add_id",referencedColumnName="aid")]

public var address:Address;

}

}


Address.as


package onetoone

{

[Bindable]

[RemoteClass(alias="AIRIntegration.address")]

[Entity]

public class Address

{

[Id]

public var aid:int;

public var street:String;

}

}


Corresponding Server side ORM CFCs ….


customer.cfc : This ORM Cutomer CFC has one-to-one relationship with Address CFC, as it can be observed in the 3rd cfproperty defined.



<cfcomponent persistent="true">

<cfproperty name="cid" fieldtype="id" >

<cfproperty name="name" >

<cfproperty name="address" fieldType='one-to-one' CFC="address" fkcolumn='aid' cascade='all' lazy="false">

</cfcomponent>



address.cfc: This ORM Address CFC has no references back to Cutomer CFC it being a one directional relationship. Although it’s quite possible to have bidirectional relationship.



<cfcomponent persistent="true">

<cfproperty name="aid" fieldtype="id" >

<cfproperty name="street" >

</cfcomponent>



cusManger.cfc: This is the Manger CFC which AIR Offline app client interacts with. This Manger CFC will have to implement “CFIDE.AIR.ISyncManger”. This interface has declaration for SYNC method. The SYNC Method in the following code handles CONFLICT management as well part from persisting client data changes to server. It Uses ORM Entity methods to perform the CRUD operations.


These CRUD operations could also be done using normal but that would be not so clean way of writing SYNC method. Because Query approach will require query records sets to get translated into Objects before sending data to AIR Offline app client. And also vice versa, each and every property of AIR Client Objects needs to be accessed for performing CRUD operations.


Also Notice the ORMGetSession().merge() methods in SYNC method usage before calling EntitySave() / EntityDelete() methods. You may see following kind of error message if you are using Old Style (cf8) Remoting with AIR Offline applications having server side "Sync" method using ORM EntitySave()/EntityDelete() methods.


Error handling message: flex.messaging.MessageException: Unable to invoke CFC - a different object with the same identifier value was already associatedwith the session: [address#1]. Root cause :org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated withthe session: [address#1]


You may also encounter this error with new style (cf9) Remoting also but only for EntityDelete method.

Same above solution will apply to resolve this issue.



<cfcomponent implements="CFIDE.AIR.ISyncManager">

<!----Fetch method--->

<cffunction name="fetch" returnType="Array" access="remote">

<cfset cus = ArrayNew(1)>

<!----This ORM Method will load all data from Server Customer table and send it to AIR client ---->

<cfset cus = EntityLoad("customer")>

<cfreturn cus>

</cffunction>

<!----SYNC method, Sync Client data with Server and also handles Conflicts--->

<cffunction name="sync" returntype="any">

<cfargument name="operations" type="array" required="true">

<cfargument name="clientobjects" type="array" required="true">

<cfargument name="originalobjects" type="array" required="false">

<cfset conclits = ArrayNew(1)>

<cfset conflictcount = 1>

<cfloop index="i" from="1" to="#ArrayLen( operations )#">

<cfset operation = operations[i]>

<cfset clientobject = clientobjects[i]>

<cfset originalobject = originalobjects[i]>

<cfif operation eq "INSERT">

<cfset obj = ORMGetSession().merge(clientobject)>

<cfset EntitySave(obj)>

<cfelseif listfindnocase("UPDATE,DELETE",operation) neq 0>

<cfif isinstanceOf(originalobject,"customer")>

<cfset serverobject = EntityLoadByPK("customer",originalobject.getcid())>

<cfelseif isinstanceOf(originalobject,"address")>

<!---Ignoring Address object, as it is casceded with Customer Object, so while saving Custoemr, Address will also be saved,

If not Ignored, then It will result in Conflict, incase Cutomer and Address CFC relationship has lazy=fasle.

--->

<cfcontinue>

<!---<cfset serverobject = EntityLoadByPK("address",originalobject.getaid())>

<cflog text="AddressID: #originalobject.getaid()#">--->

<cfelse>

<cfthrow message="Invalid Object">

</cfif>

<cfif not isdefined('serverobject') >

<cflog text="CONFLICT::SERVER OBJECT NOT FOUND, RECORD MAY BE DELETED ALREADY">

<cfset conflict = CreateObject("component","CFIDE.AIR.conflict")>

<cfset conflict.clientobject = clientobject>

<cfset conflict.originalobject = originalobject>

<cfset conflict.operation = operation>

<cfset conflicts[conflictcount++] = conflict>

<cfcontinue>

</cfif>

<cfset isNotConflict = ObjectEquals(originalobject, serverobject)>

<cfif isNotConflict>

<cfif operation eq "UPDATE">

<cfdump var="#clientobject#" output="C:\clientobject.txt">

<cfset obj = ORMGetSession().merge(clientobject)>

<cfset EntitySave(obj)>

<cfelseif operation eq "DELETE">

<cfset obj = ORMGetSession().merge(originalobject)>

<cfset EntityDelete(obj)>

</cfif>

<cfelse><!----Conflict--->

<cflog text = "is a conflict">

<cfset conflict = CreateObject("component","CFIDE.AIR.conflict")>

<cfset conflict.serverobject = serverobject>

<cfset conflict.clientobject = clientobject>

<cfset conflict.originalobject = originalobject>

<cfset conflict.operation = operation>

<cfset conflicts[conflictcount++] = conflict>

<cfcontinue>

</cfif>

</cfif>

</cfloop>

<cfif conflictcount gt 1>

<cfreturn conflicts>

</cfif>

</cffunction>

</cfcomponent>



What is the Flow Of the client side AIR Application ?


It is upto developer to decided on the Offline application workflow depending upon the application requirements. But I am trying to present here a general approach which may be suitable for a large number of offline applications.

As soon as this example application is launched, it will first try to connect to server by creating an instance of SyncManger, in order to fetch the server data. See the following code snippets with inline comments provided.


private function init():void

{

// Provide Credentials for Server side Connection and CFC

syncmanager = new SyncManager();

syncmanager.cfPort = 8501;

syncmanager.cfServer = "localhost";

// Path of the Server side CFC having Sync/Fetch method, relative from CF webroot

syncmanager.syncCFC = "AIRIntegration.cusManager";

// THis handler will be called when any COnflict occures while writing back changes on serverside

syncmanager.addEventListener(ConflictEvent.CONFLICT, conflictHandler);

// Fetch Server side DB data onto Client SQLite DB while starting the App itself

var token:AsyncToken= syncmanager.fetch("fetch");

token.addResponder(new mx.rpc.Responder(fetchSuccess, fetchFault));

}


Once Server connection is established successfully it fetches the data on client side and stores it on local clientside SQLite DB by creating a DB, if already not created.


private function fetchSuccess(event:SyncResultEvent):void

{

var cus:Array = event.result as Array;

cusColl = new ArrayCollection(cus);

// Open a Session for the client side SQLite DB, It will create a //DB with Name “onetonesync.db” under user directory

dbFile = File.userDirectory.resolvePath("onetoonesync.db");

/*

Providing a Unique interger number in openSession method is required in order to create a unique database session, in order to avoid conflicts with other Applications.

*/

var sessiontoken:SessionToken =syncmanager.openSession(dbFile,017915);

sessiontoken.addResponder(new mx.rpc.Responder(connectSuccess,connectFault));

}

private function connectSuccess(event:SessionResultEvent):void

{

session = event.sessionToken.session;

if(cusColl.length > 0)

{

// This operation will save/update fetched data into AIR SQLite DB

var savetoken:SessionToken = session.saveUpdateCache(cusColl);

savetoken.addResponder(new mx.rpc.Responder(saveCacheSuccess, savefault));

}

else

{

Alert.show("No data available from Server to save on local DB, Grid will be attempted to load with local DB Data if any available");

updateGrid();

}

}



So now, user has local data available to work with in offline mode. This data will be available even in case of server is unreachable or network outage.

User has all the liberty to perform CRUD operation by Adding new records, by Editing existing Records or by Deleting them.



// This Method will be used for Insert / Update operations

private function SaveLocal():void

{

cus = new Customer();

cus.cid = int(cusId.text);

cus.name = cusName.text;

add = new Address();

add.aid = int(AddId.text);

add.street = AddStreet.text;

cus.address = add;

/*

INSERT the new Records, this will be first saveed in client side SQLite DB, only on Commit operation this will be saved this new records in Server side DB. Notice that we are only saving Customer here, this operation will also save the binded Address Object also, as both the entities are CASCADED inside Customer Class

*/

var savetoken:SessionToken = session.saveUpdate(cus);

savetoken.addResponder(new mx.rpc.Responder(savesuccess, savefault));

}

// This Method will be used for Delete operations

private function DeleteLocal():void

{

cus = new Customer();

cus.cid = int(cusId.text);

cus.name = cusName.text;

add = new Address();

add.aid = int(AddId.text);

add.street = AddStreet.text;

cus.address = add;

var savetoken:SessionToken = session.remove(cus);

savetoken.addResponder(new mx.rpc.Responder(removeSuccess, removeFault));

}



At any point in time if user feels like getting fresh data from Server, he can do so by pressing the “Fetch Data Server” button. This operation will override the Updated/deleted data changes by user. Newly inserted records on local DB table will have no impact by Fetch data operation. So it makes sense to perform this operation while only when you changes are Synced with Server.


Once after performing the required data changes, user needs to write back this data on server. It can be done by performing “Commit” operation by pressing “Commit/Sync local data to Server” button.



private function commit():void

{

/*

So far, we have performed Insert/Update/Delete operation on Customer/Address entities on client side SQLite DB, Now let's send them to Server by performing COMMIT Operation

*/

var committoken:SessionToken = session.commit();

committoken.addResponder(new mx.rpc.Responder(commitSuccess, commitFault));

}



Now, while Syncing back data on Server, it may happen that user has stale data that he was working on OR User is updating a record that is already deleted from Server. In this case, Server CFC will throw back an array of Conflicts back to client, informing client about the latest server data copy. There will be a Conflict Event on client and eventually Conflict Handler will be called. Now, it is upto user to Accept / Ignore this Server changes. Incase, user wants to Accpets these changes he can do so as following.


One more Important aspect of Conflict handler that one need to know is, even incase of conflict, the Commit Success event will be fired. So, you will see that ConflictHandler as well as CommitSuccess Handlers both will be called. This happens because commit success event is fired when data changes from client reaches to server successfully. Now, this data gets written on server DB or not, it doesn’t wait for this. And hence, if there are conflicts here, we fire another Conflict event.



private function conflictHandler(event:ConflictEvent):void

{

Alert.show("conflict man!");

var conflicts:ArrayCollection = event.result as ArrayCollection;

// Accept Server data and write it to client side SQLite DB

var token:SessionToken = session.keepAllServerObjects(conflicts);

token.addResponder(new mx.rpc.Responder(conflictSuccess, conflictFault));

}



160 comments:

creole said...

Can JavaScript based AIR apps take advantage of this functionality?

Jayesh Viradiya said...

Nope. This Framework is availble only in Flex based AIR apps. you can log an Enhancement for this.

Cutter said...

So, you're saying that AIR's built-in support for JS to AS communication, and vice versa, would not be applicable in applying the AS persistence libraries to an HTML/JS based AIR application? Could a developer create a 1 x 1 pixel Flex app, then utilize the JS Flex Bridge?

Jayesh Viradiya said...

Nice question....I have never tried this...but I would encourage you to try out this feature by using JS Flex bridge by creating a 1 X 1 pixel app.

avi said...

hi!!!
I want to make a desktop application using Adobe AIR1.5 & Flex Builder3.In that,I want to play videos(.swf format)in video player.I want to make it a completely offline application.Can u tell me how can I store video files(around 50) in database(in encrypted form) and play them in video player.....

Plz help me !!!!!!!!!!

Jayesh Viradiya said...

I think you are looking a pure SQLite + AIR based solution, where as my Article is on AIR Offline support in ColdFusion, but nevertheless, AIR 1.5 provides support to encrypt the client side SQLite DBs to make them secure, so you can store your videos in the DB and amke DB encrypted. This Adobe Devnet article should help you on that.

http://www.adobe.com/devnet/air/flex/quickstart/encrypted_database.html

There are may Flex custom video tags available which are based on <mx:VideoDisaply> Flex component. You could explore any of those to implement the Playing prt of the functionality.

Tom said...

Thank you very much for this post. I think it may be the only post online regarding this subject matter with hand holding explanations and code samples.

Only suggestion would be make it cross OS friendly and use a mySQL db.

I have found lots of blogs talking about it, but none that show/explain any code. Again, thank you; nice job.


Cheers!

aadams said...

As others have said, THANKS for the excellent job! This is a very exciting feature, which brings many new possibilities.

I've found maybe 2-3 other sites/blogs talking about this new feature set. Unfortunately they all use your example (not that your example is bad, it just doesn't give much of a variety to learn from), especially if you have more than two simple tables with a simple one-to-one relationship.

Is there anyone else attempting this? Can't just be me....

Dizzot said...

Awesome tutorial, its helped me a ton. I have two questions, is there an auto-increment feature that I can add as metadata tag? And when doing the session.load(class, object) function, I can't get it to work without passing the id with the object. How can I load without the id? For example I have a user table with userid email password, how can I pass an object with just the email and password and have it load from the sqlite database?

Anonymous said...

Do you know if CF Air offline supports encrypted database?

one stop flowers said...

Good site! I really love how it is easy on my eyes and the data are well written. I'm wondering how I might be notified whenever a new post has been made. I have subscribed to your RSS which must do the trick! Have a nice day!

Regards
cheap flowers
cheap flowers usa
flowers from uk to usa
send flowers from uk to usa

ruffy401 said...

This is a great content, I’m so glad that I’ve found this high quality blog! carpet cleaning carlton

ridsfhfhfhdfhh said...

nice post . liked it
cheap flowers

carpetcleaningau12 said...

Pretty nice post. I just stumbled upon your weblog and wished to say that I have truly enjoyed browsing your blog posts. After all I will be subscribing to your feed and I hope you write again soon! carpet cleaning sunnybank hill

buy facebook fans said...

Good write-up, I’m normal visitor of one’s blog, maintain up the excellent operate, and It is going to be a regular visitor for a long time. “There is a time for departure even when there’s no certain place to go.” by Tennessee Williams….
Regards
buy facebook fans

one stop flowers said...

good article . I just stumbled upon your blog and wanted to say that I have truly enjoyed browsing your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon!

Regards

cheap flowers usa

Admin said...

Awesome blog! I will for sure drop by it more often!

Google Local Map Optimization

Kyle Grando said...

Great posting dear, Have you written any other articles on this topic? Thanks for the sharing.

houston hotel

abbottaric said...

otterbox iphone 4s

mastifron said...

After the fun. I'm working on doing very impressed and grateful. Thank you for sharing. Enjoy this issue. Please share me more if you have...thanks!!!
Thank you. .
otterbox iphone 4

harveststuff said...

THANKS for the excellent job! This is a very exciting feature, which brings many new possibilities. wisdom teeth extraction

Alex Keaton said...

Truly a nice work! Greatest post I have ever seen! Thank you for sharing it! Have a good day!
The Kettlebell Shop is Australias premier online supplier of quality Kettlebells at great prices. $20 flat fee delivery to major cities!! We deliver Australia wide.
More info please visit at our website:http://www.thekettlebellshop.com.au./

mike said...

correctional healthcare companies
corrections officer jobs
curb ramp
hinckley finlayson high school
bexar county property search
nevada department of corrections inmate search
georgia dept of corrections inmate search
historical markers
mo inmate search
interstate towing
new york department of corrections inmate search
illinois dui laws
insurance fraud investigator jobs
naumann hobbs
az mugshots
hernando county arrests
sr22 texas
traffic i 95
offenders search
texas dwi
racine inmate search

best said...

Awesome blog! I will for sure drop by it more often! state laws

best said...

I am really glad that I came across with your site. I learned a lot just by reading thoughtful comments of your guys. kitchen bar stools

bennet said...

I just stumbled upon your blog and wanted to say that I have truly enjoyed browsing your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon! Chase collection agency

Nohan21 said...

After the fun. I'm working on doing very impressed and grateful. Thank you for sharing.Enjoy this issue.You can visit my photography backdrops and please share me more if you have...thanks!!!

Pakistan Business Directory Store said...

I found your website perfect for my needs. It contains wonderful and helpful posts.I have read most of them and got a lot from them. To me, you are doing the great work. Carry on this. work at home In the end, I would like to thank you for making such a nice website Pakistan Business Directory Store

abbottaric said...

This is a very nice post.
I am glad i came here to read it and enjoyed it.
Your sites theme is also very cool.
adt pricing
Thank you for sharing.

CCC said...

Dallas credit repair and save money. Your credit score largely determines the lenders available and the interest rate at which they will lend. Fix credit and expand the number of lenders willing to compete for your loan.

Sam said...

Nice way of explaining this subject, this line of content is very interesting. Great article, thanks for sharing, keep up the good work! création entreprise offshore

bennet said...

Thank you for posting I learn more about this apps Vancouver mortgage loans & rates

ksbcl33 said...

I definitely enjoyed every little bit of it, I have you bookmarked to check out all the new stuff you post.Plagiarism Software

breakinglolz said...

Nice post. I was actually supposed to meet with our accountant but had to postpone since I don’t have all of our
documents organized yet. Meaning, I’m not sure if we have everything to take to the accountant yet. I’m usually pretty
good about this, but the last few months have been hectic. I hope I am able to file my return on time. funny news
funny news stories

Unknown said...

People can see your article is very popular , strong feelings after reading it , from your article, you can get a lot of interesting and useful knowledge of the living. Look forward to your updates. party hire melbourne

Admin said...

Excellent site, keep up the good work my colleagues would love this. Cafe Logo

llarson said...

Interesting topic what you have shared with us. Your writing skill is really very appreciative. afslanken zonder dieet

erlamsaz said...

Useful information ..I am very happy to read this article..thanks for giving us this useful information. Fantastic walk-through. I appreciate this post.
forklift repairs

mastifron said...

He is a great informative post .. reaally necessary for me today, if you have more information and please share Thank you for sharing with ...
silicone tape

top10credit101 said...

Can JavaScript based AIR apps take advantage of this functionality? Celtic Tungsten Rings

Dan Kennedy said...

Wonderful blog! Do you have any helpful hints for aspiring writers? I’m hoping to start my own website soon but I’m a little lost on everything. Would you suggest starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m completely overwhelmed .. Any tips? Bless you!
Dan Kennedy

Hafizur Rahman said...

Thanks for this post, I am a big big fan of this internet site would like to go along updated.
aannemer
aannemersbedrijf
bouwbedrijf
verbouwen
renovatie
kosten uitbouw
kosten verbouwing

Sam said...

Thank you for all your efforts that you have put in this. Very interesting info.
société en chine

Donna Christensen said...

Thank You Admin for such a Great Post. We the biggest picasso face painter and face painter VA and face painter Hampton Roads serving in the Virginia Area. We Offer Face Painting, Belly Bumps, Glitter Tattoo and Theatrical Makeup with Reasonable Prices.
Thank You Admin for such a Great Post. We the biggest face painter Williamsburg and face painter Chesapeake serving in the Virginia Area. We Offer Face Painting, Belly Bumps, Glitter Tattoo and Theatrical Makeup with Reasonable Prices.
Thank You Admin for such a Great Post. We the biggest face painter and body painter serving in the Virginia Area. We Offer Face Painting, Belly Bumps, virginia face painter serving in the Virginia Area. We Offer glitter tattoo and theatrical makeup with Reasonable Prices.

Solinteg Groupe Conseil said...

Thanks for the Great Post. Groupe Conseil Solinteg can support -

office 365 , ms office 365 , cloud services , ms cloud services , sharepoint online , ms sharepoint online , exchange online , ms exchange online , lync online , ms lync online , cloud services montreal , infonuagique montreal , microsoft crm montreal , microsoft crm montreal , windows intune , microsoft product montreal

and many more services and product from Microsoft Corporation. Thanks.

golf stayz said...

Your article is extremely impressive. I never considered that it was feasible to
accomplish something like that until after I looked over your post .

Gold Coast golf
Gold Coast golf holidays
Sunshine Coast golf
Sunshine Coast golf holidays
Group golf holidays
Australian golfing holidays
Discount golf
Golf trips

Craig Chilvers said...

I just wanted to leave a comment to say that I enjoy your blog. Looking at the number of comments, I see others feel the same way! Congratulations on a very popular blog.

Car finance quote

Jade said...

My opinion about information is that without it I would never learn anything. Your article teaches the reader to think about the content. Thank you.roti specialist spijkenisse

jakelim41 said...

I enjoy a lot of good data. I really am impressed with your content and I feel I have learned something by reading this article.
Temporary Mobile Housing

erlamsaz said...

I really enjoy simply reading all of your weblogs.
Simply wanted to inform you that you have people like me who appreciate your work.
Halo

from russia said...

Very nice post. I just stumbled upon your blog and wished to say that I’ve truly enjoyed surfing around your blog posts. After all I’ll be subscribing to your rss feed and I hope you write again very soon!
russian gift
matryoshka
nesting doll
russian dolls

Jim48 said...

Nice post.Thank you for taking the time to publish this information very useful!I’m still waiting for some interesting thoughts from your side in your next post thanks.

best said...

I have never tried this...but I would encourage you to try out this feature by using JS Flex bridge by creating a 1 X 1 pixel app. sexo xxx

abbottaric said...

good article . I just stumbled upon your blog and wanted to say that I have truly enjoyed browsing your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon!
skip hire london

jeorge said...

For the best services you need about plumber click here 24 hour plumber sydney.

mastifron said...

Read your post. We have a lot of information to read this topic. For me, my great knowledge of what really matters ... offer thanks for sharing, your guidance.
dallas home security

jeorge said...

Thanks for another amazing article. SEO Fort Collins

jeorge said...

Info is really fascinating and truly is comment worthy. I’ll see if I can try to use some of this info for my personal blog.Click Here Celtic Tungsten Rings

Kristian Peter said...

Great inof... thanks for the effort in explaining all of this!
All Seasons air conditioning hire, the widest and most flexible choice for portable air conditioning. Our air conditioning hire fleet is one of the largest modern and reliable in the industry.
Please More info visit at our website: http://www.allseasonshire.eu/air-conditioning/

Lip Communication said...

I read your post carefully, have a mind blowing information. It is a great article. If you're trying to improve something in advance, send us an email.
Thank you... Rebrand iphone apps

Lip Communication said...

I would like to thank you for the efforts you have made in writing this post.
I am hoping the same best work from you in the future as well.
Thanks for sharing me!!lizard classifieds

hardyrady said...

Thanks for this great article! It has been very insightful.
I have seen a lot of blogs but i really like the layout of yours I wish that you will continue posting your knowledge
with us.
thanks...
Rebrand Smartphone apps

Lip Communication said...

Really is it beautiful. The author of this site very hard work, is completely this website useful information really I read... Thanks for sharing with me.King Snake Breeder

Kama Life Styles said...

Thanks for the nice post. This is a Nice Blog. Do you know.. How To Be More Confident A number of men need tips and advice on how to be more confident with women. Women adore confident men who believe in their own abilities and themselves. Kama Lifestyles dating coaching specialises in teaching men how to be confident.It doesn’t depend on personal traits and characteristics, but can be learned by anyone. It does, however, take some work to turn negative thoughts and behaviours into something positive, and no one can do the work but the man who needs to change his attitude.

jeorge said...

I'm working on doing very impressed and grateful. Thank you for sharing. Enjoy this issue. Please share me more if you have...thanks!!!eten bestellen

Shahed Hossain said...

Pretty insightful publish. Never believed that it was this simple after all. I had spent a good deal of my time looking for someone to explain this subject clearly and you’re the only one that ever did that. Keep it upI found it very interesting and enjoyed reading all of it. FC Barcelona tickets affordable seo service
seo company Miami
miami seo company

jhon jaha said...

I am very thankful to share this post.. I hope you have more information about this post.. So, Please share me.. Thanks..resell mobile apps

Mark Steban said...

This is my first time to visit and your site and I don't know what to say but one things for sure you will doing a great job so far. Vancouver debt consolidation

Kristian Peter said...

Great inof... thanks for the effort in explaining all of this!
All Seasons air conditioning hire, the widest and most flexible choice for portable air conditioning. Our air conditioning hire fleet is one of the largest modern and reliable in the industry.
Please More info visit at our website: http://www.allseasonshire.eu/air-conditioning/

kuku fashion australia said...

WOW!, Thanks for the nice Blog. This is really Fantastic. Enjoy online fashion shopping with us! We are- Kuku fashion Australia, with Kuku, Kuku dress, kuku dresses, Kuku fashion, Mad Love stockist, mad love fashion, Toi et Moi online, Toi et Moi jacket. Thanks for staying with us.

Xcamey Md shya said...

At Glitterazzi we specialize in only temporary glitter tattoos.
Since our artists focus only on learning to paint on the best glitter tattoos,
their face painting and body art is superior.
Our artists each learn how to make sure everything is done to make the client sparkle.
Each client gets a new stencil and all brushes are cleaned before each use.

jhon jaha said...

Great post! It is really some pleasant and useful information. I just anywhere useful with information about me shared with nice. Please, keep me like this. Thanks for sharing thank you.
african checkbook cover

jeorge said...

I have never seen such good content online before. You have really earned my deepest respect. I have shared this with my friends because it deserves to be seen. You are truly a good writer.online eten bestellen

llarson said...

I have seen a lot of blogs but i really like the layout of yours I wish that you will continue posting your knowledge with us! Visit my great adelaide plumbers site.

Admin said...
This comment has been removed by the author.
Admin said...

A very usefull article – A big thank you I wish you dont mind me writting about this post on my website I will also leave a linkback Thank you. Facebook Timeline

golf stayz said...

Very interesting discussion glad that I came across such informative post. Keep up the good work friend. Glad to be part of your net community.

Gold coast golf

james said...

You will truly enjoy our unique yet manly Celtic design in our Cool Celtic Tungsten Rings site.

ottawamortgages said...

I had really liked reading this site it was very good. The content of this blog was very nice. Ottawa mortgage loans & rates

jeorge said...

Thank you for this apps!!! This is a very exciting feature, which brings many new possibilities. miljonairs model

Admin said...

Another enjoyable post to read.......thanks for sharing. BlackBerry Applications

SteveBrad said...

I am very glad to see such information; resources like the one you mentioned here will be very useful to us. This is very nice one and gives in-depth information.
Buy Generic Viagra

abbottaric said...

Another great information ... I need to really day for me and the youth ... If you have more information, please share me ... Thank you for sharing I. ..
women accessories atlanta

asif ifteakhar said...

Thank you for the great article I did enjoyed reading it, I will be sure to
bookmark your blog and definitely will come back from again.
I want to encourage that you continue your great job, have a good day

north london business oppotunities
london business group

Sydney said...

Great post, I conceive blog owners should learn a lot from this website its really user genial. So much fantastic information on here at my miljonairs model casper camps site.

jeorge said...

This design is wicked! You definitely know how to keep a reader entertained. Between your wit and your videos, I was almost moved to start my own blog.

jeorge said...

Really enjoyed this article, can I set it up so I receive an email sent to me whenever there is a new post? fort collins carpet cleaning

premiumflag banners said...

Nice article you got here. It would be great to read more about this theme. The only thing it would also be great to see on this blog is some pictures of any gizmos.

feather flag
flag banner
custom flag banners

asif ifteakhar said...

Thank you for the great article I did enjoyed reading it, I will be sure to
bookmark your blog and definitely will come back from again.
I want to encourage that you continue your great job, have a good day

north london business oppotunities
london business group
london nwtworking groups
london business networking

annaharris said...

Good Explanations. I had tried it in ColdFusion 10 but it's not working in it. Can it work on ColdFusion 10?

Sydney said...

Thank you very much for this post. I think it may be the only post online regarding this subject matter with hand holding explanations and code samples.eten bestellen rotterdam

jeorge said...

Many of them are rife with spelling problems and I to find it very troublesome to tell the truth on the other hand I’ll surely come back again.Cache County Jail

how to remove grease said...

Nice blog. Try to know how to remove grease and how to clean oil spills va to keep the environment clean. Thanks- fix engine oil leaks

allenrobles1 said...

I am not sure where you're getting your info, but good topic. I needs to spend some time learning more or understanding more. Thanks for wonderful information I was looking for this info for my mission.hotel in koh samui

countyjail said...

The size of the American prison population and the effects and expenses of incarceration are out of control. We are headed for trouble as a nation without major criminal justice and prison reform.

Manatee County Jail

DexSmart Matt said...
This comment has been removed by the author.
joana lui said...

It is great to observe somebody put enough craze towards a matter. I'm thankful that I stumbled upon this process. I am lucky I used the time to read on past the 1st paragraph. You have got a whole lot to say, very much to offer. I really hope guys understand this and look into your page.

safety deposit box
bank safety deposit boxes
mailbox post
residential mailboxes
gold bar for sale

Chris said...

It’s really a nice and helpful piece of information. I’m glad that you shared this helpful info with us. Please keep us informed like this. Thanks for sharing.

weekly survey setup

Boris kreiman said...

I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading what you all have to say


real estate law
how to buy a house
first time home buyer programs

Boris kreiman said...

I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading what you all have to say


real estate law
how to buy a house
first time home buyer programs

loanmodifications said...

Loan modification programs have been created to help the borrower keep their home during tough financial times.

california loan modification

golf stayz said...

Your article is extremely impressive. I never considered that it was feasible to
accomplish something like that until after I looked over your post .

فروشگاه کتاب
فروش کتاب
خرید کتاب
خرید اینترنتی کتاب
فروش اینترنتی کتاب
خرید کتاب اینترنتی
فروشگاه اینترنتی کتاب
فروش کتاب اینترنتی

DexSmart Matt said...

Nice post. It would be great to read more about this theme .

safe investment
forex investment
managed accounts
forex managed account
managed account
forex managed
pamm account
instaforex

Nagib Mehfuj said...

Another fantastic post upon running a blog! Many thanks therefore a lot to take time to share a person information and wisdom along with other writers.

web hosting
server

Nagib Mehfuj said...

Another fantastic post upon running a blog! Many thanks therefore a lot to take time to share a person information and wisdom along with other writers.

web hosting
server

dressupfor charity said...

Good site! I really love how it is easy on my eyes and the data are well written. I'm wondering how I might be notified whenever a new post has been made. I have subscribed to your RSS which must do the trick! Have a nice. dress up games girls
dress up for girls
fashion games

dressupfor charity said...

Good site! I really love how it is easy on my eyes and the data are well written. I'm wondering how I might be notified whenever a new post has been made. I have subscribed to your RSS which must do the trick! Have a nice. dress up games girls
dress up for girls
fashion games

nutrendmedia said...

Great, I really appreciate you for sharing this article here, thanks for the good insight here..

plumber brighton le sands

oil change coupons said...

I am very impressed with your views and interesting content. I hope you intend to continue writing more informational articles.
oil change coupons

loanmodifications said...

Struggling borrowers looking for help with a mortgage loan modification program may be confused about what type of program they may qualify for.

loan modification program

maryjohin said...

welcome to our shop,Our shop sells a lot of brands.There have hollister co, Hollister Madrid and UGG Outlet, Uggs Rea, Ugg Boots Sale.

Franklin Marshall Nederland,Franklin Marshall Outlet,Franklin Marshall Heren,Franklin Marshall Tassen,Franklin Marshall Vrouwen.
Franklin Marshall Sudaderas,Franklin Marshall Jackets,Franklin Marshall Falsas,El descuento más bajo, directos de fábrica, garantía de calidad !
ralph lauren outlet,ralph lauren uk,ralph lauren outlet UK sale ralph lauren Tees,Shirts,Jackets,Coats,Hoody,Polo, save 55% Off!
Ralph Lauren UK,Sales Ralph Lauren Polo, long sleeves, jackets, hoodies, hats, 100% quality guarantee, 60% discount !

Dean Dowd said...

One stop shop for Commercial Restaurant Equipment. Lowest Prices in the Industry Guaranteed! FREE SHIPPING for all orders over $149. Buy Now!
More info: please visit at our
Website:http://www.eliterestaurantequipment.com/

Andrewji Schaller said...

Thanks for this great resource and informativ blogpost

how to be more confident with women

tomal mahmud said...

Golf Shop & Store | Buy Online Golf Products | Buy Golf Products.

golf Shop
golf Store
golf product
american golf clubs
discount golf clubs

tomal mahmud said...

421

tomal mahmud said...

Golf Shop & Store | Buy Online Golf Products | Buy Golf Products.

golf Shop
golf Store
golf product
american golf clubs
discount golf clubs

Syed Faizan said...

It is in reality a nice and helpful piece of information. Lux Style Awards

Curt Linking said...

Hi I will be so glad I ran across your site I truly found people by mistake while We was looking on Askjeeve for something else Nonetheless We are here
polo lacoste 

gamaza said...

I like game that more education for children.

juegos de carros

Felix Smith said...

Your article is extremely impressive. I never considered that it was feasible to accomplish something like that until after I looked over your post. Local Advertising

joana lui said...

I just wanted to leave a comment to say that I enjoy your blog. Looking at the number of comments, I see others feel the same way! Congratulations on a very popular blog.

Metropolitan Safe Deposit Boxes Limited or Bank Safe Deposit Boxes limited (‘Metropolitan’) was originally formed in 1983 to construct and operate the Belgravia safety deposit box , Metropolitan’s safety deposit box facilities are strategically placed in the inner central area of Metropolitan London. The Company is the largest independent provider of Safe Deposit Boxes
Bank Safe Deposit Boxes Safe Deposit UK Bank Safe Custody Safety Deposit Boxes
Safe Deposit Facilities Safe Heaven this service in the United Kingdom. The two vaults provide thousands of boxes in 16 different sizes ranging from one-foot square and two-inch high boxes up to walk-in secure storage areas. The locations of the vaults are in Knightsbridge and St John’s Wood.

Sturgiscampground said...

From the time I have started reading the articles you have been posting, I have become very keen in learning more and more. Now I can proudly say that I know little and that too thanks to you!!! Sturgis campground

pregnancy symptoms before missed period said...

This is a very informative article.I was looking for these things and here I found it. Like the site pregnancy symptoms before missed period I am doing a project and this information is very useful me.

hotels in malaysia said...

This is a very informative article.I was looking for these things and here I found it. Like the site hotels in malaysia I am doing a project and this information is very useful me. …..

gamaza said...

It is so lucky to read your blog,it is full of useful message.I wish we both can do better in the future.It great honor if you can visit our website,and give us some suggestion.

funny games

sephorabeckham said...

That is very good comment you shared.Thank you so much that for you shared those things with us.I'm wishing you to carry on with your achievements.All the best.


Toronto Companion

Frank Zare said...

i think it help me support my application thanks.
orange county remodeling

Joseph Walker said...

I have read your article, it is very informative and helpful for me.I admire the valuable information you offer in your articles. Thanks for posting it..

cloud computing

bedouin dubai desert said...

This is really good site and it's looking so nice bedouin dubai desert .

Fozia Ahmed said...

It is so lucky to read your blog,it is full of useful message.I wish we both can do better in the future.It great honor if you can visit our website,and give us some suggestion. desert safari

bedouin dubai desert said...

This is really good site and it's looking so nice...I love this site.. bedouin dubai desert .

magiskunder holdning said...

It is great to observe somebody put enough craze towards a matter. I'm thankful that I stumbled upon this process. I am lucky I used the time to read on past the 1st paragraph. You have got a whole lot to say, very much to offer. I really hope guys understand this and look into your page Merchant Services

magiskunder holdning said...

Student morality should be practised and immorality should be neglected by student. http://write-my-essays.net/write-my-paper In this filed student can make a distinct contribution.To fight against illiteracy.

magiskunder holdning said...

Student can be prefect a good fitness.Because he weak up regularly get up in a morning .And he http://college-paper-writing-service.net/ get a good health.A student can get a good future.And he solved his problem.

Mia Smith said...

This blog is an exact representation of skills. I appreciate the blogger for posting the most excellent thought. Dawn Travels
Hajj Packages
Umrah Packages

Naimur Rashid said...

Unrivaled of the thoroughgoing mutual tender focuses positive to teenagers universally the nation may not be pardon you would read. In detail, sundry deal thru rigid things and just trace on focuses which deprivation a surprising deal of data to http://domyessay1.net/ back up one’s focal authorities. Evoke, thesis engraving is quite various from study diatribe and estimate lettering the latter claim a wealth of fundamentals and residual detail to be efficient.

SHOWBIZ NEWS said...

There are many different instruments to groom dogs. Among them is the Curry Brush, Shedding Blade, Stripping Knives, Slicker Brushes and Rakes. These tools are very common among dog groomers and every pet shop should be able to supply. https://www.rebelmouse.com/hollyhaydenhmiracle

SHOWBIZ NEWS said...

Slicker Brushes and Rakes. These tools are very common among dog groomers and every pet shop should be able to supply. http://rebelmouse.com/makehimdesireyou

SHOWBIZ NEWS said...

hank you very much for this post. I think it may be the only post online regarding this subject matter with hand holding explanations and code samples. how can you cure infertility

SHOWBIZ NEWS said...

Wine for Thanksgiving is the easy part. Check out the https://www.rebelmouse.com/dramamethodaaronfox

Harun said...

When we work for you as an SQL Consulting firm and provide your DBA services then there is no cost associated with the hiring process of any database administrator, since it is all done when the service is required. A database administrator builds and maintains custom databases to meet the specific data needs for the company.

Ypages Pk said...
This comment has been removed by the author.
Ypages Pk said...

very good right up thanks for sharing with us.
Yellow Pages

Hair Transplant

Interior Designers

Mia Smith said...

That's really a marvelous post. Some interesting thoughts here. Thanks for this post. Macy's Coupon
JcPenney Coupons
Bluefly Coupon Codes
Target Promo Codes
Barnes & Noble Coupon Code
Groupon Promo Codes
Amazon Promo Codes
Best Buy Coupons
American Eagle Promo Code
AutoZone Coupons
Walmart Coupon Codes
Next Day Flyers Coupon Codes
Overstock Promo Codes
bebe Coupon Codes
Light In The Box Coupons
SmartBargains Coupons
Bed Bath and Beyond Coupon

Tina brian said...

Awesome post thanx for sharing this one realy helped me :)
Labaik Tours
Umrah Packages
Hajj Packages

jake george said...

Cold Fusion Online Training, ONLINE TRAINING – IT SUPPORT – CORPORATE TRAINING http://www.21cssindia.com/courses/cold-fusion-online-training-92.html The 21st Century Software Solutions of India offers one of the Largest conglomerations of Software Training, IT Support, Corporate Training institute in India - +919000444287 - +917386622889 - Visakhapatnam,Hyderabad Cold Fusion Online Training, Cold Fusion Training, Cold Fusion, Cold Fusion Online Training| Cold Fusion Training| Cold Fusion| "Courses at 21st Century Software Solutions
Talend Online Training -Hyperion Online Training - IBM Unica Online Training - Siteminder Online Training - SharePoint Online Training - Informatica Online Training - SalesForce Online Training - Many more… | Call Us +917386622889 - +919000444287 - contact@21cssindia.com
Visit: http://www.21cssindia.com/courses.html"

hanks7777 said...

Getting centered in the last few days of your school is clear when you haven't started the school determination process. Notwithstanding, endeavor to keep your cool and recall that everyone gets confirmation in school. essay writing service

shek nayem said...

Car this specific the courtroom room placement inside financial products may be however utilized by an inadequate issues along with reasonable cash flow or maybe frustration credit standing tips that want cash flow related to short-term unfamiliar strategy. Car this specific the courtroom room placement inside financial products may be could sincerely start using any $4, 000 take care of.payday loans corona

DY DEO said...

This is a 2 good post. This post gives truly quality information. I’m absolutely going to look into it. in fact very useful tips are provided here. thank you so much. Keep up the good works.
aanrechtblad

milla jerry said...

Picked the money you'll need. Several weeks throughout a though', ton this specific equity credit line back. It terribly is effortlessly! Fluctuated auto title loans near for me with connation is that the upper really starting day development having U. S. of America day money enhancements is plainly thought NO COST!!! That is adequate.

z toko said...

I found the perfect place for my needs. Contains wonderful and useful messages. I have read most of them and has a lot of them.
harga cmp klorofil

Patti E. Shuff said...

Only those those who are directly consist of with the system, lending and suppliers will have availability your information but your details shall speedy cash auto title loans chicago not be marketed to unknown people that is not directly consist of in this procedure.

z toko said...

Thank you, I have recently been searching for information about this topic for a while and yours is the best I've found out so far.
pelangsing tubuh
pelangsing herbal yang aman

z toko said...

I find your article very cognitive and meaningful. Thanks for sharing this information
pelangsing perut
pelangsing alami

M RAZA ABBAS said...

Thanks for this great website. I am trying to read some more posts but I cant get your website to display properly in my website.
website conversion strategies

SEO Brothers said...

Nice Post. Thanks for sharing. But I will share a helpful tips. Missing Yahoo and google Prime list as well as Can not receiving 1st Google page rank. Essentially the most trouble guiding this can be identical written content. Consequently, I want for you to propose anyone check out your current articles are certainly not Plagiarized. Check out by simply Plagiarism Detector . Don’t miss out this.

Asad Hanif said...

I am glad to see that people are actually writing about this issue in such a smart way, showing us all different sides to it. Check out plagiarism checker tool for free.

Muqeet Ahmed said...

Compared with my last tour, I think it was a lot improved than this. Thank you for your hajj services 2014 Cheapumrahpackage.us Soon I will get back your Hajj and Umrah services.
Hajj
Umrah

anusha deepthi said...

A very thought provoking post and resonates with me posts like coldfusion 9 air sqlite offline support. Hair Transplant Clinic in Hyderabad

z toko said...

I additionally got a new website like this, however my articles are not too good as your own. keep up the truly amazing work and ideally we'll see more content articles such as this. Thank you.
diet cepat
cara sehat menurunkan berat badan