Harry deserves X Bocks

February 7th, 2010

To all ichcb lovers :)

Mon premier Youpoop

February 4th, 2010

Comment configurer un virtual host sous apache et servir plusieurs sites web à la fois ?

http://bbs.fobshanghai.com/viewthread.php?tid=2238205. Vous nous en laisser un peu d’accord ? ne prenez pas tout svp !

How to quick peel an egg

January 19th, 2010

I am cooking eggs for dinner. I remembered one sprintcuts video on how to quick peel an egg… I had a hard time this morning peeling my egg, I’ll try this now and see if it works for me !

Je voulais avoir une idée des offres d’hébergement web qu’il y avait actuellement en Algérie. Je devais faire une offre pour un client, et je me suis dit ça serait bien de voir ce que font les autres.

Alors les autres c’est la joie :) il y a des écarts importants entre les différents hébergeurs, faites bien attention.

Notez d’autre part qu’il n’ont pas tous le même sérieux, il parait que certains ne répondent pas au téléphone, même quand le serveur est en panne -comme par hasard-.

Selon ce qui est ressorti de cette étude, réalisée sur un échantillon (non représentatif) de 37 offres proposées par 17 hébergeurs, le moins cher est 1dzhost qui propose 10Go d’espace disque et 10 Go de bande passante à seulement 2000 DA, suivi de très près par dzsol; 1 Go d’espace disque pour 2000 DA également et dzairwebhosting qui en demande 300 de plus pour la même offre.

Le plus cher est hostumer, qui vous demande pas moins de 38.000 Da pour du 2Go en espace disque et 50 Go en bande passante ! tout aussi exagérée est l’offre de GS-Internet (2Go / 75 Go) à 36.000 Da. Explication possible : ces prix n’ont pas été revus depuis longtemps (site web non mis à jour).

L’offre qui semble la plus intéressante est de loin celle de cirtahosting, qui offre l’illimité (espace disque, bande passante, BDD, emails…) pour 5000 Da par an ! si mes intuitions s’avèrent correct, il se pourrait que ce soit la même équipe que celle qui animait le forum cirta que je cotyais en 2001 (le site existait peut être même avant !).

Le fichier peut être utilisé librement par toute personne et à toutes fins utiles. Les volontaires sont invités à compléter le fichier et à le redistribuer librement, pensez à m’en faire parvenir une copie, ça m’intéresse.

Il y a 3 feuilles dans le fichier : les offres classées par hébergeurs, par prix et par espace disque.

Il est aisé d’effectuer un tri des données sous openoffice ou excel : sélectionner toutes les cases (sauf la première ligne), puis allez dans Données > Trier (Data > sort). Choisissez ensuite la colonne suivant laquelle vous voulez trier.

Télécharger le fichier

Quelques liens trouvés sur forumdz

Classement des hébergeurs par parts de marché

Meilleurs vendeurs

Avez-vous déjà pris un hébergement DZ ? qu’en avez-vous pensé ? que pensez-vous de ces offres ?

book meme

January 18th, 2010

Found on ben’s blog

  • Grab the nearest book.
  • Open it to page 56.
  • Find the fifth sentence.
  • Post the text of the sentence in your journal along with these instructions.

Don’t dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.

That was easy for me because I actually use the black backcover of an encyclopedia (Bordas) as a mousepad. (that’s what encyclopedias are for, right ?)

The problem is, there’s no page 56 in this book, it starts with page 3192 :). So I guess i’ll have to pick page 3192+56 = 3248. So here it goes, Bordas Encyclopédie, page 3248, 5th sentence (this is chapter 867.2.A.a: Littérature Hispano-Américaine > La période contemporaine > le Modérnisme > Généralités) :

Après la longue période “louis-philipparde” (les Allemands diraient “Biedermeier” et les Britanniques “victorienne”), la nouvelle génération (celle de 1880-1890), touchée par le Parnasse et le symbolisme européens, est en droit de refuser ce monde de planteurs, de boutiquiers, de banquiers de tout poil pour lesquels on a mis en faveur le mot rastaquouère (rastracueros).

A simple FormAlchemy tutorial

December 4th, 2009

Here’s a quick tutorial on the usage of FormAlchemy with Elixir and Pylons.

The model

To illustrate how things work, we will take a very simple example.

Let’s say you have a website where people have to sign in.

Here’s a very simple User class

# Entity binds a class to a table
from elixir import Entity
# Field represents bounds an attribute to a column in your table
from elixir import Field
# Unicode, Integer, DateTime etc. are column types. Pay attention to encoding when you’re using Unicode.
from elixir import Unicode
# This will allow us to represent relations between classes. Elixir will figure out how to represent them
# in the database, between the tables
from elixir import ManyToOne, OneToMany

import datetime # we will use this to put default values in DateTime columns

# Elixir will create a table for each class inherting form Entity
class User(Entity):
    # By default, your table names will look like "ModuleName_ClassName".
    # To change this, you can either pass in a shortnames=True argument to
    # the using_options function, which will tell elixir to create your tables
    # based on ClassName only, or a tablename=’My_Table_Name’ argument.
    # I’m used to have plural names for tables, and single names for classes,
    # so I’ll pass in a tablename arguemnt
   
    # Next thing is the inhertince argument. This will tell Elixir
    # that User can be subclassed.
    using_options (tablename=“Users”,inheritance=“multi”)
   
    # I like powers of 2
    username      = Field(Unicode(32))
    email         = Field(Unicode(64))
    password      = Field(Unicode(32))
    phone         = Field(Unicode(16))
    address       = Field(Unicode(64))
    # Many users may live in One City, so in this case it’s Many(users)ToOne(City)
    city          = ManyToOne(“City”)
    creation_date = Field(DateTime,default=datetime.datetime.now)

# Let’s make a distinction between Persons and Companies. Both are users, wich means they share a certain amount of
# properties, but they can also have different additional attribtues of their own.

class Person(User):
    using_options (tablename=“Persons”,inheritance=“multi”)
    first_name = Field(Unicode(32))
    last_name  = Field(Unicode(32))   

    def __str__(self):
        “”” This method is called when you try to print a user.”“”
        return “%s %s (%s)” % (self.first.encode(“utf-8″), self.last.encode(“utf-8″), self.username.encode(“utf-8″))
   
    def __repr__(self):
        “”” This method is called when you try to print a representation of a user.”“”
        return “” % str(self)   

class Company(User):
    using_options (tablename=“Users”,inheritance=“multi”)   
    logo    = Field(String(32)) # we store only the filename here.
    name    = Field(Unicode(64))
    website = Field(Unicode(64))

Things are looking pretty good so far ! Now let’s write a simple registration form.

The mako template

Let’s begin with the mako template :

<h2>Register to our great website !</h2>
<form action="${h.url_for(action=’processRegistrationForm’,controller=’registration’)}">
${c.form}
<input type="submit" value="go" />
</form>

Very simple code. c.form will contain the html code of the form, generated by formalchemy.

On to the controller action.

The controller

We’ll create a controller named registration for this purpose. Don’t forget to activate your virutal environement.

$(PYLONSENV) paster controller registration

Now let’s edit controller/registration.py

import logging

from pylons import request, response, session, tmpl_context as c
from pylons.controllers.util import abort, redirect_to
from myapp.lib.base import BaseController, render
# These imports up there are generated for you by paster
# Now you’ll need two other imports to generate the form : FieldSet and your model’s Person

# This is a customized FieldSet that will render itself following the template that you’ll find
# in templates/forms/fieldset.mako.
# I have edited that template to use semantic html elements like dl, dt and dd instead of bare div elements.
from myapp.forms import FieldSet

# This represents a form field, we will use this to create a password check form field.
from formalchemy import Field

from myapp.model import Person

log = logging.getLogger(__name__)

class RegistrationController(BaseController):

    def personRegistrationForm(self):
        “”
        Call this action in your mako templates to render the registration form
        “
“”
        fs = self.getPersonFieldSet()       
        c.form = fs.render()
        return render(“/pages/registration.mako”)

    def processRegistrationForm(self):
        “”
        Put this method in your registration’s form’s action attribute.
        <form action=”
/registration/processRegistrationForm“>
        or use
        <form action=”
${h.url_for(controller=‘registration’,action=‘processRegistrationForm’)}“>
        “
“”
        fs      = self.getPersonFieldSet()
        # This will populate the FieldSet with values found in request.params
        fs.data = request.params
        # This will populate the Person instance that FieldSet stores as an attribute named "model"
        fs.sync()
        # Here’s your object :) !
        user = fs.model
        # now do whatever you want with it. For this example, we’ll just return a simple message
        # saying that everything was ok.
        return “User (%s) successfully created” % str(user) # This will call user.__str__

    def getPersonFieldSet(self):
        “”
        Return the fieldset corresponding to a Person
        “
“”
        # Just pass in the class, not a specific instance
        fs = FieldSet(Person)
        # Now let’s add a password check field.
        # name is the attribute name that will be generated
        #
        # By default, formalchemy will append the class name as a prefix to every field name.
        # This is to prevent confusion when two classes may have the same name for one of their attribute.
        pwdcheck= Field(name=“pwdcheck”,type=Unicode)
        # We’ll add it to the FieldSet
        fs.append(pwdcheck)
        # Now we’ll customize the generated HTML with the conigure method.
        # the include argument tells FieldSet objects what fields you actually want to render.
        # A FieldSet consists of a group of Fields. Each field is accessed as an attribute of the FieldSet
        # it’s contained within. The attribute name of that field is the same as the Field name you used
        # in your class declaration.
        fs.configure(include=[fs.first,fs.last,fs.username,fs.city,fs.adresse,fs.email,
                              # Now here we’ll tell fs.password to render itself as a password field
                              # instead of a usual text field. This will return the modified field.
                              fs.password.password(),
                              # Now we’ll configure the pwdcheck field to have a meaningful and helpful label
                              fs.pwdcheck.password().label(“Confirm your password”)])
        return fs

That’s it :) you’re ready to go ! This is actually not too much code, let’s strip the comments to see how much code we needed.

Let’s recap’

the model code, model/__init__.py

from elixir import Entity, Field, Unicode,ManyToOne,OneToMany
import datetime

class User(Entity):
    using_options (tablename=“Users”,inheritance=“multi”)
    # I like powers of 2
    username      = Field(Unicode(32))
    email         = Field(Unicode(64))
    password      = Field(Unicode(32))
    phone         = Field(Unicode(16))
    address       = Field(Unicode(64))
    city          = ManyToOne(“City”)
    creation_date = Field(DateTime,default=datetime.datetime.now)

class Person(User):
    using_options (tablename=“Persons”,inheritance=“multi”)
    first_name = Field(Unicode(32))
    last_name  = Field(Unicode(32))   

    def __str__(self):
        “”” This method is called when you try to print a user.”“”
        return “%s %s (%s)” % (self.first.encode(“utf-8″), self.last.encode(“utf-8″), self.username.encode(“utf-8″))
   
    def __repr__(self):
        “”” This method is called when you try to print a representation of a user.”“”
        return “” % str(self)   

class Company(User):
    using_options (tablename=“Users”,inheritance=“multi”)   
    logo    = Field(String(32)) # we store only the filename here.
    name    = Field(Unicode(64))
    website = Field(Unicode(64))

the mako template

<h2>Register to our great website !</h2>
<form action="${h.url_for(action=’processRegistrationForm’,controller=’registration’)}">
${c.form}
<input type="submit" value="go" />
</form>

The Fieldset.mako template

The interresting part of the mako template for the form generation, templates/forms/fieldset.mako.
Here, I consider the form as a definition list, every label is a definition term, and the inputs are data definitions.

% for field in fieldset.render_fields.itervalues():
% if field.requires_label:
<dl>
<dt>
<label class="${field.is_required() and ‘field_req’ or ‘field_opt’}" for="${field.renderer.name}">${[field.label_text, fieldset.prettify(field.key)][int(field.label_text is None)]|h}</label>
</dt>
<dd>
${field.render()|n}
</dd>
% if ‘instructions’ in field.metadata:
<span class="instructions">${field.metadata[’instructions’]}</span>
% endif
% for error in field.errors:
<span class="field_error">${_(error)}</span>
% endfor
</dl>

The controller

The controller’s code, controller/registration.py. This is where formalchemy comes into play.

import logging
from pylons import request, response, session, tmpl_context as c
from pylons.controllers.util import abort, redirect_to
from formalchemy import Field
from myapp.model import Person
from myapp.forms import FieldSet
log = logging.getLogger(__name__)

class RegistrationController(BaseController):

    def personRegistrationForm(self):
        “”
        Call this action in your mako templates to render the registration form
        “
“”
        fs = self.getPersonFieldSet()       
        c.form = fs.render()
        return render(“/pages/registration.mako”)

    def processRegistrationForm(self):
        “”
        Put this method in your registration’s form’s action attribute.
        “
“”
        fs      = self.getPersonFieldSet()
        fs.data = request.params
        fs.sync()
        user = fs.model
        return “User (%s) successfully created” % str(user) # This will call user.__str__

    def getPersonFieldSet(self):
        “”
        Return the fieldset corresponding to a Person
        “
“”
        fs = FieldSet(Person)
        pwdcheck= Field(name=“pwdcheck”,type=Unicode)
        fs.append(pwdcheck)
        fs.configure(include=[fs.first,fs.last,fs.username,fs.city,fs.adresse,fs.email,
                              fs.password.password(),
                              fs.pwdcheck.password().label(“Confirm your password”)])
        return fs

My picks :

WARNING : SPOILER TEXT BELOW, don’t read before watching the video :)

- “Damn… Four.”
-”South south south…Where are we ?”
-”Skater ?”
-”True.”
-”Judo wrestling”
-”I say, about ten”
-”The what ?”

5ème Barcamp Alger

November 26th, 2009

J’arrive un peu à la bourre, vers 14h30-40, je crois qu’au moment où je suis arrivé il y a vait Microsoft guy qui parlait.. ah oui (je regarde mes notes), je suis arrivé en plein accrochage entre Karim Khelouiati et Microsoft Guy. Pour ceux qui ne connaissent Karim, on croit que c’est un accrochage, mais en fait pas du tout, Karim est comme ça, il le dit lui même, “Je suis comme ça, allah ghaleb, je parle trop !”. Bref, j’arrive en plein dans le premier débat :

Il faut être certifié pour avoir une légitimité.

selon Microsoft guy… Je ne sais pas pourquoi, mais il a tellement insisté sur ce point alors que ça me parait tellement “accessoire”. Je dois bien l’avouer, je n’ai pas eu à passer des certifs parce que dans le langage dans lequel je programme vous êtes à peu près certifié d’office. Vous connaissez beaucoup de monde qui codent en python ? bon, voilà votre réponse. Les gens qui codent en python, ruby, OCaml, Lisp, etc. sont par définition des gens qui cherchent des technos de niche. Ils ne vont pas avoir du mal à se faire recruter parce qu’ils ne seront jamais assez nombreux pour qu’il y ait concurrence à l’embauche. Ce n’est pas le cas d’une de mes connaissances de fac qui a choisi de faire Java. Il n’est pas informaticien, il est mathématico-informaticien, c’est pire ! le gars, c’est un penseur ! mais voilà, il a pris Java, et quand on prends Java, eh ben faut avoir la certif de Sun si on veut être pris. C’est malheureux d’entendre ça, mais le pauvre jeune homme a passé plusieurs mois à chercher du travail sans succès. Un gars lui a conseiller de passer une certif, il a bosser dur, il a eu sa certif, et paf ! embauché !

Pourquoi cette course aux certifications ? une piste possible : Fizz Buzz ! ça peut paraitre choquant, mais en y réfléchissant à deux fois je pense pouvoir l’accepter, la plus part de ceux qui se disent programmeurs ne savent pas programmer. L’article de coding horror est tout aussi intéressant que celui de Joel . Quand je pense à tout ceux que j’ai côtoyé à la fac, qui faisait un copier/coller de codes trouvés ici et là, des inconnus qui m’envoyaient des e-mails proposant argent contre code pour passer tel exam… C’est fou ! pour dire vrai, dans ma promo nous devions être 4 ou 5 à refaire l’année juste parce qu’on avait vraiment envie de se faire plaisir et de faire des projets intéressants, quitte à foirer l’année à cause de ça, si un cours nous intéressait on se tapait des 16 pour ce cours et on avait des 5 ailleurs mais c’était pas grave ! on apprenait vraiment quelque chose contrairement aux autres étudiants qui voulaient uniquement avoir un diplôme à la fin du cycle.

Donc vu sous cet angle, je comprends peut être mieux pourquoi les certifs sont importantes pour filtrer tous les candidats qui se disent programmer en Java. Le cas de Microsoft est pire ! je me rappelle de ce formateur ou professeur (je ne me rappel plus bien) qui disait pendant une discussion à l’une des journées Microsoft organisé au CNIT de la défense (en 2004/2005 si mes souvenirs sont bons ?) “Ce qu’on recherche c’est des programmeurs ! pas des cliqueurs fous !”, parce qu’en fait, c’est un peu ça le problème avec Microsoft, je parle bien sûre de Visual Studio. Cet IDE fait tellement de choses pour vous, vous facilite tellement la vie, génère tellement de code à votre place, qu’à la fin, le nombre de personnes qui vous disent oui je maîtrise la programmation sont en fait des “cliqueurs fous”. C’est à peine si ils touchent au clavier quand ils codent. C’est ce que appellerait peut être mon ami “Y” “les éboueurs du code”, des gens qui font du ménage sur ce que l’IDE a généré.

Mais alors, où trouver et comment trouver des gens compétents ?

C’était la question que se sont posés directement après les intervenants. Alors on a entendu parler d’un certain annuaire qui recenserait les prestataires de services du domaine, et qui serait en cours de création, le gars de emploitic a signalé qu’une solution existait déjà (emploitic en l’occurence, bien sûre -_- ), un étudiant du club .NET a même parlé d’un site student2business, mais qui est en fait axé uniquement sur les étudiants maîtrisant les technos Microsoft.

Alors, pour ce qui est du recrutement, je conseille la lecture de Finding Great Developers, toujours de Joel Spolsky. Vous cherchez des gens brillants ? allez les chercher ! Posez vous la question de savoir : à quelles confs se rendent-ils ? où est-ce qu’ils vivent ? à quelles associations/organisations est-ce qu’ils appartiennent ? Quels sont les sites Internet sur lesquels ils échangent ? Au lieu de faire des campagnes sur des sites génériques type Monster, choisissez des sites spécialisés comme developpez.com, lesjeudis.fr. Malheureusement, il n’existe pas encore de site du genre pour les pros de l’informatique/télécoms en Algérie, et il faudrait en créer un ! s’il existe, ce n’est pas normal que je ne sois pas au courant, il faut qu’il ait plus de visibilité sur les moteurs de recherche !

Il faut de entreprises, pas des consultants éparpillés

Nassim Lounès de med&com a souligné que des consultants éparpillés ne pouvaient pas prétendre à des projets comme e-Algére 2013, il faut vraiment créer des startups et des entreprises pour prendre en charge une telle capacité de travail, sinon, elle sera prises par d’autres.

Microsoft guy suit avec 3 autres conditions à remplir :
1) Avoir un nombre important de développeurs, d’ingénieurs
2) Avoir un plan d’assurance qualité
3) Avoir un processus de développement
4) Et tout le “tralala” du discours habituel du consultant (méthode X,Y,Z, ITIL, conduite du changement blah blah blah…)

Information intéressant pour prendre connaissance de notre retard, l’Egypte, pays d’actualité en ces jours, se fait 3 miliards de dollars en export de services informatiques (développement).

Comme l’accent était ensuite mis par plusieurs participants sur les compétences techniques, je me suis rappelé de l’article paru en September sur wired

Why the beaker should not run the bakery

ou “Pourquoi les boulangers ne devraient pas faire tourner une boulangerie”. Le concept est simple : vous êtes entrepreneur, vous avez milles choses à faire, déléguez. Vous êtes bon en informatique, vous faites de l’informatique, vous n’êtes peut être pas assez compétent pour faire du marketing, le commercial, le comptable et la gérance tout à la fois, sauf si vous faites parti de cet espèce extrêmement rare d’homme-calamar à 8 bras.
De gauche à droite : l’homme-poulpe, l’homme-poulet, l’homme-tigre, l’homme-calamar et l’homme-baleine.

Je ne suis pas entrepreneur moi même, mais ceci est l’observation que je fais de mes lectures de blogs que je suis depuis leur débuts comme simple entrepreneur et blog pour apprenti web ninja.

Plusieurs avis étaient là pour dire qu’il fallait faire un truc “vraiment excellent” (Riad VocalOne pour réussir, que le produit devait être vraiment innovant, blah blah… Lisez l’article Ideas for startups de Paul Graham (ou lisez ma traduction française). Il suffit de voir comment les gens ordinaires (et même des informaticiens !!) travaillent avec l’outil l’informatique et les logiciels et applications qu’ils utilisent, ça va vous donner une idée du chaos qui règne sur cette planète. On utilise Excel comme “base de données”. On utilise Word pour faire des pages web. Regardez tout ces sites web mal faits, tous ses sites ou la boite de recherche ne marche pas… C’est simple ! et pourtant…

Interlude

Ah oui alors pour les gens qui se demandent pourquoi est-ce que je l’appelle Microsoft guy… En fait c’est pas moi, c’est lui ! il nous lâche en plein discours “Microsoft Algérie, c’est moi !”. Waouw. Les gens qui étaient à coté de moi ont applaudis, c’est dire que ça fait de l’effet. Du coup je l’appelle affectueusement Microsoft guy :o)

Autre petit à coté du barcamp, j’ai fait la connaissance de Amine Rahmouni, et on a un petit peu échangé sur PostgreSQL comme alternative à MySQL. PostgreSQL supporte les transactions, les procédures stockées (disponible sous MySQL à partir de la version 5), mais se compare surtout sur les join complexes qu’il arrive à faire plus rapidement que MySQL. Le problème le plus génant pour PostgreSQL est qu’il ne sait pas executer assez rapidement un SELECT count(*) FROM TABLE, alors que MySQL le fait presque instantanément sur les bases de données avec un moteur MyISAM, puisque celui-ci met en cache le count. (Les moteurs InnoDB ne vous donnent aucun avantage à ce niveau). Je ne suis pas encore utilisateur de PostgreSQL, mais vu la popularité qu’il a auprès des développeurs python que je croise sur #pylons, je compte bien m’y mettre un jour ou l’autre. Maintenant il faut rester vigilant, MySQL a tellement gagné en popularité qu’il est maintenant la propriété de Sun, il est donc évident que les prochaines tournures de MySQL vont être largement plus intéressantes que les versions actuelles. Donc, keep an eye on it.

Le volet ADSL

Un membre de ForumDZ est ensuite venu nous parler du problème de l’ADSL en Algérie. Il faut savoir que les problèmes de connexions se trouvent souvent à la dernière maille du chainon : de votre domicile jusqu’à la boi-boite blanche (le placard téléphonique avec pleins de tableaux et pleins de cables en bas du quartier). Mais il peut y avoir des problèmes plus grave, prenez par exemple le central de Kouba qui n’acceptent que 10.000 connexions. Combien y a-t-il d’abonnées à Kouba ? rien qu’à Bir Khadem vous avez plus de 60.000 habitants (en 2006), si un quart de la population avait le téléphone ça nous fait 15.000 lignes. Je viens de voir sur wikipedia, il y a plus de 140.000 habitants (en 2005) à Kouba ! 140.000 !! 10.000 connexions pour 140.000 personnes ! heureusement que ce n’est pas tout le monde qui a le téléphone, sinon !

Donc il y a du boulot, Algérie Télécom est tout simplement dépassé, faute certainement d’une bonne plannification. Ce central de Kouba a été (re?)fait en 2005 si j’ai bien entendu le discours du forumeur, en 2005. Pourquoi ne pas prévoir plus large dès le départ ? C’est un principe connu en programmation connu sous le nom de pool, utilisé souvent avec les threads ou les connexions aux bases de données. L’opération d’ouvrir une nouvelle connexion est coûteuse en ressources et en temps de calcul, on ouvre donc plusieurs connexions d’une seul traite, par exemple 10, qui vont servir à notre application, si on atteint ce seuil, on reserve encore un autre pool de 10 et ainsi de suite. Bien sûre, quand une connexion (ou un thread) se libère, on elle revient dans le pool pour servir plusieurs fois. C’est beaucoup plus efficace de travailler comme ça que de prévoir un tout petit nombre de ressources au début puis d’allouer des ressources supplémentaires en plein milieu du programme.

Un certain Riad (de Vocalone ?) a suggéré une idée que je trouve vraiment bien : faire une sorte de site Internet où on verrait la carte d’Alger et où les utilisateurs pourraient cliquer sur une zone et signaler “il y a une problème de connexion Internet ici”, ou “débit insuffisant”, ou “déconnexions intempestives”. C’est à peu près dans le même esprit que le site de la ligne 13 du métro de Paris, que je prenais presque tout les jours pour rentrer chez moi (un vrai calvair !). Je pense que le site initial a changé de nom et est devenu vous et la RATP, qui est consacré à la fois à la ligne 13 et la ligne A, deux lignes particulièrement merdiques du réseau francilien. Je me rappel qu’au bureau c’était à celui qui se croyait que sa ligne de métro était la pire. “Moi je prends la 4 tout les matin, c’est une cata”, “la 4 ? ha mais tu blagues, t’est déjà monté dans le RER A entre Nation et l’Etoile ?”, “po po po les gars… la ligne 13 c’est vraiment un cas unique ” :/. (non c’est vrai, regardez les résultats de recherches pour métro ligne 13, il y a même un livre qui lui a été consacré ! )

L’idée des intervenants était aussi de dire qu’il faut faire entendre sa voix en tant que consommateur de l’ADSL et dire que les choses ne vont pas bien, c’est pas toujours évident pour AT de savoir quand et où il y a des failles. J’ai protesté à cette remarque parce que je pense que tout fournisseur d’accès doit avoir au minimum un outil de monitoring qui lui permettent de remonter les incidents techniques, les congestions du réseaux, des mécanismes de basculement automatique en cas de montée en charge etc. Mais, encore une fois, les problèmes se situent souvent au “last mile”, le dernier maillon, entre chez vous et l’armoire blanche. C’est difficile de détecter les problèmes à ce niveau, donc il faut prendre le téléphone et râler ! j’ai bien aimé l’intervention d’un des participants, particulièrement la phrase : “Barry White on en a tous bavé.” ! pour ceux qui ne le savent pas, c’était ce que l’EEPAD mettait comme tapis musical pour vous faire patienter au téléphone. L’intervenant en question emmerdait tous les jours son fournisseur d’accès dès que le débit descendait en dessous de 625 Kbps (?) (je n’ai pas le chiffre en tête mais peu importe)

Comme les personnes qui étaient présentes ont confirmé qu’il était nécessaire d’avoir un autre FAI ADSL pour concurrencer AT, j’ai posé une question assez naïve, mais pour laquelle je n’avais pas reçu de réponse sur forumdz (je ne me souviens plus où…) : comment est-ce qu’un opérateur peut tenir la route quand AT de son coté vends à perte ?

Le forumeur reprends et me donne un exemple terre à terre : nous avons du lait subventionné à 25 DA, et nous avons du lait à 75 DA. Est-ce que Candia a fait faillite ? non. Pourquoi ? parce que une partie de la population est prête à payer plus chère pour une meilleur qualité. Je suis tout à fait d’accord, mais le problème est très précisément là : la qualité est la même ! vous n’étiez pas chez EEPAD auparavant ? c’était tout aussi merdique qu’AT ! et pour cause ! le problème se trouve bien souvent chez le client final, dans l’armoire blanche ! quelque soit le concurrent, il devra passer par cette armoire saturée, par les centraux téléphoniques saturés. Où est la différence de qualité ?

Au 26 19 Décembre à HEC !

Voilà, le 5ème Barcamp s’est terminé vers 17h00 comme prévu, si vous n’étiez pas là tant pis pour vous, mais ne ratez pas le prochain qui aura lieu le 26 19 Décembre (merci Amine :) ) à HEC (c’est le nouveau nom chic de l’INC ça ?) Ben Aknoun. Il sera plus axé marketing.

Et vous, étiez-vous présent au barcamp ? qu’en avez vous pensé ? dites-nous ! :p

This is an idiot mistake.

I wanted to create 3 Entities, all sharing a certain amount of behaviour and properties (that is methods and attributes). So I decided to a create a BaseClass where the common code is shared, then create 3 Classes that subclass the later.

So how’s the code gonna look like ?

At first guess, I thought “why would I subclass all my classes from Entity AND BaseClass ? wouldn’t it be better to just subclass BaseClass and then subclass BaseClass from Entity ? thus allowing all the subclasses of BaseClass be Entities ?”

class BaseClass(Entity):
    #Some useful methods and attributes here
    #…

class SubClassOne(BaseClass):
    # Your actual class
    # …

class SubClassTwo(BaseClass):
    # Your class here
    # …
#… more subclasses
 

Bad idea ! If you’re doing this, you are defining BaseClass as an entity, that will be created in the database. And so you’ll get an Exception like

Exception: Column ‘type’ already exist in ‘BaseClass’

when elixir will try to create the second subclass.

So, no, the only way to do it right is to subclass from Entity AND BaseClass.

class BaseClass:
    #Some useful methods and attributes here
    #…

class SubClassOne(BaseClass,Entity):
    # Your class here
    # …

class SubClassTwo(BaseClass,Entity):
    # Your class here
    # …
#… more subclasses