<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>agilitic</title><generator>Tumblr (3.0; @agilitic)</generator><link>http://blog.agilitic.com/</link><item><title>New app: BlopBlop</title><description>&lt;p&gt;&lt;a href="http://blopblop.com"&gt;&lt;img src="http://media.tumblr.com/tumblr_lgalfqYvaY1qf55ac.png" alt=""/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the &lt;a href="http://railsrumble.com"&gt;RailsRumble 2010&lt;/a&gt; in October 2010, we have built &lt;a href="http://blopblop.com"&gt;BlopBlop&lt;/a&gt;, a doodle-like for places, videos, pictures and pieces of source code.  It’s been a long time this small service is online but we wanted to post a little bit about it here.&lt;/p&gt;

&lt;p&gt;BlopBlop lets you create polls to compare stuff : images, files, links, youtube videos, places on maps, dates, source code, texts, …&lt;/p&gt;

&lt;p&gt;No signup required. You can share your poll with Facebook, Twitter or by email.&lt;/p&gt;

&lt;p&gt;Following the RailsRumble principle, the app was written and deployed in 48 hours !&lt;/p&gt;</description><link>http://blog.agilitic.com/post/3179267835</link><guid>http://blog.agilitic.com/post/3179267835</guid><pubDate>Tue, 08 Feb 2011 11:06:14 +0100</pubDate></item><item><title>Interns : final update</title><description>&lt;p&gt;
  The iPhone version of the CRM client is now functional.
&lt;/p&gt;

&lt;p&gt;
Last week we worked on the synchronization function. It is now complete and 
allows offline additions, changes and deletions of objects. Here are the steps that it follows :
&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Get the timestamp from the server and save it. It will be used the next time sync() will be called.&lt;/li&gt;
  &lt;li&gt;Test if there’s a connection (actually if we got the timestamp). If not, just don’t do anything and return false.&lt;/li&gt;
  &lt;li&gt;Check for updated objects in the main DB and upload changes only if the local version is the newest.&lt;/li&gt;  
  &lt;li&gt;Check for offline objects, upload them and purge offlineDB. These objects are the ones added when there were no internet connection.&lt;/li&gt;
  &lt;li&gt; Idem for deletions.&lt;/li&gt;
  &lt;li&gt;Perform a sync request to the server (every objects modified since last timestamp are pulled including removed ones, see step 8).&lt;/li&gt;
  &lt;li&gt; Update local contents with new or updated objects from the server.&lt;/li&gt;
  &lt;li&gt;Since even the deleted objects were pulled (which is good) we now have to delete them from local main DB.&lt;/li&gt;
  &lt;li&gt;Finally, update the local timestamp with the one pulled from the server at step 1.&lt;/li&gt;
  &lt;li&gt;This prevent from loosing eventual modifications performed somewhere else during the sync() function is running.&lt;/li&gt;
  &lt;li&gt;The 3 databases mentioned actually are core data stores. Additions are done in the “offline store”, deletions in the “deleted store” and changes in the main store. Each time one of these action is performed, the sync function is called to maintain consistency between the server and the client. If there’s no internet connection, the sync function just don’t do anything and every local modifications are kept in the differents stores until internet is available again.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;
  There’s now a nice login view. A picture is worth a thousand words :
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/crm-episode-8-login.png"/&gt;&lt;/div&gt;

&lt;p&gt;
  We brought some improvements to the contacts list, like contacts grouped and sorted alphabetically and a kind of bar to slide directly to a letter.
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/crm-episode-8-contact-list.png"/&gt;&lt;/div&gt;

&lt;p&gt;
  The task list has also been changed to allow display either all tasks or tasks assigned to the users. In addition, the tasks are sorted from newest to oldest and the tasks “done” are placed at the bottom of the list and are marked by a green circle. The tasks “to do” are placed first in the list and are marked by a red circle.
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/crm-episode-8-task-list.png"/&gt;&lt;/div&gt;

&lt;p&gt;
  The edition has been redesigned for better viewing.
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/crm-episode-8-editor.png"/&gt;&lt;/div&gt;</description><link>http://blog.agilitic.com/post/2528418058</link><guid>http://blog.agilitic.com/post/2528418058</guid><pubDate>Wed, 29 Dec 2010 06:00:00 +0100</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : 6th and 7h weeks</title><description>&lt;p&gt;Hi folks!&lt;/p&gt;

&lt;p&gt;We have been busy again the past weeks. Anyways, find here is the progress of Maxime, Alexis and Joël.&lt;/p&gt;

&lt;h3&gt;SproutCore web client&lt;/h3&gt;

&lt;p&gt;Joel requested a few changes to the Rails back-end to have the sync to behave correctly with the SproutCore
front-end. Aurélien was very busy on other projects, so he decided to give him access to the source code so he could
make the changes himself.&lt;/p&gt;

&lt;p&gt;That done, all that was left was the login dialog and a few enhancements and UI tweeks here and there. All in all,
the SproutCore version can be considered complete, although Joel will still spend a little time making things
prettier.&lt;/p&gt;

&lt;p&gt;Next week, he’ll probably be joining Alexis and Maxime to work on the mobile versions, as they are turning out to be
more tricky than expected.&lt;/p&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;These two weeks were entirely devoted to the advancement of our CRM on the iPhone.&lt;/p&gt;

&lt;p&gt;We continued the models “edition” part, and we have completely finished the editing of tasks. We can now edit the
tasks; it means that we can now change the name, the status of the task (to do or done), the contact to whom the task
relates, the details and the user for whom the task is assigned. After the modifications, we just have to touch the
button “save” and the program deals with saving it to Core Data and with sending a request “PUT” to change the task on
the server.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-episode-7-EditTask.png"/&gt;&lt;/div&gt;

&lt;p&gt;The editing of contacts is almost over, it remains only the photography part. We recover the pictures, or the
business cards for the contacts and we develop in the editing the possibility to choose between the picture library or
to take a photo directly. The problem is that the iPhone virtual machine doesn’t allow us to take pictures, so we have
to test it on a real iPhone. But we can edit everything for a contact and we can already save it and send the changes
to the server.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-episode-7-EditContact2.png"/&gt;&lt;/div&gt;

&lt;p&gt;For the “editing” part, we still have to finish the activity and opportunity models, as well as the multipart part.
This one allows us to post pictures and attachments (attachment attribute in activity and opportunity).&lt;/p&gt;

&lt;p&gt;For the “creation” part, we can add and delete tasks. Therefore, we need to select the edit mode when we are in the
task list, then buttons appear in each cell of our list. These buttons allow us to delete a task as well as to add a
new task.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-episode-7-CreateTask.png"/&gt;&lt;/div&gt;

&lt;p&gt;To realize this mode, we firstly have to add an item in our tableView:&lt;/p&gt;

&lt;script src="https://gist.github.com/667580.js"&gt; &lt;/script&gt;&lt;p&gt;We have to implement a method that returns an editing style. For all the elements smaller than the size of our
tasksArray, we return the style UITableViewCellEditingStyleDelete “. This style allows us to get the delete button. For
the last element, we send the style UITableViewCellEditingStyleInsert. This one allow us to add a new element.&lt;/p&gt;

&lt;script src="https://gist.github.com/667582.js"&gt; &lt;/script&gt;&lt;p&gt;The last method to implement will allow us to do something when the user touches our editing buttons.&lt;/p&gt;

&lt;script src="https://gist.github.com/667585.js"&gt; &lt;/script&gt;&lt;p&gt;The creation of Contact is implemented but not completed, it remains to finalize the picture addition and the business card.
We also have to implement the creation for the models activity and opportunity.&lt;/p&gt;

&lt;p&gt;In summary for the iPhone, we have to finalize the activities and opportunities editing. We have to look after the
“multipart” part for the sending of pictures and files. For the creation part, we have to finish Contact and we need
to finish the implementation of edit activity and opportunity. These ones have to be finalized, fortunately we already
have the code to implement task and contact, it is obvious that the finalization of these models will be done very
quickly. Other parts have to be started and finalized; including two important points such as synchronization and the
connection to the application.&lt;/p&gt;

&lt;p&gt;Last week we reached an important step in the iPhone development. The GUI that enables the user to create modify and
delete contacts tasks activities and opportunities is now completed. So we started to implement synchronization and
login (login and password were hardcoded upto last week and the application was pulling every items at startup). The
login view is now functional, not the synchronization. Therefore we’re going to finish it this week.&lt;/p&gt;

&lt;p&gt;The synchronization principle is pretty simple :&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;pull modified elements since the timestamp;&lt;/li&gt;
&lt;li&gt;add them to a new core data context;&lt;/li&gt;
&lt;li&gt;merge it with the main context with an overwrite policy;&lt;/li&gt;
&lt;li&gt;finally it’s necessary to filter all the elements that have their “destroyed_at” field filled in.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Many of these functions have already been coded but the whole synchronization is not finished yet. Another important
thing we’ll have to do is to remember the last connected user on the terminal. Indeed if a new user connects himself
on the terminal of someone else, he shouldn’t see the contacts tasks etc of the previous user. That’s one of the goal
of the persistent object “Settings” which was added to the core data model. It will allow us to know if the present
user is different of the previous one and if so, to wipe the core data context.&lt;/p&gt;

&lt;p&gt;After that we’re probably going to add last features like search, dashboard, …&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528397642</link><guid>http://blog.agilitic.com/post/2528397642</guid><pubDate>Thu, 21 Oct 2010 07:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : 5th week</title><description>&lt;p&gt;Finally, the update about our interns! We have been quite busy this week and
the publication of their work progress has been delayed a little bit. An
internet connection breakdown also slowed us down. Nevermind, here is where they
are now.&lt;/p&gt;

&lt;p&gt;We spent the last weekend coding for the &lt;a href="http://railsrumble.com"&gt;RaisRumble&lt;/a&gt; contest. We’ll talk about our &lt;a href="http://blopblop.com"&gt;project&lt;/a&gt; here soon.

&lt;/p&gt;&lt;h3&gt;SproutCore web client&lt;/h3&gt;

&lt;p&gt;The SproutCore application is getting closer and closer to the finish line
and is now completely usable.&lt;/p&gt;&lt;p&gt;The past week was first spent linking the tasks and contacts. Joel wasn’t
very happy with SproutCore relationships, because linking to models is basically
useless: you have to return both ends of the relationship in your backend (so a
task has a contact_id, but a contact also has task_ids), and SproutCore won’t
update it for you later on (so creating a task for a contact doesn’t add it to
the contacts tasks). In the end, the application only uses relationships to
access data in an easier and cleaner way, which is nice but a little
disapointing comming from Rails.&lt;/p&gt;

&lt;p&gt;The rest of the week wasn’t very exciting for Joel, as he mostly had to
copy-paste and adapt what he did for the tasks to handle the opportunities and
activities.&lt;/p&gt;

&lt;p&gt;This week will be spent enhancing the UI, and making some improvements to try
and speed everything up. Hopefully we’ll be done by friday, and maybe Joel will
be able to write a Cappuccino version to compare the two frameworks on a
complete, identical project.&lt;/p&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;This week has been devoted to the development of views for information about
models and to the edition of models. Therefore, several ListViewControllers have
been implemented, for one model we have two ListViewControllers: the first one
is for the information and the second one for the edition. A third one will be
added soon to create items of each model.&lt;/p&gt;

&lt;p&gt;Now when we touch a task, for example, we switch to a new ListView with
different information about this task. An “Edit” button has been placed on the
bar of NavigatorController to open the ListView that allow edition of this task.
The class, UINavigationController, is very practical, it allows us to create a
navigator on a set of views. In our case, we have four navigator controllers for
our four models and we add them directly to our UITabBarController.&lt;/p&gt;

&lt;p&gt;We encountered a problem while rebuilding our JSON for each model. We
structure the JSON correctly in a NSString. The problem was that when we wanted
to display an attribute that is set to nil, we had instead in our string:
“(null)”. To avoid having problems later with these brackets, we have added the
right conditions to not display the attributes that are nil.&lt;/p&gt;

&lt;p&gt;See you soon for the next episode.&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528379857</link><guid>http://blog.agilitic.com/post/2528379857</guid><pubDate>Thu, 21 Oct 2010 06:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : 4th week</title><description>&lt;p&gt;Hi all, it’s time for updates about our CRM development by Alexis, Joël and
Maxime.&lt;/p&gt;

&lt;h3&gt;SproutCore web client&lt;/h3&gt;

&lt;p&gt;This week was mostly spent completing the UI of the web application,
correcting a few imperfections to the controllers along the way. It’s far from
finished, but contacts and tasks management is already usable, even if it still
needs a little polishing.&lt;/p&gt;

&lt;p&gt;However, Joel was disapointed with UI programming in SproutCore compared to
Cappuccino, noting that some concepts are counter-intuitive, or outright wrong.&lt;/p&gt;

&lt;p&gt;Here are a few examples that drove him crazy this week:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Links: using an advanced JavaScript framework, you would think there is a
simple way to create an HTML link, such as a linksTo option to the Label object.
Well, no. Links are embedded into SproutCore labels by inserting the A tag into
the label value, which in turn means you have to turn off the escapeHTML option,
so the only way to add links into your application is by making the label
insecure. If you rely on user data for your link, like we do for the contact’s
website, e-mail address and even twitter username, this can be pretty bad.&lt;/li&gt;

&lt;li&gt;Views are ressources in SproutCore. They are written in JavaScript, using
SproutCore objects, but somehow they’re not really part of your application. Now
this might be a good idea for views with a static layout, with content bound to
your controllers, but if you need your layout to adapt to your content, all this
serves if making you confused. What is the point of defining your views as
external ressources? If you’re using a JavaScript framework instead of, say,
Rails, UI is probably a big deal to you, and HTML, even with JQuery, isn’t
enough to suit your needs. So why threat views are something separate, something
we need but don’t want to keep too close to the “real” code? Cappuccino has a
much more UI-centric approach, which seems to be more in sync with the needs of
developers turning to these frameworks.&lt;/li&gt;

&lt;li&gt;CSS over-generalization. SproutCore tries to simplify UI styling by using
CSS rather that embedding styles into your JavaScript code. This is probably a
good idea, but there is one problem: each element in SproutCore has at least 4
classes. If you want to change how your application looks, you better be careful
and pay extra attention to inheritance: SC.LabelView extends SC.View, so it has
both classes, and modifying the top one could have lots of repercusions. Adding
your own classes can be painful as well, because you never know where your style
could be overriden.&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Overall, we’re making a lot of progress, and should complete the unpolished
UI this week.&lt;/p&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;We spent some time looking for resolving the problem encountered last week.
Remember, the application crashed when we scrolled in the TableView. The problem
was related to Core Data, our entities (Task, Contact, …) were poorly
implemented. Indeed, we changed the “@dynamic” by “@synthesize”. The @synthesize
automatically generate accessors, but in some classes (including class
NSManagedObject used by Core Data) we need to specify variables in code by
@dynamic rather than @synthesize. In this way &lt;a href="http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html"&gt;the
accessors are created dynamically at runtime&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Android client&lt;/h3&gt;

&lt;p&gt;This week was mainly devoted to progress on the Android. We began to make
item edition and deletion possible, starting by tasks. Contacts, activities and
opportunities edition and deletion will be implemented very soon. Now when
selecting a task in the list, a new view showing more information about this
task appears. There’s a button aimed to edit the task and another one to delete
it. Deleting the task removes it from the local database and then sends a DELETE
request to the server with the task id number. Editing the task sends a PUT
request to the server with the well-formed JSON code representing the modified
task.&lt;/p&gt;

&lt;p&gt;On the Android client, we can now add/modify/delete a contact or a task.&lt;/p&gt;

&lt;p&gt;So much so good, see you next week !&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528362712</link><guid>http://blog.agilitic.com/post/2528362712</guid><pubDate>Tue, 12 Oct 2010 06:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : 3rd week</title><description>&lt;p&gt;Hi there! Here are the news about our multi-client CRM developed by our three
rock stars.&lt;/p&gt;

&lt;p&gt;No Android this time since Alexis and Maxime focused on iPhone all the week
long.&lt;/p&gt;

&lt;h3&gt;SproutCore web client&lt;/h3&gt;

&lt;p&gt;Joel spent this week designing the foundations of the SproutCore application.
We now have a functionnal data source (the SproutCore concept that connects the
internal models to the backend), and we can partly view and edit users. There is
obviously a lot of work left, but it will only go faster and faster from now on
as he’s getting familiar with the framework.&lt;/p&gt;

&lt;p&gt;The major trouble this week was to make scrollbars work correctly and
automatically adapt to the content. This seems to be a common problem among
SproutCore users, and the only solution he found for now is fixing the content
height, which may become a problem if a view requires to dynamically expand. As
we don’t need that for now, spending more than an afternoon figuring it out
seems like a waste of time, so he’ll get back to that if necessary or if he has
some time to kill.&lt;/p&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;This week was entirely dedicated to iPhone development. They wanted to be at
the same level of progression as Android.&lt;/p&gt;

&lt;p&gt;First, about the connection, they abandoned the idea of making asynchronous
connections because it complicates the code and as the requests are not long,
it’s okay to wait a few seconds for the query to finish. Therefore, they turned
to a synchronous connection and for each method (GET, POST, PUT and DELETE)
they’ll implement a function to make the connection, the authentication and to
send the request.&lt;/p&gt;

&lt;p&gt;Example for the GET method :&lt;/p&gt;

&lt;script src="http://gist.github.com/609595.js"&gt; &lt;/script&gt;&lt;p&gt;Subsequently, they focused on their data storage strategy. Therefore they
have, as for Android, a class named DataManager. This class is busy with, among
others, the initialization of each model (Contact, Task, Activity and
Opportunity), i.e., it retrieves, on the server, the sets of models and stores
them on the iPhone.&lt;/p&gt;

&lt;p&gt;Core Data seemed to be the best solution to store our data on the equipment.
It allows data being organized by the relational entity-attribute model to be
serialized into XML, binary, or SQLite stores.&lt;/p&gt;

&lt;p&gt;They have encountered some difficulties, especially in the list view of the
different models. Indeed, they used four UITableViewController’s for,
respectively, Contact, Task, Activity and Opportunity. During the loading of
TableView, one part of NSMutableArray is loaded, the other part is loaded with
the scroll of this view, but the display of characters is totally wrong. They
believe that they’re accessing parts of memory not allocated to our data and
this causes a random crash of the application.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Everything continues well!&lt;/p&gt;

&lt;p&gt;The iPhone and Android clients are now both able to list all the data. The
next step for them is to add the creation/edition/deletion of records
functionnality.&lt;/p&gt;

&lt;p&gt;Joël is now very familiar with SproutCore, his application is evolving :
listings of records is almost functionnal and the communication with the
webservice is done. This week, he’ll be working on modification/deletion of
records too.&lt;/p&gt;

&lt;p&gt;See you next monday or thuesday for &lt;a href="http://www.youtube.com/watch?v=QZXc39hT8t4"&gt;the next episode&lt;/a&gt; !&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528348793</link><guid>http://blog.agilitic.com/post/2528348793</guid><pubDate>Mon, 04 Oct 2010 06:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : second week</title><description>&lt;p&gt;It’s wednesday, and so time for an update on our interns work and research.
Let’s see where they are now.&lt;/p&gt;

&lt;h3&gt;Android client&lt;/h3&gt;

&lt;h4&gt;Connection&lt;/h4&gt;

&lt;p&gt;We spent most of last week to build the Android application (this week will
be the turn of the iPhone). We can now make a GET connection to each JSON file,
parse them and display items divided in 4 tabs (see screenshot). Although
they’re not used in the application yet, the POST, PUT and DELETE methods are
implemented. They all use classes that extend HttpRequestBase (HttpPost,
HttpGet, HttpPut, HttpDelete) in the &lt;a href="http://developer.android.com/reference/org/apache/http/client/methods/package-summary.html"&gt;org.apache.http.client.methods&lt;/a&gt;
package in the reference API of Android SDK.&lt;/p&gt;

&lt;h4&gt;Data storage&lt;/h4&gt;

&lt;p&gt;We discovered &lt;a href="http://developer.db4o.com"&gt;db4o&lt;/a&gt;, an object-oriented database. It
allows us to directly store objects just as they are. Then we can get them back
using a query by example on the database. Example code to get all Task objects :&lt;/p&gt;

&lt;script src="http://gist.github.com/600829.js"&gt; &lt;/script&gt;&lt;h4&gt;GUI&lt;/h4&gt;

&lt;p&gt;We used a tabbed layout to display all the elements (tasks, contacts, etc). To
do this, we had to use the “TabHost” container which is composed of a
“TabWidget” and a “FrameLayout”. The TabWidget draws tabs buttons above the
FrameLayout which contains what we want to display in these tabs. There’s only
one TabWidget and one FrameLayout. The number of tabs is determined by the
number of widgets we add into the FrameLayout (here we used 4 “ListView”). All
these steps are done in the XML layout file. Then we connected these widgets to
the controller classes. To use the TabHost object, we have to retreive it by
doing this :&lt;/p&gt;

&lt;script src="http://gist.github.com/600832.js"&gt; &lt;/script&gt;&lt;p&gt;“tabhost” is an id specified in XML. Then to add a tab you do :&lt;/p&gt;

&lt;script src="http://gist.github.com/600833.js"&gt; &lt;/script&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-episode-2-android.png"/&gt;&lt;/div&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;We started the week by programming the HTTP connection on the iPhone. We
used, as it has been requested, &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST
architecture&lt;/a&gt;. Therefore, we implemented the class “Connector”. This class
requires a login, a password and an URL. We were able to establish an
asynchronous connection with the server and to retrieve information about the
tasks.&lt;/p&gt;

&lt;p&gt;When an instance of “Connector” exists, we use the method “connectionWithmethod”
to make a connection using the HTTP basic authentication.&lt;/p&gt;

&lt;script src="http://gist.github.com/600836.js"&gt; &lt;/script&gt;&lt;p&gt;Then, we thought about how to store our data on the device and we discovered
&lt;a href="http://developer.apple.com/macosx/coredata.html"&gt;Core Data&lt;/a&gt;. Core
Data allows us to store and manipulate objects without using any SQL query.
Indeed, Core Data uses SQLite but isolates the developer from the SQL
database.&lt;/p&gt;

&lt;p&gt;We also made our first graphical user interface (in 5 minutes with &lt;a href="http://developer.apple.com/technologies/tools/xcode.html"&gt;Interface
Builder&lt;/a&gt;). However, it’s not connected to “controller classes” yet.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-episode-2-iphone.png" style="height: 400px;"/&gt;&lt;/div&gt;

&lt;h3&gt;&lt;strike&gt;Cappuccino&lt;/strike&gt; SproutCore&lt;/h3&gt;

&lt;p&gt;For the web application, we decided to switch from &lt;a href="http://cappuccino.org"&gt;Cappuccino&lt;/a&gt; to &lt;a href="http://www.sproutcore.com"&gt;SproutCore&lt;/a&gt;, another JavaScript framework.
Here are the differences we noted between the two, and on which we based our
choice:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;SproutCore has more documentation, although it is still far from being
well-documented. Several tutorials are available, and they cover a wider range
than the ones on Cappuccino.&lt;/li&gt;

&lt;li&gt;SproutCore comes with a set of development tools, not unlike Rails,
including generator scripts and a small test server.&lt;/li&gt;

&lt;li&gt;SproutCore is pure JavaScript, and doesn’t define a new programming language
on top as Cappuccino with Objective-J. Some might like it, but Joel was now used
to the Objective-J syntax, and found it easier to understand than a “fake”
language. In SproutCore, you extend a class by calling the extend function on
it, for example, which is quite different than in traditional languages. Either
way, the good thing is that because you work with pure JavaScript, you have
actual debugging info in your browser console and you can even interact with
your application while you run it, where Cappuccino offers terrible
debugging.&lt;/li&gt;

&lt;li&gt;Finally, SproutCore offers powerful bindings, where your model is bound to
your view and data source (what connects you to your back-end). This means
changing one seamlessly changes all the others, without any refresh calls. We’re
having a few issues with the data source part of that, but it’s coming
along.&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;We could also point out that Apple chose SproutCore to power iWork.com, the
online version of their popular office suite, so there’s probably something
there.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;The work goes well, Alexis and Maxime are now more familiar with the mobile
technologies they are developing with : they are able to access the webservice
and to build some piece of GUI, for both Android and iPhone platforms.&lt;/p&gt;

&lt;p&gt;Joël has decided to switch to SproutCore, a decision we support as it has been
chosen for good reasons. His work has nevertheless continued : he didn’t lose a
lot of time on Cappuccinno. He is already up and running on SC !&lt;/p&gt;

&lt;p&gt;See you next week with a new step !&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528336563</link><guid>http://blog.agilitic.com/post/2528336563</guid><pubDate>Wed, 29 Sep 2010 08:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>cappuccino</category><category>sproutcore</category><category>crm</category></item><item><title>Interns : first week</title><description>&lt;p&gt;It’s already time for the first post about our interns!&lt;/p&gt;

&lt;p&gt;The first week mainly consisted on :&lt;/p&gt;

&lt;ul class="bullets"&gt;&lt;li&gt;discovering the tools, SDKs and ecosystems;&lt;/li&gt;
  &lt;li&gt;playing with the APIs;&lt;/li&gt;
  &lt;li&gt;drawing mockups for the 3 apps.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;To play with our REST API, the interns use 
&lt;a href="http://code.google.com/p/rest-client/"&gt;rest-client&lt;/a&gt; which relies on 
the cURL library to perform the HTTP requests.&lt;/p&gt;

&lt;h3&gt;Android client&lt;/h3&gt;

&lt;p&gt;
With a Nexus One in their pocket, Alexis and Max had some fun playing with the 
Android SDK. 
&lt;/p&gt;

&lt;p&gt; One of the first problem they encountered was to choose the lowest Android
version they want to support. To make the application compatible with as many
Android phones as possible, they chose to use the 4th API level (Android 1.6).
Therefore some features and tools are unavailable. By example, we had to use an
external Base64 class to authenticate the connection while this class is present
in the API level 8 (latest version, Android 2.2).&lt;/p&gt;

&lt;p&gt;
The GUI editor is not very easy to use so we have to edit directly the XML
file to make the GUI. We’re looking for a better editor like “App inventor”
(which doesn’t only create GUI) easier to use.
&lt;/p&gt;

&lt;h3&gt;iPhone client&lt;/h3&gt;

&lt;p&gt;
Alexis and Max have no prior experience with Cocoa or Objective-C. Combined 
with the fact that they do not have an iPhone and that they are not daily MacOS
X users make their tasks much more difficult. But, hey, they are here to learn :)
&lt;/p&gt;

&lt;p&gt;They tried and seemed to like 
  &lt;a href="http://developer.apple.com/technologies/tools/xcode.html"&gt;Interface Builder&lt;/a&gt;, 
  the tool to create GUIs for iPhone and Mac applications. Compared with the
  built-in editor of Eclipse, it’s definitely better.
&lt;/p&gt;

&lt;h3&gt;Cappuccino&lt;/h3&gt;

&lt;p&gt;Joel worked on the Cappuccino version of the client. He does not have any prior
experience with Cocoa or Objective-C/J. He has to deal with the relative level
of immaturity of Cappuccino and with an unfamiliar programming environment. 
Here are his first feelings:&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;Cappuccino is a great tool for writing desktop-like web applications. The
framework offers a simple way to create beautiful things, and the result is as
smooth as any other application, despite being JavaScript from head to toe (just
see the impressive &lt;a hre="http://280slides.com"&gt;280slides.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;
Of course, every great tool has its downsides. Here are the few that bothered
me in Cappuccino: 
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Objective-J, the programming language developed
alongside the framework, has a peculiar syntax, the most uncommon and recurring
element of which being the extensive use of brackets, that enclose every method
call as JavaScript cannot handle them natively. If you have used the language’s
big brother, Objective-C (mainly used for iPhone development), you won’t have a
hard time learning Objective-J, as it uses the same principles and syntax. But
if you’re like me and only used regular object-oriented programming languages,
you’ll have to get used to surrounding every method call with brackets and
replacing the dot with a space.&lt;/li&gt; 

&lt;li&gt;Lack of development environments:
Cappuccino and Objective-J are only supported (via plugins) in a few Mac-only
text editors, like TextMate or Xcode. If you’re a Mac user, you probably have
TextMate already (and if you don’t, give it a try, it’s worth every penny), so
no big deal. But if you enjoy another operating system, as I do with GNU/Linux,
the excitement will probably wear off after a few hours of programming without
any syntax highlighting. Some are satisfied with Objective-C or JavaScript
plugins, but I chose to switch to OS X for the writing of this application.
Hopefully, a Linux and Cappuccino fan will write a plugin for Gedit or Eclipse
soon (I might if I find the time), and this issue will be resolved.&lt;/li&gt;

&lt;li&gt;Poor debugging information: I tried development using Firefox (and the
Firebug extension) and Safari, but none are able to provide precise error
details. This actually comes from both JavaScript and the Objective-J
interpreter, which fail to report the file and line where an error occurred. The
only solution I found: testing as often as possible, so you can pinpoint which
changes caused the problem.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/crm-mockup-capp.png"/&gt;&lt;/div&gt;

&lt;p&gt;Communicating with the JSON back-end was surprisingly easy. Cappuccino offers
two ways to do so: using a regular HTTP connection and parsing the resulting
file with a single JavaScript call, or via a JSONP connection. The first only
works if your front and back-ends run on the same domain, for security reasons.
The second was developed to circumvent these security restrictions by the use of
a &lt;script&gt; tag and callback function, and shouldn’t be used if you don’t make
cross-domains calls. It also doesn’t allow for HTTP authentication, which is
needed here, so I sticked to the first but have to use Safari, the only browser
to allow calls from a local application to another domain.&lt;/p&gt;

&lt;p&gt;Finally, I found the handling of graphical components pretty easy, even if
the understanding of all the parts and their purpose can take some time. Actions
are bound to methods and not objects like seen in Java, which makes lighter
code, and positioning is extremely powerful once well understood.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;The result of this first week is a sort of proof-of-concept, with interaction
with both the back-end and the user. See you next week for fresh news about our
three interns and apps!&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528313356</link><guid>http://blog.agilitic.com/post/2528313356</guid><pubDate>Tue, 21 Sep 2010 07:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>cappuccino</category><category>crm</category></item><item><title>Interns!</title><description>&lt;p&gt;Since last monday, &lt;strong&gt;agilitic&lt;/strong&gt; is hosting three interns
(Alexis, Maxime and Joel) for ten weeks. Those guys are coming from &lt;a href="http://www.umons.ac.be"&gt;UMONS&lt;/a&gt; university.&lt;/p&gt;

&lt;p&gt;We will be posting here regular updates about the progress of their work 
and about the issues they had to face.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/interns-mini.jpg"/&gt;&lt;/div&gt;

&lt;h3&gt;What is this internship all about?&lt;/h3&gt;

&lt;p&gt;During those ten weeks, they will work on a simple CRM application. 
The interns will develop three different clients: &lt;/p&gt;

&lt;ul class="bullets"&gt;&lt;li&gt;an &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt; app by Alexis and Maxime;&lt;/li&gt;
    &lt;li&gt;an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; app by Alexis and Maxime;&lt;/li&gt;
    &lt;li&gt;and a &lt;strong&gt;Web&lt;/strong&gt; app by Joël (built with &lt;a href="http://cappuccino.org/"&gt;Cappuccino&lt;/a&gt;).&lt;/li&gt;
  &lt;/ul&gt;&lt;p&gt;
The server is powered by a very simple Rails 3 application.
&lt;/p&gt;

&lt;p&gt;We wish them good luck and a happy coding !&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528294876</link><guid>http://blog.agilitic.com/post/2528294876</guid><pubDate>Mon, 20 Sep 2010 06:00:00 +0200</pubDate><category>android</category><category>iphone</category><category>mobile</category><category>cappuccino</category><category>crm</category></item><item><title>VAT number validations for ActiveModel/Rails</title><description>&lt;p&gt;Have you ever had to deal with intracom VAT numbers (Europe) ?&lt;/p&gt;

&lt;p&gt;If yes, take a look at &lt;a href="http://github.com/aurels/vat_validator"&gt;my
vat_validator gem on github&lt;/a&gt;. This plugin can validate the format of VAT
numbers for all the CEE countries. There is also an option to check the number’s
validity against the &lt;a href="http://ec.europa.eu/taxation_customs/vies/"&gt;VIES&lt;/a&gt; webservice.&lt;/p&gt;

&lt;p&gt;Examples :&lt;/p&gt;

&lt;script src="http://gist.github.com/486039.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;script src="http://gist.github.com/486043.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;p&gt;Of course, the gem is ActiveModel-compliant. Any feedback is welcome on the
GitHub issues tracker. You can also find &lt;a href="http://github.com/aurels/validates_vat_number"&gt;a Rails 2.x version&lt;/a&gt;
which doesn’t implement the VIES webservice connection.&lt;/p&gt;

&lt;p&gt;Hope it helps!&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528279475</link><guid>http://blog.agilitic.com/post/2528279475</guid><pubDate>Thu, 22 Jul 2010 06:00:00 +0200</pubDate><category>rails</category><category>ruby</category><category>plugin</category><category>vat</category></item><item><title>Pacman is there</title><description>&lt;p&gt;
  According to dRine, our office walls were way too boring. She turned up
  yesterday morning with some paint brushes.
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/drine-brushes.jpg"/&gt;&lt;/div&gt;

&lt;p&gt;
  and here is the final result:
&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
  &lt;img src="http://agilitic.com/images/blog/pacman.jpg"/&gt;&lt;/div&gt;

&lt;p&gt;
  Many thanks dRine ! 
&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528263627</link><guid>http://blog.agilitic.com/post/2528263627</guid><pubDate>Fri, 09 Jul 2010 06:00:00 +0200</pubDate><category>fun</category><category>office</category><category>pacman</category><category>dRine</category></item><item><title>Paperclip and delayed_job FTW!</title><description>&lt;p&gt;This article is intended to thank two &lt;a href="http://rubyonrails.org"&gt;rails&lt;/a&gt; plugins that our apps couldn’t live
without. The well known &lt;a href="http://github.com/thoughtbot/paperclip"&gt;Paperclip&lt;/a&gt; from &lt;a href="http://thoughtbot.com"&gt;Throughtbot&lt;/a&gt; and the &lt;a href="http://github.com/tobi/delayed_job"&gt;Delayed Job&lt;/a&gt; project (a.k.a. DJ)
initiated by &lt;a href="http://twitter.com/tobi"&gt;Tobias Lütke&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We successfully deployed last week an application for a customer of ours
whose purpose is to manage a library of songs. The 33k+ music tracks are
organized on disk with Paperclip. For each track on the system, two mp3 versions
are generated with &lt;a href="http://lame.sourceforge.net"&gt;lame&lt;/a&gt; inside an
asynchroneous delayed job.&lt;/p&gt;

&lt;p&gt;That’s the biggest queue we’ve ever had here!&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/queue.jpg"/&gt;&lt;/div&gt;

&lt;div style="text-align:center;"&gt;Photo credit : &lt;small&gt;&lt;a href="http://www.flickr.com/photos/paulrussell/276029831"&gt;&lt;a href="http://www.flickr.com/photos/paulrussell/276029831"&gt;http://www.flickr.com/photos/paulrussell/276029831&lt;/a&gt;&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;</description><link>http://blog.agilitic.com/post/2528240817</link><guid>http://blog.agilitic.com/post/2528240817</guid><pubDate>Fri, 11 Jun 2010 07:00:00 +0200</pubDate><category>ruby</category><category>technology</category><category>paperclip</category><category>delayed_job</category></item><item><title>LiveResto in da cloud</title><description>&lt;p&gt;Since the launch of &lt;a href="http://liveresto.com"&gt;LiveResto&lt;/a&gt; in November
2009, the main app has been hosted on &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;,
which relies on &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;. We are big
fans of Heroku’s &lt;i&gt;git push&lt;/i&gt; style deployment here at
&lt;strong&gt;agilitic&lt;/strong&gt; and we recommend this service to all of you Ruby
guys.&lt;/p&gt;

&lt;p&gt;Additionally, I am proud to say that the whole LiveResto website is now
&lt;strong&gt;fully&lt;/strong&gt; deployed on cloud-technology platforms: the application
and database layer on Heroku, the assets on &lt;a href="http://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt;. All emails are delivered by &lt;a href="http://sendgrid.com"&gt;Sendgrid&lt;/a&gt;.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img src="http://agilitic.com/images/blog/in-da-club.jpg"/&gt;&lt;/div&gt;</description><link>http://blog.agilitic.com/post/2528218381</link><guid>http://blog.agilitic.com/post/2528218381</guid><pubDate>Mon, 03 May 2010 07:00:00 +0200</pubDate><category>liveresto</category><category>technology</category><category>cloud</category><category>heroku</category></item><item><title>Seminar at UMONS</title><description>&lt;p&gt;Last Wednesday the &lt;strong&gt;agilitic&lt;/strong&gt; team was at &lt;a href="http://www.umons.ac.be"&gt;UMONS&lt;/a&gt; to give a seminar in the context of a
lecture organized by Chantal Poiret for 3rd year of Bachelor and Masters degree
students in Computer Science.&lt;/p&gt;

&lt;p&gt;The talk (in french) was split in 3 parts : &lt;i&gt;The future of the Web&lt;/i&gt; by
Steve, &lt;i&gt;Retours d’expérience d’entrepreneurs en informatique&lt;/i&gt; by Aurélien
and &lt;i&gt;Javascript, l’assembleur du Web&lt;/i&gt; by François.&lt;/p&gt;

&lt;p&gt;It was a pleasure for us to be back in our school.&lt;/p&gt;

&lt;div style="width:425px" id="__ss_3900446"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/fstephany/javascript-lassembleur-du-web" title="Javascript l'assembleur du web ?"&gt;Javascript l’assembleur du web
?&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3900446" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=javascriptassembleur-100429054420-phpapp01&amp;stripped_title=javascript-lassembleur-du-web"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed name="__sse3900446" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=javascriptassembleur-100429054420-phpapp01&amp;stripped_title=javascript-lassembleur-du-web" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/fstephany"&gt;Francois Stephany&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;

&lt;div style="width:425px" id="__ss_3919576"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/aurels/retours-dexprience-dentrepreneurs-en-informatique" title="Retours d’expérience d’entrepreneurs en informatique"&gt;Retours
d’expérience d’entrepreneurs en informatique&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3919576" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agilitic-100430090052-phpapp01&amp;stripped_title=retours-dexprience-dentrepreneurs-en-informatique"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed name="__sse3919576" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agilitic-100430090052-phpapp01&amp;stripped_title=retours-dexprience-dentrepreneurs-en-informatique" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/aurels"&gt;aurels&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;</description><link>http://blog.agilitic.com/post/2528199829</link><guid>http://blog.agilitic.com/post/2528199829</guid><pubDate>Fri, 30 Apr 2010 07:00:00 +0200</pubDate><category>umons</category><category>presentation</category></item><item><title>LiveResto at BetaGroup</title><description>&lt;p&gt;Today, our first in-house product will be presented at &lt;a href="http://betagroup.be"&gt;BetaGroup&lt;/a&gt; #15 along with &lt;a href="http://www.woorank.com"&gt;WooRank&lt;/a&gt;, &lt;a href="http://www.knowledgeplaza.be"&gt;Knowledgeplaza&lt;/a&gt;, &lt;a href="http://www.whitepapercentral.com"&gt;whitepapercentral&lt;/a&gt;, &lt;a href="http://www.visionsmarts.com/products/products.html"&gt;pic2shop&lt;/a&gt; and &lt;a href="http://www.tinkertouch.com"&gt;Tinker Touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://liveresto.com"&gt;LiveResto&lt;/a&gt; is a hosted &lt;span class="caps"&gt;CMS&lt;/span&gt; for restaurants that aims to provide an easy way for
restaurant owners to manage their website themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://betagroup.be"&gt;BetaGroup&lt;/a&gt; is a community of belgian
entrepreneurs interested in Software, Web and online business. This community
hosts free events where 5 start-ups have 5 minutes to show off their product.&lt;br/&gt; This time, the event will take place at &lt;span class="caps"&gt;ULB&lt;/span&gt; in
Brussels (Auditorium UD 2.120).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://liveresto.com"&gt;LiveResto&lt;/a&gt; had already been presented at
the first BetaGroup Mons on Wednesday, December 16, 2009.&lt;/p&gt;

&lt;p&gt;See you tonight in Brussels!&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528191136</link><guid>http://blog.agilitic.com/post/2528191136</guid><pubDate>Wed, 20 Jan 2010 06:00:00 +0100</pubDate><category>internal</category><category>website</category><category>betagroup</category></item><item><title>New Reference: Terrabio</title><description>&lt;p&gt;The agilitic team is proud to show you his latest reference: Terrabio’s
website.&lt;/p&gt;

&lt;p&gt;Terrabio is a brand that offers a complete range of make-up products,
specially intended for spas, beauty salons and perfumeries. Other skincare
products, along with specific protocols, will be launched in 2010.&lt;/p&gt;

&lt;p&gt;This website was created in collaboration with Destyle graphic.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.terrabio.net"&gt;&lt;a href="http://www.terrabio.net"&gt;http://www.terrabio.net&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.agilitic.com/post/2528182346</link><guid>http://blog.agilitic.com/post/2528182346</guid><pubDate>Wed, 25 Nov 2009 06:00:00 +0100</pubDate><category>client</category><category>website</category></item></channel></rss>
