Lire un fichier csv avec Laravel

28 March 2018

J’avais besoin de lire un fichier CSV pour remplir une base de donnée Laravel. C’est assez simple à faire car il y a une super lib pour gérer le CSV :

composer require League/csv

On lit le CSV et on boucle sur chaque élément. Après on en fait ce qu’on veut :) !

<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use League\Csv\Reader;
use League\Csv\Statement;

class commune extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // Remplir la base de donnée avec les communes du fichier CSV

        // Lire le fichier csv
        $csv = Reader::createFromPath(storage_path('app/communes_belges.csv'));
        $csv->setHeaderOffset(0);

        // Boucler sur les données du fichier csv
        $records = (new Statement())->process($csv);
        foreach ($records->getRecords() as $record) {
            var_dump($record);
        }
    }
}

Contourner un proxy filtrant avec PuTTY et Firefox

23 February 2018

warning

Je ne suis pas un professionnel de la sécurité, je ne sais pas a quel point cette méthode est fiable, ni si elle fonctionnera aussi pour vous.
Il est également probable que le règlement de votre institution vous interdise de contourner les mesures de sécurités mises en place.

Utilisation à vos risque et péril !

Il m’arrive régulièrement de me retrouver dans un environnement web bien sale, avec un proxy qui filtre le contenu et bloque l’accès a certain sites.
Comme tous ces outils sont bien bêtes et bloquent souvent des sites légitimes, et que je avais bien le temps, je me suis amusé à le contourner.

Avoir une connexion la maison

La première étape consiste à avoir un accès “outdoor” qui servira de relai. Ici j’utilise mon ordinateur à la maison.
Comme beaucoup, j’ai un adresse IP dynamique, problème que j’ai corrigé en utilisant le service nsupdate.info. Si le proxy bloque nsupdate.info, il faudra partir chaque matin avec votre IP sous le bras…
Si vous avez un nom de domaine chez OVH, vous pouvez vous en servir aussi.

Ensuite, il suffit de connecter PuTTy sur cette machine. Dans le cas où le proxy n’accepte pas les connexions SSH sur le port 22, changer le port SSH sur votre machine pour utiliser le même que celui du proxy (8080 par exemple).
Pour cela j’ai utilisé mon téléphone et ma connexion 4G (oui, oui :->) et j’ai modifié la configuration SSH.

Configurer l’hôte dans PuTTY

Il faut aussi ajouter le proxy dans la configuration PuTTy.

Configurer le proxy dans PuTTY

Ouvrir un tunnel SSH

On va ensuite ouvrir un tunnel SSH pour y faire passer le trafic de notre navigateur web. Ce qui circulera entre le proxy et vous sera complètement illisible pour le premier proxy, car protégé par le tunnel SSH.

Ouvrir un tunnel SSH

Dans “port source” placé le numéro de port du proxy (ici 8080). Coché aussi “dynamique”.

Brancher Firefox sur le tunnel.

Brancher Firefox sur PuTTY

On branche ensuite Firefox sur ce nouveau “proxy”. Placer “localhost” dans le SOCKS et coché bien SOCK v5. Coché également la case “Proxy DNS when using SOCKS v5”.

Il reste à vérifier que vous avez accès à internet :).


Limiter le pouvoir d'Iedit-mode

15 January 2018

Petit pense-bête pour Iedit-mode et Spacemacs. Cela peut vous faire gagner un temps fou !

Iedit permet de replacer toutes les occurrences d’une sélection en une seule fois. Mais par défaut, il le fait dans tout le buffer.

Il existe cependant quelques possibilités pour limiter le “scope”, la sélection :

  • F pour limiter Iedit à la fonction en court. C’est parfait pour renommer une variable !
  • L pour limiter à la ligne en court.
  • J pour ajouter une ligne du dessous a la sélection Iedit.
  • K pour ajouter une ligne au-dessus de la sélection Iedit.
  • Naviguer entre les occurrences : n et N ou TAB.

Il est aussi possible de sélectionner une zone pour réduire la sélection Iedit:

  1. SPC s e pour activer Iedit.
  2. Sélectionnée la zone (v en Evil-mode, les autres comme V ne fonctionne pas).
  3. SPC s e pour réactiver Iedit qui limitera l’effet.

Une marge sur le "scroll" des ancres HTML

17 December 2017

Voici une petite astuce pour avoir une marge, entre le “haut du browser” et l’emplacement réel de l’ancres, lorsque l’on clic sur une ancre.

/**
 * Appliquer une marge sur les ancres HTML c'est plus
 * ergonomique.
 */
:target {
    border-top: 75px solid transparent;
    margin: -75px 0 0;
    -webkit-background-clip: padding-box;
    -moz-background-clip: padding;
    background-clip: padding-box;
    outline: none; /* Supprimer la outline disgracieuse de Chrome */
}

:target est une sélécteur css bien supporté qui cible toutes les ancres. Du coup on lui ajouter une fausse marge. L’avantage ce code, c’est qu’il va fonctionner même si l’ancre est dans un texte. Ce que n’est pas le cas de la majorité des techniques à base de display: block; et de :before.


Recherche ajax avec les formulaires SPIP

16 November 2017

Le but de ce formulaire est une recherche dynamique : a chaque nouvelle lettre dans l'input la recherche s’affine.

La bonne nouvelle c’est qu’on peut faire cela nativement avec les fonctions présentent dans SPIP.

Dans un premier temps, il faut créer un fichier formulaires/recherche_ajax.php. Il va mettre à jour le contexte du formulaire en lui passant un critère de recherche {recherche}.

<?php

if (!defined('_ECRIRE_INC_VERSION')) {
    return;
}

function formulaires_recherche_ajax_charger_dist($ajax_bloc) {
    return array(
        'ajax_bloc' => $ajax_bloc,
        'recherche_'.$ajax_bloc => _request('recherche_'.$ajax_bloc),
        'lang' => $lang,
    );
}

Ensuite un peu de JavaScript et d’HTML pour recharger un bloc ajax, dans un fichier {formulaires/recherche_ajax.html}. Ici, j’ai simplement repris le formulaire de recherche de SPIP en modifiant le {name} de l’input de recherche.

<div class="formulaire_spip formulaire_recherche[ (#ENV{class})]" id="formulaire_recherche">
    <form action="[(#ENV{action})]" method="get">
        <div class="editer-groupe">
            [(#ENV{action}|form_hidden)]
            [<input type="hidden" name="lang" value="(#ENV{lang})" />]
            <label for="#ENV{_id_champ}"><:info_rechercher_02:></label>
            <input type="[(#HTML5|?{search,text})]" class="search text" name="recherche_#ENV{ajax_bloc}" id="#ENV{_id_champ}"[ value="(#ENV{recherche})"] />
            <input type="submit" class="submit" value="&gt;&gt;" title="<:info_rechercher:>" />
        </div>
    </form>
</div>

Dans le même fichier, à la fin, un peu de JavaScript pour mettre à jour le bloc_ajax (a savoir un squelette avec la boucle de recherche). Pour plus d’information, sur le fonctionnement d’Ajax avec SPIP, la page de [la documentation officiel->https://www.spip.net/fr_article3753.html] est bien faite.

 // Chaque input déclenche la recherche ajax
 $("#recherche_#ENV{ajax_bloc}").on("input", function () {
     ajaxReload(
         "#ENV{ajax_bloc}",
         {
             args: {
                 // Envoyer le contenu du formulaire dans le
                 // contexte de recherche SPIP
                 recherche: $(this).val()
             }
         }
     );
 });

Dans le bloc ajax (un fichier inclure/grille_article), je place simplement ma boucle de recherche :

[(#SET{defaut_tri,#ARRAY{
    titre,1,
    num titre,1,
    date,#ENV{date_sens,-1},
    id_article,1,
    points,-1
 }})]

<B_article_ajax>
    #ANCRE_PAGINATION
    <BOUCLE_article_ajax(ARTICLES){recherche ?}{tri #ENV{par,#ENV{recherche}|?{points,num titre}},#GET{defaut_tri}}{pagination}>
        <INCLURE{fond=inclure/article_resume, id_article} />
    </BOUCLE_article_ajax>
    [<p class="pagination">(#PAGINATION)</p>]
</B_article_ajax>

Il ne reste qu’à appeler tout cela :

[(#FORMULAIRE_RECHERCHE_AJAX{grille_article})]

<INCLURE{fond=inclure/grille_article, env, ajax=grille_article} />

Pour en savoir plus sur les formulaires de SPIP, rien ne vaut la documentation de spip.net :).


Éxecuter du code quand une commande est payée

16 June 2017

Lorsque l’on utilise le plugin commande et que l’on souhaite exécuter une peu de code lorsqu’une commande est payée, il suffit d’utiliser ce petit pipeline :

function prefixe_post_edition($flux) {
    if ($flux['args']['table'] == table_objet_sql('commande')
        and $flux['args']['action'] == 'instituer'
        and $flux['args']['statut_ancien'] == 'encours'
        and $flux['data']['statut'] == 'paye'
    ) {
        $id_commande = $flux['args']['id_objet'];
        // Coder ici
    }
    return $flux;
}

Un serveur de mail local pour le développement web

1 June 2017

Testé sous Ubuntu 16.04 ou LinuxMint 18

Petite astuce pour avoir un serveur de mail local, qui renvoie tous les mails envoyés par PHP (ou autre) vers username@localhost.

La première chose est d’installer le serveur d’envoi, postfix :

sudo apt install postfix

Il est possible qu’il soit déjà installé, mais pas spécialement bien configurer, pour être certain, il vaut mieux le reconfigurer :

sudo dpkg-reconfigure postfix

Sélectionnez l’option Local uniquement et laisser toutes les autres options par défauts.

Ensuite, j’ai fait une petite page php de test :

<?php
mail('username@localhost', 'test', 'test');

L’envoie du mail devrait alors créer un fichier dans /var/mail/username. Vérifiez que tout ce passe bien :

more /var/mail/username

Vous devriez avoir quelques choses comme ceci dans votre terminal :

From phenix@Thanatos.localdomain  Thu Jun  1 17:23:07 2017
Return-Path: <phenix@Thanatos.localdomain>
X-Original-To: phenix@localhost
Delivered-To: phenix@localhost.localdomain
Received: by Thanatos.localdomain (Postfix, from userid 1000)
    id CF2F385652; Thu,  1 Jun 2017 17:23:07 +0200 (CEST)
To: phenix@localhost.localdomain
Subject: test
X-PHP-Originating-Script: 1000:test_mail_local.php
Message-Id: <20170601152307.CF2F385652@Thanatos.localdomain>
Date: Thu,  1 Jun 2017 17:23:07 +0200 (CEST)
From: phenix@Thanatos.localdomain (phenix)

test

J’ai laissé les valeurs de ma machine, ce sera sans doute différent sur la vôtre.

On peut ensuite configurer Thunderbird pour lire cette boite mail. J’utilise la version 52.1.1.

Fichier > Nouveau > Autres comptes…

Ajouter une boite mail local avec thunderbird

Configurez une Unix Mailspool (Movemail).

Voilà, Thunderbird va lire la boite locale.

Rediriger tous les mails vers usename@local

L’idée de base est de recevoir tous les mails envoyés par le serveur dans cette boite, afin de débugger facilement.

On va éditer la configuration de postfix dans le fichier /etc/postfix/main.cf pour y ajouter :

virtual_alias_maps = pcre:/etc/postfix/virtual

Créer ensuite le fichier /etc/postfix/virtual et placez y le code suivant :

/.*@.*/ username

Il faudra également installer le paquet postfix-pcre :

sudo apt install postfix-pcre

Voilà, tout le trafic mail du serveur va aller dans votre boîte mail locale ! Beaucoup plus pratique pour débugger l’envoie de mail de vos applications :) !


Prendre en compte les branches avec git-svn

29 May 2017

En utilisant Git SVN, j’ai découvert un effet de bord assez indésirable : lorsque l’on utilise fait un dcommit pour envoyer les modifications sur le serveur, il envoie toutes les branches.

C’est très gênant, surtout si vous avez plusieurs choses en cours, et quelle pourrait casser votre application.

Heureusement, il y a une solution : lorsque vous clonez, il faut préciser le dossier du trunk :

git svn clone -T trunk http://example.com/PROJECT

Git svn fera alors le lien master = trunk et vos autres branches seront tranquilles.


Emacs, PuTTy et les couleurs

15 May 2017

J’ai remarqué il y a peu que les couleurs d’Emacs était complètement foireuses en ce connectant depuis Windows et PuTTy. Mais genre, vraiment moche et illisible.

Couleur Putty par défauts

Rien a voir avec le thème que j’utilise normalement.

Après un peu de recherche, la solution est en faite très simple : il faut activer les 256 couleurs du terminal !

Configuration putty avec emacs

Voilà, on respire, c’est déjà beaucoup mieux :)

Emacs avec les bonnes couleurs


Une argumentation négative de Wix

10 April 2017

Sur la liste SPIP-User, est passé un mail bien cool d’Amilcar qui argumente contre la plate-forme Wix.


Voici une argumentation négative de Wix :

Je ne parle pas du payant : un hébergement mutualisé chez ovh + un nom de domaine coûte aux environs de 30€/an.

Chez wix sans pub 99€ par an minimum.

L’impossibilité de transférer ses données :

le jour où vous en avez marre de Wix, hé bien vous êtes bons pour tout recommencer !

Profondeur de navigation : Deux niveaux maximum sont possibles.

Optimisation pour les moteurs de recherche (SEO) : impossible de personnaliser l’attribut ALT pour les images utilisées dans les articles de plus google pénalise les sites en wix.

Statistiques de fréquentation : obligatoire de passer par Google Analytics.

Newsletter : ne propose pas de fonction de double opt-in.

Smartphone : Si vous voulez obtenir un bon affichage sur mobile, vous devrez organiser manuellement les éléments de votre site, contrairement à un éditeur dit « responsive » où l’affichage s’adapterait automatiquement.

Squelettes ou templates : il est impossible de changer de modèle une fois qu’il a été choisi. Certains éléments clés ne peuvent pas être modifiés : le nom du site qui s’affiche dans l’url et le thème graphique.

https : ce que ne dit pas le site c’est que dans l’achat du nom de domaine, leur certificat n’est pas sécurisé SSL. L’adresse est en “http” et non “https”.

FTP : si vous faite un site chez Wix (même en payant) aucune possibilité de faire une sauvegarde locale sur FTP (très fâcheux), mais s’arrête pas là. Une redirection de site vers un nom de domaine extérieure n’est pas possible non plus htaccesredirect / 301 ou faire pointer le site sur des ns 1 et ns 2 extérieures

PUB : recevoir à tout moment des messages et des contenus promotionnels de la part de Wix ou de ses partenaires, par courrier, par e-mail ou via toute coordonnée que vous nous fournissez (y compris votre numéro de téléphone pour des appels ou des textos). De la pub Wix vient s’insérer un peu partout (y compris inopinément dans le header et footer de votre site). Ceci vaut pour la formule gratuite et la 1ère formule payante

Trop de fonctionnalités graphiques tuent la fonctionnalité graphique. Vu le temps qu’on a passé sur un site de rien du tout, à éplucher toutes les possibilités de bouton, menus, diapos, couleurs, animations… On ne veut même pas imaginer le temps que vous passerez vous, pour la réalisation d’un site qui vous tient à cœur. De plus, permettre à chaque élément d’être personnalisé aussi différemment peut nuire à l’unité visuelle du site.

Wix n’est pas “open source”, ce qui signifie qu’il ne livre pas son code à qui veut (contrairement à SPIP). Concrètement, vous n’aurez pas toute une communauté de développeurs pour améliorer le système en permanence et proposer un tas de plugins (= fonctionnalités) gratuits. Si vous choisissez Wix, vous ne pourrez faire vos choix de fonctionnalités que dans ce que l’équipe Wix aura à vous proposer.

Conditions d’utilisations : alors le site vous appartient ou pas ?

permettre à Wix d’utiliser de manière perpétuelle, dans le monde entier et gratuitement, une version de votre Site d’Utilisateur (ou toute partie de celui-ci) aux fins d’activités promotionnelles ou de marketing de Wix, en ligne et/ou hors ligne, et de la modifier dans des limites raisonnables au regard des fins visées, et renoncer à toute réclamation contre Wix ou toute personne agissant en son nom concernant les droits moraux, les droits d’auteur ou tout autre droit, passé, présent ou futur, dans le monde entier, que vous pourriez détenir dans ou en rapport avec votre Site d’Utilisateur s’agissant de telles utilisations présentant un caractère autorisé et limité.

Entre Wix et vous, vous posséderez la propriété intellectuelle se rapportant à votre Contenu d’Utilisateur, y compris l’ensemble des conceptions, images, animations, vidéos, fichiers audio, polices, logos, illustrations, compositions, œuvres d’art, interfaces, textes, œuvres littéraires et tout autre matériel créé par vous. Vous accordez à Wix une licence et un droit exempt du versement de royalties, perpétuel, irrévocable, non exclusif, incessible et pouvant faire l’objet d’une sous licence pour utiliser votre Contenu d’Utilisateur (en tout ou en partie) dans le monde entier afin de vous fournir les Services Wix, et comme spécifié dans l’article ‎2.2(5) ci-dessus.


En complétement, RealET donne une jolie liste de liens :

https://www.pyrat.net/Jimdo-un-choix-risque.html : tu peux remplacer Jimdo par Wix https://www.websitetooltester.com/fr/tests/wix https://www.pyrat.net/Le-bilan.html (le bilan d’un stagiaire il y a un an). https://www.rankfirstlocal.com/blog/are-wix-websites-good-for-seo/