Midilibre.fr
Tous les blogs | Alerter le modérateur| Envoyer à un ami | Créer un Blog

27/10/2009

[rails] - Comprendre le fonctionnement de Rails avec le scaffold

504508655.jpegEn Ruby on Rails il existe une fonctionnalité bien pratique :  Scaffold. C'est un outil d'apprentissage trés intéressant pour générer automatiquement une 'application'. En effet avec un minimum de paramétres on peut voir tourner ce que l'on souhaite et surtout en analyser le code source pour comprendre le fonctionnement de Rails.

Nous allons voir comment créer une application qui génére une liste de course (mais vous pouvez tout aussi bien tester avec une liste de CD, de recette, ...). Comme à chaque fois il est préférable de définir ce que nous allons faire  :

Nom de l'application : liste de course
Table : courses
Champs nécéssaires : article et quantite

rails  liste_de_course -d mysql
cd liste_de_course


Configurez config/database.yaml pour coller aux paramétres de votre base de donnée (username, password et host, attention pour ce dernier il peut être nécéssaire d'indiquer 127.0.0.1 au lieu de localhost)

Enfin créons la base de donnée associé avec :
rake db:create

Nous voila prêt à créer une table et les champs que nous avons défini. En respectant la convention notre modèle étant Course les noms des tables seront en minuscule et au pluriel, ce qui nous donne comme nom de table courses. Les noms des champs seront : article en tant que string et quantite en tant que nombre (integer).

Voici la commande magique du scaffold :
script/generate scaffold Course article:string quantite:integer

Ce qui génére un certain nombre de fichiers :
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/courses
exists app/views/layouts/
exists test/functional/
exists  test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/courses/index.html.erb
create app/views/courses/show.html.erb
create app/views/courses/new.html.erb
create app/views/courses/edit.html.erb
create app/views/layouts/courses.html.erb
create public/stylesheets/scaffold.css
create app/controllers/courses_controller.rb
create test/functional/courses_controller_test.rb
create app/helpers/courses_helper.rb
create test/unit/helpers/courses_helper_test.rb
route  map.resources :courses
dependency model
exists app/models/
exists    test/unit/
exists test/fixtures/
create app/models/course.rb
create test/unit/course_test.rb
create test/fixtures/courses.yml
create db/migrate
create db/migrate/20091026231134_create_courses.rb


Ceux qui sont précédés de exists on été crée lors de la première invocation de la commande rails, ceux précédés de create sont crée.

Si vous regardez dans le fichier db/migrate, vous verrez ceci :

class CreateCourses < ActiveRecord::Migration
def self.up
create_table :courses do |t|
t.string :article
t.integer :quantite

t.timestamps
end
end

def self.down
drop_table :courses
end
end


self.up est tout ce qui sera crée lorsque nous lancerons la migration et self.down tout ce qui sera éffectué lorsque nous reviendrons un cran en arriere. Ainsi nous voyons que cette migration crée bien une table courses, et un string article et un integer quantite. Ceci est cohérent avec ce que nous voulons, lançons la migration :

rake db:migrate

Afin de simplifier l'accés à notre petit programme, éditez le fichier config/routes.rb et ajouter cette ligne :

map.root :controller => 'courses', :action => 'index'

nous définissons le répertoire racine de notre application, qui pointera sur le controller courses et l'action index (n'oubliez pas d'éffacer le fichier public/index.html).

Lancez maintenant le serveur avec :
script/server

Dans votre navigateur ouvrez : http://localhost:3000, vous devriez avoir ceci :

liste.jpg

Ainsi vous pouvez ajouter des nouvelles courses, et une fois la base rempli, les éditer, les supprimer ou les afficher. Ce qui corresponds au modèle CRUD : Create, Read, Update et Delete. Vous noterez que l'on retrouve chacun des modèles dans le controller : CoursesController du fichier app/controller/courses_controller.rb (avec show, new, update et destroy) et également dans chacune des vues dans app/views/courses avec les fichiers new.html.erb, edit.html.erb ... ce qui vous permet de voir l'interaction entre le controller et les vues. Quand au modèle crée automatiquement par le scaffold et présent dans app/model/course.rb il est tout simple :

class Course < ActiveRecord::Base
end


Mais vous pouvez par exemple définir que la saisie d'un article est obligatoire et que la partie quantite est forcément numéraire et ce trés simplement :

class Course < ActiveRecord::Base
validates_presence_of :article
validates_numericality_of :quantite
end


la liste des validations possible est disponible ici : http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html

Essayez à présent de saisir un article vide, ou une quantité non numéraire. Un message vous avertira de l'erreur. Pour l'instant tout ceci est en anglais mais nous verrons prochainement comment franciser une application. Ce qui est important c'est de voir qu'en 4 lignes de codes on peut obtenir une application MVC fonctionelle et prête à tourner, cela permet d'observer et de tester sur une base opérationnelle. Essayer par exemple de faire d'autres exemples avec scaffold sur d'autres sujets. Analyser le code et les interactions entre le controller et la vue. Nous verrons la prochainne fois comment créer une application sans passer par le scaffolding.

24/10/2009

Les Jeudis du Libre - LastJeudi à Montpellier

siteon0-e5814.pngRendez-vous mensuel de discussions sur le thème des logiciels libres et plus généralement du numérique.

Le Jeudi 29 Octobre 2009, 20h00-23h00.
À Montpellier, Languedoc-Roussillon
Les 3 brasseurs - 1 place de France – Odysseum Montpellier
04 67 20 14 48
Tramway
Odysseum

Possibilité de restauration sur place

Toute la communauté et tous les acteurs du libre de la région se réunissent pour "Les Jeudis du Libre" chaque second jeudi et chaque dernier jeudi du mois pour une soirée conviviale, pour répondre à vos questions, à vos attentes, à votre curiosité autour du thème des logiciels libres. La soirée commence vers 20h00, juste après l'émission Divergence Numérique et prend fin aux alentours de 23h00. L'occasion de partager ses idées, ses expériences, une table. L'ambiance est sympathique et facilite les conversations. Un bon moment pour faire un point sur les activités et manifestations. L'occasion également du se projeter dans l'avenir, sur les prochains rendez-vous et multiple activités que ne manqueront pas de proposer les associations et acteurs du libre.

23/10/2009

[rails] - Un hello world en ruby on rails

rails.jpeg

Ruby on rails est un framework intéressant mais la documentation pour le débutant est délicate à trouver, et encore plus en français j'ai donc décidé de faire quelques billets sur ce framework. Pour ceux qui se demande se qu'est Ruby on Rails je les renvois a l'excellent wikipedia.

Nous allons voir le plus simple des exemples que l'on puisse creér en RoR : un petit programme qui va nous dire soit bonjour soit aurevoir.

Placer vous en ligne de commande et tapez :

rails bonjour_monde -d mysql
le denier argument est bien entendu à modifier si vous utiliser un autre type de base de donnée (sqlite3...)

Nous allons ensuite rentrer dans le répertoire que vient de nous créer rails, ne tenez pas compte du nombre de fichier. C'est un peu affolant au début mais ce que vous devez retenir pour aujourd'hui c'est qu'il à généré d'un coté les éléments de type code (ce que nous allons voir dans app/controllers) et les répertoires de vue qui seront ce que va nous afficher le navigateur (app/view).

cd bonjour_monde

modifiez ensuite config/database.yml en fonction de sa base de données MySql (attention sur mon poste localhost ne fonctionne pas il m'a fallut mettre 127.0.0.1. Autre point délicat respecter les espaces aprés les :

Créons la base de données :

rake db:create

voyons si tout fonctionne en lançant :

script/server

Avec votre navigateur connectez vous sur localhost:3000, vous devriez avoir ceci :

rails_c.jpg

C'est la page d'accueil qui nous indique que notre serveur fonctionne bien, et qu'il n'y a pour l'instant rien de configurer.
Nous allons créer notre premier controller pour afficher un message.

script/generate controller message

Dans le dossier app/controllers vous avez maintenant un nouveau fichier avec uniquement cette entrée :

class MessageController < ApplicationController
end


Comme nous voulons afficher un bonjour, nous allons définir une action bonjour et aurevoir, et envoyer une variable à la vue, modifier comme suis :

class MessageController < ApplicationController
def bonjour
@contenu = 'Bonjour le monde'

end
def aurevoir
@contenu = 'Au revoir le monde'
end

end


Il faut maintenant modifier la vue en créant app/view/layouts/application.html.erb qui est globalement le template de notre application, tout ce qui va émaner des actions (ici bonjour et aurevoir) passera dans le yield :

Que va tu nous dire ?:<br/>
<%= yield %>


Créons ensuite les fichiers lié aux actions, comme dans RoR tout est convention, il suffit de créer un fichier du nom de notre action : app/view/message/bonjour.html.erb et app/view/message/aurevoir.html.erb

<%= @contenu %>

Lancer votre navigateur sur http://localhost:3000/message/bonjour et sur http://localhost:3000/message/aurevoir, la magie opére. Nous allons rajouter un menu afin de naviguer dans ces actions controller Message :

<%= render :partial => 'menu' %>

on pourrait mettre deux fois la meme chose mais on va faire un systéme d'include : un rendu d'un partiel (un block). Placer le code ci dessous dans bonjour.html.erb et aurevoir.html.erb. Puis créez un fichier app/view/message/_menu.html.erb (tout partiel commence par un _, la convention RoR saura qu'il faut allez chercher le partiel dans ce fichier) et placez y :

<br/>
<%= link_to 'Je dis bonjour', :controller => "salutation/bonjour" %>
<%= link_to 'Je dis au revoir', :controller => "salutation/aurevoir" %>

le link_to nous permet de créer automatiquement des a href (html) avec son contenu et le lien vers un controller.

Dans message controller nous allons rajouter une action par défaut sur l'index
(de manière a appeller uniquement http://localhost:3000/message) :
def index
@contenu = 'Faites votre choix'
end


il nous faut donc maintenant créer une vue dans app/view/message/index.html.erb, procédez comme ci dessus plaçant le code :

<%= @contenu %>

Enfin nous voulons rajouter un retour à l'accueil / dans le _menu.html.erb des vues il suffit d'ajouter ce lien qui appelle l'action index du controller message :
<%= link_to 'Acceuil', :controller => "message/index" %>

Amusez vous à passer des variables, créer des partiel, et à modifier le fichier app/view/layout/application.html.erb pour améliorer cet exemple. Nous verrons la prochainne fois comment interagir avec une base de données.

20/10/2009

[linux/nimes] - Second jeudi libre de Nîmes

293457747.pngLa Linuxerie se réunit à la brasserie : Au bureau, le 10 Décembre 2009 à 20h pour les jeudis du libre, au menu : Logiciels libre, GNU/Linux, actualités du libre…

La communauté et les acteurs du logiciel libre de Nîmes et sa région se réunissent chaque second jeudi du mois pour une soirée conviviale, pour répondre à vos questions, à votre curiosité autour du thème des logiciels libres. L’occasion également de partager ses idées, ses expériences, une table. L’ambiance est sympathique et facilite les conversations. La soirée commencera à 20h00 et prendra fin aux alentours de 23h00. Cette soirée s’inscrit dans le cadre des jeudis du libre en partenariat avec Montpel’libre qui organise les Last Jeudis sur Montpellier.

Renseignements et confirmation de présence sur linuxerie@gmail.com ou sur http://lalinuxerie.free.fr

Le Lieu : Au bureau

Adresse : 24, Boulevard amiral courbet

Plan : http://www.openstreetmap.org/?lat=43.838544&lon=4.363...

Les horaires : 20h – 23h

Possibilité de manger sur place, à partir de 19h.
Laissez un commentaire si vous pensez venir.

15/10/2009

[axel] - Un wget vitaminé !

rejon_Network_Node_Cloud_Swarm.pngJe viens de découvrir un petit outil en ligne de commande trés sympathique, Axel :il accélere les transferts HTTP et FTP, en utilisant plusieurs connexion pour un seul fichier. Il est surtout possible de cumuler plusieurs miroirs et ainsi avoir une vitesse de téléchargement d'un ISO constant et au maximum de votre connexion. Autre particularité, le flux est stocké directement dans le fichier sans passer par un fichier temporaire (sortez vos MD5 tout de même).
Le principe de fonctionnement est simple : on passe un seul et unique argument le fichier que vous souhaitez télécharger. Si vous souhaitez utiliser plusieurs miroir vous pouvez lui passer plusieurs URL. Dans le cas ou vous ne connaîtriez pas de miroir pour votre fichier, pour pouvez utiliser l'option --search qui utilisera alors le moteur filesearching.com, vous pouvez même affiner en indiquant le nombre maximum de miroir a utiliser.

Et pour couronner le tout l'outil est léger et n'a pas de dépendance. Attention cependant : l'outil n'a pas de fonction résume.

13/10/2009

[PDF] - Imprimer 4 pages identiques dans un PDF

Anonymous_Scissors_2.pngJ'ai sur un portable la LTS 8.04 d'ubuntu, pour diverses raisons je ne souhaite pas le migrer tant que la prochaine LTS ne sera pas sortie. J'utilise donc certaines versions de logiciels qui sont un peu ancienne. Par contre j'ai voulu utiliser ce portable lorsque j'étais en déplacement pour faire PDF avec une mise en page issu de inkscape et ensuite faire un flyer réparti en 4 par page avec ce même PDF. Récit de mon petit parcours.

Tout d'abord j'ai crée mon document sous inkscape, une fois satisfait j'ai voulu imprimer le fichier en PDF avec l'option Fichier -> Imprimer et en utilisant la fonction PDF. Allez savoir pourquoi Inkscape m'a généré deux pages, une avec le document en question et l'autre une vide. J'ai donc sorti mon pdftk (paquet pdftk) :

pdftk source.pdf cat 1 output original.pdf

J'avais donc maintenant mon document avec uniquement la premiére page, restait donc a imprimer cette page en 4 fois sur une même page. Seul soucis c'est qu'il faut un document de 4 pages pour pouvoir remplir la page. J'ai donc encore une fois utilisé pdftk :

pdftk original.pdf original.pdf original.pdf original.pdf  output resultat_avec_4_pages.pdf

On prends 4 fois le fichier d'origine pour crée un document de 4 pages avec 4 fois le même document. Restait donc mettre le tout sur la même page et ce grace à pdfnup (dispnible dans le paquet pdfjam)

pdfnup resultat_avec_4_pages.pdf --nup 2x2 --outfile document_final.pdf

Note : le soucis d'impression de la page blanche a été résolu sur les versions ultérieur de inkscape.

10/10/2009

[vsftpd] - Monter son serveur ftp

Anonymous_Network.pngVsftpd est un serveur ftp, concu dans un but de sécurité, stabilité et de performance. Ce n'est pas pour rien que les serveurs ftp de freebsd, redhat openbsd ou suse l'utilise...  Il offre de nombreuses possibilités. Nous allons voir comment monter une configuration de base dans le cadre d'un réseau interne par exemple.

Installer le paquet Vsftpd

Vous pouvez dés à présent tester la validité du serveur en faisant un ftp localhost. Par défaut trés peu d'options sont disponible, en effet il n'est possible de se connecter qu'en anonyme, les accés sont en lecture seule. Nous allons voir comment régler tout ceci. Le fichier de configuration se trouve dans /etc/vsftpd.conf

En ouvrant le fichier on se rends compte que le tout est bougrement bien documenté. Et pour connaitre toutes les options disponible un man vsftpd.conf permet de voir le descriptif complet des options et leur signification. Du trés bon travail de documentation.

Donc pour notre serveur maison, nous allons interdire l'accés anonyme en mettant NO sur anonymous_enable. Nous voulons autoriser nos utilisateurs locaux à se connecter à leur compte, on décommente la ligne local_enable=YES et comme nous voulons permettre l'upload et donc l'écriture on décommente également write_enable=YES

et afin de ne pas permettre à tout les utilisateurs du poste de naviguer sur tout le systéme, nous réglons la variable chroot_local_user=YES

Enfin on redémarre le serveur en root avec /etc/init.d/vsftpd restart

Vous pouvez vous connecter avec les comptes disponible sur la machine. Il est également possible de régler des utilisateurs virtuels, de changer le port, et surtout de mettre en place SSL pour sécurisé le tout. Ce serveur est bien pensé, bien construit, bien documenté, stable fiable... et également trés simple à mettre en oeuvre. un must !

08/10/2009

[alpine] - Configurer plusieurs comptes IMAP (gmail)

alpine.jpgCela faisait un moment que je voulais passer à Mutt ou Alpine, et bien c'est chose faite. Je suis arrivé à migrer tout mes comptes de messagerie sur alpine, me voila CLI jusqu'au bout des ongles

. La seule chose qui m'a posé problème est la configuration des multiples profils, de manière a répondre avec le bon mail, et la configuration de la réception de mes deux comptes IMAP chez gmail. C'est pourquoi je résume ici mon installation, si cela peut servir à d'autres.

La première étape est la configuration de la réception de plusieurs comptes :

Allez dans Main -> Setup -> collection Lists -> Add (soit les touches MSLA)

Nickname : le nom de la boite
Server : imap.gmail.com/ssl/user=monmail@gmail.com

Ctrl + x pour sauvegarder

Add (la touche A) pour ajouter un boite, refaite autant de fois l'option que nécéssaire

Il nous faut maintenant définir les différentes identités associées à chacun des comptes :

Choisir Main -> Setup -> Rules et R (pour les rôles)
Chosir une Nickname (surnom) de votre choix
Dans Current folder Type, prendre specific, et dans l'option folder list en dessous appuyez sur CTRL+T pour choisir un dossier à partir duquel l'identité prendra la main (en général INBOX) la navigation dans les dossiers se fait avec < et >.

et dans Actions Begin Here, changer le champs avec votre mail : From (par ex : mon nom <monmail@mail.com>

Puis réglez le SMTP comme suit :

smtp.gmail.com:587/tls/user=username@gmail.com

Puis sélectionnez "compose use" -> With confirmation Ainsi alpine vous posera la question si vous souhaitez utilisez tel ou tel identité.

Revenez au menu principal, dans Setup -> Config et  [Advanced User Preferences] mettez Pruning Rule sur don’t rename, don’t delete

Astuce : pour trouvez rapidement une option, vous pouvez utilisez la touche W qui fera une recherche de mot clef.

Tri des dossiers :
Main -> Setup -> Config
sort key -> reverse Arrival

Cacher les Répertoires vide :
Main -> Setup -> Config -> Folder Preferences.
Hide empty directories

Ouvrir les liens avec Firefox :

Il faut ajouter plusieurs commandes dans URL-Viewers avec A

/usr/bin/firefox
"/usr/bin/firefox -remote 'openURL(_URL_,new-tab)'"
"/usr/bin/firefox _URL_ &"

Ainsi cela ouvre un nouvel onglet si firefox est ouvert, sinon il se lance en autonome

Mettez un peu de Couleur dans Alpine :

Main -> Setup -> Kolor -> use-termdef
et plus bas il est possible de définir ses propres couleurs

Déplacer des mails dans un autre dossier :

dans un message Save (touche S) et CTRL+T pour choisir le dossier de destination (la navigation dans les dossiers se fait toujours avec < et >)
autre méthode : Save et CTRL + N (pour chosir l'identité) et on peut taper directement le nom du dossier, les futurs sauvegarde se feront via CTRL + n et la flêche du haut

Vérifier les mails toutes les X minutes :
Main -> Setup -> Config ->  Mail Check Interval
ou pour récupérer manuellement : eXpunge avec la touche X

Alpine arrête de me demander si je veut partir :

Pas encore trouvé le moyen de lui faire comprendre ça... si quelqu'un à la solution, je suis preneur.

Prochaine étape, la configuration des signatures, l'intégration de pico & pilot,  il faut que je cherche comment se rendre plus rapidement dans les dossiers (en général on va dans INBOX, actuellement il faut que je fasse Folder list, que je choisisse le répertoire, puis INBOX) et surtout l'utilisation de la fonction configuration distante.

06/10/2009

XDG Base Directory Specification - French - Traduction Française

67-t256.pngVoici ma traduction de la spécification sur les répertoires de base de Freedesktop.org. Le but de ces spécifications n'est pas de standardiser les interfaces, mais d'harmoniser les échanges entre les différents environnement. Comme les procédures de copier/coller, raccourcis clavier..... tout est défini de manière à avoir une unification et des codes communs : une harmonisation de l'infrastructure. De nombreux programmes utilisent ces spécifications, gnome, kde, X.Org, mais également telepathy, gstreamer, .... Ci dessous la traduction de la partie sur les répertoires de base.

Version : 0.6
Source : http://standards.freedesktop.org/basedir-spec/latest/inde...
Auteur : Waldo Bastian
Traduction : Stéphane de la Linuxerie


Introduction

Plusieurs spécifications portent sur les fichiers et les formats de fichiers. Cette spécification précise où doivent se trouver ces fichiers en définissant un ou plusieurs répertoires référents où les fichiers devraient se trouver.

Les bases

La spécification XDG Base Directory Specification est basé sur les concepts suivants:

- Un seul répertoire relatif aux informations propre à l' utilisateur doit contenir ces fichiers. Il est défini par la variable  d'environnement  $XDG_DATA_HOME.

- Un seul répertoire pour les fichiers de configuration. Ce répertoire est défini par la variable  d'environnement  $XDG_CONFIG_HOME.

- Une liste de répertoire classé par ordre de préférence pour indiquer ou les fichiers de données doivent être cherché. Cette liste est définie par la variable   d'environnement  $XDG_DATA_DIRS.

- Une liste de répertoire classé par ordre de préférence pour indiquer ou les fichiers de configuration doivent être cherché. Cette liste est définie par la variable  d'environnement   $XDG_CONFIG_DIRS.

- Un seul répertoire pour indiquer l'endroit ou doivent se  trouver les informations non essentiel (caché) propre à l'utilisateur. Ce répertoire est défini par la variable d'environnement  $XDG_CACHE_HOME.

Les variables d'environnement

$XDG_DATA_HOME défini le répertoire où les fichiers de données de l'utilisateur doivent être stockés. Si cette variable est vide ou non rempli, un  répertoire par défaut équivalent à  $HOME/.local/share devra être utilisé.

$XDG_CONFIG_HOME défini le répertoire ou doivent se trouver les fichiers de configurations de l'utilisateur. Si cette variable est vide ou non rempli, un  répertoire équivalent à $HOME/.config devra être utilisé.

$XDG_DATA_DIRS défini une liste, par ordre de préférence, des répertoires qui peuvent contenir les fichiers de données de l'utilisateur en plus du répertoire $XDG_DATA_HOME. Les répertoires de cette variable doivent être séparé par deux points ":". Si cette variable est vide ou non rempli, une valeur égale à  /usr/local/share/:/usr/share/ devra être utilisé

$XDG_CONFIG_DIRS défini une liste, par ordre de préférence, des répertoires  qui peuvent contenir les fichiers de données de l'utilisateur en plus du répertoire $XDG_CONFIG_HOME. Les répertoires de cette variable doivent être séparé par deux points ":". Si cette variable est vide ou non rempli, une valeur égale à /etc/xdg devra être utilisé

L'ordre des répertoire reflète leur importance : le premier est le plus important. Quand la même information est définie dans plusieurs endroits, c'est la définition du répertoire le plus important qui prime. Le répertoire défini par $XDG_DATA_HOME est le plus important des répertoires définis dans $XDG_DATA_DIRS. Le répertoire défini par $XDG_CONFIG_HOME est le plus important des répertoires définis dans $XDG_CONFIG_DIRS..

$XDG_CACHE_HOME défini le répertoire ou doivent se trouver les fichiers de données non essentiel de l'utilisateur. Si cette variable est vide ou non rempli, un  répertoire équivalent à $HOME/.cache devra être utilisé.

Référencement de cette spécification

D'autres spécifications peuvent référencer cette spécification en spécifiant l'endroit d'un fichier de donnée comme $XDG_DATA_DIRS/repertoire/fichier

Ce qui implique :

- Un tel fichier devra être installé dans $datadir/repertoire/fichier avec /usr/share par défaut pour $datadir

- Une version spécifique de l'utilisateur d'un fichier de donnée peut être crée dans $XDG_DATA_HOME/repertoire/fichier en prenant les valeurs par défaut si $XDG_DATA_HOME n'est pas défini.

- Les recherches de fichiers de données devront se faire dans ./repertoire/fichier sur tout les répertoires indiqués dans $XDG_DATA_HOME et $XDG_DATA_DIRS. Si une des variables n'est pas rempli ou est vide, les variables par défaut comme défini par cette spécification pourront être utilisées.

D'autres spécifications peuvent référencer cette spécification en spécifiant l'endroit d'un fichier de donnée comme $XDG_CONFIG_DIRS/repertoire/fichier

Ce qui implique :

- Un tel fichier devra être installé dans $sysconfdir/repertoire/fichier avec /etc par défaut pour $sysconfdir

- Une version spécifique de l'utilisateur d'un fichier de donnée peut être crée dans $XDG_CONFIG_HOME/repertoire/fichier en prenant les valeurs par défaut si $XDG_CONFIG_HOME n'est pas défini.

- Les recherches de fichiers de données devront se faire dans ./repertoire/fichier sur tout les répertoires indiqués dans $XDG_CONFIG_HOME et $XDG_CONFIG_DIRS. Si une des variables n'est pas rempli ou est vide, les variables par défaut comme défini par cette spécification pourront être utilisées.

Dans le cas ou, lorsque l'on essaie d'écriture un fichier, le répertoire de destination n'existe pas, il devra être prévu une tentative de création avec les permissions à 0700. Si le répertoire existe les permissions ne doivent pas être changé. L'application doit tenir compte du fait que le fichier puisse ne pas être écrit, soit parce que le répertoire n'existe pas et ne peut être crée, soit pour tout autres raisons. Dans un tel cas, l'application pourra présenter un message d'erreur à l'utilisateur.

Dans le cas ou, lorsque l'on essaie de lire un fichier, pour n'importe quelle raison il n'est pas accéssible (par ex: lorsque le répertoire n'existe pas, le fichier n'existe pas ou l'utilisateur n'est pas autorisé à ouvrir le fichier) Alors le traitement de ce fichier devra être passé. Si le fichier n'est absolument pas accessible l'application pourra présenter un message d'erreur à l'utilisateur.

Une spécification qui se référe à  $XDG_DATA_DIRS ou $XDG_CONFIG_DIRS devra définir le comportement quand un fichier est trouvé dans plusieurs répertoires. Elle pourra, par exemple, définir que seul le fichier dans le plus important des répertoires soit utilisé, ou, autre exemple, elle pourra définir une fusion des informations issues des différents fichiers.

02/10/2009

[alchemy] - Du croquis à l'art expérimental

logo.pngLorsque l'on commence une création, quel soit 2d ou 3d on à souvent besoin de faire des croquis (des grabouilles j'allais dire). Qui n'a jamais par exemple fait quelques grigri sur un bout de post-it ? Et parfois émergeant de ces dessins aléatoires, une idée. C'est en gros ce que vous propose Alchemy, il se place à la fois comme aide au travail préparatoire mais en même temps comme nouvelle approche à un travail graphique, d'ou une insistance sur l'expérimentation, comme le dessin à base de son. Vous trouverez le logiciel sous licence GNU/GPL ici : http://al.chemy.org/download/

Il existe deux modes, le simple qui fixe une barre d'outil sur la gauche, et un mode standard non intrusif, qui apporte une barre qui descend lorsque l'on monte tout en haut de l'espace occupé par le logiciel.

alchemy2.png

Voyons en détail toutes les options présente (de gauche à droite et de haut en bas) :

Le zigzag (shapes): c'est le crayon standard soit vous faite des formes libres, soit des lignes droites
Le Micro (Mic shapes) : permet d'obtenir des images en fonction du son provenant de votre micro
La course (Speed shapes) : déplace le trait au delà de la position de votre souris, la vélocité de la souris augmente l'éloignement du trait
La boite (Pull shapes) : permet de placer des formes (des brosses) sur le dessin
le trait (scrawl shapes) : trace des traits aléatoires en suivant le déplacement de votre souris
la croix (X shapes) : permet de dessiner des formes droites ou douce selon la vélocité de la souris
les 3 traits (Median shapes) : dessine une ligne intermédiaire entre la derniére ligne et la ligne courante
les chevrons (pressure shapes) : permet de tracer un trait en simulant un effet de pression
la fleche (Inverse shape) : trace un trait sans pression du bouton, le clic maintenu permet de ne plus dessiner
le métronome (Type shapes) : prends une police de caractère au hasard et déforme le caractére
La colline (Trace shapes) : prends une image au hasard sur flicker et trace des traits selon les formes
La petite croix (Detach form) : permet de détacher le trait de l'emplacement de la souris

Chacune des ces options est bien entendu configurable. En globalité il est possible de définir la couleur, la transparence, l'épaisseur de ligne, ...

Mais surtout on peut gréffer sur chacun des ces outils des modules pour filtrer le tracé. Ainsi on retrouve :

Displace : change la géomtrie d'une forme en fonction du mouvement.
Gradient : permet d'affecter automatiquement un dégradé au tracé
Mirror : trace en miroir
Blindness : trace en aveugle, et ne vous montre le résultat qu'une fois le bouton relaché.
Random : modifie et change les formes (même celle existante)
Mic expand : utilise le micro pour déformer
Repeat : répete les formes tracé
Colour switcher : permet de changer de manière aléatoire les couleurs

Voici par exemple une de mes dernières utilisations d'alchemy pour un logo. Lorsque le croquis à été terminé je l'ai importé dans inkscape pour  le travailler comme calque de référence.

alchemy.png

Une fois la prise en main (rapide) du logiciel, on arrive facilement à des résultats étonnants, c'est un véritable support pour la création. Seul point négatif : le changement de couleur n'est pas évident.

Vous pouvez vous en servir pour créer vos tests de Rorschach également, reste à trouver un cobaye. Car on peut bien sur obtenir des résultats beaucoup plus expérimentaux :

Alchemy3.jpg