まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

jeudi, 13 février 2014

Enregistrer une partie de jeu d'arcade avec mame -2-

Suite de l'étude précédente :

J'ai terminé l'écriture du script Mame-inp2video4GnuLinux.sh pour générer automatiquement une vidéo depuis un fichier inp, sans avoir à se palucher les lignes de commandes.
Il est téléchargeable depuis l'annexe de ce billet.

Prérequis :

  • Pour fonctionner le script a besoin des logiciels suivant :

mame
advancecomp
mencoder
avidemux
ffmpeg2theora

sudo apt-get install mame advancecomp mencoder avidemux ffmpeg2theora
  • Télécharger le script et le placer dans le dossier de travail de son choix.
  • Rendre le script exécutable, s'il ne l'est pas déjà :
sudo chmod 775 Mame-inp2video4GnuLinux.sh


Pour enregistrer une partie :

Je rappelle la commande pour enregistrer une partie avec l'émulateur Mame, on va exécuter :

mame nom_de_la_rom -record ma_partie.inp

Et jouer…
L'enregistrement s'arrête lorsqu'on quitte le jeu.

Attention, durant l'enregistrement de la partie, il ne faut faire appel à aucun menu dans l'émulateur, sinon l'enregistrement s'arrêtera !



Pour générer une vidéo depuis la partie précédemment enregistrée :

  • Exécuter simplement le script et suivre les instructions ^__^ :
./Mame-inp2video4GnuLinux.sh


Bon amusement !

Attention, si comme moi vous sauvegardez vos inp dans un coin et qu'un beau jour vous décidez de les rejouer, n'oubliez pas de les recopier dans le dossier inp tel que définit dans mame.ini, car il ne faut pas espérer pouvoir donner le chemin vers le jeu, ni dans le script, ni dans la commande playback expliquée au billet précédent, ça ne fonctionne pas !

lundi, 25 février 2013

Dotclear et le spam des commentaires

Le spam des commentaires est malheureusement une chose inévitable lorsque le blog commence à être bien référencé.

  • Les filtres de l'extension « Antispam » de dotclear sont assez efficaces, pour le peu qu'on enregistre suffisamment de mots clés dans le filtre : Bad Words, Liste de termes interdits.

C'est simple, il suffit d'entrer les termes anglais les plus usités, genre : That (80% de positif !) , quartz, hello, you, etc
Le seul inconvénient étant de chopper aussi les commentaires pertinents dont l'auteur aura voulu utiliser un anglicisme.

  • Au départ les spam étaient peu nombreux, pas un problème donc.

Puis de temps en temps un « chinois »[1] passait par ici et écrivait 500 fois le même commentaire toutes les 30 secondes, depuis la même IP.
Facile à bloquer avec une règle IP table du type :

iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP

Jusque là, ça reste gentillet, les filtres font leurs taf, on trie les faux-positifs, ça se gère tranquillement sans perte de temps (quelques vingtaines par semaines).
Puis ça se corse !

  • Ces mêmes « chinois » reviennent mieux armés, dans le sens où cette fois, après un ban iptables, ils reviennent avec une IP différentes, mais faisant partie de la même plage.

Un simple commande whois sur cette IP donne la plage dédiée au spammeur, et hop, un iptables manuel sur la plage… Oui c'est pas bien, mais ça défoule ^^; D'autant plus que d'autres viennent avec des plages différentes, et avec les contenu de spam et les fausse adresses mail utilisées on se doute que ce sont les mêmes gus.

iptables -I INPUT -p tcp --dport 80 -m iprange --src-range xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx -j DROP

Au bout de quelques ban manuel on finit par avoir la paix… Sauf que !
On se rend alors compte que ces salopiots ont cochés la case mise à disposition par le plugin dotclear bien pratique pour le visiteur humain, subscribeToComments 1.4-alpha1 servant à s'abonner au commentaire pour être prévenu par e-mail d'une réponse à ce commentaire.
Et là, c'est une autre affaire, car on se retrouve avec des tonnes d'abonnements bidons dans la page de gestion du plugin, et presqu'autant de mailer-daemon témoignant de l'échec d'envoi des e-mails de notifications… vu que les spammeurs rempilent derrière leurs propres spam, alors même qu'il se sont vu filtrés par le filtre Antispam et que donc leurs spam ne sont pas publiés.

  • Depuis quelques temps ces « chinois » me laissent tranquille, mais une nouvelle sorte de spammeur à débarqué… Les Zombies !

Vu la nature de ces spams, j'imagine qu'il s'agit de PC Windaube infectés de virus spammeur qui partagent une base de données avec mon IP publique dedans !
En effet, contrairement aux «chinois », ces spams débarquent du monde entier, avec des contenus plus ou moins du même genre, et des adresses e-mail dans un style différent et plus élaborées. Impossible ici de s'amuser à bannir les IP à la main avec dans les 60 spams par jours, ni à chopper les plages IP, car cette fois on est susceptible de réellement bloquer des visiteurs légitimes !
Ho, les filtres Antispam de dotclear font toujours bien le travail, mais il devient pénible de trier à la main les faux-positif et de nettoyer les abonnement aux commentaires… De fait et a regret, j'ai donc dû prendre la décision de désactiver subscribeToComments rendant le suivit des commentaires inexistant pour les visiteurs.
Voyous de publicitaires $#ø%@'&€…



Il est donc temps d'étudier une solution automatique pour bannir ces IP malignes.

Ça m'entrainera à écrire du script… L'idée ici est donc la suivante,

Toutes les 12 heures :

- Pour les 12 dernières heures écoulées, faire une requête sur la base de donnée de dotclear pour lister toutes les adresses IP des commentaires marqués indésirable par l'Antispam.
- Virer les doublons (car oui, ils reviennent, soit dans les minutes, soit les jours suivants)
- Bannir toutes les IP de cette liste avec iptables.
- Écrire un fichier de log horodaté.
- Envoyer le fichier de log par e-mail.

#!/bin/bash
 
###################################################
# BANNIR LES SPAMMEURS des commentaires DOTCLEAR #
# À programmer dans crontab toutes les 12h ################
###################################################
# ——————————— #
# Initilisation des variables #
# ——————————— #
 
login=utilisateur				# Le nom d'utilisateur ayant les droits sur la base de donnée.
password=motdepasse		# Le mot de passe associé.
base=blog					# Le nom de la base de donnée.
table=dc_comment			# La table des commentaires.
champ1=comment_spam_filter	# Le champ des commentaires marqués comme filtrés.
champ2=comment_ip			# Le champ de l'IP.
champ3=comment_dt			# Le champ de la date et heure.
condition=dcFilter% 			# Le filtre pour ne conserver que les lignes dont le champ1 commence par : dcFilter.
depuis=$(date -d "12 hour ago" "+%F %T") # La date moins 12 heures.
requete1="SELECT $champ1,$champ2,$champ3 FROM $base.$table WHERE $champ1 LIKE 'dcFilter%' AND $champ3 BETWEEN '$depuis' AND now()"
 
# ———— #
# Fonctions #
# ———— #
 
bannir () {					# Bannir l'adresse IP contenue dans la variable: ip2.
iptables -I INPUT -s $ip2 -j DROP
}
 
# ————————————————————— #
# Requête MYSQL pour réccupérer les IP à bannir #
# ————————————————————— #
 
# mysql -uutilisateur -pmotdepasse -e "SELECT comment_spam_filter,comment_ip,comment_dt FROM blog.dc_comment WHERE comment_spam_filter LIKE 'dcFilter%' AND comment_dt BETWEEN '2013-02-08 20:01:30' AND now()";
 
mysql -u$login -p$password -e "$requete1" | while read spamfilter ip date		# Lire la requête mysql ligne par ligne et récupérer les valeurs de chaque champs pour les affecter respectivement aux variables: spamfilter ip date.
						do
							if [ "$ip" = "comment_ip" ]; then		# Si la variable: ip, contient le mot: comment_ip, Alors.
								echo "comment_ip" > /dev/null	# L'envoyer au trou noir !
							else								# Sinon,
								echo  "$ip"					# Appeler successivement la valeur de la variable: ip.
							fi
						done | sort -u > /tmp/dc_spam.tmp		# Stocker les ip dans le fichier tmp en supprimant les doublons.
# —————————— #
# Bannir les IP récoltées #
# —————————— #
 
date '+%Y-%m-%d %X' >> /var/log/dc_BannedIP.log			# Écrit la date dans le fichier log: dc_BannedIP.log.
echo -e "\n" >> /var/log/dc_BannedIP.log						# Saute une ligne dans le fichier log: dc_BannedIP.log.
 
if [ -s /tmp/dc_spam.tmp ]; then								# Si le fichier tmp n'est pas vide.
	while read ip2										# Lire le fichier: tmp, ligne par ligne.
	do
		echo "$ip2"                  								# Appeler successivement la valeur de la variable: ip2.
		bannir   	 	                     							# Appeler la fonction: bannir.
	done < /tmp/dc_spam.tmp >> /var/log/dc_BannedIP.log		# Ajouter la liste des IP que l'on vient de bannir dans le fichier log: dc_BannedIP.log
	echo -e "———————————————————" >> /var/log/dc_BannedIP.log	# Écrit une ligne horizontale dans le fichier log: dc_BannedIP.log.
else
	echo "aucune IP à bannir" >> /var/log/dc_BannedIP.log		# Sinon, ne rien faire.
	echo -e "———————————————————" >> /var/log/dc_BannedIP.log	# Écrit une ligne horizontale dans le fichier log: dc_BannedIP.log.
fi
 
# ————————————— #
# Envoie d'un email avec le log #
# ————————————— #
 
mutt -s "IP Bannies pour Dotclear" admin@mondomaine.org -a /var/log/dc_BannedIP.log < /root/scripts/emailmessage.txt

Note

[1] le whois indique des IP depuis la Chine…

dimanche, 4 juillet 2010

Automatiser des tâches avec Gimp

Je vous livre ici la méthode qui me permettra de gagner du temps lors de longues séries de scan !
Sauf que j'ai dû investir beaucoup de temps pour chercher, trouver, avoir cru comprendre, re…rechercher, et finir par comprendre… J'y aurai passé la journée !!
Mais le retour sur cet investissement devrait être plus que positif rapidement ^^

Pour la petite histoire, jusqu'à maintenant, lorsque je scannais des pages, je faisais une pré-numérisation, suivie d'un cadrage.
Ensuite, le scan à 300dpi… long, avec le Lexmark.
Une fois l'image débarquée dans Gimp, je re-cadrais l'image au pixel prés, puis j'appliquais un flou gaussien (Horizontal 1, Vertical 1, RLE), afin d'atténuer la trame d'imprimerie.
Et enfin, Enregistrement de l'image en JPEG à 85% de qualité, en lui donnant le nom adéquat.
J'arrivais à gagner un peu de temps en faisant la pré-num d'une autre page durant les opérations avec Gimp pour la précédente… mais que de temps perdu !!

Maintenant, ça se déroulera de cette manière :

  1. Scan directement de la page à la taille maximale,[1] en demandant à Xsane d'enregistrer les images avec un schéma de nom de fichier prédéfini, en incrémentant de 1 le N° à chaque nouveau scan. (Qualité du JPEG renseignée dans le paramètres par défaut à 100%)
  2. Une fois toutes les pages scannées, exécution d'une commande Gimp qui va se charger d'appliquer le flou gaussien à l'ensemble des fichiers, en les enregistrant en JPEG 85%.

Et… c'est tout :) Moins de cliques de souris et plus rapide avec le scanner hp !

Bref, voici donc comment faire :

  • On va demander à Gimp d'appliquer un flou gaussien (Horizontal 1, Vertical 1, RLE) sur tous les fichiers JPEG d'un dossier, grâce à un Script-fu.

Créer un fichier texte contenant ceci :

(define (flou-pour-joypad pattern
                          Horizontal
                          Vertical
                          RLE) ;définition de la fonction avec les variables demandées dans la commande

	(let* ((filelist (cadr (file-glob pattern 1))))
		(while (not (null? filelist))

	(let* ((filename (car filelist))
		(image (car (gimp-file-load RUN-NONINTERACTIVE filename filename))) ; chargement de l'image
		(drawable (car (gimp-image-get-active-layer image)))) ;on récupère le calque actif
		(plug-in-gauss RUN-NONINTERACTIVE image drawable Horizontal Vertical RLE) ;Flou gaussien     

		(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename) ;on sauve
		(gimp-image-delete image))
		(set! filelist (cdr filelist)))))

L'enregistrer dans le dossier «scripts» de Gimp (le nom du fichier importe peu, c'est flou-pour-joypad qui servira…)
Chez moi c'est : /home/makoto/.gimp-2.6/scripts/flou-joypad.scm

  • Puis on va appeler ce script par une commande depuis un terminal.

Se placer dans un dossier de test, avec quelques images JPEG, et exécuter :

gimp -i -b '(flou-pour-joypad "*.jpg" 15 15 1)' -b '(gimp-quit 0)'

Il doit être renvoyé ceci lorsque l'opération est achevée.

batch command executed successfully

Aller voir les images, elles doivent être bien floue !

gimp-save.png Les fichier auront été sauvés en JPEG 85% à condition que ce soit la valeur par défaut de votre Gimp!!!!






Pour encore se faciliter la vie, on pourra cliquer sur ce petit script pour lancer cette opération de «GIMP Batch Mode» où «traitement par lot» sans taper de commande.
Créer un fichier gimp-joypad, avec ça dedans :

#!/bin/bash
gimp -i -b '(flou-pour-joypad "*.jpg" 1 1 1)' -b '(gimp-quit 0)'

Ne pas oublier de rendre le fichier exécutable !
Changer les valeurs numériques, pour personnaliser l'effet, respectivement : Valeur Horizontal, Valeur Vertical, 1=RLE 0=IIR)



J'aurais donc trouvé un modèle qui Marche ! depuis ce lien http://www.gimp.org/tutorials/Basic_Batch/, malgré de nombreux essais depuis d'autres sites…
Avec cela j'ai fini par comprendre, alors que J'ai passé des heures à me demander pourquoi la commande me renvoyait toujours :

batch command experienced an execution error

Qu'elle avait besoin qu'on lui passe les valeurs numériques, et que les mettre dans le scrip-fu ne fonctionnait pas… enfin, quelque chose comme ça ^^; c'est qu'en 8 heures de bidouilles il s'en passe des trucs !

Note

[1] plus besoin de recadrer, les magazines suivant sont un peu plus grand que du A4

dimanche, 20 juin 2010

Enregistrer périodiquement une émission de WebRadio

Il y a des heures où passent de bonnes émissions sur le web, mais on n'est pas toujours disponible à ces moments… voire pire, on ne dispose pas du matériel informatique adéquat, puisqu'il n'est pas possible d'écouter avec un poste radio.

Ma solution consiste donc à enregistrer le flux de mon choix, à heure fixe, grâce à un ordi connecté 24/24, en l'occurrence, mon serveur web, afin de récupérer les fichiers et les coller dans mon lecteur de poche ou simplement écouter sur un ordi…

On va utiliser mplayer (apt-get install mplayer) et se baser sur les commandes types données sur ce site pour écrire ce script :

/home/makoto/scripts/ScriptRadio.sh

#!/bin/sh
DATE=$(date +%d-%m-%y)

mplayer -dumpstream -dumpfile /home/makoto/Radio/emission-$DATE.mp3 -nocache -playlist http://81.136.235.140:8000/stream.mp3.m3u

Le rendre exécutable par

$ chmod +x /home/makoto/scripts/ScriptRadio.sh

Puis automatiser la tâche en ajoutant dans crontab

# vi /etc/crontab
# m h dom mon dow user	command
# ScriptRadio pour enregistrer le dimanche de 10h30 à 12h
30 10   * * sun  makoto /home/makoto/scripts/ScriptRadio.sh
1  12   * * sun  makoto killall mplayer


Toutes les semaines on retrouve alors un nouveau fichier avec la date du jour :
/home/makoto/Radio/emission-06-06-10.mp3
/home/makoto/Radio/emission-13-06-10.mp3
/home/makoto/Radio/emission-20-06-10.mp3

page 2 de 2 -