IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web Perl Discussion :

quand perl s'arrete de manière inexpliquée


Sujet :

Web Perl

  1. #1
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut quand perl s'arrete de manière inexpliquée
    voilà, j'ai un problème qui commence à me ...
    j'upload de très gros fichiers que je parse ensuite pour n'en récupérer que les informations nécessaires ... toutes ces informations sont stockées dans un hash avant d'être écrites dans des fichiers .txt.
    tout cela se fait en cgi ...
    mais voilà, perl s'arrete tout seul systematiquement vers le 13eme fichier? si je fais au 12eme, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bob    2111  98.1  3.5    74904  54604  ??  R     7:12PM   8:10.57 /usr/bin/perl -w^M /Applications/MAMP/cgi-bin/analysis.pl
    bob    2695   0.0  0.0    27804      4  p1  R+    7:21PM   0:00.00 grep perl
    pour le 13eme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bob    3075   0.0  0.0    27804    124  p1  R+    7:27PM   0:00.00 grep perl
    je suis là dessus depuis le début d'apres midi :tester les fichiers=>ok, le script fonctionne sans souci sur mon petit portable de maison avec 1Go de RAM??
    Quelqu'un aurai-il une idée???? ça me dépasse

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    cgi ? serveur web ? message d'erreur dans l'error_log ?
    à la rigueur temps écoulé lorsque tu arrives au 13ème fichier ? (time out ?)
    Et à tout hasard ton script ressemble à quoi ?

    @+
    Mr6

  3. #3
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    Citation Envoyé par Mr6
    cgi ? serveur web ? message d'erreur dans l'error_log ?
    à la rigueur temps écoulé lorsque tu arrives au 13ème fichier ? (time out ?)
    Et à tout hasard ton script ressemble à quoi ?

    @+
    Mr6
    J'ai pas de messages d'erreurs dans mes fichiers log. Je me demandais si c'etait pas un probleme de timeout, mais comment savoir? ou configurer cela? Et si c'est ça, pourquoi ça ne le fait pas sur mon portable (sous XP, easyphp) qui est moins puissant et contient moins de memoire RAM que mon PC de boulot (Je suis sous MAC et utilise MAMP qui equivaut à easyphp avec 2Go de RAM)??

    Mon script est long et y a pas de message d'erreur. Il traite les fichiers qu'il a uploadé et en recrée d'autres. ces fichiers font en moyenne 30Mo.
    Car c'est bien quelqu'un qui stoppe mon script, et comme c'est pas moi, ça ne peut etre que apache, non??



    Merci

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    honnêtement j'ai du mal à croire que tu n'aies rien dans ton error_log... ca va compliquer la tâche si tu n'as pas de log, pas de message d'erreur, et juste un symptome... Je te conseillerais de mettre qq procédures de test dans ton script, à l'ouverture/fermeture du fichier ou d'autres endroits stratégiques de ta boucle...

  5. #5
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    c'est déjà fait. J'ai des die pour l'ouverture de mes fichiers. Si c'etait ce genre de probleme, j'aurais du les avoir dans mes log.
    Merci de te pencher sur mon probleme

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    est-ce que tu pourrais nous montrer ne serait-ce que les 5 dernières lignes de ton log ainsi que le code de ta boucle stp ?

  7. #7
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    alors, voilà, ça devient encore plus métaphysique ...
    je fais tourner le script ... il fait 2 étapes différentes:
    - l'upload des fichiers
    - le traitement des fichiers uploadés

    voilà ce que je récupère du log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     [Fri Jun 09 11:00:45 2006] [notice] Apache/2.0.54 (Unix) PHP/5.0.4 DAV/2 configured -- resuming normal operations
     
    [Fri Jun 09 11:09:00 2006] [error] [client ::1] Premature end of script headers: analysis.pl, referer: http://localhost:8888/cgi-bin/target.pl
    le script ce serait arrêté à 11:09

    seulement voilà, le script tournait encore à 11:13 et le fichier qui a été créé à ce moment là est correct

    petite remarque, les fenêtres web sont des popups et le script traitement.php se rafraichit toutes les 5 sec, il m'est donc impossible d'avoir un timeout .. enfin, je le crois ...

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Quel est le nom du fichier de log d'où tu sors cette ligne ? est-ce que tu travailles avec des virtualhosts ?

  9. #9
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    nom de mon fichier_log:apache_error_log

    les virtual hosts?? euhhhhh, à vrai dire, je ne sais meme pas ce que c'est ..

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    hé bien c'est pour héberger plusieurs sites web sur un seul serveur, et tu leur donnes des noms différents, des hôtes virtuels quoi ! pour vérifier ca, tu regardes dans ton httpd.conf, tout à la fin. De manière plus générale, cherches-y tout ce qui pourrait s'appeler à error_log car je ne suis pas sûr que tu pioches dans le bon fichier de log....

  11. #11
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    voilà ce que je récupère dans mon fichier httpd.conf à propos des erreurs log ... j'ai bien peur de piocher dans le bon fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ErrorLog /Applications/MAMP/logs/apache_error_log

  12. #12
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    arf ! en effet... là comme ca je sèche un peu... tu veux vraiment pas me montrer un bout de code des fois que ca me donnerait de l'inspiration ? en y réfléchissant je me demande si ca ne serait pas en rapport avec ton upload... dis m'en plus

  13. #13
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    j'ai tournée ça dans ts les sens, rien à faire ...

    Voilà le code de mon script target.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/perl -w
     
    # utilisation du module CGI pour recuperer les informations entrees par l'utilisateur
    use CGI;
    use strict;
    use Carp;
    # utilisation du module module.pm pour transformer les fichiers pour l'analyse en R
    use lib '.';
    use module;
     
    #

  14. #14
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    quoi que je fasse, ça bloque toujours au 13ème fichier .. aurais-je dépasser la mémoire de perl?? c'est systématique à la position d'un fichier et non à un fichier particulier ... chaque fichier traité fait environ 25Mo, 45000 lignes et 80 colonnes ..

  15. #15
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Bon, là comme ca je vois que tes open ne sont pas testés (pas bieeeeenn ) et pour la regex qui te permet de récupérer le nom du fichier, tu sembles sûr du fait qu'il n'y a qu'un seul niveau d'arborescence... (un petit $ après tes parenthèses t'assurerait que tu récupères bien la fin donc le fichier ).
    pour le reste faut que je regarde de plus près.
    tu pourrais donner la liste des fichiers stp ? (path+nom)

  16. #16
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    exemple de fichiers à tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /Users/bob/Documents/PRE-PROCESSING/data/I5329.txt
    /Users/bob/Documents/PRE-PROCESSING/data/T4832.txt
    /Users/bob/Documents/PRE-PROCESSING/data/T4820.txt
    /Users/bob/Documents/PRE-PROCESSING/data/C4823.txt
    /Users/bob/Documents/PRE-PROCESSING/data/B4925.txt
    /Users/bob/Documents/PRE-PROCESSING/data/C4922.txt
    .../...
    j'en teste une vingtaine à chaque fois ... et arrêt au 13/14
    ce sont des fichiers txt tabulés


    Merci pour ton aide mr6!!

  17. #17
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    J'ai du mal à comprendre ce que tu fais exactement en fait...
    lorsqu'on appelle ton script, on lui file un fichier en paramètre, il l'uploade, et après il crée un fichier analyse_... qui contient uniquement un ID ? c ca ?
    en fait en relisant, je vois que ton script envoie les fichiers à uploader vers analysis.pl, et c'est lui qui fait l'upload de ta 20aine de fichiers, non ? donc c'est peut-être plutôt lui qu'il faut regarder

  18. #18
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    je vais essayer de résumer simplement :

    target.pl
    il me récupère des paramètres que l'utilisateur m'a fourni précédemment
    il crée les répertoies temporaires
    il uploade un fichier de référence (gal). si celui-ci est correct, il print un formulaire dans lequel on ecrit remplit d'autres champs et upload les fichiers txt qui à priori posent problème.
    le tout est envoyé à analysis.pl

    analysis.pl
    il me récupère les informations fournies pour chacun des champs, fait différents tests pour savoir si tout s'et bien passé...
    le but principal est de construire un fichier hybride entre le gal et un txt (ex:1 gal, 20 txt => 20 txt hybrides ..)

    en voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
     
    #!/usr/bin/perl -w
    #====================================================
    #&change_popup($message) permet de modifier le fichier traitement.php (deuxieme popup ouvert)
    #$message => texte qui sera rajoute à la fin de traitement.php (ce dernier ce rafraichit toutes les 15 sec, donc notre texte sera affiché)
    #&initialise() => permet de rendre traitement.php vierge, en faite il le recrée de novo (voir le code dans module.pm)
    #
    #
    # utilisation du module CGI pour recuperer les informations entrees par l'utilisateur
    use CGI;
    use strict;
    use Carp;
     
    # utilisation du module module.pm pour transformer les fichiers pour l'analyse en R
    use lib '.';
    use module;
     
    $| =1;
    #Quand cette variable est fixée sur une valeur différente de 0, 
    #Les sorties avec print ne sont pas mises en mémoire tampon, 
    #mais ont lieu à l'instant où l'instruction print est interprétée. 
    #Normalement, les sorties en Perl 
    #transitent en mémoire tampon pour être ensuite sorties sous forme de blocs.
     
    my ($ID,$rep,$fic,$rep_temp,$mon_dir,$dir_upload,
    $dir,$dir_R,$dir_rep,$nb_lame,$fichier_gal,$message_popup,$unedate)=();
     
    my @tab_fic=();
     
    	#chemin css, refresh, images, javascript, index
    	my $chemin_css = "http://localhost:8888/PF_Transcriptome/text/style.css";
    	my $chemin_javascript = "http://localhost:8888/PF_Transcriptome/text/script.js";
    	my $chemin_refresh = "http://localhost:8888/PF_Transcriptome/preprocess_fr.php";
    	my $chemin_image = "http://localhost:8888/PF_Transcriptome/images";
    	my $chemin_index = "http://localhost:8888/PF_Transcriptome/index.php";
     
    	# creation du fichier target.txt
    	my $target = "target.txt";
     
    ############################################################################################
    # le but de  ce script est de créer un fichier targets.txt pour la suite des analyses en R #
    ############################################################################################
     
    # creation de l'objet CGI
    my $query = new CGI;
     
    # On teste la requete envoyé à analysis.pl. On verifie avec quelle methode les infos ont été envoyées à analysis.pl
    my $methode = $query ->request_method();
    #==========================================================
    # Cas où les infos ont été envoyées avec la methode POST, c'est à dire données en provenance de target.pl 
    #==========================================================
    if ( $methode =~ /post/i){
    	# Recuperation des informations cachées passées dans target.pl 
    	 $ID = $query->param("id");			# numero ID de l'analyse
    #On recupere la date actuelle (date, heure, min, etc). On pourra ainsi connaitre le debut de l'execution du script
    $unedate = &ladate();
    $message_popup= "Debut du traitement $unedate<br><br>\n";
    &change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
     
    	 $nb_lame = $query->param("nombre");		# nb de lames (=nb de lignes du tableau)
    	 $fichier_gal = $query->param("fichier_gal");
    	$fichier_gal =~ s/.*[\/\\](.*)/$1/;			# expression reguliere pour recuperer uniquememnt le nom du fichier
     
    	# recuperation du contenu du tableau
    	my $i=1;		# variable d'incrementation (au moins 1 experience)
     
    	my %donnees = ();					# declaration du hash qui contient les données entrees par l'utilisateur
    	my ($exp, $cy3, $cy5, $date, $manip, $file) = ();	# declaration des variables paramétrées
    	my @tab_donnees=();					# tableau qui contient la valeur de chaque clé du hash %donnees
     
    	 @tab_fic=();	# tableau qui récupère les noms des fichiers upoladés
     
    	# incrementation -> recuperation des données entrees en argument
    	for ($i = 1; $i<$nb_lame+1; $i++) {
     
    		$exp = $query->param("exp_$i");			# exp
    		$cy5 = $query->param("Cy5_$i");			# cy5
    		$cy3 = $query->param("Cy3_$i");			# cy3
    		$date = $query->param("date_$i");		# date
    		$manip = $query->param("manip_$i");		# manipulateur
    		$file = $query->param("upload_$i");		# nom des fichiers a uploader
    		$file =~ s/.*[\/\\](.*)/$1/;			# recuperation du nom simple, sans le chemin absolu
     
    		# [$exp,$cy5,$cy3,$date,$manip,$file] est la reference anonyme au tableau ($exp,$cy5,$cy3,$date,$manip,$file)
    		# donc chaque cle $i du hash %données à pour valeur une reference de tableau qui contient nos données
    		$donnees{$i} = [$exp,$cy5,$cy3,$date,$manip,$file];	
     
    	# fin de la boucle for pour recuperer les données
    	}
     
    	# repetoires d'analyse
    	 $rep = "temp_".$ID;					# rep temp_ID_xxxx
    	 $fic = "analyse_".$ID.".txt";			# fichier recapitulatif des analyses dans $rep
    	 $rep_temp = "../htdocs/PF_Transcriptome/temp";		# chemin de /temp/
    	 $mon_dir = "$rep_temp/$rep";				# chemin de /temp/temp_ID_xxxxx
    	 $dir_upload = "$mon_dir/fic";			# chemin de fic (upload + fichiers analyses)
    	 $dir ="/Applications/MAMP/htdocs/PF_Transcriptome/temp/$rep";
    	 $dir_R = "$dir/fic";
    	 $dir_rep = "$dir/rep";
     
     
    	open (FIC,">$mon_dir/rep/$target");					# fichier target.txt
    	print FIC "noms\tCy5\tCy3\tDate\tManipulateur\tFileName\n";
     
    	my @cle = sort keys (%donnees);      		# @cle est un tableau qui contient les cles ($i) du hash %données
     
    	###############################################################################################
    	#### pour chaque numero de lames = pour chaque experience = ou pour chaque ligne du tableau ###
    	###############################################################################################
      #On recupere la date pour connaitre l'heure du debut de l'upload des fichiers
    	$unedate = &ladate();
    	$message_popup= "<b>upload des fichiers en cours</b> ...$unedate<br><br>\n";
    	&change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
    	foreach my $la_cle (@cle) {
    		$| =1;
     
    		my $reference_tab = $donnees{$la_cle};	#on recupere la valeur de la cle qui est la reference a notre tableau de données 
    		my @contenu_tab = @{$reference_tab};	#on recupere le tableau de données pour cette cle (et donc pour ce numero de lame)
    		#pour une lame de numero $la_cle
     
    		# exemple d'utilisation de la boucle foreach
    		# print $contenu_tab[0];					# print la premiere case du tableau -> contenu de $exp pour chaque numero de lames
    		# print "&nbsp;";	
     
    		my $exp_tab = $contenu_tab[0];
    		my $cy5_tab  = $contenu_tab[1]; 		
    		my $cy3_tab  = $contenu_tab[2];			
    		my $date_tab  = $contenu_tab[3];		
    		my $manip_tab  = $contenu_tab[4];		
    		my $file_tab  = $contenu_tab[5];
     
    	########################################################################################################################		
     
    		##################################
    		## les entrees sont non valides ##
    		##################################
     
    		unless (($exp_tab =~ /.+/gi) && ($cy5_tab =~ /.+/gi) && ($cy3_tab =~ /.+/gi) && ($date_tab =~ /.+/gi) && ($manip_tab =~ /.+/gi) && ($file_tab =~ /.+/gi)) {
            $message_popup = "<div align='center'><img src='../../images/logo.jpg' alt='logo' border='0'>
    			<br><br><img src=\"./../../images/sigle.jpg\" alt='logo' border='0'>\n
    			<br><br><br>Les informations fournies sont incompl&egrave;tes, remplissez tous les champs ...<br><br><br> 
    			Vous allez &ecirc;tre redirig&eacute; vers la page d'accueil du pre-processing ...
    	</div>";
    	       &redirection_popup_erreur($ID,$message_popup); #=>on affiche $message_popup dans popup n°2 et on le redirige vers preproc
     
    =header
    			# creation de n'en tete http et redirection
    			print $query->header(-Refresh=>"4; URL=$chemin_refresh");
    			# creation de l'en tete du document html
    			print $query->start_html(-title=>'Plate-forme Transcriptome de Rennes - OUEST-genopole®',
    								   -meta=>{'http_equiv' => 'Content-Type',
    	                                   'content' => 'text/html'
    	                                   },
    	                      	     -style=>{"src"=>"$chemin_css"}
    	                      	     );	
    			# div container et div total pour designer la page
    			print "<div align='center'>\n<a href=\"$chemin_index\">\n
    				   <img src=\"$chemin_image/logo.jpg\" alt='logo' border='0'>\n	
    				   </a></div>
    			  ";
    	#print "#../htdocs/PF_Transcriptome/temp/temp_ID_305_2218_2006/fic/B4824.txt";
    			print "<br><center>\n";
    			print "<div class='container'>";
    			print "<div class='total'>";	  
     
    			# texte de la page
    			print "<center>
    			<br><br><img src=\"$chemin_image/sigle.jpg\" alt='logo' border='0'>\n
    			<br><br><br>Les informations fournies sont incompl&egrave;tes ou erron&eacute;es ..<br><br><br> 
    			Vous allez &ecirc;tre redirig&eacute; vers la page d'accueil du pre-processing ...</center>
    		 	";	
     
    			# fin de la page html
    			print "</div>";		# fin du div total
    			print "<div class='spacer'>&nbsp;</div>";
    			print "</div>\n";	# fin du div container	
    			print "</center>\n";	
    			print $query->end_html; 	
    =cut		
    			# fermeture du fichier target.txt si les entrees sont non valides
    			close (FIC);
     
    			# suppression des repertoires d'analyse et des fichiers crees
    			unlink ("$dir_upload/$fichier_gal");
    			unlink ("$dir_upload/$target");
    			unlink("$mon_dir/$fic");
    			foreach my $case(&lister_fichiers_a_supprimer($rep_temp)) {
    				unlink ($case);	
    			}
    			rmdir ("$mon_dir/fic");	
    			rmdir ("$mon_dir/rep");	
    			rmdir ("$mon_dir");	
    			foreach my $case(&lister_fichiers_a_supprimer($rep_temp)) {
    				unlink ($case);
    			}
     
    			# sortie du programme perl
    			exit; 
     
    			# fin de la boucle unless sur l'existence des variables entrees par l'utilisateur
    			}
     
    	########################################################################################################################	
     
    		####################################################
    		# les variables entrees par l'utilisateur existent #
    		####################################################
     
    		# upload des fichiers d'analyse
    		my $upload_filehandle = $query->upload("upload_$la_cle");
     
    		open (UPLOAD, ">$dir_upload/$file_tab");
    		binmode UPLOAD;
    		while (my $ligne=<$upload_filehandle>) {
    			chomp($ligne);
    			print UPLOAD "$ligne\n";
    		}
    		close UPLOAD;
    		my $taille_gal = (stat("$dir_upload/$file_tab"))[7];
     
     
     
    	########################################################################################################################	
     
    		###########################################
    		## verification de l'upload des fichiers ##
    		###########################################
     
    		unless (-e "$dir_upload/$file_tab"){
     
    	       $message_popup = "<font color=red>Erreur de t&eacute;l&eacute;chargement du fichier $file_tab.<br>
             Le script ne sera pas arrété, vérifie que le fichier a une taille non nulle une fois la page de resultat affichée<br>\n</font>";
    	       &change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
    =header	
    			# creation de l'en tete http et redirection
    			print $query->header(-Refresh=>"4; URL=$chemin_refresh");
    			# creation de l'en tete du document html
    			print $query->start_html(-title=>'Plate-forme Transcriptome de Rennes - OUEST-genopole®',
    						 -meta=>{'http_equiv' => 'Content-Type', 'content' => 'text/html'
    	                                	  },
    	            	             		 -style=>{"src"=>"$chemin_css"}
    	          	                 );
     
    			# div container et div total pour designer la page
    			print "<div align='center'>\n<a href=\"$chemin_index\">\n
    				   <img src=\"$chemin_image/logo.jpg\" alt='logo' border='0'>\n	
    				   </a></div>
    				  ";
    			print "<br><center>\n";
    			print "<div class='container'>";
    			print "<div class='total'>";	  
     
    			# texte de la page
    			print "<center>
    			<br><br><img src=\"$chemin_image/sigle.jpg\" alt='logo' border='0'>\n
    			<br><br><br>Erreur de t&eacute;l&eacute;chargement de vos fichiers exp&eacute;rimentaux<br><br>
    			 ";
    			print "Vous allez &ecirc;tre redirig&eacute; vers la page d'accueil du pre-processing ...<br>\n";
    			print "</center>";
     
    			# fin de la page html
    			print "</div>";		# fin du div total
    			print "<div class='spacer'>&nbsp;</div>";
    			print "</div>\n";	# fin du div container	
    			print "</center>\n";	
    			print $query->end_html; 	
     
    			# fermeture du fichier target.txt si les entrees sont non valides
    			close (FIC);
     
    			# suppression des repertoires d'analyse
    			unlink ("$dir_upload/$fichier_gal");
    			unlink ("$dir_upload/$file_tab"); 
    			unlink ("$dir_upload/$target");
    			unlink("$mon_dir/$fic");
    			foreach my $case(&lister_fichiers_a_supprimer($rep_temp)) {
    				unlink ($case);	
    			}
    			rmdir ("$mon_dir/fic");	
    			rmdir ("$mon_dir/rep");	
    			rmdir ("$mon_dir");	
    			foreach my $case(&lister_fichiers_a_supprimer($rep_temp)) {
    				unlink ($case);
    			}
     
    			# sortie du programme perl
    			exit; 
    =cut		
    		# fin de la boucle pour verifier le bon upload des fichiers
    		}
     
    	########################################################################################################################
     
    		# toutes les informations sont correctes
    		# chemin absolu du repertoire fic qui contient les fichiers d'analyse pour l'application R
    		# ATTENTION: OBLIGATION DU / POUR LE DEBUT DU CHEMIN ABSOLU #
    		#my $rep_R = "http://localhost:8888/PF_Transcriptome/temp/$rep/rep";
    		my $file_R = "$dir_R/$file_tab";
     
    		# creation du fichier .txt 
    		print FIC "$exp_tab\t$cy5_tab\t$cy3_tab\t$date_tab\t$manip_tab\t$file_R\n";
     
    	########################################################################################################################	
      #On recupere la date pour connaitre l'heure à laquelle le fichier $file_tab a été uploadé
    	$unedate = &ladate();
    	$message_popup = "$file_tab uploadé ...$unedate<br>\n";
    	&change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
     
    	push (@tab_fic,$exp_tab);	
    	# fin de la boucle foreach
    	}
     
    	########################################################################################################################
     
    	# fermeture du fichier target.txt
    	close (FIC);
     
     
    	# appel du module module.pm
    	my $repertoire_fic = "$dir/fic";
    	my $fic_gal = "$dir_rep/$fichier_gal";
    	&traite_fichier($fic_gal);
     
     
    	#traitement des fichiers du repertoire fic
    	my @fichiers = &lister_fichiers($repertoire_fic);	
        #On recupere la date pour connaitre l'heure à laquelle le traitement des fichiers commence
    		$unedate = &ladate();
    		$message_popup = "<br><b>traitement des fichiers :$unedate</b><br><br>\n";
    		&change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
     
    		sleep(3); #on laisse le temps à perl de charger les fichier uploader, sinon dans certains cas, il pense que le fichier est vide.	
    	foreach my $file (@fichiers) {						# !!! Attention, le traitement des fichiers est diésé !!! ##
    		$file =~ /.*[\/\\](.*)/;
        #On recupere la date pour connaitre l'heure à laquelle le fichier $1 va etre traité
    		$unedate = &ladate();
    		$message_popup = "$1 en cours de traitement ........$unedate<br>\n";
    		&change_popup($message_popup,$ID); #=>on affiche $message_popup à la suite dans popup n°2 (traitement.php)
     
        #on teste si le fichier gal est de taille nulle
        if ( (stat("$file"))[7] == 0){
          $file =~ s/.*[\/\\](.*)/$1/;			# expression reguliere pour recuperer uniquememnt le nom du fichier
          $message_popup = "<div align='center'><img src='../../images/logo.jpg' alt='logo' border='0'>
    			<br><br><img src=\"./../../images/sigle.jpg\" alt='logo' border='0'>\n
    			<br><br><br>Votre fichier $file est vide, veuillez soumettre un fichier valide ...<br><br><br> 
    			Vous allez &ecirc;tre redirig&eacute; vers la page d'accueil du pre-processing ...
    	    </div>";
    	    &redirection_popup_erreur($ID,$message_popup); #=>on affiche $message_popup dans popup n°2 et on le redirige vers preproc
          exit;
        }
     
    		&traite_fichier($file);
    		my $BG = &bgmoy($file);
    		&featgal($fic_gal,$file,$BG);
     
    	}
     
    #Fin du if avec methode post 
    } elsif($methode =~ /get/i){
        #==========================================================
        # Cas où les infos ont été envoyées avec la methode GET, c'est à dire 
        # l'utilisateur clique ou tape sur l'url (http://localhost:8888/cgi-bin/analysis.pl?ID=********) 
        #==========================================================
        $ID = $query->param("id");			# numero ID de l'analyse	
     
       	#S'il n'y a pas d'ID dans l'url (c'est à dire qu'on tape http://localhost:8888/cgi-bin/analysis.pl), 
       	#=> message forbidden
       	unless ($ID =~ /.+/){
    			print $query->header();
    			# creation de l'en tete du document html
    			print $query->start_html(-title=>'Plate-forme Transcriptome de Rennes - OUEST-genopole®',
    								   -meta=>{'http_equiv' => 'Content-Type',
    	                                   'content' => 'text/html'
    	                                   },
    	                      	     -style=>{"src"=>"$chemin_css"}
    	                      	     );	
    			# div container et div total pour designer la page
    			print "<div align='center'>\n<a href=\"$chemin_index\">\n
    				   <img src=\"$chemin_image/logo.jpg\" alt='logo' border='0'>\n	
    				   </a></div>
    			  ";
    	#print "#../htdocs/PF_Transcriptome/temp/temp_ID_305_2218_2006/fic/B4824.txt";
    			print "<br><center>\n";
    			print "<div class='container'>";
    			print "<div class='total'>";	  
     
    			# texte de la page
    			print "<center>
    			<br><br><img src=\"$chemin_image/sigle.jpg\" alt='logo' border='0'>\n
    			<br><br><br>pas le droit! vorbotten!!!";	
     
    			# fin de la page html
    			print "</div>";		# fin du div total
    			print "<div class='spacer'>&nbsp;</div>";
    			print "</div>\n";	# fin du div container	
    			print "</center>\n";	
    			print $query->end_html; 			
    	exit;
    }
     
       	#il y a un d'ID dans l'url, alors on va recuperer grace à lui le nombre de lames (pour $nb_lame),
       	#le nom du fichier gal (pour $fichier_gal) et les noms d'experiences (pour @tab_fic)
     
    	 $rep = "temp_".$ID;					# rep temp_ID_xxxx
    	 $fic = "analyse_".$ID.".txt";			# fichier recapitulatif des analyses dans $rep
    	 $rep_temp = "../htdocs/PF_Transcriptome/temp";		# chemin de /temp/
    	 $mon_dir = "$rep_temp/$rep";				# chemin de /temp/temp_ID_xxxxx
    	 $dir_upload = "$mon_dir/fic";			# chemin de fic (upload + fichiers analyses)
    	 $dir ="/Applications/MAMP/htdocs/PF_Transcriptome/temp/$rep";
    	 $dir_R = "$dir/fic";
    	 $dir_rep = "$dir/rep";
     
    	 #On liste le repertoire fic. Le nombre de fichiers txt correspond au nombre de lames 
       my @fichiers_fic = &lister_fichiers($dir_R);
    	 #nbr de fichiers = nombre de lames
    	 $nb_lame = @fichiers_fic; 
     
    	 #Pour recuperer le nom du fichier gal, on liste le repertoire rep et si un nom de fichier se termine par .gal, c'est le bon.
    	 my @fichiers_gal = &lister_fichiers($dir_rep);
    	 foreach my $case (@fichiers_gal) {
    	 	if ($case =~ /(.+\.gal)$/i) 	{
           $fichier_gal = $1;
    	 		 $fichier_gal =~ s/.*[\/\\](.*)/$1/;			# expression reguliere pour recuperer uniquement le nom du fichier
    	 		last;
    	 	}
    	 }
     
    	 #Pour recuperer le nom des experiences, on va dans target.txt
    	 open (LEC, "$dir_rep/target.txt");
       #La premiere ligne contient juste des titres, donc je la met dans $header_target
    	 my $header_target = <LEC>;
       #Les autres lignes sont mises dans @noms
    	 my @noms = <LEC>;
    	 close (LEC);
    	 #Pour chaque ligne, on recupere la premiere colonne qui correspond au nom de l'experience
    	 foreach my $case (@noms) {
    	 	$case =~ /^(\w+)\t/;
    	 	push (@tab_fic, $1);
    	 }
     
    	 #Voilà, on a toutes les infos pour le afficher analysis.pl à partir d'un ID
    }
    	###########################################################################
    	## tout est ok . le fichier target.txt est crée, début des analyses en R ##
    	###########################################################################
     
      #tous les traitements sont terminés, on va appeler le le sous programme redirection_popup
      #qui recrée traitement.php (avec une redirection à l'interieur vers analysys.pl)
     
            #redirection vers analysis.pl?id=$ID dans 5 secondes
            redirection_popup($ID);
     
     	# design de la page html en dehors du foreach 
    	# creation de l'en tete http 
    	print $query->header;
    	# creation de l'en tete du document html
     
    	print $query->start_html(-title=>'Plate-forme Transcriptome de Rennes - OUEST-genopole®',               
    				#-head=>Link[({-rel=>'icon',  -href=>'./favicon.ico'})],
                            	 -meta=>{'http_equiv' =>'Content-Type', 'content' =>'text/html'},                      
    				 -style=>{"src"=>"$chemin_css"},
    			   -script=>{-language => "JAVASCRIPT",-src=>"$chemin_javascript"},
                           );
    	# div container et div total pour designer la page
    	print "<div align='center'>\n<a href=\"$chemin_index\">\n
    		   <img src=\"$chemin_image/logo.jpg\" alt='logo' border='0'>\n	
    		   </a></div>
    		  ";
    	print "<br><center>\n";
    	print "<div class='container'>";
    	print "<div class='total'>";	 
     
    	### debut du contenu de la page #######
    	#################### les analyses à effectuer####################################
     
    	print "Nous allons donc proc&eacute;der &agrave; l'analyse de vos <i>$nb_lame exp&eacute;riences</i>.<br><br>";
     
    	print "Deux choix vous sont offerts:<br><br>
    	<div style ='margin-left:10px;'>	
    		- utiliser les donn&eacute;es process&eacute;es par Feature Extraction<sup>®</sup>,<br>
    		- utiliser les intensit&eacute;s brutes et choisir vos param&egrave;tres de pre-processing avec <b><font color='#006699'>notre outil</font></b>.<br>
    	</div>
    	<br>
     
    	Vous pouvez &eacute;galement choisir la stringence du contr&ocirc;le qualit&eacute; de vos lames sur les crit&egrave;res suivants:<br>
    	<div style = margin-left:10px;>	
    	<ul>
    		<li> l'<u>uniformit&eacute</u> des spots, du bruit de fond et des populations des spots r&eacute;pliqu&eacute;s,
    		</li>
     
    		<li> la <u>saturation</u> des spots sur les canaux, <b><font color='#FF0000'>rouge</font></b> ou <b><font color='green'>vert</font></b>,
    		</li>
     
    		<li> le <u>crit&egrave;re &quot;<i>WellAbove</i>&quot;</u> d'Agilent<sup>®</sup>: les spots valident les caract&eacute;ristiques suivantes:<br>
    		 <div style = margin-left:20px;>
    		 	- la moyenne du signal est significativement diff&eacute;rente du bruit de fond,<br>
    		 	- le signal auquel on a soustrait le bruit de fond par la m&eacute;thode FE est 2,6 fois sup&eacute;rieure &agrave; l'&eacute;cart type du bruit de fond.
    		 </div>
    		</li>
    	</ul>
    	</div>	<br>
    	<hr><br>";
     
    	#formulaire
    	print "<center><b><font color='#006699'>Veuillez remplir le formulaire suivant!</font></b></center><br><br>";
    	print "<div class='container'>";
    	print "<div class='formgch'>";
    	print $query->start_multipart_form( -method=>'POST',
    				 - name=>'formulaire',		
    				  - action=>'/cgi-bin/datasget.pl',
    				  -enctype=>'multipart/form-data',
    				  -onsubmit =>"popup()"
    				 );
     
    	print " <div style ='margin-left:10px;'>Choix de la <font color='#006699'>m&eacute;thode</font></div><br><div style ='margin-left:25px;'>
    	";
    	print "
    	<input type='radio' name='methode' value='Agilent'>Agilent<br>
    	<input type='radio' name='methode' value='pPR' checked>pPR
    	";	   
    	print "</div><br>";
    		print "<br><br>";
    	print "<div style ='margin-left:10px;'>Stringence sur <font color='#006699'>l'uniformit&eacute;</font></div><br>
    	<div style ='margin-left:25px;'>
    	";	
    	print "
    	<input type='radio' name='flags' value='faible'>faible<br>
    	<input type='radio' name='flags' value='moyenne'>moyenne<br>
    	<input type='radio' name='flags' value='forte' checked>forte
    	";	   
    	print "</div>";
     
    	print "</div>";		# fin du div formgch
     
     
    	print "<div class='formtdrt'>";
    	print "<div style ='margin-left:10px;'>Nombre de <font color='#006699'>canaux satur&eacute;s</font></div><br>
    	<div style ='margin-left:25px;'>\n
    	";		
    	print "
    	<input type='radio' name='saturate' value='aucun'>aucun<br>
    	<input type='radio' name='saturate' value='un' checked>un<br>
    	<input type='radio' name='saturate' value='deux'>deux
    	";	   
    	print "</div><br>\n";
    	print "<br>";
    	print "<div style ='margin-left:10px;'>Spots toujours <font color='#006699'>au dessus du bruit de fond</font></div><br>
    	<div style ='margin-left:25px;'>
    	";		
    	print "
    	<input type='radio' name='wellabove' value='oui' checked>oui<br>
    	<input type='radio' name='wellabove' value='non'>non
    	";	   
    	print "</div><br>";
    	print "</div><br>";		# fin du div formtdrt
     
    	# fin du div container
    	print "</div>";
    	print "<br>\n";
     
    	# envoi d'un champ caché: envoi du nombre d'exp, donc du nombre de variables à traiter
    	print $query->hidden(-name=>"nombre", -value=>"$nb_lame");
    	print "\n";
    	print $query->hidden(-name=>"id", -value=>"$ID");
    	print "\n";
    	print $query->hidden(-name=>"gal", -value=>"$fichier_gal");
    	print $query->hidden(-name=>"fichiers", -value=>"@tab_fic");
     
    	print "&nbsp;<center><br>\n";
    	print $query->submit(-name=>"envoi", -value=>"Envoyer");
    	print "&nbsp;&nbsp;&nbsp;&nbsp;";
    	print $query->reset;
    	print "</center>\n";
     
    	# fin de mon formulaire
    	print $query->endform;
     
     
    	#### fin du contenu de la page ######
     
    	# fin de la page html
    	print "</div>";		# fin du div total
    	print "<div class='spacer'>&nbsp;</div>";
    	print "</div>\n";	# fin du div container	
    	print "</center>\n";	
    	print $query->end_html;

  19. #19
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Bon, pour sûr, c'est bien le fichier analysis.pl qui récupère tes fichiers si je suppose bien en disant qu'une lame = un fichier. L'erreur à mon avis est de vouloir tout récupérer et de créer un fichier à la fin avec toutes les données d'un coup. si tu faisais ta boucle autrement tu aurais peut-être moins de soucis, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for .... {
    .....
    my $file = $cgi->param('file_upload...');
    ....
    contrôle de la validité des données
    ajout dans le fichier avec ">>" pour rajouter à la suite ;) 
     
    }

  20. #20
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    sauf que je n'ajoute pas des infos dans le fichier en cours d'etre uploader .. mais je veux en créer avec des infos sélectives de chacun des deux ..
    e tout est dans un foreach. c'est à dire pour chaque fichier uploader, il fait les verif.
    Une fois fini le tout
    Il reprend chaque fichier, fais les traiement et le recree.

    Donc il fait pas le tout en même temp .

    Je sais, c pas facile à suivre car le script est long et il y a un .pm associé

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Perl - processus arreté
    Par Isabella83 dans le forum Langage
    Réponses: 8
    Dernier message: 03/10/2012, 14h20
  2. [VS2005] S'arreter quand une exception est levée
    Par ZePostman dans le forum Visual Studio
    Réponses: 8
    Dernier message: 28/08/2008, 15h24
  3. [Quartz] Arreter quartz quand mon appli lance une exception
    Par Shogun dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 17/01/2008, 15h41
  4. Récupérer coords souris quand elle s'arrete de bouger
    Par seb-oulba dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/08/2006, 17h21
  5. [Perl-6 et Paroott]Quand ?
    Par parsy dans le forum Langage
    Réponses: 1
    Dernier message: 20/10/2005, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo