Fusionner plusieurs commits d’une feature branche vers master

Quand on travaille sur une branche de développement en parallèle et qu’on souhaite déporter son travail sur la branche master on a deux manières de le faire. La première, -plus simple-, consiste à faire un merge à partir de master alors que la seconde, -plus difficile-, consiste à faire un rebase (en renommant, fusionnant les commits au passage).

Méthode 1 : Facile

On se place sur la branche master et on met à jour les données

[shell]
git checkout master
git fetch
git pull
[/shell]

On merge la branche dérivée depuis master

[shell]git merge feature_branch[/shell]

On annule toutes les modifications faites sur la branche dérivée (de manière soft/mixed)

[shell]git reset origin/master[/shell]

Toutes les modifications annulées se mettent ‘fichiers modifiés’
A partir de la on peut créer un nouveau commit et pusher le tout
On a donc toutes les modifications faites dans la branche dérivée en un seul commit dans master.

[shell]
git add –all
git commit
[/shell]

Méthode 2 : Difficile

Le squash commit n’est pas toujours simple, c’est pour ça qu’on va commencer par dériver une branche spécialement pour cette manipulation (on ne sait jamais!…). Pour squasher tous les commits depuis le dernier commit en commun avec master :

[shell]
git checkout -b squashed_feature
git rebase -i master
[/shell]

L’éditeur s’ouvre avec les liste des commits

[shell]
pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
[/shell]

Les commits sont classés par ordre d’ancienneté (le plus ancien se trouve tout en bas de la liste). On va donc garder commit 1 (qui représente la dernière version du code), dans lequel on va squasher les autres, on ajoute donc le mot-clé “squash” devant chacun d’eux :

[shell]
pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
[/shell]

Si on supprime une ligne, le commit sera ignoré, et perdu. Après avoir enregistré, l’éditeur s’ouvre à nouveau et demande un message pour le nouveau squash commit.

Voilà, il ne reste plus qu’à merger l’unique commit de la branche squashed_feature vers master.

[shell]
git checkout master
git merge squashed_feature
[/shell]

Optimisation #2 Javascript : Réduction du nombre de variables globales

En créant un nouvel objet (et un seul!), on évite de créer pleins de variables globales.

On gagne donc en :

Propreté de code
Performance (très peu avec les navigateurs actuels)

Et surtout, on évite les conflits de noms avec d’autres applications, widgets et librairies!

BAD

[javascript]
var firstName = ‘Joey’;
var lastName = ‘Bronner’;
function sayHello() {

}
console.log(firstName);
[/javascript]

GOOD

[javascript]
var User = {
firstName : ‘Joey’,
lastName : ‘Bronner’,
sayHello : function() {

}
}
console.log(User.name);
[/javascript]

Fixer un problème de ressource occupée sur Kali-Linux

Anciennement Backtrack, la distribution Kali-Linux est très pratique pour tester la sécurité de son réseau WiFi (ou celle de vos voisins :D). Ca faisait quelques années que je ne l’avais pas monté et j’ai rencontré un petit problème pendant ma dernière utilisation…

Connaître les devices WiFi disponibles

J’ai donc branché un dongle WiFi externe et j’ai lancé la commande :

[bash]airmon-ng[/bash]

Jusque là tout va bien, je lance alors la seconde commande qui consiste à démarrer l’interface du dongle (wlan0mon qui est le nom de l’interface de mon device) :

[bash]
airmon-ng start wlan0mon
airodump-ng –encrypt wep wlan0mon
[/bash]

Au moment de la recherche ça se complique puisque j’obtiens le message d’erreur suivant :

busy_resource_airmon-ng

La ressource est soi-disant déjà occupée… J’ai donc débranché et rebranché le dongle à plusieurs reprises, rien à faire!

La solution

La seule solution que j’ai trouvé et qui permet de résoudre le problème “ioctl(SI0CSIWMODE) failed: Device or resource busy” se fait donc en 3 lignes de commandes

[bash]
ifconfig wlan0mon down
iwconfig wlan0mon mode monitor
ifconfig wlan0mon up
[/bash]

Quelques explications…

La commande ifconfig sans argument permet de lister tous les interfaces réseaux actives (avec toutes les infos qui vont bien). Dans notre cas, nous allons arrêter le service sur le dongle wifi en question pour le réactiver après avoir fait un iwconfig. La commande iwconfig permet de modifier la configuration d’une interface et donc de la passer manuellement en mode monitor.

Et voilà! Ma recherche fonctionne…

search_network_kali_airmon-ng

 

Sublime Text et l’auto-complétion, ça coince! Mais…

On va pas se le cacher, Sublime Text et l’auto-complétion c’est pas ce qui a de mieux!

Pas top

Après quelques recherches je n’ai pas trouvé de plugin ou autre qui améliore cette fonctionnalité (qui est indispensable et qu’on trouve dans tous les IDE aujourd’hui…). Malgré tout, j’ai trouvé quelques commandes qui peuvent faire l’affaire et qui vous assureront une auto-complétion à peu près correcte.

Configuration

Le fichier à modifier est le fichier de config JSON qui se trouve sous “Préférences > Settings – User(Preferences.sublime-settings)

> Par défaut, c’est activé mais on ne sait jamais…

[javascript]"auto_complete": true[/javascript]

> On limite la taille maxi du fichier à auto-compléter

[javascript]"auto_complete_size_limit": 4194304[/javascript]

> Le délai entre chaque frappe au clavier avant de déclencher la complétion (en ms)

[javascript]"auto_complete_delay": 50[/javascript]

> L’étendue du scope qui est balayé et proposé (à adapter selon vos besoin!)

[javascript]"auto_complete_selector": "source – comment"[/javascript]

Pour valider la complétion, on utilise la touche Enter. On peut modifier et utiliser la touche enter en passant la variable auto_complete_commit_on_tab à true

[javascript]"auto_complete_commit_on_tab": true[/javascript]

Si vous avez d’autres astuces ou des plugins intéressants que j’aurais loupé, je suis preneur!

L’équivalent du SELECT (SQL) sur une base de données MongoDB (NoSQL)

La particularité des bases de données “non structurées” ou “orientée documents” comme MongoDB, c’est quelles sont très performantes pour de gros volumes de données (en particulier depuis l’arrivée de tous ces objets connectés).

Pour faire un petit tour d’horizon des bases de données NoSQL actuellement sur le marché (> 225 fin décembre 2015), rendez-vous sur le site http://nosql-database.org/ qui dispose d’une liste à peu près complète des produits du marché.

Je vais montrer l’équivalent (ou plutôt les deux équivalents) de mongoDB par rapport au SELECT qui est une des requêtes de base du SQL.

SQL

Structure d’un SGBD SQL

SGBD > Database > Table >Entrées (lignes)

Capture d’écran 2015-12-20 à 13.08.24

Exemple de Select

Pour rappel, la requête basique pour sélectionner le nom, prénom et l’age des utilisateurs ayant comme ville Paris en SQL :

[sql]
SELECT nom, prenom, age
FROM users
WHERE ville="Paris"
[/sql]

MONGODB

Structure d’un SGBD NoSQL

SGBD > Database > Collections > Documents

Capture d’écran 2015-12-20 à 13.09.46

db.collection.find(query, projection)

Le premier paramètre de la fonction find() est un objet au format JSON qui va permettre de filtrer les résultats (un peu comme le where en SQL). Le second paramètre permet de retourner seulement certains champs, il est donc similaire aux valeurs qui suivent le mot clé SELECT en SQL. On peut également ajouter des conditions comme supérieur à, inférieur ou égal à, etc…

  • $gt = supérieur à
  • $lt = inférieur à
  • $gte = supérieur ou égal à
  • $lte = inférieur ou égal à

Quelques exemples :

[javascript]
// All
var res = db.users.find( );

// Paris as city
var res = db.users.find( { ville: "Paris" } );

// Older than…
var res = db.users.find( { ville: "Paris", age: { $gte:20 } } );

// Don’t return all dataset, only the name
var res = db.users.find( { ville: "Paris" }, { name: true } );

// Same as findOne()
var res = db.users.find( { nom: "Bronner", prenom: "Joey" }).limit(1);
[/javascript]

db.collection.findOne(query, projection)

La requête findOne() est différente puisqu’une fois exécutée, elle va retourner les données et fermer le curseur. Au contraire de la requête find() (même en utilisant la syntaxe find().limit(1)) qui retourne un curseur. Il faut également savoir que sans argument, findOne() retourne un document quelconque de la collection. Ce type de requête sans argument peut donc être utilisé pour constater la structure des documents.

[javascript]
// All
var res = db.users.findOne( { nom: "Bronner", prenom: "Joey" });
[/javascript]

Il n’y a pas grand chose à ajouter, c’est simple comme bonjour. Ah si j’oubliais, si vous êtes en train de faire ou refaire votre CV et que vous n’avez pas de compétences avancées en SQL, mettez que vous êtes expert en NoSQL 🙂

nosql-expert