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

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

mardi, 29 mai 2007

Faire un .deb automatiquement

Vous venez de trouver un logiciel open-source que vous voudriez installer. Seulement il n'existe pas de paquet pour votre système d'exploitation et/ou architecture. La solution est alors de télécharger le code source et le compiler vous même pour ce faire il faut d'habitude extraire l'archive et entrer ces commandes dans une console :

./configure
make
sudo make install

Le programme sera alors installé toutefois il n'appairera pas parmi vos paquets. Pour ce faire il faut utiliser "checkinstall" au lieu de "sudo make install". Checkinstall génère un paquet prêt à l'emploi au lieu de l'installer tout de suite. Et tant qu'a faire nous allons programmer un script bash qui permettra de compiler et faire le paquet automatiquement en quelques clics :

#!/bin/sh

tar -xf "$@"
cd `tar -tf "$@" | head --lines=1`
./configure
make
checkinstall --fstrans
mv *.deb ..

Tout d'abord on extrait l'archive : il contient un répertoire dans lequel on ce rend. Ensuite on fait les classiques ./configure et make puis on utilise checkinstall avec une option qui permet d'éviter d'avoir à ce mettre en "root". Remarquez que le deb généré sera minimal, pas de description, ni dépendances, ni tout autre élément d'information. Pour une diffusion il faudrait être plus précis mais pour un paquet juste pour nous ça va.

Ce script bash est prévu pour être placé dans les scripts du menu contextuel de gnome : il faut le placer dans ~/.gnome2/nautilus-scripts, il apparaîtra normalement dans le menu lorsque vous ferez un clic droit sur un fichier.

Quelques remarques :

  • Durant le traitement aucun affichage n'est effectué, ça prend souvent plusieurs minutes, ne lancez pas deux fois le script et attendez que le .deb apparaisse. En cas d'erreur le programme ce finit sans message d'erreur, si vous voulez voir ce qu'il se passe je vous conseille de l'utiliser en mode console.
  • Pour la ligne avec cd il faut bien mettre ` et pas '. N'oubliez pas d'en faire un exécutable avec "chmod".
  • Pour fonctionner il faut bien sur que vous ayez installé ce qu'il faut pour compiler et checkinstall.
  • Ce script est prévu pour les archives de sources répondant au format classique de l'open-source, des archives atypiques ont de grandes chances de ne pas être traités comme il faut et être extrait dans le répertoire courant au lieu d'un sous répertoire.
  • Le dossier de l'archive est conservé pour une éventuelle réutilisation mais si vous n'en avez pas besoin vous pouvez le supprimer.
  • Il doit être possible de générer un rpm ou un paquet Slackware avec mais il faut alors le modifier.
  • Étrangement cet utilitaire ne semble pas marcher avec une archive placée sur le bureau.
  • Le script est sous licence BSD.

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.