Overcommit, l’alternative facile aux git hooks

Plusieurs fois j’ai eu recours aux git hooks mais je ne trouve pas ça forcément pratique ou simple à écrire.

Premier exemple d’utilisation, ayant intégré rubocop dans le CI/CD, j’aimerais ne pas rater de livraison parce que j’ai oublié de lancer rubocop (ou rspec par exemple), avant de pousser le code.

Deuxième exemple, il m’arrive de bidouiller le code en local pour des tests par exemple (changer une adresse mail de destination, mettre des console log, des alert, etc).

Et évidemment, ce genre de chose ne doit pas se retrouver en prod. Ayant une mémoire de bébé poisson rouge, une fois sur deux, je push du code qui ne devrait pas aller en prod…

Continuer la lecture de « Overcommit, l’alternative facile aux git hooks »

Le Gemfile et bundler

Le Gemfile c’est bien et Bundler c’est formidable.

Gemfile

Avec le Gemfile, on peut (+/-) fixer (ou pas, au choix), les versions des gems utilisées.

Pour ça, plusieurs syntaxes sont possibles, un exemple étant bien plus parlant :

gem 'nokogiri'
gem 'rails', '3.0.0.beta3'
gem 'rack', '>=1.0'
gem 'thin', '~>1.1'

~> 2.0.3 équivaut à >= 2.0.3 et < 2.1.

~> 2.1 équivaut à >= 2.1 et < 3.0.

Bundle install

Petit rappel, lors d’un bundle install, bundler résout exlusivement les nouvelles versions de gems non résolues dans le Gemfile.lock.

Options dispos/utiles :
–clean Efface toutes les traces des gems non utilisées
–quiet pas de log durant l’installation
–without liste séparée par des espaces des gems à skip, combinable avec –with

Bundle update

Options dispos/utiles :
–group met à jour exclusivement les gems de ce group
–force redownload toutes les gems
–patch, –minor, –major met à jour s’il trouve une nouvelle patch, minor ou major

# Command Line Result
————————————————————
1 bundle update –patch ‘foo 1.4.5’, ‘bar 2.1.1’
2 bundle update –patch foo ‘foo 1.4.5’, ‘bar 2.1.1’
3 bundle update –minor ‘foo 1.5.1’, ‘bar 3.0.0’

Bundle exec

Toujours utiliser bundle exec, qui utilise exclusivement les gems du projet et pas celles du système.
Cela permet d’assurer une cohérence plus pointue entre les différents environnements, et d’être en corrélation avec le Gemfile.

Bundle add

Permet d’ajouter une gem dans le Gemfile tout en spécifiant sa version (la dernière publiée si pas spécifiée lors de la commande) ET de faire le bundle install
Top pour encore une fois garder de la cohérence et ne biaiser un bundle update malencontreux

Options dispos/utiles
–version, -v spécifie la version
–group, -g spécifie le/les groupes
–source, -s spécifie la source si différente de la source du Gemfile

Bundle clean

Permet de supprimer les gems non utilisées du dossier bundler (ATTENTION à où sont installées les gems, et qui/quoi les utilise !!)
–dry-run pour avoir une idée de ce qui va être supprimé

 

Avoir l’inspecteur web d’un smartphone sur son PC / Mac

  • Brancher le smartphone au pc avec un câble usb
  • Activer l’inspecteur web sur le device
    • Sur iOs :
      • Aller dans Réglages
      • Puis dans Safari
      • Puis dans Avancé
      • Et activer l’inspecteur web
    • Sur Android :
      • Aller dans Paramètres
      • Puis dans À propos du téléphone (tout en bas)
      • Cliquer plusieurs fois sur Numéro de build jusqu’à « être développeur »
      • Retour dans Paramètres
      • Dans Options développeurs
      • Activer le Débogage usb
  • Accéder à l’inspecteur
    • Pour iOs :
      • Ouvrir Safari
      • Dans l’onglet développement
      • Choisir le device et l’onglet concerné
    • Pour Android :
      • Ouvrir Chrome
      • Ouvrir l’inspecteur Web (Chrome DevTools)
      • Dans les options du Chrome DevTools
      • Cliquer sur More Tools
      • Remote devices
      • Choisir son device et accepter la demande d’autorisation sur le device
      • Cliquer sur le Inspect de l’onglet désiré

Ruby 2.1.5 avec Rbenv et Ubuntu 16.04

L’autre jour j’ai eu besoin d’intervenir sur un ancien projet Rails, qui tourne sur un serveur en Ruby 2.1.5 (sortie en novembre 2014, et sans support depuis mars 2017).

Avant d’envisager une montée de version, il fallait déjà que j’arrive à tester la version actuelle. Je pensais l’affaire rapide avec Rbenv : rbenv install 2.1.5  et le tour était joué.

Vous vous en doutez, la commande a échouée lamentablement. En regardant les logs j’ai compris que le problème était lié au paquet libssl-dev

/usr/include/openssl/asn1_mac.h:10:2: error: #error « This file is obsolete; please update your software. »

Grâce à Google, j’ai compris d’où venait mon problème : les anciennes versions de Ruby (inférieures à la version 2.3) ne sont compatibles qu’avec la version 1.0 du paquet libssl-dev.

Hors Ubuntu 16.04 est fourni avec le paquet en version 1.1.0. Il a donc fallu que je downgrade en version 1.0 le paquet fautif avec la commande suivante

sudo apt-get install libssl-dev=1.0.2g

J’ai pu ensuite installer Ruby 2.1.5 avec Rbenv tout simplement.

 

Ruby On Rails – Des tâches récurrentes simples avec Whenever

Il arrive que dans la vie d’un projet on ait besoin d’exécuter certaines tâches de manières récurrentes (export/import de données, suppression de vieux comptes, envoi de mail, …).

Sous Linux, la méthode la plus simple est d’utiliser l’utilitaire cron : il nous permet de lancer commandes, et scripts à une date et une heure précise et/ou de manière récurrente.

Exemples.

# s'exécute tous les jours à 23h30
30 23 * * * df >> /tmp/df.log

# s'exécute toutes les 5 minutes
*/5 * * * * my-script.sh

Donc si on veut mettre en place les tâches récurrentes de notre projet Rails, il nous suffit de :

  1. nous connecter sur le serveur
  2. modifier la crontab pour y inclure nos nouvelles tâches

cron est un utilitaire réputé, il existe donc de très nombreuses ressources pour apprendre à l’utiliser. Mais il y a plusieurs choses qui me gênent :

  • la syntaxe cron pour définir les heures et la récurrence est parfois dure à relire (ex. 0 0 25-31 1,3,5,7,8,10,12 0 my-script.sh )
  • la modification de la crontab peut avoir un impact global pas forcément prévu
  • on ne peut pas connaître l’ensemble des tâches récurrentes d’un projet
  • le fait de devoir aller sur le serveur pour mettre à jour la crontab, oblige à le faire sur chaque machine sur laquelle l’application est déployée, il peut donc y avoir des oublis

C’est pourquoi j’ai pris l’habitude d’utiliser la gem Whenever pour gérer les tâches récurrentes de mes projets Rails

Continuer la lecture de « Ruby On Rails – Des tâches récurrentes simples avec Whenever »

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL

Si à la suite d’un rake db:migrate ou rake db:setup, vous obtenez le message suivant :

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL

Ce problème se rencontre notamment lorsque l’on souhaite utiliser MySql 5.7 avec une version de Rails < v4.1.0.beta1.

Créer un fichier nommé mysql2_adapter.rb dans le dossier config/initializers et y ajouter le code suivant :

require 'active_record/connection_adapters/mysql2_adapter'
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
 NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

Scrolltop qui ne fonctionne pas sur Chrome

Lorsque l’on souhaite appliquer une animation scrolltop et que celle-ci ne fonctionne pas sur Chrome, il faut vérifier sur quel objet est appliquée cette animation.

Si c’est $(‘html’), c’est bien là la source du problème car

$('html').animate

ne fonctionne pas sur Chrome. Il faut alors remplacer par ce code qui fonctionne sur firefox, chrome et Safari

$('html,body').animate

Transformez votre WebApp en DesktopApp avec Chrome

True Fact :

Il vous est sans doute déjà arrivé de fermer toutes les fenêtres de navigateur pour vous aperçevoir que vous aviez eu la main un peu lourde, l’un des onglet contenant votre Trello, Asana ou Nextcloud… Si c’est votre cas, voici une solution.

Historique :

Les développeurs ayant un peu de vécu se souviennent sans doute que dans les années 2010-2015, les gars de Google avait placé une fonctionnalité par défaut dans Chrome qui permettait de faire tourner un site dans un navigateur dépouillé de tout. Ceci rendant la WebApp « Desktop ». il y a quelques années quelqu’un chez Google a décidé de cacher cette fonctionnalité dans les options du navigateur (Depuis la version 44.0.2403.89 précisément !).

Comme je suis sympa voilà comment rétablir les choses.

Configuration :

Dans chrome, saisir dans barre d’url :

chrome://flags

Un coup de raccourci pour effectuer une recherche rapide :

CTRL+F

Recherchez et sélectionnez :

The new bookmark app system
Enabled

Recherchez et sélectionnez

Allow hosted apps to be opened in windows
Enabled

Nickel. Vous avez maintenant la fonctionnalité de rétablie. Jouons avec 🙂

Utilisation:

  1. Ouvrez un nouvel onglet, et allez sur le site que vous souhaitez transformer en app.
  2. Cliquez sur le menu d’option (le burger menu ou les 3 petits points) en haut à droite du navigateur.
  3. Passez sur le menu Plus d’outils.
  4. Cliquez sur le sous-menu Ajouter au dossier ‘Applications’.
  5. Dans la popup qui s’ouvre, donnez le nom de votre application et cocher la case Ouvrir dans une fenêtre

Si vous êtes sous Mac, vous pouvez alors fermer les fenêtres de Finder qui se sont ouvertes et rechercher votre application avec Spotlight ou Alfred

Et Voilà !

Crontab -l / -e / -r ? Cronjobs

Pour infos :

  • crontab -l : liste les cron
  • crontab -e : édition des cron
  • crontab -r : supprime la table de cron

Comme je n’ai pas volé ma réputation de « jeune fougueux », j’ai tapé trop vite « crontab -e » afin de glisser gentiment sur « crontab -r »… Ce qui fait que j’ai vidé la table des crons 🙂

Pour remédier à ça, il suffit de créer un fichier qu’on chargera dans le crontab et qui nous évitera ce genre de petites erreurs. Pour créer ce fichier, rien de plus simple :

crontab -l > cronjobs

Dirige la sortie de la commande « crontab – l » dans le fichier « cronjobs », créé automatiquement si il n’existe pas.

Ensuite il suffit de mettre à jour le fichier « cronjobs » à notre guise puis de le recharger dans le crontab pour mettre à jour le crontab, en faisant

crontab cronjobs

Voilà.