No real major changes but : filesize is now displayed in main window hability to open multiple files via "File" menu log now scrolls down automatically stat window now remembers last used directory (when saving images) and has overwrite confirmation What's next ? I will try to...
La réflexion commence. Vous pouvez nous aider à choisir un thème et à le concrétiser.
Just a reminder, we are approaching the June 29th deadline for WASL, http://www.systemloganalysis.com/
Il existe plusieurs solutions pour afficher des notifications locales lorsque vous recevez des messages sur votre irssi distant.
Ne souhaitant pas mettre en place une solution necessitant l'installation de paquets relatifs à X sur mon serveur, je me suis tourné vers une solution utilisant un petit script perl int&eagré à irssi et d'un autre petit script sur le poste client qui se chargera d'afficher les notifications sur le bureau.
use strict;
use Irssi;
sub priv_msg {
my ($server,$msg,$nick,$address,$target) = @_;
filewrite($nick." " .$msg );
}
sub hilight {
my ($dest, $text, $stripped) = @_;
if ($dest->{level} & MSGLEVEL_HILIGHT) {
filewrite($dest->{target}. " " .$stripped );
}
}
sub filewrite {
my ($text) = @_;
open(FILE,">>$ENV{HOME}/.irssi/notifications_log");
print FILE $text . "\n";
close (FILE);
}
Irssi::signal_add_last("message private", "priv_msg");
Irssi::signal_add_last("print text", "hilight");
Ce bout de code logguera vos messages privés dans le fichier ~/.irssi/notifications_log
#!/bin/sh
ssh user@host.tld tail -F -n1 ~/.irssi/notifications_log | while read heading message
do notify-send -i gtk-dialog-info -t 300000 -- "${heading}" "${message}"
done
Vivez les JDLL
En attendant les informations concernant 2009, celles de 2008 donnent une idée de ce que sont les JDLL.
Cela faisait un moment que je n'avais plus posté sur iMotion, en août dernier apparemment !
J'ai repris le code pour y ajouter le support des fichiers vidéos. Je butais depuis un moment sur un problème de fige de la vidéo lors du changement d'un effet pendant la lecture, problème que je n'ai pas avec la webcam. Cette technique de changement dynamique d'un élément lors de la lecture dans le pipeline est uniquement documenté ici : cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt#n112 mais je n'ai pas trouvé de soft qui l'implémente ...
Premièrement j'avais oublié l'indication 8 :
8) make sure element4 is in the same state as the rest of the elements. The element should at least be PAUSED.
Mon pipeline est en statut PLAYING donc en passant l'élément effect dans ce statut le problème de fige de la vidéo a été résolu.
Deuxièmement le schéma de la documentation montre un pipeline de 3 éléments (plus un 4 ème qui remplace dynamiquement le 2ème). Or cela m'a induis en erreur car le mien en possède 6 :
Lorsque la documentation indique de bloquer l'élément 1 il s'agit en fait de l'élément qui précède celui que l'on veut remplacer. Dans iMotion je souhaite changer dynamiquement d'effet donc c'est l'élément 4 qui doit être bloqué.
Pour ceux qui débutent avec GStreamer voici une excellente présentation : blog.nicolargo.com/2009/03/gstreamer-la-theorie.html
Voici une capture d'écran avec l'effet edgetv suivie de l'implémentation correcte du code :

void
VideoManager::switch_effect (Glib::ustring a_name)
{
m_effect_name = a_name;
bool res = false;
GstEvent *event;
// replay pipeline if it paused
gst_element_get_state(m_pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
gst_element_set_state (m_pipeline, GST_STATE_PLAYING);
// wait until pipeline playing
if (gst_element_get_state (m_pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE) {
std::cout << "Failed to go into PLAYING state" << std::endl;
exit(1);
}
std::cout << "PLAYING state" << std::endl;
GstPad *videoscale_sink_pad = gst_element_get_static_pad (m_videoscale, "sink");
GstPad *videoscale_src_pad = gst_element_get_static_pad (m_videoscale, "src");
if (videoscale_src_pad) {
res = gst_pad_set_blocked_async (videoscale_src_pad, TRUE, (GstPadBlockCallback) block_callback, m_pipeline);
std::cout << "blocked pad : " << res << std::endl;
if (!res) {
std::cout << "can not block source pad : " << res << std::endl;
exit (1);
} else {
std::cout << "blocked source pad : " << res << std::endl;
}
}
else {
std::cout << "can not get source pad : " << res << std::endl;
exit (1);
}
if (m_effect)
{
GstPad *effect_sink_pad = gst_element_get_static_pad (m_effect, "sink");
GstPad *effect_src_pad = gst_element_get_static_pad (m_effect, "src");
// remove effect element
gst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);
gst_element_set_state (m_effect, GST_STATE_NULL);
gst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);
if (gst_element_get_state (m_effect, NULL, NULL, GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE) {
std::cout << "Failed to state null on m_effect" << std::endl;
exit(1);
}
gst_element_unlink_pads (m_videoscale,
"src",
m_effect,
"sink");
std::cout << "UNLINK PAD" << std::endl;
/************ seems to not be usefull ************/
gst_pad_add_event_probe (effect_src_pad, G_CALLBACK (source_pad_event_probe), effect_src_pad);
event = gst_event_new_eos ();
gst_pad_send_event (effect_sink_pad, event);
gst_object_unref (effect_sink_pad);
std::cout << "SEND EOS" << std::endl;
/**************************************************/
gst_element_unlink_pads (m_effect,
"src",
m_sink,
"sink");
std::cout << "UNLINK PAD 2" << std::endl;
gst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);
gst_bin_remove (GST_BIN (m_bin), m_effect);
std::cout << "GST BIN REMOVED" << std::endl;
}
else
{
gst_element_unlink_pads (m_videoscale,
"src",
m_sink,
"sink");
}
if ( m_effect_name != "none")
{
m_effect = gst_element_factory_make (m_effect_name.c_str(), "effect");
gst_bin_add (GST_BIN (m_bin), m_effect);
gst_element_link_pads (m_videoscale,
"src",
m_effect,
"sink");
gst_element_link_pads (m_effect,
"src",
m_sink,
"sink");
// Indication 8
gst_element_set_state (m_effect, GST_STATE_PLAYING);
std::cout << "new effect and linked in" << std::endl;
}
else
{
gst_element_link_pads (m_videoscale,
"src",
m_sink,
"sink");
m_effect = 0;
std::cout << "no effect" << std::endl;
}
if (videoscale_src_pad) {
res = gst_pad_set_blocked_async (videoscale_src_pad, FALSE,(GstPadBlockCallback) block_callback, m_pipeline);
gst_object_unref (videoscale_src_pad);
}
std::cout << "unblocked source pad : " << res << std::endl;
std::cout << m_effect_name << std::endl;
}
Les journées du libres se préparent
You can find the slides for the lecture Philippe and I gave at Eicar for download.
Enjoy! (feedback greatly appreciated)
Heraia - 0.0.9 is out since 19 may 2009 !
The paper Philippe and I wrote for Eicar is now available for download.
Bourreau-TF1 : Le cabinet d'Albanel voulait bien la tête de l'employé ! - Numerama
Le Canard Enchaîné daté de ce mercredi a pu mettre la main sur le mail envoyé par le cabinet de Christine Albanel à la direction de TF1. Il est accablant pour la ministre :
"Bonjour, Jean-Michel, vous avez des salariés qui, manifestement, aiment tirer contre leur camp. Cordialement"
Pour rappel :
Interrogée hier à l'occasion des questions au gouvernement, Christine Albanel avait indiqué que l'e-mail avait été envoyé à TF1 "sans aucune demande de sanction, mais pour information". Une drôle de manière d'informer.
I am in Prague until next Monday. Between city tours, Picviz hacking, slides writing for Eicar and working on my Picviz paper for the Journal of Computer Virology let's meet up!
just drop me an email.
Lionel Tardy première victime de la riposte graduée ... : Lionel TARDY
Sachant que l'examen en seconde lecture du projet de loi Création et Internet (Hadopi) reprenait aujourd'hui, je m'étais inscrit (par précaution) dès la semaine dernière auprès du groupe UMP pour intervenir lors de la DG (Discussion Générale) de cet après-midi.
N'ayant pas de nouvelle du groupe, je me suis rapproché du service de la séance en fin de matinée, qui m'a appris que ma demande n'avais pas été retenue par le groupe UMP, faute de temps de parole suffisant (20 minutes au total).
DeputesGodillots.info est un site communautaire qui vise à recenser les pratiques godillotes de certains députés de la majorité afin de permettre au président du groupe UMP de réaliser sa promesse de mettre fin à la notion de parlement godillot.
The honeynet project had several projects, 8 in total. They were all carefully chosen and I had the honor to have Picviz as one of those projects.
I really believe parallel coordinates will greatly improve the data analysis area, and it seemed I was not the only one to think so.
You can check out some very cool projects that also got selected. This is a great opportunity for us, even though we had really hard time to reject other great projects.
Anyway, because they will work intensively in Python, I completely rewrote the bindings, and I even documented it!
Ah, I forgot, do you know that sometime challenges that some people do in some Chinese restaurants can be found simply using 'strings' and reading the enigma in the end of a binary?
It's been a while I haven't blogged. There we go... quite some random late things
Hadopi: couacs autour de la pétition des 10 000 artistes - l'Express
Sur les 10 000 signataires, le collectif a relevé plusieurs incohérences.
- Des centaines d'employés des maisons de disques (EMI, Universal...) et leurs représentants (Sacem, Snep...) qui n'ont pas de rapport direct avec les artistes ont signé la pétition. Ils représentent une part importante du total des signataires.
- Des artistes ouvertement hostiles au projet de loi figurent dans la liste, comme Marc Cerrone.
- Nicola Sirkis du groupe Indochine affirme sur son site Internet ne pas avoir signé cette pétition alors qu'il est listé dans les 10 000 signataires
Manifestation contre HADOPI : samedi 25 Avril
La loi HADOPI, votée le 2 Avril 2009, rejetée par les Députés le 9 Avril 2009, réintroduite par la porte des cabinets le 28 Avril 2009 comprend des dispositifs liberticides :
* Le réseau Internet français sera mis sur écoute, façon Big-Brother.
* Des logiciels mouchards payants seront disponibles pour prouver la bonne foi des internautes.
* Il revient à chaque individu la charge de la preuve qu'il respecte la loi, en contradiction avec les principes de droit établis depuis 200 ans.
L'impensable est arrivé, ouvrant la voie à une régression des libertés publiques. Cette régression montre que les libertés ne sont jamais acquises et qu'il faut toujours être vigilant à les défendre. Pour vous en convaincre, regardez les vidéos des discussions de la loi HADOPI à l'Assemblée Nationale .
Nous organisons une manifestation unitaire des opposants à la loi HADOPI le 25 Avril 2009 à 14 heures, place Edouard Herriot à Paris. Des manifestations sont en cours d'organisation à Lyon et à Marseille. Nous n'avons que 16 jours pour boucler le projet. Les manifestations seront organisées avec le plus grand soin.
Afin d'illuster mes propos, je vais utiliser un exemple avec une table "fruits" contenant quelques enregistrements :
+--------+------------+-------+ | type | variete | prix | +--------+------------+-------+ | pomme | gala | 2.79 | | pomme | fuji | 0.24 | | pomme | Borowitsky | 2.87 | | orange | valencia | 3.59 | | orange | navel | 9.36 | | poire | bradford | 6.05 | | poire | bartlett | 2.14 | | cerise | bing | 2.55 | | cerise | chelan | 6.33 | +--------+------------+-------+
+--------+----------+-------+ | type | variete | prix | +--------+----------+-------+ | pomme | fuji | 0.24 | | orange | valencia | 3.59 | | poire | bartlett | 2.14 | | cerise | bing | 2.55 | +--------+----------+-------+
SELECT type, MIN(prix ) AS minprix
FROM fruits
GROUP BY type;
+--------+----------+
| type | minprix |
+--------+----------+
| pomme | 0.24 |
| cerise | 2.55 |
| orange | 3.59 |
| poire | 2.14 |
+--------+----------+
SELECT f.type, f.variete, f.prix
FROM (
SELECT type, MIN(prix ) AS minprix
FROM fruits GROUP BY type
) as x INNER JOIN fruits AS f ON f.type = x.type AND f.prix = x.minprix ;
+--------+----------+-------+
| type | variete | prix |
+--------+----------+-------+
| pomme | fuji | 0.24 |
| cerise | bing | 2.55 |
| orange | valencia | 3.59 |
| poire | bartlett | 2.14 |
+--------+----------+-------+
SELECT type, variete, prix
FROM fruits
WHERE prix = (SELECT MIN(prix ) FROM fruits AS f WHERE f.type = fruits.type);
+--------+----------+-------+
| type | variete | prix |
+--------+----------+-------+
| pomme | fuji | 0.24 |
| orange | valencia | 3.59 |
| poire | bartlett | 2.14 |
| cerise | bing | 2.55 |
+--------+----------+-------+
SELECT type, variete, prix
FROM fruits
WHERE (
SELECT COUNT(*) FROM fruits AS f
WHERE f.type = fruits.type AND f.prix < fruits.prix
) <= 2;
+--------+----------+-------+
| type | variete | prix |
+--------+----------+-------+
| pomme | gala | 2.79 |
| pomme | fuji | 0.24 |
| orange | valencia | 3.59 |
| orange | navel | 9.36 |
| poire | bradford | 6.05 |
| poire | bartlett | 2.14 |
| cerise | bing | 2.55 |
| cerise | chelan | 6.33 |
+--------+----------+-------+
(SELECT * FROM fruits WHERE type = 'pomme' ORDER BY prix LIMIT 2)
UNION ALL
(SELECT * FROM fruits WHERE type = 'orange' ORDER BY prix LIMIT 2)
UNION ALL
(SELECT * FROM fruits WHERE type = 'poire' ORDER BY prix LIMIT 2)
UNION ALL
(SELECT * FROM fruits WHERE type = 'cerise' ORDER BY prix LIMIT 2)
set @num := 0, @type := '';
SELECT type, variete, prix
FROM (
SELECT type, variete, prix ,
@num := if(@type = type, @num + 1, 1) AS row_number,
@type := type AS dummy
FROM fruits
ORDER BY type, prix
) AS x WHERE x.row_number <= 2;
Cette requete s'effectue au final en 2 passes, la sous-requetes construisant implicitement une table remplie avec les données sur lesquelles on applique tour à tour la clause WHERE.
Après etre tombé sur un article traitant des nouvelles fonctionnalités de la dernière version de la Google Toolbar, j'ai pris conscience de la nécéssité de mettre en place des pages 404 personnalisées.
En effet toutes les pages pesant moins de 512 octets seront remplacées par une page Google contenant un champ de recherche qui risque de rediriger votre traffic sur un autre site.
Assez blablaté passons à la customization de vos pages, la procédure est tres simple :
Editer le fichier de conf de lighttpd :
# vim /etc/lighttpd/lighttpd.conf
Rajoutez la ligne suivante :
server.error-handler-404 = “/404-handler.html”
NB : il est bien sur possible de remplacer la page HTML par une page PHP, Perl ...
Il ne reste plus qu'a créer une page 404-handler.html a la racine du serveur puis de relancer lighttpd
# /etc/init.d/lighttpd restart
Je trouve la fonction console.log() très pratique pour debugger sans avoir recours à des alert() à tout va. Le problème c'est qu'il est très facile d'oublier un appel à cette fonction quelque part dans le code, résultat tous les browsers ne disposant pas de firebug installé planteront lors de l'execution. Voilà une solution permettant de bypasser ce problème :
<script type="text/javascript">
if (typeof console != "object") {
var console = {
'log':function() {}
};
}
</script>
Le coup de théâtre à l'Assemblée en images - LCI
le texte .. est re-je-té
sous les applaudissements des députés de l'opposition
HADOPI - projet de loi inadapté, inacceptable, inapplicable, d'ores et déjà dépassé
L'April dénonce le vote du projet de loi HADOPI qui contient des dispositions qu'il était impensable de voir écrites un jour noir sur blanc tant elles sont extrémistes. Non content de se positionner de façon unilatérale en faveur d'une centralisation de l'information sur Internet, ce projet de loi instaure en plus de nouvelles discriminations contre le logiciel libre.
L'Assemblée nationale a adopté 1 le projet de loi HADOPI mettant en place une procédure disproportionnée de répression massive à l'encontre des internautes qui échangent des \u0153uvres sans autorisation. Le projet de loi ne propose rien pour favoriser la mise à disposition du public d'offres commerciales attractives de musique et de films.
La ministre de la Culture Christine Albanel, le rapporteur Franck Riester et presque tous les députés UMP ont validé de nouvelles discriminations à l'encontre du Logiciel Libre. Malgré la mobilisation des employeurs du Libre contre HADOPI 2, ils ont refusé tout encadrement des mouchards filtrants que les abonnés devront installer pour garantir leur sécurité juridique. Ils se sont également opposés à toute mesure favorable à l'interopérabilité et à la libre concurrence, et ont persisté à limiter le droit moral de divulgation des auteurs de logiciels libres 3.
A peine votée, Hadopi pose des problèmes - Le Figaro
«L'État n'a pas à faire peser financièrement sur les opérateurs les coûts d'une mission d'intérêt général étrangère à l'activité de ces mêmes opérateurs», a réagi jeudi la fédération française des télécoms. Un principe consacré par une décision du Conseil constitutionnel du 28 décembre 2000. «Il reviendra donc à l'État d'assumer les coûts très lourds afférents à la mise en oeuvre de l'ensemble du dispositif», poursuit la fédération. La facture sera lourde : à elle seule, la refonte des systèmes informatiques et de facturation nécessaires pour couper l'accès des abonnés, se chiffre déjà à 70 millions d'euros !
«Est-ce aux consommateurs de sauver une industrie en déclin parce qu'elle n'a pas su s'adapter à la nouvelle donne technologique et élaborer un nouveau modèle économique ?», s'interroge l'association de défense des consommateurs Adeic. Et de dresser une longue liste à la Prévert des taxes déjà collectées et reversées aux ayants droit : taxes sur les CD, RW et DVD ; taxes sur les mémoires et disques durs intégrés à un téléviseur ; taxes sur les clés USB ; taxes sur les téléphones mobiles multimédias ; taxes sur les cartes mémoires etc.
Hadopi: la suspension de la connexion Internet est confirmée par les députés sur 20minutes.fr
Marc Le Fur, député UMP: «Nous nous battons tous pour que nos communes rurales ait un accès Internet et nous allons le supprimer pour certaines familles.»
Réponse de Franck Riester: «L'internaute sanctionné pourra se rendre chez son voisin grâce à la solidarité des campagnes.»
Working on various web projects, there's a very well known problem : find a good regular expression (regexp) to check the validity of user submitted email addresses.
This website has compiled various regular expressions which try to resolve this problem. His idea is great, using a set of valid/invalid emails, and a simple unit test, he can provide a good comparison of some of the most used regexps.
His philosophy is great : "It's my philosophy that it's better to accept a few invalid addresses than reject any valid ones, so I'm shooting for 0 false-positives and as few false-negatives as possible."
But I've noticed 2 problems :
/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9]([-a-z0-9_]?[a-z0-9])*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z]{2})|([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3})(:[0-9]{1,5})?$/i
Here are the results :
Should be Valid:
| l3tt3rsAndNumb3rs@domain.com | ![]() |
| has-dash@domain.com | ![]() |
| hasApostrophe.o'leary@domain.org | ![]() |
| uncommonTLD@domain.museum | ![]() |
| uncommonTLD@domain.travel | ![]() |
| uncommonTLD@domain.mobi | ![]() |
| countryCodeTLD@domain.uk | ![]() |
| lettersInDomain@911.com | ![]() |
| underscore_inLocal@domain.net | ![]() |
| IPInsteadOfDomain@127.0.0.1 | ![]() |
| IPAndPort@127.0.0.1:25 | ![]() |
| subdomain@sub.domain.com | ![]() |
| local@dash-inDomain.com | ![]() |
| dot.inLocal@foo.com | ![]() |
| a@singleLetterLocal.org | ![]() |
| singleLetterDomain@x.org | ![]() |
| &*=?^+{}'~@validCharsInLocal.net | ![]() |
Should be NOT Valid :
| missingDomain@.com | ![]() |
| @missingLocal.org | ![]() |
| missingatSign.net | ![]() |
| missingDot@com | ![]() |
| two@@signs.com | ![]() |
| colonButNoPort@127.0.0.1: | ![]() |
![]() |
|
| WrongIpAddr@256.10.12.154 | ![]() |
| someone-else@127.0.0.1.26 | ![]() |
| .localStartsWithDot@domain.com | ![]() |
| localEndsWithDot.@domain.com | ![]() |
| two..consecutiveDots@domain.com | ![]() |
| domainStartsWithDash@-domain.com | ![]() |
| domainEndsWithDash@domain-.com | ![]() |
| TLDDoesntExist@domain.moc | ![]() |
| numbersInTLD@domain.c0m | ![]() |
| missingTLD@domain. | ![]() |
| ! "#$%(),/;<>[]`|@invalidCharsInLocal.org | ![]() |
| invalidCharsInDomain@! "#$%(),/;<>_[]`|.org | ![]() |
| local@SecondLevelDomainNamesAreInvalidIfTheyAreLongerThan64Charactersss.org | ![]() |
Results :
Valid : 18/18
Invalid : 19/20
I'm very happy with this solution for a lot of points : it is a portable one (usable on client-side via JS, or server side with languages providing PCRE functions), it does deep TLD and IP address check. If you want to add an other TLD (more than 2 chars long), just append it to the list.
I'm working on a solution to check the length of the address. Based on the RFC, an email should be composed like that :