Syntaxes avancées (car ramassées) en Python

Il y a mille manières d’exprimer ce qu’on désire en langage naturel, et il en va de même avec un langage de programmation.
Certaines fomulations peuvent être clairement plus laconiques que d’autres, et d’aucuns considèrent que c’est démontrer sa maîtrise du langage que de les maîtriser. Toutefois, si jouer à ce petit jeu de la syntaxe ramassée permet d’économiser sur l’écriture, il ne permet certainement pas d’économiser sur la lecture, du moins tant que celui qui doit lire n’a pas appris à écrire pareillement.
Pour aider dans cet apprentissage, cet article évolutif se propose de recenser les syntaxes ramassées qu’un développeur peut rencontrer en lisant du code en Python (version 3.6.4), à condition qu’elles présentent une véritable utilité.
Pour l’heure, on trouvera des explications suivantes… :
L’article sera enrichi au fil des découvertes réalisées au fil de lectures. Ces mises à jour seront signalées.
Mise à jour du 08/03/2018 :
  • rappel de la typologie (et corrections !) ;
  • extraire une plage d’éléments d’une séquence (slicing).
Continuer la lecture de « Syntaxes avancées (car ramassées) en Python »
Syntaxes avancées (car ramassées) en Python

Paramètres et décorateurs de fonction en Python

Python permet d’écrire des fonctions comportant de nombreux paramètres qui peuvent avoir des mines des plus patibulaire, surtout si elles sont par ailleurs assorties de décorateurs. Par exemple :
def g (h):
	def k (prompt, *words, **complements):
		if complements['computer'] == 'Atari':
			complements['computer'] = 'Amiga'
		h (prompt, *words, **complements)
	return k
@g
def f (prompt, *words, **complements):
	for key, value in complements.items ():
		print (prompt + ':', ' '.join (words), value)
f ('HAL speaking', 'I', 'love', 'the', computer='Atari', drink='coffee')
HAL speaking: I love the Amiga
HAL speaking: I love the coffee
Il est important de ne pas se laisser abuser par cette apparente complexité. Maîtriser les différentes catégories de paramètres qu’il est possible d’utiliser est essentiel pour exploiter le potentiel de l’écriture de fonctions en Python au quotidien. Quant aux décorateurs, il est sans doute bien moins fréquent d’y avoir recours, mais comme ils peuvent se rencontrer, il est bon de savoir commment ils fonctionnent.
Continuer la lecture de « Paramètres et décorateurs de fonction en Python »
Paramètres et décorateurs de fonction en Python

Comment marche réellement la fonction super () de Python

La méthode super () de Python a inspiré un bon nombre d’explications. Toutefois, il apparaît qu’aussi sophistiquées qu’elles soient, elles sont toutes désespérement superficielles.
Je ne parle pas de celles qui le sont d’évidence, comme cette vidéo. L’auteur est bien gentil, mais sa présentation de super() se limite à assimiler la fonction à un moyen de déléguer un appel à la méthode __init__ () (par ailleurs, tout à fait improprement assimilée à un constructeur, comme si __new__ () n’existait pas…) surchargée dans une classe C à sa version dans une classe parent A. Autrement dit, à appeller A.__init__ () depuis C.__init__ (). Mais dans l’exemple, C hérite non seulement de A, mais aussi de B. Dès lors, les questions des commentateurs fusent : pourquoi B.__init__ () n’est-elle pas appelée ? Sincèrement, avant de publier une explication sur un sujet technique, son auteur devrait s’assurer qu’il maîtrise son sujet. Comme il le dit, « The super keyword is a little bit confusing in Python. It’s been confusing for decades now and it’s going to continue to be confusing as we move into the future. It’s just something that’s confusing ». Tu m’étonnes! surtout après avoir entendu sa prétendue explication…
Non. Je parle d’explications d’auteurs qui ont pignon sur rue, comme Python’s super() considered super! de Raymond Hettinger, à laquelle renvoie la documentation de super(), ou encore celle d’Alex Martelli, Anna Ravenscroft et Steve Holden dans leur Python in a Nutshell. Le moins qu’on puisse dire, c’est qu’on ne ressort pas illuminé de ces lectures. Sans doute, on comprend que super() permet de jouer avec le Method Resolution Order (MRO), mais quand a savoir exactement comment, c’est une autre affaire. Tout le monde se contente de terminer en recommandant d’utiliser systématiquement super() à tous les niveaux le hiérarchie des appels, et pour le reste renvoie sur l’algorithme C3, présenté comme abscons.
Bref, tout comme peu de personnes semblent avoir compris que JavaScript est un langage orienté objet à base de prototypes (et non de classes !), y’en a-t-il seulement qui ont compris comment la fonction super() de Python fonctionne vraiment ? Sérieusement, il y a de quoi nourrir de sérieuses inquiétudes quant au niveau d’exigence des développeurs désormais. Plus personne ne se donne la peine d’aller au fond des choses, ou quoi ?
On va donc arrêter de plaisanter, et expliquer sérieusement…
Continuer la lecture de « Comment marche réellement la fonction super () de Python »
Comment marche réellement la fonction super () de Python

Comment marche la configuration dans PhpStorm 2017

Pour le développeur, PhpStorm 2017 présente l’intérêt d’être éminemment configurable. Les possibilités offertes touchent à tous les aspects ou presque de cet IDE, tout particulièrement l’interface utilisateur (UI) qui peut être très finement ajustée.
Configuration de la présentation du code PHP dans PhpStorm 2017.3
Pour autant, la manière de s’y prendre a de quoi dérouter. A tout instant, il est possible de modifier un paramètre via pas moins de trois moyens :
  • dans l’écran d’accueil, le bouton Configuration, puis Settings ;
  • dans l’éditeur d’un projet, le menu File, puis Settings ;
  • dans l’éditeur d’un projet, le menu File, puis Default Settings.
Et encore faut-il compter avec le fait que dans certains cas, un paramètre peut être modifié en spécifiant que la modification touche un « profil » ou un « schéma ».
Le problème, c’est que PhpStorm n’offre pas de point d’entrée sur la configuration qui soit véritablement déterminé en fonction des besoins de l’utilisateur. Comment modifier un paramètre et répercuter cette modification sur un ensemble de projets ? Comment modifier un paramètre et que cela ne vaille que pour tous les projets à venir ? A l’utilisateur de deviner comment s’y prendre pour trouver les réponses à ces questions pourtant élémentaires.
Une exploration des possibilités offertes par PhpStorm 2017.3 permet toutefois de clarifier.
Click here to read this article in english.
Continuer la lecture de « Comment marche la configuration dans PhpStorm 2017 »
Comment marche la configuration dans PhpStorm 2017

Configurer xDebug pour déboguer dans PhpStorm 2017 / 2018

PhpStorm est un environnement de développement intégré (IDE) très populaire. Il le doit à ses fonctionnalités et à son ergonomie, ainsi qu’à son excellent rapport qualité / prix. En effet, il vous en coûtera moins de 90 € pour une licence perpétuelle avec mise à jour durant un an (vous pouvez aussi opter pour une formule de licence renouvelable automatiquement pour bénéficier de mises à jour au-delà de cette durée) et… beaucoup moins, voire rien du tout dans bien des cas : si vous êtes étudiant / enseignant, ou si vous travaillez sur un projet Open source.
Comme tout IDE, PhpStorm peut se révéler un peu déroutant pour le développeur qui le découvre, surtout si ce dernier n’a jamais beaucoup programmé de sa vie. En particulier, comment s’y prendre pour déboguer une application PHP, c’est-à-dire contrôler pas-à-pas l’exécution d’un script PHP initiée par une action de l’utilisateur sur l’interface utilisateur (UI) de l’application en question, c’est-à-dire une page Web ?
Pour y parvenir, il faut installer une extension de PHP, modifier le fichier de configuration de ce dernier, installer une extension dans Firefox. Et créer la configuration de débogage de PhpStorm, direz-vous ? C’est la bonne surprise : il n’y en pas ! Passage en revue de toutes les étapes à suivre pour y arriver.
Une session de débogage avec xDebug dans PhpStorm
Continuer la lecture de « Configurer xDebug pour déboguer dans PhpStorm 2017 / 2018 »
Configurer xDebug pour déboguer dans PhpStorm 2017 / 2018

Une installation minimale d’Apache 2.4, PHP 7 et MySQL 5.7 pour Windows x64

Pour ceux qui préfèrent la jouer « roots », comment installer manuellement l’ensemble composé d’Apache, php et MySQL (et phpMyAdmin tant qu’on y est) sans passer par une distribution quelconque ?
Le quarteron de généraux... gagnants !
Continuer la lecture de « Une installation minimale d’Apache 2.4, PHP 7 et MySQL 5.7 pour Windows x64 »
Une installation minimale d’Apache 2.4, PHP 7 et MySQL 5.7 pour Windows x64

Les vieilles cracktros ne meurent jamais : entretien avec le créateur de Flashtro

Chacun a sa madeleine de Proust, ce petit rien qui soudain le renvoie au monde chaque jour plus enchanté de sa jeunesse. Pour certains, c’est la « cracktro » vue dans les années 80 ou 90 sur sa machine 8 bits ou 16 bits, ordinateur ou console.
A défaut de disposer d’une machine, recourir à un émulateur n’est pas la seule solution pour revisiter ce patrimoine : des passionnées procèdent à son portage en Flash ou en HTML5. Rencontre avec Musashi, le créateur de Flashtro, site de référence dans le genre.
Le site Flashtro

Continuer la lecture de « Les vieilles cracktros ne meurent jamais : entretien avec le créateur de Flashtro »

Les vieilles cracktros ne meurent jamais : entretien avec le créateur de Flashtro

WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2)

La programmation du Copper sur Amiga est très particulière. Tout d’abord, ce coprocesseur graphique ne comprend que trois instructions, MOVE, WAIT et SKIP, auxquelles il est toutefois possible de rajouter JUMP, quoiqu’elle ne se code pas comme les autres. Ensuite, on n’écrit pas du code pour le Copper comme on écrit du code pour le 68000 : point de mnémoniques, il faut écrire directement en opcodes. Enfin, WAIT et SKIP présentent certaines limitations dont la prise en compte conduit à complexifier le code dès que ce dernier doit pouvoir fonctionner quelle que soit la ligne que le faisceau d’électrons – le raster – est en train de balayer à l’écran.
Paradoxalement, ces limitations n’entravent généralement pas la programmation d’effets visuels complexes comme le plasma ou l’affichage d’une image true color en plein écran – oui, l’Amiga 500 peut afficher en true color, et sans utiliser aucun bitplane par ailleurs -, c’est-à-dire sur toute la largeur des 320 pixels et toute la hauteur des 256 lignes de pixels d’une surface classiquement utilisée dans une démo en PAL. La surprise du codeur n’en est que plus grande quand il s’y heurte. Pour les dépasser, il faut exploiter l’information qui réside dans une section assez cryptique de l’Amiga Hardware Reference Manual. Explications.
Un effet plasma (un plasma RGB pour être plus exact)

Continuer la lecture de « WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2) »

WAIT, SKIP et COPJMPx : un usage avancé du Copper sur Amiga (1/2)

Copier des données dans le clipboard en JavaScript

Comment copier des données quelconques dans le clipboard en JavaScript dans le contexte d’une page Web ? Ce problème est assez simple à régler. Il suffit d’ajouter un gestionnaire de l’événement copy à l’objet document.
Le problème se complique s’il est exigé que ce gestionnaire d’événement soit anonyme et par ailleurs qu’il soit strictement éphémère, c’est-à-dire qu’il se retire de l’objet document une fois que l’événement copy est survenu, comme ce serait le cas si l’utilisateur cliquait sur un bouton « Copier » à usage ponctuel. En effet, en mode strict, il n’est plus possible d’utiliser arguments.callee pour faire référence à une fonction anonyme dans le corps de cette dernière. Par conséquent, impossible de faire référence à la fonction dans un appel à removeEventListener ().

Continuer la lecture de « Copier des données dans le clipboard en JavaScript »

Copier des données dans le clipboard en JavaScript

Des sources de cracktros et d’intros sur Amiga

14 juillet oblige, feu d’artifice de sources ! Pour clore un bon mois de retour dans le passé sur la programmation en assembleur 68000 du hardware de l’Amiga, voici une collection de sources de cracktros et d’intros sur cette machine.
Intros et cracktros sur Amiga
Elles ont été réalisées au début des années 1990 pour différents groupes de warez (Skid Row, Interpol, Paradox, Fairlight ou Passwords) ainsi que pour le groupe Comotion et pour une BBS allemande, Skara Brae.
Toutes ces cracktros et intros ont été codées en assembleur 68000 attaquant directement le hardware de l’Amiga, tout particulièrement deux coprocesseurs graphiques qui ont fait l’objet de présentations détaillées dans de précédents articles : le Blitter et le Copper.
A l’exception de l’intro pour Comotion qui reprend un module de Modesty, Code by Yragael, Music by Monty, comme expliqué dans les textes qui y apparaissent.
Mise à jour du 18/09/2017 : la carte de voeux 1993 est disponible sur Flashtro.
Mise à jour du 03/08/2017 : l’intro pour Skara Brae est disponible sur Flashtro.
Mise à jour du 19/07/2017 : l’intro pour Comotion est disponible sur Flashtro.
Continuer la lecture de « Des sources de cracktros et d’intros sur Amiga »
Des sources de cracktros et d’intros sur Amiga