RaphAstronome

mardi, 7 avril 2009

Utiliser un editeur de texte dans un programme

Saisir un long texte avec une instruction "gets" c'est pas très efficasse on aimerait parfois avoir un vrai éditeur de texte.

Toutefois il convient dans certaines situations d'éviter les librairies lourdes comme GTK.

Pour le faire on peut tout simplement utiliser nano sur un fichier temporaire.

éditeur nano

On pourait aussi utilise vim ou emacs selon ce que vous préférez. Sous windows il faudrait utiliser notepad.

Lire la suite...

dimanche, 15 février 2009

Plugin Munin en Ruby : il y a un piège

Pour faire de jolis graphiques de charge serveur y a pas à dire Munin c'est pas mal. Faire un plugin pour ajouter ces propres graphs est aussi très facile.

Munin exemple

Lire la suite...

lundi, 5 janvier 2009

mysqldump | bzip | gpg > mail

Cette fois on va faire un backup de la base de données (avec mysqldump), la compresser (bzip), la chiffrer (gpg) et enfin l'envoyer dans un mail avec une pièce jointe avec ruby.

Lire la suite...

dimanche, 27 mai 2007

Ruby : open-uri

Voici le problème qui pourrait vous arriver si vous avez comme moi une base de milliers de liens à vérifier. Dans ObjectFinder il y a 2706 : vous comprendrez que les vérifier tous à la main serait pour le moins ennuyeux, il y a même un fort risque de devenir fou avant d'avoir terminé la vérification. Heureusement on peut tout a fait faire un programme qui vérifie les liens pour vous.

Vous vous êtes sûrement demandé comment faire un programme qui télécharge des fichiers, pour ça il existe de différents moyens :

  • Coder un client HTTP avec les sockets : c'est pas hyper dur mais c'est long pour pas grand chose.
  • Utiliser un programme externe comme wget sous Linux mais il faut écrire dans un fichiers puis le lire, pas très propre.
  • Utiliser une librairie : libcurl et autre.

Ruby à en standard une librairie qui permet de charger un fichier distant : 'open-uri'. Bien sur il serait dommage de ne pas l'utiliser.

Son utilisation est simple. Une fonction "open" appelle un bloc où on récupère le flux :

require 'open-uri'

open(adresse) {|f|
	f.each_line {|ligne|
		# ligne est la valeur de la ligne
		# qui est actuellement lue
		puts ligne
	}
}

Une exception est susceptible d'être levée si le fichier n'existe pas ou que le serveur est indisponible.

Donc on oublie pas de le vérifier :

require 'open-uri'

begin
	open(adresse) {|f|
		f.each_line {|ligne|
			# ligne est la valeur de la ligne
			# qui est actuellement lue
			puts ligne
		}
	}
rescue
	puts "Erreur"
end

Attention toutefois ! Quelques précautions doivent êtres prises si vous envoyez beaucoup de requêtes :

  • Le plus important : ralentissez vos requêtes, par exemple une par seconde. Si vous avez beaucoup de liens vous pouvez faire un système qui envoie 1 requête par secondes par serveur (on envoie plusieurs requêtes par seconde mais pas au même serveur).
  • Ne pas charger des fichiers trops gros (éviter de faire les vérifications de téléchargement comme ça).
  • Si vous êtes sur un mutualisé ne lancer pas votre script à partir du serveur mais téléchargez la liste sur votre ordi et exécutez le programme sur votre ordi.
  • Faites un système qui permet de reprendre là où le programme c'est interrompu pour éviter d'avoir à tout refaire en cas de pépin.
  • Soyez patients : ça peut durer un peu de temps mais au moins vous pouvez faire autre chose pendant que le programme tourne (a peu près 1h pour la base d'ObjectFinder).
  • Ne pas recommencer sans arrêt : une fois par mois devrait être largement suffisant.