mardi 22 décembre 2015

Utiliser ERB en c++, ou comment transformer un language sexy comme ruby en quelque-chose qui fait peur !

On a beau dire, le c et le c++ sont quand même les langages les plus puissant qui existent (surtout c++ en fait), mais il sont complexes et surtout ne sont pas interprétés !

Pour pallier certain manques de ces langages il est possible de rendre scriptable une application, via une api vers un langage interprété.

Ici on s’intéresse au problème suivant: on veut permettre à l'utilisateur d'inclure certaines commande pour rendre dynamique un document texte qu'il éditerai depuis une application écrite en c++.

J'ai cherché diverses solutions et c'est finalement Ruby qui a retenus mon attention, notamment à cause d'erb, le langage de template intégré à Ruby.

Prenons un exemple simple, un petit code ruby utilisant erb pour imprimer un petit hello world:


#!/usr/bin/ruby

require 'erb'

my_template = "Hello World\nToday is <%# this is just a comment %> <%= MyModule.MyFunc()%>\n"

module MyModule
          def self.MyFunc()
                    Time.now.strftime('%A')
          end
end

my_erb = ERB.new(my_template)
puts my_erb.result()


Mais maintenant, addmettons que l'on veuille faire la même chose en c++, cad au moins pouvoir créer une fonction qui puisse employer les données de nos variables c++ pour les employer dans ruby.

Pour ce faire on va passer par l'API c de ruby, pour ceux qui ne connaissent pas un petit lien sur le tuto !


Le premier défis consiste à obtenir les fichiers de développement ruby, sous ubuntu 15.04 il suffit d'installer ruby-all-dev:

sudo apt-get install ruby-all-dev

Si comme moi vous souhaitez aussi employer pkg-config il faut installer aussi ruby-pkg-config

sudo apt-get install ruby-pkg-config

Voilà, nous sommes prêts à utiliser ruby à l'intérieur de c ou c++. Donc, ça donne quoi le script d'en dessus en c++ ?


#include <iostream>
#include <ruby.h>

#include <cstdio>
#include <ctime>


using namespace
std;

const string erb_line = "Hello World\nToday is <%# this is just a comment %><%= MyModule.MyFunc()%>\n";

VALUE MyFunc(int argc, VALUE* argv, VALUE self) {
  
    time_t rawtime;
    tm* timeinfo;
    char buffer [80];

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(buffer,80,"%A",timeinfo);
  
    string timeString(buffer);
  
    return rb_str_new2(timeString.c_str());
  
}

int main(int argc, char ** argv){
  
    /* construct the VM */
    ruby_init();
  
    /* Ruby goes here */
    ruby_init_loadpath();
    rb_require("erb");
  
    // Define a new module    
    VALUE mymodule = rb_define_module("MyModule");
    //add a function to the module
    rb_define_module_function(mymodule, "MyFunc", (VALUE (*)(...)) MyFunc, -1);

    //get a reference to ERB
    ID sym_erbclass = rb_intern("ERB");
    VALUE erbclass = rb_const_get(rb_cObject, sym_erbclass);
    //list of arguments to initialise erb (1 arg)
    VALUE erbargv[1];
    erbargv[0] = rb_str_new2(erb_line.c_str());
    VALUE myerb = rb_class_new_instance(1, erbargv, erbclass);
  
    //prepare the result
    VALUE resultargv[0];
    VALUE result = rb_funcallv(myerb, rb_intern("result"), 0, resultargv);
  
    cout << string(RSTRING_PTR(result), RSTRING_LEN(result));

    /* destruct the VM */
    return ruby_cleanup(0);
  
}

Un peu plus long n'est-ce pas ? Mais ce n'est pas tant sorcier que cela, c'est juste pénible à chercher dans la doc quand on est dans un cas de figure que les gens rencontrent apparement peu et donc ne documentent guère plus.

Il existe néanmoins des subtilité induite par c++, qui est par exemple plus fortement typé que c, ce qui explique qu'il faille caster de manière judicieuse le pointeur d'une fonction c++ que l'on veut enregistrer dans ruby.

La compilation ne pose pas de problème majeur, le plus dur et de localiser les headers dont dépend <ruby.h> pour les inclures dans le path (ci dessous la ligne que j'ai employé sur ubuntu 15.04):

g++ --std=c++11 main.cpp -o essai -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0/ -lruby-2.1

Vous me direz, tant d'efforts pour pas grand chose ? Je vous rapelle que le but était de pouvoir exploiter les données contenues dans une application c++, hors vous remarquerez que MyFunc peut tout à fait servir d'accesseur ! Ainsi nous disposons de toutes les cartes pour créer des applications exploitant erb.

La prochaine fois je vous montrerai comment cross-compiler une telle application pour Windows depuis Linux !

lundi 9 février 2015

Pourquoi je soutiens bec et ongles l'initiative pour remplacer la TVA par une taxe sur les énergies ?

Pourquoi je soutiens bec et ongles l'initiative pour remplacer la TVA par une taxe sur les énergies ?

Le texte de l'initiative



C'est vrai que quand on me l'a présentée, je me suis dit: "mais quelle bêtise, les gens ne vont jamais vouloir d'un truc pareil." Comment j'ai changé d'avis ?

Premièrement, j'ai appris plus en détail ce qu'était la TVA. À l'époque, je savais déjà que c'était une taxe payée par les entreprises et qui se répercutait ensuite sur le prix et donc le consommateur final. Ayant fait un peu de compta, je savais déjà quel enfer pouvait être la TVA pour les comptables (comptabiliser celle qu'on a payée, celle qu'on doit payer et ce pour chaque petite opération de transformation).

Le premier scoop qu'on m'a asséné à l'époque, naïf lycéen que j'étais, c'est que toute cette complexité avait un coût: car en plus, on doit subir moult contrôles et pouvoir ensuite se justifier sur le moindre achat, et ce, pour les beaux yeux de l'État.

Le second scoop qu'on m'a asséné, c'est qu'il fallait supprimer une autre taxe pour obtenir un vrai effet incitatif avec une taxe pour l'environnement, en tout cas sur les énergies fossiles, car, il faut le savoir, la demande en énergie est passablement inélastique. Cela veut dire quoi ? Cela veut simplement dire que la demande va réagir très peu à une augmentation du prix.

Enfin, et cela je le savais déjà, les quantité disponible de pétroles sont limitée et ce, sans parler des impacts sinistrement négatifs de la consommation d'énergie non-renouvelable. (Un exemple)


Ok, mais pourquoi ne pas prendre une autre solution comme attendre ou une taxe en plus ?

Alors voici la liste de mes argument concernant...

attendre:


  • Attendre ne peut pas permettre à la situation de changer. Du pétrole ne va pas apparaître. Les énergies renouvelables arrivent également à maturité. Il est utopique de croire que l'on arrivera un jour à la même concentration énergétique que l'uranium ou le pétrole et de beaux systèmes centralisés avec le renouvelable.

  • Attendre, c'est prendre le risque toujours plus présent d'une flambée des prix du pétrole qui nous forcerait à changer en urgence.

  • Attendre, c'est relâcher plus de pollution dans l'atmosphère. Outre les effets du changement climatique, les résidus de combustion ont d'autres effets très amusants sur la santé (mais pas agréable pour nous).


Une autre taxe ? La question mérite de se poser! Pourquoi la TE serait meilleures qu'une autre ?

Hé bien justement, car elle remplace la TVA. Et donc:


  • Elle libère les entreprises d'un fardeau administratif. En effet le prélèvement de la TVA est coûteux: 1,8 milliards qui pèsent essentiellement sur les petites entreprises pourtant le nerf de la guerre de l'innovation.

  • Libère les entreprises d'une taxe sur le travail et l'innovation. En effet la TVA oblige à l'innovation d'être 8% plus rentable car elle pèsera sur les prix que l'innovation devra justifier (ou au contraire limitera l'effet de l'innovation pour une baisse des prix)

  • Elle ne représente qu'une redistribution plus intelligente de la facture fiscale. Au final les citoyens ne paieront pas plus dans l'ensemble. Les gens ont peur que cela retombe le plus sur eux mais il ne dépend que d'eux pour s'adapter! Et comme la demande pour s'adapter va augmenter, le besoin en innovation va grandir.


Or, l'innovation c'est le nerf de la guerre contre le gaspillage d'énergie. J'aime me baser sur les explications contenues dans cet exposé, qui explique et démontre que la croissance aujourd'hui, on ne l'a obtenue qu'en ayant les moyens de brûler plus d'énergie à peu de choses près. Bien sûr je ne suis pas entièrement d'accord. L'efficacité énergétique a augmenté aussi et contribué à cette croissance (ainsi un gramme de CO2 émis vous apporte plus de kWh aujourd'hui qu'il y a 40 ans). Mais cela risque de s'inverser bientôt, les nouveaux type de pétroles (schiste, sables bitumineux) et l'augmentation de la part du charbon dans le mix énergétique vont faire diminuer à nouveau l'efficacité énergétique. Par exemple cet article en parle


Or, il y a un autre point sur lequel je ne suis pas d'accord avec lui. Si les ressources énergétiques que l'on a aujourd'hui à disposition correspondent à 200 esclaves, on ne vit pas comme si on avait 200 esclaves à notre disposition et pour cause: on gère l'énergie comme des tordus, en la gaspillant allègrement. Les prochaines opportunités de croissance, à vrai dire celles qu'il nous reste, sont dans l'innovation pour l'efficacité énergétique et les énergies renouvelables. Si on gère correctement notre système économique pour ne pas gaspiller l'énergie que l'on y fait entrer alors on pourra encore croître là dessus.

Par contre, je pense que le risque d'avoir des guerres de l'énergie ou des camps de l'horreur en tout genre avec des réfugiés climatiques n'est pas à exclure. Il n'y a qu'à voir ce qui s'est passé en Irak. Rendre la suisse autonome n'en sera que plus sûr.

Au final les arguments des opposants, bien qu’apparemment convaincants sont soit des mensonges, soit du manque d'information.

Prenons le cas de l'essence annoncée à 5 francs suisses ! Selon les chiffre de 2013 de l'OFEN, en suisse ont été utilisées comme énergies non renouvelables

  • 10'900'000 tonnes de produits pétroliers divers soit 109'000'000'000 kWh

  • 59'300'000'000 kWh d'électricité dont 40% non ENR soit 23'720'000'000 kWh

  • 33'600'000'000 kWh sous forme de gaz soit 33'600'000'000 kWh


soit 166'320'000'000 kWh, avec 21 mia de francs de rentrée fiscale pour la TVA le prix du kWh augmenterai de 12.626 centimes. Le prix de l'essence ne grimperait que de 1.20 chf (et encore à déduire la TVA actuelle soit en réalité à peine 1.10 d'augmentation).

L'idée étant que si la taxe passe, du jour au lendemain le prix de l'essence grimperai à 5 chf... hahaha, ils me font rire. S'il grimpait aussi haut la consommation d'énergie fossile aurait été divisée par plus de 2. Mis à part le fait que la situation serai radicalement différente et que donc il est dur d'imaginer où l'on en sera à ce moment là, cela n'arrivera pas avant de nombreuses années. En effet la demande de combustible fossile est très inélastique et donc varie peu et lentement suite à un changement de prix important.

Et quand on y sera arrivé, le tournant énergétique sera tellement bien engagé que l'on pourra sans problème replacer la TE par autre chose. Personnellement j'aimerai bien adapter l'idée (qui est bien foutue) aux produits écotoxiques qui empoissonnent notre environnement (à tout hasard).

S'il suffisait d'introduire une taxe pour que l'effet soit immédiat (ou quasi immédiat) la gestion des états en serait grandement facilitée !


En claire une idée bonne quoique déstabilisante, combattue par la peur et le mensonge ! Personnellement j'espère que cela va passer. Pour que vous puissiez continuer de vous faire une opinion je vous invite à continuer sur ce blog qui est un peu plus détaillé.