Yoann Sculo - Ingénieur Linux Embarqué http://yoannsculo.fr Yoann Sculo - Blog d'un Ingénieur Linux Embarqué 2012-05-07T00:00:00Z fr hourly 1 Le protocole SHOUTcast, introduction et décorticage http://yoannsculo.fr/protocole-shoutcast-introduction-et-decorticage 2012-05-07 http://yoannsculo.fr/protocole-shoutcast-introduction-et-decorticage SHOUTcast protocol

Gros utilisateur des webradios du site di.fm depuis de nombreuses années, je me suis penché il y a quelques temps sur le protocole SHOUTcast utilisé par un certain nombre de radios pour streamer du flux audio mp3 par HTTP.

Les spécifications du protocole créé par Nullsoft (Winamp) ne sont pas clairement définies, ni vraiment publiques. La documentation à ce sujet est assez rare et relève plutôt du reverse engineering et de la bidouille avec Wireshark :) Je me suis amusé à programmer une application qui parse et enregistre les flux SHOUcast, SHOUTcast Recorder. Aujourd’hui je profite de mon expérience sur le sujet pour regrouper un peu toutes les informations que j’ai trouvé sur ce protocole.

Je tiens tout d’abord à préciser que je ne garantis pas l’exactitude à 100% des informations qui vont suivre. Pour comprendre le fonctionnement de SHOUTcast, je me suis basé sur les sources de clients classiques, tels que mplayer, vlc mais aussi sur différents forums et le peu de documents que j’ai pu repérer sur Internet. Si vous détectez la moindre erreur ou inexactitude dans mes propos, n’hésitez pas à m’en faire part, que je corrige mon article en conséquence.

Le protocole

SHOUTcast, initialement appelé I Can Yell (ICY), est donc le protocole utilisé pour streamer du son ainsi que, par la même occasion, différentes informations textuelles sur le flux en question. Les clients et serveurs SHOUTcast sont disponibles sur un certain nombre de plateformes. Mais je vais surtout m’intéresser ici au protocole en lui même.

Premier pas

SHOUTcast n’est autre que de la musique transmise par HTTP. Il suffit d’envoyer une simple requête HTTP pour initier la connexion.

Avant toute chose, le serveur va nous renvoyer dans son header HTTP différentes informations textuelles sur le flux.

Essayons avec la radio Chillout de di.fm, mais vous en trouverez d'autres sur Shoutcast.com.

curl http://scfire-ntc-aa04.stream.aol.com:80/stream/1035 | head

nous retourne

ICY 200 OK
icy-notice1: <BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2: Firehose Ultravox/SHOUTcast Relay Server/Linux v2.6.0<BR>
icy-name: Chillout - D I G I T A L L Y - I M P O R T E D - ambient psy chillout, check out our trippy flavors!
icy-genre: Electronic Chillout Ambient
icy-url: http://www.di.fm/chillout
content-type: audio/mpeg
icy-pub: 1
icy-br: 96

ou plus en détail :

curl http://scfire-ntc-aa04.stream.aol.com:80/stream/1035 | hexdump -c | head -c 2400

qui nous renvoie :

00000000  49 43 59 20 32 30 30 20  4f 4b 0d 0a 69 63 79 2d  |ICY 200 OK..icy-|
00000010  6e 6f 74 69 63 65 31 3a  20 3c 42 52 3e 54 68 69  |notice1: <BR>Thi|
00000020  73 20 73 74 72 65 61 6d  20 72 65 71 75 69 72 65  |s stream require|
00000030  73 20 3c 61 20 68 72 65  66 3d 22 68 74 74 70 3a  |s <a href="http:|
00000040  2f 2f 77 77 77 2e 77 69  6e 61 6d 70 2e 63 6f 6d  |//www.winamp.com|
00000050  2f 22 3e 57 69 6e 61 6d  70 3c 2f 61 3e 3c 42 52  |/">Winamp</a><BR|
00000060  3e 0d 0a 69 63 79 2d 6e  6f 74 69 63 65 32 3a 20  |>..icy-notice2: |
00000070  46 69 72 65 68 6f 73 65  20 55 6c 74 72 61 76 6f  |Firehose Ultravo|
00000080  78 2f 53 48 4f 55 54 63  61 73 74 20 52 65 6c 61  |x/SHOUTcast Rela|
00000090  79 20 53 65 72 76 65 72  2f 4c 69 6e 75 78 20 76  |y Server/Linux v|
000000a0  32 2e 36 2e 30 3c 42 52  3e 0d 0a 69 63 79 2d 6e  |2.6.0<BR>..icy-n|
000000b0  61 6d 65 3a 20 43 68 69  6c 6c 6f 75 74 20 2d 20  |ame: Chillout - |
000000c0  44 20 49 20 47 20 49 20  54 20 41 20 4c 20 4c 20  |D I G I T A L L |
000000d0  59 20 2d 20 49 20 4d 20  50 20 4f 20 52 20 54 20  |Y - I M P O R T |
000000e0  45 20 44 20 2d 20 61 6d  62 69 65 6e 74 20 70 73  |E D - ambient ps|
000000f0  79 20 63 68 69 6c 6c 6f  75 74 2c 20 63 68 65 63  |y chillout, chec|
00000100  6b 20 6f 75 74 20 6f 75  72 20 74 72 69 70 70 79  |k out our trippy|
00000110  20 66 6c 61 76 6f 72 73  21 0d 0a 69 63 79 2d 67  | flavors!..icy-g|
00000120  65 6e 72 65 3a 20 45 6c  65 63 74 72 6f 6e 69 63  |enre: Electronic|
00000130  20 43 68 69 6c 6c 6f 75  74 20 41 6d 62 69 65 6e  | Chillout Ambien|
00000140  74 0d 0a 69 63 79 2d 75  72 6c 3a 20 68 74 74 70  |t..icy-url: http|
00000150  3a 2f 2f 77 77 77 2e 64  69 2e 66 6d 2f 63 68 69  |://www.di.fm/chi|
00000160  6c 6c 6f 75 74 0d 0a 63  6f 6e 74 65 6e 74 2d 74  |llout..content-t|
00000170  79 70 65 3a 20 61 75 64  69 6f 2f 6d 70 65 67 0d  |ype: audio/mpeg.|
00000180  0a 69 63 79 2d 70 75 62  3a 20 31 0d 0a 69 63 79  |.icy-pub: 1..icy|
00000190  2d 62 72 3a 20 39 36 0d  0a 0d 0a 57 0b 2b 21 ff  |-br: 96....W.+!.|
000001a0  9d 6a 9d 35 15 e7 c1 56  c9 b6 54 22 33 b9 ec f5  |.j.5...V..T"3...|
000001b0  63 8f a9 dd 4f 15 79 57  f7 4d 55 3d 34 51 3c cd  |c...O.yW.MU=4Q<.|
000001c0  ae 9c 72 e7 4d c7 13 0e  d7 d8 fc cb 98 f4 b3 59  |..r.M..........Y|
000001d0  1f 48 b3 da b4 24 00 00  01 df c0 0d f3 b1 08 07  |.H...$..........|

Ce header est donc composé de champs icy se terminant tous par un <CR> (\r\n), soit 0d 0a en hexa. Le début du header commence par le code de réponse (similaire à HTTP). Je n’ai pas eu l’occasion de recevoir autre chose que le code 200.

Voici une liste, sans doute non exhaustive, des champs possibles du header.

icy-notice1 et icy-notice2 Informations diverses
icy-name Nom de la radio
icy-genre Genre
icy-url Url de la radio
icy-pub Si le flux est public : 1 ou privé 0
icy-br Bitrate (échantillonnage)
icy-metaint Fréquence d’apparition des packets metadata (voir plus loin)
Content-Type Comme pour HTTP, format du flux
icy-irc Contact irc
icy-icq Contact icq
icy-aim Contact aim (Nullesoft appartient à AOL :p)

La fin du header est marquée par un double <CR>, c'est à dire la chaîne \r\n\r\n, ou autrement dit 0d 0a 0d 0a. Les données brutes mp3 suivent directement après.

Ainsi, une simple redirection de la sortie standard de curl permet d’enregistrer le flux SHOUTcast :

curl http://scfire-ntc-aa04.stream.aol.com:80/stream/1035 > ./out.mp3

Bien sûr, cette solution enregistre également le header, ce qui occasionne un glitch en début de mp3, si vous utilisez cette solution pour enregistrer le flux.

Aller plus loin, les blocs MetaData

Le protocole SHOUTcast permet également de récupérer des informations sur la musique transmise. Il s'agit des MetaData, ce sont des blocs envoyés à intervalles réguliers, qui peuvent contenir un message textuel.

Par défaut, les blocs metadatas ne sont pas transmis. Car en effet, ils sont envoyés directement dans le flux, entre deux blocs de données mp3. Ainsi, s'il on enregistre directement les données issues du serveur, nous avons droit à un flux musical interrompu par de petits glitches réguliers. Le client doit donc prendre en compte ces blocs et les échapper du flux musical.

Donc, c'est au client de demander ces petits paquets magiques, en rajoutant le champ suivant dans la requête HTTP.

Icy-MetaData:1

En rajoutant ce champ à la requête, le serveur nous retourne un champ ICY supplémentaire, icy-metaint. Il s'agit d'un entier correspondant au nombre d'octets séparant 2 blocs metadata. Cette valeur dépend complètement des serveurs, et doit être à tout prix récupérée si l'on souhaite traiter correctement ces blocs.

Par exemple la radio Chillout nous renvoie 16384, la radio Frequence3, quant à elle, 32768.

Isoler les blocs MetaData et les lire

Nous avons donc envoyé au serveur une requête HTTP qui demande les blocs metadata, nous avons reçu un header qui contient le champ icy-metaint que nous avons enregistré. Il faut maintenant compter les octets reçus pour savoir quand les blocs metadata arriveront. Le compte commence dès le premier octet de flux MP3 reçu. C'est à dire, juste après le double <CR> \r\n\r\n.

Une fois le compte atteint, nous tombons sur un bloc metadata. Ce dernier commence par un octet contenant la taille du bloc. Pour avoir la taille en octets du bloc, il suffit de multiplier la valeur de ce premier octet par 16. Il n'y a alors plus qu'à parcourir le bloc, et de reinitialiser le compteur après le dernier octet de metadata reçu. Il n'y a plus qu'à recommencer le compte jusqu'au prochain bloc.

Quand il n'est pas vide, un bloc metadata contient ce genre de chaîne :

StreamTitle='Pete Namlook & Hubertus Held - Missing You';StreamUrl='';

C'est StreamTitle qui nous intéresse ici, il n'y a plus qu'à l'extraire.

Cependant, 98% du temps, les blocs metadata envoyés par le serveur sont vides et contiennent juste un seul octet à 0. Et oui, vu la fréquence d'envoi assez élevée, le serveur n'a pas besoin de nous notifier en permanence le nom de la musique.

En pratique, les serveurs envoient un bloc renseigné de metadata à la connexion, puis à chaque changement de musique. Certains serveurs sont plus bavards que d'autres. Il est même possible de détecter la pub qui est parfois annoncée par metadata !

Voici un schéma qui représente les choses :

SHOUTcast diagram

Utiliser le protocle SHOUTcast

Il existe de très nombreux logiciels pour lire et même enregistrer les flux SHOUTcast. Mais étonnement, je n'ai trouvé que peu de documentation. J'ai avant tout développé SHOUTcast Recorder pour le fun et surtout pour comprendre comment fonctionne le protocole. Dans sa version actuelle, les mp3 sont enregistrés et coupés à la réception des blocs metadata. Malheureusement, les serveurs envoient ces blocs quelques secondes avant le changement de musique, et cette période dépend de chaque radio. Les logiciels d'enregistrement de flux se basent sur le petit blanc dans le signal sonore entre deux musiques pour faire une découpe nette. De mon côté, je n'ai pas encore eu le temps de trouver d'autre solution, ni de m'essayer à implémenter cette technique overkill. Je ferai ça quand j'aurai le temps.

Amusez-vous bien :D

Sources

]]>
Le grand bétisier des recruteurs http://yoannsculo.fr/le-grand-betisier-des-recruteurs 2012-05-01 http://yoannsculo.fr/le-grand-betisier-des-recruteurs Depuis la fin de mes études en 2009, j'ai la chance d'évoluer dans un secteur qui recrute énormément. Et s'il y a bien quelque chose qui m'a marqué depuis ce temps, c'est le marché de l'emploi en informatique.

En bon geek de la génération Y, j'ai utilisé tous les moyens à ma disposition pour rechercher du travail. Blog, LinkedIn, Viadeo, Twitter, Apec, Internet, réseautage, ... Et je souhaitais en faire un petit bilan, tant ce qu'il en ressort est intéressant, si ce n'est ubuesque.

Donc j'ai pris mon courage à deux mains, pour reparcourir les centaines d'offres d'emploi que j'ai reçues depuis ma sortie de l'école pour en faire une petite analyse mais également un joli bétisier, car c'est surtout de ça dont il s'agit :)

Je ne citerai pas les noms de personnes ni de sociétés dont il va être question ici. Mon but n'est pas de faire d'attaques ni de critiques ad hominem mais plus de montrer aux recruteurs à quel point la situation peut être cocasse du point de vue des ingénieurs en recherche d'emploi. Et qui sait, peut-être que des recruteurs liront cet article, et prendront en compte mes remarques :)

Bon et puis j'avais surtout envie de partager avec vous toutes les fois qu'un recruteur m'a bien fait rire.

Avant toute chose, je tiens à préciser que mon profil ne rentre pas forcément dans les cases de tous les recruteurs, ce qui généralement est source de situation cocasse. C'est à dire que je ne souhaite jamais travailler en SSII, que je préfère les PME, et que je suis partisant du libre et de l'open source. Donc difficile de généraliser tant je pense représenter une petite proportions des développeurs du marché français. Mais cela ne change rien au fait que les recruteurs me divertissent en permanence !

Petit bilan rapide des canaux de recrutement

Il existe bon nombre de moyens de se faire recruter, chaque canal a ses avantages et inconvénients. D'autres n'ont que des inconvénients :D

Sites d'emploi en ligne

Monster, lesjeudis, job boards en tous genres, ... Alors ça malheureusement my friend, you are entering a world of pain, a woooorld of pain. On finit enseveli sous les mails de SSII. Si vous avez le malheur !! Le malheur de mettre votre numéro de téléphone, vous êtes fini ! J'ai déjà vu des collègues sortir du bureau toutes les 5 minutes pour recevoir un coup de téléphone à cause de Monster.

Conclusion, je ne vais plus sur ces sites, et je ne communique plus mon numéro de téléphone. De toute façon c'est le repère des SSII :) Il n'y que l'Apec à la limite qui est à peu près utilisable.

Viadeo - Pêche à la dynamite

Viadeo, beaucoup, beaucoup d'offres d'emploi non sollicitées. Malheureusement, peu sont ciblées, c'est ici que je me fais le plus spammer pour des profils qui n'ont aucun rapport avec le mien. Un mot clé, et PAF un mail. J'ai eu quelques offres d'emploi intéressantes par ce biais, mais cela reste rare. Sur Viadeo comme sur les job boards, les recruteurs y pratiquent la pêche à la dynamite.

Viadeo est par contre quasiment excusivement réservé au recrutement en France.

Conclusion, j'y reste car Viadeo est référencé sur Google :D

LinkedIn

A l'inverse de Viadeo, LinkedIn est axé international, j'y reçois des offres du monde entier, parfois les plus intéressantes. Définitivement plus utile que Viadeo pour trouver du travail intéressant.

Twitter

Outil très utile pour la veille technologique et trouver du travail. J'ai reçu à plusieurs reprises des offres intéressantes via Twitter, et j'ai même pu postuler à des offres via cet intermédiaire. Bien pratique !

Blog / site web - Pêche à la mouche

J'ai créé ce blog initialement pour gagner en visibilité sur le net. Cela a fonctionné a merveille, et à vrai dire mon blog reste le principal point d'entrée des recruteurs. Les offres les plus intéressantes sont venues grâce à mon blog, j'ai trouvé mon premier emploi grâce à celui-ci, et je continue à en recevoir.

Réseautage

Les meilleures offres d'emploi arrivent aussi tout simplement par le réseau personnel, anciens collègues, amis, connaissances, etc.

Conclusion

Les sites pour l'emploi et les "canaux classiques" ne servent pas à grand chose dans mon cas malheureusement. Ah ... si ! A remplir mon bétisier ! :D

Bétisier et palmarès

Et voici un florilège des meilleurs emails reçus :

Les emails culottés

Bonjour

Merci de nous rappeler au 06 XX XX XX XX ce jour concernant votre candidature.

Cordialement,


Nous avons étudié avec attention votre récente candidature. Elle correspond aux profils que nous souhaitons intégrer au sein de XXXX.

Alors que je n'ai jamais entendu parler de ces sociétés et bien sûr jamais postulé !

Le recruteur qui ne veut pas perdre son temps

Je me permets de vous contacter suite à un appel offre que j'ai reçu correspondant à votre profil, pourriez vous me contacter s'il vous plaît sur mon numéro de téléphone portable.

Le mail super culotté

Nous nous permettons de vous envoyer une proposition pour un entretien avec notre responsable technique le vendredi 12 novembre à 10h.

Merci de me confirmer votre présence aux date et heure précisées et vous munir de votre CV à jour et copie de vos diplômes le jour de l’entretien (vous trouverez nos coordonnées et accès aux locaux ci-dessous).

Jamais entendu parler de cette société. Je leur ai proposé de faire l'entretien chez moi, ils ne m'ont jamais répondu...

Le recruteur qui veut que je fasse son travail à sa place

En tous cas si, dans vos relations, vous avez des personnes susceptibles d’être intéressées par XXXX, n’hésitez pas à leur transmettre mes coordonnées.

Ca arrive en permanence

Le recruteur qui ne se prend pas la tête à savoir où il a trouvé le CV

J'ai pris connaissance de votre candidature sur le site Monster


Je me permets de vous contacter puisque j’ai eu l’occasion de visionner votre profil sur Monster.

Je ne suis plus inscrit sur Monster depuis des années...

Le recruteur qui ne s'embarrasse pas

Suite à la sélection de votre CV sur un Job Board (Monster, APEC, LesJeudis.com, ...)

Le recruteur fourbe qui croit que ça va passer

J'ai eu votre numéro de téléphone sur votre CV

Je ne mets pas mon numéro sur mon CV...

La demande de CV Word

Pouvez-vous m'envoyer votre CV actualisé sous format word?

Ca me fera toujours sourire ça. La société cherche un expert Linux, à fond dans le Libre et l'Open Source et qui demande un CV au format Word. Je trouve ça vraiment pas mal. C'est pas bien méchant, mais c'est vraiment mal connaître le profil recherché...

Le recruteur éleveur animalier

Monsieur,

Nous avons le plaisir de vous convier à une session de recrutement pour un stage de fin d’études ou pour un poste d’Ingénieur en Technologies de l’Information.

Nous vous proposons de participer à la journée du 15/12/2008 à 09:00h dans nos locaux

Le recruteur qui propose du travail sans en parler

Après avoir consulté votre CV via le site de l’Apec, je tiens à vous informer que vos compétences nous intéressent particulièrement.

Nous avons des postes d’ingénieurs en informatique industrielle à pourvoir en Ile-de-France et notamment sur des projets de conception de matériels embarqués dans le secteur du Transport.

N'hésitez pas à me contacter au 01 XX XX XX XX pour toute demande d'informations supplémentaires.


Bonjour Monsieur,

Je viens de prendre connaissance de votre CV Apec et aimerais m’entretenir avec vous des opportunités de postes que je pourrais vous proposer sur la région de Sophia-Antipolis.

Aussi pourriez-vous m’appeler au 04 XX XX XX XX pour que nous puissions en parler .

Le recruteur original

Bonjour,

Non ceci n’est pas un spam vous promettant de gagner des milliers d’euros, ni une invitation à rejoindre une quelconque chaine de la chance…

Par contre il s’agit bien du énième mail de recruteur intéressé par votre profil…

En espérant qu’il ne se perde pas au milieu de ceux de mes concurrents, je me permets de tenter ma chance.

Vous recherchez un projet motivant sur lequel vous investir..., cela tombe bien, nous recherchons des consultants motivés …

Actuellement, nous aurions des opportunités de postes, que j’aimerais vous détailler de vive voix.

N'hésitez pas à nous contacter afin de nous faire part de vos attentes à court et moyen terme afin que nous puissions ensemble étudier les meilleures opportunités du marché pour vous.

Dans l'attente de votre retour, je vous souhaite une bonne journée

Le recruteur qui joue la carte de la carotte

Autour d'un buffet de cocktail, nous avons l'occasion d'échanger sur l'évolution de nos métiers et de discuter nos projets en commun.

Le recuteur qui se trompe de profil

J'aimerai parler d’une offre qui je pense vous correspond. Je travaille avec des candidats en CDI sur ces technologies: PHP5 (Frameworks), AS3, Flash, Flex, Cms du marché, Python et Ruby & Plateforme mobile.


Nous sommes actuellement à la recherche d'un développeur flash et mobile pour un de nos clients situé à La Ciotat (13) au bord de la mer.


My Client is urgently looking for a PHP Database Engineer with practical experience of database engineering for its new site in Munich, Germany for a 3 month project.


Vous souhaitez faire un bond dans votre carrière ? Vous êtes à l'écoute d'une belle opportunité d'emploi sur .NET

Le meilleur ! ;)

Le recruteur qui écrit n'importe quoi

Je me permets de vous contacter après avoir pris connaissance de votre CD sur doyoubuzz.

Je ne suis pas inscrit sur doyoubuzz :) Et oui mon "CD" ! Je lui ai répondu que j'étais ravi qu'il aime ma musique :)

Nom de société FAIL

Suite à notre dernier échange, je me permets de revenir vers vous afin de faire point sur votre entrée chez Arcos.

Vous travaillez ? Et alors ?

Bonjour Yoan,

Je souhaiterais échanger de vive voix avec vous. Vous êtes apparemment chez ARCHOS depuis août. Votre profil pourrait intéresser plusieurs de nos clients.

J'aime bien la faute au prénom :p

Recruteur incepshun !!

Bonjour pouvez vous me donner vos coordonnées pour que je puisse vous contacter ?

Hey, je vous contacte pour vous demander comment vous contacter pour vous contacter !

Le recruteur coup de pression

Bonjour,

Je vous ai déjà contacter il y a 8 mois. Sans retour de votre part.

Sauf que malheureusement pour elle/lui, je lui avais bien répondu. (la grosse faute est d'origine)

Le recruteur qui aime tartiner du vent

Bonjour,

J'ai vu votre profil sur Viadeo et je suis très intéressée par votre profil. Je recherche aujourd'hui un développeur ANDROID.

Si vous êtes actuellement en recherche ou ouvert à d'autres opportunités, pouvez-vous me transmettre vos coordonnées pour que je puisse vous contacter afin de vous epxliquer plus en détail ce que je souhaite vous proposer ? Ou me transmettre votre CV à mon adresse, ci-dessous.

Pour informations, XXXX est opérateur et intégrateur B2B de solutions IT et de communications (entité de XXXX). 7,2 Mds € de CA, 20 000 collaborateurs, une présence dans le monde entier. XXXXX investit fortement dans ces relais de croissance stratégiques IT, et renforce chaque année sa position de leader dans la fourniture de services IT fortement innovants nés de la convergence des technologies et des usages.

Au sein de XXXX, ZZZZ est concepteur et intégrateur de solutions IT applicatives innovantes. Notre vocation est d'accompagner nos clients en France et à l'international, de l'expression de besoin business et industriel, à la conception, l'intégration et l'optimisation de solutions logicielles et systèmes.

L'innovation est notre pilier ; nous comptons 1500 ingénieurs spécialisés, en France et à l'International. Dotés de méthodologies robustes (CMMi-3, ISO 9001), deux tiers de notre activité est réalisée au forfait.

Cordialement,

Hey, trouvez moi l'offre d'emploi dans ce mail ! J'ai demandé si la rémunération était proportionnelle au CA et au nombre de collaborateurs. Jamais eu de réponse, pfff !

Le recruteur qui avoue !

Si mon offre ne correspond pas à votre profil, je m'en excuse (recherche par mots clés). Il est vrai que je ne travaille pas sur des profils comme le votre.

Cependant, si vous avez des connaissances à le recherche sur les technologies .net et C#, n'hésitez pas à leurs transmettre mes coordonnées.

Le recruteur qui a la classe

Bonjour,

Vous êtes à la recherche d'un emploi ou ouvert à de nouvelles opportunités car vous avez fait le tour dans votre entreprise actuelle?

Envoyez-nous votre CV sous format Word avec: Le poste souhaité, la rémunération et vos disponibilités. Le reste on s'en charge pour vous!

Il est temps de booster votre carrière!

Le recruteur SPAM Viagra

J'ai reçu un email-image (que je ne mettrai pas ici) dont le corps du mail était complètement incrusté dans l'image. A ça on pouvait rajouter le nom mal orthographié de la société, un texte complètement apersonnel et sans intérêt. Bon et puis c'était la 6eme fois que je l'avais dit que je n'étais pas intéressé accessoirement.

Et en vrac :

  • Le recruteur qui écrit Androïd, j'aime beaucoup !
  • Le recruteur qui propose de continuer en Anglais, et qui parle moins bien Anglais que moi.
  • Le recruteur français qui m'envoie un mail en Anglais pour un poste en France.
  • Le recruteur qui me spamme et qui envoie des dizaines et des dizaines d'offres sans aucun rapport avec mon profil. Et ça malgré mes réponses négatives.
  • Le cabinet de recrutement qui croyait bien cacher le nom de son client, bien gêné que je le devine du premier coup :D
  • La société qui a vendu du DPI à un certain pays du moyen orient et qui croit encore pouvoir recruter sans changer le nom de sa société...
  • La société dont 3 recruteurs me contactent le même jour pour le même poste.
  • Le recruteur qui m'appelle alors que je suis dans la même société à l'étage du dessous.

Les entretiens

Mon pire entretien

Entretien téléphonique avec une SSII à l'issue de mon stage de fin d'études, je pars beaucoup plus tôt pour être au calme chez moi.

  • le recruteur m'appelle en retard
  • il n'a pas lu mon CV
  • il est au volant
  • au bout d'un moment je ne l'entends plus parler. Normal ! Son oreillette bluetooth était tombée par terre... Au bout de longues secondes on repend l'entretien.
  • quelques minutes plus tard, la communication est coupée. Normal ! Il passait dans un tunnel !

Tellement épique ce coup de fil ! Assez énervé j'avais été me plaindre au près de la RH qui m'avait programmé ce RDV, le directeur de l'agence m'avait rappelé pour s'excuser. Il est devenu tout de suite moins mielleux lorsque je lui ai dit que la société ne m'intéressait plus... Alala !

Le recruteur Epic Win

Et pour finir, celui-ci a la palme d'or ! Je reçois un jour un coup de téléphone sur mon fixe professionnel, que je n'utilise qu'en interne :

  • Je n'ai pas de numéro publique, donc le recruteur est passé forcément par le standard
  • "Hello are you Yoann ?" Heu ... yes, premier abord je crois à un collègue pas Français.
  • Et non, voila qu'il me propose du boulot. Bien sûr, êtes-vous à la recherche d'un emploi ? Mais oui, vous m'appelez sur mon lieu de travail, en anglais, et vous vous attendez à ce que je réponde que je cherche du travail devant tout le monde.

Cela mérite une citation adaptée à la situation !

Purée... Hahaha, CA J'AIME! Haha... Vous arrivez, vous êtes même pas chez vous, vous vous pointez avec trois quarts d'heure de retard, pas bonjour pas merci, vous filez tout droit au frigo, vous prenez la dernière bière... Haha! Vous, vous êtes un sacré sans-gênes!

Remerciez les SSII, tous ces emails en sont exclusivements issus !

Et vous ? Les recruteurs vous égaient-ils autant au quotidien ?

]]>
Nouveau site, nouveau blog, envie de changement ! Hell Yeah ! http://yoannsculo.fr/nouveau-site-nouveau-blog-envie-de-changement-hell-yeah 2012-04-29 http://yoannsculo.fr/nouveau-site-nouveau-blog-envie-de-changement-hell-yeah Je n’avais pas touché à mon blog depuis presque 8 mois, hélas pour plusieurs raisons :

J’ai changé de job et je trouve beaucoup moins de temps pour bidouiller, hacker et programmer sur mon temps libre. FAUX ! J’ai le temps, mais je préfère faire autre chose à vrai dire ! Compiler du kernel tous les jours de la semaine ne donne pas particulièrement envie de faire le geek le soir et le week-end. Mais j’ai déjà là chance de vivre de ma passion, donc autant profiter du reste du temps pour faire autre chose !

Je réalise surtout que les motivations pour tenir ce blog ont changé depuis sa création en 2009. J’étais un étudiant tout fou avec des milliards d’idées et du temps libre. Je comptais jouer sur le référencement Google pour trouver du travail. Ce qui est chose faite à présent. Mon blog a bien rempli son rôle, et je pense qu’il est temps de recadrer son utilisation pour correspondre plus à mes besoin actuels.

De plus, je trouve qu’il n’est pas réellement pertinent de traiter des sujets d’actualité sans apporter un petit plus de valeur ajoutée. Recracher des infos trouvées sur Internet n’a pas trop d’intérêt pour un blog. Et puis j’ai twitter pour ça maintenant ! Je trouve que le format est particulièrement adapté à la veille technologique.

Et donc je préfère plutôt partir vers une idée regroupant :

  • le portfolio/cv
  • le wiki personnel et professionnel : sorte de retranscripteur d’expérience
  • l’agrégateur d’informations liées à l’embarqué (!= actualité)

En d’autres termes j’aimerais maintenant me concentrer sur du contenu original et lié à mon expérience quotidienne de developpeur.

Et puis comme je suis un geek en puissance, que je m’éclate à découvrir de nouveaux projet sur github, j’ai fait la connaissance de différents projets de génération de sites web statiques. Au même titre que des gens un jour se sont dit, tiens et si je me compilais mes documents, en créant LaTeX. Hé bien d’autres furieux se sont dit la même chose pour leur site web et page perso de développeur. Ce qui revient à bloger sous vim dans un format markup, comme si l’on codait, compiler et générer un site tout beau entièrement statique, et l’envoyer sur son serveur. Et comme on pousse le vice à fond, autant versionner son site web sous github.

Au départ j’étais réticent au modèle et ne voyais pas l’intérêt apporté par un tel système. Et surtout pourquoi une telle régression par rapport aux puissants langages web actuels ?

Finalement les arguments sont assez nombreux :

  • J’en ai marre de backuper mes bases MySQL, de mettre à jour mon wordpress, de jouer avec les potentielles failles de sécu. Là c’est statique ! On a juste besoin de backuper les sources markup du site, et c’est tout !

  • Des pages html à la place de pages php, ça a son avantage. Plus rapide et puis plus enclin à être mis sur un serveur web embarqué avec peu de ressources.

  • Le site se gère vraiment comme du code et se base sur l’arborescence du filesystem pour la génération du site. Entièrement custom ! L’organisation se fait naturellement !

  • Quand on utilise vim on est plus à ça près, alors bloger sur vim et déployer en ligne de commande devient même carrément sexy.

Bref !

J’ai donc testé jekyll ! Je me suis arraché les cheveux à installer l’environnement ruby/gem et à l’utiliser. J’ai fait plusieurs syncopes et j’ai désinstallé ce machin !

Puis essayé growl codé en Python mais ça ne correspondait pas à tous mes besoins et puis cela nécessitait de faire bon nombre de modifs, et j’avais plus envie de faire du C.

Et comme je suis FOU je me suis mis en tête de faire mon propre outil de génération de site statique de geek, en C. Sans dépendance, un make et puis c’est tout ! C'est ainsi qu'est né ucblog. J'aurai l'occasion de reparler de ce projet. J'ai malheureusement réalisé assez vite qu'il n'existait pas de moteur de template en C adapté et non buggé (à l'instar de jinja2 codé en Python). Devant le gros boulot de code, j'ai capitulé et suis revenu sur growl. Ucblog n'est cependant pas complètement abandonné !

Conclusion, mon nouveau blog a été généré par Growl, que j'ai forké et modifié. Et je ne me contente plus que d'écrire des fichiers markdown qui sont automatiquement mis en page comme il faut. Le tout versionné sur github :)

Et comme j'ai la fibre optique dans mon nouvel appart, je suis en train de me rechercher un serveur basse consommation pour tout héberger chez moi. En attendant, mon blog reste hébergé chez OVH.

J'ai tout fait pour ne pas perdre mon référencement, ce qui m'a pris du temps). J'espère que la transition ne sera pas trop dure. J'ai pris la décision de ne pas garder les commentaires du blog, car trop galère à récupérer, au profit de Disqus dorénavant. Je ne suis pas fan des services externes de type cloud, mais ce ne sont des commentaires. Au pire vous pouvez me contacter ici.

Voilà ! A très vite !

]]>
Raspberry Pi – Premières images de la version alpha http://yoannsculo.fr/raspberry-pi-premieres-images-de-la-version-alpha 2011-08-27 http://yoannsculo.fr/raspberry-pi-premieres-images-de-la-version-alpha Et voici quelques news de la Raspberry Pi dont j’avais parlé en mai dernier. Un blog a été ouvert il y a un mois. Et depuis, quelques informations arrivent au compte goûte. Après le schéma du PCB,

raspberry

Voici les premiers modèles alpha de la Raspberry Pi.

Raspberry Pi Alpha

20 % plus grands que les modèles finaux, qui seront de la taille d’une carte de crédit. Eben Upton, le président de la Raspberry Pi foundation, nous présente la carte en vidéo, qui tourne dès à présent sous Debian.

Pour ceux que ça intéresse, un concours de création de logo a également été ouvert.

]]>
Au revoir Mindscape http://yoannsculo.fr/au-revoir-mindscape 2011-08-12 http://yoannsculo.fr/au-revoir-mindscape Comme certains le savent déjà, Mindscape, est en redressement judiciaire depuis fin juin. Une des conséquences concrètes de cette situation aura été l'arrêt du Nabaztag et la libération de ses sources. Une autre, moins visible pour la communauté, n'est autre qu'un plan social de licenciement économique de 32 personnes, dont j'ai fait partie.

J'aurai donc participé à l'aventure Karotz sur toutes les étapes de sa vie (jusqu'à aujourd'hui en tout cas !). Une super expérience que de développer un produit de A à Z, de sa conception début 2010 à sa sortie en avril 2011, en passant par sa promo au CES à Las Vegas. Chouette sentiment que de retrouver à la Fnac et Virgin un produit sur lequel on a travaillé ! Aujourd'hui, je vois plus ce départ comme un tremplin pour moi, car je n'aurai jamais autant appris en si peu de temps qu'avec ce projet.

Je vais mettre un peu de côté le développement user space et me rapprocher beaucoup plus du kernel pour mettre un peu plus les mains dans le cambouis (et faire encore plus le geek \o/). Pas trop de répit après avoir quitté Mindscape le 1er août, car j'ai repris une semaine après chez Archos, où je travaille maintenant :)

Ce billet est surtout l'occasion de remercier tous les gens qui me proposent du travail. Malheureusement pour vous, je pense avoir trouvé chez Archos exactement ce que je cherchais et ne suis donc plus disponible. En tout cas, Merci !

]]>
Concours de création de système Linux embarqué sur carte Mini2440 http://yoannsculo.fr/concours-de-creation-de-systeme-linux-embarque-sur-carte-mini2440 2011-08-04 http://yoannsculo.fr/concours-de-creation-de-systeme-linux-embarque-sur-carte-mini2440 Open WideOpen Wide Ingénierie, par l'intermédiaire de son blog Linux Embedded dédié à l'embarqué, vient de lancer un truc vraiment sympa ! Un concours de création de système Linux embarqué. Les participants doivent réussir à booter sous Linux, se connecter au net, afficher une interface graphique, et tout ça le plus vite possible ! La plateforme choisie pour le concours est lacarte Mini2440 de FriendlyARM.

A la clef, des cartes Mini2440, des tablettes Archos et du fun !

Ouvert aux étudiants et aux individuels, le concours se divise en deux parties.

  • Dans un premier temps, le but est de faire fonctionner le système en le simulant sous qemu. Ce qui permet de gagner une carte Mini2440 et de passer à l'étape suivante. Les participants ont jusqu'à fin octobre pour gagner une carte.
  • La finale se passe ensuite sur les cartes Mini2440. Où le but est cette fois d'optimiser au maximum le boot du système sur la plateforme choisie. Cette seconde phase se terminera fin décembre.

Les contraintes techniques se résument en quelques lignes :

Le système devra fonctionner avec un noyau Linux sur une carte Mini2440, obtenir une adresse IP par DHCP et l'afficher en grand dans une application graphique. Un bouton tactile devra également permettre de déclencher l'affichage du nom du ou des auteurs, ainsi que le nom d'équipe s'il y a lieu.

Le temps sera compté à partir du démarrage électrique (à froid) jusqu'à l'affichage graphique.

Il est possible d'optimiser le bootloader, le noyau et l'espace utilisateur (également appelé applicatif ou rootfs).

Donc, seule contrainte, utiliser Linux. En dehors de ça, libre aux participants de bidouiller/hacker à mort leur système pour arriver à leurs fins :) Le but est de se faire plaisir !

Juste besoin d'envoyer un email pour s'inscrire. Un Wiki a été mis en place, ainsi qu'un Forum et un channel IRC.

Je n'ai pas pu résister au défi, je me suis inscrit, en espérant que je trouverai le temps nécessaire pour faire tout ça !

Sur ce ! Au boulot ! :)

]]>
Juillet 2011 – Quelques news en vrac sur l’actualité de l’embarqué http://yoannsculo.fr/juillet-2011-quelques-news-en-vrac-sur-lactualite-de-lembarque 2011-07-25 http://yoannsculo.fr/juillet-2011-quelques-news-en-vrac-sur-lactualite-de-lembarque Délaissé depuis juin, mon blog était très bien triste de ne plus parler d’embarqué. Voici donc quelques informations intéressantes dont je voulais parler. Je suis pas mal en retard ! Mais ce n’est pas grave ! :)

Donc en vrac ! - Open Silicium sort son numéro 3, toujours aussi intéressant - Buildroot a sorti sa version 2011.05. J’ai oublié il y a quelques mois de traiter mon dossier de mails de listes de diffusion. L’annonce de sortie s’est perdue dans mes plusieurs milliers de mails que j’ai aujourd’hui en attente. Dès que l’on arrête de consulter au fur et à mesure ces listes un peu trop prolifiques ... c’est le début la fin ! - Le projet Armadeus a sorti la V4 de son système (voir LinuxFr à ce propos) - La Freedom Box Foundation, dont je parlais il y a 6 mois donne des nouvelles de son projet. On voit que ça bouge, c’est chouette :) - Oh, et puis un article intéressant sur les fichiers MLO pour les bootloaders de type X-loader

Sinon, je me suis lancé dans le développement d’un petit projet open source , dont je devrais parler bientôt ici. Je me cherche une licence en ce moment. J’ai repris un de mes anciens projets, sur l'enregistrement de flux SHOUTcast, que j’ai recommencé from scratch. C’est fou ce que ça va plus vite après quelques années d’expérience supplémentaires :)

]]>
Mass Storage USB sur tous les OS grâce au File-backed Storage Gadget (g_file_storage) http://yoannsculo.fr/mass-storage-usb-sur-tous-les-os-grace-au-file-backed-storage-gadget-g_file_storage 2011-06-02 http://yoannsculo.fr/mass-storage-usb-sur-tous-les-os-grace-au-file-backed-storage-gadget-g_file_storage Je me suis attelé récemment à la mise en place d’un mass storage (FAT32) sur un device Linux grâce au gadget file storage (g_file_storage), compatible avec Windows, Mac et Linux ! Hé bien, c’est un peu de la tambouille magique pour rendre ça compatible entre OS. Hélas, la documentation que l’on retrouve sur Internet ne précise pas forcément les étapes pour faire fonctionner le mass storage sous tous les OS. En fouinant bien j’ai fini par trouver les étapes à suivre pour mettre ça en place ! C’est plus une question du bon argument à spécifier à la création de la partition, mais au final on gagne du temps quand on le sait dès le départ ! Parce qu’aller fouiner dans le code source du driver pour voir comment ça marche c’est cool, mais un poil prise de tête. (encore que mine de rien c’est plutôt bien documenté)

Voici les étapes :

Préparation du kernel

  • Prendre un kernel bien frais !
  • Activer le “File-backed Storage Gadget” (USB_FILE_STORAGE) dans la catégorie USB support. Dans mon cas j’ai choisi de le mettre en module externe.
  • recompiler la bête
  • Et en attendant, préparons la partition de mass_storage.

Préparation de la partition

Jusque là, je n’ai réussi qu’à générer des partitions puissances de 2 au niveau de la taille. Avec des unités d’allocation de 4 Ko (par défaut), il suffit de changer le nombre de têtes (1, 2, 4, ...) pour avoir respectivement des mass storage de (4, 8, 16Mo, ...) Je n’ai pas encore complètement compris entièrement le fonctionnement pour tenter de sortir des clous avec des partitions exotiques (genre 7Mo si c’est envisageable). Si quelqu’un a l’information, je suis preneur ;) Parce que je me perds un peu avec cette ratatouille de Linux / Windows qui n’ont pas les mêmes unités...

Bref, dans cet exemple je me base sur un mass storage de 4 Mo. Mais pour augmenter la taille de celle-ci, il suffit de changer la valeur du count dans la commande dd qui va suivre, puis le nombre de têtes dans le fdisk. Le max était 255 têtes, soit les 1020 Mo max du FAT32 pour des unités d’allocation de 4 Ko

Créons donc notre périphérique à partir du néant !

dd bs=1M count=4 if=/dev/zero of=mass_storage.img

Puis lançons fdisk.

$ fdisk mass_storage.img
Le périphérique ne contient pas une table de partitions DOS ou Sun, SGI, OSF valide
Création d'une nouvelle étiquette DOS avec id de disque 0x3a4a9ca1.
Les modifications restent en mémoire jusqu'à ce que vous les écriviez.
Après quoi, bien sûr, le contenu précédent sera irrécupérable.

AVERTISSEMENT: fanion 0x0000 non valide dans la table de partitions 4, sera corrigé par w(écriture)
Vous devez initialiser cylindres.
Vous pouvez faire cela depuis le menu des fonctions avancées.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Commande (m pour l'aide): x

Commande pour experts (m pour de l'aide): s
Nombre de secteurs (1-63, par défaut 63): 8
AVERTISSEMENT: initialisation du décalage de secteur pour compatibilité DOS

Commande pour experts (m pour de l'aide): h
Nombre de têtes (1-256, par défaut 255): 1

Commande pour experts (m pour de l'aide): c
Nombre de cylindres (1-1048576): 1024

Commande pour experts (m pour de l'aide): r

Commande (m pour l'aide): n
Commande d'action
e   étendue
p   partition primaire (1-4)
p
Numéro de partition (1-4): 1
Premier cylindre (2-1024, par défaut 2):
Utilisation de la valeur par défaut 2
Dernier cylindre, +cylindres or +taille{K,M,G} (2-1024, par défaut 1024):
Utilisation de la valeur par défaut 1024

Commande (m pour l'aide): t
Partition sélectionnée 1
Code Hexa (taper L pour lister les codes): b
Type système de partition modifié de 1 à b (W95 FAT32)

Commande (m pour l'aide): p

Disque mass_storage.img: 0 Mo, 0 octets
1 têtes, 8 secteurs/piste, 1024 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x3a4a9ca1

Périphérique Amorce  Début        Fin      Blocs     Id  Système
mass_storage.img1               2        1024        4092    b  W95 FAT32

Commande (m pour l'aide): w
La table de partitions a été altérée!

AVERTISSEMENT: si vous avez créé ou modifié une partition DOS 6.x,
svp consulter les pages du manuel de fdisk pour des informations
complémentaires.
Synchronisation des disques.

Et si l’on souhaite consulter les informations de notre partition :

$ fdisk -l mass_storage.img
Vous devez initialiser cylindres.
Vous pouvez faire cela depuis le menu des fonctions avancées.

Disque mass_storage.img: 0 Mo, 0 octets
1 têtes, 8 secteurs/piste, 0 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x3a4a9ca1

Périphérique Amorce  Début        Fin      Blocs     Id  Système
mass_storage.img1               2        1024        4092    b  W95 FAT32

Pour accéder au device, on doit alors préciser à quel offset se placer pour travailler avec. Pour ça nous devons calculer la taille du premier cylindre. Soit :

offset = cylindres de 8 * 512 = 4096 octets (indiqué par la commande p du fdisk ou fdisk -l)

losetup -o 4096 /dev/loop0 mass_storage.img

Et on créé un magnifique système de fichiers FAT32 appelé “storage” :

mkdosfs /dev/loop0 -n storage

Si vous voulez vous pouvez monter votre mass storage et bidouiller dedans :

mount -t vfat /dev/loop0
...
umount /dev/loop0

puis on démonte le périphérique virtuel.

losetup -d /dev/loop0

Chargement du mass_storage

Une fois que votre kernel est en place sur votre système, il n’y a plus qu’à placer le fichier mass_storage.img sur le système embarqué et de charger la partition :

insmod g_file_storage.ko file=/tmp/mass_storage.img stall=0

stall=0 est l’option magique qui fait que le mass_storage fonctionne sous Windows sans mouliner à l’infini en attendant une détection du filesystem. (boolean to permit the driver to halt bulk endpoints) On peut également jouer avec l’option ro pour mettre le mass storage en read only ou non. De façon générale on peut retrouver de la doc sur le driver dans le kernel : drivers/usb/gadget/file_storage.c

Et voilà, en branchant votre device sur n’importe quel OS, il sera reconnu comme disque de mass storage appelé “storage” :) Héhé !

Et pour la route, voici les partitions FAT32 finales (vides) :

]]>
Vidéos des conférences récentes sur l'embarqué http://yoannsculo.fr/videos-des-conferences-recentes-sur-lembarque 2011-05-27 http://yoannsculo.fr/videos-des-conferences-recentes-sur-lembarque Du nouveau pour nos amis d'outre-quévin qui aiment la batavia les vidéos de Free Electrons. Depuis la semaine dernière, nous avons eu le droit à un sacré paquet de vidéos des événements récents relatifs à l'embarqué.

Tout plein de vidéos super intéressantes.

Encore une fois, merci à eux ;) Je peux continuer à me former sans prendre l'avion :)

]]>