Sunday, June 22, 2008

Le barrage d'Emosson

Aujourd'hui nous nous sommes payés une petite visite en hauteur pour se rafraîchir par ce temps caniculaire (plus de 33C en plaine...). Nous avons opté pour Le Châtelard situé dans le Valais à deux pas de la vallée française de Chamonix.


A partir de ce petit village, nous avons pris le plus abrupte funiculaire à deux cabines de monde avec une pente maximale de 87% (ce qui donne à peu près 41 degrée! ... présumant que mes quelques souvenirs de la trigonométrique soient justes ).




Laurie au moment du départ, en plein confiance?





Nous parcourons par la suite un petit trajet à flanc de côteau en train à la vapeur fonctionnant au charbon.




Ce parcours nous offre une vue imprenable sur le Mont Blanc et ses sommets avoisinnants (on voit très bien les pics des Aiguilles du midi).




Nous arrivons à un 2e funiculaire qui lui nous mène au barrage du lac d'Emosson (à poids voûte).
Ce barrage avec sa hauteur de près de 200 mètre impressionne et donne le vertige! Il est le 2e plus gros de la Suisse en terme de volume d'eau retenu avec plus de 227 million de mètres cubes d'eau (la Suisse compte pas moins de 160 barrages ... ce qui me semble pas mal compte tenu de sa taille).


Voici quelques autres photos...






Et non nous n'avons pas adopté 2 nouveaux enfants, mais plutôt fait le voyage avec un couple d'amis avec enfants!





Coup de chance en me rendant dans une zone plus isolée pour prendre quelques photos, j'aperçois un chamoix qui ne semble pas trop appeuré de notre présence! Mon fils l'est un peu plus et nous le laisserons tranquille dans son jolie coin de pays: "papa, on ne devrait pas trop l'approcher... il a quand même des cornes!!"




Petite déception, nous n'avons pas pu atteindre les empreintes de dinosaures malgré toute la bonne volonté et motivation de Mathias.... la fatigue a tout simplement eu le dessus!!! À une prochaine fois.


Les enfants se sont montrés bien brâves et tenaces avec ces longs parcours, ces dénivellés et ascensions ... rien de mieux que d'avoir des amis de leurs âges pour stimuler leur orgeuil!!



Martin

Sunday, June 08, 2008

Claire Ouellet

This is a shameless blog-plug!

My sister Claire Ouellet, is a professional pianist. Although, I was sort of annoyed by it while I was younger (these continuous and endless practices caused me a few nervous breakdown!), I must admit that all these long years of discipline did pay off. She is now a teacher at the Conservatoire of Montreal, and her last record out is a hot seller (ok, ok... selling statistics for classical albums are certainly not on the same scale as pop music, so I'm not expecting her to move to Montreux soon ;-).

Here's her most recent album: Orford Six Pianos with details here.

Previous albums can also be found at

- Stravinski & Bartok: two pianos
- Invitation à la danse
- Nostalgia


Martin

Friday, May 30, 2008

Technology adoption rate in corporate world

Corporations are usually slow in adopting new technology internally... there is usually strong resistance usually among employees to change old habit (the famous comfort zone) or upgrade application implementation barely meeting requirement and specification. A good illustration of this is the too often seen requirement with spec similar as "files X containing all needed info will be sent to Mr. Y mailbox at some specified time schedule".

The email messaging paradigm is still the most natural and the least controversial way for disseminating information to specific recipients among the organization. However, many drawbacks are related to this approach:
  • The publisher application must manage all recipient emails (additions, removals, modifications, etc)
  • The publisher application is also responsible in managing temporary substitution among recipients email (e.g. with vacations, etc..)
  • Sending a large number of messages to various different recipients increase complexity of the publishing application whose scope should focus on the generation of the information
  • Email messaging is less practical for larger data volume content
  • Lack of security: the data sent over mailing application is rarely protected
  • Recipient mailbox is not resilient to failure (e.g. limit space exceeded) resulting in the end-user missing valuable new content delivery
Email used as the communication channel of type Application-to-EndUser, is very frequent everywhere, although a much better and flexible solution exist. RSS feed: RSS stands for Really Simple Syndication. Without going into too much details RSS feed (aka RSS channels) is a mechanism to allow any end-user to receive asynchronously some form of message (e.g. headlines, updates) or even data content published periodically by a provider. The end-user utilizes a RSS Reader (aka RSS aggregator) to stay up to date with new content published without having to know and worry about the publishing schedule. Simple RSS aggregators are directly available inside common web browser and more advanced ones are also available for free.

Some commonly uses of RSS feed include:

  • Notification of new data content within a web site (either just a summary or the full content), typically used by weblogs and news websites.
  • Notification of the arrival of new products in a store.
  • Listing and notifying you of newsletter issues, including email newsletters.
  • Notification of additions of new items to a database, or new members to a group.
  • Weather and other alerts of changing conditions.
Advantages of RSS:
-sophisticated security model can be implemented with RSS by leveraging the web security rules and mechanisms available in the company intranet/portal ;
-the management of all different messages content to all different recipients are off loaded from the publisher responsibility into the individual end-user recipients (except for security which can be managed at the web page level).... allowing the publisher to focus on the data content instead of delivery concern;
- Publisher application has a more standard and accepted way to publish and disseminate ad-hoc type message content (report, data, news, etc,,) among the end-user community within the organization.



Also interesting is the possibility that RSS can offer to corporate intranet and portal: RSS in the intranet. Some people even suggest RSS as a replacement of the email, as a way to get it over with the spamming issue or other shortcomings such as not being able to embed video within email directly.

Martin

Sunday, May 18, 2008

Sel des Alpes

Et oui, le sous-sol de la Suisse ne contient pas trop de pétrole mais on y trouve du sel! En fait, dans une autre ère géologique (200 million d'années.. ces échelles de temps m'apparaîtront toujours inconcevables??), la mer se trouvant sur ce territoire s'évapora et le sel laissé par cette évaporation se trouva pris sous le plissement de la formation alpine.

En jugeant de l'effort qu'ils ont mis pour l'extraire, on comprend bien que le sel était le pétrole de l'époque (début de l'extraction à partir des galeries souterraines fut réalisée en 1684). Les galeries étaient tout simplement creusées au marteau et à la cisette... avançant quelques cm par jour, un seul puit pouvant prendre plus de 26 ans à construire!


Aujourd'hui, le sel de la mine de Bex est extrait en injectant de l'eau sous pression dans les trous forés. Ce forage se fait avec des couronnes (têtes des foreuse couvertes de diamant industriel) qui carottent le roc à plus de 10m par jour! La saumure arrivant par le retour d'eau est saturée à 30% de sel (10x l'eau de mer) et est par la suite canalisée vers une usine afin d'y extraire le sel. La mine peut se visiter car, quoiqu'encore fonctionnelle, tout est automatisé et aucun mineur n'est normalement présent (ils recoivent des sms en cas de pannes ou anomalies!).


La particularité de cette mine qui se trouve par endroit à plus de 450m sous-terre (en fait sous la montagne) est qu'il fait une température stable de 17c. Ceci est dû au gypse déshydraté (roche anhydrite) qui absorbe une grande quantité de l'humidité ambiante... dégageant ainsi de la chaleur. Donc, température fixe, humidité fixe... endroit idéal pour la conservation du vin. Et oui ceci est bien une cave à vin en plein mine sous terre:




On y voit aussi d'autres curiosités comme des fistules (sorte de stalactites creuses... l'eau y coulent de l'intérieure) composées de sel formé par la condensation de l'humidité ambiante... elles ont une croissance rapide du mètre par an (lignes fines sur le fond de la photo):



Mathias ici absorbé par toutes ces explications...



Laurie et Mathias avant le retour au monde extérieur grâce au train franchissant plus de 1.5 kim de couloir étroit:




Du sel, on en trouve un peu partout...en voici formé le long des parois d'une galerie.




En conclusion, ce fut une journée très agrèable et enrichissante passée en famille! Maintenant on sait l'origine du sel des Alpes (tout le sel acheté dans le canton de Vaud provient de cette mine), et sa grande pureté conservée par des millions d'années passé au coeur du roc alpin.

Martin

Wednesday, May 07, 2008

EAI

Most BI architecture found within enterprise today does not exploit the integration capacity offered by more recent technology. These are more typically leveraged by other application systems in the operational area inside the enterprise IT infrastructure. But before giving some thoughts on the reason why (more on this in a coming blog), first I’d like to give more detail on the concept of application integration. Traditionally, this subject has been referred to as the TLA EAI.

Instead of relying on a more prose-like form, I thought to make use of the mind map diagram for describing the concept. I really like Mind map as a way to illustrate, navigate, and represent knowledge on specific subject.

So here is my mind map of EIA (using FreeMind ) .

1. static view:








2. Dynamic View at Mind42



The mind map is hosted by mindshare.com which is still in beta, so may not be available at all times!


Here is the same dynamic view embedded as iframe :





From my personal observation when it comes to EAI, BI applications typically limit its integration to:
  • For the upstream spectrum (i.e. fetching data in) : Bacth-file or database loading in otherwords ETL processing.
  • For the downsteam spectrum (i.e. disseminating the info out) : things usually are limited to sending flat files to external system at scheduled time. Here I only refer to integration between different system applications without including desktop user-type application, where things are different.


Martin

Thursday, May 01, 2008

Visite au château

Aujourd'hui nous sommes allés visiter le Château de Chillon! Nous étions déjà allés avant que les enfants soient nés, mais avec les enfants ça comportait un peu plus d'émerveillement et de magie! Ce château est vraiment typique avec ses tourelles, ses toits en pente, ses douves naturels (le château se situe en fait sur une île rocheuse), son donjon.... c'est son emplacement qui le rend unique. Il est protégé d'un côté par les escarpements des alpes vaudoises et de l'autre par le lac Léman. Les plus anciennes mention du château date de 1150 et sa période la plus marquante est liée aux Ducs de Savoie qui contrôlaient ce territoire stratégique chevauchant la fontière franco-italienne.

Voici quelques photos de cette après-midi passé en famille...



Laurie et Mathias !

Kim et les enfants se racontant des peurs..



une vue sur l'autoroute traversant longeant le lac.


une vue sur le lac



moi et les enfants avec le château en arrière plan.


Martin

Sunday, April 27, 2008

Decorating RPC server call

In RPC service layer, I often need special processing to occur before/after some of the call methods. For example, I may want to gather various access statistics related to some of the methods, compress the response when it exceeds some maximum threshold, or yet simply providing a cache response to speed things up!

So in essence, I need to intercept specific RPC calls to provide extra service to these calls and optionally even taking responsibility of handling the call without reaching the real service layer (e.g. as in the case of caching). The logical answer to this need would be to use a AOP solution (Aspect-Oriented Programming), however my service layer are already intercepted by some aspects to manage orthogonal concern such as transactional processing and security handling. And defining additional aspects around my service methods seem counter-intuitive especially for aspects that are relatively sparse (i.e. only apply to a few methods/service).

My solution to this problem is simply leveraging the Decorator design pattern. Conceptually, this pattern provides a way to attach additional responsibilities to object dynamically, i.e. here I could add auditing ability or caching ability to the service object. The next UML figure presents the class diagram involved in my solution. It is a slightly modified version of the classic pattern because both my concrete service object (to be wrapped by decorator) and my decorators inherit the same super class. This is more a convenience to centralize the various steps originating from GWT RPC handling mechanism with the template method pattern. The drawback is that all decorators have an annoying dependence on the GWT library. This is fine for my scenario, but I may have to refactor this in order to improving testability.








I’m providing the skeleton source code for the main classes involved, feel free to adapt them to your needs.
(no longer has access to my uploaded file, so I just removed these for now)


Martin

Thursday, April 24, 2008

BI and technology adoption

To follow-up on a question raised by someone at my consulting firm... why is BI group usually late adopter (compare to other group inside the enterprise) in terms of technology?

In fact, I've been asked this question by a manager, and at first, I did not exactly what to respond, actually my first reaction was to think that the big organizations were reluctant and hesitant to add more technology to a platform already loaded (or bloated?) with tools, difficult enough to manage and for which ROI is certainly not obvious to calculate.

After putting additional thoughts, I now feel that reasons are found inside and not outside BI. Traditionally the BI designer and architect come from a database background and culture, and these have a tendency to be more skeptical about new technology (they may well be right on that one!), whereas the general software development crowd usually come from computer science background very much inclined in looking into latest innovations ...


In general I have observed that it is among people running more operational systems, who are already used in adopting technologies, that will turn down proposal to connect to the BI platform using less traditional way. It is rather BI group itself which keeps proposing to send flat files to feed other external systems or give read-only access to their database (because these are familiar communication channel coming from the familiar ETL process). And when you propose to expose these information as web services instead: you get a funny look!

The outcome of this fact is that we often end up with BI platform that is very isolated (silo-type application) from the rest of the corporate integrated architecture. This penalizes the potential usefulness of BI... which could be leveraged better and exploit in a more transparent and integrated way into the existing corporate Business Process.


Hence there is no doubt that BI would gain by adopting technologies like web services, and architecture such as SOA, ESB? And there are a lot of initiatives along these lines... this is inevitable.


Martin

Saturday, April 12, 2008

Are we settled now?

All the places I once called home!

I was counting the number of places I lived in recently and this number seemed completely unreasonable... so I decided to blog about it mostly for my wife so she can see that it may well be the time to settle. Although things were quite stable at first (I actually lived for the first 18 years in a single place), it all changed once I moved out of my mom's place!

In case you are wondering, no I'm not 65 but only 36 years old...ok almost 37 now.

Here's the map:

View Larger Map


Here's the list:


  1. Chicoutimi: My first Home!
    Well almost the first, but I did move there at the age of 2 months-old...and left at the age of 19 years-old! Year: 1971-1990
  2. Regina : My first summer trip
    Spent about two months there to learn our national second official language! Year: 1989
  3. Vancouver
    Supposed to spend a full summer there with a friend, but we actually returned home prematurely ... I had to return right after we found our first job. Year: 1991
  4. Montreal: My first apartment
    2510 Bldv Édouard-Montpetit, Montréal. Did my first two years of University there..with two other good friends. Year:1990-91
  5. Worcester: WPI in the dorms
    I've completed my 3rd year of B.Eng. Year: 1992-93
  6. Montreal: Last apartment where I completed my B. at Ecole Polytechnique
    3210 Bldv Édouard-Montpetit Year:1993
  7. Montreal: First apartment with Kim
    2910 Av Linton Year: 1994
  8. Montreal: Second apartment with Kim
    2910 Av Linton Year: 1994
  9. Montreal: Third apartment with Kim
    Av Papineau Nice view of the park! Year: 1995
  10. Montreal: Fourth apartment with Kim
    Av Papineau Yes believe it or not, we moved next door to have an extra room, sigh!! Year: 1996
  11. Montreal: Fifth apartment with Kim
    6654 de Lanaudiere Well things are getting out of control..I have a solution! Year:1997
  12. Iasi: for Work
    I've been in and out of this place for work. It literally opened my eyes to the world, and I also met quite interesting and fun people. Year: About 4 months during 1998-1999
  13. Montreal: The first place we owned
    6554 rue de la Roche. Here's the solution: we bought a nice duplex...things should stabilize now, well that was my plan! Year: 1998-1997
  14. Tonbridge Wells: my sister place
    Stayed at my sister place for a couple of months waiting for my Swiss work permit Year: 2000
  15. Lausanne: Seventh place with Kim
    Saint-Roch. First apartment we rented in Lausanne. Small and..expensive (ok this is Switzerland) Year: 2000
  16. Lausanne: Eighth place with Kim
    Cite-Devant. Our second apartment in Lausanne, much nicer and right in the old part of Lausanne. This is where my daughter was born. Year: 2001-02
  17. Vaudreuil-sur-le-lac: Nineth place with Kim
    26 des Caryers. The house we bought. Year: 2003-2007
  18. Laval: Tenth place with Kim
    Du Bouvreuil. The place we rent for 6 months before going back to Europe. Year: 2007
  19. Epalinges: Eleventh place with Kim
    De la Jaquiere. This is our current location! Year: 2008-?

Martin

Tuesday, April 01, 2008

SQL Analytic


In my current consulting activity, I’m involved in a project relying on Oracle 10g for most of its data warehouse infrastructure. I thought it would be a nice opportunity for me to brush-up on my SQL skills.

The OLAP SQL functions (also referred to as Analytic Functions) come in very handy when dealing with data reporting or analytical needs. So this post will summarize the SQL analytic functions available in Oracle (some of them since 8i and other since 9i).

Although reports produced using these functions could very well be done using SQL or PL/SQL workarounds, these would be more clumsy and potentially less than optimal solution (depending on how well Oracle Optimize process these functions).


These functions can be roughly classified into these categories:

1. Ranking (show top 5 or bottom 5?),

2. Reporting Aggregation (compare values at different level of aggregation, e.g. region sales versus national, market share?),

3. Window Aggregation (moving average, cumulative sum?)

4. Row comparison (studying change or variation over sequential row, LAG/LEAD, or get first and last value of sorted groups with FIRST/LAST?)

It is important to note that these functions operate just before the ORDER BY clause of a query (which occurs last on the SQL process sequence order), or at the very last step when no such clause is present. Also important, these functions are not allowed within the WHERE, FROM and HAVING clauses, and are really meaningful within the result set of a query (i.e. in the SELECT clause) and more rarely in the ORDER BY clause.

The follow the following generic form:

function(<arguments>) OVER(<analytic clause>)

where

+function is the analytical function (e.g. AVG, CORR, COVAR_POP, COVAR_SAMP, COUNT, CUME_DIST, DENSE_RANK, FIRST, FIRST_VALUE, LAG, LAST, LAST_VALUE, LEAD, MAX, MIN, NTILE, PERCENT_RANK, PERCENTILE_CONT, PERCENTILE_DISC, RANK, RATIO_TO_REPORT, STDDEV, STDDEV_POP, STDDEV_SAMP, SUM, VAR_POP, VAR_SAMP, VARIANCE)

+arguments is optional and could include more than one (<argument1, argument2, argument3>)

+analytic clause can be of one the following: Query Partition clause (to break a result set into multiple partitions according to a criteria set expression); Order-By clause (for sorting data into each partition); and Windowing clause (to define a window of data).


1. Ranking functions

These functions role is to provide ordering info to records based on some given attribute. The basic three functions available (i.e. ROW_NUMBER, RANK and DENSE_RANK) only differ in the way they manage ordering ties. Here’s a very simple sample to illustrate the differences:


RANK and DENSE_RANK rules allow for the top-n query, which is not possible with ROW_NUMBER as it does not treat tie.


Note that we can also control the orderings of nulls value by specifying the self-explanatory clauses NULLS LAST or NULLS FIRST (default) after the “ORDER BY attr” clause.

Other functions can be classified within the Ranking category : PERCENT_RANK, CUME_DIST. They operate very similarly as the previous ones (e.x. PERCENT_RANK() OVER(ORDER BY attr), but compute the cumulative fraction typical of histograms.

In conclusion, the ranking functions offer a better alternative than relying on the well-known hack (creating a subselect virtual table with ORDER BY used in combination with the ROWNUM function) that can handle tie correctly.


2. Reporting Aggregation functions

Most common aggregation SQL functions (like SUM, COUNT, AVG, MAX, MIN, VARIANCE, etc) can be used as analytic functions as well, eliminating the constraint of having the aggregate value to be at the same level as the row set (mandatory when using GROUP BY). We can then have a global aggregated value presented with all data rows, as well as an aggregated value at a different partitioned window level all in a single query statement. Here’s a self-explanatory example with AVG:


Also belonging in this category is the RATIO_TO_REPORT which gives ratio of a value versus an aggregated comparator. Actually, this function is simply a shortcut version of : value / SUM(value) OVER() == RATIO_TO_REPORT (value) OVER().

We also include in this category the function ROLLUP and CUBE which both provide aggregated values at higher level (the difference being that CUBE will provide aggregate values throughout all combination of attributes) as illustrated by this simple example:


Notice the use of GROUPING function (which return 1 when aggregation was done over a specified attribute and 0 otherwise) to help differentiate between NULL values in the table and artificial NULL generated for reporting purposes.

Window Partitioning Operator

We often used in combination with the Ranking and Reporting aggregation functions, an operator known as the window partitioning operator. This operator role is to provide a way to separate data into grouping and perform the functions on these groupings. It relies on the use of PARTITION BY placed in the analytic clause. Here’s a simple example illustration the window partitioning used with the RANK() function:


We can see that the second RANK function now operates on a defined grouping (here defined by Grouping column) and not the overall set of rows.


3. Window Aggregation functions

These functions permit the calculation of moving average on a set of ordered data records. For example, to get a moving average using three data points window (one in the past, one current and one in future), we could use :

AVG(value) OVER(ORDER BY t ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

As found in the following sample:


Note that for missing values on the first and last record, the preceding and following records are considered NULL, and thus not used in the AVG function (see the first moving AVG value: 150 which is calculated from only 100 and 200).

This is a general rule applicable for treating NULL values when doing aggregation function, i.e. always ignored in the calculation.

The window aggregate function can also be used to calculate running or cumulative sum. This is possible using the ROWS UNBOUNDED PRECEDING and CURRENT ROW clauses for the window boundary definition. This gives:


As a final comment about this category of functions, let’s note that as in the case of ranking and report aggregation, it is possible to partition their calculation using the PARTITION BY clause.


4. Row Comparison

The row comparison functions are very useful for showing previous and subsequent records data on the same row as the current one within an ordered sequence of records. These functions are LAG and LEAD. These again are very simple to use as demonstrated in this small example:


The more generic format allow us to define offset and default values for NULL, i.e.: LAG(attr, offset, default_null).

Again, these functions can also be partitioned similarly as the previous ones. Anyone who has hacked a solution for this type of report by relying on self-join query can certainly appreciate the clearness and compactness of these functions.

Martin

Saturday, March 22, 2008

Functional or Technical Focus

In my professional life, I’m constantly confronted and hesitating between two career tracks:

  1. Focus more on functional area and increase my business expertise and knowledge on specific industries or business domains;
  2. Focus more on technical area and increase my IT technical knowledge on specific set of technologies, language, framework without any specific business focus.

Note that I've highlighted the verb focus here, since most IT work done in enterprise has a very important business aspect. So unless you are working for a highly technical business sector, you can't get away in IT without any business knowledge and culture.


Recently I’ve leaned more toward the technical side, mainly because in my freelance practice, I had a lot of software development activity. Surely the best way to learn and acquire real knowledge about technology is to actually deep into it by doing real development yourself (expressed clearly in this famous B. Franklin quote: "Tell me and I forget, teach me and I remember, involve me and I learn"). However, this requires a lot of learning and adaptation because of the fast pace of technology change and evolution.

Since my arrival to Sword in Switzerland, it seems as if I may have to reconsider this focus as the bulk of software development work is done offshore and I'm more involved in functional specification. I’m not making a big deal out of this, since I’m currently involved in the telco industry which has a lot of technical focus and is also very challenging and constantly evolving!

And besides, there will always be the open source world where a lot of possibility exist to practice and maintain my software development skills. But for the time being, I can't even consider that…, even my own personal projects had to be put on the backburner.


Martin

Thursday, February 14, 2008

Vacation over!

In our hectic occidental life, we are not used to stop doing what we usually do, i.e. work (and shop by judging on the popularity of shopping mall)! My break lasted for more than 4 months, in which I did enjoyed playing with the kids, reading more books than the last 4 year, biking around 1000km (although it was late in the year) and did various other things we usually don't have time doing during our short 2 days weekend break (BTW, yes I must confess I also did work during this break!). I guess it looked fun, since my wife got jealous and decided to take a break with us as well!

But it seems we are well programmed to live our active life which is not difficult to understand considering that we are brought up to it at very early stages (when I see those 4-5months old at aycare, sigh!). So after a while I was quite motivated to go back to work, but first I needed to find one.

Although I have my own consulting company, contracts don’t come so easily when you are a foreigner in a foreign country. I’ve worked in Lausanne before, but mostly involved in job at the backend, i.e. the RDBMS. My experience acquired within my consulting firm helped me broaden my knowledge in the J2EE environment and improve my ability as a consultant. This is the sort of skills I want to exploit in my new job.

So that means starting all over again and look for jobs the normal way, i.e. sending resumes, meeting new people and company and go through interview. Not the most fun, however I decided to take it seriously. The thing is, in my previous two jobs, I did not bother much about sending resumes and going through interviews. Actually I targeted only a single company, went through the normal hiring process and got lucky enough to get the job I was interested in.

So before leaving Canada, I actually checked the job market, identified a few potential firms/jobs and send them a link with my online resume. I started with about 5 or 6 of them, from which there were middle man ("intermédiaire"). I though that this would be enough as a first step and I could find additional target once arrived here. I must say the job market for my skills is well active in Switzerland, because this initial sending lead to an impressive list of follow-up:

-6 interviews
-1 psychometry test
-1 technical test
-3 phone interviews, etc… and 4 job proposal!!

p.s. Don’t underestimate the effect of the middle-man which can have a multiplicative effect.

Comparing this with my first job interview at Lausanne, for which I felt I was being sold a job rather than the opposite, I must say that things are more professional and most firms take recruitment very seriously. I've been through very high-level technical interview, challenging test, and very precise questions requiring thought-out answers and leaving not much place to subjectivity.

This took me quite some time and energy but I’m happy to have dedicated this effort because at the end this pays off and offered me the luxury to choose a job that meets most of my criteria (in order of importance):
1- type of work involved
2- type of technology involved
3- advantages like salary, vacation (of course!)
4- location of work
5- type of work environment


I’m happy to announce that I have accepted a job as a consultant for SWORD. This job will give me the opportunity to see former colleagues (because the first contract is at Orange), work not too far from home (Geneva looked cool but the commuting would be a bit too long, at least until they finally open the new metro M2 line at Lausanne), and I'm given the opportunity to exploit two of my expertise BI and J2EE!


Martin

Saturday, January 12, 2008

Arrivée en Suisse


Les deux dernières semaines ont été très occupées pour toute ma petite famille… nous avons organisé notre départ de Montréal pour aller s’établir à Epalinges juste au nord de Lausanne à quelques 830 mètres d’altitude (donnée importante dans cette région du monde puisqu’elle détermine la présence de neige en hiver).

En plus de toute l’organisation reliée au départ d’un pays, on a dû affronter les tâches reliées à l’arrivée dans un autre pays. Et l’arrivée fût un peu perturbante puisque le container avec tout notre mobilier est en fait arrivé en retard et ma femme n’a pas encore officiellement son permis de travail (une simple formalité … mais qui nous empêche pour l’instant d’être des citoyens avec les mêmes droits que les autres…. dans nos sociétés “modernes” ceci veut dire consommer). Donc nous avons campé dans notre nouvelle maison avec matelas d’appoint et le stricte minimum pour plus d’une semaine. Ceci veut dire pas de tv, pas de radio, pas de téléphone (on a finalement pu acheté un téléphone avec carte prépayée seulement), et ….le plus difficile pour moi, par d’Internet!


C’est inquiétant comment je suis rendu dépendant à l’Internet, en fait j’ai pas eu de souci pour la tv, le téléphone et la radio mais impossible de vivre sans ce monstre. Je m’aperçois que j’ai comme plusieurs pratiquement tout réorienté mes sphères d’activités vers le TCP/IP… scary !!! Ex: communication avec la famille sur Skype, email, et blog, transfert et opération bancaire via site bancaire, projets de développement storés sur site en-ligne, mis au courant des nouvelles, guide d’achat et localisation des commerces, etc... (Parenthèse professionnelle: pour quelqu’un qui fait de l’architecture de système, je devrais modifier cette dépendance des plus fragile afin que mes moyens de communication re-deviennent plus résiliente et robuste aux échecs « tolerance to failure »).

En ce qui concerne notre villa, tout est vraiment bien et nous avons en bonus une belle vue sur les alpes à partir des fenêtres des combles (Bernoises/Valaisannes et de la Haute-Savoie française)-- voir photo en debut de texte.


Martin

p.s. étant éloigné des miens restés au Québec, ce blog va prendre une tangente plus orientée personnelle, avec par contre toujours des sujets techniques qui devraient êtres nourris par mes expériences dans le domaine de la consultation.

Monday, December 10, 2007

Quick solution for Spring & GWT integration

As promised in my last post, I'll describe here how I proceeded to integrate my service bean layer managed by the Spring container with the RPC mechanism offered by GWT.

GWT toolkit offers a custom servlet (RemoteServiceServlet) from which we can inherit in order to let client code calls server-side code asynchronously. The solution I implemented was to create a base Controller which simply extends the Google RemoteServiceServlet. See code below.
(I no longer has access to these files, so I just removed them for now)




By subclassing this new base Controller, all my service-bean classes become now GWT-RPC compatible. This simple solution has some drawback such as adding a compile-time dependency between my service-bean and the Spring framework/GWT, however that is just fine for my specific use-case. More clever solution could also make use of reflection in order to leave your service leaving the service-layer classes free of such dependency, however this will come at a price of more intense processing needs. For those interested see the GWT Server Library initiative.

However for me, this simple solution offered a very convenient caching mechanism to improve performance all client accessing these service-beans. Since I have
some RPC service objects on the server layer for which result are cached to avoid the expensive database access hit. Because these result objects contain long object graphs (a few number of association at various depth level..), I also wished to avoid the GWT serialization process involved at every hit of these cached object graph. To achieve this, I wanted to store the GWT-serialized version
of my result objects instead of the normal de-serialized graph. The cache is planned to refresh itself at regular interval...

All my service-bean achieve this by optionally intercepting the RPC request (i.e. override the method 'processCall') and use the GWT-serialized value when available in cache (see example below).
(I no longer has access to these files, so I just removed them for now)




Martin


Friday, November 23, 2007

Web development

Up until my current project which uses GWT to develop a rich web client, I always followed the best practices in terms of Web development. I used to develop thin and dumb client view (e.g. jsp) which were fed and render based on data model objects and eventually sent back to the web client.

All web requests are taken care by some dedicated controller (or action in Struts parlance) that are responsible in analyzing the user request, delegating the request to the service layer (the core of the application where business rules usually sits), obtaining the return domain object from the service and preparing the response by selecting the proper view to be rendered and sent to client. Ok, that is a very brief and incomplete description of the MVC pattern adapted to the Web server and HTTP protocol. Although this design pattern may be overkill for smaller applications, the advantages (e.g. makes web applications that are easier to maintain and are logicially divided into layers that are inherently decoupled and whose focus are on very different software concern) usually outweight the additional learning curve and relative complexity.

A great deal of coding must be done on the controller aspect of the MVC. And a lot of this includes details originating from handling the request/response of the stateless HTTP protocol...which has very little to do with the main application business logic. If I'd have the choice, I'd rather spend this time developing and improving the business objects domain, the related business rules logic and the database model, i.e. my preferred subjects and expertise!


With the advent of AJAX Web 2.0 fat client, a great deal of the weight that used to sit on the web server shoulder implementing this MVC pattern has now moved toward the client sitting on the other side of the communication channel. Web clients now make asynchronous RPC (remote procedure call) to the server without having to deal with the of HTTP concern details (for example the RPC mechanism of the GWT API isolates client code these). They can also now handle their own session state by keeping and handling the data model locally.

The server can focus less on the "C" of the MVC, and more on the service core layer designed to enforce and apply all business rules logic. The client code can choose to implement the traditional MVC pattern, when its complexity justifies it.

In my current project, all web controller codes disappeared and my web application does not move anymore from one page to another (following subsequent user request), but rather change its unique page appearance (by replacing/changing section of page through DOM manipulation) followed by user action and RPC response from the server.

My next post will present the way I've implemented my RPC client code to talk directly to my service layer using the Spring Framework. Now, I need to get back to work!

Martin