RaphAstronome

samedi, 12 février 2022

Dates représentables seulement avec 2 chiffres différents, rares à quel point ?

Ce mois si il y a 3 jours dont on peut exprimer la date avec seulement 2 chiffres en écrivant en base 10 : 02/02/2022, 20/02/2022 et 22/02/2022.

Plutôt rare mais à quel point ?

Pour cela j'ai fait un petit programme et ... effectivement, c'est rare mais lorsque cela arrive, cela arrive par lots, comme ce mois si. Plutôt logique il faut déjà que l'année puisse être écrit avec seulement 2 caractères donc pour les années 20xx cela n'arrive qu'en 2000, 2002, 2020 et 2022. Il y aura aussi des cas en 21xx et 22xx mais plus rien après jusqu'en l'an 3000. Pas très étonnant car dans 23xx, 24xx et autres on est coincé : le chiffre 2 est obligatoirement présent ainsi qu'un autre chiffre supérieur ou égal à 3. Or, impossible de faire un numéro de mois : il faut obligatoirement au moins un 0 ou un 1 pour les dizaines.

De la même façon impossible d'avoir des dates dont la date est représentable avec un seul chiffre autre que le 11 novembre (11/11) et il faut alors que l'année soit elle même représentable avec uniquement des "1" : ce fut le cas de l'année 1111 et la prochaine bah ... 11111 !

Si vous voulez voici donc la liste complète des dates dont la représentation n'utilise que deux chiffres entre 2000 et 3100 (format année - mois - jour) :

Lire la suite...

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.