Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#2426 Le 10/01/2016, à 10:05

grim7reaper

Re : /* Topic des codeurs [8] */

@Elzen : haha, c’est exactement ça smile

@Pylades : oui question de point vue. Tu veux éviter les nouveaux FS pour garder la « simplicité ». Le problème c’est que actuellement c’est déjà pas simple tongue (intéressant mais long, j’ai pas encore tout (y compris les liens externes) lu).

Hors ligne

#2427 Le 11/01/2016, à 02:13

Dafyd

Re : /* Topic des codeurs [8] */

Salut !

Dites, ça vous est déjà arrivé que Pylint se plaigne qu'une classe aie 9 attributs alors qu'elle n'en a que 7 ?
J'avoue que là je sèche ..

def __init__(self, test=False):

        """
        Simulation class' constructor.
        :param test: If true, change the gpios' path to allow a test on
        something else than a BeagleBone
        """

        self.led_r = bone.Led('gpio07', test)  # maybe wrong
        self.led_g = bone.Led('gpio50', test)
        self.led_b = bone.Led('gpio51', test)
        self.pot = bone.Ain('5', test)
        self.__heat = False
        self.__clim = False
        self.gaapi = google.GoogleAgendaApi('./client_id.json')

Pylint :

Messages
--------

+-----------------------------+------------+
|message id                   |occurrences |
+=============================+============+
|too-many-instance-attributes |1           |
+-----------------------------+------------+



Global evaluation
-----------------
Your code has been rated at 9.85/10 (previous run: 9.85/10, -0.00)

Je précise que ce fichier ne contient qu'une seule classe, et que je ne lui crée d'attributs que dans le constructeur..

EDIT :

************* Module simulation
R: 12, 0: Too many instance attributes (9/7) (too-many-instance-attributes)

EDIT 2:

Résolu...... J'avais mal compris le fonctionnement des propriétés en Python, j'assignais 2 nouveaux attributs sans le savoir ..

Dernière modification par Dafyd (Le 11/01/2016, à 02:27)

Hors ligne

#2428 Le 11/01/2016, à 15:06

Elzen

Re : /* Topic des codeurs [8] */

Je reviens sur quelques trucs d'avant le « join VS + » :

grim7reaper a écrit :

Cela dit, on dirait que Python veux encore ajouter une nouvelle syntaxe dans les versions à venir…
Heureusement que le Zen de Python dit "There should be one-- and preferably only one --obvious way to do it." >_<

J'trouve la version f"" assez intéressante, perso smile

Quant au fait d'avoir un seul moyen évident de le faire… boh, tant qu'on a toujours plusieurs moyens pas évidents, pourquoi pas whistling.gif

grim7reaper a écrit :
Dafyd a écrit :

J'y avais pensé pour la vérification de $HOME, mais je sais pas trop quoi faire si elle est pas définie, quelle est la meilleure pratique en la matière ?

Y’a pas vraiment de façon simple de gérer l’absence de HOME, et comme ça doit etre un cas très rare ça ne justifie pas la complexité supplémentaire je pense.
Perso’ je ferais un logger.critical, puis je quitte.

seth@fadreils: seth$ unset HOME
seth@fadreils: seth$ echo $HOME

seth@fadreils: seth$ python
Python 2.7.11 (default, Dec  9 2015, 00:29:25) 
[GCC 5.3.1 20151205] on linux2
Type "help", "copyright", "credits" or "license" for more information.

~~~> os.getenv("HOME")
~~~> os.path.expanduser("~")
'/home/seth'
~~~> 

Je ne sais pas comment il s'y prend, mais ça a l'air de marcher.

Edit : alors que :

seth@fadreils: seth$ export HOME=/tmp
seth@fadreils: seth$ echo $HOME
/tmp
seth@fadreils: seth$ python
Python 2.7.11 (default, Dec  9 2015, 00:29:25) 
[GCC 5.3.1 20151205] on linux2
Type "help", "copyright", "credits" or "license" for more information.

~~~> os.getenv("HOME")
'/tmp'
~~~> os.path.expanduser("~")
'/tmp'
~~~> 

Je suppose qu'il doit y avoir un truc du genre « si $HOME pas définie, aller parser /etc/passwd »


Bon, maintenant, retourner coder du LaTeX.

Dernière modification par Elzen (Le 11/01/2016, à 15:11)

Hors ligne

#2429 Le 11/01/2016, à 15:54

grim7reaper

Re : /* Topic des codeurs [8] */

Elzen a écrit :

J'trouve la version f"" assez intéressante, perso smile

Moi aussi, ça ressemble à ce qui se fait dans Ruby d’ailleurs.

Le truc c’est que certains utilisateurs de Python aime bien critiquer Perl ou Ruby parce que il y’a plus d‘une façon de faire (et ils citent le Zen de Python), donc je ne peux pas m’empêcher de pointer la contradiction ici big_smile

Elzen a écrit :

Je suppose qu'il doit y avoir un truc du genre « si $HOME pas définie, aller parser /etc/passwd »

Possible, mais c’est pas censé faire ça :

help(os.path.expanduser) a écrit :

Help on function expanduser in module posixpath:

expanduser(path)
    Expand ~ and ~user constructions.  If user or $HOME is unknown,
    do nothing
.

Mais un coup de strace semble confirmer ton hypothèse :

open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1323, ...}) = 0
read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 1323
close(3)                                = 0
Elzen a écrit :

Bon, maintenant, retourner coder du LaTeX.

Ha, moi aussi je fait un peu de LaTeX en ce moment (avec du R, donc je teste Sweave (pour ceux qui n’aiment pas R il me semble qu’il y a un équivalent Python mais je ne sais pas ce qu’il vaut)).

Hors ligne

#2430 Le 13/01/2016, à 15:04

grim7reaper

Re : /* Topic des codeurs [8] */

Tiens, un truc piégeux de Python…
Pour le coup Python 3 est un peu plus cohérent que Python 2 (encore une raison de passer à Python 3 big_smile), mais le truc reste foireux à la base je trouve (à priori avec hasattr tu veux tester l'existence (peu importe que ça soit buggé ou pas)).

Hors ligne

#2431 Le 13/01/2016, à 15:18

Elzen

Re : /* Topic des codeurs [8] */

Ça fait partie du genre de trucs que je préfère dans les langages type Java : l'objet manipulé correspond à une hiérarchie de classes, il possède donc les attributs définis dans cette hiérarchie de classe, ni plus, ni moins, et on n'a donc pas à tester l'existence ou non de tel ou tel truc : pour peu que ce soit un minimum bien codé, un instanceof/isinstance suffit à ce cas de figure.

Tiens, pour Touhy, j'avais codé un truc comme ça, faute de mieux, en trouvant que je faisais du code particulièrement moche :

def streamlike(obj, direction=None):
    """Vérifie si obj peut être utilisé comme un flux
direction : True pour sortant, False pour entrant, None pour les deux"""
    try: # Voyons les attributs requis…
        if direction in (None, False):
            obj.read,obj.readline,obj.readlines
        if direction in (None, True):
            obj.write,obj.writelines
        return True # C'est bon !
    except AttributeError:
        return False

Après, vis-à-vis du nom de la fonction hasattr, j'ai tendance à trouver le comportement de python2 plus logique celui de python3, perso…

Hors ligne

#2432 Le 13/01/2016, à 16:55

grim7reaper

Re : /* Topic des codeurs [8] */

Elzen a écrit :

Ça fait partie du genre de trucs que je préfère dans les langages statiquement typé

Fixed tongue

Elzen a écrit :

Après, vis-à-vis du nom de la fonction hasattr, j'ai tendance à trouver le comportement de python2 plus logique celui de python3, perso…

Pour moi les deux sont faux vis-à-vis du nom.
Sur l'exemple avec la @property, ça devrais renvoyer True mais Python 2 lève une exception et Python 3 renvoie False : pour moi les deux sont dans les choux…

Hors ligne

#2433 Le 13/01/2016, à 17:27

Elzen

Re : /* Topic des codeurs [8] */

Je ne trouvais plus le terme et j'avais la flemme de chercher, merci ^^
(Ceci dit, pour vraiment « fixer » ça, c'est « les langages statiquement typés » tongue)

grim7reaper a écrit :

mais Python 2 lève une exception et Python 3 renvoie False 

Eùhm, c'est le contraire tongue

C'est d'ailleurs à ce titre que je disais trouver le comportement de Python2 plus logique que celui de Python3 : si la propriété existe mais n'est pas utilisable (parce que chaque tentative de s'en servir provoquera une exception), il n'est pas aberrant de considérer que, du coup, on peut faire comme si elle n'existait pas (même si, dans ce cas, un nom du type « hasusableattr » aurait été plus adapté que juste « hasattr », certes).

Hors ligne

#2434 Le 13/01/2016, à 17:49

grim7reaper

Re : /* Topic des codeurs [8] */

Elzen a écrit :

(Ceci dit, pour vraiment « fixer » ça, c'est « les langages statiquement typés » tongue)

En effet ^^

Elzen a écrit :
grim7reaper a écrit :

mais Python 2 lève une exception et Python 3 renvoie False 

Eùhm, c'est le contraire tongue

Oups, j‘ai inversé effectivement…

Hors ligne

#2435 Le 22/01/2016, à 18:22

Shanx

Re : /* Topic des codeurs [8] */

Petite question pythonesque-mais-pas-que :
j'ai deux machines A et B qui doivent communiquer. Parce que je suis quelqu'un de bien, et parce que ma formation m'a rendu parano, je veux utiliser ssl, et les deux scripts seront très probablement écrits en Python.
Sachant que A doit envoyer des requêtes avec plusieurs arguments plus ou moins longs et contenant toute sorte de caractères (pour simplifier, disons 3 chaines de caractères différentes), que B doit les recevoir, les traiter (et ça peut être long, voir très long - on pourrait envisager plusieurs heures, même si ça ne sera pas le cas dans mon usage) puis renvoyer une réponse à A tout en continuant à accepter d'autres requêtes (de A ou de C) pendant ce temps, comment faire ? (je devrais faire des phrases encore plus longue big_smile )
J'ai pensé à un simple serveur HTTPS, avec des requêtes en POST et du multi-thread pour gérer les demandes successives, mais est-ce qu'il y a une autre possibilité plus simple/plus belle/plus efficace ?


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#2436 Le 23/01/2016, à 19:36

grim7reaper

Re : /* Topic des codeurs [8] */

Ça manque un peu de détails, mais oui ça peut-être une bonne piste.

De toutes façons, les approches les plus répandues pour gérer plusieurs connexions en même temps ce sont :
- multiprocess
- multithread
- I/O multiplexing

Donc partir sur du multithread c’est pas aberrant.

Par contre, je pense pas que tu puisses attendre la fin du traitement pour répondre par contre. Parce que si ça prends plusieurs heures (en théorie) y’a des chances que la connexion timeout.
Et quand bien même, c’est pas génial de garder une connexion ouverte si longtemps je pense (sinon il doit y avoir moyen de te DOS facilement). Il vaudrait mieux s’y prendre autrement.

Tu pourrais avoir un pool de thread A de taille N pour gérer les connexions (tu pourrais donc gérer jusqu'à N connexions en parallèle) et un pool B de worker thread.
Du coup tu aurais un truc du genre:
- une requête arrive
- un thread du pool A la prend en charge
- tu associes la requête à un ID (job ID) et tu pousses la tâche dans la queue des worker threads
- tu réponds le job ID au client

Après, soit le client fait du pull pour savoir quand son résultat est prêt, soit le serveur fait du push vers le client.
Bon c'est peut-être overkill dans ton cas, je ne sais pas…

Hors ligne

#2437 Le 23/01/2016, à 22:30

Shanx

Re : /* Topic des codeurs [8] */

Merci pour les détails.
Par contre, pourquoi faire deux pools de threads ? Les threads ne peuvent pas gérer les connexions, si on fait en sorte qu'un thread reçoit les données, ferme la connexion, fait le traitement, rouvre la connexion et renvoit le résultat ?


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#2438 Le 23/01/2016, à 23:04

grim7reaper

Re : /* Topic des codeurs [8] */

Bah le souci c'est que si tu mélanges les deux c'est plus dur à dimensionner (et puis c’est moins propre je trouve, tu mélanges deux trucs indépendants : la gestion des connexions et le traitement des données).

En séparant, tu peux avoir :
- un pool A avec N threads qui gèrent les connexions (N étant choisi selon l’afflux de connexion que tu penses devoir supporter en parallèle).
- une queue pour stocker les traitements en attente
- un pool B avec M worker threads (M étant égal à  "count(CPU logique)-1" par exemple (ça laisse un cœur pour gérer les connexions)).

Si tu n’a qu’un seul pool, comment tu dimensionnes ? N+M ?
Mais quand un thread va fermer la connexion et commencer à faire le traitement il ne sera plus disponible pour gérer de nouvelles connexions pendant toute la durée du traitement (qui peut prendre plusieurs heures…).
Après N+M requêtes tu ne pourras potentiellement plus gérer de nouvelle requêtes tant qu’un thread ne sera pas libre.
Alors oui, tu peux faire en sorte de toujours garder N threads libres dans ton pool mais c’est complexe et ça revient à essayer d’avoir deux pools en un (donc autant en utiliser deux).

Hors ligne

#2439 Le 25/01/2016, à 15:17

Elzen

Re : /* Topic des codeurs [8] */

J'adore les discussions comme celle-ci, où il y a plus de gens pour expliquer à la personne qui demande de l'aide que, selon eux, elle ne devrait pas faire ça, plutôt que de répondre à sa question.

Ce serait un truc potentiellement dangereux, ou quelque chose comme ça, encore, ça pourrait se comprendre ; mais quand ce sont juste leurs considérations ergonomiques alors qu'ils ne savent même pas à quoi c'est censé servir…


(À vue de nez, la demande décrite ressemble à ce qui se fait dans Stellarium, par exemple, donc pas un truc particulièrement atroce…)

Hors ligne

#2440 Le 26/01/2016, à 01:16

grim7reaper

Re : /* Topic des codeurs [8] */

En effet, pas mal d‘intervenants répondent à côté de la plaque : l’OP veut faire un jeu apparemment et ils lui répondent « ça va faire une mauvaise GUI » en parlant d’une GUI classique (ce qui n’est pas le cas d’un jeu…)

Hors ligne

#2441 Le 26/01/2016, à 01:31

Elzen

Re : /* Topic des codeurs [8] */

Y en a quand même un qui donne la solution au bout du compte, c'est déjà ça smile

En ce qui me concerne, je fais un truc du même genre pour un logiciel de démo, avec le graphe (réalisé grâce à ceci) comme affichage de fond, et quand on sélectionne un nœud, une fenêtre interne qui s'ouvre pour donner les infos dessus. À l'usage, c'est la disposition la plus pratique que j'ai trouvée.

Hors ligne

#2442 Le 26/01/2016, à 06:42

Oni_Shadow

Re : /* Topic des codeurs [8] */

y a-t-il des dev java/android dans le coin ?


Rouillé

Hors ligne

#2443 Le 26/01/2016, à 10:29

grim7reaper

Re : /* Topic des codeurs [8] */

Elzen a écrit :

(réalisé grâce à ceci)

Ha mais c’est fait par une université française smile (il proposait même des doctorats dessus en 2014).

Oni_Shadow a écrit :

y a-t-il des dev java/android dans le coin ?

Elzen fait du Java.
J’ai fait du Java (un peu sur Android aussi, mais j’en garde pas un souvenir impérissable).
Rolinh a aussi fait du Java sur Android (dont une application sous GPLv2).

Pourquoi ?

Hors ligne

#2444 Le 26/01/2016, à 20:31

Oni_Shadow

Re : /* Topic des codeurs [8] */

Je recherche un dev android avec un compte google. Je n'ai pas de soucis en particulier, juste une proposition que je préférerais poster en MP


Rouillé

Hors ligne

#2445 Le 07/02/2016, à 17:56

Shanx

Re : /* Topic des codeurs [8] */

Des gens ont déjà utilisé Kerberos ? Plus spécifiquement, Kerberos avec Python ?
Pour les cours on doit faire une sorte d'implémentation de Kerberos, mais y'a très très peu de doc sur le sujet. Du côté client ça va, on peut utiliser requests-kerberos qui semble faire le taf, mais du côté du service y'a pas grand chose. On pourrait utiliser GSS API, mais y'a aucune doc sur comment l'intégrer à SimpleHTTPServer (ou autre) pour recevoir les tickets Kerberos et les valider. Des suggestions ?
Y'a bien PyKerberos (une surcouche de GSS API), mais je n'arrive pas à trouver de doc sur son fonctionnement…


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#2446 Le 09/02/2016, à 20:16

Elzen

Re : /* Topic des codeurs [8] */

Désolé Shanx, 'connais pas.

Deux choses :

– J'ai été médisant sur Mednafen : en fait, il reçoit bien les événements X. C'est juste qu'il faut envoyer le KeyPress, flusher, puis attendre (apparemment un peu plus d'un centième de seconds) avant d'envoyer le KeyRelease. Donc mon script pour envoyer les mots de passe des vieux jeux (S)NES pourra fonctionner dès que j'aurai réussi à calibrer le truc correctement pour que la séquence d'appuis se fasse bien.

– Vous connaîtriez un truc du genre du Projet Euler, mais pour le SQL/PLSQL ? J'ai des étudiants qui ont déjà quasiment terminé le sujet de TP qu'on était censés débuter la semaine prochaine…
(J'ai bien une idée particulièrement fun de projet de SQL qui pourrait mobiliser à peu près tous les niveaux, mais ça risque de me prendre pas mal de temps à préparer, donc ce n'est pas pour tout de suite)

Hors ligne

#2447 Le 09/02/2016, à 20:23

Shanx

Re : /* Topic des codeurs [8] */

Elzen a écrit :

Désolé Shanx, 'connais pas.

Personne ne connait. tongue
Du coup j'ai changé de plan. Je vais mettre un Apache en reverse proxy devant mon app Python, et j'utiliserai le mod_auth d'Apache pour gérer Kerberos.
(Plutôt qu'un reverse proxy, j'aurais pu passer à wsgi, mais la première solution me permet de ne quasi pas toucher à l'app Python)


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#2448 Le 23/03/2016, à 17:53

Shanx

Re : /* Topic des codeurs [8] */

Yo

j'ai un problème à la con avec Python et SQLite3 :

cursor.execute("DELETE FROM comments WHERE id IN (?)",selected_comments)

selected_comments est déjà un tupple, donc en toute logique ça devrait fonctionner. J'ai essayé toute les variations de parenthésage, mais je n'arrive pas à voir pourquoi ça ne marche pas. Quelqu'un sait comment je peux faire ? (j'ai déjà demandé sur SO, mais je n'ai pas de réponse et ça me frustre).


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#2449 Le 23/03/2016, à 18:48

αjet

Re : /* Topic des codeurs [8] */

Shanx a écrit :

Yo

j'ai un problème à la con avec Python et SQLite3 :

cursor.execute("DELETE FROM comments WHERE id IN (?)",selected_comments)

selected_comments est déjà un tupple, donc en toute logique ça devrait fonctionner. J'ai essayé toute les variations de parenthésage, mais je n'arrive pas à voir pourquoi ça ne marche pas. Quelqu'un sait comment je peux faire ? (j'ai déjà demandé sur SO, mais je n'ai pas de réponse et ça me frustre).

Si tu veux passer une collection de valeurs, je pense que tu dois utiliser executemany.
Essaie donc

cursor.executemany("DELETE FROM comments WHERE id IN (?)",selected_comments)

αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#2450 Le 23/03/2016, à 18:54

Shanx

Re : /* Topic des codeurs [8] */

Ou alors, je viens de penser à tricher en ajoutant dynamiquement autant de "(?)" que je le souhaite. Je trouve ça un peu sale, mais bon.


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne