<Glazblog/>

Wednesday 19 March 2014

A better CSS OM for parsed values

A large part of the current CSS Object Model sucks. More specifically, the CSSValue, CSSPrimitiveValue, CSSValueList, RGBColor, Rect and Counter interfaces are so poorly designed they're not implemented. I just tried to implement them for a project of mine and I must say the model is so weak and incoherent it cannot be implemented as is.

I have then tried to refine what's in the 2000-nov-13 spec of DOM Level 2 Style to reach something workable. I am NOT saying this has to be done or implemented. Call it a mental exercise I did just for fun, w/o caring about performance.

Let's first look at what's wrong:

Interface CSSValue

      interface CSSValue {
      
        // UnitTypes
        const unsigned short      CSS_INHERIT                    = 0;
        const unsigned short      CSS_PRIMITIVE_VALUE            = 1;
        const unsigned short      CSS_VALUE_LIST                 = 2;
        const unsigned short      CSS_CUSTOM                     = 3;
      
                 attribute DOMString        cssText;
                                              // raises(DOMException) on setting
      
        readonly attribute unsigned short   cssValueType;
      };

"inherit" is here considered as a special identifier despite of the fact a CSSPrimitiveValue can be a CSS_IDENT. There is no UnitType for "initial". A CSS_CUSTOM is, according to the spec, a "custom value"; but a custom value still has to be valid per CSS syntax so it should be representable with CSS_VALUE_LISTs and CSS_VALUEs.

Interface CSSValueList

interface CSSValueList : CSSValue {
  readonly attribute unsigned long    length;
  CSSValue           item(in unsigned long index);
};

All in all, this one is simple and should be quite ok. But one thing is missing: a property can accept a comma-separated list of whitespace-separated values. The current CSSValueList cannot express if the serialization of a CSSValueList should be whitespace- or comma-separated.

Interface CSSPrimitiveValue

interface CSSPrimitiveValue : CSSValue {

  // UnitTypes
  const unsigned short      CSS_UNKNOWN                    = 0;
  const unsigned short      CSS_NUMBER                     = 1;
  const unsigned short      CSS_PERCENTAGE                 = 2;
  const unsigned short      CSS_EMS                        = 3;
  const unsigned short      CSS_EXS                        = 4;
  const unsigned short      CSS_PX                         = 5;
  const unsigned short      CSS_CM                         = 6;
  const unsigned short      CSS_MM                         = 7;
  const unsigned short      CSS_IN                         = 8;
  const unsigned short      CSS_PT                         = 9;
  const unsigned short      CSS_PC                         = 10;
  const unsigned short      CSS_DEG                        = 11;
  const unsigned short      CSS_RAD                        = 12;
  const unsigned short      CSS_GRAD                       = 13;
  const unsigned short      CSS_MS                         = 14;
  const unsigned short      CSS_S                          = 15;
  const unsigned short      CSS_HZ                         = 16;
  const unsigned short      CSS_KHZ                        = 17;
  const unsigned short      CSS_DIMENSION                  = 18;
  const unsigned short      CSS_STRING                     = 19;
  const unsigned short      CSS_URI                        = 20;
  const unsigned short      CSS_IDENT                      = 21;
  const unsigned short      CSS_ATTR                       = 22;
  const unsigned short      CSS_COUNTER                    = 23;
  const unsigned short      CSS_RECT                       = 24;
  const unsigned short      CSS_RGBCOLOR                   = 25;

  readonly attribute unsigned short   primitiveType;
  void               setFloatValue(in unsigned short unitType, 
                                   in float floatValue)
                                        raises(DOMException);
  float              getFloatValue(in unsigned short unitType)
                                        raises(DOMException);
  void               setStringValue(in unsigned short stringType, 
                                    in DOMString stringValue)
                                        raises(DOMException);
  DOMString          getStringValue()
                                        raises(DOMException);
  Counter            getCounterValue()
                                        raises(DOMException);
  Rect               getRectValue()
                                        raises(DOMException);
  RGBColor           getRGBColorValue()
                                        raises(DOMException);
};

This is so completely crazy I don't know where to start...

  • CSS_UNKNOWN is supposed to represent a "value that is not a recognized CSS2 value". Then it should be thrown away by the parser as invalid and never reach the OM, right?
  • the list of units is long and not easily extensible
  • attr(), counter(), counters(), rect() and the more recent gradients or var() calls are all functions; adding a new setter and a new getter for each new type is overkill
  • attr() was extended by recent specs and can now take more than one argument. The above does not allow to individually modify those arguments.
  • "initial" and "inherit" are, as I already said above, covered by both CSSValue and CSS_IDENT here
  • let's suppose we have a CSSValue that is a CSSPrimitiveValue. Setting its cssText to "10px 10px" will then trigger an exception since a CSSPrimitiveValue cannot transmute magically into a CSSValueList...
  • I love how the spec prose says setStringValue() has "No Parameters"...

Interface Rect

interface Rect {
  readonly attribute CSSPrimitiveValue  top;
  readonly attribute CSSPrimitiveValue  right;
  readonly attribute CSSPrimitiveValue  bottom;
  readonly attribute CSSPrimitiveValue  left;
};

This looks and smells like a CSSValueList far too much.

Interface RGBColor

interface RGBColor {
  readonly attribute CSSPrimitiveValue  red;
  readonly attribute CSSPrimitiveValue  green;
  readonly attribute CSSPrimitiveValue  blue;
};

This cannot represent rgba(), hsl() and hsla() colors. We also have to use three CSSPrimitiveValue for the three color components because they can be a percentage or an integer...

Interface Counter

interface Counter {
  readonly attribute DOMString        identifier;
  readonly attribute DOMString        listStyle;
  readonly attribute DOMString        separator;
};

Again, something is missing here: nothing says if it's supposed to be a counter() or a counters() value. And no, the separator could not do the trick since it can be the empty string.

Requirements

To have a better OM for Values, i.e. an extensible OM that allows an application to deal with parsed values of all kinds, we need to change of perspective. First, the list of reserved idents, the list of units and the list of functions are not extensible. Secondly, we have cast issues between PrimitiveValues and ValueLists and we need a single interface. We can deal with all the issues with a single CSSValue interface:

New interface CSSValue

interface CSSValue {

  // ValueTypes
  const unsigned short      CSS_SYMBOL                     = 0;
  const unsigned short      CSS_NUMBER                     = 1;
  const unsigned short      CSS_UNIT                       = 2;
  const unsigned short      CSS_STRING                     = 3;
  const unsigned short      CSS_URI                        = 4;
  const unsigned short      CSS_IDENT                      = 5;
const unsigned short CSS_VALUE_LIST = 6; readonly attribute unsigned short type; attribute boolean commaSeparated;
readonly attribute unsigned long length;
CSSValue item(in unsigned long index);
raises(DOMException);

void setFloatValue(in float floatValue) raises(DOMException); float getFloatValue() raises(DOMException);
void setStringValue(in DOMString stringValue) raises(DOMException); DOMString getStringValue() raises(DOMException); };

Definition group ValueTypes

An integer indicating the type of the Value

CSS_SYMBOL
The value is a single character than cannot be interpreted otherwise. For instance the / character in the font shorthand property. The value can be obtained by the getStringValue() and set by the setStringValue() method.
CSS_NUMBER
The value is a simple number. The value can be obtained by using the getFloatValue() method and set through by setFloatValue() method.
CSS_UNIT
The value is a number followed by a unit. The number part of the value can be obtained by using the getFloatValue() method and set through by setFloatValue() method. The unit part of the value can be obtained by using the getUnit() method and set through by setUnit() method
CSS_STRING
The value is a string. The value can be obtained by the getStringValue() and set by the setStringValue() method.
CSS_URI
The value is a URI. The parameter of the url() function can be obtained by the getStringValue() and set by the setStringValue() method.
CSS_IDENT
The value is a CSS identifier. The value can be obtained by the getStringValue() and set by the setStringValue() method.
CSS_VALUE_LIST
The value is a list of values or a function. It is a function if the getStringValue() method does not reply the empty string. The list of values is whitespace-separated if the commaSeparated attribute is false and comma-separated otherwise.

Attributes

type of type unsigned short, readonly
The type of the value as defined by the constants specified above.
commaSeparated of type boolean
The separation type of the list of values. Meaningful only if the type attribute is CSS_VALUE_LIST. The list is whitespace-separated if the attribute is false and comma-separated otherwise.
length of type unsigned long, readonly
The number of CSSValue in the list. The range of valid values of the indices is 0 to length-1 inclusive.
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value is a not a CSS_VALUE_LIST.

Methods

getFloatValue
Retrieves the value of a CSS_NUMBER or the number part of the value of a CSS_UNIT. If this CSS value is not a CSS_NUMBER or a CSS_UNIT, a DOMException is raised.
Return Value
float The float value of this CSS_NUMBER or CSS_UNIT
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value isn't a CSS_NUMBER nor a CSS_UNIT.
getStringValue
For a CSS_SYMBOL, retrieves the single character used as a symbol.
For a CSS_STRING, retrieves the string. Enclosing quotes or double-quotes are NOT included.
For a CSS_UNIT, retrieves the unit of the value.
For a CSS_URI, retrieves the argument of the url(...) notation. Enclosing quotes or double-quotes are NOT includedt.
For a CSS_IDENT, retrieves the identifier.
For a CSS_VALUE_LIST and if that list of values is passed as the parameters of a function, retrieves the function name. Retrieves the empty string otherwise.
For a CSS_NUMBER and CSS_UNIT, a DOMException is raised.
No Parameters
Return Value
DOMString The float value of this CSS_NUMBER or CSS_UNIT
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value is a CSS_NUMBER or a CSS_UNIT.
item
For a CSS_VALUE_LIST, Used to retrieve a CSSValue by ordinal index. The order in this collection represents the order of thevalues in the CSS style property. If index is greater than or equal to the number of values in the list, this returnsnull.
For all other value types, a DOMException is raised.
Parameter
index of type unsigned long: index into the collection.
Return value
CSSValue The CSSValue at the index position in the CSSValueList, or null if that is not a valid index.
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value is a not a CSS_VALUE_LIST.
setFloatValue
Sets the value of a CSS_NUMBER or the number part of the value of a CSS_UNIT. If this CSS value is not a CSS_NUMBER or a CSS_UNIT, a DOMException is raised.
Parameter
floatValue of type float;
No Return Value
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value isn't a CSS_NUMBER nor a CSS_UNIT or if the attached property doesn't support the float value or the unit type.
NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
setStringValue
For a CSS_SYMBOL, sets the single character used as a symbol.
For a CSS_STRING, sets the string.
For a CSS_UNIT, sets the unit of the value.
For a CSS_URI, sets the argument of the url(...) notation.
For a CSS_IDENT, sets the identifier.
For a CSS_VALUE_LIST and if the parameter is not the empty string, make the list of values become a function and sets the function name. Make the list become a plain list of values if the parameter is the empty string.
For a CSS_NUMBER and CSS_UNIT, a DOMException is raised.
Parameter
stringValue of type DOMString
No Return Value
Exceptions
INVALID_ACCESS_ERR: Raised if the CSS value is a CSS_NUMBER or a CSS_UNIT, if the type of the value is CSS_SYMBOL and the string can be parsed as an other type of value, if the type of the value is CSS_UNIT and the string is not a valid CSS unit, if the type of the value is CSS_URI and the string is not a valid URI, if the type of the value is CSS_IDENT and the string is not a valid CSS identifier, if the type of the value is CSS_VALUE_LIST and the string is not a valid CSS identifier or the empty string.
NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.

Conclusion

The above should be enough to describe any CSS value, specified or computed. The model will become a bit complex for complex values but it ensures any web application can have access to parsed values, deal with their types and modify them. Let's take an example:

background-image: linear-gradient(to bottom, yellow 0%, blue 100%), url(foo.png);

This will result in the following OM (click on the image to enlarge it):

OM example

Again, I'm not saying the above is the thing to do or implement. It can certainly be improved, for instance for colors. A totally different perspective is also perfectly possible. I am only saying that making a better CSS OM allowing a full representation of parsed values in stylesheets and computed values is feasible. I hope the CSS OM will offer such power in the future.

UPDATE: the new CSSValue interface above lacks one thing, the ubiquitous cssText for parsing and serialization. Sorry for that.

Wednesday 26 February 2014

Haxe

I have just discovered Haxe and haxecpp and I am totally blown away. This is what I was dreaming of and I did not know about it. I am going to use it immediately for my personal projects. Wow, just wow.

Thursday 6 February 2014

Next Game Frontier, The conference dedicated to Web Gaming

Last October, I was attending the famous Paris Web conference in Paris, France. In the main lobby of the venue, two Microsoftees (David Catuhe and David Rousset) were demo'ing a game based on their own framework Open Source babylon.js. Yes, Microsoftee and an Open Source JS framework over WebGL... I was looking at their booth, the people queuing to try the game and started explaining them there are conferences about Gaming, there are conferences about Web technologies in general and html5 in particular but there are no conference dedicated to Gaming based on Web technologies...

To my surprise, the two Davids reacted very positively to my proposal and we started immediately discussing a plan for such a conference.

Next Game Frontier LogoPeople, I am immensely happy to announce the First Edition of the Next Game Frontier conference, the conference dedicated to Web Gaming, co-organized this year by Microsoft and Samsung Electronics.

Web site: Next Game Frontier

Location: Microsoft France campus, Issy-les-moulineaux, France

Date: 13th of March 2014

Next Game Frontier on Lanyrd

Free registration but number of seats limited so register ASAP!

Schedule:

9:00 - 9:30 Breakfast

9:30 - 9:45 Opening Keynote (D. Glazman, D. Catuhe & D. Rousset)
9:45 - 10:45 Microsoft session - Create a 3D game with WebGL and Babylon.js (D. Catuhe & D. Rousset)

10:45 - 11:00 Break

11:00 - 12:00 Mozilla session - Le Web en tant que plateforme pour les jeux, de WebGL à AsmJS (T. Nitot)

12:00 - 13:15 Lunch

13:15 - 14:15 Create 3D assets for the mobile world & the Web, the point of view of a 3D designer (M. Rousseau)
14:15 - 15:15 Samsung session - Enhancing HTML5 gaming using WebCL (Samsung) & Turbulenz (Partner)

15:15 - 15:30 Break

15:30 - 16:30 Three.js (J. Etienne from http://learningthreejs.com)
16:30 - 17:30 Minko.io (Jean-Marc Le Roux from http://aerys.in)

17:30 - 18:30 Roundtable - Open discussions about Web Gaming - Microsoft, Mozilla, Samsung, Ubisoft moderated by a journalist

Save the date, and register now but please, don't register if you don't plan to come. Thanks!

Friday 31 January 2014

CSS Regions

If there is one and only article you should read about CSS Regions, that's this one. And the conclusion is quite clear and I agree with it:

CSS Regions give us the ability to do a lot of things that are otherwise not possible without them

Thursday 7 November 2013

Beauty of the Web

One of the questions I'm often asked is « Did Tim Berners-Lee expect porn and terrorists on the Web when he designed it? ». Honestly, I don't know and I don't care since all technologies always have good and bad sides. And in our case, the good sides are so huge they make me proud to be a small part of that technology...

Yesterday, some friends of Molly Holzschlag started for her a fund on GoFundMe. Molly needs money to pay her chemo-therapy and given the state of social health in the US when you're not a white-collar in a large company, that's not an easy task.

The fund was started roughly at 0am my time. When I discovered it, some 14 hours later, it had $2,300 out of a $25,000 target. I donated to the fund, and tweeted immediately about it. Some other people tweeted about it too at the same time. Right after that, the donations started pouring in at fast pace. $3,000, $10,000, and wow $25,000 21 hours after the launch of the fund!

We're now a day later and the people who started the fund increased the goal to $50,000 because of the overwhelming response. The fund has already collected almost $45,000, 80% over the initial goal!

I'm happy for Molly, I'm insanely proud and happy the Web allowed that, this is the best incentive I could ever find for my daily job. YAY!

Sunday 29 September 2013

Castle

  • in S06E02, Castle helps investigating the case because he has only a day to live and that way helps so well solving the case he becomes again an assistant to Beckett's team, praised by the federal agents even if he should not be involved ; smart way to have him work again with Kate I think, and good job on the script.
  • at some point in the future, captain "Iron" Gates leaves the 12th precinct or is killed and Beckett is offered the role of captain there, accepts and goes back to NYC, reuniting with Esposito and Ryan and of course Castle.

Tuesday 24 September 2013

META Seal of Recognition

META Seal of RecognitionI am extremely happy and proud to let you know BlueGriffon received last thursday in Berlin, Germany, the « META Seal of Recognition » Award from the Multilingual Europe Technology Alliance for being the very first editor to implement the three main data categories of the W3C Internationalization Tag Set 2.0 (ITS 2.0) :-)

That implementation was done under a contract from DFKI and funding from the European Commission (project LT-Web), 7th Framework Programme (FP7), grant agreement n° 287815. The code is Open Source and will be available with forthcoming version 1.8 of BlueGriffon.

Here is the press release about it:

At the fourth annual META-FORUM conference in Berlin on September 19/20, it was announced that Disruptive Innovations was awarded the META Seal of Recognition for BlueGriffon. The META Seal of Recognition recognises excellence in software, products, and services which actively contribute to the European Multilingual Information Society. The META Technology Council, a panel of 30 experts drawn from the European Language Technology landscape, recognises the contribution BlueGriffon makes to the European Multilingual Information Society.

META, the Multilingual Europe Technology Alliance brings together researchers, commercial technology providers, private and corporate language technology users, language professionals and other information society stakeholders. META is preparing the necessary ambitious joint effort towards furthering language technologies as a means towards realising the vision of a Europe united as one single digital market and information space.

The META Seal of Recognition is awarded annually to select products and services which actively contribute to the initiative’s goals. This year is the third time the META Seal of Recognition has been awarded at a special ceremony as part of META-FORUM 2013 held in Berlin, Germany.

For more information see http://www.meta-net.eu/meta-seal

Tuesday 3 September 2013

Joining Samsung Open Source Group

The 13th of October, Disruptive Innovations will be ten years old. A few days after the last Netscape layoff in July 2003, I decided to benefit from the open source nature of Mozilla, launch my own company and start working on a new standalone editor, an application that eventually became Nvu and lead to BlueGriffon. At the end of 2008, the financial crisis hit us hard and in less than two weeks, most of our customers and prospects just vanished, after five years full of work and projects. I ended up working alone, something I became increasingly fed up with. A while ago, I posted on LinkedIn a message expressing that will/need to join a larger team and move on a bit.

I must say that message on LinkedIn has been incredibly successful, something I did not expect (at least not up to that level...). I got several super-interesting offers and I am then immensely glad and excited to report I have accepted a full-time position as Web Technologies Lead in the recently formed Open Source Group of Samsung. My involvement in W3C standardization activities will not change and may even increase in the near future, but will be performed under Samsung's wings.

As of Disruptive Innovations, the company and the products are still around, no worries, and the BlueGriffon product line will continue to improve and be updated.

A new part of my tech and professional life starts today, wish me luck!

Wednesday 17 July 2013

Internationalization Tag Set (ITS) 2.0 in BlueGriffon

I have been contracted by german company DFKI under a European contract to implement a part of the Internationalization Tag Set (ITS) 2.0 specification into BlueGriffon and I now have a first runnable prototype. So there is a new floating panel in BlueGriffon:

Local ITS state Global ITS rules

Features:

  • The "Locally" tab shows the ITS state of the container element of the selection. The ITS state is computed from the local ITS attributes, the global ITS rules applying to the element and potentially the ITS state inherited from the ancestors of the element (the inheritance rules of ITS 2.0 are fully implemented). That tab of course allows to override that local state and apply local attributes.
  • Three data categories are implemented under the current contract: Translate, Localization Note and Terminology
  • The "Global" tab allows to create and manipulate global ITS rulesets attached to the document, either inline (through a <script type="application/its+xml"> element) or external (through a link element). The order of rulesets attached to the document can be modified. Parameters and ITS rules can be added to the rulesets or moved into the rulesets. During a creation of a ruleset, both XPath and CSS query languages are available. The rule creation/modification dialog has a magic button computing automatically an Xpath or CSS selector for the currently selected element. All global properties defined by the spec are editable with respect to the cardinality defined by the spec. For XPath, the code looks for an already defined HTML namespace in the ITS rules and adds one (that is reported to the user) if that namespace is not present.
  • Parameters are correctly expanded in XPath and CSS selectors during global rules' application.
  • All operations are undoable.
  • The code was architectured with extensibility in mind and it will be pretty easy to add new ITS 2.0 data categories in the future.

All the above will be available in forthcoming BlueGriffon 1.8 to all users for free, thanks to the European Commission!

Monday 15 July 2013

Precisely ten years ago

Precisely ten years ago the 15th of July 2003, I was in Hossegor on the south-western coast of France, coming back from the town's center to my house. Minutes before during a conference call, I had heard « a reorganization is impacting you, Netscape France HR will let you know about it in the coming days, thank you for your time and goodbye » and that's all. I discovered that all friends/colleagues in the US were sending farewell messages. That was the end of Netscape, that was the beginning of Mozilla as a standalone organization, that was the beginning of Disruptive Innovations for me. That was ten years ago, wow...

Yay!

Spend three years working like crazy on a project. Slowly start selling and making a revenue stream. Be on the front line almost 365 days per year, provide people all around the globe with support, tirelessly. And then the following tweet appears:

BlueGriffon EPUB Edition mentioned as one of the 3 EPUB editing environments recommended during the American Association of Physics Teachers' conference

BlueGriffon EPUB Edition mentioned as one of the three EPUB editing environments recommended during the American Association of Physics Teachers' summer meeting, along with OpenOffice and Microsoft Word... And in second position :-) Wow. Wow :-)

Thursday 4 July 2013

Windows 8.1 preview in VirtualBox on a OSX host

You will probably hit an error as soon as your run the VM... To avoid it, open a Terminal and run a list vms command to find the name of your Windows 8.1 VM. Then add some processor data to your VM:

cd /Applications/VirtualBox.app/Contents/MacOS/
./VBoxManage list vms
"Ubuntu 13.04 32bits" {2fc6aab2-689a-48bc-9f52-b37052124f27}
"Ubuntu 13.04 64bits" {73101f39-2b02-4a69-b89b-8d5baa1063d1}
"Windows 8.1" {84433f7a-c1b4-41a5-abe0-220650943c16}
./VBoxManage setextradata "Windows 8.1" VBoxInternal/CPUM/CMPXCHG16B 1

Now you can run your Windows 8.1 VM. Hope that helps...

Monday 24 June 2013

BlueGriffon and '@media print' stylesheets

I'm still playing a lot with (hear "coding on"...) Media Queries in BlueGriffon these days and I ended up trying my own dogfood editing the contents of a famous public web page using Media Queries for responsive design and some @media print stylesheets. Of course, BlueGriffon was not able to show on screen the print stylesheets applied to the document and I found it really sad. So I hacked a little bit (the whole thing is ~10 lines) nsHTMLEditor and nsPresContext to make sure BlueGriffon can show a document in "print" mode in the editable area and of course switch back to the regular screen/all stylesheets. See the result in this youtube video.

Monday 10 June 2013

CSS Flexible Box is Best New Web Technology 2013!

I am extremely pleased to announce that a work done by the W3C CSS Working Group received last week a Net Award as Best New Web Technology 2013 from .net magazine for the CSS Flexible Box Layout Module. This is a bit of an achievement for the CSS Working Group itself, the authors/contributors/editors of the specification, and the W3C. Mucho congrats to all the members of the CSS Working Group and contributors to www-style, you guys rock!

Net Award Best New Web Technology 2013 for CSS Flexible Box Layout Module

Thursday 30 May 2013

Where is Daniel

Thursday 23 May 2013

New customer

I am extremely pleased to welcome the European Parliament as a major user of BlueGriffon.

Thursday 25 April 2013

Developer Tools! Developer Tools! Developer Tools!

Fixing a bug in BlueGriffon's CSS properties panel yesterday, I suddenly had an idea. Six hours of work later, I have a screencast to show you :-)

Tuesday 23 April 2013

Amazon vs. Apple Book Store

Dear Apple,

I wanted to read Nolan Bushnell last book "Finding the Next Steve Jobs" and I wanted to read it on my iPad, and in English. So I visited your Book Store. I can't buy that book, even if it is available in the US Book Store, because my account is a "french" one.

So I installed the Amazon Kindle app. Visited amazon.com. Bought the book there in 5 seconds.

I think I will buy more and more from there in the future.

Well done Apple.

Saturday 20 April 2013

Boston

I just heard journalists on TV say the arrest of Tsarnaev was a big success for the FBI. Sorry, no. This is a big failure for the FBI. I also heard President Obama say the question is why he did that. Sorry, no, this is not what is important for the future. Why two american citizens (correction: one American citizen and one permanent resident) became terrorists without the FBI detecting and arresting them before they act is the important question. A similar problem occurred here in France with terrorist Mohamed Merah. French press reports their mother was questioned at least once in the past about one of the brothers visiting djihadist web sites... If this is true, they were already flagged and FBI failed stopping them; some heads are going to fall at the FBI and a deep reorg will follow.

It has to be noted too that a city lockdown for hunting one single wounded 19 years old man is a quite drastic situation almost nobody complained about. I understand the circumstances. But 9,000 policemen and soldiers who found their suspect only because a citizen found him in his boat also seems a rather pathetic result for the police/FBI/SWAT/army.

I also heard Carmen Ortiz is now in charge of the Tsarnaev case. Wait. Oritz? The Carmen Ortiz mentioned for pursuing the case against Aaron Swartz, right? Urgh.

Update: Republican US Senator Lindsay Graham calls for extreme measures in this case. I find this lame, anti-democratic, catastrophic, a true shame.

(Comments closed, I have no time to moderate blog trolls today)

Thursday 4 April 2013

15 years of Mozilla, my Webstory

  • started working with SGML in 1991 at Grif, implementing the first CALS tables (that eventually gave HTML tables) wysiwyg editor. Worked with Jean Paoli and Vincent Quint. Met Tim Berners-Lee. Started working on stylesheets (the P language in Grif).
  • 1994: working at Électricité de France, one of the first european customers of the recently released Netscape's browser. We bought thousands of licences, Netscape was not even incorporated here yet.
  • 1998: noticed the Mozilla source code release while working for Électricité de France; was already a CSS WG member. Downloaded code to look at it but too much work to really do it well. Met Vidur, Peter Linss, Angus Davis, Troy Chevalier
  • 1998: Peter Linss makes a referral about me at Netscape but a hiring freeze blocks the process
  • june 2000: I am available for hire and Pierre Saslawsky makes another referral about me at Netscape
  • september 2000: interviews in Mountain View with the Layout, Email, AIM and Editor teams. Moments with Vidur, Beth, Clayton and a few others I will never forget.
  • november 2000: hired by Netscape in the editor team, spending a month in Mountain View, starting diving into editor's code with invaluable help from jfrancis, kin, brade, cmanske, beppe, sfraser and mjudge. First bug fix in the style engine code, memory footprint-related. The day I arrive in MV, there's a barbecue party for the release of Netscape 6.0; everyone including me has a NS6 jacket and a trophy, some have a bonus envelop. I discover, to my greatest pleasure, that Netscape is a company that knows how to say thank you. Hixie is an intern at Netscape doing QA, Hamerly and I turn on the lights at 8am, Scott Collins sleeps every night in the cubicle next to mine, I am almost the only one using the espresso machine, there are baby clothes at the Netscape store for my first son and when I refused to eat at Denny's cmanske replied « I knew you had "class" ».
  • december 2000: peterv and I are the only developers at Netscape France. We send a mail to the whole team to introduce ourselves. Only two persons come to say hello, Tristan Nitot and an HR person. We're in a windowless corner of the offices, with sales people shouting on the telephone all the time.
  • 2001: representing Netscape in the CSS WG, helping Beth in the HTML WG but XHTML2 seems to me a gigantic strategic error and I say it in public. When asked why I work from France for Netscape US, I reply « because they do beautiful things ». During a crepes dinner with Tantek in SF, he challenged me to implement :not() in Gecko; flying to San Diego the next day and spending the night on it, showing working implementation to Attinasi the next day. Adding CSS to the editor. Showing Syd Logan how to greatly simplify the IM conversation view with just a dash of CSS.
  • 2002: all of AOL-TimeWarner France including Netscape moves to a new building in Neuilly sur Seine. Cool times, superb corporate restaurant. Many good and sometimes hilarious memories.
  • october 2002: wrote the Small Screen Rendering stylesheet that will be used in Minimo. AOL wants to patent it even if I warn them there is prior art from Opera.
  • december 2002: reorg at Netscape. Many good friends are gone. I'm myself in complete limbos, spending a few awful days and nights.
  • Q1 and Q2 2003: working on the Anvil project, a new editor at AOL will never release. I also start Composer++, a standalone revamp of the Netscape editor that will eventually become Nvu.
  • february 2003: at FOSDEM in Brussels; meet Mozdev's Brian King (of zibble fame) and Pete Collins.
  • 15-jul-2003: laid off by AOL with the remains of Netscape. Leaving Netscape offices only the 2nd of august. My collection of Netscape t-shirts is orphan.
  • september 2003: meeting with Tristan Nitot and Peter van der Beken in Peter's flat, my two Netscape colleagues from the Paris office. I suggest we start together a company making products based on the open source Mozilla. I suggest "Disruptive Innovators" as a company name. Tristan and Peter skeptical, Tristan would prefer launching a european Mozilla foot.
  • 13-oct-2003: Disruptive Innovations is incorporated... Pete Collins and Brian King gave my name to Lindows' CTO who was looking for someone to work on a Gecko-based editor. I start contracting for Lindows immediately, the result will become Nvu.
  • from 2003 to now: promoting Mozilla and Gecko all over the place. Contracted for many companies and academia around the globe, doing xulrunner-based apps or add-ons to Firefox, some public and some proprietary on intranets.
  • august 2006: Disruptive Innovations joins W3C.
  • so many conferences, seminars with other Mozillians I can't count them all. Wonderful time in Barcelona with Chofmann, epic dinner with Rey Bango and Pike in Berlin, cool week-end in Berlin with Robert Nyman. Gave one of my contracts to Paul Rouget.
  • 2008: inviting Mitchell Baker as a KeyNote speaker to the Netexplo Forum under the golden ceilings of the French Senate.
  • 2010: started working on my next-gen wysiwyg Mozilla-based editor. Rewritten from scratch. First investor in april.
  • 10-may-2011: release of BlueGriffon 1.0.
  • 2013: Disruptive Innovations is almost ten years old, what a ride. I'm still spending most of my time on Mozilla code and technologies, editors and Web Standards. I released the only Wysiwyg cross-platform native EPUB editor on the market, and it's of course Mozilla-based.

More details on how got I involved with Mozilla and Why I work for^H^H^Hon Mozilla. I'm still here, and I just contributed a patch to the editor to fix a regression in the table editor. Wishing a long life to a community that changed mine!

- page 2 of 119 -