Kévin Subileau

Espace personnel

tux-disc

Images disques sous Linux en ligne de commande

Aujourd'hui je vous propose ce petit mémo des différentes commandes utiles à la création et à la gravure des fichiers ISO sous Linux, qui, contrairement à d'autres (suivez mon regard...), dispose à portée de main de tous les outils utiles pour gérer les images disques !

Création d'un ISO à partir d'un disque physique

Tout d'abord, insérez le disque dans le lecteur :P (non je ne suis pas en train de me moquez de vous...), puis tapez la commande suivante :

dd if=/dev/cdrom of=~/image.iso

La commande dd permet simplement d'effectuer une copie brute des données d'un point à un autre. Ici, on indique comme source (if pour input file) le fichier représentant le lecteur de DVD. Au passage, ajustez ce paramètre en fonction de votre distribution Linux. Sur certaines d’entre elles, ce fichier peut se nommer cdrom0, cdrom1, sr0 ou sr1 par exemple. Enfin, le paramètre of (pour output file) permet d'indiquer le chemin du fichier ISO de sortie. Là encore, adaptez ce chemin en fonction de ce que vous souhaitez.

Simplissime, non ? :D

Création d'un ISO à partir d'un dossier

La création d'une image disque à partir d'un dossier de fichiers est tout aussi simple. Cela s'effectue à l'aide de la commande mkisofs. Toutefois, sur certaines distributions, cette commande s’appelle désormais genisoimage suite à des problèmes de licences. Adaptez donc selon votre cas. Si aucune des deux commandes n'est présente, installez le paquet genisoimage.

Voici la syntaxe de la commande :

mkisofs -o ~/image.iso ~/dossier_source

Il vous suffit donc d'indiquer le chemin du fichier ISO en sortie ainsi que le chemin du dossier contenant les éléments à inclure dans l'image disque. La syntaxe de la commande genisoimage est identique, il vous suffit donc de remplacer le nom de la commande.

Monter une image

Pas besoin d'un Daemon tools vérolé pour monter une image disque sous Linux. Il vous suffit pour cela d'utiliser la commande.... mount bien sûr ! Voici la syntaxe à utiliser :

mount -t iso9660 -o loop image.iso /mnt/point_de_montage

On utilise ici le montage en boucle locale (loop), qui doit être activé dans les options de compilation du noyau pour que cette commande fonctionne, ce qui est fort heureusement le cas dans la plupart des distributions.

Gravure d'un ISO

La gravure est une opération un  peu plus délicate car il faut contrôler correctement les paramètres du graveur. Pour cette opération, il faut utiliser la commande wodim, fournie par le paquet du même nom. Pour les mêmes raisons que la commande mkisofs, cette commande se nomme cdrecord sur certaines distributions. Encore une fois, c'est à vous d'adapter. Voici la ligne de commande à utiliser :

wodim -v speed=4 dev=/dev/cdrom image.iso

Ici encore il faut modifier le nom du pseudo-fichier représentant votre graveur en fonction de votre système. Sachez également que la commande wodim permet également d'obtenir des informations sur votre graveur, de graver un CD audio ou encore d'effacer un DVD-RW. Consulter votre meilleur ami le man pour en savoir plus, ou votre second meilleur ami Google :D .

Convertir une image Nero (NRG) en ISO

Les précédentes astuces ne fonctionnent qu'avec des images au format ISO. Si vous avez des images disques issues de Nero au format propriétaire NRG, vous pouvez toutefois les convertir en ISO par deux méthodes. La méthode fainéante consiste à utiliser la commande nrg2iso du paquet éponyme.

nrg2iso image.nrg image.iso

La méthode un peu plus élaborée, mais qui reste assez simple, utilise la commande dd pour retirer simplement l'en-tête que Nero ajoute (c'est exactement ce que fait la commande nrg2iso, et rien de plus !) :

dd if=image.nrg of=image.iso bs=2048 skip=150

A noter que l'utilitaire nrg2iso existe aussi sous une version graphique pour Windows sur ce site.

Voilà, j'espère que ce mémo vous sera utile ! N'hésitez pas à le partager et à le commenter en ajoutant vos propres astuces autour de ce sujet :D

C++

C++ : Déclarer une variable dans un switch

En C++, il est possible de déclarer une nouvelle variable à tout moment dans le code... ou presque !

Ainsi, l'extrait de code ci-dessous est évidemment parfaitement valide et compile sans erreur :

for (int i = 0; i < 10; ++i) {
    std::cout << "Itération n°" << i << std::endl;
    int dummy;
    dummy = i * i;
    std::cout << "Le carré de " << i << " est " << dummy  << std::endl;
}

On note que la variable dummy est définie au milieu du code, sans que cela ne pose problème. Partant de ce constat, on pourrait croire que le code suivant compile également sans problème (en supposant que la variable choix est définie) :

switch (choix) {
    case 1:
        std::cout << "Choix 1." << std::endl;
        int dummy = time(NULL); // Erreur !!
        std::cout << "Il est " << dummy << std::endl;
        break;
    default:
        std::cout << "Choix inconnu." << std::endl;
        // std::cout << "Il est " << dummy << std::endl;
        break;
}

Et bien non ! Si vous compiler un code de ce genre, le compilateur le refusera en indiquant une erreur du type :

error: jump to case label
   crosses initialization of 'int dummy'

ou encore, selon les cas :

error: initialization of 'dummy' is skipped by 'case' label

La raison de cette erreur est que la portée de la variable définie à l'intérieur d'un case s'étend à l'ensemble du switch, et pas seulement à ce case. Le case n'est qu'un label, et ne limite pas la portée de la variable, qui n'est limitée que par les accolades englobantes du switch. Que se passerait il alors si le compilateur ne disait rien et que je décommentais la ligne 9 du code précédent ? Et bien, dans le cas où choix serait différent de 1, l'initialisation de la variable faite à la ligne 4 serait sautée puisque seul le bloc default serait exécuté. La variable dummy serait donc définie (puisque sa portée est globale à tout le switch) mais non initialisée (puisque l'initialisation n'a pas été exécutée). Dans cet exemple, dummy est un entier, il contiendrait simplement une valeur indéterminée. Mais ce pourrait tout aussi bien être un objet, et dans ce cas, le constructeur ne serait pas appelé si choix est différent de 1 ! Ce comportement risqué est donc interdit par le compilateur.

Pour résoudre ce problème, il faut explicitement limiter la portée de la variable en entourant le code du case par une paire d'accolades, comme ci-dessous :

switch (choix) {
    case 1:
    {
        std::cout << "Choix 1." << std::endl;
        int dummy = time(NULL); // Ok !!
        std::cout << "Il est " << dummy << std::endl;
        break;
    }
    default:
        std::cout << "Choix inconnu." << std::endl;
        // Désormais interdit car la variable est hors de portée !
        // std::cout << "Il est " << dummy << std::endl;
        break;
}

La portée de la variable dummy est ainsi limitée au case, et il devient impossible de l'utiliser dans un autre case.

Voilà pour cette petite astuce de programmation en C++ assez simple, il suffit juste d'y penser ! A noter que ce problème et sa solution s'applique aussi lorsque l'on déclare une variable entre un goto et le label ciblé par ce goto. Mais bon, c'est bien connu, plus personne n'utilise le goto de nos jours...

Source

cupcake-candle-first-birthday

Premier anniversaire du site !

Mis en ligne le 29 décembre 2012 à 20H, le site fête donc aujourd'hui déjà son premier anniversaire ! L'occasion pour moi de dresser un premier bilan de cette année écoulée.

Tout d'abord, quelques chiffres. En un an, ce sont une trentaine d'articles qui ont été publiés, soit 2 à 3 articles par mois. C'est bien, mais c'est moins que ce que je comptais faire. Mes études m'ont occupé plus que prévu, et je n'ai malheureusement pas eu assez de temps pour rédiger plus d'articles.

Du côté de la fréquentation, Piwik, mon outil de statistiques, m'indique un total de 28840 visites, ce qui est bien au-delà de ce à quoi je m'attendais pour une première année :D ! Les 5 premiers mois ont été très stables autour de 100 visites uniques par mois, mais l'article sur Centavia publié en Juin a amorcé une progression importante de la fréquention, jusqu'à se stabiliser à partir d'Octobre à environ 4800 visiteurs uniques par mois. Je pense que cette stabilisation est en partie due à la quasi absence de nouveaux articles sur cette fin d'année...

Évolution des visites uniques par mois durant l'année 2013

Évolution des visites uniques par mois durant l'année 2013

Du côté des articles les plus consultés, deux d’entre eux se répartissent plus de 60 % des vues uniques ! Lire la suite →

christmas-ad-2013-thumb

Joyeux Noël 2013 !

Ôh Ôh Ôh !

Ca y est, on y est ! Je vous souhaite un très Joyeux Noël 2013, à vous et à votre entourage. Profitez-en bien, c'est le premier et le dernier de l'année :D

En cadeau, je vous propose cette jolie publicité anglo-saxonne réalisée par la marque John Lewis. Intitulée "The Bear & The Hare", elle raconte l'histoire d'un pauvre ours qui n'a jamais pu profiter de la joie de Noël parce qu'il hiberne à ce moment là. Jusqu'à ce qu'un lapin est une brillante idée... Je vous laisse découvrir !

Et en bonus, vous pouvez regarder le making-of de ce court métrage, qui a été réalisé en stop-motion à partir de dessins 2D traditionnels fait à la main et de maquettes. Un très beau travail !

Et pour ceux qui seraient intéressé par la musique utilisée, il s'agit d'une reprise de Somewhere Only We Know par Lily Allen, disponible ici ;)

Joyeux Noël à tous !

lorem-ipsum

Générer un faux texte en une ligne de PHP

Lorsque l'on développe un site ou une application Web, il est souvent très utile de pouvoir remplir la base de données ou la page Web de faux texte, de type Lorem ipsum. En effet, cela permet de se concentrer sur le design et la mise en page sans pour autant avoir le contenu final de la page et sans que ce contenu ne détourne notre attention.

Mais plutôt que de copier/coller ces faux paragraphes sans cesse, saviez-vous qu'il est possible de le "générer" facilement avec une ligne de code PHP ? C'est plus classe, ça prend moins de place dans le code côté serveur, et surtout vous pouvez l'utiliser pour remplir la base de données et pas seulement pour l'afficher directement !

Le suspens a assez duré, voici le code en question :

$lipsum = simplexml_load_file('http://www.lipsum.com/feed/xml?amount=1&what=paras&start=0')->lipsum;

Bon, ok, j'ai un peu triché. En réalité, on ne génère pas réellement le lipsum en PHP, mais on utilise plutôt l'API du site lipsum.com. Mais peu importe, le but principal est atteint, on a un faux texte en une ligne de PHP !

Pour allez plus loin, vous pouvez transformer cette simple ligne en une fonction un peu plus évoluée qui vous permettra de contrôler un peu plus de paramètres sur le texte généré :

function generer_lipsum($quantite = 1, $type = 'paras', $lorem = false) {
    $url = "http://www.lipsum.com/feed/xml?amount=$quantite&what=$type&start=".($lorem?'yes':'no');
    return simplexml_load_file($url)->lipsum;
}

Où les paramètres sont :

  • $quantite : la quantité de texte à générer.
  • $type : l'unité de comptage de la quantité de texte : paras pour paragraphes, words pour mots, bytes pour octets ou lists pour des listes HTML. Ainsi, si vous définissez $quantite à 5 et $type à words, vous allez générer une phrase aléatoire de 5 mots.
  • $lorem : Si vrai, force le texte généré à débuter par "Lorem ipsum dolor sit amet...".

Voilà pour cette petite astuce qui me plait beaucoup et qui, je l'espère, vous plaira tout autant ! Et si vous en connaissez d'autres de ce style, n’hésitez pas à les partager en commentaire de cet article :D .

Octocat

GitHub offre 5 dépots privés aux étudiants

GitHub est sans doute le service d'hébergement et de gestion de code source le plus populaire du Web. Par défaut, lorsque vous créez votre compte, vous disposez gratuitement d'autant de dépôts (repository) que vous souhaitez, à condition que ces dépôts soient publics. Si vous ne souhaitez pas publier le code source ou limiter son accès à certaines personnes, vous devez mettre la main à la poche et choisir un des forfaits proposés en fonction du nombre de dépôts privés dont vous avez besoins.

Sauf si, tout comme moi, vous avez toujours la chance toute relative d'être encore étudiant ! En effet, GitHub offre sur simple demande 5 dépôts privés durant 2 ans à tous les étudiants inscrits au service.

Pour cela, après vous être connecté sur la plateforme avec vos identifiants habituels, rendez-vous simplement à l'adresse https://github.com/edu, cliquez sur "I'm a student", et remplissez le court formulaire en indiquant notamment votre nom, votre adresse email, et une courte description de votre besoin. Utilisez de préférence l'adresse email fournie par votre université afin de faciliter le traitement de votre demande. Si cette adresse n'est pas dans la liste déroulante, faites un détour par la page https://github.com/settings/emails pour l'ajouter et la vérifier. Si votre université ne vous fournit pas d'email, vous pouvez utiliser une autre adresse mais il est possible que GitHub vous demande des scans de documents permettant de justifier de votre statut d'étudiant.

Sous réserve que votre demande soit accordée, vous recevrez sous 24 heures environ un email très sympathique à l'adresse que vous avez renseigné pour vous indiquer que votre compte a été mis à jour, vous faisant ainsi économiser près de $170 !

github-free-student-micro-account

Vous pourrez ensuite contrôler l'accès à vos dépôts privés et ajouter si nécessaire votre binôme de projet ou tout autres collaborateurs, étudiants ou non, sans que ces derniers n'aient à payer quoi que ce soit !

Enfin, si vous avez besoin de plus de 5 dépôts privés et que vous ne souhaitez pas débourser un centime, vous pouvez également vous tourner vers d'autres services similaires, comme BitBucket, qui propose un nombre illimité de dépôts privés limités à un quota de contributeurs. Mais vous ne profiterez pas de la grande popularité et de la dimension sociale de GitHub...

hellorun

HelloRun - Le jeu HTML5 du jour

Aujourd'hui c'est lundi, le week-end est terminé et j'ai un peu la flemme de bosser. Alors pour ne pas me sentir seul, je vais faire chuter votre productivité à zéro durant quelques minutes (ou heures) avec un jeu assez sympa. Ça s’appelle HelloRun, et c'est entièrement réalisé en HTML5 et Javascript.

HelloRun Demo

Attention à la porte !

Le but du jeu est simple : il faut se faufiler à travers les portes lasers, en faisant monter ou descendre la caméra avec les flèches haut et bas (ou à la souris). La vitesse de défilement varie au rythme de la musique, ce qui corse un peu l'affaire.

Une fois que vous aurez pris un peu la main, vous pourrez accélérer dès le début du jeu en maintenant appuyée la touche majuscule. Cela a également pour effet de vous faire gagner 2 points au lieu d'un seul à chaque porte passée.

C'est dans ce genre de jeux que l'on voit que la technologie Flash est devenue obsolète. En revanche, pas question de jouer avec un vieux IE6 ! Le jeu utilise des technologies modernes (HMTL5, Javascript et WebGL), alors il faut un navigateur moderne !

Mon record actuel est de 140, comme vous pouvez le voir sur la capture. Parviendrez-vous à me battre ?

chimney

Fumer tue

Aujourd'hui, je vous propose un article un peu original par rapport à ce que je fais d'habitude ici, disons qu'il s'agit d'un article "hors-série". En effet, il s'agit d'une nouvelle que j'ai rédigée il y a quelques mois dans le cadre d'un concours étudiant organisé par mon université.

Je ne voue pas un grand intérêt à la littérature généralement, mais vu que j'ai reçu quelques critiques positives de la part de personnes plus imprégnées de cet art, et plutôt que de laisser jaunir ce papier au milieu de mes archives scolaires, j'ai décidé de partager cette nouvelle avec vous :D !

Je vous laisse donc découvrir ce récit, intitulé Fumer tue, que je publie sous licence Creative Commons BY-NC-ND. Lire la suite →