Je me souviens

Je me souviens.

Tel est la devise de ma province.

Aujourd’hui le 1er juin 2012 la simple augmentation des frais de scolarité est en train de créer une véritable crise qui ressemble plus à un affrontement entre 2 générations. Ce qui m’attriste le plus est de voir à quel point la génération des biens nantis « les boomers » semblent avoir totalement oublié d’où ils viennent.

J’aimerais aujourd’hui prendre quelques minutes pour leurs rappeler qu’avant 1960 si tu n’étais pas né dans une famille riche tes chances d’accès à l’éducation étaient quasi nulles peu importe ton intelligence, ton talent, ou tes connaissances ta carrière professionnelle ce limitais à être un journalier dans une usine parce qu’il fallait gagner sa vie.

Un groupe marginal a commencé à militer pour donner l’accès à l’éducation au moins fortuné et ils ont réussi. 50 ans plus tard, nous n’avons jamais eu autant de Québécois prospères.

Vous M. Baril comptable qui prendra sa retraite à 55 ans et qui fera l’aller-retour en avion entre votre condo en Amérique du Sud et votre condo à Montréal, quand vous penser que les étudiants devraient fermer leurs gueules et payer l’augmentation parce qu’ils vous font perdre 1 heure dans le trafic et que ça brime votre bien-être personnel.

Avez-vous une pensé pour vos parents, oncles, tantes et cousins qui se sont battus pour que vous ayez une meilleure vie?

Avez-vous oublié le métier de votre père? Avoir fait ce métier pourriez-vous vous permettre le luxe que vous vous permettez maintenant?

Croyez-vous sincèrement que sans la reforme de l’éducation votre vie serait aussi confortable?

Votre patron a t’il un nom anglophone comme celui de votre père ou il a un nom francophone?

J’aimerais qu’on ce souvienne qu’il y a moins de 60 ans la vie était beaucoup plus dure l’accès à l’éducation est une des choses qui a amélioré notre qualité de vie collective.

Ce n’est pas le temps de faire reculer les choses. Souvenez vous que vous avez militer pour une cause dans vos années folles et que ça la probablement déranger les générations plus vielle.

M. Baril !!!! Regarder dans votre rétroviseur de votre voiture de luxe c’est écrit en petit « Object in mirror are closer than they appear ». Maintenant regardez en avant une belle gagne de jeune ce batte présentement pour une meilleure société.

Profitez de ce temps d’arrêt pour vous souvenir comment vous vous sentiez lorsque vous manifestiez pour une cause qui vous tenait à cœur et que vous aviez l’impression de vous battre pour accomplir quelque chose de grandiose.

Souvenez-vous que c’est grâce à des militants comme eux que nous sommes passé d’un peuple d’ouvrier exploité par du capital anglophone à une bourgeoisie professionnelle reconnue internationalement.

Je me souviens.

*M. Baril est un personnage fictif.

Pour ceux qui manifeste même si vous me causez du tort je suis de votre côté et je vous dirais cette phrase empruntée de l’histoire des patriotes:

« Il est temps de faire fondre les cuillères pour en faire des balles ».
(SVP c’est une figure de style ne pas le prendre au premier degré évidemment …)

Pour les autres ben lâcher mon blogue vous aller manquer l’élimination à « Loft story »…

Pour ceux qui serait sur une autre planète depuis quelques mois (un résumé de 5 minutes sur la crise):

Un des boomers qui ce souviens:

Posted in politique by Francis Parent. No Comments

La Playa Pancho Cayo Santa-Maria Cuba



Me voila de retour d’une fin de semaine assez « rock and roll » à cuba décidé sur un coup de tête mercredi dernier. Un des beau souvenir que je ramène c’est la découverte de la playa Pancho (une plage déserte qui a probablement un autre nom que je ne connais pas donc je l’appelle la playa pancho (franck en espagnole) en mon honneur.

Comme j’avais bien dormi la veille et que je n’étais pas hanghover j’avais besoin de bouger un peu j’ai décider d’aller me louer un vélo et partir malheureusement le centre de location est fermé le dimanche … (heureusement qu’il reste des endroits sur la planète qui ne sont pas aussi stresser que nous en amérique du nord).

Je décide de partir à pied vers le bout du « cayo » en espérant voir des choses dépaysantes sur le bord d’une route qui sert principalement au transport de matériaux pour les hotels en constructions. Après environ 5-6km j’arrive à une fourche j’estime que le coté gauche me ramène à l’hotel et le coté droit je ne sais pas ou … J’essayer le coté inconnu un peu pour voir si je ne verrais pas quelque chose d’intéressant.

Un cubain (dont je suis incertain de son nom ça sonnait l’hybride entre ramon et arseno ramerso) qui effectuais du transport de matériaux s’est arrêtté et ma offert de monter, je lui ai demandé ce qu’il y avais un peu plus loin ça réponse fût « La blanca » étrangement je ne connaissais pas cette expression pour désigner une plage de sable blanc (dans la série télivisé weed les espano utilise cette expression pour une substance illégale mettons). Je lui répond ¿La playa? il me dis oui.

Ramerso el manear

Après avoir roulé un petit bout (je dois admettre que j’étais un peu nerveux de devoir re-marcher tous cette route…) il s’arrête devant une trail large comme une auto en plein milieu de rien et il me dis de marcher dans cette trail que la blanca est au bout … Ma question C’est loin ça réponse fût pas ce que j’espérais il me répond « Esta leos 500 o 700 metros … ». Bon ben on est pas a 500 mètres près allons voir.

L'entrée de la route qui mène à la blanca

La trail large comme une automobile est vraiment dans une végétation dense l’humidité est élevé un paradis pour les insectes ce qui permet de marcher un peu plus vite.

L'entrée de la route qui mène à la blanca

Après ces pérépities me voila arrivée à la plage:

L'arrivée à la Playay pancho

Les photos et les vidéos ne peuvent pas démontrer la grandeur de cette endroit je me sentais vraiment comme dans le film « The Beach » une plage immense de sable blanc pas de roche ou j’étais quasiment seul (il y avait un couple de cubain qui profitaient de leur dimanche).

La playa pancho

La playa pancho

La playa pancho

La playa pancho

La baignade n’était pas prévu à mon expédition je n’avais pas de serviette de plage ni de maillot de bain il était impensable de me baigner en boxer (le 2-3 heures de marche pour le retour aurait été soufrant) heureusement j’avais amené une petite servite pour m’essuyer le visage donc 1-2-3 une baignade tous nu ensuite petit vidé pour imortaliser mes souvenir.

Je me dis je vais me mettre un peu de crème solaire avant de repartir DOH! J’ai oublié la crème à l’hotel. Avec moins de 500ml d’eau, sans crème solaire sous un soleil tropical du moi de mai je me dis je vais en payé le prix à mon retour (pas grave j’ai vraiment trippé je payerais c’est tous). J’avais espérance de croiser mon chauffeur au retour il ma dis qu’il finissait ça ronde vers 15:30h.

En marchant sous la chaleur vraiment intense une « Wawa » autobus scolaire (probablement une ancienne du québec puisque c’était écrit écolier en framçais dessus) de travailleur m’a embarqué un des travailleur cubain m’a dit ta pas peur de soffoquer en marchant une tel température (méchant clown quand les locaux te trouve brave). L’autobus m’a laissé a l’intersaction de la route en construction et la route des hotels (une bonne heure de marche de sauvé).

De retour sain et sauve à l’hotel sans coup de soleil et bien hydrater. Je dois aller faire une petite sieste nous partons demain et ce soir c’est la Fiesta!

Pour ceux qui aimerais y aller j’ai fait un petit plan qui n’est pas du tous à l’échelle mais je n’ai croisé qu’une seul entrée avec un tas de roche chaque coté voir photo plus haut donc ça devrais être facile à trouver si vous êtes attentif.

La playa pancho

Selon le chemin que j’ai fait et le paysage je déduit que cette endroit ce situe au point bleu sur la map ci-dessous:


View Playa Pancho, Santa Maria Cuba in a larger map

Laisser vos commentaire j’aime bien vous lire :)

Tags: , , ,
Posted in Activités by Francis Parent. 1 Comment

Fichier .wd Info-Select vers CSV Outlook

Point important pour la génération de fichier CSV Outlook à partir de PHP:

  • Assurez-vous d’enlever tous les charactère invisible (ASCII HEX code de 00 à 20)(NUL, SOH, BS, BEL etc..)
  • Utiliser « \n\r » comme délimiteur de ligne plutot que « \n » seulement

Il y a quelques semaines un de mes rare clients (pour ne pas dire le seul) de support informatique que je soutien encore. M’a appelé pour un problème récurrent il utilise utilise pour la gestion de ses clients un logiciel qui s’appelle Info Select qu’il a acheté dans les années fin 90. Dans ce logiciel il met en mémoire tous les coordonnées de ses clients ainsi que des note sur les différents travaux qu’il a exécuté chez le client.

Depuis quelque temps il lui arrive de temps à autre de perdre l’information de un de ses client la solution simple était de restaurer une copie de sauvegarde en espérant pas trop perdre l’information récentes. Comme le problème commençait a lui tapper sur les nerf de plus en plus nous avons du trouver une solution de rechange.

Nous avons premièrement regardé pour acheter une version récente de ce logiciel qui ce vend près de 300$ USD après avoir insatllé le demo nous nous somme rendu compte que ce programme avait mal vielli et qu’il nous était impossible d’importer les données de sa version …

Comme il utilise ce logiciel simplement comme carnet d’addresse avec prise de note je lui ai suggérer d’utiliser le gestionaire de contact de Microsoft Outlook.

Le fichier principal de info select était un fichier avec l’extension .wd il me suffisait tous simplement de faire un script qui me permetterais d’extraire les données du fichier .WD et généré un fichier csv que je pourrais importer dans outlook tous simplement.

Comme la base de donnée contient des charactères français et que la séparation des ligne ce fesait par des apostrophe double française j’étais incapable de faire un « preg_match_all » sur ces charatère la solution après avoir uploader le fichier sur mon serveur.

Ma solution à ce problème fut de faire un textearea dans mon script au quel je pouvais copier le contenu de mon fichier .WD et d’utiliser ce contenu plutot pour faire mon preg_match.

J’ai du faire face à un deuxième problème le fichier .WD utilise des charactère invisible pour segmenter les données et quand je copiais les contenu du fichier dans mon textarea je n’obtenais seulement les charactère jusqu’a mon premier characthère NUL …

Pour surmonter cette épreuve J’ai ouvert le fichier .WD dans NotePad2 et j’ai fait un replace all sur le regular expression « \x00″ sans les apostrophe. Puis j’ai été en mesure dee copier toute l’information dans mon textarea.

Pour le reste de la transformation ça plus été un casse-tête de trouvé comment ces informations étaient classé et les remettre en ordre selon différent critères plutot qu’un casse tête de trouver des solutions à des trouble d’encodage PHP/charatère Français.

Ensuite tous ce qu’il me restais à faire étais de sauvegarder les données dans un fichier csv et l’importer dans outlook.

Malheureusement même si toute mes colonnes étaient aligner correctement et que je pouvais accéder l’information corectement à partir de Microsoft Excel lorsque j’essayait d’importer les données j’aivais toujours une erreur qui me disait que outlook ne pouvait pas importer mes données du à une erreur de translator.

Évidament je cherche sur google pour cette erreur mais les différent forum et site ressource ne disent pas plus que si tu es incapable de l’ouvrir avec exel il est impossible de l’ouvrir en outlook … Mais moi je suis capable de l’ouvrir avec excel …

Je me met donc a la de programmes de transformation de données qui me permeterais de re-générer mon fichier CSV j’en trouve quelques un mais aucun ne fait vraiment ce qui est décrit dans la landing page …

Je prend donc le taureau par les cornes et je me suis dis je vais essayer manuelement champs par champs, colonne par colonne pour trouver la source de mon problème après avoir essayer tous les champs seul a seul avec d’autre etc.. rien ne fonctionne ça fait déja plusieurs heure que je travaille la dessus et je dois trouver une solution.

Soudain j’ai un flash de Génie une vielle théorie apris il y a une dizaine d’années à l’école Windows contrairement à d’autre système d’exploitation utilise deux charatère pour delimiter la fin et le début d’une ligne (new line et return « \n\r ») et moi je génère mon fichier seulement avec des return « \n » dans mon script je fait donc la modification pour me rendre compte que ça fonctionne mais seulement sur certaine colonne mais pas sur d’autres. et observant mon ficher .WD à l’aide de notepad2 je vois encore plusieur characthère invisible (BS, BEL etc..) je fait donc des replace avec les pattern Regular expression et je l’ai enlève tous Bingo !!! Ça Marche !!! j’ai donc modifier le script pour qu’il enlève les charactère Hex de 00 à 20 et le tour et jouer.

Point important pour la génération de fichier CSV Outlook à partir de PHP:

  • Assurez-vous d’enlever tous les charactère invisible (ASCII HEX code de 00 à 20)(NUL, SOH, BS, BEL etc..)
  • Utiliser « \n\r » comme délimiteur de ligne plutot que « \n » seulement

Je joins le code pour ce fichier je suis conscient que ce code n’est pas le plus beau et qu’il pourrait être améliorer grandement. Il faut tous de même garder en tête que ce code a été fait pour une utilisation unique et je crois que ce code peux être pertient pour certains lecteur qui cherche à appliquer des solutions.

<?  
  $toremove = array();
  
  for($i=0;$i<=20;$i++){
    if($i != 1){
      $toremove[chr($i)] = "";
    }
  }
  
  $toremove["//"] = "";
  $toremove["]"] = "";
  $toremove["["] = "";
  $toremove["nr"] = "";
  $toremove["n"] = "";
  $toremove["r"] = "";
  
  $working_dir = "/home/workingdir/";
  $ori_file = "BASE.WD";
  $ori_full_path = $working_dir . $ori_file;
  $file = "";
  
  $file = $_REQUEST['test'];
  
  $file = str_replace("“", "~", $file);
  $file = strtr($file, $toremove);
  
  $phone_types = array();
  $rows = array();
  $file_output = "";
  $file_name = $working_dir . "csv/" . date("Y-m-d") . ".csv";
  $i = 0;
  
  preg_match_all("#~(.*?)~#", $file, $arrMatch);
  
  foreach($arrMatch[1] as $key=>$value){
    $row = array();
    $row['first'] = '';
    $row['last'] = '';
    $row['cie'] = '';
    $row['adr'] = '';
    $row['fax'] = '';
    $row['tel'] = '';
    $row['tel2'] = '';
    $row['home'] = '';
    $row['cell'] = '';
    $row['pager'] = '';
    $row['note'] = '';
    
    $row_name = array();
    $blnadr = 0;
    $blntel = 0;
    $telcount = 0;
    $icount = 0;
    
    preg_match_all("#(.*?)x01#", $value, $arrMatch2);
    
    
    foreach($arrMatch2[1] as $key2=>$value2){
      $value2 = stripslashes($value2);
      $value2 = str_replace('"','',$value2);
      
      $blnAdrStr = $blnadr;
      
      if($icount == 0){
        if($value2 != ""){
          $row_name[] = $value2;
        }
      }elseif(preg_match('/^(.*?).:(.*?)([0-9]{3}-?[0-9]{4})(.*?)$/', $value2, $phone1)){
        if(preg_match('/^(.*?).:(.*?)([0-9]{3}-?[0-9]{3}-?[0-9]{4})(.*?)$/', $value2, $phone2)){
          if(preg_match('/^(.*?).:(.*?)([0-9]{1}-?[0-9]{3}-?[0-9]{3}-?[0-9]{4})(.*?)$/', $value2, $phone3)){
            $phones = $phone3;
          }else{
            $phones = $phone2;
          }
        }else{
          $phones = $phone1;
        }
        
        $phone = $phones[3];
        
        if( trim($phones[4]) != ""){
          $phone_type = trim($phones[4]);
          $row['note'] .= " ". $phones[0] . "rn";
          
          switch($phone_type){
            case "maison":
              $row['home'] = $phone;
              break;
            case "Cell.":
              $row['cell'] = $phone;
              break;
            case "cell.":
              $row['cell'] = $phone;
              break;
            default:
              $row['tel2'] = $phone;
              break;
          }
          
          
        }else{
          $type = strtolower(trim($phones[1]));
          if( $type == "tel"){
            $phone_type = "Tel.:";
            if($telcount > 0){
              $row['tel2'] = $phone;
            }else{
              $row['tel'] = $phone;
            }
          }elseif($type == "cell"){
            $row['cell'] = $phone;
          }elseif($type == "fax"){
            $row['fax'] = $phone;
          }else{
            $row['pager'] = '';
          }
        }
        $phone_types[] = $phone_type;
        
        $telcount++;
        $blnadr = 1;
        $blntel = 1;
      }elseif( ((preg_match('/^[0-9]*,(.*?)$/', $value2, $adr)) || ( (preg_match('/^[0-9]* (.*?)$/', $value2, $adr)) && ($icount < 3) && ($icount > 0) )) && (!$blnadr) ){
        $row['adr'] .= " ". $value2 . "rn";
        $blnadr = 1;

      }elseif( ($blnadr) && (!$blntel)){
        $row['adr'] .= " ". $value2 . "rn";
      }else{
        if($value2 != ""){
          if( (!$blnadr) && (!$blntel) ){
            $row_name[] = $value2;
          }else{
            $row['note'] .= " ". $value2 . "rn";
          }
        }
      }
      
      //Name concat end
      if($blnAdrStr != $blnadr){
        $namelen = sizeof($row_name);
        
        $title = "";
        $name =  $row_name[0];
        
        if($namelen > 1){
          $row['cie'] = $row_name[0];
          $name =  $row_name[1];
        }
        
        if(stristr ($name,"m.")){
          $title .= "M. ";
          $name = str_replace("M.", "", $name);
          $name = str_replace("m.", "", $name);
        }
        
        if(stristr ($name,"mme.")){
          $title .= "Mme. ";
          $name = str_replace("Mme.", "", $name);
          $name = str_replace("MMe.", "", $name);
          $name = str_replace("MME.", "", $name);
          $name = str_replace("mme.", "", $name);
        }
        
        $name = trim($name);
        
        $names = split(" ", $name);
        $c = 0;
        
        foreach($names as $key1=>$value1){
          if($c == 0){
            $row['last'] .= $value1;
          }else{
            $row['first'] .= $value1 ." ";
          }
          $c++;
        }
        
        $row['first'] .= $title;
      
      }//End Name Processing
      
      if(stristr ($value2, "tel")){
        $blntel = 1;
      }

      if($value2 != ""){
        $icount++;
      }
    }
    //preg_match("#x01(.*?)$#", $value, $arrMatch3);
    preg_match("#.+((x01).+)$#", $value, $arrMatch3);
    $last = $arrMatch3[1];
    $last = preg_replace('/x01/', "", $last);
    $row['note'] .= " " . $last . "rn";
    $row['first'] = rtrim($row['first']);
    $row['adr'] = trim($row['adr']);
    $row['note'] = trim($row['note']);
    
    if($row['last'] != ""){
      $rows[] = $row;
    }
  
    $i++;  
  } //end for each arr1
  
  $titleLine = '"First Name","Last Name","Company","Business Street","Business Fax","Business Phone","Business Phone 2","Home Phone","Mobile Phone","Pager","Notes"' . "rn";
  
  $file_output .= $titleLine;
  foreach($rows as $key=>$value){
    $line = "";
    foreach($value as $key2=>$value2){
      $line .= '"'. $value2 .'"' . ",";
    }
    $line = rtrim($line, ",");
    $line .= "rn";
    $file_output .= $line;
  
  }
  $fp = fopen($file_name, 'w');
  fwrite($fp, $file_output);
  fclose($fp);
  
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
  <textarea cols="100" rows="10" name="test">
<input type="submit" />
</form>
</body>
</html>
									

PS: Si ce billet vous à aider vos commentaire sont grandement aprécier :)

Tags: , ,
Posted in PHP Programmation by Francis Parent. No Comments

Youppi mon Partner a enfin un blog.

Ceux qui me connaisse, connaisse probablement mon partner Patrick Chaput, Aujourd’hui Pat à enfin prit 5 minute pour installer Worpress et créer son blog. Je crois qu’il à l’intention de documenter ces trouvailles en matière d’intégration web et probablement comme moi il va mettre un peu n’importe quoi …

Cot. design pat a vraiment fait preuve d’imagination héhé ;)

Je vous encourage a visiter ce site qui sera sous peu une référence en terme d’intégration web.

http://www.patrickchaput.com/

Féliciation pour ton nouveau site Pat ;) Tu va bientot dé-classer ce fromager :P

Posted in C'est n'importe quoi !!! by Francis Parent. No Comments

Javascript js traduction characteres Francais en html

Pour les programmeurs les textes en Français causent souvent des problèmes les script en javascript sont souvent chiant et capricieux quand on mélange javascript à des charactères Français en utilisant du Ajax ça peux devenir assez chiant aujourd’hui j’ai du faire face au problème quand je voulais passé des charactères français en paramêtre à à une page que j’appelle par ajax …

Ma solution fut de faire une fonction javascript qui fait la traduction des charactères spéciaux français en charactères html je la partage ici pour tous ceux qui pourrait en avaoir de besoin.

Je suis parti d’une fonction que j’ai trouvé ( http://webdesignfan.com/htmlspecialchars-in-javascript/ ) à la quelle j’ai ajouté les charactères français:

Si vous désirez utiliser cette fonction je vous sugère de télécharger le fichier.js en cliquand ici car le rendu html fait disparaitre les code html.

//-------------------------------------------
// Function to translate special characters
// in js
//-------------------------------------------
// Params:
// string the str we want to translate
// reverse if we want to translate html code
// to char
//-------------------------------------------
// Return (string):
// The translated string
//-------------------------------------------
function htmlSpecialChars(string, reverse)
{

  // specialChars is a list of characters and that to which to translate them.
  // specialChars["<"] = "<";
  // x is merely a variable used in for loops.
  var specialChars = {
      "&": "&",
      "<": "<",
      ">": ">",
      '"': """,
      "À": "À", 
      "à": "à", 
      "Á": "Á", 
      "á": "á", 
      "Â": "Â", 
      "â": "â", 
      "Ã": "Ã", 
      "ã": "ã", 
      "Ä": "Ä", 
      "ä": "ä", 
      "Å": "Å", 
      "å": "å", 
      "Æ": "Æ", 
      "æ": "æ", 
      "Ç": "Ç", 
      "ç": "ç", 
      "Ð": "Ð", 
      "ð": "ð", 
      "È": "È", 
      "è": "è", 
      "É": "É", 
      "é": "é", 
      "Ê": "Ê", 
      "ê": "ê", 
      "Ë": "Ë", 
      "ë": "ë", 
      "Ì": "Ì", 
      "ì": "ì", 
      "Í": "Í", 
      "í": "í", 
      "Î": "Î", 
      "î": "î", 
      "Ï": "Ï", 
      "ï": "ï", 
      "Ñ": "Ñ", 
      "ñ": "ñ", 
      "Ò": "Ò", 
      "ò": "ò", 
      "Ó": "Ó", 
      "ó": "ó", 
      "Ô": "Ô", 
      "ô": "ô", 
      "Õ": "Õ", 
      "õ": "õ", 
      "Ö": "Ö", 
      "ö": "ö", 
      "Ø": "Ø", 
      "ø": "ø", 
      "Œ": "Œ", 
      "œ": "œ", 
      "ß": "ß", 
      "Þ": "Þ", 
      "þ": "þ", 
      "Ù": "Ù", 
      "ù": "ù", 
      "Ú": "Ú", 
      "ú": "ú", 
      "Û": "Û", 
      "û": "û", 
      "Ü": "Ü", 
      "ü": "ü", 
      "Ý": "Ý", 
      "ý": "ý", 
      "Ÿ": "Ÿ", 
      "ÿ": "ÿ"
    }, x;

  // If we are reversing the translation...
  if (typeof(reverse) != "undefined")
  {

    // We need to create a temporary array.
    reverse = [];

    // Put each special character in the array.
    for (x in specialChars)
      reverse.push(x);

    // Reverse the array.
    // ["<", ">"] becomes [">", "<"]
    reverse.reverse();

    // For each of the special characters,
    for (x = 0; x < reverse.length; x++)

      // Replace all instances (g) of the entity with the original.
      // e.g. if x = 1, then
      // reverse[x] = reverse[1] = ">";
      // specialChars[reverse[x]] = specialChars[">"] = ">";
      string = string.replace(
        new RegExp(specialChars[reverse[x]], "g"),
        reverse[x]
      );

    // Return the reverse-translated string.
    // Returning a value ends the function,
    // therefore no code after this line will execute,
    // therefore no need to use the else conditional.
    return string;
  }

  // If we are not reversing a translation,
  // For each of the special characters,
  for (x in specialChars)

    // Replace all instances of the special character with its entity.
    // Remember, unlike in the reverse algorithm where x is an integer,
    // x here is the key value (e.g. &, <, >, and ")
    string = string.replace(new RegExp(x, "g"), specialChars[x]);

  // Return the translated string.
  return string;
};
									

J’ai aussi créer un fichier excel qui contiens tous les charactères avec leurs correspondance ASCII HTML et HEX à partir d’un bon éditeur de texte tel que notepad2 vous pourrez copier coller et formater les charactères au besoins.

Ficher excel (xls) ASCII a HTML et HEX

Les commentaires sont les bienvenues et apprécié.

C3 M355463 53R7 4 D3M0N7R3R C0MM3N7 N07R3 35PR17 P3U7 F41R3 D35 CH0535 3T0NN4N735

Voici le status d’un ami sur facebook. C’est fou comme notre cerveau fait des lien vite après seulement quelque mots ça deviens fluide :)

C3 M355463 53R7 4 D3M0N7R3R C0MM3N7 N07R3 35PR17 P3U7 F41R3 D35 CH0535 3T0NN4N735. 4U D3BU7 C’357 D1FF1C173, M415 4PR3S QU3LQU35 53C0ND35 V0TR3 35PR17 4RR1V3 4 L1R3 54N5 3FF0R7… C’357 V07R3 C45? 50Y3Z F13R5! 17 P4R417 QU3 53UL35 C3RT41N35 P3R50NN35 Y 4RR1V3N7. R3PU8L13Z 51 V0U5 3735 L’UN35 D’3N7R3 3LL35

Message décodé:

Ce message sert a demontrer comment notre esprt peut faires des choses etonnantes. Au debut c’est diffile, mais apres quelques secondes votre esprit arrive a lire sans effort… C’est votre cas? Soyez fier! Parce que seules certaines personnes y arrivent. Republiez si vous etes l’unes d’entre elles

Je changerais d’entre elles par d’entre eux … Mais bon

Tags:
Posted in Tel que vu sur Facebook by Francis Parent. No Comments

Logitech Revue with Google Tv au Canada (Hacking)

Lien utile pour GoogleTv au Canada

http://www.unblock-us.com/ – Site permettant l’accès au contenu US blocker par défault

Mon histoire

Toute à commencer il y a quelques semaines en parlant avec un contact d’affaire par skype je lui disais que j’avais commencer à aprendre le Android SDK et il me répond oui c’est vraiment hot Android j’aimerais avoir plus de temps pour jouer avec Android et Google TV. Google Quoi ? Je ne connaissait pas du tous l’éxistance de google tv. Je commence à lire un peu en gros le google tv est un module pour compétitioner Apple Tv un peu plus sur le base de l’open source puisqu’ils roulent Android et que nous ne somme pas dépendant du Hardware d’une seul compagnie (sony fait des télé et des lecteurs blu-ray avec le google tv) Je trouve la boite Logitech Revue qui est en fait une box optimiser pour la télé qui roule sur android.

Comme tous bon gars dans technique on aime mieux essayer que de lire je me met à fantasmer sur une box qui transforme ma télé en grosse table android que je peux installer tous les apps, copier mes films sur un disque dur externe, partir un serveur samba pour avoir un file sharing server sur ma télé, utiliser le client netflix dessus plustot que sur la wii qui donne une qualité médiocre et louer des films en VOD donc comme ce n’est pas disponible au Canada je commande la boite sur ebay pour 160$ CAD avec les frais de douannes. Hier à la reception moi et mon partner toute exiter on plug ça pour faire un ti road test ça semble écoeurant on part netflix et oups il nous dis que nous ne somme pas aux USA et que le service n’est pas disponible on ce met à chercher le client Netflix Canada quand on essaye d’installer un client nous somme incapable de l’installer et nous nous rendons compte que le CRTC empêche la location en VOD d’amazon au canada. Donc on se rammasse avec chacun une boite qui permet d’aller browser internet sur la télé et écouter des vidéo youtube … Ce qui est cool mais en dessous de nos attente je me suis dis que comme tous le hardware qu’on achète ça devais ce cracker je recherche donc logitech revue hacking et je trouve le site hhtp://gtvhacker.com/ qui donne une procédure pour gagner accès root sur la boite puis installer les apps qu’on veux par le SDK (Ça devrais être bon pour ce monter une box de filesharing).

Selon leur procédure on branche des fils sur les connecteur pour ce brancher en console par le port série sur le linux on update le firmware. En regardant les images il disent de souder les fils du port série sur le board mais la photos montre des petit connecteur alors ce soir nous nous casson la tête à souder des petit connecteur sur un cable réseau (Merci a Mon chum Fred de chez micro expert pour le prêt de son équipement de soudure). En arrivant à la maison je d.monte la boite à ma grande surprise il n’y a pas de connecteur sur le board mais juste des beigne pret a souder (nous avons donc perdu 1 heures à souder pour rien …) On ce laissera pas décourager par ça je soude le cable direct au board.

Toute éxiter je commencer à formater une clé USB en ext3 pour copier les fichiers je n’est pas été vite sur celle la le fichiers pèse 180MB et on dois le download par megaupload qui n’est pas super rapide l’avantage c’est que j’ai pu commencer à écrire ce post.

J’ai du tenter plusieurs chose pour me rendre en recovery mode une des idée (pas très futé) que j’ai eu est de faire les update du système qui à eu pour effet de blocker l’accès par le port série qui par le fait même m’enlève mes chance de le rooted. Pour ceux qui aimeraient le rooted faite la procédure de gtvhacker seulement sur une boite neuve (out of the box) je serais probablement en mesure de rooter une boite neuve par contre ça me tente pas de dépenser 160$ de plus pour l’essayé.

Nous avons quand même trouvé une solution alternative (utilisé un proxy au USA) pour débarer le contenu qui étais blocker le site http://www.unblock-us.com/ offre une solution a 5$ USD par mois afin de débloquer l’accès au contenue blocker à l’extérieur des états-unis j’ai maintenant donc accès au netflix US qui est 100 fois plus hot que le canadien !!!

Overall C’est une belle bébelle la qualité de l’image est très bonne et le web browser et les application installé sont fluide et cool.

A vos box prêt ready

Lien utile pour GoogleTv au Canada

http://www.unblock-us.com/ – Site permettant l’accès au contenu US blocker par défault

Tags: , ,
Posted in Android by Francis Parent. 17 Comments

Luge Alpine Mont Tremblant

Let’s get ready for a wild Ride

Aujourd’hui nous somme aller au mont tremblant pour faire de la Luge Alpine même si sur le panflait cette activité semble un peu enfantins c’est du plaisir assuré pour les petits et les grands.

Notre seul regret … Ne pas avoir prit le forfait 5 décente au lieu de trois.

Plus d’info:
Luge Mont-Tremblant

Posted in Activités C'est n'importe quoi !!! by Francis Parent. No Comments

Projet WordPress vers un site statique

Avertissement:


Comme le problèmes était critique Ce script à été créer vite fait à fin de pouvoir corriger le problème sans perdre de temps ni d’indexation je met tous de même la méthodologie a votre disposition tout en sachant que ce script est loin d’être parfait donc veuillez utiliser cette information à vos propre risque et périles.

Important:

J’ai mis tous les fichiers discuté dans cette page dans un fichier zip je vous recommande de le télécharger et de suivre à partir de ces fichiers:

Télécharger tous les fichiers PHP


Préambule:


Ya environ un an nous avons monter script auto générais des article à partir d’une liste à fin de populer un plus gros index count le script fonctionne bien mais l’erreur que j’ai faitr c’est qu’il créer trop de categories du au modèle de données mysql des categories nous avons maintenant un problème les query sql sont si longue à rouler qu’elles ralentissent notre serveur au complet.


Nos Problèmes:

  • Le script à généré plus de 239 000 posts
  • La base de données fait plus de 1.6 Gig
  • Les requêtes sql sont tellement longue à exécuter (surtout ceux qui implique un count) qu’elle rend le serveur mysql inutilisable aux autres utilisateurs du serveurs …



La solution Facile:

Fermer le site et ainsi perdre tous le traffic et la moneitisation lier au traffic durement gagné.


La solution Utilisé:

Créer un script qui générera des pages semi statique (elles utiliseront le php include mais pas le serveur sql).


Pourquoi ne pas utilisé une solution déja fait tel que « Really Static » plutot qu’une solution maison?

Really static et la plupart des plugin que j’ai vu utilise le moteur de WP pour générer les page statique comme chacune des opération sur le word press compromet les autres sites du serveur nous ne pouvon pas nous permettre de compromettre le serveur durant plusieurs jours durant la génération des pages statiques.

Vous pouvez voir la page original qui ma inspiré à créer ce script:
Un autre technique de transfert qui utilise WP


Donc voici le plan:

  1. Copier la base de données WP sur un autre compte d’hébergement.
  2. Créer des fichiers include pour le header, footer, maincontent et sidebar
  3. Créer un script qui va looper dans la database et générer et sauvegarder des pages statiques du rendu de notre blog
  4. Recopier les pages généré sur notre compte original
  5. Créer un htacess qui redirigera les canonical url vers les pages statiques
  6. Créer un fichier 404 custom pour les pages qui seront perdu (juste en cas de …)


1. Copier la base de données WP sur un autre compte d’hébergement.
Donc a partir d’une console je crée un full backup de la db:

$ mysqldump -h localhost -u username -p database_name > backup_db.sql
									


et le restore sur le compte temporaire qui me servira de générateur a partir de de la console:

$ mysqldump -h localhost -u username -p database_name < backup_db.sql
									


*Veuillez noter que j’utilise un 2ieme compte car j’ai suspendu le compte originale durant l’opération du au fait que la db WP du Blog fesait planter nos autre site noter que vous pouvez utiliser la db original si votre blog wp n’a pas encore atteint un seuil critique.

2. Créer des fichiers include pour le header, footer, maincontent et sidebar

L’avantages des fichiers include c’est qu’il permettent de modifier des élément du layout ou du site en updatant qu’a une seul endroit avoir utilisé une génération de site completement statique les page aurait été un peu plus vite à ouvrir mais dans le cas d’un update sur le layout j’aurais du regenérer tous les pages … Veuillez noter que j’ai separer chacune des pages à inclure par une boite de commentaires

<?
//---------------------------------------------------------------------------
// header.php file to include for static site generation
//---------------------------------------------------------------------------
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">

<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title><?=$title; ?></title>

<link rel="stylesheet" href="<?=HTTP_ROOT;?>style.css" type="text/css" media="screen" />


<style type="text/css" media="screen">

  #page { /*background: url("<?=HTTP_ROOT;?>images/kubrickbg-ltr.jpg") repeat-y top; border: none;*/ }

</style>


<link rel='stylesheet' id='contact-form-7-css'  href='<?=HTTP_ROOT;?>styles.css?ver=2.3' type='text/css' media='all' />
<script type='text/javascript' src='<?=HTTP_ROOT;?>js/comment-reply.js?ver=20090102'></script>
<script type='text/javascript' src='<?=HTTP_ROOT;?>js/jquery/jquery.js?ver=1.3.2'></script>
<link rel='index' title='<?=$site_title;?>' href='<?=HTTP_ROOT;?>' />
<meta name="generator" content="WordPress 2.9.2" />

<meta name="description" content="<?=$seo_desc;?>" />
<meta name="keywords" content="<?=$seo_kw;?>" />
<link rel="canonical" href="<?=$canonical_url;?>" />

</head>

<body class="home page page-id-8 page-template page-template-default">
<div id="page">

<div id="header" role="banner">
  <div id="headerimg">
    <h1><a href="<?=HTTP_ROOT;?>"><?=$site_title;?></a></h1>
    <div class="description"><?=$blog_desc;?></div>
  </div>
</div>

<?
//---------------------------------------------------------------------------
// maincontent.php file to include for static site generation
//---------------------------------------------------------------------------
?>  
<div id="page_wrapper"> 
  <div id="content" class="narrowcolumn" role="main">

        <div class="post" id="post-8">
            <h2><?=$title;?></h2>
                <div class="entry">
                  <?=$post_content;?>
                </div>
        </div>
        
    <p class="nocomments">Comments are closed.</p>

  
  </div>

<?
//---------------------------------------------------------------------------
// sidebar.php file to include for static site generation
//---------------------------------------------------------------------------
?>
  <div id="sidebar" role="complementary">
    <ul>
      <li>
        <form role="search" method="get" id="searchform" action="<?=HTTP_ROOT;?>" >
                    <div><label class="screen-reader-text" for="s">Search for:</label>
                    <input type="text" value="" name="s" id="s" />
                
                    <input type="submit" id="searchsubmit" value="Search" />
                    </div>
        </form>      
            </li>
    </ul>
    <ul role="navigation">
      <li class="pagenav"><h2>Pages</h2><ul><li class="page_item page-item-2"><a href="<?=HTTP_ROOT;?>about/" title="About">About</a></li>
    </ul>
  </div>

<?
//---------------------------------------------------------------------------
// footer.php file to include for static site generation
//---------------------------------------------------------------------------
?>
    <hr />
    <div id="footer" role="contentinfo">
      <p>
        <?
          foreach($footer_links as $key=>$value){
        echo '<a href="'. $value[0] .'">'. $value[1] .'</a>   ';
      }
    ?>
    </p>
    </div>
</div><!-- end page_wrapper -->
<div style="width:1000px; margin:8px auto 0 auto;">
  <?=$disclaimer;?>
</div>
</div>
<?=$analytics;?>
</body>
</html>
									

3. Créer un script qui va looper dans la database et générer et sauvegarder des pages statiques du rendu de notre blog

La première chose que j’ai fait est d’ajouter un champs BOOLEAN à la table wp_posts que j’ai appeller done a chaque page completer je vais mettre le champs à 1 ce qui permettera de reprendre le travaille ou j’étais rendu en cas d’arret innatendu du script.

J’ai créer un fichiers « setings.php » qui contiendera tous les variable commune à tous les pages du site

<? 
//---------------------------------------------------------------------------
// setings.php file to include for static site generation
//---------------------------------------------------------------------------
define('HTTP_ROOT', 'http://www.Lenomdusite.com/');
$site_title = "Le titre du blog";
$blog_desc = "La description du blog";
$analytics = 
"<script type='text/javascript'>

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-9999999-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>";
$disclaimer ='<strong class="text02">Disclaimer:</strong> <span class="text03">Disclaimer text</span><br /><br />';
$footer_links = array();
$footer_links[] = array(HTTP_ROOT . "sitemap.php", 'Sitemap');
?>
									



Pour la page d’accueil j’ai tous simplement créer un fichier manuelement index.php avec la structure des include au quels j’ai seter mes variable en copie-collant d’un view source de la page d’acceil du blog.

<?
//---------------------------------------------------------------------------
// index.php File manually created
//---------------------------------------------------------------------------
include "setings.php";

$title = "Le titre du blog";
$seo_desc = "La description pour le meta";
$seo_kw = "Les Keywords pour le meta";
$canonical_url = "http://www.lesiteweb.com/";
$post_content =
"
<p>Contient le contenue de la page d'accueil</p>
";

include "header.php";
include "maincontent.php";
include "sidebar.php";
include "footer.php";
?>
									



J’ai aussi créer un fichier à inclure qui s’appelle « sitemapinc.php » qui contiendera un lien vers chacune des page créer de façon a ce qu’elle soit tous accessible par les robots des moteur de recherche évidament j’au peux en créer un en xml mais le temps manquais pour les feature nice to have … pour l’instant elle ne contient que le lien vers la page d’acceuil le script fera un append avec chacun des post.

<?
//---------------------------------------------------------------------------
// sitemapinc.php file to include for easy subpage access to SE
//---------------------------------------------------------------------------
?>
<a href="<?=HTTP_ROOT;?>"><?=$site_title;?></a>

									



J’ai aussi créer un fichier « sitemap.php » qui inclus « setings.php » et « sitemapinc.php »

<?
//---------------------------------------------------------------------------
// sitemap.php file to include for easy subpage access to SE
//---------------------------------------------------------------------------
include "setings.php";
include "sitemapinc.php";
?>
									



Pour continuer voici le script qui extrait chacun des post_id à générer loop dedans génère les pages ajoute le lien pour le sitemap pui update le champ done de la table.

<?
//---------------------------------------------------------------------------
// transfert.php generate pages
//---------------------------------------------------------------------------
//Avoid Timeout ...
set_time_limit(100000);

//Database connection setting
include "dbconnect.php";

$dir = "statiquesite/";


//Retrieve all post id
$pages = array();

$query= "SELECT ID FROM wp_posts WHERE post_status='publish' AND done=0;";
$result= mysql_query($query) or die('Query Failed: '. mysql_error());
$num=mysql_numrows($result);

if($num > 0){
  for($i=0;$i<$num;$i++){
    $pages = mysql_result($result,$i,"ID");
  }

}

//Loop trough post id and create pages
foreach($pages as $key=>$value){
  
  $post_id = $value;
  
  $query= "SELECT * FROM wp_posts WHERE ID='$post_id';";
  $result= mysql_query($query) or die('Query Failed: '. mysql_error());
  $num=mysql_numrows($result);
  
  if($num == 1){
    $post_content = mysql_result($result,0,"post_content");
    $post_title = mysql_result($result,0,"post_title");
    $post_name = mysql_result($result,0,"post_name");
    
    $aio_title = "";
    $aio_desc = "";
    $aio_kw = "";
    
    //Get Seo Title
    $query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_title';";
    $result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
    $num2=mysql_numrows($result2);
    
    if($num2 > 0){
      $aio_title = mysql_result($result2,0,"meta_value");
    }
    
    //Get Seo Desc
    $query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_description';";
    $result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
    $num2=mysql_numrows($result2);
    
    if($num2 > 0){
      $aio_desc = mysql_result($result2,0,"meta_value");
    }
    
    //Get Seo KW
    $query2 = "SELECT meta_value FROM wp_postmeta WHERE post_id='$post_id' AND meta_key='_aioseop_keywords';";
    $result2 = mysql_query($query2) or die('Query Failed: '. mysql_error());
    $num2=mysql_numrows($result2);
    
    if($num2 > 0){
      $aio_kw = mysql_result($result2,0,"meta_value");
    }
    
    //Lets create the file 
    $txtFile = '<?'. "n";
    $txtFile .= ' include "setings.php";' . "nn";
    
    $txtFile .= ' $title = "'. str_replace('"', '"', $post_title) .'";'. "n";
    $txtFile .= ' $seo_desc = "'. str_replace('"', '"', $aio_desc) .'";'. "n";
    $txtFile .= ' $seo_kw  = "'. str_replace('"', '"', $aio_kw) .'";'. "n";
    $txtFile .= ' $canonical_url = HTTP_ROOT . "'. str_replace('"', '"', $post_name) .'/";'. "n";
    $txtFile .= ' $post_content = "'. str_replace('"', '"', $post_content) .'";'. "nn";
    
    $txtFile .= ' include "header.php";' . "n";
    $txtFile .= ' include "maincontent.php";' . "n";
    $txtFile .= ' include "sidebar.php";' . "n";
    $txtFile .= ' include "footer.php";' . "n";
    $txtFile .= '?>'; //<?
    
    $filename = $dir . $post_name . ".php";
    $fp = fopen( $filename , 'w');
    fwrite  ( $fp, $txtFile );
    fclose($fp);
    chmod($filename, 0777);
    
    //Add the entry in the sitemap include
    $myFile = $dir . "sitemapinc.php";
    $sitemap_append = '<a href="<?=HTTP_ROOT;?>'. $post_name .'/">'. $post_title .'</a>' ."n";//<? separer pour afficher correctement dans mon blog...
    $fh = fopen($myFile, 'a') or die("can't open file");
    fwrite($fh, $sitemap_append);
    fclose($fh); 
    
    //Set this page has done
    $query= "UPDATE wp_posts SET done=1 WHERE ID='$post_id';";
    $result= mysql_query($query) or die('Query Failed: '. mysql_error());
    
    print("<br>file[$filename] is Complet");  
  
    //Avoid loading Mysql Server
    sleep(1);
    
  }//end if num==1
  
}//end foreach

//Close db connection
include "dbclose.php";
?>

									

4. Recopier les pages généré sur notre compte original

Cette étape n’est quand fait un simple manipulation de copier-coller, move ou de transfert ftp.

5. le fichiers htaccess

Le but de ce fichier est de rediriger les permalinks existants vers nos nouvelle pages php

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^nomdusiteweb.com/$ index.php [nc]
RewriteRule ^nomdusiteweb.com$ index.php [nc]
RewriteRule ^(.*)/$ $1.php [nc]

RewriteCond %{HTTP_HOST} ^nomdusiteweb.com [NC]
RewriteRule (.*) http://www.nomdusiteweb.com/$1 [L,R=301]
									

6. Créer un fichier 404 custom pour les pages qui seront perdu (juste en cas de …)

En cas ou certaine page ne serait pas transferer et que des liens sont conserver quelquepart (favoris blog etc…) je veux que la personne tombe sur une page 404 au layout du blog et qui insitera le visiteur à visiter notre page d’index.
[codebox 10]

Cette méthodologie est simple à pris environ 5 heures pour coder et transférer le nouveau site si vous avez des questions ou commentaire n’hésiter pas a le faire par la boite de commentaire si dessous. En espérant que ce post en aide quelque un :)

Posted in PHP Programmation Worpress by Francis Parent. No Comments

Android Intent Explicit And Implecit (Jour 4)

Bon ce soir après avoir suivi les cours sur les Intent (les implicite et les explicite) je dois avouer que même si je n’ai pas été dans le moon du dévelopement application depuis longtemps et encore plus lontemps sans java le tous commence à me revenir.

Je suis maintenant exiter d’appliquer ces nouvelles connaissance sur mes projet concret. Retse juste à terminer le cour 1 heure à la fois :) .

Posted in Android Android Programmation by Francis Parent. No Comments