banneer

Réducteur d'URL tinad:

Collez l'adresse du site:

Rechercher sur le blog du grouik:

#Main:

bulle_tchat-406.jpgUn tchat, mélangeant les techniques suivantes: javascript, AJAX, PHP, mysql et JSON, en moins de 150 lignes. Il y a quelques mois Hempstar proposait sur ce blog sa version du chat. Comme j'ai énormément progressé dans ces langages de programmation, je me demandais si je saurai le faire, en quelques heures, en bouffant moins de ressources réseau.

Réponse: Oui, sans trop lutter; Le voici à l'aide d'une iframe:

Mises à jour fev 2012:

  • smileys (désactivables). Ceux que j'ai mis dans le package proviennent de phpBB3 http://www.phpbb.com/ en GNU GPL licence V2 (enfin je crois).
  • Les caracteres + et & n'étaient pas pris en charge. c'est résolu.
  • la barre de défilement ne descend automatiquement que s'il y a des nouveaux messages.
  • la touche e,ntrée envoie le message, pas un retour à la ligne.

Pour l'installer:

Creez la table tchat dans une base de données:

  1. CREATE TABLE `tchat` (
  2. `time` TIMESTAMP NOT NULL ,
  3. `pseudo` TEXT NOT NULL ,
  4. `message` TEXT NOT NULL ,
  5. PRIMARY KEY ( `time` , `pseudo` ( 5 ) )
  6. ) ENGINE = MYISAM
  • Télécharger l'archive là: tchat.tar.gz
  • Décompressez la dans un dossier sur votre site
  • Editez le fichier index.php pour renseigner les paramètres de la base de données

C'est pret!

Quelques explications sur le code:

La base de données

Basique:

  1. CREATE TABLE `tchat` (
  2. `time` TIMESTAMP NOT NULL ,
  3. `pseudo` TEXT NOT NULL ,
  4. `message` TEXT NOT NULL ,
  5. PRIMARY KEY ( `time` , `pseudo` ( 5 ) )
  6. ) ENGINE = MYISAM

le code PHP

Deux fonctions: l'enregistrement d'un nouveau message et l'envoi des informations sur les nouveaux messages dans un tableau au format JSON. Lors du refresh on n'envoie que les messages dont la date est supérieure à celle passée en variable POST $lasttime. L'enregistrement se contente d'une requête et ne retourne rien.

  1. <?php
  2. //**********Options à parametrer**************
  3. $nombreDeMessagesGardes=50;
  4. $enableSmileys=true;
  5. $smileysPath="smilies/";
  6. $mysqlparam=array(
  7. 'username' => '',
  8. 'password' => '',
  9. 'host' => 'localhost',
  10. 'database' => ''
  11. );
  12. //********** Fin des options ************
  13.  
  14. //connexion mysql
  15. if (!mysql_connect($mysqlparam['host'], $mysqlparam['username'], $mysqlparam['password'])) {
  16. erreur('Impossible de se connecter à MySQL');
  17. die;
  18. }
  19. mysql_query("USE ".$mysqlparam['database']);
  20. //Nettoyer les variables en entrée
  21. foreach($_POST as $keyname =>$value){
  22. }
  23. if (!isset($act)){
  24. $act="";
  25. }
  26. switch($act)
  27. {
  28. case "refresh":
  29. if(!isset($lasttime)){
  30. die;
  31. }
  32. //echo "SELECT time,pseudo,message FROM tchat WHERE time > '".$lasttime."' ORDER BY time ASC LIMIT 0,50";
  33. $rs=mysql_query("SELECT time,pseudo,message FROM tchat WHERE time > '".$lasttime."' ORDER BY time DESC LIMIT 0".$nombreDeMessagesGardes);
  34. while($r=mysql_fetch_row($rs)){
  35. $messages[]=array($r[0],$r[1],$r[2]);
  36. }
  37. $messages=array_reverse($messages);
  38. echo(json_encode($messages));
  39. die;
  40. break;
  41. case "add":
  42. if((!isset($pseudo)) OR ($pseudo =="") OR (!isset($message)) OR ($message=="")){
  43. echo "variable vide";
  44. die; //il y a un probleme, on kill le script
  45. }
  46. if($enableSmileys AND file_exists($smileysPath."smileys.php")){
  47. //les smilays
  48. include $smileysPath."smileys.php";
  49. foreach($phpbb_smilies as $smile){
  50. $message=str_replace($smile['code'],'<img src="'.$smileysPath.$smile['smiley_url'].'" alt="'.$smile['smiley_url'].'"/>',$message);
  51. }
  52. }
  53. mysql_query("INSERT INTO tchat (time,pseudo,message) VALUES (NOW(),'".$pseudo."','".$message."')");
  54. die;
  55. break;
  56.  
  57. case "":
  58. break;
  59. default:
  60. //aucun des cas prévu, on stoppe le script.
  61. die;
  62. break;
  63. }
  64. ?>

Le code javascript

Trois function, la functrion ajax utilisée par les deux autres pour faire des appels au serveur, la function pour ajouter un message et la function pour raffraichir le tchat. Cette dernière est bouclée : t=setTimeout("refreshchat(lasttime)",3000); permet de la rappeler 3 secondes plus tard (délai qui me semble un bon compromis entre la charge réseau et la fluidité).

L'array contenant les derniers messages du tchat est récupéré de cette manière:

  1. eval ("messages = " + xhr.responseText);

Et pour les ajouter à la fin, J'utilise le DOM avec la function appendChild:

  1. var pmessage=document.createElement("p");
  2. pmessage.innerHTML='<em class="date">'+ messages[l][0] + '</em><em class="pseudo">' + messages[l][1] + ':</em>' + messages[l][2];
  3. document.getElementById("tchat").appendChild(pmessage);
  1. function onKeyEnter(key)
  2. {
  3. if (key == 13) {
  4. sendmessage(document.getElementById('pseudo').value,document.getElementById('message').value);
  5. return true;
  6. }
  7. return false;
  8. }
  9. function Ajx()
  10. {
  11. var request = false;
  12. try {request = new ActiveXObject('Msxml2.XMLHTTP');}
  13. catch (err2) {try {request = new ActiveXObject('Microsoft.XMLHTTP');}
  14. catch (err3) {try {request = new XMLHttpRequest();}
  15. catch (err1) {request = false;}
  16. }
  17. }
  18. return request;
  19. }
  20. function refreshchat(time)
  21. {
  22. var xhr = Ajx();
  23. xhr.onreadystatechange = function(){if(xhr.readyState == 4){
  24. if(xhr.status == 200) {
  25. var messages= new Array();
  26. eval ("messages = " + xhr.responseText);
  27. var yaDesNouveauxMessages=false;
  28. for (var l in messages){
  29. yaDesNouveauxMessages=true;
  30. var pmessage=document.createElement("p");
  31. pmessage.innerHTML='<em class="date">'+ messages[l][0] + '</em><em class="pseudo">' + messages[l][1] + ':</em>' + messages[l][2];
  32. document.getElementById("tchat").appendChild(pmessage);
  33. lasttime=messages[l][0];
  34. }
  35. if (yaDesNouveauxMessages){
  36. //on redescend la scrollbar
  37. document.getElementById("tchat").scrollTop=document.getElementById("tchat").scrollHeight;
  38. }
  39. t=setTimeout("refreshchat(lasttime)",3000);
  40. }else{
  41. alert("Error code " + xhr.status);
  42. }
  43. }};
  44. xhr.open("POST", "index.php", true);
  45. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  46. xhr.send('act=refresh&lasttime=' + time);
  47. }
  48. function sendmessage(pseudo,message)
  49. {
  50. pseudo = pseudo.replace(/&/g,"%26");
  51. message= message.replace(/&/g,"%26");
  52. pseudo = pseudo.replace(/\+/g,"%2B");
  53. message= message.replace(/\+/g,"%2B");
  54. if ((message=='') || (pseudo=='')){
  55. alert('Veuillez mettre un pseudo et un message');
  56. }
  57. var xhr = Ajx();
  58. xhr.onreadystatechange = function(){if(xhr.readyState == 4){
  59. if(xhr.status == 200) {
  60. document.getElementById("message").value="";
  61. }else{
  62. alert("Error code " + xhr.status);
  63. }
  64. }};
  65. xhr.open("POST", "index.php", true);
  66. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  67. xhr.send('act=add&pseudo=' + pseudo + '&message=' + message );
  68. }

Le Body HTML:

<body>
<div id="page">
<div id="tchat">
  <script type="text/javascript">
	<!--
		lasttime='0';
		refreshchat(lasttime);
	//-->
  </script>
</div>
<div id="reponse">
  <fieldset><legend>Envoyer un message</legend>
    <label for="pseudo">Pseudonyme:</label><input type="text" id="pseudo"/>
    <label for="message">Message</label><textarea onkeypress="onKeyEnter(event.keyCode);" id="message"></textarea>
    <input type="button" value="Envoyer" onClick="sendmessage(document.getElementById('pseudo').value,document.getElementById('message').value);"/>
  </fieldset>
</div>
</div>
</body>

C'est super sommaire comme tchat.

Il vous faudra probablement coder certains certains compléments, comme l'authentification des utilisateurs, faire des salons différents etc... L'objectif ici était juste de montrer que c'est pas tres dur, pas de fournir un produit fini, mais plutot un struc simple et facilement intégrable sur un blog, site ou extranet...

Je m'envoie quelques fleurs:

Au niveau de la charge serveur, il n'y a pas de session ouverte (mémoire économisée), Le retour d'information est relativement optimisé grâce au JSON. Idéalement on pourrait mettre en cache la valeur du dernier timestamp pour n'ouvrir une connexion mysql que s'il y a des messages au timestamp supérieur à celui envoyé par la navigateur (et donc dans la majorité des cas ne même pas ouvrir de connexion mysql).


E-mailVoici une fonction pour envoyer un e-mail en PHP avec des pièces jointes quelque soit leur extension (ou presque).

La machine qui m'a servi à faire les tests est un champs MX du domaine, et l'adresse de l'expéditeur appartient au domaine (ça aide.)

Le résultat des essais:

  • Vers une boite e-mail free -> OK
  • Vers une boite e-mail du travail (c'est un postfix maison) -> OK
  • Vers une boite hotmail -> OK
  • Vers une boite aol: ça passe dans les spam
  • Vers une boite gmail -> OK

Plusieurs façons de fournir les pièces jointes sont possibles. les explications sont données au deuxième bloc de commentaire.

L'écriture de ce script a été possible grace à un tutoriel du site du zéro qui m'a bien servi de support.

Voici quelques exemples d'utilisation (qui m'ont servi pour les tests):

  1. //on post files
  2. SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],$_FILES,$_POST['objet']);
  3. // on array files
  4. SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],array('/var/www/AAPC.doc','/var/www/consultation.doc'),$_POST['objet']);
  5. //juste un string
  6. SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],'/var/www/AAPC.doc',$_POST['objet']);

Voici la function:

  1. <?php
  2. function FilePathToArray($leFichier)
  3. {
  4. if (!file_exists($leFichier)){
  5. return false;
  6. }
  7. $AboutTheFile=pathinfo($leFichier);
  8. return array(
  9. 'chemin' => $leFichier,
  10. 'nom' => $AboutTheFile['filename'],
  11. 'extension'=>$AboutTheFile['extension'],
  12. 'mimeType'=> mime_content_type($leFichier),// mime_content_type est une function obsolète (je sais), mais bien pratique.
  13. 'contenu' => chunk_split(base64_encode(file_get_contents($leFichier))) //ounch les ressources
  14. );
  15.  
  16. }
  17. function SendEmailwidthJoin($message_txt,$message_html,$destinataire,$expediteur,$fichiersAJoindre,$objet,$replyTo="" )
  18. {
  19. /*
  20.   * Envoie un e-mail "propre" avec des pièces jointes
  21.   *
  22.   * Codé par gnieark http://blog-du-grouik.tinad.fr février 2012
  23.   * Distribué sans aucune garantie dans les conditions établies là http://blog-du-grouik.tinad.fr/pages/Mentions-l%C3%A9gales
  24.   *
  25.   * Vous ne devez pas supprimer ce bloc de commentaires.
  26.   *
  27.   * La création de ce code est en tres grande partie basée sur le tutoriel de Weaponsb qui a sévi sur le site du zéro:
  28.   * "Envoyer un e-mail en PHP" http://www.siteduzero.com/tutoriel-3-35146-e-mail-envoyer-un-e-mail-en-php.html
  29.   *
  30.   */
  31.  
  32. /*
  33.   * *** How to use this function ***
  34.   * $fichiersAJoindre peut être:
  35.   * - un string contenant le chemin vers un seul fichier
  36.   * - un array sous la forme array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2', etc...);
  37.   * - un array structuré comme la super variable globale PHP $_FILES:
  38.   * $array('file1' => array('
  39.   * 'name' => ,
  40.   * 'type' => ,
  41.   * 'tmp_name' => ,
  42.   * 'error' => ,
  43.   * 'size' => ),
  44.   * 'file2' => array(
  45.   * (..)etc)
  46.   * )
  47.   * /!\ Aucune vérification sur du directory transversal n'est faite au niveau de cette function.
  48.   * En cas de variables fournies par l'utilisateur, prenez le soin de protéger en amont de cette function.
  49.   * $message_txt (obligatoire contient le message au format txt)
  50.   * $message_html facultatif (envoyez une string vide "" si vous ne souhaitez pas envoyer votre message en html)
  51.   * $destinataire : 'nom@fai.com' ou '"Nom Prenom<nom@fai.com>"' ou '"Nom1 Prenom1<nom1@fai.com>,Nom2 Prenom2<nom2@fai.com>"'
  52.   * $expediteur: idem
  53.   * $replyTo: facultatif, si différent de l'expéditeur.
  54.   */
  55.  
  56.  
  57. //=== vérifier et préparer les pieces jointes:
  58. $arrayFiles=array();
  59. if (is_string($fichiersAJoindre)){
  60. $lesFichiers[]= FilePathToArray($fichiersAJoindre);
  61. }
  62. if (is_array($fichiersAJoindre)){
  63. //tester si c'est du type $_FILES
  64. if ((isset($fichiersAJoindre[0])) AND (is_string($fichiersAJoindre[0])) ){
  65. //un array simple avec des strings
  66. foreach($fichiersAJoindre as $stringFile){
  67. $lesFichiers[]= FilePathToArray($stringFile);
  68. }
  69. }else{
  70. //de type $_FILES
  71. foreach($fichiersAJoindre as $arrayFiles){
  72. $aboutFile=pathinfo($arrayFiles['name']);
  73. $lesFichiers[]=array(
  74. 'chemin' => getenv('TMP')."/".$arrayFiles['tmp_name'],
  75. 'nom' => $aboutFile['filename'],
  76. 'extension'=>$aboutFile['extension'],
  77. 'mimeType'=> mime_content_type(getenv('TMP')."/".$arrayFiles['tmp_name']),// mime_content_type est une function obsolète (je sais), mais bien pratique.
  78. 'contenu' => chunk_split(base64_encode(file_get_contents($arrayFiles['tmp_name']))) //ounch les ressources
  79. );
  80. }
  81. }
  82. }
  83.  
  84.  
  85. //===générer les délimiteurs dans l'email ===
  86. do{
  87. $leRand=md5(rand());
  88. $boundary = "-----=".$leRand;
  89. }while(!strpos($message_txt.$message_html, $leRand) === false); // oui, la vérification là , c'est du zèle.
  90.  
  91. do{
  92. $leRand=md5(rand());
  93. $boundary_alt = "-----=".md5(rand());
  94. $isOK=true;
  95. foreach($lesFichiers as $fichier){
  96. if(!strpos($fichier['contenu'], $leRand) === false){
  97. $isOK=false;
  98. }
  99. }
  100. }while($isOK==false);//là en plus d'etre du zele, ça bouffe les ressources
  101.  
  102. //=== le type de retour à la ligne ===
  103. if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $destinataire)){
  104. $passage_ligne = "\r\n";
  105. }else{
  106. $passage_ligne = "\n";
  107. }
  108.  
  109. //=== header ===
  110. $headers ="From: ".$expediteur.$passage_ligne;
  111. if ($replyTo==""){
  112. $headers.= "Reply-to: ".$expediteur.$passage_ligne;
  113. }else{
  114. $headers.= "Reply-to: ".$replyTo.$passage_ligne;
  115. }
  116.  
  117. $headers.= "MIME-Version: 1.0".$passage_ligne;
  118. $headers.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"".$boundary."\"".$passage_ligne;
  119.  
  120. //=====Création du message.
  121. $message = $passage_ligne."--".$boundary.$passage_ligne;
  122. $message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
  123.  
  124. //=====Ajout du message au format texte.
  125. if ($message_txt!=""){
  126. $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
  127. $message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
  128. $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
  129. $message.= $passage_ligne.$message_txt.$passage_ligne;
  130. }
  131. //==========
  132.  
  133. //=====Ajout du message au format HTML.
  134. if ($message_html!=""){
  135. $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
  136. $message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
  137. $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
  138. $message.= $passage_ligne.$message_html.$passage_ligne;
  139. //On ferme la boundary alternative.
  140. $message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
  141. }
  142. //==========
  143.  
  144. //pièces jointes
  145. foreach($lesFichiers as $fileArray)
  146. {
  147. $message.= $passage_ligne."--".$boundary.$passage_ligne;
  148.  
  149. $message.="Content-Type: ".$fileArray['mimeType']."; name=\"".$fileArray['nom'].".".$fileArray['extension']."\"".$passage_ligne;
  150. $message.="Content-Transfer-Encoding: base64".$passage_ligne;
  151. $message.="Content-Disposition: attachment; filename=\"".$fileArray['nom'].".".$fileArray['extension']."\"".$passage_ligne;
  152. $message.= $passage_ligne.$fileArray['contenu'].$passage_ligne.$passage_ligne;
  153. }
  154. $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
  155. //echo $message;
  156. //Envoi du mail
  157. mail($destinataire, $objet, $message, $headers);
  158. }
  159. ?>

l'icone "e-mail" en en tête de ce billet provient du site economie-numerique.net



Un petit billet d'humeur.

  • Passage chez free Mobile: +20 € dans mon budget
  • Fin de l'abonnement premium chez megaupload: +10€
  • Ajout d'un abonnement canalplay : - 10€
  • Abonnement Grooveshark, ou spotify ou deezer -5€
  • total: +15€

Sauf que Canalplay, ça ne marche pas sous linux: canalplaySucks.png. et que c'est une base de films incomplète. Car dans le marché de la VOD, le revendeur a l'exclusivité pour le film sur une période donnée! Peut être que c'est pour ça qu'aucune plateforme de VOD ne me plait suffisamment pour que je sorte ma carte bleue (hormis kzplay). rajoutons donc 15€ de locations complémentaires sur d'autre plateformes.

Sauf que les services de streaming musical...pas moyen de se graver un CD pour la voiture. Compter 200€ /24 mois ~ 10€/mois pour un portable avec un android récent, une prise jack bien standard. L'abonnement pour le mode écoute hors connexion passe à 10€.

Nouveau total: -25€ (-45 € si je ne compte pas Free qui en soit n'a rien à voir là dedans) pour un accès bien inférieur à la culture cinéma /séries / musiques


2012-19441.jpg

Bonne année 2012 à tous. Je vous souhaite La santé, la thune, l'amour; ou tout simplement le bonheur.

Le feu d'artifice en javascript provient de Rasmus http://www.peters1.dk

Et comme il est intégré à ce billet, il faut que j'en rédige 5 pour ne plus le voir sur la home page du blog du grouik :p


Ce mémo a pour objectif d'expliquer comment automatiser le transfert d'un fichier par FTP. Pratique lors de la création de passerelles.

Prérequis: un serveur FTP. Le compte FTP utilisé est chrooté dans le dossier dans lequel doivent être déposés les fichiers. Pour créer le serveur FTP, ce billet donne la solution.

Pour le moment, on va faire un truc simplissime:

Je crée 3 fichiers scriptFTP.jpeg

  • script.bat est le script qui lancera le transfert. Il sera mis en tâches planifiées (pour ça, je vous laisse trouver comment on fait)
  • plannings_Extranet.ftp est la liste de commandes à éxécuter en FTP pour basculer les fichiers vers le repertoire FTP. Vous l'avez compris, la petite passerelle que je suis en train de faire a pour but de basculer les planings sur notre extranet.
  • Plop.txt est le fichier qui sera transféré; C'est juste pour le test hein!

script.bat

Il contient juste une ligne pour le moment.

  1. ftp -s:planings_Extranet.ftp

Il lance le client dos ftp, qui prendra la liste d'instructions contenues dans le fichier planings_Extranet.ftp

planings_Extranet.ftp

  1. open 192.168.10.253
  2. user
  3. password
  4. prompt
  5. lcd D:\testFtp
  6. put plop.txt
  7. quit

Explication ligne par ligne:

  • 1 Ouvrir la connexion vers le serveur 192.168.10.253
  • 2 Lui indiquer l'user FTP
  • 3 Lui indiquer le mot de passe ftp
  • 4 Attendre le prompt
  • 5 Se placer localement dans le repertoire comprenant le(s) fichiers à transférer
  • 6 envoyer le fichier
  • 7 fermer la connexion

plop.txt

Bah, c'est le fichier à transférer; OSEF?

Lancez script.bat, vérifiez sur le serveur de destination si le fichier a bien été poussé.

Un peu plus compliqué; On va pousser tous les fichiers d'un répertoire et créer un fichier de logs.

Prérequis, télécharger curl

Pour se simplifier un peu la vie, cette fois, on va utiliser curl. Téléchargez l'éxécutable qui correspond à votre version de windows: http://curl.haxx.se/download.html Je me créé l'architecture suivante sur le windows;

  • testFtp
    • script.bat
    • bin
      • curl.exe
      • license_curl.txt
    • toSend
      • fichier1.pdf
      • fichier2.pdf
      • fichier3.pdf

l'objectif est d'envoyer les fichiers (quelque soient leur noms) du dossier toSend sur notre ftp. Par contre si le fichier existe déja sur le serveur; je l'écrase.

Transfert automatique en écrasant les éventuels fichiers sur le serveur

Voici le contenu du scrip.bat

  1. ::Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
  2. ::Ce script utilise Curl (pour le ftp). La licence se situe dans le dossier bin
  3. cls
  4. ::On met un titre au shell
  5. @title Envoie le contenu d un repertoire sur un dossier FTP. Ecrase les fichiers déja existants si des noms sont concordants
  6. ::Supprimer les retours écran
  7. @echo off
  8.  
  9. ::#### VARIABLES####
  10. ::PARTIE FTP
  11. set user_ftp=userFtP
  12. set pwd_ftp=pwdFtp
  13. set ip_ftp=192.168.10.253
  14. set path_ftp=/
  15. ::DOSSIER LOCAL A TRANSFERER
  16. set local_path=%cd%\toSend
  17.  
  18. ::Définition des Chemins
  19. ::répertoire racine
  20. set rep_root=%cd%
  21. ::chemin des binaires
  22. set rep_bin=%cd%\bin
  23. ::chemin des fichiers de journaux
  24. set rep_log=%cd%\log
  25.  
  26. ::Si le ping est négatif, quitter et logguer
  27. ping -n 1 %ip_ftp%
  28. if %errorlevel%==1 goto NO_LINK_SERV
  29.  
  30. ::On envoie
  31. cd %local_path%
  32. ::Eventuellement, remplacez *.* par le filtre de votre choix genre planing-*.pdf dans la partie qui suit
  33. if exist ./*.* (
  34. FOR %%f IN (*.*) DO (
  35. ::Envoi de chaque fichier sur le ftp
  36. %rep_bin%\curl.exe -u %user_ftp%:%pwd_ftp% -Q "+CWD %path_ftp%" -T "%%f" ftp://%ip_ftp%/
  37. ::On logue les infos dans un fichier
  38. echo "%date%|%time:~0,2%h%time:~3,2% : fichier %%f -- envoyé " >>%rep_log%/envois.log
  39. )
  40. ::On supprime les fichiers après l envoi car on en a plus besoin
  41. del/Q *.*)
  42. GOTO FIN
  43.  
  44. :NO_LINK_SERV
  45. ::le serveur ne répond pas au ping
  46. echo "%date%|%time:~0,2%h%time:~3,2% : Le serveur FTP n'est pas joignable - Aucun transfert effectué" >>%rep_log%/connexions.log
  47.  
  48. :FIN
  49. ::On quitte

Plus qu'à mettre le script dans les tâches planifiées.


- page 1 de 75

#enBref:

Free est allumé

free-mobile.jpg Je lisais ce matin sur un blog les hypothèses suivantes: Le réseau de Free serait off, et ce dernier aurait bien payé orange pour que ces derniers masquent leurs noms afin de faire croire qu'on est sur le réseau free.

Sauf que sur mon htc; en permanence, j'ai cette icône: htc.jpg

Je suis en général dans l'agglo de Rouen. et les rares fois où je méloigne de la ville, il arrive que mon tel affiche cette icone:

Avec le "R" comme "Roaming" qui signifie bien que je suis sur le réseau free mais que j'ai basculé sur les emetteurs de l'opérateur historique.htc-itinerance.jpg

Autre indice qui montre que Free dispose bien d'antennes allumées sur Rouen: Sur Google maps, il localise l'emmetteur, sauf que chez moi, le centre du cercle ne correspond pas aux antennes posées sur l'immeuble voisin (orange et bouygues) ... mais à une antenne plus éloignée.

Dis @Xavier75 tu m'offres un an de serveur dédié chez online suite à cette com?

Les icones proviennent du manuel HTC et sont probablement la propriété de ce dernier (à moins que ce soit android)



juste un test depuis dotclear droid.

c est un test d écriture d un billet depuis le client de blog dotclear droid.

En attendant de voir les tarifs free, récuperer son RIO

free-mobile.jpg

Pas d'engagement auprès d'un opérateur de téléphonie;

Dès fois que free propose dans les jours qui viennent effectivement un abonnement téléphone petit forfait, sms illimités et un peu de 3G à moins de 35€ (voire 2 fois moins ce serait cool).

  • Chers clients Bouygues, pour obtenir votre RIO, composez le 658.
  • Chers clients Orange, pour obtenir votre RIO, composez le 527,
  • Chers clients SFR, pour obtenir votre RIO, composez le 933

Plus d'opérateurs listés ici


Freebox, Faire une conférence téléphonique

P1010638.JPG

Pour converser à trois via le téléphone:

  • Appeler le premier correspondant, Lui demander de patienter.
  • Appuyer sur la touche R.
  • Composer le numéro du second correspondant, lui dire bonjour.
  • Appuyer sur R puis 3 pour récupérer le premier correspondant dans la discussion.

Arduino Mes débuts #2

P1030091.JPG

En mixant les tutos "les basiques" du arduino; voici un truc qui casse les oreilles: Un buzzer qui fait un son à une fréquence donnée par le potentiomètre. Le boutton pressoir est là pour sauver mes oreilles.

controled-buzzer.svg

Quand au code; je ne sais pas si c'est parceque je suis un dieu de la programmation, et/ou que l'environnement de l'arduino est super bien fait et/ou que mon truc est super simple, mais ça tient en quelques lignes:

  1. int pinBuzzer=8;
  2. int pinButton=2;
  3. void setup() {
  4. pinMode(pinButton, INPUT);
  5. }
  6. void loop() {
  7. int isButtonPressed=digitalRead(pinButton);
  8. if (isButtonPressed==1){
  9. int frequence=analogRead(A0);
  10. tone(pinBuzzer,frequence);
  11. }else{
  12. noTone(pinBuzzer);
  13. }
  14. }

Ce billet a le mérite de montrer que le arduino est relativement accessible.


Arduino

arduino.JPG

C'est un billet juste pour dire que j'ai un arduino depuis quelques semaines.

Bon okie le dernier programme que j'ai fait: L'arduino "compte" en binaire. Le résultat est donné sur 8 bits (8 leds)... Et la vitesse de comptage est réglée grâce au potentiometre. Carrément utile comme programme!!!

  1. bool arr[8] ={0,0,0,0,0,0,0,0};
  2. int i;
  3. long lastTime = 50;
  4. long leDelay = 50;
  5. void setup() {
  6. Serial.begin(9600);
  7. for(i = 1; i < 9;i++){
  8. pinMode(i, OUTPUT);
  9. }
  10. }
  11.  
  12. void loop() {
  13. leDelay = analogRead(A0);
  14. if ((millis() - lastTime) > leDelay) {
  15. lastTime=millis();
  16. i=0;
  17. while ((arr[i]==1) && (i<8))
  18. {
  19. arr[i]=0;
  20. digitalWrite(i + 1, LOW);
  21. i++;
  22. }
  23. arr[i]=1;
  24. digitalWrite(i + 1,HIGH);
  25.  
  26. for(i = 7; i >= 0;i--){Serial.print(arr[i]);}
  27. Serial.println();
  28. Serial.println(leDelay);
  29. }
  30. }

Les idées de projets sympas pour le arduino:

  • L'incruster dans le panneau de commande de l'ascenseur de mon immeuble pour ajouter une touche random
  • faire un émetteur de morse, puis un récepteur pour communiquer à une vitesse d'1 octet par 10 minutes.
  • Informatiser les commandes de ma voiture :
  1. [gnieark@gnieark ~]$ su -c "freine"
  2. Mot de passe :

C'est quoi twitter?

Bah ça:

twitter.jpeg

Il parait même que dans certaines entreprises quand on appelle un technicien réseau "Espèce d'ingénieur réseau chez twitter!", c'est une raillerie...

Mais j'aime bien Twitter sinon.

#denigrement


Propulsé par Dotclear