Discussion:
RFC : Protocole JNTP 0.11
(trop ancien pour répondre)
Gérald Niel
2014-11-16 07:19:40 UTC
Permalink
(x-post fr.comp.lang.perl)
(pas de suivi, à discrétion du domaine de la réponse)
C'est justement la question que je me posais…
Déjà quid du text/xxx encodé en base64 ou QP, je le renvois
tel quel ?
Je le transforme en '8bit' ?
J'ai choisi le second choix pour l'instant.
Pour les binaires, là je sais pas…
En plus je sais pas si faut les garder dans le Body (partie
"MultiPart").
Mettre ça dans "Media"…
En parlant de ça, j'ai commencé à regarder comment écrire le
connecteur en Perl.
Je me concentre sur le format du paquet JSON pour l'instant.
Je travaille en local en passant l'article depuis l'entrée
standard.

J'ai commencé à écrire ça :
Fichier (n2j.pl):
<URL:http://jntp.gegeweb.org/jntp/***@jntp.gegeweb.org/Data/Media:1>

Comme je découvre Perl, il y a probablement des erreurs et des
moyens de faire beaucoup plus simple !

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance,
soit par mauvaise foi. -+- Hem Day -+-
Marc Espie
2014-11-16 08:40:14 UTC
Permalink
Post by Gérald Niel
(x-post fr.comp.lang.perl)
(pas de suivi, à discrétion du domaine de la réponse)
C'est justement la question que je me posais

Déjà quid du text/xxx encodé en base64 ou QP, je le renvois
tel quel ?
Je le transforme en '8bit' ?
J'ai choisi le second choix pour l'instant.
Pour les binaires, là je sais pas

En plus je sais pas si faut les garder dans le Body (partie
"MultiPart").
Mettre ça dans "Media"

En parlant de ça, j'ai commencé à regarder comment écrire le
connecteur en Perl.
Je me concentre sur le format du paquet JSON pour l'instant.
Je travaille en local en passant l'article depuis l'entrée
standard.
Comme je découvre Perl, il y a probablement des erreurs et des
moyens de faire beaucoup plus simple !
Pas mal. On pourrait faire bien pire pour un premier script.

Autoquote, c'est bien. T'as generalement pas besoin de mettre
de quotes autour des cles.

genre
$article{Data}{Headers}{Encoding} fonctionne tres bien.

pour article, je ferais toute l'init d'un coup, genre:

my %article = (
Route => [],
Data => {
Origin => "NNTP",
DataType => "NetNews",
Protocol => "JNTP-Transitional
...
});
Gérald Niel
2014-11-18 11:15:59 UTC
Permalink
Bonjour,
Post by Marc Espie
Pas mal. On pourrait faire bien pire pour un premier script.
Bonne nouvelle.

De bons tutos sur le web ?

Là faut que j'apprenne à passer des paramètres, obligatoires et optionnels.

Et que j'apprenne à optimiser pour en saisir le moins possible. Je suis
un peu feignasse ! ;-)

Par exemple pour :

if ($val eq "valeur1" || $val eq "valeur2")

J'ai essayé (mais ça fonctionne pas):

if ($val eq "valeur1" || "valeur2")

Peut être qu'on peut stocker les valeur à tester dans une liste ?

Après je me pose des question, le mieux est-il de stocker dans des
fichiers temporaires, travailler en mémoire ?
Là je suis dans ce qui me préoccupe, à savoir récupérer un message
'Usenet'. Je me demande même si j'ai besoin d'un pipe("/path/to/sm
$token") pour récupérer l'article alors que je suis en tradspool avec Inn…

Bref… plein de questions de débutant. Qui a commencé en BASIC sur
CPC464, puis GFA Basic sur Atari (GEM, et adaptation de qq programme du
CPC464), puis plus rien pendant une dizaine d'année avant de se remettre
au (X)HTML+CSS, puis un soupçon de JS, du PHP… encore une couper de
quelques années. Et là je replonge ! ;-)
--
Gérald Niel
Marc Espie
2014-11-18 12:38:37 UTC
Permalink
Post by Gérald Niel
Bonjour,
Post by Marc Espie
Pas mal. On pourrait faire bien pire pour un premier script.
Bonne nouvelle.
De bons tutos sur le web ?
Ben la plupart des pages de man ont des equivalents "tut" en page simplifiee,
pour apprendre des trucs.

Plus la faq qui est tres riche en exemple.

Apres, lire les auteurs, donc Larry Wall, Merlin, Chromatic...
http://modernperlbooks.com/mt/index.html
Post by Gérald Niel
Là faut que j'apprenne à passer des paramètres, obligatoires et optionnels.
Le plus simple pour le obligatoire/optionnel, c'est de passer une ref
de hash.

Regarde le fonctionnement de LWP, par exemple, c'est tres bien foutu de
ce point de vue.
Post by Gérald Niel
Et que j'apprenne à optimiser pour en saisir le moins possible. Je suis
un peu feignasse ! ;-)
if ($val eq "valeur1" || $val eq "valeur2")
if ($val eq "valeur1" || "valeur2")
Peut être qu'on peut stocker les valeur à tester dans une liste ?
Ouaip.

Tu pourrais faire du

if (grep { $val eq $_ } (qw(valeur1 valeur2)))

en tres tres idiomatique.
Post by Gérald Niel
Après je me pose des question, le mieux est-il de stocker dans des
fichiers temporaires, travailler en mémoire ?
Là je suis dans ce qui me préoccupe, à savoir récupérer un message
'Usenet'. Je me demande même si j'ai besoin d'un pipe("/path/to/sm
$token") pour récupérer l'article alors que je suis en tradspool avec Inn…
Essaie les deux et compare. Perl possede le meilleur profiler de la terre,
installe Devel::NYTProf et admire.
Gérald Niel
2014-11-19 07:46:10 UTC
Permalink
Le Mardi 18 novembre 2014 à 12:38 UTC, Marc Espie écrivait sur
Post by Marc Espie
Ben la plupart des pages de man ont des equivalents "tut" en page simplifiee,
pour apprendre des trucs.
Plus la faq qui est tres riche en exemple.
Oui, c'est déjà ce qui m'a permit de faire un script à priori, à peut
pr^t propre. ;-)
Post by Marc Espie
Apres, lire les auteurs, donc Larry Wall, Merlin, Chromatic...
http://modernperlbooks.com/mt/index.html
OK, merci.
Post by Marc Espie
Le plus simple pour le obligatoire/optionnel, c'est de passer une ref
de hash.
Je parlais des options à passer au script.
Bon, ça c'est encore un détail mineur.
Post by Marc Espie
Regarde le fonctionnement de LWP, par exemple, c'est tres bien foutu de
ce point de vue.
Tiens, en parlant de la LWP.
Le script va devoir se connecter à un serveur Web en HHTP pour envoyer
des requettes, recevoir des réponses, puis envoyer le paquet JSON.
En PHP on faisait ça en délélégant le boulot à curl.
On pourrait faire ça directement avec lo LWP ?
Post by Marc Espie
Post by Gérald Niel
if ($val eq "valeur1" || $val eq "valeur2")
if ($val eq "valeur1" || "valeur2")
Peut être qu'on peut stocker les valeur à tester dans une liste ?
Ouaip.
Tu pourrais faire du
if (grep { $val eq $_ } (qw(valeur1 valeur2)))
en tres tres idiomatique.
C'est nickel ! Pas encore tout compris sur ce que ça fait (du mal
encore à comprendre les variable de type $_) exactement mais c'est ça.
Etrangement c'est plus lisible (ou plus beau) qu'une série de ou dans
le test.
Post by Marc Espie
Essaie les deux et compare. Perl possede le meilleur profiler de la terre,
installe Devel::NYTProf et admire.
OK. Je vais tester ça.

Bon… maintenant, faut que je transforme ma fonction en classe
réutilisable.

Mais je vais d'abord terminer la partie récupération du message dans
Inn, la gestion des log et la communication avec le serveur Web.

Question sur la licence de distribution, on doit utiliser la licence
Perl si on utilise des librairies tierce ? Ou je peux garder la AGPL ?

J'ai mis le boulot sur github, si y'en a qui sont interessés pour
contribuer…:
<https://github.com/gegeweb/News2JSON>

Je commence à tomber amoureux de Perl. ;-)
En tout cas je préfère déjà à PHP.

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-
Marc Espie
2014-11-19 09:18:49 UTC
Permalink
Post by Gérald Niel
Question sur la licence de distribution, on doit utiliser la licence
Perl si on utilise des librairies tierce ? Ou je peux garder la AGPL ?
Le coeur de perl et ses modules est sous double licence: GPL + Artistic,
histoire que les gens puissent choisir.

En temps qu'OpenBSD-iste, je choisis evidemment directement la Artistic.
Globalement, ca veut dire que tu peux mettre ton boulot sous n'importe quoi
comme licence ou a peu pres, ca sera compatible avec perl...

il y a quelques annees, ils ont fait un audit de licence, et recontacte tous
les auteurs pour s'assurer que tout le coeur (donc les bibliotheques
embarquees avec) etait bien sous les deux licences.

En gros, ca ne posera probleme QUE si tu penses que ca peut etre inclus
un jour avec le reste.

Perso, j'aurais tendance a dire que si tu veux une distribution maximale,
tu prends exactement les memes modalites que le perl de base, c'est moins
casse-couille pour quiconque se pose ce genre de question (au moins c'est
simple)... pour avoir deja eu l'experience passee de trucs qui avaient
l'air libre mais l'etaient moins (la licence "quasi BSD mais pas" du
firewall de netbsd qu'on a abandonne et remplace), je me defie des trucs
un peu compliques cote licence.
Benoit Izac
2014-11-19 19:20:37 UTC
Permalink
Bonjour,

le 19/11/2014 à 08:46, Gérald Niel a écrit dans le message
Post by Gérald Niel
Je parlais des options à passer au script.
Les arguments sont stockés dans le tableau @ARGV ($ARGV[0] est le
premier argument). Si c'est des options plus évolués, voir les modules
Getopt::Long et Getopt::Std.
Post by Gérald Niel
Tiens, en parlant de la LWP.
Le script va devoir se connecter à un serveur Web en HHTP pour envoyer
des requettes, recevoir des réponses, puis envoyer le paquet JSON.
En PHP on faisait ça en délélégant le boulot à curl.
On pourrait faire ça directement avec lo LWP ?
Oui.
Post by Gérald Niel
Post by Marc Espie
if (grep { $val eq $_ } (qw(valeur1 valeur2)))
en tres tres idiomatique.
C'est nickel ! Pas encore tout compris sur ce que ça fait (du mal
encore à comprendre les variable de type $_) exactement mais c'est ça.
$_ est la variable par défaut. C'est celle qui est passée aux fonctions
si tu ne leur passes pas d'argument :
print; # équivaut à print $_;

Celle qui est utilisée pour rechercher une expression rationnelle si tu
ne précises pas :
$i++ if /abc/ # équivaut à $i++ if $_ =~ /abc/;

Celle qui va prendre la valeur d'un élément d'une liste :
for (@valeurs) {
# ici $_ vaut successivement chacune des valeurs du tableau
}

Tu noteras que n'est pas strictement équivalent à
if ($val eq 'valeur1' || $val eq 'valeur2')
car grep va parcourir toutes les valeurs de ta liste alors que « || » va
arrêter le traitement dès la première équivalence.

Sinon, tu as un gros paquet de documentation disponible en local via
perldoc (mais c'est en anglais). C'est aussi ça qui fait la force de
Perl (de mon point de vue).
--
Benoit Izac
Gérald Niel
2014-11-20 06:49:44 UTC
Permalink
Le Mercredi 19 novembre 2014 à 19:20 UTC, Benoit Izac écrivait sur
Post by Benoit Izac
premier argument). Si c'est des options plus évolués, voir les modules
Getopt::Long et Getopt::Std.
Oui, j'ai compris pour @ARGV et j'ai déjà regardé du coté de
Getopt::Long et Getopt::Std.

En fait, c'est dans le script lui même que je vais devoir définir (et
agir en fonction) ce qui devrait être obligatoire ou non.
Post by Benoit Izac
Post by Gérald Niel
Tiens, en parlant de la LWP.
Le script va devoir se connecter à un serveur Web en HHTP pour envoyer
des requettes, recevoir des réponses, puis envoyer le paquet JSON.
En PHP on faisait ça en délélégant le boulot à curl.
On pourrait faire ça directement avec lo LWP ?
Oui.
Bon… y'a plus qu'à lire la doc, comprendre, trouver des exemples, et
essayer…
Post by Benoit Izac
Post by Gérald Niel
Post by Marc Espie
if (grep { $val eq $_ } (qw(valeur1 valeur2)))
en tres tres idiomatique.
C'est nickel ! Pas encore tout compris sur ce que ça fait (du mal
encore à comprendre les variable de type $_) exactement mais c'est ça.
$_ est la variable par défaut. C'est celle qui est passée aux fonctions
print; # équivaut à print $_;
OK.
Post by Benoit Izac
Celle qui est utilisée pour rechercher une expression rationnelle si tu
$i++ if /abc/ # équivaut à $i++ if $_ =~ /abc/;
# ici $_ vaut successivement chacune des valeurs du tableau
}
Voilà, j'ai pigé. Merci.
Post by Benoit Izac
Tu noteras que n'est pas strictement équivalent à
if ($val eq 'valeur1' || $val eq 'valeur2')
car grep va parcourir toutes les valeurs de ta liste alors que « || » va
arrêter le traitement dès la première équivalence.
Merci de la précision.
Dans le contexte ça fait bien ce que je veux.

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-
Marc Espie
2014-11-20 10:01:43 UTC
Permalink
Post by Benoit Izac
Tu noteras que n'est pas strictement équivalent à
if ($val eq 'valeur1' || $val eq 'valeur2')
car grep va parcourir toutes les valeurs de ta liste alors que « || » va
arrêter le traitement dès la première équivalence.
Faudrait verifier, mais perl est tres capable d'optimiser ce genre de trucs.
Genre: contexte booleen, donc retourner 0 ou 1 suffit, et une expression
tel que $_ eq 'valeur' n'a pas d'effet de bord.
Damien Wyart
2014-11-20 11:54:06 UTC
Permalink
Post by Marc Espie
Post by Benoit Izac
Tu noteras que n'est pas strictement équivalent à
if ($val eq 'valeur1' || $val eq 'valeur2')
car grep va parcourir toutes les valeurs de ta liste alors que « || » va
arrêter le traitement dès la première équivalence.
Faudrait verifier, mais perl est tres capable d'optimiser ce genre de
trucs. Genre: contexte booleen, donc retourner 0 ou 1 suffit, et une
expression tel que $_ eq 'valeur' n'a pas d'effet de bord.
Non, grep ne fait jamais de court-circuitage.

Il y a eu pas mal de polémiques sur le sujet, certains conseillant
List::MoreUtils::any à la place, d'autres répondant que les benchs
montrent que c'est plus lent que grep, d'autres répondant encore que sur
des listes *très* volumineuses, ça n'est plus vrai... Puis a été testé
le smartmatch, le plus rapide derrière le hash (quand il n'est pas créé
à la volée), mais qui est maintenant considéré comme expériemental... Et
le foreach peut également être utilisé et fait du court-circuitage...

Si vraiment on est sur l'optique des performances, c'est la solution
hash qui sera la plus rapide. Pour des listes de petite taille, je pense
que la différence entre toutes les solutions sera négligeable.

Un peu de lecture sur tout ça pour ceux que ça intéresse/amuse :

http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/BuiltinFunctions/ProhibitBooleanGrep.pm
http://use.perl.org/use.perl.org/_bart/journal/38474.html
http://srezic.cvs.sourceforge.net/viewvc/srezic/perl-bench/grep-vs-first.pl?revision=1.4&view=markup
https://github.com/azumakuniyuki/perl-benchmark-collection/blob/master/operator/smartmatch-operator-vs-grep.pl
http://perltraining.com.au/tips/2007-06-18.html
http://stackoverflow.com/questions/20205813/perl-smartmatch-operator-or-grep-to-check-if-value-exists-in-array
http://stackoverflow.com/questions/3951812/how-fast-is-perls-smart-match-operator-for-searching-scalar-in-an-array
--
DW
Marc Espie
2014-11-20 14:51:38 UTC
Permalink
Post by Damien Wyart
des listes *très* volumineuses, ça n'est plus vrai... Puis a été testé
le smartmatch, le plus rapide derrière le hash (quand il n'est pas créé
à la volée), mais qui est maintenant considéré comme expériemental... Et
le foreach peut également être utilisé et fait du court-circuitage...
Rant: je deteste cette notion de trucs "experimentaux" en perl. J'aimerais
bien qu'ils se decident plus vite, et au moins qu'il fixent la semantique
des choses une fois pour toutes.

Il y a plein de choses hyper-sympa qui sont de fait inutilisables parce que
si ca se trouve, dans 3 ans, ca sera different.

(me suis fait mordre par "my $_" qui avait l'air tout gentil, mais qu'ils ont
taggue experimental apres coup... et ca a ete penible)
Nicolas George
2014-11-20 18:20:08 UTC
Permalink
Post by Marc Espie
Rant: je deteste cette notion de trucs "experimentaux" en perl. J'aimerais
bien qu'ils se decident plus vite, et au moins qu'il fixent la semantique
des choses une fois pour toutes.
Il y a plein de choses hyper-sympa qui sont de fait inutilisables parce que
si ca se trouve, dans 3 ans, ca sera different.
Ça ne t'est jamais arrivé, en programmant, d'avoir une bonne idée qui
s'avère, à l'usage sur le long terme, pas si bonne que ça au contraire ?
Marc Espie
2014-11-20 19:01:11 UTC
Permalink
Post by Nicolas George
Post by Marc Espie
Rant: je deteste cette notion de trucs "experimentaux" en perl. J'aimerais
bien qu'ils se decident plus vite, et au moins qu'il fixent la semantique
des choses une fois pour toutes.
Il y a plein de choses hyper-sympa qui sont de fait inutilisables parce que
si ca se trouve, dans 3 ans, ca sera different.
Ça ne t'est jamais arrivé, en programmant, d'avoir une bonne idée qui
s'avère, à l'usage sur le long terme, pas si bonne que ça au contraire ?
Ouais, je trouve que ca leur arrive quand meme vachement souvent... :(
Nicolas George
2014-11-20 19:59:27 UTC
Permalink
Post by Marc Espie
Ouais, je trouve que ca leur arrive quand meme vachement souvent... :(
Je préfère ça à un langage figé qui n'essaie jamais rien ou à un langage qui
garde ad vidam æternam toutes les mauvaises idées.

Paul Gaborit
2014-11-20 12:36:22 UTC
Permalink
À (at) Thu, 20 Nov 2014 10:01:43 +0000 (UTC),
Post by Marc Espie
Post by Benoit Izac
Tu noteras que n'est pas strictement équivalent à
if ($val eq 'valeur1' || $val eq 'valeur2')
car grep va parcourir toutes les valeurs de ta liste alors que « || » va
arrêter le traitement dès la première équivalence.
Faudrait verifier, mais perl est tres capable d'optimiser ce genre de trucs.
Genre: contexte booleen, donc retourner 0 ou 1 suffit, et une expression
tel que $_ eq 'valeur' n'a pas d'effet de bord.
L'expression $_ eq 'valeur' peut avoir des effets de bord. Cela dépend
de ce qui est stocké dans $_. Si c'est un objet pour lequel l'opérateur
'eq' a été redéfini, tout est possible. L'expression 'valeur' eq $_ a
déjà beaucoup moins de chances d'avoir des effets de bord... Mais ce
n'est pas garanti non plus puisqu'un module peut modifier complétement
la grammaire de Perl.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Julien Arlandis
2014-11-16 10:25:30 UTC
Permalink
Post by Gérald Niel
(x-post fr.comp.lang.perl)
(pas de suivi, à discrétion du domaine de la réponse)
C'est justement la question que je me posais…
Déjà quid du text/xxx encodé en base64 ou QP, je le renvois
tel quel ?
Je le transforme en '8bit' ?
J'ai choisi le second choix pour l'instant.
Pour les binaires, là je sais pas…
En plus je sais pas si faut les garder dans le Body (partie
"MultiPart").
Mettre ça dans "Media"…
En parlant de ça, j'ai commencé à regarder comment écrire le
connecteur en Perl.
Je me concentre sur le format du paquet JSON pour l'instant.
Je travaille en local en passant l'article depuis l'entrée
standard.
[file
Comme je découvre Perl, il y a probablement des erreurs et des
moyens de faire beaucoup plus simple !
Je ne connais pas bien le Perl mais à mon avis concentre toi sur le
DataType = ProtoArticle, la seule chose que tu as à faire c'est d'envoyer
la totalité de l'article dans le Body (entêtes comprises). Ensuite à la
charge du serveur JNTP d'assurer la conversion
JNTP::ProtoArticle -> JNTP::Article.
Les multipart seront insérés dans Data/Media.
Et dans un second temps on verra si on peut écrire un parseur html ->
NemoCode pour assurer la conversion, pour les hiérarchies qui acceptent
le HTML il faudra aussi écrire le parseur NemoCode -> html mais celui ci
sera facile à écrire vu qu'il a déjà été écrit en javascript pour
Nemo.
Post by Gérald Niel
@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance,
soit par mauvaise foi. -+- Hem Day -+-
Gérald Niel
2014-11-16 11:02:49 UTC
Permalink
(retour sur fr.comp.reseaux.jntp)

Le Dimanche 16 novembre 2014 à 10:25 UTC, Julien Arlandis écrivait sur
Post by Julien Arlandis
Je ne connais pas bien le Perl mais à mon avis concentre toi sur le
DataType = ProtoArticle,
C'est documenté où ?

Ceci dit c'est moins rigolo/stimulant à faire que d'essayer d'adapter
le script PHP actuel.
Post by Julien Arlandis
la seule chose que tu as à faire c'est d'envoyer
la totalité de l'article dans le Body (entêtes comprises).
Il me semblait qu'il fallait au moins que l'objet JSON soit en UTF-8.
Donc pas si simple. Puisqu'il faut connaitre l'encodage d'origine pour
que la conversion fonctionne.

@+
--
On ne le dira jamais assez, l'anarchisme, c'est l'ordre sans le
gouvernement ; c'est la paix sans la violence. C'est le contraire
précisément de tout ce qu'on lui reproche, soit par ignorance, soit
par mauvaise foi. -+- Hem Day -+-
Loading...