Archive for category Développement

Perlin Noise ou Bruit de Perlin

Bonjour

Comme je l'avais laissé entendre dans le précédent billet, je travaillais sur un second document, relatif à l'informatique. À vrais dire, travailler est un bien grand mot. Il se trouve que je devais rédiger le dernier chapitre, mais souhaitant m'imposer de donner la priorité à mes études, j'ai reporté la rédaction de ce dernier après l'échéance du rendu du premier document (cf: billet précédent). Il s'est avéré que sa rédaction fut (beaucoup) plus rapide que je ne le prévoyais. Aussi, c'est la correction orthographique qui me prit tant de temps.

Un petit retour sur la rédaction

Je voudrais demander à mes lecteurs de ne pas être trop sévère quant à la rédaction ; il s'agit du second texte de cette envergure (une 40aine de pages) bien que sa "publication" ne vienne qu'après le troisième (qui n'est autre que mon TIPE). Les phrases ne sont pas toujours très élégantes, et parfois les mots mal choisis. Je ne me sentais pas le courage de reprendre tout le document. Il n'en est pas moins un document qui sauras surement se montrer utile à des étudiants qui souhaiterais découvrir et comprendre le mythique "Bruit de Perlin".

Le bruit de Perlin ?

Pour ceux qui ne connaitrais pas encore cette algorithme, le bruit de Perlin est un outil très prisé pour la génération de textures paramétriques. Plus que des mots, une simple image pour résumer :

Perlin Noise

Voici, sans plus attendre, le lien vers le document en question : Bruit de Perlin

Perlin Noise

, , , , , , , ,

2 Comments

Introduction a GNU Flex

Gnu Flex

Gnu Flex est un générateur d'Analyseurs Lexicaux. Pour résumé, ce sont des outils qui permettent de générer des parseurs(dans le cas présent, une fonction C capable de découper en morceaux un flux de caractères).

Grâce à cette outil, on peut développer rapidement des analyseurs lexicaux très puissants, pouvant être utilisé dans le cadre du développement d'un compilateur, ou plus modestement pour charger des fichiers de configuration.

Ainsi, je vous présente un article (terminé aux alentours de  février, la correction orthographique m'ayant pris """un peu""" de temps), aussi publié sur développez (au même format pour le moment) qui présente dans les moindres détailles le fonctionnement de Flex, basé sur la documentation et une observation du comportement de la dernière version.

Le lien, pour ne plus attendre : Introduction à Gnu FLEX

, , , , , ,

No Comments

Introduction à VFS sous Linux 2.6.30

Publication officiel

Voila, fait maintenant 1 moi que nous vous le préparions, cuisiné aux petits oignions : La parution officiel de "Introduction à VFS sous Linux 2.6.30" (Ou ILVFS pour les intimes).

Plus qu'une simple parution sur ce blog, l'article est aussi disponible sur developpez.com, sous une forme plus colorée et peut-être plus agréable à lire.
Le document "Black&White" bien-sur toujours disponible pour les fans.

Je vous invite donc à vous rendre de ce pas consulter l'article et, si vous vous en sentez le courage, donner votre avis sur le forum.

Sur ce, bonne soirée.

Nb: Les plus curieux aurons déjà pu lire le document depuis une petite semaine, et l'avant gout qui était auparavant disponible dans un précédant billet.

, , , ,

No Comments

Introduction to Linux Virtual File System : Ch1 & Ch2

Bonsoir,

Vous vous demandez peut-être pourquoi plus un seul article n'a fleuris sur ce blog le long de ce dernier moi? Et bien, c'est tout simplement que j'ai commencer la rédaction d'un long - très long.... trop long! - document relatif au fonctionnement de la couche VFS de linux. Actuellement, je suis bien loin d'avoir rédiger la moitier de ce document, cherchant a illustrer mes dires de schéma et de code, à vérifier l'exactitude des informations que j'ai pus recueillir, la simple introduction que constituent les chapitres 1 et 2 m'ont prit énormément de temps. J'espère que toute fois ils vous paraitrons aussi claire qu'ils le sont pour moi, et que les multiples illustrations vous seront utile pour mieux visualiser les mécanismes mis en jeux.

Mais qu'est ce que VFS?

Peut-être que certains d'entre vous ont manquer mon engouement récent à l'écriture d'un file-système et les articles relatifs, aussi je me dois au moins d'expliquer succinctement ce dont il est ici question.

VFS, pour Virtual File System(Système de fichier Virtuel) est une couche d'abstraction fournis par le kernel linux affin de développer aisément des drivers qui ont a manipuler des fichier. C'est en fait très dépendant de l'architecture "tout fichier" de linux. Via vfs, il est en effet possible avec un simple éditeur de texte de modifier des données stoker sur un disque, mais aussi de modifier la configuration du processeur (il est ici question du fameux file-système /proc, qui ne correspond a aucun fichier physique, et que l'on qualifie donc de virtuel).

Ce document présente donc les bases de VFS nécessaire au développement d'un driver de filesystème, qu'il soit virtuel ou bien associer a un driver de block.

Les chapitres 1 et 2

En fait, les seuls chapitre présent sont une introduction à ce qu'est VFS et quelques détailles sur des mécanismes qui ne sont pas directement lier a son utilisation. Ainsi, le cœur du problème (manipulation des ad-spaces, structures de pointeurs de fonctions, impémentation de lookup et readdir, etc...) n'y figure pas. Ne soyez donc pas trop exigent de ces premiers chapitre et soyez sur que le contenue deviendras plus technique et ciblé dans les chapitres suivant.

Sur ce,

Je vous laisse le lien vers ces premiers chapitres : vfs_01.pdf

, ,

No Comments

Découverte de _{O}CAML

Découverte d'OCAML

Dans ce petit article, je compte vous parler d'un langage de programmation assez particulier : (O)CAML. Tout d'abord, si j'ajoute une parenthèse devant la première lettre du sigle, c'est que je ne compte pas aborder toute la partie OBJET de langage, ni la partie impérative. (N'espérez pas voir une seul structure conditionnel[if] ou itérative[while/for] dans ce texte.

Propositions : définitions et expressions :

Tout comme en mathématique chaque phrase est une proposition, en ocaml chaque "ligne" est une proposition. Elle commence avec le premier caractère et se termine avec le symbole ';;'

Il y a deux type de propositions :

  1. Les expressions : De la forme 3*7 ou encore \sqrt[7]{\frac{2^9}{3^{43}}}
  2. Les définitions : De la forme q := \sqrt{2} qui déclare q comme un alias de \sqrt{2}

En ocaml, la syntaxe est la suivante :

  1. Pour un expression :
    3 * 7;;

    ou encore (poure^{log(\frac{exp(log(2) * 9)}{exp (log(3) * 43)}) / 7})

    exp (log (exp(log 2. *. 9.) /. exp(log 3. *. 43.) ) /. 7.);;
  2. Enfin, une définition :
    let q = sqrt 2;;

L'aspect fonctionnel

Mais comment un tel langage peut-il exister, et surtout, être 'utilisable' sans pour autant faire usage des structures des langages impératif comme le C ou le Python? (Je m'adresse bien-sur ici a ceux qui n'ont pas encore été initier aux joies des langages fonctionnel)

Tout d'abord, définissons ce qu'est un langage fonctionnel. Par analogie à un langage objet où les éléments sont des objets(Dans certains cas, TOUS les éléments), dans un langage fonctionnel, les éléments sont des fonctions, au sens mathématique du terme.

Si l'on considère la fonction suivante : \begin{array}{ccccc} f & : & \mathbb{Z} & \to & \mathbb{Z}^2 \\ & & x & \mapsto & (x, x) \end{array}

C'est la fonction qui associe à un entier x son couple situer sur sa diagonal(injection diagonal) (x,x) \in \Delta\mathbb{Z} \subset \mathbb{Z}^2

Il est alors très aisé de définir f en ocaml :

let f x = (x, x);

Cette fonction est de type int -> int * int, c'est a dire qu'elle prend un entier int \approx \mathbb{Z} et retourne un couple (x, y) \in \mathbb{Z} \times \mathbb{Z}

On peut bien-sur définir des fonctions de fonction. Observons la fonction "composition"(rond) : \begin{array}{ccccc} o & : & (\mathbb{B} \Rightarrow \mathbb{C} ) \times (\mathbb{A} \Rightarrow \mathbb{B} ) & \longrightarrow & (\mathbb{A} \to \mathbb{C} ) \\ & & (f, g) & \longmapsto & (x \mapsto f(g(x)) \end{array}
En OCAML, on aurais :

let o f g = f g;;
(* val o : ('a -> 'b) -> 'a -> 'b = <fun> *)

Les filtres

Je vous ai parler un peut plus tôt de l'absence de structures conditionnel et itératif, je vais ici vous exposer les solutions a votre disposition.

Commençons avec les blocs conditionnel. En OCAML, nous disposons d'une fonction-alitée très intéressante : les filtres.
Si l'on considère la fonction continue suivante : \begin{array}{ccccc} f & : & \mathbb{Z} & \to & \mathbb{Z} \\ & & x & \mapsto &<br />
\left\{<br />
\begin{array}{ccc}<br />
x < 0 & \Rightarrow & -2x \\ x \ge 0 &  \Rightarrow & x^2<br />
\end{array}<br />
\right.<br />
\end{array}

On constate que l'on a bien deux condition, une première qui regroupe les cas des x négatif, et une deuxième qui s'intéresse aux x restant. En OCAML, on défini de la même façon :

let f = function
  | x when x < 0 -> -2 * x
  | x when x >= 0 -> x*x
  ;;

Ou bien, en omettant la deuxième condition et en considérons que la dernière condition matcheras pour "tous les cas restant"

let f = function
  | x when x < 0 -> -2 * x
  | x -> x*x
  ;;

Dans le cas où l'on a pas besoin de nommer x, on peut utiliser _. Ainsi, un dernier cas "_ -> smtg" correspondrais un peut à 'default' d'un switch.
On pourras aussi utiliser l'instruction match {variable} with {filtre}.

La récursivité terminal

Maintenant, considérons les itérations. Nous allons utiliser la récursivités terminal(tail-rec pour les intimes) affin de construire une boucle. La récursivitée terminal est une forme de récursivité ou l'unique action qui succède à l'appelle a la fonction récursive est un retour de valeur.

C'est plutôt élémentaire :

let rec aff_n = function
  | n when n < 1 -> ();
  | n -> print_endline (string_of_int n);
           aff_n (n - 1);;

() représente le type 'unit', c'est a dire que notre fonction ne retourne rien, tout comme print_endl. Nous obtenons une boucle de 10 à 1, et nous affichons les valeurs a l'écran.
Vous vous demandez alors, pourquoi de la tail rec et non une simple récursivités? La réponse est que l'interpréteur/compilateur optimise par une itération, ce qui est bien plus pratique pour nos machines qui on une mémoire limiter et ne peuvent supporter qu'un nombre restreins d'appelles récursif.

Pour conclure

OCAML est un langage fonctionnel, qui bon nombre d'aspects et concepts qui sont parfois inconnus des programmeurs aillant pratiquer uniquement des langages impératif, et constitue de par son existence une forme de culture dont il peut-être bon d'avoir connaissance. Si vous êtes curieux et désirez en savoir plus, voici quelques liens :

  1. Présentation d'ocaml
  2. Notes on OCaml
  3. Wikipedia
  4. Google

, ,

No Comments