-->

Maboite.org

Aug 20

Petit memo perso pour ajouter ou supprimer une ligne en bash avec sed.

Insertion de StringToInsert à la position n de file

sed -i  'ni StringToInsert' file

Exemple: Ajouter Hello World à la deuxième ligne de file :

sed -i  '2i Hello World' file

Effacer la ligne n

sed -i  'nd' file

Exemple: Effacer la première ligne du fichier file:

sed -i  '1d' file
\\ tags:

Jan 05

Petit mémo: fonctions pour couper des textes et des phrases sans couper les mots avec preg_replace
Deux utilisation différentes:

La première fonction resumeString coupe un texte au plus près de la longueur maximale demandée.
La deuxième fonction resumeSentence coupe un texte au plus près mais en respectant une césure, soit un caractère ‘,’ ou ‘;’ ou ‘.’ ou ‘-’ afin de conserver le sens de la phrase.

Voici les fonctions et des exemples d’utilisation:

$string =" Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales eget, pharetra a, urna.
Integer in pede ac ante commodo egestas.
Curabitur ut tortor in nisl varius laoreet.
Vivamus massa. Suspendisse blandit condimentum magna.
Donec rutrum lorem non turpis. Mauris eu tellus ac quam convallis pellentesque.";
function resumeString($string, $length = 150){
  if( mb_strlen($string) <=  $length ) return $string;
  return preg_replace('@(^.{'.$length.',})[\s,:;\.-].*$@isU',"$1...",$string);
}
$newString = resumeString($string, 100);
echo strlen($newString)." => ".$newString;

105 => Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales…
Ici, string a été coupé au plus près, à 105 caractères sans prendre en compte la ponctuation mais sans couper les mots. Trois ‘.’ ont été ajoutés pour montrer que la phrase n’est pas complète.

function resumeSentence($string, $length = 150){
  if( mb_strlen($string) <=  $length ) return $string;
  return preg_replace('@(^.{'.$length.',})[,;\.-].*$@isU',"$1.",$string);
}
$newSentence = resumeSentence($string, 100);
echo strlen($newSentence)." => ".$newSentence;

108 => Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales eget.
Ici, string a été coupé au plus près, à 108 caractères en prenant en compte la ponctuation.

\\ tags: , , , ,

Dec 12

Après avoir cherché et utilisé des fonctions html2text, je me suis aperçu qu’aucune ne me satisfaisait vraiment parce que mes besoins n’étaient pas seulement de transcrire en texte.

Pour un projet de moteur de recherche, j’ai besoin de crawler des pages HTML et de sauvegarder seulement les parties intéressantes des pages.

Alors après pas mal de temps à m’amuser avec les regexp, voici quelques lignes de code qui nettoient un code html et essai d’en sortir des phrases:

  $c = file_get_contents("http://www.maboite.org");
  $c = html_entity_decode($c, ENT_QUOTES , "utf-8");
  # delete useless tags
  $c = preg_replace('@<\s?(script|embed|object|style)([^>]+)?>.*<\s?/\s?\1\s?>@isU','',$c);
  # delete comments
  $c = preg_replace('@<!--.*-->+@isU','',$c);
  #replace spacing tags
  $c = preg_replace('@<\s?(br|hr)[^>]*>+@i',"\n",$c);
  # replace tabs
  $c = preg_replace("@\t@i","\n",$c);
  # replacing li and Co by text comma separated
  $c = preg_replace('@\s*<\s?(td|li|dt|ot|dd)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3, ',$c);
  # closing end of list, delete comma and add point
  $c = preg_replace('@\s*,\s*<\s?/\s?(ul|dl|ol)\s?>\s*@isU','.',$c);
  # lot of site are using "a" for listing
  $c = preg_replace("@(<\s?/\s?a\s?>)([^<]+)?(<\s?a)@isU",'\1, \3',$c);
  # replace link by text
  $c = preg_replace('@<\s?a[^>]*>([^<]*)<\s?/\s?a\s?>@isU','\1',$c);
  # replacing img alt for keeping text
  $c = preg_replace('@<\s?img([^>]+)?alt\s?=\s?(["|\'])([^\2]+)?\2[^>]*>@isU',"\n".'\3'."\n",$c);
  #get meta desc
  $c = preg_replace('@<\s?meta\s?name\s?=\s?(["|\'])\s?description\s?\1\s?(lang=\s?(["|\'])[^\3]+\3)?\scontent\s?=\s?(["|\'])([^\4]+)\4([^>]+)?>@isU',"\n".'\5'."\n",$c);
  # get page title
  $c = preg_replace('@<\s?title\s?>\s?([^<]+)\s?<\s?/\s?title\s?>@isU',"\n".'\1'."\n",$c);
  # get text container tags
  $c = preg_replace('@<\s?(p|textarea|div)[^>]*>(.*)<\s?/\1\s?>@isU',"\n".'\2'."\n",$c);
  # because sometimes table are used only for displaying table content, add comma
  $c = preg_replace('@\s*<\s?(td)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3, ',$c);
  # Each tr is a new ligne
  $c = preg_replace('@\s*<\s?(tr)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3'."\n",$c);
  # delete all others tags
  $c = preg_replace('@<[^>]+>@i',"\n",$c);
  # explode all sentence which ended with point and start with an uppercase letter
  $c = preg_replace("@(\.(\s*)?([A-Z]))@",".\n".'\3',$c);
  # multi space delete
  $c = preg_replace("@(\n|\s)+@i",'\1',$c);
  # begin as space delete
  $c = preg_replace('@^(\s)+@i','',$c);
  # sentences ended by :\n must be ended by:
  $c = preg_replace("@:\s?\n+@i",': ',$c);
  # remove the last comma added when replacing links
  $c = preg_replace("@\n,\s+@isU","\n",$c);
  $c = preg_replace_callback(
          "@.*\n@isU"
         ,create_function(
            '$matches'
           ,'return (!empty($matches[0]) && strlen($matches[0]) > 50) ? $matches[0]  : "";'
          )
         ,$c
  );
\\ tags: ,

Nov 27

L’hébergement mutualisé… c’est assez frustrant quand on fait de l’hébergement de devoir intervenir sur une machine mutualisée avec pour seul levier de modification un .htaccess et un accès ftp ; mais bon, il faut bien faire avec parfois.

Alors voici un fichier .htaccess à glisser à la racine (document_root) de votre hébergement mutualisé qui permet de dissocier des noms de domaines qui pointent sur le même serveur et le même document_root.

# on active le moteur de règles de réécriture apache.
RewriteEngine on
# si le HTTP_HOST est www.site-un.com
RewriteCond %{HTTP_HOST} www\.site-un\.com

# et si le REQUEST_URI (le chemin) ne commence pas par /www-site-un-com
# obligatoire sinon la règle bouclerait sur elle même
RewriteCond %{REQUEST_URI} !^/www-site-un-com
# alors tous les requetes sont réécrites dans /www-site-un-com
RewriteRule ^(.*)$ /www-site-un-com/$1

RewriteCond %{HTTP_HOST} www\.site-deux\.com
RewriteCond %{REQUEST_URI} !^/www-site-deux-com
RewriteRule ^(.*)$ /www-site-deux-com/$1

RewriteCond %{HTTP_HOST} www\.site-trois\.com
RewriteCond %{REQUEST_URI} !^/www-site-trois-com
RewriteRule ^(.*)$ /www-site-trois-com/$1

Et voila,  3  domaines avec 3 document_root bien distincts. Mais bon la prochaine fois, opter pour un vrai hébergement mutualisé ou dédié mais pas forcement grand public.

\\ tags: , ,

Oct 02

Petit mémo pour aller chercher l’entête d’une page (headers) et seulement l’entête.
Expression régulière pour le code HTTP de la page, puis détéction de la nouvelle url si code 301.

$url = "http://maboite.org/";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'MyUserAgent');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$headers    = curl_exec($ch);
$CurlErr = curl_error($ch);
curl_close($ch);
if ($CurlErr){
  $status_code  = '404';
}
else{
  # get the status code before downloading the page content
  preg_match("|^HTTP/1\.[0-9]\s([1-5][01][0-9])\s.*$|isU", $headers, $temp);
  $status_code = $temp[1];
}

# if the page has moved, we get the new url
if($status_code == 301){
  preg_match('/\s?[lL]ocation\s?:\s?(.*)\s/',$headers, $temp);
  $url = $temp[1];
}

Pour info, curl est LA meilleur solution pour aller chercher une page sur un serveur distant. file_get_contents et autres fopen ne gèrent pas bien le timeout.

\\ tags: ,

Sep 29

Petit update de la fonction urlize postée précédemment.

function urlize($string){
$find   = array(
'/[^A-Za-z0-9ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]/'  #alphanum + accents
,'/[-]+/'             # multi -
,'/(^-)/'             # - as begin
,'/(-$)/'             # - as end
);
$repl   = array('-','-','','');
return  preg_replace($find, $repl, $string);
}
\\ tags: ,

Aug 12

Si dans vos interfaces d’administration (backoffice) vous installez des textarea WYSIWYG type Tinymce, Htmlarea, FCEditor vous avez déjà sans doute remarqué qu’il n’était pas toujours facile de garder des pages W3C compliants.
Allez expliquer à vos clients que la propriété ALT est obligatoire dans les balises IMG…

Voici donc une méthode automatisée, bien sympa, certe peu délicate mais tellement efficace : le module php-tidy (php5-tidy).
Attention ce module ne permet pas de réparer les pages qui contiennent des centaines d’erreurs, le code se doit d’être propre au minimum.

Voici un exemple simple:

<?php ob_start() ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
                       <!-- manque le head -->
<body>
<img src="toto.gif "/> <!-- manque le alt -->
<body>                 <!--erreur-->
</html>


<?php
$html = ob_get_clean();
$cfg = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 80,
'doctype' => 'strict',
'hide-comments' => true,
'accessibility-check' => 3,
'alt-text' => 'no desc for this image'
);
$tidy = new tidy;
$tidy->parseString($html, $cfg, 'utf8');
$tidy->cleanRepair();
?>

<?=$tidy?>

Et voici le resultat de la page :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title></title>
  </head>
  <body>
    <img src="toto.gif" alt="no desc for this image" />
  </body>
</html>

Ce traitement est bien entendu gourmand et est à utiliser avant la mise en page de page/template/partial.

\\ tags: , , ,

Aug 07

Un serveur dédié c’est bien mais ça coûte cher.
La plupart du temps, je propose à mes clients de l’hébergement mutualisé avec accès FTP, en général tout le monde connait et sait utiliser un client FTP mais les mises à jour avec ce protocole sont fastidieuses.

Heureusement, certains clients utilisent parfois de bons outils : les outils de gestion de version (svn, cvs …).
Voici un petit script que j’utilise pour donner un accès ssh à un utilisateur sur un serveur mutualisé en toute sécurité.
Il pourra ainsi se logguer sur la machine, effectuer les quelques commandes que je lui ai mis à
disposition (cd, cat, chmod, chown, cp, grep, gunzip, gzip mkdir, more, mv, rm, tar, svn et vi)
Avec ces commandes il peut mettre à jour son site tout seul (site de production ou de préproduction).
Afin qu’il ne puisse absolument pas voir les fichiers des autres clients, son compte est “emprisonné” dans ce qu’on appelle un chroot. Un utilisateur chrooté est un utilisateur auquel on a redéfini la racine (/). En plaçant la racine dans le répertoire de l’utilisateur, il ne peut pas voir les fichiers qui se trouvent au dessus.

Voici une image (horrible) mais qui symbolise très bien le fonctionnement:

(image provenant de sun.com)

Dans le nouveau répertoire racine, on recrée l’arborescence (soit à la main, soit avec un bootstrap par exemple le package debootstrap).

Notez que la création d’un chroot avec debootstrap permet d’avoir une distrib complète en quelques secondes. Ce qui est intéressant également avec cette méthode c’est qu’on peut installer des distributions complètement différentes de celle installée initialement.
Encore mieux que le debootstrap, les serveurs virtuels permettent une meilleur gestion de la partie matérielle.

Revenons à notre simple chroot, voici le script inspiré d’autres trouvés sur le net à droite à gauche datant de quelques années mais qui ne fonctionnaient pas, notamment la gestion des bibliothèques dynamique et des commandes à autoriser.

#!/bin/bash
if [ "$#" != 1 ];
then
  echo "Usage : $0 "
  exit 255;
fi

# list of available commands
cmd="/bin/bash /bin/cat /bin/chmod /bin/chown /bin/cp /bin/grep \
        /bin/gunzip /bin/gzip /bin/ls /bin/mkdir /bin/more /bin/mv /bin/rm /bin/tar \
        /usr/bin/svn /usr/bin/vi"

USER=$1
GROUP=chroot
groupadd "${GROUP}" > /dev/null 2>&1
useradd -c "JailsUser" -d "/home/chroot/${USER}/" -g "${GROUP}" -s "/bin/chroot" "${USER}"

echo "#!/bin/bash\nexec -c /usr/sbin/chroot /home/chroot/\$USER /bin/bash" > /bin/chroot
chmod 555 /bin/chroot

echo "User Password"
passwd "${USER}" > /dev/null

mkdir -p /home/chroot/${USER}/bin/ /home/chroot/${USER}/lib/ /home/chroot/${USER}/dev/
cd /home/chroot/
chmod -R 700 ${USER}

for i in $cmd
  do
    cp -R $i /home/chroot/${USER}/bin/
    # TODO : improve with a simple sed
    sudo ldd $i  | grep '/' | cut -d ">" -f2 \
      | cut -d "(" -f1  \
      | sed -e "s/[\t ]//g" \
      | sed -e "s/^/sudo cp /" \
      | sed -e "s/$/ \/home\/chroot\/${USER}\/lib\//" | bash
  done;
# for using /dev/null
mknod /home/chroot/${USER}/dev/null c 1 3 -m 666
chown -R "${USER}:${GROUP}" /home/chroot/${USER}
chmod u+s /usr/sbin/chroot
echo "User \"${USER}\" created and in jails !"
\\ tags: , , ,

Jul 23

salon linux 2009
Le salon Linux 2009, le 10ème, ouvrira ses portes les 31 mars, 1er et 2 avril 2009 à Paris (Hall 2.2, porte de Versailles).

Quelques chiffres pour ce salon linux 2009 :

  • 3 jours
  • 10 000 visiteurs
  • 220 exposants
  • 550 auditeurs

Vous pouvez déposer vos demandes d’interventions sur  le site www.confsolutionslinuxparis.com jusqu’au 3 octobre 2008, voici les sujets de ce salon 2009 :

  • Sécurité
  • Gestion des individus et des identités
  • SGBD
  • Industrialiser les développements JavaEE
  • SOA et Logiciels Libres
  • Informatique industrielle
  • Data Center et Logiciels libres
  • Virtualisation et Clusters
  • Gouvernance des projets Open Source en entreprise
  • Développeurs
  • Poste de travail
  • Outils de gestion de contenu
  • Plates formes décisionnelles en open source
  • Gestion d’entreprise en Open Source
  • Open Source vs Saas : quels choix pour les outils de gestion d’entreprise
  • Collaboration 2.0 : les outils du web et réseaux sociaux adaptés à l’entreprise
  • Web 2.0
  • Votre plateforme internet et intranet avec PHP
  • Zope et Plone
  • Administration électronique libre
  • Culture et numérique
  • Logiciels libres et interopérabilité
  • L’Europe et la commission européenne
  • Session CNDP

Pas mal de chose dans ce programme, donc rendez vous au salon linux 2009 !!

\\ tags: , , ,

Jul 16

PhpTv est une nouvelle emission sur le net parlant bien entendu de PHP.

Dans leur première émission, l’équipe de PhpTv aborde plusieurs sujets:

Le  Google summer of code, PHP 5.3, un comparatif de framework fait par Clever Age (mais à mon avis pas du tout impartial). Ils ont également interviewé e-TF1 sur leurs developpements et leurs developpeurs et enfin, nous avons droit à un petit résumé de Phar.

Cette émission est une bonne idée, techniquement très bien conçue et articulé comme les plus grand journaux télé. Mais personnellement j’ai eu du mal à rester sur mon siège, je ne sais pas si ce sont les sujets trop peu techniques ou si c’est le manque de demonstration mais l’ennui m’a vite gagné, et ce ne sont pas les blagues de geek comme la petit phrase de fin “$monsieur, $madame, exit(0) ” qui vont me captiver. Etant membre de l’AFUP, j’ai assisté à quelques conférences qui était plus longueS mais de loin plus interressantes.

Je pense qu’il va falloir faire un choix: A qui s’adresse cette emission ?

Aux développeurs ?
Aux décideurs ?

A tous ? … ca risque d’être compliqué.

Bref, très bonne initiative, surtout quand on voit le nombre d’utilisateurs et la professionalisation de PHP, très bonne réalisation, mais le fond reste à travailler en fonction de la cible choisie.

http://www.phptv.fr/

\\ tags: , , ,

Création entreprise d'électricité (en étant électricien ou pas)

Créer son entreprise n'est pas facile, je sais de quoi je parle. Alors crée son entreprise en électricité en étant électricien doit être, je suppose, le même combat. Des tonnes de formulaires à remplir, des semaines d'attente de papier en tout genre. Si vous voulez créer une entreprise en électricité, voici déjà comment devenir électricien.

Antigraffiti et hydrogommage

La société HTP Antigraffiti est basée à Paris dans la 18ème arrondissement. Cette société de nettoyage de graffiti(s) et de rénovation propose de l'hydrogommage et bien d'autres techniques pour mettre fin aux graffitiis. Cette société intervient dans tout la France, voici son site internet si vous chercher une entreprise de nettoyage de graffiti

Moteur de recherche RSS

Moteur de rechercher RSS

Vous cherchez un plombier pour une fuite ou des travaux de plomberie ?

Voici un nouveau site, un plombier.com rempli d'informations sur les plombier qui vous permet d'en savoir un peu plus sur les devis de plombier ou sur les différents types de factures.

Vous y trouverez aussi plein d'informtion sur les formations pour devenir plombier.

Vous cherchez un éléctricien ?

Encore un nouveau site, un electricien.com rempli d'informations sur les électricien, des infos pour devenir électricien.