jeudi 23 décembre 2010

Découper un film divx en plusieurs parties sous Ubuntu

Pour découper un film sous Ubuntu, c'est très simple.
Il suffit d'installer le paquet transcode-utils


$ sudo apt-get install transcode-utils


Puis ensuite de saisir le code ci dessous :


avisplit -i mon-gros-film.avi -o mon-film-decoupe.avi -s 699


Le paramètre -s permet de choisir la taille maximal.





dimanche 19 décembre 2010

Modèle commercial Open Source & Licences

Comme tout le monde, je me suis posé la question "mais comment les projets open-source arrivent à vivre ?"

Pour développer un projet open-source il faut du temps et comment trouve-t-on ce temps :
 - le soir et le week-end à la maison. (La vie familiale en prend un coup)
 - en négociant un mi-temps (cette fois c'est le salaire qui déguste)
 - au travail, en négociant que certaines parties non critique d'un projet puisse devenir open-source. (il faut avoir un patron sympa, ou travailler chez Google ou Facebook).
 - on sinon, dernière possibilité, on se lance à 100% dans le projet en espérant recueillir quelques sous plus tard.

Ok donc supposons que l'on choisisse la dernière possibilité. On code pendant quelques mois, puis après on libère le code. Mais sous quelle license ? Et comment gagner de l'argent pour rentabiliser ses quelques mois de développement ?

License BSD, Apache, MIT ou équivalente : sans copyleft (voire LGPL)

Tout le monde peut intégrer le code dans son logiciel, même si c'est un logiciel propriétaire fermé. Bon courage pour gagner de l'argent.

Si le code est populaire, les dons, vendre du conseil, de la formation, de l'expertise, des certifications sont à mon avis, les meilleurs solutions. Mais dans ces cas là, il faut être à la fois un bon développeur (pour que le produit devienne célèbre) et un bon communiquant (pour gagner de l'argent).

Pour les dons on peut citer :
http://www.postgresql.org/about/sponsors
http://www.apache.org/foundation/thanks.html
http://www.python.org/psf/donations/
http://pledgie.com/campaigns/1776#donor_list pour Raphael JS

On peut également rajouter le support 24h/24, 7j/7 avec la garantie d'avoir une réponse en moins de 2 heures (au-revoir les vacances et les nuits, sinon il faut trouver des associés aux 4 coins du globe pour assurer les différents fuseaux horaires.)

Voici un exemple pour le support :
http://www.scalablesolutions.se/support.html

Les doubles licences

C'est la seule façon de gagner de l'argent grâce au code du logiciel.

Le principe de la double license, est un modèle commercial assez fréquent.
Le code est proposé avec deux licences : une license opensource assez restrictive et une license commercial qui permet de passer outre les restrictions.

Seul la personne qui détient l'intégralité du copyright du logiciel peut proposer son logiciel avec une double licence. Par exemple on ne peut pas prendre une librairie GPL existante (MySQL par exemple) et dire que l'on va gagner de l'argent en vendant ce logiciel sous une licence commerciale sans copy-left.



Le fait de posséder le copyright nous permet également de proposer une version commerciale avec plus de fonctionnalités. Les fonctionnalités supplémentaires n'étant pas sous licence open-source.


Dans cette catégorie je liste les licences à utilisation Non-Commertial et les licences virales.

License Open Source non commercial 

Pour l'instant je ne connais que le Creative Commons Non Commercial.
Le code est Open-Source, et toute utilisation au sein d'une entreprise est interdite. Donc pour utiliser le code, il faut soit être une association ou une université, ou simplement pour un usage personnel.
Par conséquent, si une entreprise souhaite utiliser ce produit, elle devra utiliser une autre licence qui sera payante.

Citons par exemple :
http://www.highcharts.com/license

Licenses GPL, Creative Commons ShareAlike : les licenses virales avec copy-left

Tout code dépendant d'un code GPL devient GPL. Donc dans le cas d'une librairie, ce type de license devient très contraignant. On n'a pas envie qu'à cause de l'utilisation d'une librairie GPL que l'ensemble d'un programme devienne GPL.

C'est donc pour cela qu'une licence commerciale est souvent proposée :
http://www.gridgain.com/services.html
http://itextpdf.com/terms-of-use/index.php

Un peu de lumière sur la licence Affero GPL ou AGPL

http://en.wikipedia.org/wiki/Affero_General_Public_License

Le monde des licences est souvent obscure, et c'est le cas de la license GPL.
D'après ce que je comprend, le copyleft de la license GPL ne s'applique QUE SI le logiciel est distribué. Dans le cas, où l'on utiliserait une librairie GPL pour construire un site web, le site web n'étant hébergé que sur nos serveurs, le code n'est pas distribué à d'autre entreprises, nous ne sommes pas contraint de rendre notre code GPL.

Par contre si la license de la libraririe que nous utilisons est AGPL, nous sommes contraints de fournir le code source de notre application sous license AGPL si notre application est visible sur Internet. Attention ça peut faire très mal.

Licenses virales et contributions extérieurs / forks

Dans le cas d'une double licence, si on choisi une licence virale de type GPL + une licence commerciale.

Tant que l'on est les seul à coder sur le programme, il n'y a pas de problème. Le code nous appartient et on est maître de choisir la licence que l'on veut.

Si un mec se présente à nous en disant j'ai rajouté une super fonctionnalité et qu'il nous envoi le code.
Le code envoyé était basé sur la version GPL de notre logiciel, il est donc normal que ce bout de code soit GPL. Le patch ne nous appartient pas, nous n'avons pas le copright. Nous ne pouvons donc pas intégrer ce patch dans notre logiciel sous licence commerciale.

La seule possibilité qui nous reste, pour continuer à faire vivre notre double-license est de demandé au contributeur de bien vouloir nous donner son copyright. Ceci à causé quelque problèmes chez MySQL Par exemple.
http://www.threadingbuildingblocks.org/wiki/index.php?title=Licensing#Why_is_there_a_contribution_process.3F
http://producingoss.com/en/copyright-assignment.html#ftn.id432631

Dans le cas d'un fork, il est bien rare que les contributeurs du forks veillent bien donner leur copyright à la version commerciale.

Les licences incompatibles GPL

Récemment j'ai découvert le logiciel Magento de création de site de e-commerce opensource http://en.wikipedia.org/wiki/Magento
Ce logiciel possède plusieurs licences, dont une commerciale et deux open sources.
Les deux licences opensource ne sont pas compatible GPL et pourquoi?

La version commerciale propose plus de fonctionnalités que la version opensource, dont un service de CMS.

Or actuellement les princiapux CMS (Joomla, Drupal) existant en PHP sont sous license GPL.
Comme Magento est sous license GPL-incompatible il n'est donc pas possible de combiner un CMS GPL avec Magento. Nous sommes obligé d'utiliser la version commerciale pour avoir un CMS intégré à Magento.

A mes yeux les licences incompatibles-GPL forcent les utilisateurs à payer des services qui aurait été disponible dans l’écosystème GPL.

lundi 13 décembre 2010

Selenium 2 Webdriver facile avec Groovy

Voici un script marrant en groovy, qui utilise Selenium 2 WebDriver.

Le script télécharge les librairies Selenium, se connecte sur le site http://www.viedemerde.fr et à l'aide d'un Xpath simple affiche la dernière vie de merde :


#!/usr/bin/groovy

import org.openqa.selenium.remote.*
import org.openqa.selenium.*
import org.openqa.selenium.htmlunit.*;
import com.thoughtworks.selenium.*

/* Télécharge les librairies Selenium */
@Grapes([
    @Grab(group='org.seleniumhq.selenium', module='selenium', version='2.0a7'),
    ])

/* Utilise le navigateur HtmlUnit, mais Firefox, IE, Chrome sont également disponible*/   
WebDriver driver = new HtmlUnitDriver();

/* Se connecte sur le site */
driver.get("http://www.viedemerde.fr/");

/* Récupère la dernière vie de merde */
WebElement element = driver.findElement(By.xpath("//div[@class='post'][2]/p"));

/* Et l'affiche sur la sortie standard */
println(element.getText());


Et maintenant voici comment appeler le script :-)

$ ./vdm.groovy                                                                                                                                                            
Aujourd'hui je dois prendre l'avion pour rentrer chez moi et retrouver toute ma famille qui m'a tellement manqué. Alors que j'ai pris soin de bien programmer mon réveil, celui-ci n'a pas sonné. A... Lire la suite

Faire de l'envoi d'email massif avec Groovy et Commons-email de Apache

Pour envoyer des emails massivement en groovy, voici un script.

Il suffit de remplir la variable to avec des adresses emails séparées par une virgule.
def to="moi@gmail.com, toi@gmail.com, titi@gmail.com"

Et le script enverra un email à chaque personne individuellement. Un destinataire ne verra pas les autres destinataires.

Ce script se base sur la librairie Java commons-email de Apache.


#!/usr/bin/groovy

import javax.mail.*;
import javax.mail.internet.*;
import org.apache.commons.mail.*;

/* Groovy s'occupe de télécharger et d'utiliser la librairie commons-email de Apache. Il n'y a rien d'autre à faire. */
@Grapes([
    @Grab(group='org.apache.commons', module='commons-email', version='1.2'),
])

def subject = "Le sujet de mon email."
def to="moi@gmail.com, toi@gmail.com, titi@gmail.com"

def content = """
Ceci est un texte alternatif car les emails en HTML ne sont pas accepté par tout le monde.
"""

def htmlContent ="""
Ceci est un texte en html
"""

/* SMTP CONFIGURATION */

/* Pour des comptes configurés avec SSL, par exemple Gmail */
def tls = true;
def login = "myLogin@gmail.com"
def password = "MyPassword"


def port = 587
def hostName = "smtp.gmail.com"
def from = login
def debug = true
def charset = "UTF-8"

def cc = null
def bcc = login

/* SETUP */
to.split(",").each{ toEmail ->
    HtmlEmail email = new HtmlEmail();
   
    email.addTo(toEmail.trim());

    if (tls) {
        email.setTLS(true);
        email.setAuthentication(login, password);
    }
    email.setSmtpPort(port);
    email.setHostName(hostName);
    email.setFrom(from);
    email.setSentDate(GregorianCalendar.getInstance().getTime());
    email.setDebug(debug);

    //email.setCharset(charset)
    email.setSubject(subject);
    email.setHtmlMsg(htmlContent);
    email.setTextMsg(content);

    cc?.split(",").each{ it ->
        email.addCc(it.trim());
    }
    bcc?.split(",").each{ it ->
        email.addBcc(it.trim());
    }
    email.buildMimeMessage();
    MimeMessage msg = email.getMimeMessage();

    /* SEND MESSAGE */
    println("Sending message ====> " + toEmail);
    Transport.send(msg);

}



Pour utiliser groovy vous avez besoin d'une JVM installée :
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Et de groovy également :
http://groovy.codehaus.org/Download

Vi en encodage UTF8

Pour forcer VI à utiliser l'encodage utf-8 il faut lui le spécifier comme ça :

:edit ++enc=utf-8

vendredi 10 décembre 2010

Umask facile

Le umask un vrai casse tête, pour se souvenir du code correspondant au chmod.

Par exemple pour obtenir un chmod 640 il faut faire un umask 0027.

Wikipedia nous donne la signification de chaque chiffre :

0 – read, write and execute    
1 – read and write    
2 – read and execute   
3 – read only    
4 – write and execute    
5 – write only    
6 – execute only    
7 – no permissions

Mais le plus simple finalement c'est de se souvenir que l'on peut appeler le umask de cette façon:


$ umask u=rwx,g=rwx,o=   
$ mkdir fu   
$ touch bar   
$ ls -l   
drwxrwx--- 2 dave dave 512 Sep  1 20:59 fu   
-rw-rw---- 1 dave dave   0 Sep  1 20:59 bar

Merci Wikipedia

mardi 7 décembre 2010

Commencer un nouveau projet en scala

Aujourd'hui je vais vous présenter comment créer un projet en scala.

Pour commencer nous avons besoin d'un IDE, d'un outil de compilation sympa et rapide et un peu de scala.


IDE : IntelliJ Idea


Après avoir très déçu par Netbeans (6.9) et après avoir lu que c'était pire sous Eclipse, j'ai installé Idea (9.0.4) et là j'ai trouvé un super IDE.


Installation


Pour installer Idea, cliquez sur le lien ci dessous et choisissez la Community Edition (gratuit)
http://www.jetbrains.com/idea/download/

Ensuite je vous laisse le soin de l'installer suivant votre OS. Vous devrez surement spécifier le chemin du JDK_HOME


Configurer les raccourci clavier


Une fois démarré, si vous n'avez pas l'habitude des raccourci clavier de Idea, vous pouvez utiliser ceux de Netbeans ou d'Eclipse. Pour cela File -> Setting puis cliquez sur Keymap puis choisissez votre keymap préféré.

Choisir un keymap que l'on connait pour idea



Installer le plugin Scala pour Idea



Toujours dans File -> Settings, choisissez Plugins, sélectionnez l'onglet avalaible et recherchez 'scala'. Puis enfin clique droit, Download and Install. Le plugin se télécharge, cliquez sur Apply et Idea redémarre.

Choisir le plugin scala pour Idea

C'est bon vous être pret pour avec IntelliJ Idea. Mais maintenant pour avoir un super environnement de travail je vous conseil de continuer avec la suite.


Outil de compilation : Simple Build Tool


Simple Build Tool ou sbt est un outil de compilation à la maven et exclusivement pour scala.

Comme maven il s'occupe de télécharger sur Internet les dépendances de votre projet.
Mais contrairement à maven, la syntaxe n'est pas du XML mais du code Scala, bien plus concis et efficace.

Installation

Pour installer sbt, rendez vous sur la page du projet : http://code.google.com/p/simple-build-tool/

Télécharger le jar (la version actuelle est  0.7.5-RC0)

et lancer sbt en appelant le jar de cette façon ( facile ;-) ):
java -jar ~/Téléchargements/sbt-launch-0.7.5-RC0.jar

Si vous souhaitez vous simplifiez la vie dans le futur, créez vous un petit script shell (ou bat pour windows)

Voici mon script sbt : /usr/local/bin/sbt
#!/bin/bash
java -Xmx1024M -jar ~/Téléchargement/sbt-launch-0.7.5-RC0.jar "$@"

Maintenant créez un nouveau dossier pour votre projet.

$ mkdir my-project
$ cd my-project
$ java -jar ~/Téléchargements/sbt-launch-0.7.5-RC0.jar
Project does not exist, create new project? (y/N/s)y 
Name: my-project
Version [1.0]: (appuez sur Entrer, vous choisissez la version par défaut)
Scala version [2.7.9]: 2.8.1 (choisissez la dernière version)

Maintenant sbt va télécharger toute les librarires necessaire pour s’exécuter (dont la librairie scala, scalac, ... ça peut être utile quand même)

Une fois terminé, on vous propose de rester dans une sorte de shell. Bienvenu dans sbt.

Faites un Ctr + C pour sortir

Si vous appelez la commande tree (sudo apt-get install tree si vous ne l'avez pas) voici ce qui a été installé sur votre poste.

tree                                    ~/tmp/my-project
.
|-- lib
|-- project
|   |-- boot
|   |   |-- sbt.boot.lock
|   |   |-- scala-2.7.7
|   |   |   |-- lib
|   |   |   |   |-- scala-compiler.jar
|   |   |   |   `-- scala-library.jar
|   |   |   `-- org.scala-tools.sbt
|   |   |       `-- sbt
|   |   |           `-- 0.7.5.RC0
|   |   |               |-- classpath_2.7.7-0.7.5.RC0.jar
|   |   |               |-- compile_2.7.7-0.7.5.RC0.jar
|   |   |               |-- compiler-interface-bin_2.7.7.final
|   |   |               |   `-- compiler-interface-bin-0.7.5.RC0.jar
|   |   |               |-- compiler-interface-bin_2.8.0.final
|   |   |               |   `-- compiler-interface-bin-0.7.5.RC0.jar
|   |   |               |-- compiler-interface-bin_2.8.1.final
|   |   |               |   `-- compiler-interface-bin-0.7.5.RC0.jar
|   |   |               |-- compiler-interface-src
|   |   |               |   |-- compiler-interface-src-0.7.5.RC0.jar
|   |   |               |   `-- jline-0.9.94.jar
|   |   |               |-- control_2.7.7-0.7.5.RC0.jar
|   |   |               |-- io_2.7.7-0.7.5.RC0.jar
|   |   |               |-- ivy-2.2.0.jar
|   |   |               |-- ivy_2.7.7-0.7.5.RC0.jar
|   |   |               |-- jsch-0.1.31.jar
|   |   |               |-- launcher-interface-0.7.5.RC0.jar
|   |   |               |-- sbt_2.7.7-0.7.5.RC0.jar
|   |   |               |-- test-interface-0.5.jar
|   |   |               `-- xsbti
|   |   |                   `-- interface-0.7.5.RC0.jar
|   |   |-- scala-2.8.1
|   |   |   `-- lib
|   |   |       |-- scala-compiler.jar
|   |   |       `-- scala-library.jar
|   |   `-- update.log
|   `-- build.properties
|-- src
|   |-- main
|   |   |-- resources
|   |   `-- scala
|   `-- test
|       |-- resources
|       `-- scala
`-- target

Le dossier project contient toute les dependances de votre projet.

Le dossier src contient les sources de votre projet.

Vous pourriez commencer à coder comme ça. Il vous suffirait de créer un fichier scala dans le repertoire src.

Puis dans sbt, vous exécuteriez la commande : 
> compile

Maintenant si vous souhaitez allier la puissance de SBT avec Idea, suivez le guide.

Simple-Build-Tool + Idea


Il existe un super plugin pour SBT qui génère automatiquement un projet idea.

Sur ce site Internet, toute la démarche est expliqué, mais la voici en français.

Dans le répertoire project, créez le repertoire plugins, puis dans ce repertoire le fichier Plugins.scala
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val repo = "GH-pages repo" at "http://mpeltonen.github.com/maven/"
  val idea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.1-SNAPSHOT"
}

Dans ce fichier scala nous configurons un nouveau repository maven

Le code : 
val repo = "GH-pages repo" at "http://mpeltonen.github.com/maven/"
Est equivalent au XML maven
<repositories> 
    <repository>
        <id>GH-pages repo</id>
        <url>http://mpeltonen.github.com/maven/>
    </repository>              
</repositories>
Le nom de la variable n'est pas important, si on a plusieurs repository on peut les appeler repo1, repo2, ...


Et une nouvelle dépendance maven

Le code 
val idea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.1-SNAPSHOT"
est équivalent au XML maven : 
<dependency>
    <groupId>com.github.mpeltonen</groupId>
    <artifactId>sbt-idea-plugin</artifactId>
    <version>0.1-SNAPSHOT</version>
</dependency>

Le nom de la variable n'a pas d'importance. Je l'ai appelé idea mais j'aurais pu également l'appeler patate.

On voit à quel point scala peut être concis.
Cette façon de gérer des dépendances maven n'est pas unique à sbt. On la retouve également dans ivy, gradle, grapes, buildr ...


Maintenant nous allons utiliser ce plugin dans notre projet sbt.

Dans le répertoire project, créez le reporte build, puis dans ce repertoire le fichier Project.scala
import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) with IdeaProject{
  val scalatest = "org.scalatest" % "scalatest" % "1.2" % "test"
}

Je déclare une nouvelle classe Project héritant à la fois de la classe DefaultProject de sbt et d'une classe IdeaProject. La classe IdeaProject appartient au jar sbt-idea-plugin que nous avons déclaré en plugin. Cette classe sera téléchargée automatiquement par le mécanisme de dépendance.

Dans mon projet je déclare également un dépendance vers scalatest.
ScalaTest est un framework de test plus agréable à utiliser que JUnit.

Courage c'est bientôt la fin, maintenant il suffit d’exécuter les commandes ci dessous pour générer les fichiers idea.
> update
....
> idea
[info] 
[info] == idea ==
[info] Created /home/romain/tmp/my-project/.idea
[info] Created /home/romain/tmp/my-project/project/sbt_project_definition.iml
[info] Created /home/romain/tmp/my-project/my-project.iml
[info] == idea ==
[success] Successful.

Félicitation, vous pouvez maintenant lancer idea et ouvrir votre projet avec.

PS : Si vous modifiez vos dépendances vous devrez exécutez de nouveau les commandes : update + idea, afin qu'Idea connaisse les librairies pour son auto-completion.

Un Hello World en Scala


Créez une classe simple possédant une fonction qui retourne le texte "Hello World" :

package my.project

class MyFirstScalaClass{

  def helloWorld={
    "Hello World"
  }
}


Créez le test correspondant : 
package my.project

import org.scalatest.matchers.ShouldMatchers
import org.scalatest.FunSuite

class MyFirstScalaClassSpec extends FunSuite with ShouldMatchers {
  test("I describe here that my class should tell 'Hello World' when I ask it.") {
    new MyFirstScalaClass().helloWorld should equal ("Hello World")
  }
}

Et maintenant testez avec sbt :
> test
[info] 
[info] == compile ==
[info]   Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[info] Nothing to compile.
[info]   Post-analysis: 1 classes.
[info] == compile ==
[info] 
[info] == test-compile ==
[info]   Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling test sources...
[info] Compilation successful.
[info]   Post-analysis: 2 classes.
[info] == test-compile ==
[info] 
[info] == copy-test-resources ==
[info] == copy-test-resources ==
[info] 
[info] == copy-resources ==
[info] == copy-resources ==
[info] 
[info] == test-start ==
[info] == test-start ==
[info] 
[info] == my.project.MyFirstScalaClassSpec ==
[info] Test Starting: I describe here that my class should tell 'Hello World' when I ask it.
[info] Test Passed: I describe here that my class should tell 'Hello World' when I ask it.
[info] == my.project.MyFirstScalaClassSpec ==
[info] 
[info] == test-complete ==
[info] == test-complete ==
[info] 
[info] == test-finish ==
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0
[info]  
[info] All tests PASSED.
[info] == test-finish ==
[info] 
[info] == Test cleanup 1 ==
[info] Deleting directory /tmp/sbt_2f6b2318
[info] == Test cleanup 1 ==
[info] 
[info] == test-cleanup ==
[info] == test-cleanup ==
[info] 
[info] == test ==
[info] == test ==
[success] Successful.
[info] 
[info] Total time: 6 s, completed 7 déc. 2010 21:54:19
>

Ca marche !!!!!

Pour allez plus loin je vous conseil de lire : 
http://programming-scala.labs.oreilly.com/ livre gratuit pour apprendre scala


mercredi 1 décembre 2010

Idea EAP sans YourKit Java Profiler

Si vous téléchargez IntelliJ Idea 10 EAP, et que vous rencontrez une erreur YourKit Java Profiler :

Editez le fichier :

$IDEA_HOME/bin/idea.vmoption


Et supprimez la ligne :


-agentlib:yjpagent=disablej2ee,disablecounts,disablealloc,sessionname=IntelliJIdea10

Umask pour un utilisateur avec sudo

Humm, voivi ma trouvaille du matin :
J'ai un umask pour mon utilisateur mais dès que je l'appelle via sudo, le umask n'est pas pris en compte.

Après quelques googlage, voici une solution qui marche sous debian : 

Tappez : 
visudo

Et ajoutez : 
Defaults>romain umask=0027

Et pour tester : 
sudo -u romain touch /tmp/titi

ls -l tmp/titi
-rw-r----- 1 romain  romain 0 nov 26 10:08 /tmp/titi


Et pour info voici les extraits du man sudoers : 

umask           Umask to use when running the command.  Negate this option or set it to 0777 to preserve the user's umask.  The default is 0022.


Defaults

Certain configuration options may be changed from their default values at runtime via one or more Default_Entry lines.  These may affect all users on any host, all users on a specific host, a specific user, or commands being run as a specific user.

        Default_Type ::= 'Defaults' |
                         'Defaults' '@' Host_List |
                         'Defaults' ':' User_List |
                         'Defaults' '>' Runas_List