Friday, September 4, 2009

Javascript Inheritance Gotcha


This is a short warning about inheritance with Javascript :

A = function() {
  this.value=5;
  this.arr = new Array();
}
A.prototype.changeValue = function() { this.value=6; this.arr.push(4);}
A.prototype.getValue = function() { return this.value;}
A.prototype.getArray = function() { return this.arr; }

B = function() {}
B.prototype = new A;

function doit() {

  var b = new B();
  alert('#1 : '+b.getValue()); // Should be 5
  alert('#2 : '+b.getArray()); // Should be empty
  b.changeValue();
  alert('#3 : '+b.getValue()); // Should be 6
  alert('#4 : '+b.getArray()); // Should be 4

  var b2 = new B();
  alert('#5 : '+b2.getValue()); // Should be 5,
    // because value didn't change for this instance yet
  alert('#6 : '+b2.getArray()); // Should be empty,
    // because this.arr didn't change for this instance,
    // and yet it is not empty, it contains the value of the previous instance
}

So you've be warned ! Javascript inheritance doesn't work well with objects !

Or maybe I missed something...

This happened on firefox3.0 and firefox 3.5 on ubuntu 9.04

This can be dealt with by adding
B.prototype=new A();
also in the constructor of B. Then the constructor of A get called every time B's get called, and the new object addresses are recomputed.
But then the class specific methods are lost. So they have to be declared again.

This lead to the following solution :
B = function() {
  B.buildPrototype();
  this.that=something;
}
B.buildPrototype = function() {
  B.prototype = new A();
  B.prototype.aMethod = function() {...}
  B.prototype.anotherMethod = function() {...}
}
B.buildPrototype();
This way, the new object is built with the correct dynamic inherited properties, and it's prototype methods are not lost.

Tuesday, September 1, 2009

Some tips for pasting output from the console into TeXmacs

I like TeXmacs. It's a cool editor. But it's also a really weird editor.

So here is how I managed to get output from MySQL into TeXmacs, using vim along the way.

If you paste directly the data into TeXmacs, you don't get much. This is because the | gets in the way, and the spaces are reduced to two. Also, you need to separate each line with a blank line to make it clear to TeXmacs that these should be formatted as single lines and not be joined.

Why does it do that ?? Why do you ask ??

So here's the process :

Copy your data from mysql into vi, which would be something like that :
+--------+-----------+
| %      | name      |
+--------+-----------+
|  51.00 | number    | 
|  84.00 | volume    | 
+--------+-----------+

Then replace each | with \|, remove any trailing spaces, replaces every spaces by \{space}, and finally insert a line in between every lines.

The sequence of operation to perform is vi is the following :
:%s/ \+$//
:%s/|/\\|/g
:%s/ /\\ /g
:%s/$/^M/g

To get the ^M, you should hit Ctrl+V Enter, for any properly configured terminal.

To make this into a function, embed that into
function! MySQL2TeXmacs()
%s/|/\\|/g
%s/ /\\ /g
%s/$/^M/g
endfunction
and save it into ~/.vimrc.

You can use the insert command to insert ^M, since in insert mode, Ctrl+V switch to Visual Mode and back.

Then you can perform the transformation with
:call MySQL2TeXmacs()

You can use Tab here.

Copy the result with the mouse, or use gg"*yG if that works, then in TeXmacs, hit the following keys sequence :
\center F7 Ctrl+Y

This should paste your data properly into TeXmacs.

(cr)Happy TeXmacs-ing ! :))