Libellés

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

mercredi 24 novembre 2010

Comment réussir du SEO Local

Aujourd'hui je vais vous parler d'un site pour qui j'ai travaillé le SEO local : Search Engine Optimization.

Le site en question est un hôtel à saint Etienne.
Les seuls phrases clefs qui sont importantes sont donc 'hotel saint etienne' ou 'hotel st etienne'.

Donc jusqu'ici vous pouvez me dire que c'est assez simple, mais en réalité la concurrence est assez dur sur ces mots clefs, et j'ai été obligé de tout optimiser afin d'être bien référencé sur google.

Le site est maintenant en 3eme position sur Google. Je peux donc dire que ces améliorations ont été efficaces.

Voici en bref les 10 astuces pour réussir son SEO local :
  1. création d'un nouveau site en HTML pure (l'ancien était en flash)
  2. changement d'url de 'http://www.hotel-austria.fr' vers 'http://hotel-austria-saint-etienne.fr'
  3. mise en place du titre 'Hotel Saint Etienne : Hotel Austria à St Etienne' sur la première page, les autres pages gardent au moins 1 fois référence à 'Saint Eteienne'
  4. mise en place d'un titre h1 très gros sur tout les pages : 'Hotel Austria à Saint Etienne'
  5. écrire l’adresse de l’hôtel dans le footer de chaque page au format vcard
  6. essayer de placer les mot 'hotel', 'Saint Etienne' ou 'St Etienne' au moins une fois par page, en gras, souligné ou en lien c'est encore mieux.
  7. création d'une page plan contenant plusieurs itinéraires. Cela permet de citer les villes limitrophes.
  8. essayer d'écrire du texte intéressant pour les internautes avec plein de synonymes de 'hôtel' par exemple : chambre, réservation, lit, ...
  9. optimisation de la vitesse de chargement de la page à l'aide de Yslow.
  10. valoriser google place avec de belles photos
Et en image :
Comment réussir son SEO local



valoriser votre image sur google place

Comment créer son adresse au format vcard pour moteur de recherche : 
<div id="coordonnee" class="vcard">
    <span class="fn org">Hotel Austria</span> <!-- Le nom de votre entreprise -->
    <span class="tel"><a href="tel:+33477934777">04 77 93 47 77</a></span> <!-- Telephone, le href="tel:+334...." permet de créer un lien vers le numéro avec des téléphones portables type iPhone, Android, ...  -->
    <span class="adr"> <!-- La balise adr indispensable avant d'écrire son adresse. -->
        <span class="street-address">21 place Massenet</span> <!-- adresse -->
        <span class="postal-code">42000</span> <!-- code postal -->
        <span class="locality">Saint Etienne</span> <!-- ville -->
    </span>
</div>

Comment optimiser la vitesse de chargement de votre site : 
Dans votre google webmaster, vous pouvez visualiser la vitesse de chargement de votre site. C'est donc un paramètre important à prendre en compte pour les moteurs de recherches.
Voici les quelques grandes lignes qu'il faut respecter : 


  1. compresser les pages HTML, CSS, javascript
  2. regrouper tous vos javascript dans un seul fichier (pareil pour vos css)
  3. minifier vos javascript et vos css (enlever les commentaires par exemple)
  4. éviter les appels à des éléments extérieurs (facebook, twitter par exemple)
  5. retravailler vos images afin qu'elle ne soit ni trop grosse, ni trop moche (a cause d'une forte compression) 
Vous pouvez tester votre site en installant l'un ou l'autre : 
Ylow et pagespeed vous permettent de compresser vos images afin de ne pas perdre en qualité mais gagner en place.

Si votre site est en PHP je vous conseil d'utiliser l'outil : http://code.google.com/p/minify/ qui vous permet de grouper et minifier vos javascript et css.

Si votre site est héberger chez OVH voici mon .htaccess qui compresse les documents HTML, javascript et CSS

SetEnv REGISTER_GLOBALS 0
SetEnv ZEND_OPTIMIZER 1
SetEnv MAGIC_QUOTES 0
SetEnv PHP_VER 5
# Activer le filtre
SetOutputFilter DEFLATE
# Certains navigateurs ne peuvent pas avoir GZIP (les vieux)
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Certains navigateurs ne peuvent pas avoir GZIP (les vieux)
BrowserMatch ^Mozilla/4\.0678 no-gzip
# On ne veut pas d'IE
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# On ne compresse pas les images, elles le sont déjà
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
#on gère le cas des proxy
Header append Vary User-Agent env=!dont-vary

jeudi 18 novembre 2010

Comment supprimer le paramètre PHPSESSID ovec OVH

Si vous aussi google analytics vous apprend que vous avez plus de 500 pages différentes et que la seule différence est un paramètre : PHPSESSID=d7273f07a3619f107da3965eafdb3076.


Voici comment s'en débarrasser avec OVH : 

Dans le répertoire www de votre site, éditez le fichier .htaccess (si il n’existe pas créez le). Et à la fin du fichier rajouter la ligne : 
SetEnv SESSION_USE_TRANS_SID 0