RaphAstronome

jeudi, 19 février 2009

sql : MàJ un champ BLOB en hexadécimal

Il est souvent utile d'intégrer des données binaires à une base de données. Pour le faire on utilise les champs de type BLOB et souvent on insère les données avec leur représentation hexadécimale. Pour modifier ce champ on aurait tendance a faire :

UPDATE t SET champ=0x0123456789abcdef WHERE id=1;

En bah ça marche pas ! Du moins pas avec MySQL. Le problème est qu'il interprète 0x0123456789abcdef comme un nom de champ (erreur #1064) il faut donc passer par une autre méthode.

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...

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.