Showing posts with label Community. Show all posts
Showing posts with label Community. Show all posts

Monday, October 5, 2009

Internationalization and my two-tiers-utils library

This is a follow-up article of Internationalization of GAE applications, which itself is part of the series Web Application on Resources in the Cloud.

In my initial article, I explained some hurdles of globalizing applications, especially the ones being implemented with many programming languages. In this article, I'm going to describe few use-cases and how my open-source library two-tiers-utils can ease the implementation. Here are the covered topics:
  1. Get the user's preferred locale
  2. Display messages in different locales
  3. Handle localized messages with different programming languages
  4. Generate the localized bundles per programming language
  5. Bonus

Get the user's preferred locale

For this use-case, let's only consider the Java programming language. Another assumption is the availability of the localized resources in the corresponding Java format (i.e. accessible via a PropertyResourceBundle instance).

In a Web application, the user's preferred locale can be retrieved from:
  • The HTTP headers:
    locale = ((HttpServletRequest) request).getLocale();
  • The HTTP session (if saved there previously):
    HttpSession session = ((HttpServletRequest) request).getSession(false);
    if (session != null) {
      locale = new Locale((String) session.getAttribute(SESSION_USER_LOCALE_ID));
    }
  • The record containing the user's information:
    locale = ((UserDTO) user).getPreferredLocale();
To ease this information retrieval, the two-tiers-utils library provides the domderrien.i18n.LocaleController class

Excerpt of public methods offered within domderrien.i18n.LocaleController

This class can be used in two situations:
  1. In a login form, for example, when we can just guess the desired locale from the browser preferred language list or from an argument in the URL.
  2. In pages accessible to identified users thanks to the HTTP session.
Usage example of the domderrien.i18n.LocaleController.detectLocale()
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<%@page
    language="java"
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="org.domderrien.i18n.LabelExtractor"
    import="org.domderrien.i18n.LocaleController"
%><%
    // Locale detection
    Locale locale = LocaleController.detectLocale(request);
%><html>
<head>
    <title><%= LabelExtractor.get("dd2tu_applicationName", locale) %></title>
    ...
</head>
<body>
    ...
    <img
        class="anchorLogo"
        src="images/iconHelp.png"
        width="16"
        height="16"
        title="<%= LabelExtractor.get("dd2tu_topCommandBox_helpIconLabel", locale) %>"
    />
    ...
</body>
</html>

The same message in different locales

The previous example introduces also a second class: domderrien.i18n.LabelExtractor. Being given an identifier, an optional array of Object references, and a locale, the get static method loads the corresponding string from the localized resource bundle.

Excerpt of public methods offered within domderrien.i18n.LabelExtractor
A series of localized entries like en:“Welcome {0} {1}”, fr:“Bonjour {2} {1}”, and ja:“お早う {0}{1}” can be easily invoked with a simple command like: LabelExtractor.get("welcome_message", new Object[] { user.getFirstName(), user.getLastName() }, user.getLocale());.

The same message used from different programming languages

Java is a pretty neat language with a large set of editors and code inspectors. But Java is not the only languages used for Web applications. If the two-tiers-utils library provides nice Java features, the delivery of the same library interfaces for the programming languages JavaScript and Python libraries makes it way more valuable!

Code of the domderrien.i18n.LabelExtractor.get() method for the JavaScript language.
(function() { // To limit the scope of the private variables

    /**
     * @author dom.derrien
     * @maintainer dom.derrien
     */
    var module = dojo.provide("domderrien.i18n.LabelExtractor");

    var _dictionnary = null;

    module.init = function(/*String*/ namespace, /*String*/ filename, /*String*/ locale) {
        // Dojo uses dash-separated (e.g en-US not en_US) and uses lower case names (e.g en-us not en_US)
        locale = (locale || dojo.locale).replace('_','-').toLowerCase();

        // Load the bundle
        try {
            // Notes:
            // - Cannot use the notation "dojo.requirelocalization" because dojo parser
            //   will try to load the bundle when this file is interpreted, instead of
            //   waiting for a call with meaningful "namespace" and "filename" values
            dojo["requireLocalization"](namespace, filename, locale); // Blocking call getting the file per XHR or <iframe/>

            _dictionary = dojo.i18n.getLocalization(namespace, filename, locale);
        }
        catch(ex) {
            alert("Deployment issue:" +
                    "\nCannot get localized bundle " + namespace + "." + filename + " for the locale " + locale +
                    "\nMessage: " + ex
                );
        }

        return module;
    };

    module.get = function(/*String*/key, /*Array*/args) {
        if (_dictionary == null) {
            return key;
        }
        var message = _dictionary[key] || key;
        if (args != null) {
            dojo.string.substituteParams(message, args);
        }
        return message;
    };

})(); // End of the function limiting the scope of the private variables

The following piece of code illustrates how the JavaScript domderrien.i18n.LabelExtractor class instance should be initialized (the value of the locale variable can come from dojo.locale or a value injected server-side into a JSP page) and how it can be invoked to get a localized label.

Usage example of the domderrien.i18n.LocaleController.get()
(function() { // To limit the scope of the private variables

    var module = dojo.provide("domderrien.blog.Test");

    dojo.require("domderrien.i18n.LabelExtractor");

    var _labelExtractor;

    module.init = function(/*String*/ locale) {
        // Get the localized resource bundle
        _labelExtractor = domderrien.i18n.LabelExtractor.init(
                "domderrien.blog",
                "TestBundle",
                locale // The library is going to fallback on dojo.locale if this parameter is null
            );

        ...
    };

    module._postData = function(/*String*/ url, /*Object*/ jsonParams) {
        var transaction = dojo.xhrPost({
            content : jsonParams,
            handleAs : "json",
            load : function(/*object*/ response, /*Object*/ioargs) {
                if (response == null) {
                    // Message prepared client-side
                    _reportError(_labelExtractor.get("dd2tu_xhr_unexpectedError"), [ioargs.xhr.status]);
                }
                if (!response.success) {
                    // Message prepared server-side
                    _reportError(_labelExtractor.get(response.messageKey), response.msgParams);
                }
                ...
            },
            error : function(/*Error*/ error, /*Object*/ ioargs) {
                    // Message prepared client-side
                _reportError(error.message, [ioargs.xhr.status]);
            },
            url : url
        });
    };

    var _reportError = function(/*String*/ message, /*Number ?*/xhrStatus) {
        var console = dijit.byId("errorConsole");
        ...
    };

    ...

})(); // End of the function limiting the scope of the private variables

The following series of code excerpts show the pieces involved in getting the localized resources with the Python programming language.

LabelExtractor methods definitions from domderrien/i18n/LabelExtractor.py
# -*- coding: utf-8 -*-

import en
import fr
 
def init(locale):
    """Initialize the global dictionary for the specified locale"""
    global dict
    if locale == "fr":
        dict = fr._getDictionary()
    else: # "en" is the default language
        dict = en._getDictionary()
    return dict

Sample of a localized dictionary from domderrien/i18n/en.py
# -*- coding: utf-8 -*-
 
dict_en = {}
 
def _getDictionary():
    global dict_en
    if (len(dict_en) == 0):
        _fetchDictionary(dict_en)
    return dict_en
 
def _fetchDictionary(dict):
    dict["_language"] = "English"
    dict["dd2tu_applicationName"] = "Test Application"
    dict["dd2tu_welcomeMsg"] = "Welcome {0}."
    ...

Definitions of filters used by the Django templates, from domderrien/i18n/filters.py
from google.appengine.ext import webapp
 
def get(dict, key):
    return dict[key]
 
def replace0(pattern, value0):
    return pattern.replace("{0}", str(value0))
 
def replace1(pattern, value1):
    return pattern.replace("{1}", str(value1))
 
...
 
# http://javawonders.blogspot.com/2009/01/google-app-engine-templates-and-custom.html
# http://daily.profeth.de/2008/04/using-custom-django-template-helpers.html
 
register = webapp.template.create_template_register()
register.filter(get)
register.filter(replace0)
register.filter(replace1)
...

Django template from domderrien/blog/Test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>{{ dictionary|get:dd2tu_applicationName }}</title>
    ....
</head>
<body>
    ...
    <div class="...">{{ dictionary|get:dd2tu_welcomeMsg|replace0:parameters.loggedUser }}</div>
    ...
</body>
</html>

Test handler from domderrien/blog/Test.py
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template

def prepareDictionary(Request):
    locale = request.get('lang', 'en')
    return LabelExtractor.init(locale)

class MainPage(webapp.RequestHandler):
    def get(self):
        parameters = {}
        parameters ['dictionary'] = domderrien.i18n.LabelExtractor.init(self.request)
        parameters ['loggedUser'] = users.get_current_user()
        path = os.path.join(os.path.dirname(__file__), 'domderrien/blog/Test.html')
        self.response.out.write(template.render(path, parameters))

application = webapp.WSGIApplication(
    [('/', MainPage)],
    debug=True
)
 
def main():
    webapp.template.register_template_library('domderrien.i18n.filters')
    run_wsgi_app(application)
 
if __name__ == "__main__":
    main()

Generate the localized bundles per programming language

In my previous post Internationalization of GAE applications, I suggest to use a dictionary format that would be programming lnaguage agnostic while being known by translator: TMX, for Tanslation Memory eXchange.

Snippet of a translation unit definition for a TMX formatted file
<tu tuid="dd2tu_welcomeMessage" datatype="Text">
 <tuv xml:lang="en">
  <seg>Welcome {0}</seg>
 </tuv>
 <note>{0} is going to be replaced by the logged user's display name</note>
 <prop type="x-tier">dojotk</prop>
 <prop type="x-tier">javarb</prop>
 <prop type="x-tier">python</prop>
</tu>

The two-tiers-utils library provides a Java runtime domderrien.build.TMXConverter that generates the resource bundles for Java/JavaScript/Python. If a simple series of XSL-Transform runs can do the job, the TMXConverter does a bit more by:
  • Comparing the modification dates of the generated files with the TMX one to generate them only if needed
  • Check the uniqueness of the label keys
  • Generate the list of supported languages
Invoking the TMXConverter runtime from an ant build file is very simple, while a bit verbose:

Ant target definition invoking the TMXConverter
<target name="step-tmx-convert">
    <mkdir dir="${temp.dir}/resources" />
    <mkdir dir="src/WebContent/js/domderrien/i18n/nls" />
    <java classname="domderrien.build.TMXConverter" fork="true" failonerror="true">
        <classpath refid="tmxconverter.classpath" />
        <classpath location="${temp.dir}/resources" />
        <jvmarg value="-Dfile.encoding=UTF-8" />
        <arg value="-tmxFilenameBase" />
        <arg value="${dd2tu.localizedLabelBaseFilename}" />
        <arg value="-sourcePath" />
        <arg value="${basedir}\src\resources" />
        <arg value="-jsDestPath" />
        <arg value="${basedir}\src\WebContent\js\domderrien\i18n\nls" />
        <arg value="-javaDestPath" />
        <arg value="${temp.dir}/resources" />
        <arg value="-languageFilenameBase" />
        <arg value="${dd2tu.languageListFilename}" />
        <arg value="-buildStamp" />
        <arg value="${dd2tu.stageId}" />
    </java>
    <native2ascii
        src="${temp.dir}/resources"
        dest="${temp.dir}/resources"
        encoding="UTF8"
        includes="*.properties-utf8"
        ext=".properties"
    />
    <copy
        file="${temp.dir}/resources/${dd2tu.localizedLabelBaseFilename}.properties"
        tofile="${temp.dir}/resources/${dd2tu.localizedLabelBaseFilename}_en.properties"
    />
    <mkdir dir="src/WebContent/js/domderrien/i18n/nls/en" />
    <copy
        file="src/WebContent/js/domderrien/i18n/nls/{dd2tu.localizedLabelBaseFilename}.js"
        todir="src/WebContent/js/domderrien/i18n/nls/en"
    />
</target>

With the TMX file as the source of thruth for the label definitions, it is just a matter of altering the value a <prop/> tag and running the build once again to move one label definition from one programming language to another. No more error prone copy-and-paste of text between different file formats!

Excerpt of the generated Java resource bundle
bundle_language=English
unit_test_sample=N/A
dd2tu_applicationName="Test Application"
dd2tu_welcomeMessage=Welcome {0}
...
x_timeStamp=20091001.1001

Excerpt of the generated JavaScript resource bundle
({bundle_language:"English",
unit_test_sample:"N/A",
dd2tu_applicationName:"Test Application",
dd2tu_welcomeMessage:"Welcome ${0}",
...
x_timeStamp:"20091001.1001"})

Excerpt of the generated Python class definition
# -*- coding: utf-8 -*-
 
dict_en = {}
 
def _getDictionary():
    global dict_en
    if (len(dict_en) == 0):
        _fetchDictionary(dict_en)
    return dict_en
 
def _fetchDictionary(dict):
    dict["_language"] = "English"
    dict["dd2tu_applicationName"] = "Test Application"
    dict["dd2tu_welcomeMsg"] = "Welcome {0}."
    ...
    dict["x_timestamp"] = "20091001.1001"

Bonus

The TMXConverter being part of the build process and going over all localized TMX files, it generates the list of supported languages.

JSP code fetching a HTML &ltselect/> box with the list of supported languages
<span class="topCommand topCommandLabel"><%= LabelExtractor.get("rwa_loginLanguageSelectBoxLabel", locale) %></span>
<select
    class="topCommand"
    dojotType="dijit.form.FilteringSelect"
    id="languageSelector"
    onchange="switchLanguage();"
    title="<%= LabelExtractor.get("rwa_loginLanguageSelectBoxLabel", locale) %>"
><%
    ResourceBundle languageList = LocaleController.getLanguageListRB();
    Enumeration<String> keys = languageList.getKeys();
    while(keys.hasMoreElements()) {
        String key = keys.nextElement();%>
        <option<% if (key.equals(localeId)) { %> selected<% } %> value="<%= key %>"><%= languageList.getString(key) %></option><%
    } %>
</select>

The following figures illustrates the corresponding code in action.

Part of a login screen as defined with the default (English) TMX file.


Part of a login screen as defined with the French TMX file.


Conclusion

The two-tiers-utils library is offered with the BSD-like license. Anyone is free to use it for his own purposes. but I'll appreciate any feedback, contribution, and feature requirement.

See you on github.com ;)
“May the fork be with you.”

A+, Dom

Friday, June 12, 2009

JavaOne Conference


Duke and myself ;)
It has been a long week in San Francisco while I was attending the JavaOne conference. Sessions started at 8:30 AM and finished after 9:30 PM!

Among all reviews that have been published, read this ones: Community day on Monday, Conference day 1 on Tuesday, Day 2 on Wednesday, Day 3 on Thursday, and Day 4 on Friday. Sun's website contains also a complete list of conference articles. Pictures of the event are available on Sun's Photo Center website.

I went there with two objectives:
  • See JavaFX in action;
  • Look at all efforts around JavaME and the MSA initiative.
JavaFX technology stack


Eric Klein, Vice President, Java Marketing, Sun Microsystems
I came without preconceived idea around JavaFX, just with my background as a JavaScript/Java developer and my knowledge of Flex and AIR.

The first deception came from looking at the scripting language: Man! they invented yet another language :( For sure, the JavaFX scripting language is nicely handled by NetBeans 6.5+ (except the code formatting) but new paradigms and new conventions are a big barrier to adoption to me. Can you figure out what the following code is doing?

public class Button extends CustomNode {
  public var up: Node;
  content: Node = up;
  public override function create(): Node {
    return Group {
      content: bind content
    }
}
If the visual effects to animate texts, pictures, and video are really great, the native support of a sound library is really missing! For example, I would expect to be able to synchronize KeyFrame objects with sound tracks but the KeyFrame.time attribute has to be set manually—not very flexible when it's time to change the sound track...

The pros are:
  • A coming visual editor to prepare clips;
  • A large library of image and video effects;
  • The multi-platform support, especially for mobile devices.
Platform dependent packaging is nicely handled: NetBeans project properties pane provides choices among {Standard Execution, Web Start Execution, Run in Browser, Run in Mobile Emulator}. As a Web developer, I am just sorry to see that the application window size cannot be expressed in percentage, that the auto-resizing is handled transparently, which is not better than usual Flex applications.

Last point: I have not seen how to invoke JavaFX handlers from JavaScript ones, and vice-versa, when the application is deployed to run in browsers. If you have a source for these information, please, drop the link in a comment.

JavaME technology stack


Christopher David, Rikko Sakaguchi and Patrik Olsson
during Sony Ericsson General Session
This was definitively the most interesting domain to me. During one session, it has been announced that 60% of shipped mobile devices in 2008 are Java-enabled. In 2009, the market share should grow up to 70%. In relation with the iPhone, Scott McNeally did this joke: the possible future Sun owner Larry Ellison might succeed to open the iPhone platform to Java because he is a well known friend of Steve Jobs.

Compared to the Java Standard Edition (J2SE) and the Java Enterprise Edition (J2EE), the Java Mobile Edition (J2ME) has more external contributors. Under the Mobile Service Architecture (MSA) initiative, a lot of mobile device manufacturers and telecommunication operators participate to the Java Community Process (JCP) to deliver Java Specification Requests (JSRs). Note that MSA itself is defined as a JSR: JSR 248. As of today, most of the recent phones are MSA 1.1 compliant (this is a mandatory requirement for the telco Orange, for example). Nokia and Sony Ericsson have shipped a lot of MSA-compliant handsets, LG, Samsung, and Motorola shipped very few ones. The standard MSA 2 (JSR 249) is being finalized and it contains the promising JSRs:
Additional APIs I imagine many developers are looking forward: JSR 257 Contactless communication API and JSR 229 Payment API.


MSA evolution and its JSR set
(from the MSA specification documentation)
(click to enlarge)

All major manufacturers have opened or are opening "App Stores" a-la Apple. They open also their development platforms. More companies will be able to adapt their software offering to mobile devices. Even Sony allows anyone to write application to run in Blu-ray Disc players. The main difficulty on developer-side is the fragmentation: there is no standard API allowing to discover the features supported by a device! Developers have to rely on each manufacgturer's feature list and on exception handling :(

The Blackberry platform is pretty well controlled and should be easy to develop on. Then follows Sony Ericsson which provides consistent phone classes (i.e. what works for one phone in the JP 8.4 class work for all phones in that class). The delivery of the Sun JavaME SDK 3.0 containing many third-party emulators (even one for Windows Mobile devices) added to better on-device deployment and on-device debugging capabilities, should motivate more and more developers.

I have not enough experience with Android (just got one Android dev phone two weeks ago) to compare it to the JavaME technology stack. I don't know neither about Symbian (Nokia devices) or LiMo (Motorola devices) platforms.

Exhibition hall

Besides the visit of mobile device manufacturers (RIM and Ericsson) booths, I visited:
  • Sun's project Fuji (open ESB) with a Web console using <canvas/> from HTML5, like Yahoo! Pipes.
  • Convergence, the Web client for Sun's communication suite, built on the top of Dojo toolkit ;)
  • INRIA (French national R&D lab) for its static code analysis Nit.
  • Isomorphic Software for its SmartClient Ajax RIA System.
  • eXo Platform (on OW2 booth) for its eXo Portal offering.
  • Liferay, Inc. for its eponymous portal.
Other discoveries


James Gosling and myself ;)
I attended very good presentations, like the opening keynote which was fun. Among the good presenters, I can mention (ordered alphabetically):
If you have a Sun Developer Network (SDN) account (by the way, it's free), you can view the slides of the technical sessions at: http://developers.sun.com/learning/javaoneonline/.

Special mention

I want also to mention the call to developers by MifOS people who have been awarded by James Gosling during the Friday morning general session. This organization develops open source software for microfinance institutions (MFIs) to help them managing loans and borrowers (see demo). Really nice initiative started by the Grameem Bank!

Excerpt from James Gosling Toy Show report:
Microfinancing Through Java EE Technology

Gosling next introduced a group whose great innovation with Java technology was social and not technical. Sam Birney, engineering manager and Mifos alumnus, and Van Mittal-Hankle, senior software engineer at the Grameen Foundation, took the stage to receive Duke's Choice awards for their work using Java EE to serve 60,000 clients worldwide in microfinancing, a highly successful means of helping poor people get small loans and start businesses.

Mifos is open-source technology for microfinance that is spearheaded by the Grameen Foundation.

"Sometimes excellence comes not from technical innovation but in how technology is used," explained Gosling. "This is an example of using Java technology to really improve people's lives."

With an estimated 1.6 billion people left in the world who could benefit from microfinance, the men put out a call for volunteers to contribute to the Mifos project..

What's next?

What are my resolutions? Get a Mac as the development platform (Eclipse works on MacOS and I can use a Win7 image within VirtualBox), and start development on Java enabled phone (at least MSA 1.1 compliant).

A+, Dom

Friday, June 5, 2009

Android Dev Phone 1 Setup

To start investigations on mobile application development for Compuware, I have just acquired a first Android Dev Phone, also known as G1 [1]. Last week at Google I/O, Vic Gundotra delivered an Oprah event by offering to the audience a second generation Android phone, also known as G2 or HTC Magic [2, 3]. The G1 is more limited but it is still the only Android platform legally available.

With a bit of luck, few of 18 new phones Google expects [4] will be made available to developers during the year.

I have been able to activate the phone with the Fido pre-paid plan (10 $/month) [5]:
  • I inserted the SIM card as illustrated into the documentation, put the the battery in place, and connected the phone to the AC adapter.
  • Before signing in with my Google account, I had to create an Access Point Network (APN) entry:
    • Name: Fido
    • APN: internet.fido.ca
    • Username: fido
    • Password: fido
    • MCC: 302
    • MNC: 37
  • In some forums, it is reported that new Fido SIM cards use 370 as the MNC value.
  • A post of Olivier Fisher's blog [6] gives also the coordinates to connect to Rogers network, another GSM provider in Canada.
  • To limit interference, I deleted all pre-loaded APN entries (related to T-Mobile networks).
  • At one point, a popup asked me to enable data transfers. It is important to enable it and to activate the Data roaming, disregard how expensive are the costs for a prepaid plan.
  • Then I specified my Google account credentials and let the phone contacting Google servers via Fido network.
  • Once the activation has been successfully reported, I disabled the Data roaming, even before the synchronization of the applications {GMail, Contacts, Calendar} ended. The impact on my plan should be limited ;)
  • Then I added the description of my home Wi-Fi network.
  • I found the MAC address of the phone in the menu Settings > About phone > Status, with the entry near the end of the list. I used it to let my Wi-Fi controller accepting connections from the phone.
  • At this step, I was able to use my phone for regular calls over Fido network, and for data transfers over my Wi-Fi network.
The phone comes installed with Android 1.0 installed. I will blog later about updating the phone OS to the 1.5 version (also known as Cupcake)...

Update 2009/06/16:
Instructions on how to upgrade the Android dev phone to Android 1.5 is pusblished on HTC website: Flashing your Android Dev Phone with a Factory System Image.

Update 2009/07/15
Because of some restrictions to access Internet from the office, I have decided to pay for a 1GB/month data plan with Fido (30$/month). The activation has been made pretty quickly but none mentionned the following limitation:
  • On HTC website, you can see the network specifications for the G1: HSPA/WCDMA (US) on 1700/2100Mhz.
  • Fido/Rogers GSM only operates on 850/1900Mhz, so there's no possibility to go at a 3G speed in Canada!
Using this phone mainly for development purposes, it is not a blocking issue. It is just sad to not benefit from a better bandwidth...

A+, Dom
--
Sources:
  1. Order the Android dev phone 1 from Android Market.
  2. Techcrunch reports the Oprah moment by Vic Gundotra.
  3. G2 review by MobileCrunch
  4. Google expects 18 to 20 new phones on the market by the end of 2009.
  5. Fido pre-paid plan.
  6. Android G1 Phone in Canada on Rogers by Olivier Fisher. Posted comments are especially useful.

Wednesday, April 29, 2009

Meet you at JavaOne Conference

RockstarAs the title let you imagine, I will be in San Francisco the week of June 2-5 for the JavaOne 2009 conference.

It will be my first visit to the event, not to the Moscone Center. While working for Oracle, I attended one Open World event there. With the recent acquisition (not officially closed yet) of Sun by Oracle, I am going to go in California for Oracle again ;)

With another Compuware colleague, we will mainly focus on mobile related sessions, but cloud computing and rich interactive application related ones will have my attention too. With sessions finishing at 10:20 PM, days will be surely long. I expect a fruitful trip.

Are you going to attend too? Tweet me your schedule to meet you there ;)


JavaOne June 2-5, 2009


A+, Dom

Thursday, March 26, 2009

Guy Kawasaki's keynote in Montréal

Yesterday, I attended a keynote presented by Guy Kawasaki in Montréal. It was a real fun to listen to him. He is a great communicator.

I found many commonalities with my blog post Career Advice'08, and with Tim O'Reilly's message “Work On Stuff That Matters.” So the gap to adhere to Guy's recommendations was small.

Here is a report written by Jean-François Ferland, for the magazine Direction Informatique. If I want to reproduce it here, it's mainly because it is then ad-free ;) You can find the original version on Direction Informatique website.

Good reading,
A+, Dom


Kawasaki: innover est un art... sous le signe de l'humour
26/03/2009 - Jean-François Ferland

Guy Kawasaki, un ancien « évangéliste » d'Apple, suggère aux entreprises en démarrage dix règles pour se démarquer auprès des consommateurs et se faire remarquer par les anges investisseurs. Compte-rendu d'une allocution qui a bien fait rire l'auditoire.


Guy Kawasaki
Photo: David Sifry.
Licence: CC-by-2.0
La plupart des allocutions se suivent et se ressemblent. Or, il arrive qu'un conférencier se démarque par ses propos, par son ton et par la forme de son allocution, sans causer l'ennui ou un sentiment de déjà-vu.

Au Club St-James de Montréal, dans le cadre de la deuxième édition de l'événement Capital Innovation qui réunissait des entreprises en démarrage du Québec et des investisseurs, le conférencier Guy Kawasaki a décidément retenu l'attention des invités.

M. Kawasaki, un Californien d'origine hawaïenne, est le fondateur de Garage Technology Ventures, une entreprise qui fait du maillage entre les anges investisseurs et les entreprises en démarrage, en cherchant « deux gars, un gars et une fille ou deux filles dans un garage qui développent 'la prochaine chose importante' ».

Il est surtout connu pour son ancien rôle « d'évangéliste » pour les nouvelles technologies chez Apple lors de son deuxième séjour chez le fabricant de produits de 1995 à 1997. Lors de son premier passage, de 1983 à 1987, dans la division Macintosh, son rôle était de convaincre les gens d'écrire des logiciels pour les ordinateurs d'une entreprise « qui comptait le plus grand nombre d'égomaniaques, un record qui a été depuis battu par Google ».

Après avoir clamé son amour pour le hockey, un sport qu'il a commencé à pratiquer en Californie en même temps que ses fils à l'âge de 48 ans (!), M. Kawasaki a entamé sa conférence qui consistait en dix recommandations à l'intention des entreprises en démarrage dans le domaine des TIC.

Ses propos étaient parsemés d'humour, ce qui a plu à la foule de plus d'une centaine de personnes. « J'ai écouté bien des chefs de la direction lors de conférences comme le Comdex. Souvent ils étaient 'poches' et prenaient beaucoup de temps », a-t-il lancé en riant.

Voici brièvement ses dix recommandations portant sur l'art de l'innovation, accompagnées de courtes explications (et de remarques amusantes).

1. Faire quelque chose qui a du sens M. Kawasaki affirme qu'une entreprise en démarrage ou un innovateur doit vouloir faire quelque chose en premier lieu avec l'intention que cela fera du sens, en opposition à vouloir faire de l'argent avant tout, ce qui sera une conséquence naturelle de la première intention.

« Si une entreprise est démarrée avant tout pour faire de l'argent, elle attirera les mauvais cofondateurs, et les détenteurs de MBA sont les pires, a dit M. Kawasaki. Comment évalue-t-on la valeur d'une entreprise en prédémarrage? Ma règle est que chaque ingénieur à temps plein fait monter sa valeur d'un demi-million, mais chaque MBA la fait baisser d'un demi-million. »

2. Se faire un mantra
M. Kawasaki s'est demandé à voix haute pourquoi les entreprises ne pouvaient décrire leur raison d'être en deux ou trois mots. Il a décrit la méthode nord-américaine de création d'un énoncé de mission, où les dirigeants d'une entreprise de réunissent deux jours dans un hôtel près d'un terrain de golf, avec un consultant en motivation « parce que personne dans l'équipe ne sait comment communiquer ». La première journée est consacrée à faire des activités de mise en confiance et la deuxième à écrire des idées au crayon feutre sur du papier adossé à un présentoir.

« On tente alors d'énoncer ce qui est bon pour les actionnaires, les dirigeants, les employés, les consommateurs, les baleines et les dauphins. C'est souvent trop long, il y a trop d'expertise et on ne peut comprendre si on enlève le nom de l'entreprise. Il faut dire en trois mots ce que l'on fait », a-t-il dit.

3. Sauter sur la prochaine courbe M. Kawasaki a affirmé que l'innovation survient lorsqu'une organisation sort de la trajectoire qu'elle suit ou qu'elle saute dans une nouvelle courbe. Il a donné l'exemple des coupeurs de glace des années 1900, de la version 2.0 à l'ère des usines de fabrication de glace, puis de la version 3.0 des réfrigérateurs à la maison. « Aucun des coupeurs de glace n'a bâti de fabrique de glace », a-t-il souligné, et sont carrément disparus.

4. Rouler les dés L'innovation prend forme lorsque l'entreprise prend le risque de faire le saut vers une autre courbe. En faisant un acronyme avec le mot Dicee - une altération inventée du mot « dé » en anglais, dont toutes les définitions sur Internet réfèrent au conférencier - M. Kawasaki a suggéré que l'innovation impliquait de la profondeur (Deep) par l'ajout de fonctions, de l'Intelligence lorsqu'on soulage une difficulté pour le consommateur, une expérience totale (Complete), de l'Élégance parce que le produit fonctionne lorsqu'on le branche et de l'Émotivité parce que les personnes l'aiment ou le détestent, sans zone grise.

5. Lancer maintenant, corrigez plus tard C'est ainsi qu'on pourrait traduire l'expression Don't worry, be crappy - inspirée par la chanson de Bobby McFerrin. M. Kawasaki a affirmé qu'une innovation a forcément des défauts et que ceux qui attendent qu'elle soit parfaite ne font pas de ventes entre-temps. « Le produit mis en marché ne doit pas être tout mauvais (crap), mais avoir juste un peu de mauvais. Le Apple 128 était un mauvais produit révolutionnaire! »

6. Polariser les gens M. Kawasaki a répété qu'une innovation audacieuse sera inévitablement aimée ou détestée par les gens, en donnant l'exemple de l'enregistreur numérique personnel Tivo que n'aiment pas les agences de pubs parce qu'elle permet d'éviter de regarder des messages publicitaires. « Le véhicule Scion de Toyota est vu comme étant cool par les gens de 27 ans et comme un réfrigérateur par les gens de 55 ans. On ne peut pas plaire à tout le monde, mais il ne faut pas en faire fâcher de façon intentionnelle. Cela n'arrive jamais que tout le monde aime un produit. »

7. Laisser cent fleurs éclore M. Kawasaki a indiqué qu'un produit innovant peut mener à des utilisations non intentionnelles, par des utilisateurs qui n'étaient pas ciblés à l'origine. Il donne l'exemple d'une crème de la compagnie Avon qui rend la peau douce, mais que les mères utilisent... comme chasse-insectes! Il a aussi évoqué la console de jeu vidéo Wii de Nintendo, destiné aux enfants, qui fait un malheur auprès des personnes âgées.

« Si cela vous arrive, prenez l'argent!, dit-il en riant. En 1984, Apple pensait que le Macintosh servirait au calcul dans les chiffriers, aux bases de données et au traitement de texte. Arrive PageMaker, qui a créé l'éditique et a sauvé Apple. Sans l'éditique, nous écouterions encore de la musique sur des cassettes de 60 minutes! »

« En ingénierie, je recommande d'aller voir ceux qui achètent les produits pour savoir ce qu'ils veulent. Chez Apple nous avions demandé aux entreprises Fortune 500 pourquoi elles n'achetaient pas nos ordinateurs. Nous leur avons créé un pilote d'impression, comme ils avaient suggéré, mais ensuite ils ont trouvé d'autres excuses... », a-t-il ajouté.

8. Vivre dans le déni M. Kawasaki a indiqué que la chose la plus difficile à faire en innovation est de refuser d'écouter ceux qui diront que c'est impossible à faire, que personne n'achètera le produit ou que personne ne fournira du financement. « On vous donnera 60 raisons. Ignorez-les. Mais une fois que le produit est lancé, virez votre capot et passez en mode 'écoute'. [Entre ces deux approches,] c'est le passage en zone neutre qui est le plus difficile », a-t-il confié. Comme au hockey.

9. Trouvez votre niche M. Kawasaki a évoqué un graphique pour une innovation où l'axe vertical décrit son niveau d'unicité et l'axe horizontal sa valeur, en affirmant que l'entreprise veut se situer en haut et à droite. « Un produit qui est unique et n'a pas de valeur ne doit pas exister. C'est comme offrir le curling aux États-Unis! »

Pour décrire une innovation qui n'a ni valeur ni unicité, M. Kawasaki a relaté le cas de Pets.com qui vendait en ligne de la nourriture pour chien. « L'enjeu en était un de gestion de la chaîne d'approvisionnement. Ils se disaient capables d'éliminer les magasins, cet intermédiaire qui prenait une marge de 25 %, en livrant directement aux propriétaires de chiens. Mais des vaches mortes en conserve pèsent lourd [en frais de livraison]. C'était plus cher et pas plus pratique... »

10. La règle du 10-20-30 La dernière règle suggérée par M. Kawasaki aux entreprises en TIC en est une qui servira lors des présentations aux anges investisseurs. « Utilisez 10 diapositives. Ne lisez pas vos diapositives - les gens savent lire. Le mieux est de ne pas avoir de diapositives! Aussi, expliquez votre produit ou votre projet en 20 minutes. De toute façon, 95 % des gens prennent 40 minutes d'une présentation d'une heure pour brancher leur portable avec leur projecteur. »

« Enfin, utilisez une taille de caractères de 30 points. Prenez la plus vieille personne dans l'auditoire, divisez son âge en deux et vous aurez la taille idéale. Comme les anges investisseurs deviennent plus jeunes, bientôt vous utiliserez une taille de 8 points! » a ajouté le conférencier, ce qui a suscité l'hilarité dans la salle.

(En bonus) 11. Ne laissez pas les « bozos » vous décourager En terminant, M. Kawasaki a suggéré aux entrepreneurs de ne pas se laisser abattre par les clowns qui les décourageront.

« Il y a deux types de clowns : le premier est mal coiffé, n'a pas d'aptitudes sociales et démontre qu'il est un perdant. Le deuxième, qui conduit une voiture allemande et porte un beau complet, est le plus dangereux. La moitié du temps, il est devenu riche et célèbre par chance », a-t-il déclaré.

Au terme de cette allocution, nous pourrions recommander aux entreprises une douzième règle : faites des présentations amusantes et animées comme celle de M. Kawasaki!

Jean-François Ferland est journaliste au magazine Direction informatique.

Tuesday, January 13, 2009

Web Application on Resources in the Cloud

“What? Why? When? How?” are the four questions I am going to answer to introduce my first series of posts.
  • What? I am going to build a modern Web application using resources on the Cloud. Specifically, I am going to build an open Web application for consumers to find and review products in a big database, and for producers to offer products and find consumers. The infrastructure will use Google App Engine infrastructure [1].
  • Why? There are many aspects:
    • There is the professional benefit: In my post about Gary Reynolds' presentation “Career Advice '08” [2], or as posted by Tim O'Reilly in his post “Work on Stuff that Matters: First Principles” [3], it is mentioned that delivering value is a key differentiator. Building this working application will demonstrate my various expertise.
    • As an active member of Diku Dilenga [4] which delivers microloans to small enterprises in Democratic Republic of the Congo, I know that such application will help microentrepreneurs finding customers, and vice-versa. This project helps sharing my expertise with people who need help.
    • This project gives me also a chance to contribute to the open source community which has already given so much to me, my life, and my work.
  • When? I have already played with the Google App Engine SDK on my machine. I wanted to be sure no blocking issue would prevent me building the application. The application is already available at: http://prod-cons.appspot.com/
  • How? I am a Agile Methodology Adopter [5] so I do not plan far ahead. I am going to prepare a backlog with the tasks to implement, and I am going to address them according to their priority order. The code is regularly pushed on github [6]: http://github.com/DomDerrien/diku-dilenga/tree.
If you like the idea, if you want to learn new mechanisms, if you are OK with writing lots of unit tests, contact me. Because I am pretty busy at work, and I have to assume responsibilities for Diku Dilenga, the project will move slowly. But it will move and it will be fun!

Hints on the coming post in that series:
A+, Dom
--
Sources:
  1. Google App Engine website.
  2. My post on Career Advice '08 
  3. Tim O'Reilly post Work on Stuff that Matters: First Principles.
  4. Diku Dilenga website.
  5. Agile Manifesto, and Agile Methodology description on Wikipedia
  6. Github.com offers free hosting of open sources (charges applied to personal and commercial hosting).

Monday, November 17, 2008

OLPC XO available on Amazon

I blogged before about the One Laptop per Child [1] initiative and I am pleased to remind you that the computer is available on Amazon starting today [2]!


Image from Amazon.com website [2]


A+, Dom
--
Sources:
  1. OLPC back with Get Once/Give One program starting Nov. 17
  2. OLPC XO available on Amazon

Tuesday, November 11, 2008

Tech Conferences at Montreal

Recently, I attended the first Canadian Wireless Management Forum [1]. It was an interesting forum with good speakers and a good audience. I will try to attend this event in 2009 again.


Logo from CWMF website [1]


And tomorrow, there is the fifth “webcom Montréal” event [2]. Because of my schedule, I cannot attend the talk of Rishi Chandra, Product Manager at Google, who should present Google cloud computing offer/strategy. Too bad! I read his interview for internet evolution [3]. It would have been good to hear an updated talk live!


Logo from webcom website [2]


With a good Internet access, between 9:00 am and 6:00 pm, the talks should be streamed on the WebTV http://www.ustream.tv/channel/webcom-live. Twitter will be also  used to push information into the fields with #webcom08.
After 4:00 pm, 4 keynotes are freely available [4].

What will be the next one?
Don't hesitate to post comments to push annoucements ;)

A+, Dom
--
Sources:
  1. Canadian Wireless Management Forum
  2. webcom Montréal
  3. Rishi Chandra's interview for technical news website internet revolution
  4. webcom Montréal schedule (after 4:00 pm, keynotes can be attended freely)

    Thursday, October 16, 2008

    Delayed Blog Action Day Contribution

    I was so busy this last days that I missed the “Blog Action Day” event on October 15, 2008! Because of my social involvement in Diku Dilenga [1], I want to participate even if I am a little bit late :)

    This year, the Blog Action Day [2] topic is “poverty”.

    In 2001, I joined volunteers of the Montreal RESULTS group [3] The main goal of this group is to lobby the governments (federal, provincial, etc.) to ensure that money invested in International Development targets the really poor! Many actions have been very successful but, IMHO, it is too dependent on the current government policies... My abilities to help reaching the Millennium Development Goals [4] were limited.



    The 8 Millennium Development Goals
    (Icons from UN site [4])

    End of 2007, I have been asked to give a hand to start a Canadian chapter for Diku Dilenga, NGO/NPO offering mainly microcredit to poor people. The model of Diku Dilenga is based on the successful example of Jamii Bora [5]. Rev. Tambwe Musangelu, the legal official of Diku Dilenga in Democratic Republic of the Congo (DRC), worked closely with Ms. Ingrid Munro. To understand the philosophy of the organization and to learn about how successful the operations in Kenya are, you should look at the conference given by Ms. Ingrid Munro at the Microcredit Summit that took place in Halifax, Canada, in 2006 (the year Mr. Mohammad Yunus and the Grameen Bank received the Nobel Peace Prize).





    Operations of Diku Dilenga are progressing slowly because our core counts very few volunteers and because the legal process of the registration is still in progress (organization registered as non-profit, but not yet as a charity). Money has already be sent on individual basis, for example, and we are looking at opportunities to organize fund raising events. A child pairing program is also in progress. We have many other ideas we hope to realize in 2009-2010 that will make a big difference for poor people in DRC.

    With my experience, I am persuaded that support poor entrepreneurs with micro-loans is good mechanism to help them, their families, and their relations going out of poverty. It is a respectful and sustainable tool that also serve their country (because it is less corruption prone, for example).

    So I invite anyone to take a close look at which achievements have been made with microcredit (Grameen Bank, Jamii Bora). Once convinced that is a good practice, do not hesitate to donate through Kiva [6] for example which accepts donation by 25$ increments. If you want to be involved in Diku Dilenga, leave me a comment ;)

    A+, Dom
    --
    Sources:
    1. Diku Dilenga is an NGO/NPO acting in Democratic Republic of the Congo with a chapter in Canada which mainly offers financial and technical supports.
    2. Blog Action Day website.
    3. RESULTS Canada website.
    4. Description of the Millennium Development Goals, on United Nations website.
    5. Jamii Bora is a sister organization acting in Kenya.
    6. Kiva.org , probably the fastest web-based NPO which funded more that 25,000 loans, with a 99+ per cent repayment rate!

    Wednesday, October 8, 2008

    OLPC back with Get Once/Give One program starting Nov. 17

    One Laptop per Child (OLPC) [1] is an amazing initiative: use technology (sometimes develop new ones) to bring education materials to kids in poor countries.

    When studying at the university, I acquired experience in building chips (building blocks of npn gates) to extension cards (with Transputers and TMX chips). I build pieces of software to optimize pipeline in CPUs (on Cray XMPs, for example) up to OS process scheduler. Now, I am just an end-user application developer but that is a different story ;)

    The first time I heard about the OLPC initiative, I was impressed by one specification: a computer made to last in tough conditions! And the result does match this requirement:
    • There is not fan and, when it is closed (with the “ears” covering the USB ports), dust and humidity cannot reach the core.
    • The CPU is under the flat screen, so kids having the laptop on their knees cannot be harmed.
    • There is no moving part (no CD-ROM drive, no regular hard drive, just a solid state drive-SSD).
    • Minimal poser consumption and many power sources [2]: the grid power, a hand crank charger, solar panel, and a pull string generator!
    Check the in-depth review of the hardware conducted by Mr. Huang beginning of 2008 [3].

    Today, I have been able to see the interview of Chuck Kane, OLPC CEO, by Robert Scoble.


    Interview by Robert Scoble

    After the hardware, the feature I like the most is the mesh network. Scoble also interviewed Michail Blestas, VP of Advanced Technology and Connectivity, who gives few details about it. Among the features I like: independent of any wifi infrastructure, laptops relay packets even if they are “turned off” (if there is sufficient battery charge or mains input), peer-to-peer communication protocol, etc. [4].


    Interview by Robert Scoble

    Now, what should I do? Ideally, I would like to help sending these laptops to African kids, especially in Democratic Republic of the Congo, in relation with my involvement in the Diku Dilenga organization [5]. But it will not be tomorrow :( So this year, I am going to participate to the “Get One, Give One” program that will start November 17, and will be served by Amazon [6]. I will acquire one XO (name of the laptop) that will find its way up to Kananga, Occidental Kasaï, DR Congo. The second one will be donated by OLPC to a South American kid...

    I am going to continue following OLPC progression, especially the XO-2 which promises to innovate even further [7]. Who knows, maybe big corporations (like Intel, Microsoft, and al.) will stop pursuing their individual goals (place more chips or licenses, so augment the revenues, and maximize shareholder's profit).

    A+, Dom
    --
    Sources:
    1. One Laptop per Child website.
    2. OLPC power supply.
    3. Review by Andrew “bunnie” Huang of the OLPC hardware.
    4. Details on the OLPC mesh network.
    5. Diku Dilenga: delivers micro loans to entrepreneurs, support education and healthcare initiatives.
    6. Amazon will distribute OLPC XO for the 2008 program “Get One Give One”.
    7. Preview of OLPC XO-2.

    Thursday, September 25, 2008

    Semantic Web and smart clients

    Few days ago, I attended a conference organized by the group “Rencontres d'Architecture de Montréal” [1], non-profit organization I am a co-founder of. The presenter was James Lapalme and his talk presented the Semantic Web concepts [2]. He introduced the basics, explains the different layers and standards (RDF, OWL, SPARQL, etc.), and presented a tool he uses [3].

    Here is his presentation:

    The audience was diverse: enterprise architects, solution architects, data architects, infrastructure architects. All attendees gave an excellent feedback, and all of them went away with many ideas to explore.

    One perspective the talk gave to me is related to a sentence from James:
    We should replace XML formatted messages by RDF ones.
    Out of context, it does mean silly: why would replace messages with already a large payload by ones even bigger? Especially when most of Web 2.0 tries to rely on JSON as much as possible...

    Let me present an example and you will probably see which benefits I envision in my expertise area (which focuses on Web 2.0 applications, but which covers all types of light clients).
    1. <notification uri="uri://domderrien.blogspot.com/notif/456" date="20080721T164300Z">
    2.   <priority>...</priority>
    3.   <emitter name="Automatic Alert" uri="uri://domderrien.blogspot.com/process/21" />
    4.   <content type="text">
    5.     Unexpected power outage in 5 minutes.
    6.     Call Jack: 123.456.7890 #0923
    7.   </content>
    8. </notification>
    Over the week-end, I receive such a message on smart phone and I call Jack right away. But due to the urgency of the situation, Jack moved somewhere else and no one picks up the phone. I do not have this “Jack” in my cellular phone address book and the company front desk is closed: I am stuck!

    It might be less problematic if the message contains a record with an equivalent of Jack vCard [5], so I will be able to find his cellular phone number to reach him. If he does not reply (he does not hear the cellular phone ringing because of the noise of the electrical generators he has just started, for example), I am stuck again...

    A corresponding notification literally translated in a RDF graph will rely on the following relations:
    1. {uri://domderrien.blogspot.com/notif/456; date; 20080721T164300Z}
    2. {uri://domderrien.blogspot.com/notif/456; priority; ...}
    3. {uri://domderrien.blogspot.com/notif/456; emitter; uri://domderrien.blogspot.com/process/21}
    4. {uri://domderrien.blogspot.com/process/21; name; "Automatic Alert"}
    5. {uri://domderrien.blogspot.com/notif/456; content; uri://domderrien.blogspot.com/notif/456/content}
    6. {uri://domderrien.blogspot.com/notif/456/content; type; "text"}
    7. {uri://domderrien.blogspot.com/notif/456/content; value; "Unexpected power outage in 5 minutes\nCall Jack: 123 456 7890 #0923"}
    This set of triplets does not bring much value than its XML counterpart. But it is not RDF-friendly neither... The last triplet (line 7) contains too much information, so let rewrite it:
    1. {uri://domderrien.blogspot.com/notif/456/content; _1; "Unexpected power outage in 5 minutes."}
    2. {uri://domderrien.blogspot.com/notif/456/content; _2; "Call"}
    3. {uri://domderrien.blogspot.com/notif/456/content; _3; uri://domderrien.blogspot.com/staff/92/name}
    4. {uri://domderrien.blogspot.com/notif/456/content; _4; ":"}
    5. {uri://domderrien.blogspot.com/notif/456/content; _5; uri://domderrien.blogspot.com/facilities/16/phone}
    Now, it is visible that Jack is the name of the staff number with the internal identifier 456. Jack should be also called in room or cube with the internal identifier 16.
    If the corporate directory uses a RDF representation, if it supports SPARQL to process lookups, I have now many possibilities to act:
    • I can query information about Jack (uri://domderrien.blogspot.com/staff/92): his cellular phone number, his desk phone, his role, etc.
    • I can get information about the room in order to go there (if I am the building), or to call someone next to it.
    • I can also look for someone having a direct relation with Jack (e.g. his manager) or having the same profile (a teammate possibly trying to fix the crisis too).
    Note that these benefits come naturally, without requiring notification schema extensions (like the proposed one to include vCards of human actors).

    For sure, the payload of such a representation is bigger than traditional ones. In case of sending such notifications to mobile devices and equivalent query results, the limited bandwidth can become the bottleneck. This problem can be worked around by having hand held devices owners synchronizing them quite often (disk space is cheaper than bandwidth, it is also much faster). This alternative requires the implementation of efficient RDF engine (parser, query, inference).
    A+, Dom
    --
    References:

    Première conférence des Rencontres d'Architecture de Montréal avec James Lapalme

    Hier soir s'est déroulée la première conférence du groupe Rencontres d'Architecture de Montréal (RAM) [1]. Le conférencier était James Lapalme, architecte d'information chez Investissements PSP, une firme de gestion de fonds de pension fédérale [2], et il a présenté le concept de « Semantic Web », de son origine jusqu'au quelques outils le mettant en œuvre, en passant par les différentes standards associés (RDF/RDF-S, OWL, SPARQL, etc.).

    Malgré l'auditoire plutôt clairsemé, le niveau de l'intervenant et la variété des questions posées (il y avait des architectes d'infrastructure, de solutions et d'entreprise) ont produit une soirée riche en contenu.

    L'idée de changer l'envoi de données avec des mécanismes s'assurant seulement de la bonne syntaxe (formats XML ou JSON, par exemple) par de l'envoi favorisant la sémantique (données + contexte + actions, avec les formats RDF ou N3) ouvre des perspectives inégalées ! Je posterai sûrement une entrée dans ce blog à ce propos dans quelques temps ;)

    Mise à jour : j'ai publié les détails de la perspective offerte par la conférence de James dans le billet « Semantic Web and Smart Clients » (en anglais).

    A+, Dom
    --
    Références:

    Monday, September 15, 2008

    Rencontres d'Architecture de Montréal (RAM)

    Hi readers,
    With the help of few friends, I am going to give a hand to start a new focus group in Montréal area:
    • Rencontre d'Architecture de Montréal (RAM).
    This group replaces the International Association of Software Architects (IASA) chapter of Montréal which has been dissolved because of the foolish directions proposed by the IASA management...
    My friends are:
    • Keith Bourgoin, CGI;
    • Joël Quimper, Microsoft;
    • Mario Cardinal, freelance.
    The first event is going to take place soon with the presentation of our new offer and one guest speaker. Stay tuned ;)

    Note that to organize a fluid communication among organizers, speakers, and attendees, we have decided to setup few Microsoft Live tools:
    • A space;
    • An event list;
    • etc.
    Feel free to join.
    A+, Dom

    Microsoft Tools Evaluation

    Because my friends and I are setting up tools made freely available to anyone by Microsoft, I have decided to give a try ;)

    My opinion cannot be impartial because I am a Web app developer myself and I have been a heavy Google tools user for quite a long time. Anyway, with the actual openness Microsoft is demonstrating regarding Internet Explorer 8 (IE8) development, I think it is worth capturing some notes now that I will be able to revisit later to measure the progress in the Microsoft online offering.

    The invite to use Microsoft Live tools came from Joël Quimper, a friend member of the Rencontres d'Architecture de Montréal (RAM) board. Joël has a good insight of Microsoft tools (he works there ;) and have been able to easily setup few tools: a space and an event list.

    In order to be able to post blog entries, to manage events, and co-author the space page, I had to create a “Live ID”. Hopefully, I have been able to use my existing e-mail address (in the @gmail.com domain), skipping then Hotmail. This is a great permission!

    Then I went to my space page to see how easy and convenient it is to blog. Not as good as Blogger is, so I have decided to reactivate this blog ;)

    I have looked also at the personal calendar (a key tool to me) but I did not find it as straight as Google's one.

    However, the possibility to publish events is really great: you can describe the event (fully HTML text), and the tool offers automatically links to allow visitors to report the event in their own agenda (Outlook, Live/Yahoo!/Google/Apple calendars). There is a possibility to add pictures, good to share souvenirs after a successful event, I imagine.

    That's it for now.
    A+, Dom