veille techno

L’importance de la veille technologique…

Hier, j’ai été invité à être membre d’un jury en tant que professionnel pour le passage du BTS SIO. J’ai à cette occasion pu rencontrer les futurs diplômés.

Dans l’ensemble, leurs parcours professionnels étaient très intéressants et variés.

Dans cette épreuve, il est demandé aux élèves de faire une rétrospective de leur veille technologique réalisée pendant les deux années de leur formation. A partir de ce moment, les choses se gâtent… Les élèves n’ont pas toujours compris l’intérêt de parcourir le Web ou d’assister à des conférences afin de se tenir au courant des évolutions de l’informatique et des systèmes d’informations. C’est d’autant plus dommageable qu’ils sont au début de leur formation et qu’ils ont tout à « découvrir » et j’insiste sur ce terme « découvrir ». Le but n’est pas qu’ils soient en mesure d’être des experts d’une technologie mais plutôt qu’ils aient une culture générale.

Enfin, j’ai remarqué que pour eux, veille technologique == nouvelles technologies, alors que non ! Découvrir une nouvelle technologie n’est qu’une partie de la veille, mais découvrir des anciennes peux faire partie des objectifs de carrière, le secteur des banques à énormément de mal à recruter pour la maintenance de leur code en COBOL, les développeurs qui font l’effort de l’apprendre aujourd’hui (2016) ne manquent pas de travail !

A méditer…

Grand maître L

boite de senseï

Diaballik devient Senseï

Il y a longtemps maintenant, je vous ai parlé du jeu de société Diaballik, lui même décliné en version iPad. Beaucoup d’eau a coulé sous les ponts et Philippe Lefrançois (le créateur a passé un deal avec un nouvel éditeur FERTI).

plateau animé

On y gagne un visuel très différent et deux nouveaux modes de jeux. Très honnêtement c’est vraiment excitant de se replonger dans ce jeu qui n’a pas pris une ride. je vous laisse le redécouvrir :

figurines senseï

Les pions et le plateau

ensemble figurine et plateau

Le jeux est disponible chez tous les bon vendeurs au prix de 32,15€.

Peace-for-Paris-738x575

…et pendant ce temps, l’horreur continue

Encore une fois l’horreur a frappé la France et Paris en particulier. Ce déchaînement de violence doit nous amener à reconnaître que notre façon d’être et de vivre ne plaît pas à tous le monde.

Ce n’est pas une raison pour renoncer à nos idées et nos valeurs de liberté, d’égalité et de fraternité. Ce sont les valeurs de la France et elles me sont chères.

J’ai une pensée émue pour les familles endeuillées.

Vive la liberté 😐

Grosse mise à jour de ma librairie PHP Json-heitz

Le logiciel Heitz System expose toujours une API avec laquelle on peux discuter via JSON. Je vous avais déjà présenté la première version de cette class ici.

Elle rencontre un petit succès 162 téléchargements aux dernières nouvelles sur Packagist.

Pour l’invoquer, voici comment faire :

<?php
require_once 'vendor/autoload.php';

    use JsonHeitz\JsonHeitz;
    use JsonHeitzCredential\Credential;
    use JsonHeitz\JsonHeitzException\JsonHeitzException;

try {
        $connect = (new Credential())
                ->setPort(80)
                ->setUserLogin('test1@heitzsystem.com')
                ->setUserPass('1')
                ->setHost('http://heitz.no-ip.com')
                ->setHostPassword('AuthentificationBaseTest')
                ->urlWebServeurHeitz()
        ;
    } catch (JsonHeitzException $exc) {
        echo $exc->getMessage();
    }

    try {

        $call = (new Query($connect))->setConnectHeitzAPI()
            //    ->setDebug(true) //optional
        ;

        $resultat = $call->callWSHeitz();

        $call->setIdSession($resultat->idSession)
                ->setIdClient($resultat->idClient);


        var_dump($call->getOneClient());
        var_dump($call->getTaskList());
        var_dump($call->getTest());
        var_dump($call->getFormTraining());
        var_dump($call->getActiveReservation());
        var_dump($call->getConfigServeur());
        var_dump($call->getBilan());
        var_dump($call->getTest());
        var_dump($call->getClientMessage(10));
        var_dump($call->getListOfActiveAccess());
        var_dump($call->getListOfPassages());
        var_dump($call->getArrowPoints());
        var_dump($call->getTaskGroup());
        var_dump($call->getPlaceForTheTask());
        var_dump($call->getListOfFinancialDeadlines());
        var_dump($call->getListOfLevies());
        var_dump($call->getListOfBills());
        var_dump($call->getListOfFinancial());
        var_dump($call->getListOfFinancialDeadlines());
        var_dump($call->getListOfLevies());
        var_dump($call->getListOfPoints());
        var_dump($call->getListOfCures());
        var_dump($call->getListOfActiveAccess());
        var_dump($call->getAllArticles());
        var_dump($call->getAllCity());
        var_dump($call->getAllCivility());
        var_dump($call->getAllJobs());
        var_dump($call->getAllWhereTheCustomerHasPracticed());
        var_dump($call->getAllMotivation());
        var_dump($call->getAllVAT());
        var_dump($call->getAllPayment());
        var_dump($call->getAllWayToKnowTheInstitution());
        var_dump($call->getAllTypeOfProspects());
        var_dump($call->getAllDiscountLevel());
        var_dump($call->getAllCustomerGroup());
        var_dump($call->getAllEmployee());
        var_dump($call->getAllFamilySituation());
        var_dump($call->getArrowPoints());
        var_dump($call->getDetailOfCures());
        var_dump($call->getCriterion1());
        var_dump($call->getCriterion2());
        var_dump($call->getCriterion3());
        var_dump($call->getCriterion4());
        var_dump($call->getCriterion5());
        var_dump($call->getDashboard('01-03-2012', '01-03-2013'));
        var_dump($call->getDashbordFinancial('01-03-2012'));
        var_dump($call->getFinancial());
        var_dump($call->getFormTraining());
        var_dump($call->getScheduleSEPA());

        $sale = array(
            'vente'     => '{"ventes":[{"idArticle":300024225, "idTva":0, "quantite":3, "prixUnitaire":12.34},
                                                   {"idArticle":300185150, "idTva":0, "quantite":2, "prixUnitaire":987.654}]}',
            'reglement' => '{"reglements":[{"idMode":1, "montant":12.34},
                                        {"idMode":3, "montant":987.654},{"idMode":2, "montant":122.3}]}'
        );
        var_dump($call->addSale($sale));

        $search = array(
            "idClientRecherche" => '',
            "nom"               => 'sa%',
            "prenom"            => '',
            "secondPrenom"      => '',
            "email"             => '',
            "idCivilite"        => '',
            "naissance"         => '',
            "telephone"         => '',
            "portable"          => '',
            "idVille"           => '',
            "idSituation"       => '',
            "idProfession"      => '',
            "dateCreation"      => '',
            "contactSMS"        => '',
            "contactEmail"      => '',
            "contactCourrier"   => '',
            "contactTelephone"  => ''
        );

        var_dump($call->searchClient($search, 1));
        var_dump($call->getClientIdByEmail('toto@toto.fr'));
        var_dump($call->clientWithAnActiveSpecificAccess(1018874, 16485527));
        var_dump($call->accessListForAClient(19435255));
    } catch ( JsonHeitzException $exc) {
        echo $exc->getMessage();
    }

Et voila, @Bientôt Grand Maître L

SgAutoRepondeur avec composer

J’ai développé une petite classe en PHP pour utiliser facilement l’API de SGAutoRépondeur.

Elle est bien-sûr disponible pour tous sur mon Bitbucket. Elle respecte les conventions PSR-4 pour l’auto-chargement des classes et ça c’est important !!!

Pour information, voici comment l’utiliser :

require_once 'vendor/autoload.php';

try {
    $monTest = (new \SgAutoRepondeur\SgAutoRepondeur())
            ->setCodeActivationClient('1010201000162121718617151918911')
            ->setMembreID('32')
            ->setInscriptionNormale('non')
            ->setEmailSG('sebastienXXX_@hotmail.com')
            ->setListeID('779')

    ;
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

try {
    $userSG = (new \SgAutoRepondeur\User\User())
            ->setEmail('tutu@tutu.fr')
            ->setNom('Dupont')
            ->setPrenom('Jean')
            ->setAdresse('125 rue de nulle part')
            ->setPays('France')
            ->setAnneeNaissance('1979')
            ->setMoisNaissance('01')
            ->setJourNaissance('10')
            ->setVille('lyon')
            ->setIp('192.168.1.236');

    $monTest->setFields($monTest, $userSG);

  //  var_dump($monTest->getFields());
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

try {
    var_dump( $result = (new SgAutoRepondeur\ResponseDictionary\ResponseDictionary())
        ->value( $monTest->callWebService($monTest->getFields()) ));
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

Pour avoir plus d’informations sur l’autorépondeur et à quoi cela sert, je vous invite à vous rendre sur leur site internet

http://sg-autorepondeur.com/index.php

@ plus Grand Maitre L

jumelles-vector-21

Surveillance de masse en France

Le titre m’avais accroché, j’ai donc décidé de lire la suite. L’article très complet résume les dernières informations concernant la loi Anti-terroriste voté en ce moment au parlement Français.

Voici l’extrait qui m’a fait bondir de ma chaise :

Il faut savoir sacrifier quelque peu sa vie privée.

Cette affirmation ne me conviens pas du tout.
Je ne supporte pas l’idée que que l’on espionne ce que je dise/écrive sous prétexte de sécurité. On ne peux pas surveiller tous les internautes sans distinctions pour faire un tris à posteriori.

Il faut au contraire des surveillances ciblées. Ne nous faisons pas d’illusions, les terroristes savent lire un tutoriel sur internet pour utiliser un VPN et TOR.

Cette loi n’est là que pour faire plaisir à l’opinion publique.

En réduisant nos libertés, le terroristes gagnent !

je vous renvoi vers l’article d’origine :

Codeigniter 3.0 is out !

C’est parti Codeigniter 3.0 est maintenant disponible en version finale, la lise des changements étant longue comme mon bras, je vous invite à vous plonger dans le changelog officiel sur cette page.

A partir de maintenant c’est un nouveau départ pour le framework qui j’espère sera amené à évoluer plus souvent. Je lui souhaite le meilleur mais je fait aussi quelques recommandations.

Une nouvelle version à minima

La version minimale est php 5.2.x, c’est une version qui n’est plus supportée par PHP depuis 4 ans (la doc dit qu’ils recommandent PHP 5.4.x). Là je suis un peux plus content mais aucun des apports de la version ne sont utilisé (TRAITS, namespaces…). Une refonte du cœur doit être entreprise pour tirer le meilleur parti de ces nouveaux ajouts.

Et maintenant je fais quoi ?

Et bien je vais tenter de migrer au moins un projet vers codeigniter 3.0 pour voir les limitations et les opportunités de la nouvelle version. Si tous se passe correctement, je migre mes autres projets.

 

La nouvelle version est disponible ici

See you soon !

Générer un évenement *.ics pour outlook en PHP

Il est maintenant possible de l’utiliser via composer :

"calendar/icsfile": "dev-master"

Salut,

Pour un besoin personnel j’ai du créer cette class PHP qui génère un événement pour Outlook, gmail…
Voici la classe en question :

/*
 * Variables used in this script:
 * $summary     - text title of the event
 * $dateStart   - the starting date (in seconds since unix epoch)
 * $dateEnd     - the ending date (in seconds since unix epoch)
 * $address     - the event's address
 * $description - text description of the event
 * $filename    - the name of this file for saving (e.g. my-event-name.ics)
 */

namespace ical;

class ical {

    private $name;
    private $timezoneICal = 'Europe/Paris';
    private $dateStart;
    private $summary;
    private $dateEnd;
    private $filename;
    private $address;
    private $description;
    private $alarm        = FALSE;
    private $repeat       = FALSE;
    
    public function getName() {
        return $this->name;
    }

    public function getTimezoneICal() {
        return $this->timezoneICal;
    }

    public function getDateStart() {
        return $this->dateStart;
    }

    public function getSummary() {
        return $this->summary;
    }

    public function getDateEnd() {
        return $this->dateEnd;
    }

    public function getFilename() {
        return $this->filename;
    }

    public function getAddress() {
        return $this->address;
    }

    public function getDescription() {
        return $this->description;
    }

    public function getAlarm() {
        return $this->alarm;
    }

    public function getRepeat() {
        return $this->repeat;
    }

    public function setName($name) {
        $this->name = $name;
        return $this;
    }
   
    public function setTimezoneICal($timezoneICal) {
        $this->timezoneICal = $timezoneICal;
        return $this;
    }

    public function setDateStart($dateStart) {
        $this->dateStart = $this->_dateToCal($this->_human_to_unix($dateStart));
        return $this;
    }

    public function setSummary($summary) {
        $this->summary = $summary;
        return $this;
    }

    public function setDateEnd($dateEnd) {
        $this->dateEnd = $this->_dateToCal($this->_human_to_unix($dateEnd));
        return $this;
    }

    public function setFilename($filename) {
        $this->filename = $filename;
        return $this;
    }

    public function setAddress($address) {
        $this->address = $address;
        return $this;
    }

    public function setDescription($description) {
        $this->description = $description;
        return $this;
    }

    public function setAlarm($alarm) {

        if (is_int($alarm)) {
            $this->alarm = $alarm;
            return $this;
        } else {
            throw new \Exception(__CLASS__ . " : It's not an integer", 01);
        }
    }

    public function setRepeat($repeat) {
        $this->repeat = $repeat;
        return $this;
    }

    /**
     * @name getICAL()
     * @access public
     * @return string $iCal
     */
    public function getICAL() {

        $iCal = "BEGIN:VCALENDAR" . "\r\n";
        $iCal .= 'VERSION:2.0' . "\r\n";
        $iCal .= "PRODID:" . $this->getName() . "\r\n";
        $iCal .= "CALSCALE:GREGORIAN " . "\r\n";
        $iCal .= "BEGIN:VEVENT" . "\r\n";
        $iCal .= "DTSTART:" . $this->getDateStart() . "\r\n";
        $iCal .= "DTEND:" . $this->getDateEnd() . "\r\n";
        $iCal .= "SUMMARY:" . $this->_escapeString($this->getSummary()) . "\r\n";
        $iCal .= 'UID:' . uniqid() . "\r\n";
        $iCal .= 'LOCATION: ' . $this->_escapeString($this->getAddress()) . "\r\n";
        $iCal .= 'DESCRIPTION:' . $this->_escapeString($this->getDescription()) . "\r\n";

        if ($this->getAlarm()) {
            $iCal .= 'BEGIN:VALARM' . "\r\n";
            $iCal .= 'ACTION:DISPLAY' . "\r\n";
            $iCal .= 'DESCRIPTION:Reminder' . "\r\n";
            $iCal .= 'TRIGGER:-PT' . $this->getAlarm() . 'M' . "\r\n";
            if ($this->getRepeat()) {
                $iCal .= 'REPEAT:' . $this->getRepeat() . "\r\n";
            }
            $iCal .= "END:VALARM" . "\r\n";
        }
        $iCal .= 'END:VEVENT' . "\r\n";
        $iCal .= 'END:VCALENDAR' . "\r\n";
        return $iCal;
    }

    /**
     * @name _dateToCal()
     * @access private
     * @param string $timestamp
     * @return string
     */
    private function _dateToCal($timestamp) {

        return date('Ymd\THis\Z', $timestamp);
    }

    /**
     * @name _escapeString()
     * @abstract Escapes a string of characters
     * @param string $string
     * @return string
     */
    private function _escapeString($string) {
        return preg_replace('/([\,;])/', '\\\$1', $string);
    }

    /**
     * @name $setHeader();
     */
    public function setHeader() {
        header('Content-type: text/calendar; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $this->getFilename() . '.ics');
    }

    /**
     * @name _human_to_unix()
     * @desciption this function is from codeigniter frameWork
     * @param string $datestr
     * @return boolean
     */
    private function _human_to_unix($datestr) {

        $datestr = preg_replace("/\040+/", ' ', trim($datestr));

        if (!preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) {
            throw new \Exception(__CLASS__ . " : bad" . $datestr);
        }

        $split = explode(' ', $datestr);

        $ex = explode("-", $split['0']);

        $year  = (strlen($ex['0']) == 2) ? '20' . $ex['0'] : $ex['0'];
        $month = (strlen($ex['1']) == 1) ? '0' . $ex['1'] : $ex['1'];
        $day   = (strlen($ex['2']) == 1) ? '0' . $ex['2'] : $ex['2'];

        $ex = explode(":", $split['1']);

        $hour = (strlen($ex['0']) == 1) ? '0' . $ex['0'] : $ex['0'];
        $min  = (strlen($ex['1']) == 1) ? '0' . $ex['1'] : $ex['1'];

        if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) {
            $sec = (strlen($ex['2']) == 1) ? '0' . $ex['2'] : $ex['2'];
        } else {
            // Unless specified, seconds get set to zero.
            $sec = '00';
        }

        if (isset($split['2'])) {
            $ampm = strtolower($split['2']);

            if (substr($ampm, 0, 1) == 'p' AND $hour < 12)
                $hour = $hour + 12;

            if (substr($ampm, 0, 1) == 'a' AND $hour == 12)
                $hour = '00';

            if (strlen($hour) == 1)
                $hour = '0' . $hour;
        }

        return mktime($hour, $min, $sec, $month, $day, $year);
    }

}

Pour l'utiliser voici le code :

       
 require_once 'vendor/autoload.php';

    use ical\ical;
try {
 
        $ical = new ical();
        $ical->setAddress('Paris');
        $ical->setDateStart('2014-11-21 15:00:00');
        $ical->setDateEnd('2014-11-21 16:00:00');
        $ical->setDescription('wonder description');
        $ical->setSummary('Running');
        $ical->setFilename(uniqid());
        $ical->setHeader();
       
    echo $ical->getICAL();
            
  
        } catch (Exception $exc) {
            echo $exc->getMessage();
}

Cette class est disponible sous Bitbucket, voici l’adresse https://bitbucket.org/colonelMoutarde/icalendar-generator.

logo word

Comment récupérer les images d’un document word ?

Je me permet de vous faire part de cette petite astuce bien pratique qui me permet de récupérer les médias d’un fichier Word, PowerPoint… En effet, les copier/coller habituels ont parfois des effets hasardeux.

Voici de que je vous recommande, attention cette astuce ne fonctionne qu’avec les fichiers de type *.docx ou *.pptx.

Il suffit de renommer l’extension de *.docx en *.zip et d’ouvrir le fichier. On y découvre une arborescence, on ouvre le dossier word puis le dossier media et là : miracle, toutes les photos son présentes en bonne qualités…

Enjoy…

 

logo de dploy

Déployer son site sur un serveur ftp avec Dploy

Bonne nouvelle, le site du zero OpenCassRooms le propose en première page de son site !!!

C’est bon mon tutoriel a été accepté, je vous invite à le suivre et à me faire quelque retours…

Dploy c’est quoi ?

Dploy c’est un un script qui va uploader les fichiers et dossiers que vous avez versionné avec Git sur un serveur distant.

En effet quant on travaille sur de petits projet on est souvent en présence d’un simple accès ftp

Les prérequis pour ce cours sont :

  • Connaitre l’utilisation du logiciel Git, si ce n’est pas le cas reportez-vous au tutoriel de Mathieu Nembra, il est très complet.
  • Il doit être installé sur votre ordinateur.
  • Avoir node.js d’installé sur son ordinateur.
  • Avoir suivi le cours sur node.js au moins pour la partie installation.
  • Une connexion internet.
  • Un hébergement sur lequel se connecter en ftp ou en sftp.

Si tout est bon, on peut commencer !

Lire la suite sur le site openClassrooms

Touche pas mon net

Le CSA et la neutralité du net…

…C’est une source d’incompréhension.

C’est reparti, on attaque encore une fois la neutralité. Cette fois ci ce n’est pas sous l’angle des terroriste ou des disciples de Michael Jackson mais carrément du commerce.

Le Conseil supérieure de l’audio visuel droit dans ses bottes trouve normal de proposer à nos chères députés de créer un service OTT (over the top) (pour les anglophobes, au dessus du trafic) pour les Netflix, Youtube et consorts payant afin de les inciter financièrement à investir en France… Car qui dit trafic privilégié dit aussi trafic dégradé pour tous ceux qui n’ont pas les moyens de se le payer.

Le problème est pourtant simple et il faudrait que les sages se mettent à la page la pravda télévision ce n’est pas internet il n’y a pas de notion de d’émetteur actif et de récepteur passif, chaque ordinateur à n’importe quel moment deviens un serveur.

QUAND JE SURF SUR INTERNET, JE SUIS ACTIF…

Comment monsieur Michu qui a une idée géniale pour diffuser un nouveau concept révolutionnaire va il pouvoir lutter face à Google, Apple… pour proposer son service si il est automatiquement noyé et écrasé par de grosses sociétés capables de prioriser leur service ?

Internet et un monde étrange ou tous le monde est sur la même ligne de départ, de la petite enseigne à la grosse multinationale, il faut conserver ce fait. Google n’est pas le centre d’internet de même que Yahoo! alors pourquoi leur faire un pont d’or ?