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

Ruby Discussion :

Aide de décryptage


Sujet :

Ruby

  1. #1
    Membre régulier
    Homme Profil pro
    PLM IT Consultant
    Inscrit en
    Novembre 2003
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : PLM IT Consultant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 202
    Points : 86
    Points
    86
    Par défaut Aide de décryptage
    Bonjour

    après quelques années sans réellement développer, je me retrouve avec un code RUBY a essayé de débugger. Je me permets de solliciter de l'aide car j'ai l'impression de tourner en rond depuis un petit moment.

    J'ai un script Ruby qui me créé 5 fichiers Textes avec des données. Mon problème est que si j'ai plus qu'une ligne à insérer dans les fichiers, il créé mon fichier avant d'avoir terminer l'écriture de toute les lignes.
    Cela me pose problème car, par moment, certains utilisateurs ouvre le fichier avant que l'écriture des données soit terminés. Dans l'ancienne version de notre logiciel (PDM) qui utilisait aussi un script Ruby, très peu de différence sont entre les deux fichiers, donc à priori j'ai détecté la zone où j'ai le soucis. Je me permets donc de vous solliciter pour un peu d'aide (mes connaissances en Ruby sont encore limité à l'heure où j'écris ).

    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
    files.each do |f|
              src = File.join(@env.srcdir(), f)
              next if not File.exist?(src)
     
              pf = "1" if f =~ /tiedm010.txt/i
              pf = "2" if f =~ /tiedm010txt.txt/i
              pf = "3" if f =~ /tiedm100.txt/i
              pf = "4" if f =~ /tiedm100txt.txt/i
              pf = "5" if f =~ /tiedm110.txt/i
     
    		 dst = File.join(@options.output_dir, sprintf("%s_%s_%s_%s", @job_tag, @job_date[0,12], pf, f))
              if not File.exist?(dst)
                @log.info "Copy '#{src}' to '#{dst}'"
                begin
    				File.open(dst, 'w') {|out|
    				  out.puts header[f]
    				  out.write(File.new(src, 'r').read())
    				}
                  #FileUtils.cp src, dst, :verbose => true
                rescue => error
                  @log.error "Failed to copy '#{src}' to '#{dst}' (#{error})"
                end
              else
                @log.info "Appending '#{src}' to '#{dst}'"
                begin
                  File.open(dst, 'a') {|f| 
    				f.puts ''
    				f.write(File.new(src, 'r').read())
    			  }
                rescue => error
                  @log.error "Failed to append '#{src}' to '#{dst}' (#{error})"
                end
              end
            end
    Merci pour votre aide.
    "Qu'est-ce qui est venu le premier à la vie? Le compilateur ou le code source"

  2. #2
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut
    Salut,
    les histoires d'IO filesystem et input/output ne sont pas spécialement Ruby, pour le coup c'est même très proche du C.

    Tu as le code du cas COPY qui fait deux écritures : une fois la ligne de headers, une autre le contenu du fichier source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    				File.open(dst, 'w') {|out|
    				  out.puts header[f]
    				  out.write(File.new(src, 'r').read())
    				}
    Je pense que tu peux t'en sortir en mettant tout dans le même write
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    				File.open(dst, 'w') {|out| out.write(header[f] + "\n" + File.new(src, 'r').read()) }
    Dans le cas APPEND tu as le même souci, mais c'est peut-être moins grave puisque le fichier existe déjà donc le problème que tu nous dis existe peut-être déjà aussi de toutes façons. Le problème ne serait alors pas dans le code que tu nous donnes, mais dans l'approche globale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                  File.open(dst, 'a') {|f| 
    				f.puts ''
    				f.write(File.new(src, 'r').read())
    			  }
    Je peux te proposer ça puisque le "puts chaîne vide" est simplement "ajoute un retour à la ligne" (ah oui tiens, tes fichiers sont-ils en CR (mode unix) ou CR-LF (mode windows) ? Bref change ça dans mon code au besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                  File.open(dst, 'a') {|f|  f.write("\n" + File.new(src, 'r').read())}
    Enfin mes deux conseils :

    * si tu veux "tout écrire d'un coup" et en fonction des données, regarde si une autre solution serait plus simple :
    script shell ou batch, gem ruby avec le format de fichier adapté (genre CSV), écrire dans un dossier temporaire et finir par un File.mv...

    * tu n'as pas l'air de faire des trucs dangereux dans ton écriture de fichiers, finalement celui qui est dangereux est le consommateur
    essaie de voir pourquoi tes utilisateurs regardent "trop tôt" ou pourquoi ton traitement est "trop lent".

    Bon courage !

  3. #3
    Membre régulier
    Homme Profil pro
    PLM IT Consultant
    Inscrit en
    Novembre 2003
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : PLM IT Consultant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 202
    Points : 86
    Points
    86
    Par défaut
    Salut abelar_s,

    merci pour tes quelques explications, cela est devenu un peu plus clair.

    La solution sur laquelle je vais pour le moment est de créer un fichier lock qui empêche l'utilisation par un consommateur en même temps que toutes les écritures ne sont pas terminés.

    Tu peux éventuellement m'aider sur mon dernier problème (Compréhension de boucle).

    Le nom de mon fichier "lock" est teamcenter.lock.

    Voici le scénario actuel:
    Nombre d'entrées dans le fichier Création du lock Suppression du lock
    1 Oui Après avoir terminé
    2 Oui Après avoir terminé
    3 ou plus Oui Après avoir terminé la 2ème entrée

    Je suppose que le paramètre "f" est l'itération de ma boucle mais je ne comprends pas pourquoi il efface mon lock avant d'avoir terminé d'écrire tout.

    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
    files.each do |f|
     
              src = File.join(@env.srcdir(), f)
              next if not File.exist?(src)
     
              pf = "1" if f =~ /tiedm010.txt/i
              pf = "2" if f =~ /tiedm010txt.txt/i
              pf = "3" if f =~ /tiedm100.txt/i
              pf = "4" if f =~ /tiedm100txt.txt/i
              pf = "5" if f =~ /tiedm110.txt/i
              # KST -> Smaller filenames!  dst = File.join(@options.output_dir, sprintf("%s_%s_%s_%s", @job_tag, @job_date, pf, f))
              dst = File.join(@options.output_dir, sprintf("%s_%s_%s_%s", @job_tag, @job_date[0,12], pf, f))
              if not File.exist?(dst)
                @log.info "Copy '#{src}' to '#{dst}'"
                begin
     
    				File.open(dst, 'w') {|out|
    				  out.puts header[f]
    				  out.write(File.new(src, 'r').read())
    				}
    				src = File.new(teamcenter_lock_file, 'w')
                  #FileUtils.cp src, dst, :verbose => true
                rescue => error
                  @log.error "Failed to copy '#{src}' to '#{dst}' (#{error})"
                end
              else
                @log.info "Appending '#{src}' to '#{dst}'"
                begin
                  File.open(dst, 'a') {|f|
    				f.puts ''
    				f.write(File.new(src, 'r').read())
    			  }		  
                rescue => error
                  @log.error "Failed to append '#{src}' to '#{dst}' (#{error})"
                end		
              end		  
            end
            #
            @log.info("Removing Teamcenter lock file at #{teamcenter_lock_file}")	
            #
            begin
             FileUtils.rm_f teamcenter_lock_file
            rescue
            end

    Merci beacuoup
    "Qu'est-ce qui est venu le premier à la vie? Le compilateur ou le code source"

  4. #4
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut
    Là je ne saurais pas trop dire, en fonction de comment c'est appelé.

    Je vois que tu as ligne 21 (dans la boucle) ton src = File.new(teamcenter_lock_file, 'w')

    Personnellement je le ferais dès le début : avec ton tableau il faut le faire tout le temps.
    Du coup tu commencerais ton code par la création du lock (si files n'est pas vide, à la rigueur), et tu le finis par la suppression ?

  5. #5
    Membre régulier
    Homme Profil pro
    PLM IT Consultant
    Inscrit en
    Novembre 2003
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : PLM IT Consultant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 202
    Points : 86
    Points
    86
    Par défaut
    Alors je suis parti dans complétement une autre voix! J'ai un autre problème ruby où je vais créer un autre Topic.

    Merci pour votre première aide.
    "Qu'est-ce qui est venu le premier à la vie? Le compilateur ou le code source"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide au décryptage
    Par NeoRonin dans le forum Sécurité
    Réponses: 0
    Dernier message: 16/03/2015, 15h55
  2. Aide programme décryptage .dmf
    Par seth71 dans le forum Windows
    Réponses: 0
    Dernier message: 07/07/2009, 23h38
  3. A l'aide (décryptage script VBS)
    Par farouk95 dans le forum VBScript
    Réponses: 4
    Dernier message: 09/06/2009, 11h34
  4. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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