Now Reading

"Now Reading" is a new category in this blog. Sometimes I read interesting books, papers, essays, or just inquiring links and I want to share the information with my visitors. Enjoy this new section.

Well, nowdays Im reading the followin books:

To bring the books from Amazon in US to my house in Spain took 1 month!.
Yes, these books are not new but I think that they are a "must" if you are a .Net/Mono developer. Im focused in several .Net/Mono projects at the moment so this is a good reason to read them.

The next document which is inside Juval's book can be downloaded from:

I was following the guidelines described in it but I wasn't know about it. I will change some Boxerp code to comply with a few Juval guidelines.

MySQL Web Seminar today

Today I have been attending a MySQL Web Seminar: Web 2.0 and MySQL. It has been interesting and the spoken english of the presenter (Jimmy Guerrero) has been crystal clear for me. The sound is sended by a telephone call but its free and the slideshow and Q&A session is performed using WebEx, a Java application. It has been a new and exciting experience for me and I will repeat on next seminar. The presentation hasn't been very technical but some ideas and charts have been really impressive: Wikipedia bears 25000 SQL requests per second. has a MySQL cluster with 100 servers which is bearing more than 3 million users, 70% of them active.

Boxerp: My baby is growing

Nowdays Im focused on Boxerp development in my spare time. The old 0.0.1 version is deprecated since I am rewriting the whole framework. Now I have powerful development tools which provide agile development, facilities, reliability and high performance. Desktop applications development using Gtk# is a better experience for me than web development. Iam really having fun writing the Gtk# client using MonoDevelop (Stetic GUI Designer).
In the server side, the ORM is the wonderful Castle.ActiveRecord which let me play with relational objects in a fancy way. Remoting is the communication technology, which let me send ActiveRecord models (relational objects) between client and server without problems (No circular reference problems). Furthermore, the CallContext avoids to send the session token in every remote call. However, there is a little problem with the CallContext because if I use independent threads I should manually pass the session token between them and I need different threads to keep the client application responsive. This is not very important, just one line of code.
The client code is clear thanks the Stetic designer. It uses XML to store the forms (is a Glade evolution) and the code is clean, it just contains the controller code, not widgets initializations neither something like that.
Look at the administrator's main window file (at the moment it just loads data from server and shows them if login was correct because the ssession token is going to be sent in the CallContext):

using System;
using Gtk;
namespace administrator{
public class MainWindow : Gtk.Window{
protected MainHelper helper;
protected widgets.SimpleTreeView streeviewEnterprises;
protected widgets.SimpleTreeView streeviewUsers;
protected widgets.SimpleTreeView streeviewGroups;
public MainWindow () : base ""){
thistypeof (MainWindow));
new MainHelper(refthis.streeviewEnterprises, refthis.streeviewUsers, 
protected void OnDeleteEvent (object sender, DeleteEventArgs a){

And now take a look at the helper code, it downloads data from server but keep the application responsive:

using System;
using System.Collections;
using clientlib;
using widgets;
using Boxerp.Models;
using Boxerp.Objects;
using Gtk;
namespace administrator{
public class MainHelper : ResponsiveHelper{
    widgets.SimpleTreeView streeviewEnterprises, streeviewUsers, streeviewGroups;
    Enterprise[] enterprises;
    User[] users;
    Group[] groups;
    IAdmin adminObj;
public MainHelper (ref SimpleTreeView e, ref SimpleTreeView u, ref SimpleTreeView g) {
typeof (IAdmin));
public void LoadEnterprises (){
try {
catch (Exception ex){
public void LoadUsers (){
try {
catch (Exception ex){
  public override void PopulateGUI (){
if (enterprises!=null
      foreach (Enterprise i in enterprises){
        ArrayList columns=
new ArrayList();
this.streeviewEnterprises.InsertRow(TreeIter.Zero, columns);