Catégorie : Humeur

  • Il faut rendre à César ce qui est à César

    Les 3 lignes de commandes ci-dessous proviennent du blog de Korben, je les reprends essentiellement pour m’en servir comme pense-bête.

    Merci à lui pour ses nombreux posts très intéressants.

    Sous Windows

    Sous le système d’exploitation de Microsoft, d’abord, il vous faudra ouvrir une invite de commande et entrer la ligne suivante, en remplaçant NOM_DU_RESEAU_WIFI par le vrai nom du réseau wifi sur lequel vous êtes connecté :

    netsh wlan show profile NOM_DU_RESEAU_WIFI key=clear

    Sous macOS

    Sous macOS c’est sensiblement la même chose. Ouvrez un terminal et entrez la commande suivante :

    security find-generic-password -wa NOM_DU_RESEAU_WIFI

    Sous Linux

    Et sous Linux c’est pareil, ouvrez un terminal et entrez la commande suivante :

    sudo cat /etc/NetworkManager/system-connections/NOM_DU_RESEAU_WIFI | grep psk=

     

  • Installer la solution domotique NextDom sous Debian9.5

    Le projet NextDom avance bien. Il s’agit d’une refonte du core de Jeedom dans le but d’en améliorer la maintenabilité et les performances. Un gros travail a été fourni par des personnes formidables sur ces points. Nous en avons profité pour améliorer l’aspect visuel en utilisant le template basé sur bootstrap (pour la compatibilité) adminLte.

    En exclusivité, voici la procédure d’installation.

    J’attends des retours de votre part pour rechercher les bugs qui aurait pu rester.

    Je vous conseille de vérifier que vous n’avez pas de dossier html dans /var/www/ dans ce cas, supprimez-le, avant de commencer.

    Voici la procédure de test :

    Installation

    apt install -y software-properties-common gnupg wget unzip curl
    add-apt-repository non-free
    wget -qO - http://debian.nextdom.org/debian/nextdom.gpg.key | apt-key add -
    echo "deb http://debian.nextdom.org/debian nextdom main" > /etc/apt/sources.list.d/nextdom.list
    apt update 
    

    1/ Solution simple pour installer la version stable sur une machine

    apt install nextdom

    Installe Nextdom et la BDD (base de données) en local sur la machine.
    Les paquets nextdom-common et nextdom-mysql sont automatiquement installés.

    Vous avez aussi la possibilité de faire tout cela automatiquement en rendant ce script exécutable : https://raw.githubusercontent.com/NextDom/NextDom-DebInstaller/master/deb-install.sh

    Bon test 😉

  • NextDom fait sa conférence

    NextDom fait sa conférence

    Salut à tous !

    Juste un petit message pour vous dire que NextDom sera présenté officiellement lors du Open Source Summit de Paris 2018.

    A cette occasion, Vincent Fresnel aka byackee et Astral0 seront heureux de vous faire découvrir notre solution Domotique et Opensource. Venez nombreux leurs poser des questions !

    Le 6 décembre vers 15h20 !

  • Une interview de Jérémie Zimmermann

    Cette année, Jérémie a quitté la quadrature du net. Pas de rancune, mais une prise de recul très intéressante sur le fonctionnement du lobbying à Bruxelles.

  • La RGPD Expliqué par un DEV (Frédéric Hardy)

    Encore une fois, Frédéric Hardy a réalisé une conférence de très bonne qualité sur la RGPD dans le cadre du PHP tour 2018 à Montpellier. Je vous incite fortement à regarder cette vidéo.

  • NextDom, l’avenir de la domotique !

    NextDom, l’avenir de la domotique !

    Je vais vous parler de NextDom un projet domotique ambitieux. J’ai longtemps été un contributeur de l’application en PHP Jeedom. Avec le temps, j’ai voulu aider le projet en contribuant plus et en mettant en avant les bonnes pratiques du développement. J’ai donc fait de nombreux PR sur le Github du projet. Ce fut la douche froide !!

    Le lead développeur est fermé à toutes évolutions qu’il considère comme une perte de temps.

    Celles qui font perdre du temps sont :

    L’ajout de documentation dans le code sous forme de PHPDoc

    • La refactorisation de code faisant plus de 200 ligne pour une méthode/fonction
    • La normalisation du coding style vers les PSR
    • L’introduction de tests unitaires
    • L’introduction de Namespaces
    • L’utilisation cohérente de composer
    • … ⁣/li>

    On parle d’un projet sous Licence GPL, pas d’un projet dont le code source est privé.

    Je n’étais pas le seul à vouloir faire évoluer Jeedom vers plus de qualité. Avec le temps, j’ai découvert un groupe de personnes partageant le même point de vue que moi. Un très bon groupe, ouvert et sympathique. Ce groupe a tenté une médiation avec Jeedom SAS, la maison mère de Jeedom. À l’issue de cette discutions, il a été convenu que la communication avec les développeurs serait revue et améliorée.

    Malheureusement, rien n’est allé dans le bon sens. Les CGV/CGU de Jeedom ont été modifiés en rendant responsable le développeur de tous dommages physiques ou moraux. Inacceptable et contraire au principe de responsabilité de chaque un.

    D’autant plus que Jeedom s’exonère de cette responsabilité. 2 poids, 2 mesures…

    Comme cette situation n’est pas tenable, on a décidé de donner un nom à notre organisation : « NextDom« .

    La situation s’est envenimée aujourd’hui. Sur le forum Jeedom, il est interdit d’utiliser le mot NextDom. Il est automatiquement remplacé par « NotAutorized », comme si on avait écrit des insultes…

    Longue vie à NextDom un fork de Jeedom voir une solution complètement alternative.

  • Thomas pesquet

    Thomas pesquet

    Hop Hop Hop ! je sors ce blog de son sommeil pour vous rappeler à tous que ce soir Thomas Pesquet prend son envol pour l’ISS. Je lui souhaite bon vol !

    thomas pesquet official portrait
    PHOTO DATE: 01-14-16
    LOCATION: Bldg. 8, Room 183 – Photo Studio
    SUBJECT: Official portrait of ESA astronaut & Expedition 50/51 crew member Thomas Pesquet in blue flight suit.
    PHOTOGRAPHER: BILL STAFFORD
  • L’importance de la veille technologique…

    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

  • Diaballik devient 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€.

  • …et pendant ce temps, l’horreur continue

    …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 à tout 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é 😐

  • Surveillance de masse en France

    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 l’on espionne ce que je dise/écrive sous prétexte de sécurité. On ne peut pas surveiller tous les internautes sans distinctions pour faire un tri a 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 renvoie vers l’article d’origine :

  • Le jeu vidéo « Bomb »

    Et hop pour faire plaisir à un copain ! Je vous informe de la sorti du jeux vidéo Bomb sur pc et linux.

    un petit simulateur de vol dans le style graphique de Team Fortress.

  • Juste un mot…

    Juste un mot…

    … pour dire que face à cette atrocité :

    Je suis charlie
    Je suis charlie
  • 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 :

    <?php
    /*
     * 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 :

     <?php      
     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.

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

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

    Je me permets 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 média et là : miracle, toutes les photos sont présentes en bonne qualité…

    Enjoy…