Python conserve les 100 dernières regex compilées, mais j'aurai tendance à penser qu'il vaut stocker les versions compilées pour des performances optimales. En Python, l'API sans compilation ou après compilation est identique (ou dumoins se devine facilement : on zappe le 1er argument) :
- m=re.match("regex", "texte")
- x=re.compile("regex"); m=x.match("texte")
Si Perl et ses contextes mystiques (opérations magiques selon le contexte) te plaisent, tu risques de pas aimer. Mais je pense que pas mal d'aspects de Python devrait t'intéresser. Python est fortement inspiré de Java, mais est beaucoup plus laxiste et concis (« moins verbeux »).
La méthode .sub() (« replace all ») accepter une chaîne ou une fonction pour le remplacement. Exemple : re.sub("([0-9a-f]+)", lambda regs: str(int(regs.group(1), 16)), texte, re.IGNORECASE) convertit les nombres hexadécimaux en décimal ("x=10" donne "x=16"). On peut extraire la lambda fonction (et la définir avant) pour une meilleure lisibilité.
Pour les traitements sur les ensembles (et non pas uniquement sur les tables de hash ou listes), Python implémente les itérateurs de manière très générique : « for x in data: ... » équivaut à :gen = iter(data)
while True:
x = gen.next()
...
Les types de base (dict, list, tuple) implémentent cette API. Mais de nombreux objets l'implémentent également : fichier (lecture ligne par ligne), résultat d'une base de donnée, document XML, etc.
À partir de ça, on peut créer des expressions de type : « results = [(x * 10) for x in data if (x % 3) == 2] ». C'est la forme abrégée deresults = filter(lambda x: (x % 3) == 2, donnees)
results = map(lambda x: x*10, donnees) ou encore results = []
for x in donnees:
if (x % 3) == 2:
results.append(x * 10)
Je trouve cette programmation, inspirée des langages fonctionnels, élégante. Bien qu'utilisé abusivement, elle peut rendre le code difficile à relire.
Je ne connais pas bien Perl, mais je pense que « @liste = %h{@t}; » s'écrit « liste = [h[cle] for cle in t] » en Python. C'est plus verbeux, mais se comprend plus facilement (pas besoin de connaître le sens des préfixes @ et $).
Au sujet des appels de fonction. En PHP, les objets passés en paramètres sont passés par copie. C'est assez pénible, il faut écrire explicitement &$object pour le passer par référence. Ceci peut être fait dans le prototype de la fonction... ou lorsqu'on l'appelle. S'en suit un gros merdier au niveau des effets de bord. En Python, tous les objets sont passés par références (et tout est objet), sauf que certains objets sont immutables (non modifiables) comme les tuples, les nombres entiers et les chaînes de caractères.
Pour l'assignation, pareil : c'est une copie de référence et non pas copie de l'objet : a=b fait que a et b pointent sur la même donnée. Par contre, lorsqu'on modifie a, b va être modifié ou non selon la même règle qu'avant :
- type mutable : a et b sont modifiés
- type immutable : a forke et crée un nouvel objet
En gros, Python est un pot pourri de divers langages (un peu de Perl par ci, un peu de Lisp par là, un peu de Java, etc.) mais qui en a extrait le meilleur pour donner un langage homogène et très souple.
Une raison particulière pour laquelle tu es passé par une variable temporaire ?
Oui, j'appelle ça la lisibilité :-) Je n'aime pas le code « malin » (que j'appellerai plutôt « concis » en réalité) qui au final n'est compréhensible que par son auteur. Mais oui, en Python on peut écrire des trucs sales !ident, value = re.match(r"(\w+)=(\d+)", line).groups()
(cette version stocke value sous forme d'une chaîne de caractères et non pas d'entier)
Note : il existe aussi les groupes nommés :>>> re.match(r"(?P\w+)=(?P\d+)", "cle=42").groupdict()
{'ident': 'cle', 'value': '42'}
J'avais testé Ubuntu Gutsy avec chiffrement de toutes les partitions y compris le swap. Et bien, le portable était beaucoup plus lent qu'avant (installation sans aucun chiffrement). Surtout qu'il n'a que 512 Mo de mémoire, alors ça swappe rapidement... C'était les options par défaut dans l'installeur, je me souviens plus des algos utilisés et si c'était le disque ou le système de fichier qui était chiffré.
à quoi est due la limitation sur le nombre de processeurs supportés ?
Je pense que quelqu'un qui choisit d'acheter Red Hat est intéressé avant tout par le support. Je comprend que jusqu'à 126 processeurs, Red Hat prend en charge tous les problèmes. Au delà, le support peut répondre « on sait pas faire » (mais ils vont sûrement tenter d'aider au mieux).
Côté noyau, la limitation est 4096 processeurs et 512 nœuds depuis Linux 2.6.27 (elle était de 255 processeurs et 32768 nœuds avant). Il y a de gros progrès dans le noyau quant aux performances avec beaucoup de cœurs/processeurs.
Évident, c'est pas gagné, surtout avec Perl qui contient énormément de règles implicites qu'il faut connaître pour comprendre le code (il me semble que Ruby et Ruby on rails fonctionnent pareil). L'avantage d'un code explicite est que n'importe qui (ayant une connaissance minimale du langage) peut comprendre facilement le code et donc : le corriger et l'améliorer. D'une manière générale, un code explicite est un gage de pérénité : si le développeur disparait, on peut le remplacer.
En Python : import re
m = re.match(r"(\w+)=(\d+)", line)
if m:
__ident = m.group(1)
__value = int(m.group(2))
où __ représente l'indentation, ex: 4 espaces (la base HTML code vire les espaces sur linuxfr).
Je trouve ça plus clair que Perl car où sait d'où viennent et sont les données. Il n'y pas de variable magique comme les $xxx. Perl a l'avantage d'intégrer les expressions régulières à son langage : en Python, il vaut mieux préfixer les chaînes par « r » (chaîne raw, n'interprète pas les antislashs).
Faudrait-il encore qu'il y en ait, des DRM... Les données passent en clair (non chiffrées) sur le réseau dans le protocole AMF (format de diffusion de contenu utilisé par Flash). Il me semble qu'on n'a pas le droit de coutourner des DRM efficaces, mais quid des fausses protections ?
Euh, il me semble que le journal n'était pas clair. Google est disponible en IPv6 depuis pas mal de temps sur (bon FAI, mauvais FAI, tunnel ou autre) : http://ipv6.google.com/
Là il est question d'activer la résolution DNS IPv6 (type AAAA) pour le domaine www.google.com.
Free offre un préfixe /64 mais dans les 64 bits de poids fort, il y également des bits pour distinguer l'utilisateur !
En janvier 2008, Free a obtenu le préfixe 2a01:5d8::/32. Le client obtenait le préfixe 2a01:5d8:5xxx:xxx::/64 où xxx:xxxx est son IPv4.
En mars 2008, Free a obtenu un préfixe plus gros : 2a01:e00::/26 (64 fois plus d'adresse). Le client obtient maintenant un préfixe 2a01:e35:xxxx:xx0/60 (ce qui permet d'avoir 16 réseaux /64 chez soit).
(lire http://www.freenews.fr/nat/5813-services-ipv6-chez-free-du-n(...) pour les détails)
Enfin, j'ai pas bien compris les détails (/64 ou /60 ?), mais tout ça pour dire que le préfixe est fixe pour chaque abonnement ADSL.
Windows XP génère une IPv6 au hasard, contrairement à Linux qui utilise l'adresse MAC pour remplir les 64 bits de poids faible. Je suppose que l'utilisation de l'adresse MAC pose problème, on pourra changer l'algorithme de génération d'adresse.
Peuh, il n'y a même pas de tortue qui danse si on est en IPv6. J'espère au moins qu'en IPv6 il y aura plus de résultats pour le porno ! Sur http://www.apnic.net/ un petit bonhomme agite une pancarte « via IPv6 » avec un grand sourire !
les réseaux IPv6 mal configurés ou mal déservis (comme le 6to4)
Qu'appelles-tu réseau mal configuré ? Pour détecter 6to4, il y a les préfixes 2001:0000::/32 (Teredo, 6to4) et 2002::/16 (6to4). Free utilise aussi un genre d'IPv6 par IPv4 mais bidouillé maisons (6rd) et utilise le préfixe 2a01:0e00::/104. Si le préfixe suffit pour détecter le tunneling IPv6 dans IPv4, quel est l'intérêt de cette liste blanche Google ?
Le projet Python songe à passer un gestionnaire de sources distribué. Bien sûr, Mercurial est envisagé et semble même en bonne position pour remplacer Subversion. « Bien sûr » car Mercurial est écrit en Python ;-) Bon, je pense que ça prendra encore mois/années et fils de discussions pour migrer complètement à Mercurial. Ça pourrait même ne jamais se faire. En attendant, il y a déjà des développeurs qui l'utilisent pour Python.
D'après ce que j'ai lu sur LWN le problème c'est que si on indique qu'une correction bouche un trou de sécu cela implique que les autres corrections ne concernent pas la sécurité.
Euh non, pas nécessairement. Marquer qu'un commit corrige une vulnérabilité n'indique rien quant aux autres commits. Ça demande aussi un peu de bon sens : la majorité des développeurs sont incapables de savoir si un bug quelconque peut avoir une implication sur la sécurité. Je préfère largement que les failles connues soient explicitement notées.
Si j'étais un sponsor, j'exigerai qu'il travaille main dans la main avec les développeurs noyau et qu'une partie soient accepté upstream avant un certain délai sinon je ne donne plus de sous. Hop, chantage, mais dans l'autre sens :-)
Si 80% des patchs de Grsecurity étaient intégrés upstream, je pense que la maintenance de Grsecurity serait déjà plus simple. On pourrait même penser qu'il y aurait plus d'utilisateurs. Si le code est dans le noyau, ça donne confiance, ex: quand à la pérénité.... Les 20% restant seraient maintenus en dehors et serviraient à renforcer encore la sécurité.
Le « problème » est qu'il faut être patient, faire de petits patchs, accepter les critiques, et suivre les règles :-) Ça me rappelle le dernier ordonnanceur de processus : y'avait deux projets en lice et celui qui a gagné n'était pas le meilleur, mais celui qui a accepté les critiques.
Le patch grsecurity modifie 539 files fichiers et fait environ 37.000 lignes. C'est un très gros patch monolithique qui doit être redécoupé pour être inclu dans le noyau. Est-ce que ce travail a déjà été fait ?
PaX seul modifie 455 fichiers et pèse environ 23.000 lignes.
> .. vendre à tarif variable .... pratique interdite à la SNCF
Hum, je paie rarement mes billets SNCF au même tarif. Genre 60€ l'aller et 40€ le retour. Ça dépend :
- du jour de l'année
- de l'heure du départ
- du nombre de places restantes
Mouais, enfin on peut pas changer un type aussi facilement : il y a des histoires de compatibilité binaire entre les APIs. De plus, le "format time_t 32 bits signé" est aussi utilisé dans des formats de fichier comme les archives gzip ou le système de fichier ext3. Il faut donc modifier les formats et convertir les fichiers. Heureuseument, ext4 arrive avec ses 64 bits pour les estampilles de temps (enfin !). Windows commence aussi à utiliser 64 bits un peu partout pour le temps.
[^] # Re: Orange et SFR?
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche L'IPv6 débarque chez FDN. Évalué à 2.
[^] # Re: toujours sur les regexps
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 2.
- m=re.match("regex", "texte")
- x=re.compile("regex"); m=x.match("texte")
[^] # Re: à propos des regexp...
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 2.
# Python c'est super !
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 6.
Pour les expressions régulières : tout est objet en Python, donc une expression régulière est un objet et un « match » est aussi un objet. Voir la doc :
http://docs.python.org/library/re.html#regular-expression-ob(...)
La méthode .sub() (« replace all ») accepter une chaîne ou une fonction pour le remplacement. Exemple : re.sub("([0-9a-f]+)", lambda regs: str(int(regs.group(1), 16)), texte, re.IGNORECASE) convertit les nombres hexadécimaux en décimal ("x=10" donne "x=16"). On peut extraire la lambda fonction (et la définir avant) pour une meilleure lisibilité.
Pour les traitements sur les ensembles (et non pas uniquement sur les tables de hash ou listes), Python implémente les itérateurs de manière très générique : « for x in data: ... » équivaut à :
gen = iter(data)
while True:
x = gen.next()
...
Les types de base (dict, list, tuple) implémentent cette API. Mais de nombreux objets l'implémentent également : fichier (lecture ligne par ligne), résultat d'une base de donnée, document XML, etc.
À partir de ça, on peut créer des expressions de type : « results = [(x * 10) for x in data if (x % 3) == 2] ». C'est la forme abrégée de
results = filter(lambda x: (x % 3) == 2, donnees)
ou encoreresults = map(lambda x: x*10, donnees)
results = []
for x in donnees:
if (x % 3) == 2:
results.append(x * 10)
Je trouve cette programmation, inspirée des langages fonctionnels, élégante. Bien qu'utilisé abusivement, elle peut rendre le code difficile à relire.
Je ne connais pas bien Perl, mais je pense que « @liste = %h{@t}; » s'écrit « liste = [h[cle] for cle in t] » en Python. C'est plus verbeux, mais se comprend plus facilement (pas besoin de connaître le sens des préfixes @ et $).
Au sujet des appels de fonction. En PHP, les objets passés en paramètres sont passés par copie. C'est assez pénible, il faut écrire explicitement &$object pour le passer par référence. Ceci peut être fait dans le prototype de la fonction... ou lorsqu'on l'appelle. S'en suit un gros merdier au niveau des effets de bord. En Python, tous les objets sont passés par références (et tout est objet), sauf que certains objets sont immutables (non modifiables) comme les tuples, les nombres entiers et les chaînes de caractères.
Pour l'assignation, pareil : c'est une copie de référence et non pas copie de l'objet : a=b fait que a et b pointent sur la même donnée. Par contre, lorsqu'on modifie a, b va être modifié ou non selon la même règle qu'avant :
- type mutable : a et b sont modifiés
- type immutable : a forke et crée un nouvel objet
En gros, Python est un pot pourri de divers langages (un peu de Perl par ci, un peu de Lisp par là, un peu de Java, etc.) mais qui en a extrait le meilleur pour donner un langage homogène et très souple.
[^] # Re: T'as tout compris
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 4.
Oui, j'appelle ça la lisibilité :-) Je n'aime pas le code « malin » (que j'appellerai plutôt « concis » en réalité) qui au final n'est compréhensible que par son auteur. Mais oui, en Python on peut écrire des trucs sales !
ident, value = re.match(r"(\w+)=(\d+)", line).groups()
(cette version stocke value sous forme d'une chaîne de caractères et non pas d'entier)
Note : il existe aussi les groupes nommés :
>>> re.match(r"(?P\w+)=(?P\d+)", "cle=42").groupdict()
{'ident': 'cle', 'value': '42'}
# Chiffrement intégral du disque dur
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche Red Hat Enterprise Linux 5.3. Évalué à 0.
[^] # Re: Nombre de processeurs supportés
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche Red Hat Enterprise Linux 5.3. Évalué à 4.
Je pense que quelqu'un qui choisit d'acheter Red Hat est intéressé avant tout par le support. Je comprend que jusqu'à 126 processeurs, Red Hat prend en charge tous les problèmes. Au delà, le support peut répondre « on sait pas faire » (mais ils vont sûrement tenter d'aider au mieux).
Côté noyau, la limitation est 4096 processeurs et 512 nœuds depuis Linux 2.6.27 (elle était de 255 processeurs et 32768 nœuds avant). Il y a de gros progrès dans le noyau quant aux performances avec beaucoup de cœurs/processeurs.
[^] # Re: Explicit is better than implicit.
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 9.
Évident, c'est pas gagné, surtout avec Perl qui contient énormément de règles implicites qu'il faut connaître pour comprendre le code (il me semble que Ruby et Ruby on rails fonctionnent pareil). L'avantage d'un code explicite est que n'importe qui (ayant une connaissance minimale du langage) peut comprendre facilement le code et donc : le corriger et l'améliorer. D'une manière générale, un code explicite est un gage de pérénité : si le développeur disparait, on peut le remplacer.
[^] # Re: T'as tout compris
Posté par Victor STINNER (site web personnel) . En réponse au journal Perl, Javouille, Lisaac|(Ruby|SmallTalk|etc..). Évalué à 7.
import re
m = re.match(r"(\w+)=(\d+)", line)
if m:
__ident = m.group(1)
__value = int(m.group(2))
où __ représente l'indentation, ex: 4 espaces (la base HTML code vire les espaces sur linuxfr).
Je trouve ça plus clair que Perl car où sait d'où viennent et sont les données. Il n'y pas de variable magique comme les $xxx. Perl a l'avantage d'intégrer les expressions régulières à son langage : en Python, il vaut mieux préfixer les chaînes par « r » (chaîne raw, n'interprète pas les antislashs).
# Interdiction de coutourner les DRM
Posté par Victor STINNER (site web personnel) . En réponse au journal Deezer et législation.. Évalué à 3.
[^] # Re: Mouais
Posté par Victor STINNER (site web personnel) . En réponse au journal Google enfin en IPv6 ... mais pas pour tout le monde. Évalué à 3.
http://ipv6.google.com/
Là il est question d'activer la résolution DNS IPv6 (type AAAA) pour le domaine www.google.com.
[^] # Vie privée
Posté par Victor STINNER (site web personnel) . En réponse au journal Google enfin en IPv6 ... mais pas pour tout le monde. Évalué à 4.
En janvier 2008, Free a obtenu le préfixe 2a01:5d8::/32. Le client obtenait le préfixe 2a01:5d8:5xxx:xxx::/64 où xxx:xxxx est son IPv4.
En mars 2008, Free a obtenu un préfixe plus gros : 2a01:e00::/26 (64 fois plus d'adresse). Le client obtient maintenant un préfixe 2a01:e35:xxxx:xx0/60 (ce qui permet d'avoir 16 réseaux /64 chez soit).
(lire http://www.freenews.fr/nat/5813-services-ipv6-chez-free-du-n(...) pour les détails)
Enfin, j'ai pas bien compris les détails (/64 ou /60 ?), mais tout ça pour dire que le préfixe est fixe pour chaque abonnement ADSL.
[^] # Re: très bonne nouvelle
Posté par Victor STINNER (site web personnel) . En réponse au journal Google enfin en IPv6 ... mais pas pour tout le monde. Évalué à 3.
[^] # Où est la tortue ?
Posté par Victor STINNER (site web personnel) . En réponse au journal Google enfin en IPv6 ... mais pas pour tout le monde. Évalué à 4.
les réseaux IPv6 mal configurés ou mal déservis (comme le 6to4)
Qu'appelles-tu réseau mal configuré ? Pour détecter 6to4, il y a les préfixes 2001:0000::/32 (Teredo, 6to4) et 2002::/16 (6to4). Free utilise aussi un genre d'IPv6 par IPv4 mais bidouillé maisons (6rd) et utilise le préfixe 2a01:0e00::/104. Si le préfixe suffit pour détecter le tunneling IPv6 dans IPv4, quel est l'intérêt de cette liste blanche Google ?
[^] # Re: Très bon logiciel
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche QCad : DAO pour tous. Évalué à 10.
[^] # Re: Pascal Nègre promu Chevalier de la Légion D'Honneur
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche Revue de presse de l'April pour la semaine 2. Évalué à 2.
http://www.rue89.com/hoax/2009/01/14/faut-il-demander-la-leg(...)
[^] # Re: sale temps
Posté par Victor STINNER (site web personnel) . En réponse au journal Darcs 2.2 release candidate. Évalué à 4.
[^] # Re: [:cetrio]
Posté par Victor STINNER (site web personnel) . En réponse au journal Cherche ISO de Windows 7. Évalué à 3.
[^] # Re: Difficulté d'être inclu dans le noyau
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche La fin de Grsecurity ?. Évalué à 2.
Euh non, pas nécessairement. Marquer qu'un commit corrige une vulnérabilité n'indique rien quant aux autres commits. Ça demande aussi un peu de bon sens : la majorité des développeurs sont incapables de savoir si un bug quelconque peut avoir une implication sur la sécurité. Je préfère largement que les failles connues soient explicitement notées.
[^] # Re: Chantage
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche La fin de Grsecurity ?. Évalué à 10.
[^] # Re: Difficulté d'être inclu dans le noyau
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche La fin de Grsecurity ?. Évalué à 10.
Le « problème » est qu'il faut être patient, faire de petits patchs, accepter les critiques, et suivre les règles :-) Ça me rappelle le dernier ordonnanceur de processus : y'avait deux projets en lice et celui qui a gagné n'était pas le meilleur, mais celui qui a accepté les critiques.
# Difficulté d'être inclu dans le noyau
Posté par Victor STINNER (site web personnel) . En réponse à la dépêche La fin de Grsecurity ?. Évalué à 10.
PaX seul modifie 455 fichiers et pèse environ 23.000 lignes.
[^] # Re: Si si
Posté par Victor STINNER (site web personnel) . En réponse au journal idtgv. Évalué à 5.
Hum, je paie rarement mes billets SNCF au même tarif. Genre 60€ l'aller et 40€ le retour. Ça dépend :
- du jour de l'année
- de l'heure du départ
- du nombre de places restantes
Et sûrement d'autres choses comme des papillons.
# La réponse est dans la question
Posté par Victor STINNER (site web personnel) . En réponse au journal photocopie de carte d'identité. Évalué à 10.
[^] # Re: Vive les timestamp
Posté par Victor STINNER (site web personnel) . En réponse au journal Le premier journal du vendredi de l'année (Le Zune plante). Évalué à 2.