PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Créer un réseau ad hoc sous Windows 8

jeudi 4 décembre 2014 à 16:07

On a pas toujours un switch sous la main, et pourtant, mettre deux ordinateurs en réseau peut se faire sentir. Ok, c’est pour faire une LAN, qui j’essaye de tromper là ?

La solution, c’est le réseau ad hoc, c’est à dire demander à son ordi d’être point d’accès WIFI et réseau local.

Sous Windows 7, c’est facile, panneau de config, réseaux et partages, 3 clics et ça roule.

Mais mon Windows 8 ne voyait pas le réseau, et j’ai steam installé dessus.

Du coup, on a cherché un moyen de faire le réseau depuis W8, et l’option a été retirée des GUI.

Heureusement, il reste la ligne de commande.

D’abord, vérifier que son matos supporte le mode ad hoc :

netsh wlan show drivers

Dans la liste, il doit y avoir une ligne à propos d’un réseau hébergé avec marqué “oui”.

Si ce n’est pas le cas, fin du voyage. Sinon, on configure le réseau (les droits admins sont nécessaires) :

netsh wlan set un_nom_de_reseau mode=allow ssid=un_ssid key=un_mot_de_passe

Quand on veut lancer le réseau :

netsh wlan start un_nom_de_reseau

Quand on veut l’arrêter :

netsh wlan stop un_nom_de_reseau

Et les autres systèmes peuvent le voir dans la liste des réseaux WIFI sous le nom de “un_ssid” avec le mot de passe “un_mot_de_passe”.

Est-ce que tu peux rendre ça configurable ?

mercredi 19 novembre 2014 à 11:55

Il y a cette manie qui traîne, cette idée que si quelque chose n’est pas dans un fichier de configuration, un outil manque de souplesse. Que si il n’y a pas un settings['truc'], ça va être compliqué si on veut le changer plus tard.

Et dans de nombreux langages bas niveaux, ça se vérifie.

Mais quand on code en Python, Ruby, PHP ou Javascript, et d’autant plus avec des gros frameworks d’abstraction, le code est déjà une forme de configuration.

Souvent les clients me demandent de découpler mon code pour le rendre plus souple, plus flexible. Avec des options pour le rendre configurable. Et c’est une bonne chose.

Cependant il faut comprendre qu’il y a déjà tellement de design patterns embarqués dans nos outils modernes (iterator, generator, indexable, sliceable…), tellement de facilités offertes par les paradigmes actuels (typage dynamique, late binding, duck typing, bytecode, etc.) qu’un programme qui n’a pas été écrit comme un porc propose déjà une large marge de manœuvre.

Il est vrai qu’avec l’expérience, on écrit plus vite un code de meilleur qualité, et que, naturellement, on a tendance à laisser des hooks par ci, des opportunités d’injecter des dépendances par là. Surtout si on fait des tests unitaires.

Néanmoins, trop souvent, il sera demandé de pouvoir “rendre cette partie adaptable”, “faire en sorte qu’ici on puisse switcher d’implémentation” ou “je veux pouvoir changer d’avis plus tard”.

On peut déjà le faire.

Je suis programmeur, Python me parle. Un bon dev de la même techno trouvant mon code pourra modifier une bonne partie de mon travail pour obtenir un résultat différent.

Il n’y a pas forcément besoin d’une entrée en plus dans le .ini|json|conf|bak|old|~|/dev/null, d’un paramètre backend, de 2 jours de taf de plus pour rendre adaptable quelque chose qui peut être édité facilement.

De nombreuse fois, il est plus aisé de modifier, casser, remplacer, et même copier / coller.

Ce n’est pas écrit dans les bouquins sur les bonnes pratiques, mais c’est notre métier de coder. On est bons pour ça. On est rapides. Efficaces.

Si la fonctionnalité est un besoin avéré qu’il faudra pouvoir activer et désactiver en prod, bien entendu, il faut une option.

Mais si il faut couvrir un besoin futur hypothétiquement potentiel, laissez le dev décider si c’est YAGNI, on peut gagner beaucoup en productivité en pariant que modifier le code quand le besoin se présentera est la démarche la plus simple.

L’équilibre entre la dette technique et la sur-ingénierie permet de garder un projet sur les rails.

To shave or not to shave ?

mardi 18 novembre 2014 à 22:38

Le sexe fait parti de ces choses qui ne font pas l’unanimité. Pour rien.

Il n’y a qu’à lire les commentaires de nos articles d’opinion (comment tailler une pipe, la sodomie, etc) pour illustrer les avis divergents sur la question.

Mais rien ne m’a semblé plus sujet à désaccord que la question de la pilosité.

Chez la femme, bien entendu, il y a l’épilation aisselles, jambes et maillot. Alors que les touffes sous les bras sont rarement un débat velu, le reste est déjà plus flou.

D’un côté, la majorité des hommes, selon un sondage officiel de l’INDMS, vous répondront qu’ils aiment la sensation de douceur d’un mollet imberbe. D’un autre, combien de gars se sont dit “nan, je vais trop pas coucher avec elle, elle est pas épilée”. J’en ai rencontré deux dans ma vie.

Détail amusant, quand on sait à quel point certaines meufs sont paniquées à l’idée de s’envoyer en l’air le premier soir si elles n’ont pas fait place nette. Surtout qu’un bas nylon coquinement gardé sera souvent fort apprécié, c’est dire si le mâle n’est pas difficile à satisfaire.

Mais le plus houleux, c’est la teuch.

Parce que si le film adulte main stream s’est mis à montrer des abricots chauves partout, ce n’est pas un hasard, c’est le résultat d’un ajustement au marché. Mais dans la VVV, on rencontre de tout. Ceux qui aiment avec, sans, en ticket de métro ou avec juste un pompon pour le clito. Une chance sur cinq de déplaire, selon notre échantillon représentatif de 5 personnes au dîner d’hier.

Et là c’est compliqué. Parce qu’un type qui n’aime pas la forêt tropicale va sans doute sauter la case broutage de pelouse, une étape de jardinage qui a son importance. Quel dommage.

En prime, pour rendre les choses bien plus amusantes, c’est aussi une question de culture. Au japon, les nanas ont l’entre-jambes fleuri, c’est pas de la paresse, c’est la loi de l’offre et la demande. En revanche, certaines femmes musulmanes très voilées ont l’entre-cuisses lisse qui glisse. Délice ou vice ?

Chez l’homme, c’est comme d’hab, moins clair encore.

Déjà vous avez le problème de la calvitie, des poils de tronc et celui de porter la barbe qui se rajoutent. Il y toujours moyen de déplaire à 30% du public, quoi qu’on fasse.

Et comme le modèle marketing du mec torride est sans poil, jusque sur les coucougnettes, on pourrait penser que c’est aussi une représentation empiriquement choisie. Fi, on m’a demandé bien souvent de laisser se garnir mon service 3 pièces car “ça fait acteur porno sinon”. Comprenons donc bien, qu’il n’y aucune garantie d’aller dans le sens du poil.

Mais ne coupons pas les cheveux en quatre, que faire ?

Du pareto, bien sûr !

Je connaissais un gars qui disait, les poils, ça n’a sa place que sur la tête. Sans rentrer dans les extrêmes tirés par les cheveux, les hommes peuvent, plutôt que de se raser ou s’épiler, se tondre. Ça fait propre, mais pas trop. Ça demande de la maintenance, c’est sûr, et aussi de se promener avec une tondeuse, ce qui est bien relou. Il ne faut pas avoir un poil dans la main pour ce genre de chose.

Max a tenté l’épilation définitive des burnes avec une machine à utiliser chez soi. Aux dernières nouvelles il a abandonné en cours de route à son départ pour l’Asie. Je ne puis donc vous en dire plus.

On pourra se consoler en disant que c’est plus chiant encore pour les nanas. Tout arracher est en effet encore le pari le plus sûr. Au pire quelqu’un qui aime jouer sur gazon sera plus tolérant qu’un obsédé du terrain synthétique. Mais ça fait mal. Et ça coûte cher. Enfin les filles, attendez l’accouchement, c’est encore plus douloureux, et ça douille encore plus, sur environ 20 ans. La vie est injuste.

Je ne peux pas terminer cet article sans vous remercier de m’avoir lu.

Poil au cul.

Je ne suis pas désolé.

0bin s’est fait tej

lundi 17 novembre 2014 à 11:28

On a eu une take down notice pour une page 0bin, et comme on a pas réagit assez vite, on nous a juste coupé le site.

J’adore cette justice qui se passe de l’avis du système judiciaire, qui renverse la charge de la preuve et donne le pouvoir à des sociétés privées qui sont juges et parties. Je n’ai pas encore regardé la page en question, mais que ce soit légitime ou non, la démarche est aberrante.

Je vois bien Mac Do qui arrive chez un boucher :

Monsieur, nous pensons que votre steak imite le notre, nous fermons votre boutique jusqu’à ce que vous ne le vendiez plus. Non on a pas l’autorisation d’un juge, on est pas une société française de toute façon, on a juste fait pression sur le propriétaire de votre immeuble. Non, c’est pas mafieux si c’est légal, monsieur.

En plus, c’est pas comme si le système était pas déjà abusé par les ayant droits ET les criminels.

Bref, 0bin est down le temps qu’on répare tout ça.

Un peu de fun avec les décorateurs

lundi 17 novembre 2014 à 02:06

Puisque la programmation asynchrone est au goût du jour, on se mange des callbacks un peu partout. Et ça alourdit toujours le code. Chaque langage, lib ou framework a essayé de trouver des astuces pour rendre tout ça plus digeste, et on a vu la naissance des Futures, Deferred, Promises, coroutines, yield from et autres joyeusetés.

Prenons par exemple un script Twisted. Déjà, Twisted, c’est pas vraiment l’exemple de la syntaxe Weight Watcher, ou alors si, mais avant le début du régime.

# -*- coding: utf-8 -*-
 
""" Télécharge des pages et affiche leur, de manière asynchrone """
 
import re
 
# Ceci doit être pip installé
import treq
from twisted.internet.task import react
from twisted.internet.defer import inlineCallbacks, returnValue
 
# Soit on utilise la syntaxe 'inlineCallbacks', c'est à dire avec des yields
# qui marquent les appels asynchrones.
@inlineCallbacks
def get_title(url):
    res = yield treq.get(url) # Ceci est asynchrone et non bloquant
    html = yield res.content() # Ça aussi
    try:
        val = re.search(r'', html.decode('utf8')).groups()[0]
    except:
        val = ''
 
    returnValue(val)
 
# Soit on récupère un objet defer et on ajoute un callback manuellement
def main(reactor):
 
    # Ceci est asynchrone et non bloquant
    defer = get_title('http://sametmax.com/quest-ce-quun-callback/')
 
    # Ceci arrive une fois que get_title est terminé
    def cb(title):
        print(title.upper() + '!')
 
    defer.addCallback(cb)
 
    # Pareil
    autre_defer = get_title('https://github.com/sametmax/django-quicky')
 
    def cb(title):
        print(title.upper() + '!!!')
 
    autre_defer.addCallback(cb)
 
    return defer
 
react(main)

D’une manière générale, je préfère la syntaxe à base de yields, même si elle oblige à se trimbaler le décorateur inlineCallbacks partout, à parsemer sa fonction de yields et à utiliser returnValue à la place de return puisque le mot clé est interdit dans les générateurs en Python 2.7.

Mais bon, ça reste facile à lire. On sait que les lignes avec yield, sont les appels bloquant qu’on demande à la boucle d’événements de traiter de manière asynchrone.

La syntaxe à base de callbacks est plus lourde, en revanche elle donne le contrôle sur la concurrence des callbacks puisqu’ils sont explicites au lieu d’être automatiquement ajoutés par magie. Elle parlera aussi plus aux dev Javascript qui ont l’habitude d’ajouter des callbacks manuellement.

Néanmoins, en JS, on a des fonctions anonymes plus flexibles, et on ferait donc plutôt une truc du genre :

get_title(url).then(function(title){
    # faire un truc avec le résultat
})

Et bien il se trouve qu’avec Python, bien qu’on ne le voit pas souvent, on peut avoir cette idée de la déclaration de son appel asynchrone juste au dessus de son callback, en utilisant des décorateurs.

En effet, les décorateurs ne sont que du sucre syntaxique :

@truc
def bidule():
    chose

N’est en fait qu’un raccourci pour écrire :

def bidule():
    chose
 
bidule = truc(bidule)

Du coup, on peut prendre n’importe quelle fonction, ou méthode, et l’utiliser comme décorateur :

@react
def main(reactor):
 
    then = get_title('http://sametmax.com/quest-ce-quun-callback/').addCallback
    @then
    def cb(title):
        print(title.upper() + '!')
 
    then = get_title('https://github.com/sametmax/django-quicky').addCallback
    @then
    def cb(title):
        print(title.upper() + '!!!')
 
    return cb

Et en jouant avec functools.partial, on peut faire aussi des trucs rigolos.

Non pas que cette syntaxe soit le truc indispensable à connaître et à utiliser. Mais les gens n’y pensent jamais. On utilise pas assez les décorateurs.

Par exemple, combien de fois vous avez vu :

def main():
    print('Doh')
 
if __name__ == '__main__':
    main()

Certaines libs, comme begin, font des décorateurs pour ça :

def main(func):
    if __name__ == '__main__':
        func()

Et du coup, dans son prog:

@main
def _():
    print('Doh')

Comme souvent, c’est le genre de feature qui peut être abusée, mais c’est parfois sympa de rapprocher une action juste au dessus de la fonction qui va être dans ce contexte.

J’espère ainsi vous avoir inspiré pour mettre un hack ou deux en production détournant complètement l’usage des décorateurs et ajoutant quelques gouttes de plus dans le vase de la sécurité de votre emploi, ou votre licenciement.