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

28/10/2009

[preload] - Accélérer le lancement de vos applications

Startright_True_Airspeed_Indicator.pngAvoir ses applications rapidement lancés est le rêve de tout en chacun. Qui n'a jamais pesté contre le temps de chargement de firefox ou de openoffice ? L'avantage est que une fois lancé, ces applications sont beaucoup plus rapide au deuxiéme lancement. L'idée de preload est justement de préchargéer les applications que vous utilisez le plus souvent pour rendre le lancement plus rapide en évitant le premier chargement à froid.

L'application s'installe simplement et se trouve dans la majorité des dépôts. Le seul fait de l'installation vous équipe du logiciel. Ce qui suffit dans la majorité des cas. Mais si vous aimez mettre les mains dans les fichiers de configurations vous pouvez jeter un coup d'oeil a /etc/preload.conf Tout un tas d'options vous permettrons de régler le comportement de preload. Ainsi vous pourrez définir le cycle de secondes où preload analysera les programmes que vous utilisez et ainsi définir vos préférences. Mais également vous pourrez définir le pourcentage de mémoire que peut d'octroyer preload.

Les gains de performance vont de 10% à 50% pour firefox, entre un lancement à froid et un lancement avec preload.

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.