Affichage des articles dont le libellé est Développement. Afficher tous les articles
Affichage des articles dont le libellé est Développement. Afficher tous les articles

mardi 11 avril 2017

Cloner une table

L'objectif du jour : cloner une table de données (dans MySQL) index y compris.

CREATE TABLE <nouvelle_table> LIKE <ancienne_table>;
INSERT INTO <nouvelle_table> SELECT * FROM <ancienne_table>;

Tellement simple ...

mardi 25 août 2015

mailto - retour à la ligne

Comment insérer des retour à la ligne dans un mailto ?
Inutile d'utiliser la balise <br> ou \n, ça ne fonctionne pas. En revanche, l'expression %0A donne les résultats escomptés.

vendredi 5 juin 2015

SELinux sur CentOS

J'ai récemment migré un site php sous apache hosté sur un serveur Ubuntu vers un serveur CentOS.

Le premier problème rencontré après ma migration vers CentOS a été l'upload de fichiers qui ne fonctionne plus.
Pourtant, après avoir vérifié sur le web, les droits de mon répertoire d'upload étaient bien ajustés :

sudo chown apache:apache /var/www/upload_dir
sudo chmod 774 /var/www/upload_dir


Rien à faire, j'ai toujours un « permission denied » dans mon /etc/httpd/logs/ssl_error_log …

Que s'est-t-il passé ? La gestion traditionnelle des droits sur les répertoires est soumises à SELinux (Security-Enhanced Linux). Le principe est que les utilisateurs et les applications peuvent changer les droits d'accès aux répertoires du serveur et pas toujours de la bonne manière. L'administrateur ne peut contrôler tous ces changements de droits.

SELinux va donc recouvrir tous les dossiers du serveur par un niveau ré-haussé de sécurité. Par exemple, il va interdire les accès autres que lecture seule pour http (apache) dans mon /var/www/.

On peut changer le statut de SELinux en modifiant /etc/selinux/config (selinux=enfocing, permissive ou disabled) ou en écrivant

Setenforce 0

Cette commande va permettre de désactiver SELinux mais ne résiste pas à un reboot. Si on modifie le fichier /etc/selinux/config, ça résiste à un reboot.

Passer en disabled ou permissive permet de retrouver l'accès écriture à mon dossier et donc l'upload des fichiers fonctionne à nouveau. Le problème, c'est qu'on perd l'avantage de SELinux.

Comment configurer le système pour ouvrir les droits d'écriture sur certains répertoires (/var/www/upload_dir) et pas sur le reste ?
Voici quelques commandes utiles de SELinux.

Tout d'abord, on peut afficher le « contexte SELinux » associé à un fichier :

ls -Z /var/www/index.php

=> -rw-r--r--  username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html

system_u:object_r:httpd_sys_content_t nous renseigne sur le contexte SELinux sous le format utilisateur:rôle:type:mls. (mls n'est pas affiché)

On peut tester cette commande sur quelques fichiers du serveur pour mieux cerner son fonctionnement.
Pour résumé, apache (httpd_t) peut lire des fichier de type httpd_sys_content_t. Par exemple, apache ne pourrait pas lire un fichier dans le home d'un utilisateur.

Comment modifier le contexte des fichiers ?

chcon -v --type=httpd_sys_content_t /var/www/newfile.php

En récursif :

chcon -vR –type=httpd_sys_content_t /var/www/newdir

Finalement, voici le type qu'on va appliquer aux fichiers dans lesquels on souhaite uploader des fichiers :

chcon -vR unconfined_u:object_r:httpd_sys_rw_content_t:x0 /var/www/upload_dir

Maintenant qu'on a ouvert l'accès à l'upload de fichier, il reste à faire ça correctement en modifiant le code php pour :

  1. vérifier que l'extension du fichier est dans une « white list » (gif, jpg, png, pdf, doc, etc.) ;
  2. vérifier que le type du fichier correspond bien à ce que son extension prétend être.

mercredi 18 mars 2015

Emplacement fichiers de données MYSQL

Pour retrouver et backuper les fichiers de données de MySql suite à un plantage du serveur : tout est dans /var/lib/mysql/

mardi 10 septembre 2013

Numéro de version

Petit aide mémoire pour identifier rapidement les versions de Apache/PHP/MySql :

Apache et PHP : il suffit de créer un petit fichier info.php contenant la commande <?php phpinfo(); ?>
MySql : lancer la query SHOW VARIABLES LIKE 'version%'

lundi 29 avril 2013

Meld

Meld est un petit outil très utile lorsqu'on développe et que l'on est confronté à des problèmes de versioning. Il vous permet de comparer deux (ou trois) fichiers, lignes par lignes. Meld offre les fonctionnalités de base que l'on retrouve dans la plupart des outils de comparaison.

Meld étant dans les dépôts ubuntu, l'installation est donc immédiate :

sudo apt-get install meld

Le logiciel affiche deux panneaux contenant chacun un fichier à analyser. Les lignes supplémentaires sont mises en évidence de part et d'autre avec la possibilité d'intégrer les modifications dans l'autre panneau.


mercredi 3 avril 2013

Clipboard et script

Aujourd'hui, je vous propose un exercice assez amusant et qui pourrait vous être utile.
L'idée est d'insérer une chaîne de caractères dans le clipboard via un script shell.

Pour réaliser l'exercice, installez les deux paquets suivants : xclip et clipit.
Xclip vous permettra d'insérer des choses dans le clipboard, clipit vous permet de conserver le contenu du clipboard lorsque la source a disparu.

sudo apg-get install xclip clipit

Observons l'effet de la ligne suivante :

echo "iron maiden" | xclip

Bein, ça fait pas grand chose. Si si, cela copie notre chaîne de caractère dans le clipboard "primaire". Le clipboard que l'on a l'habitude d'utiliser (le copier/coller classique) est le 3ème clipboard.
Essayez la commande suivante :

echo "iron maiden" | xclip -selection c

Cette fois, un ctrl-v vous affichera le nom du plus grand groupe de heavy metal du monde^^.
Si vous fermez le terminal qui vous a permis de lancer ces commandes, vous observerez que le clipboard est vide. Pour pouvoir conserver son contenu, il vous faut lancer clipit.
Note : vous devez savoir que clipit conservera votre clipboard dans un fichier texte potentiellement lisible par autrui.
Grâce à clipit, vous pouvez insérer du texte dans votre clipboard et en profiter même après la fermeture du terminal.

Soyons fous et essayons d'associer cette ligne de commande à un raccourci clavier.
Pour y arriver, on peut créer un petit fichier clip.sh qui contiendrait le code suivant :

#!/bin/bash
echo "iron maiden" | xclip -selection c

Donnons les droits d'exécution au fichier clip.sh et ouvront l'interface de configuration des raccourcis clavier sous ubuntu. On ajoute un raccourci personnalisé avec le chemin vers notre fichier en commande.


Il reste cependant un dernier détail à régler. En effet, echo introduit systématiquement un retour chariot après la chaîne. Pour remédier à ce problème, il faut utiliser les commandes echo -n ou encore printf.

Ceci étant fait, en activant la touche de raccouci configurée, vous disposez de la bonne chaîne dans le clipboard. Cela peut être utile si vous devez copier tous les jours la même chaîne de caractère longue et complexe comme un numéro de matricule par exemple.




vendredi 22 février 2013

Wireframing

Voici une bonne astuce pour tout web-développeur qui souhaite réaliser une petite maquette en deux clics, trois mouvements. Il s'agit d'un site qui propose une interface flash dans laquelle on construit sa maquette par drag'n'drop. C'est très intuitif et surtout très rapide.
Cela s'appelle mockingbird. A mettre dans vos favoris.


lundi 21 mai 2012

Geany - éditeur code source

Après ma migration vers ubuntu 12.04, je suis toujours à la recherche d'un éditeur html/php. Comme Bluefish n'a pas vraiment remplacé Quanta+, je teste les alternatives. L'objectif étant d'avoir un éditeur léger et offrant des fonctionnalités utiles comme les codes couleurs, la conversion automatique des caractères spéciaux en code html, l'auto-complétion etc.

Aujourd'hui, j'ai découvert Geany présent dans les dépôts ubuntu. Pour être léger, il est léger. Je vous conseille en outre, d'installer les plugins qui vont avec :

sudo apt-get install geany-plugins


Vous y trouverez notamment les plugins "Caractères HTML", "Navigateur de fichier" biens utiles ainsi que "Additions" qui, comme son nom ne l'indique pas bien, permet de laisser des TODO dans votre code et d'afficher automatiquement la liste des TODO de vos fichiers dans l'onglet "tâches" de votre console.

Je vous conseille également de copier le contenu de /usr/share/geany/* dans votre ~/.config/geany/filedefs/ afin de personnaliser les thèmes des différents langages de programmation.
Il est également possible de trouver d'autres thèmes sur le net.


lundi 14 mai 2012

PHP - Pièces jointes


Après l'exercice précédent qui consistait à générer un fichier pdf, je souhaite envoyer ce même fichier par mail à un ou plusieurs destinataires.

Voici donc le bout de script php qui permettra d'envoyer un mail en y attachant une pièce jointe (mon fichier pdf). Au vu de la complexité de ce bout de code, je ne saurais que trop vous conseiller d'englober tout cela dans une sympathique petite fonction.

// email fields: to, from, subject, and so on
$from = "destinateur@email";
$subject = "Sujet du mail";
$message = "Message du mail.";
$file = "fichier.pdf";
$to = "destinataire@email";


// Construction du message et découpage mime
$headers = "From: $from";$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 


// Attachment 
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";


// multipart boundary 
$message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .      "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";


// Préparation attachment
$message .= "--{$mime_boundary}\n";
$fp =    @fopen($file,"rb");
$data =    @fread($fp,filesize($file));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name=\"".basename($files)."\"\n" .  "Content-Description: ".basename($files)."\n" . "Content-Disposition: attachment;\n" . " filename=\"".basename($files)."\"; size=".filesize($files).";\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";


$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $sendermail;
$ok = @mail($to, $subject, $message, $headers, $returnpath);

Voila, n'en profitez pas pour envoyer du spam petits malins ^^

jeudi 10 mai 2012

PHP - Génération de pdf


Le projet du jour consiste à générer un fichier PDF.
La méthode est très simple, se résume à l'installation d'une série de fichiers et quelques lignes de code.

Le contenu de mon fichier PDF sera construit dans une page php. Je peux donc y placer du texte mis en page avec quelques fioritures (tableaux, images, etc.)
Il faut cependant être conscient que la mise en page doit rester simple. Évitez de rajouter du javascript, du flash ou de la css trop complexe. En plus, la page dont contenir du html bien formé (respect strict de la syntaxe et des balises) sinon, c'est le bug du moteur DOM.

Le moteur utilisé n'est autre que dompdf. J'ai pris la 0.6.0 beta qui donne de bien meilleurs résultats que la 0.5.2. Seule chose à savoir, la variable DOMPDF_ENABLE_REMOTE est à false par défaut. Il faut lui donner la valeur true pour pouvoir afficher des images.


La méthode consiste à ouvrir la page php, à injecter son contenu dans une variable. Vous donnez cette variable à manger à dompdf qui se charge ensuite d'effectuer le rendu et de l'envoyer vers un fichier physique. Voici mon bout de code.

#!/user/bin/php
<?php
      include("dompdf-0.6/dompdf_config.inc.php");
      $page = fopen("http://monserveur/mapage.php", "r");
      $texte = "";


      $dompdf = new DOMPDF();


      while(!feof($page)){
            $ligne = fgets($page, 4096);
            $texte .=$ligne;
      }


      $dompdf->load_html($texte);
      $dompdf->render();


      $pdf = $dompdf->output();
      file_put_contents("fichier.pdf", $pdf);
?>

Vous aurez remarqué au passage la première ligne du code. Cela me permet de lancer directement ce script en ligne de commande à partir d'un script.sh ou de mon crontab.
Vous disposez à présent d'un beau petit fichier pdf dans votre répertoire de travail.



dimanche 11 mars 2012

Logithèque (Part. 4)


Le développement

Je ne fais plus autant de dev' qu'il y a quelques années mais je mets tout de même les mains dans le cambouis de temps à autre. En particulier, je travaille occasionnellement sur des applications php. J'ai monté pour l'occasion un petit serveur LAMP sur une machine virtuelle (VirtualBox) pour mes développements.
J'utilise quantas pour gérer mon html/php. C'est simple, léger, il y a un peu de couleur et d'auto-complétion. Le tout suffisamment configurable pour en faire un outil agréable à utiliser et pas trop lourd. J'ai jamais trop apprécié le principe de l'outil de type moissonneuse-batteuse pour juste tailler un rosier.
Filezilla l'outil FTP incontournable tout comme putty pour une session de ligne de commande à distance.
  

Le multimédia

Pour la vidéo : j'utilise Totem ou VLC selon la situation. En général, j'utilise VLC pour écouter ou regarder un podcast en accéléré. Totem est le lecteur tout-venant.
Pour l'audio : je suis pas très convaincu par Rythmbox. Je ne l'utilise que pour écouter les web-radios ou m'abonner à des podcasts. Je lui préfère Totem plus rapide à démarrer. Pour en revenir au podcast, j'ai découvert gpodder très pratique pour l'abonnement à plusieurs podcasts. Il permet de gérer les téléchargement et la conservation. Seulement, il ne s'agit pas d'un lecteur. Il faudra donc le configurer pour choisir le lecteur par défaut. Et là, j'ai un problème! J'aime VLC pour la lecture en accéléré et Totem qui me permet de redémarrer directement l'écoute d'un podcast à l'endroit où j'étais arrivé lors de ma dernière écoute. Si quelqu'un connaît un moyen d'avoir les deux avantages dans un même soft, qu'il le fasse savoir.



  

Les accessoires

J'utilise depuis bien longtemps TrueCrypt qui est le garant de ma vie privée et cela depuis l'époque où j'étais encore sous Window$. Au bureau, j'y met des choses plus personnelles (photos, notes, fiches de paie, etc.) et à la maison, mon budget est bien rangé sous clé grâce à ce petit logiciel efficace et facile à utiliser.



TeamViewer est le logiciel écolo par excellence. Un petit problème sur le PC d'un collègue, que je sois au bureau ou à la maison, TeamViewer est mon ami et j'économise de l'essence.
Dans la même optique écologique, j'utilise depuis un certain temps, ecofont par défaut pour mes documents perso. Une police de caractères qui permet d'économiser de l'encre. En effet, les caractères ne sont pas remplis mais contiennent des petits trous. Je n'utilise les fonts standards que lorsque je crée des documents officiels.


J'utilise TuxGuitar depuis longtemps pour lire des tabs, K3b pour la gravure (je ne me suis jamais bien entendu avec Brasero), GnuCash pour gérer mes petites économies, Calibre pour gérer mes ebooks, Tasque pour mes Todo Lists, Audacity pour l'enregistrement ou le travail du son, Avidemux et OpenShot pour le montage vidéo. Enfin, au niveau des jeux, je préfère passer du temps sur console mais étant fan d'Age Of Empire, j'apprécie beaucoup des projets comme 0.A.D. ou encore Widelands.




Gedit, à l'image de notepad, mais bien supérieur, fait partie de ces petits logiciels qui passeraient presque inaperçus s'ils n'étaient pas les passe-partout de l'informatique. Tous les jours, je crée et je modifie de petits documents texte légers et sans format riche.

J'utilise en plus plusieurs programmes en ligne de commande comme vi ou nano, indispensables pour la prise en main à distance d'un serveur. Enfin, l'utilisation de fichier de script shell est un précieux outil pour l'automatisation de certaines tâches. En particulier, j'utilise ce genre de script pour synchroniser des données vers mes disques durs externes de manière incrémentale.



vendredi 17 février 2012

Javascript : paramètre optionnel

Je désire créer une fonction javascript dont le dernier paramètre serait optionnel.
Voici un exemple qui fonctionne pas trop mal :


function methode(id,value){
    var option=(arguments.length==2)?"default":arguments[2];
    alert(option);
}

Les appels possibles :

methode(1, "ma valeur");      => Message = 'default'
methode(1, "ma valeur", "autre valeur");     => Message = 'autre valeur'

jeudi 16 février 2012

PHP - contrôleur date

Depuis un certain temps, je cherche un contrôleur de date en php qui soit facile à utiliser.

En cherchant sur google, on trouve très rapidement des contrôleurs prêts à l'emploi mais leur utilisation via l'ouverture d'une fenêtre ou d'un div ne me plaît pas toujours.
Ce que je voulais, c'était plutôt une fonction PHP facile à appeler et qui offre un contrôleur simple à utiliser et qui me permette de changer la date, le mois et le jour avec la même simplicité/rapidité.
En plus, je souhaite figer le contrôleur pour éviter que les utilisateurs puissent corrompre le format de ma date (entrer 16/02/2012 au lieu de 2012-02-06).

Je me suis donc retroussé les manches et vous présente ici le résultat de mes efforts.

Le contrôleur se présente comme ceci :


Le code est englobé dans deux méthodes PHP.
La première contient des fonctions javascript communes.
La seconde permet de créer le code html de mon contrôleur.
L'appel se déroule comme ceci :

<? // Fonctions communes
CalendarJS();
 
//Creation de deux controleurs
GetCalendar("date1", "2010-07-28");
GetCalendar("date2", "2012-02-16");
?>
Voici le code de la méthode GetCalendar() :

 <? function GetCalendar($nom,$valeur){?>
<TABLE border="0" cellpadding="0" cellspacing="2">
<TR>
<TD><img src="../images/plus.jpeg" onclick="Add('<?=$nom?>',1)"></TD>
<TD><img src="../images/plus.jpeg" onclick="Add('<?=$nom?>',2)"></TD>
<TD><img src="../images/plus.jpeg" onclick="Add('<?=$nom?>',3)"></TD>
</TR>
<TR>
<TD colspan="3">
<INPUT type="hidden" name="<?=$nom?>" id="<?=$nom?>hidden" value="<?=$valeur?>">
<INPUT type="text" id="<?=$nom?>" maxlength="10" size="10" value="<?=$valeur?>" disabled="true">
</TD>
</TR>
<TR>
<TD><img src="../images/moins.jpeg" onclick="Sub('<?=$nom?>',1)"></TD>
<TD><img src="../images/moins.jpeg" onclick="Sub('<?=$nom?>',2)"></TD>
<TD><img src="../images/moins.jpeg" onclick="Sub('<?=$nom?>',3)"></TD>
</TR>
</TABLE>
<? }?>
L'INPUT visible est mis en disabled=true ce qui oblige à créer un clône invisible qui, lui, sera visible dans le POST de votre formulaire html.

Voici le code de la méthode CalendarJS() :


<? function CalendarJS(){?>
<SCRIPT>
// Fonction qui permet d'ajouter soit une annee, un mois ou un jour a notre controleur de date
function Add(objet, champ){
// Lecture de la valeur date
valeur = document.getElementById(objet).value;
// Decoupage des champs et convertion des valeurs en entier
  annee = parseInt(valeur.substring(0,4));
if(valeur.substring(5,7)=="08") mois=8; // bug javascript
else if(valeur.substring(5,7)=="09") mois=9; // bug javascript
  else mois = parseInt(valeur.substring(5,7));
  if(valeur.substring(8,10)=="08") jour=8;        // bug javascript
else if(valeur.substring(8,10)=="09") jour=9; // bug javascript
else jour = parseInt(valeur.substring(8,10));
  switch(champ){
  case 1:
// ajouter une annee
annee++;
// cas des annees bisextiles
// On evite d'arriver a des situations du genre 2012-02-29 + 1 an = 2013-02-29
if(mois==2 && jour>28) jour=28;
  break;
  case 2:
// ajouter un mois (si on est decembre, on incremente l'annee)
  if(mois==12){
  annee++;
  mois=1;
  } else mois++;
// On evite d'arriver a des situations du genre 2012-01-30 + 1 mois = 2012-02-30
if(mois==4 || mois==6 || mois==9 || mois==11){
if(jour>30) jour=30;
} else if(mois==2) {if(jour>28) jour=28;}
break;
  case 3:
// ajouter un jour
  if(mois==1 || mois ==3 || mois==5 || mois==7 || mois==8 || mois==10 || mois==12){
// cas des mois en 31 jour
  if(jour==31){
// on passe du 31 du mois au 1er du mois suivant
  jour=1;
  if(mois==12){
  mois=1;
  annee++;
  } else mois++;
  } else jour++;
  } else if(mois==4 || mois==6 || mois==9 || mois==11){
// cas des mois en 30 jour
  if(jour==30){
// on passe du 30 du mois au 1er du mois suivant
  jour=1;
  if(mois==12){
  mois=1;
  annee++;
  } else mois++;
  } else jour++;
  } else if(mois==2){
// cas de fevrier
if(annee % 4 == 0) {
// si annee bissextile
    if(jour==29){
// on passe du 29 fevrier au 1er mars
    jour=1;
    mois=3;
    } else jour++;
    } else {
    if(jour==28){
// on passe du 28 fevrier au 1er mars
    jour=1;
    mois=3;
    } else jour++;
}
}
break;
}
// Conversion des resultats en chaine de caracteres
sannee = annee.toString();
smois = mois.toString();
if(smois.length==1) smois="0"+smois;
sjour = jour.toString();
if(sjour.length==1) sjour="0"+sjour;
// on re-injecter les valeur dans le champ date et son champ cache
  document.getElementById(objet).value = sannee+"-"+smois+"-"+sjour;
document.getElementById(objet+"hidden").value = sannee+"-"+smois+"-"+sjour;
}
// Fonction qui permet de retirer soit une annee, un mois ou un jour a notre controleur de date
function Sub(objet, champ, valeur){
// Lecture de la valeur date
valeur = document.getElementById(objet).value;
// Decoupage des champs et convertion des valeurs en entier
  annee = parseInt(valeur.substring(0,4));
if(valeur.substring(5,7)=="08") mois=8; // bug javascript
else if(valeur.substring(5,7)=="09") mois=9; // bug javascript
  else mois = parseInt(valeur.substring(5,7));
  if(valeur.substring(8,10)=="08") jour=8;        // bug javascript
else if(valeur.substring(8,10)=="09") jour=9; // bug javascript
else jour = parseInt(valeur.substring(8,10));
  switch(champ){
  case 1:
// retirer une annee
annee--;
// cas des annees bisextiles
// On evite d'arriver a des situations du genre 2012-02-29 - 1 an = 2011-02-29
if(mois==2 && jour>28) jour=28;
  break;
  case 2:
// retirer un mois (si on est janvier, on decremente l'annee)
  if(mois==1){
  annee--;
  mois=12;
  } else {
  mois--;
  }
// On evite d'arriver a des situations du genre 2012-03-30 - 1 mois = 2012-02-30
if(mois==4 || mois==6 || mois==9 || mois==11){
if(jour>30) jour=30;
} else if(mois==2) {if(jour>28) jour=28;}
break;
  case 3:
// retirer un jour
  if(mois==2 || mois ==4 || mois==6 || mois==8 || mois==9 || mois==11 || mois==1){
// cas des mois qui suivent un mois en 31 jour
  if(jour==1){
// on passe du 1er du mois au 31 du mois precedent
  jour=31;
  if(mois==1){
  mois=12;
  annee--;
  } else mois--;
  } else jour--;
  } else if(mois==5 || mois==7 || mois==10 || mois==12){
// cas des mois qui suivent un mois en 30 jour
  if(jour==1){
// on passe du 1er du mois au 30 du mois precedent
  jour=30;
  if(mois==1){
  mois=12;
  annee--;
  } else mois--;
  } else jour--;
} else if(mois==3){
// cas de fevrier
  if(annee % 4 == 0){
// si annee bissextile
  if(jour==1){
// on passe du 1er mars au 29 fevrier
  jour=29;
  mois=2;
  } else jour--;
  } else {
  if(jour==1){
// on passe du 1er mars au 28 fevrier
  jour=28;
  mois=2;
  } else jour--;
  }
  }
  break;
  }
sannee = annee.toString();
smois = mois.toString();
if(smois.length==1) smois="0"+smois;
sjour = jour.toString();
if(sjour.length==1) sjour="0"+sjour;
  document.getElementById(objet).value = sannee+"-"+smois+"-"+sjour;
document.getElementById(objet+"hidden").value = sannee+"-"+smois+"-"+sjour;
}
</SCRIPT>
<? }?> 

Libre à vous d'utiliser ce bout de code et de l'adapter à vos besoins.

mercredi 15 février 2012

Monter un serveur LAMP

Envie de vous lancer dans du développement php?

Voici les lignes de commandes qui vous permettront d'installer un serveur LAMP (acronyme pour Linux Apache MySql Php) sur une machine virtuelle ou un serveur physique.

Le serveur


Pour commencer, il vous faudra choisir, télécharger et installer un serveur dans une des nombreuses distributions Linux. Moi, j'ai utilisé un serveur Ubuntu par simple question d'habitude.

Si vous êtes vraiment allergique aux lignes de commandes (qu'est-ce que vous fichez ici alors!) vous pouvez toujours installer une version minimaliste de gnome :


>sudo apt-get install gdm gnome-core xfonts-base xserver-xorg

Installation du serveur Apache


>sudo apt-get install apache2
>sudo apt-get install libapache2-mod-chroot+

Voila, ce n'est pas plus compliqué. Pour relancer le service après chaque installation ou modification du paramétrage, >sudo service apache2 restart


Installation de php


>sudo apt-get install libapache2-mod-php5
>sudo a2enmod php5


Pour paramétrer la configuration, ça se passe dans /etc/php5/apache2/php.ini


Installation de MySql


>sudo apt-get install libapache2-mod-auth-mysql
>sudo apt-get install mysql-server


Installation de l'interface phpmyadmin


Ce n'est pas obligatoire mais ça facilite l'administration de vos bases de données en vous offrant une belle interface graphique.

>sudo apt-get install phpmyadmin (à ce moment, il vous faudra définir les accès à l'interface)
>sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin


Installation d'un serveur FTP

Pratique si vous écrivez vos pages php dans un bel éditeur graphique sur votre pc de travail pour ensuite les envoyer sur le serveur.

>sudo apt-get install proftpd


Il vous faudra ensuite éditer le fichier /etc/shells et ajouter la ligne /bin/false.
Un répertoire /home/ftp/ a été créé sur le serveur.
Pour paramétrer le serveur ftp à votre convenance, veuillez éditer le fichier /etc/proftpd/proftpd.conf (adresse du port, nom du serveur, nombre de personne qui peuvent s'y connecter, etc.)
Enfin, démarrez le serveur :

>sudo /etc/init.d/proftpd start

Installer un accès ssh


Une bonne astuce pour accéder à votre serveur à distance - à partir de votre pc de développement par exemple - est d'utiliser une connexion ssh. Pour pouvoir l'utiliser, vous devez installer un serveur ssh sur votre serveur LAMP :

>sudo apt-get install openssh-server


Openssh-client est installé par défaut sur les postes ubuntu. Putty vous sera utile si vous travaillez sous Window$.
Attention à bien configurer votre firewall (ufw) pour permettre la connexion.


Pour plus de documentation sur tous ces programmes, je vous conseille la lecture des articles dédiés sur ubuntu-fr :





Ceci devrait constituer une bonne base pour démarrer vos premiers "Hello world!" en php.
Je vous renvoie également à ce précédent article si vous voulez afficher des graphiques dans vos pages.

Enjoy ...



jeudi 9 février 2012

Graphiques en php

Comment afficher des graphiques sur une application web-based en php?
Une collection de fonctions php a été créée pour réaliser plusieurs types de graphiques et les afficher sur votre site/application. Il s'agit de jpgraph.

Dans un premier temps, il faut se procurer la version appropriée de jpgraph, en extraire le contenu et copier le contenu de src/ dans votre espace de travail.
Pour les fainéants, voici les lignes de commandes :

sudo mkdir /var/www/jpgraph
cd /var/www/jpgraph
sudo tar zxcf jpgraph-<votre_version>.tar.tz

Il faut prendre de soin d'ajuster les droits sur les différents éléments, par exemple : 755 pour les répertoires et 644 pour les fichiers. Voici un petit script pour nos chers fainéants :

#!/bin/bash

find /var/www/jpgraph -type d -print0 | xargs -0 chmod 775
find /var/www/jpgraph -type f -print0 | xargs -0 chmod 664
chmod 755 /var/www/jpgraph
chmod u+x $0

Il reste une petite bug fonctionnalité à fixer. Elle se trouve dans le fichier src/gd_image.inc.php.
Vous devez commenter la ligne JpGraphError::Raise(25128) dans la méthode SetAntiAliasing().

Ceci étant fait, vous pouvez vous inspirer des différents exemples dans src/Examples/ afin de construire et customiser vos propres graphiques.


mercredi 11 janvier 2012

Crontab

L'exercice du jour consiste a réaliser une tâche qui se déroule automatiquement sur mon serveur LAMP tous les jours à minuit. La tâche en question consiste à créer un fichier d'archive avec le backup de mes bases de données mysql.

Première étape : définition de la tâche

Dans un premier temps, on crée un petit fichier exécutable avec les commandes qui vont bien.
Je nomme mon fichier DAILYBACKUP.sh et le place dans /home/user/DB/BACKUP.
Voici le contenu de mon fichier :

#!/bin/bash


# Backup de mes bases vers mon répertoire /home/user/DB/BACKUP/
mysqldump --user=root --password=motdepassesecret BASE1 > /home/user/DB/BACKUP/BASE1.sql
mysqldump --user=root --password=motdepassesecret BASE2 > /home/user/DB/BACKUP/BASE2.sql
...


cd /home/user/DB/BACKUP
# Je crée un fichier d'archive au format ANNEE-MOIS-JOUR.tgz qui contient tous mes fichiers sql
tar czfv `date +"%Y-%m-%d"`.tgz *.sql
# Plus besoin de mes backup .sql
rm *.sql

N'oublions pas de lui donner les droits en exécution : sudo chmod ugo+x DAILYBACKUP.sh


Deuxième étape : automatiser la tâche


Pour automatiser une tâche, nous allons utiliser le cron de Linux. Rien de plus simple, il suffit d'éditer le fichier crontab comme suit :

sudo crontab -e

Anciennement, l'éditeur par défaut était vi. Dans mon cas, la commande me demande de choisir mon éditeur. Tant qu'à faire, je choisi d'utiliser nano qui est très user-friendly.
Dans le crontab, j'ajoute la ligne suivante en fin de fichier :

0 0 * * * /home/user/DB/BACKUP/DAILYBACKUP.sh


Cette dernière ligne signifie que mon script DAILYBACKUP.sh s'exécutera tous les jours à 00:00.
En d'autre terme, des fichiers de backup au format ANNEE-MOIS-JOUR.tgz se créeront quotidiennement.

Et voila, mission accomplie pour aujourd'hui.