mardi, mars 28, 2006

[Rails] Find by {inserer le nom du champs ici}

Je viens de découvrir un truc génial (encore un):
Ceux qui ont fait des appli qui accèdent à la base de donnée auront surement déjà au besoin d'ajouter des méthodes du genre Adresse.findByCodePostal(codepostal).
Evidement à chaque fois on a jamais celle qui nous faut... avec hibernate le code est relativement simple à écrire. Mais avec Rails c'est encore plus simple! Il n'y a pas besoin de l'écrire!

Imaginons que j'ai une table items avec comme colonne "title", "quantity", "price"...
J'écris directement (dans mon test unitaire par exemple):
  Item.find_by_title('test title')
  Item.find_by_quantity(8)
  Item.find_by_price(123.45)

En fait les find_by_xxx() sont créées à la volée! C'est génial! Il suffit que mon champs existe en base et la méthode correspondante existe toute seule!
Technorati tags:

[Rails] Comment avoir la liste des taches rake

J'oublie toujours la commande, alors je me la marque ici une bonne fois pour toute:
> rake --tasks

rake add_new_scripts          # Add new scripts to the application script/ directory
rake apidoc                   # Build the apidoc HTML Files
rake appdoc                   # Build the appdoc HTML Files
rake clear_logs               # Clears all *.log files in log/
rake clobber_apidoc           # Remove rdoc products
rake clobber_appdoc           # Remove rdoc products
rake clobber_plugindoc        # Remove plugin documentation
rake clone_schema_to_test     # Recreate the test database from the current environment's database schema.
rake clone_structure_to_test  # Recreate the test databases from the development structure
rake create_sessions_table    # Creates a sessions table for use with CGI::Session::ActiveRecordStore
rake db_schema_dump           # Create a db/schema.rb file that can be portably used against any DB supported by AR.
rake db_schema_import         # Import a schema.rb file into the database.
rake db_structure_dump        # Dump the database structure to a SQL file
rake default                  # Run all the tests on a fresh test database
rake drop_sessions_table      # Drop the sessions table
rake freeze_edge              # Lock this application to the Edge Rails (by exporting from Subversion).  Defaults to svn HEAD; do 'rake free
VISION=1234' to lock to a specific revision.
rake freeze_gems              # Lock this application to the current gems (by unpacking them into vendor/rails)
rake load_fixtures            # Load fixtures into the current environment's database
rake migrate                  # Migrate the database according to the migrate scripts in db/migrate (only supported on PG/MySQL). A specific
an be targetted with VERSION=x
rake plugindoc                # Generate documation for all installed plugins
rake prepare_test_database    # Prepare the test database and load the schema
rake purge_sessions_table     # Drop and recreate the session table (much faster than 'DELETE * FROM sessions')
rake purge_test_database      # Empty the test database
rake reapidoc                 # Force a rebuild of the RDOC files
rake reappdoc                 # Force a rebuild of the RDOC files
rake recent                   # Run tests for recentprepare_test_database
rake stats                    # Report code statistics (KLOCs, etc) from the application
rake test_functional          # Run tests for test_functionalprepare_test_database
rake test_plugins             # Run tests for test_pluginsenvironment
rake test_units               # Run tests for test_unitsprepare_test_database
rake unfreeze_rails           # Unlock this application from freeze of gems or edge and return to a fluid use of system gems
rake update_javascripts       # Update your javascripts from your current rails install.

rem: Ce n'est uniquement valable pour rails mais pour tous les rake.
Technorati tags:

[Rails] changer la taille d'un text area

Petite astuce toute simple: "Comment changer la taille d'un text area dans rails?"
<%= text_area 'user', 'address', :rows => 2  %>
Technorati tags:

lundi, mars 27, 2006

Mon "Opinion Forum System" à moi

Je suis dégouté, j'avais une super idée de forum très web2.0 et puis voilà que quelqu'un a eu la même: Opinion Forum System
Je crois que je le ferais quand même... à 1 mois près, juste parce que j'ai pas eu le temps de m'en occuper...
Par contre j'ai rien vu concernant les licences et ça a l'air d'être un site perso qui héberge le site...
Si je fais une jolie licence GNU ou Apache ou un truc dans le style je pourrai toujours me démarquer!

[Rails] Nouvelle stratégie de test dans Ruby on rails

Voilà un post interessant de Mike Clark (celui qui a implémenté les tests dans Rails) qui explique quelles modifications il a apporté aux tests pour que ceux-ci passent plus vite.
Il a tout simplement fait un "rollback" à la fin de chaque test, ça évite d'avoir à supprimer les données insérées :)
Pour ceux qui connaissent ca ressemble à la stratégie utilisé dans les Tests de Spring Framework (AbstractTransactionalDataSourceSpringContextTests).
Technorati tags:

lundi, mars 13, 2006

Transformer des logs du garbage collector en fichier csv

Voici un petit script qui permet de transformer les logs obtenus en passant les paramètres "-verbose:gc -Xloggc:/temp/jvm.log" à la jvm en java pour voir l'utilisation de la mémoire.
Les logs obtenus ressemblent à ça:
0.000: [GC 508K->138K(1984K), 0.0042681 secs]
0.074: [GC 650K->251K(1984K), 0.0030702 secs]
0.198: [GC 763K->305K(1984K), 0.0035574 secs]
0.272: [GC 817K->465K(1984K), 0.0033527 secs]
0.320: [GC 976K->523K(1984K), 0.0020841 secs]
...
0.557: [Full GC 1489K->1015K(2112K), 0.0256656 secs]
...
Cette version est plus compacte mais moins facile à lire (à mon avis) que la seconde, on split la ligne en utilisant plusieurs séparateurs: K ou [GC ou ( ou -> ...
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  array = line.split(/(:)|( \[GC )|( \[Full GC )|(->)|(\))|(K)|(\()/)
  time = array[0]
  puts("time: " + time)
  before_gc = array[4]
  puts("before_gc: " + before_gc)
  after_gc = array[8]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
La seconde version où on split au fur et à mesure (par dicotomie en quelque sorte):
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  split_time = line.split(':')
  time = split_time[0]
  puts("time: " + time)
  rest = split_time[1]
  split_gc = rest.split('->')
  before_gc = split_gc[0].split('GC ')[1].split('K')[0]
  puts("before_gc: " + before_gc)
  after_gc = split_gc[1].split('K')[0]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
Dans les deux cas on cherche un fichier jvm.log et on fait un fichier jvm.csv qui resemble à ça:
time;before_gc;after_gc;
0.000;508;138;
0.073;650;251;
0.200;763;305;
0.274;817;465;
0.322;976;523;
0.379;1035;537;
0.408;1049;722;
0.426;1234;802;
0.433;1298;837;
...
Il y a plus qu'à le passer dans excel et hop de jolies courbes!
Rem: je l'ai écrit rapidement, on peut surement faire plus élégant, mais mon but était l'efficacité et pour ça ruby est génial ;)
Technorati tags: