<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Trux &#187; ruby</title>
	<atom:link href="http://trux.info/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://trux.info</link>
	<description>Partage de mes astuces et découvertes</description>
	<lastBuildDate>Tue, 09 Jun 2009 19:47:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Convertir un entier en binaire, the ruby way</title>
		<link>http://trux.info/2009/02/convertir-un-entier-en-binaire-the-ruby-way/</link>
		<comments>http://trux.info/2009/02/convertir-un-entier-en-binaire-the-ruby-way/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 20:59:20 +0000</pubDate>
		<dc:creator>chris</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://trux.info/?p=76</guid>
		<description><![CDATA[Dans un article précédent, je donnais une méthode pour convertir rapidement un nombre en binaire et inversement quand on n&#8217;avait pas python 3. Ça m&#8217;est pratique quand j&#8217;ai besoin de faire une conversion rapide : un terminal, on lance python, on tape l&#8217;expression et on a le résultat. En regardant les nouveautés de ruby 1.8.7, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://trux.info/wp-content/uploads/2009/02/ruby-language.png" alt="ruby" title="ruby" width="89" height="101" class="alignleft size-full wp-image-77" /><a href="http://trux.info/2009/01/python-convertir-un-entier-en-binaire/">Dans un article précédent</a>, je donnais une méthode pour convertir rapidement un nombre en binaire et inversement quand on n&#8217;avait pas <a href="http://www.python.org/download/releases/3.0/">python 3</a>. Ça m&#8217;est pratique quand j&#8217;ai besoin de faire une conversion rapide : un terminal, on lance python, on tape l&#8217;expression et on a le résultat. En regardant <a href="http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS">les nouveautés de ruby 1.8.7</a>, j&#8217;ai découvert que c&#8217;était encore plus trivial.</p>
<pre>
% irb
irb(main):001:0> 42.to_s(2)
=> "101010"
irb(main):002:0> "%b" % 42
=> "101010"
irb(main):003:0> "1001".to_i(2)
=> 9
irb(main):004:0> 0b1001
=> 9
</pre>
<p>Enfantin non ?</p>
]]></content:encoded>
			<wfw:commentRss>http://trux.info/2009/02/convertir-un-entier-en-binaire-the-ruby-way/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utiliser rubygems avec Netbeans sur Ubuntu grâce aux ACLs</title>
		<link>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/</link>
		<comments>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 08:00:06 +0000</pubDate>
		<dc:creator>chris</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://trux.info/?p=29</guid>
		<description><![CDATA[En installant rubygems et en l&#8217;utilisant avec Netbeans, on se rend vite compte que rubygems est configuré pour stocker ses gemmes dans /var/lib/gems et que Netbeans n&#8217;a pas les droits d&#8217;écriture à cet endroit. En effet, la manière traditionnelle d&#8217;installer gem implique d&#8217;utiliser sudo, en ligne de commande :
$ sudo gems install rails -y
Oui mais [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-32" title="netbeans_ruby_debian" src="http://trux.info/wp-content/uploads/2008/12/netbeans_ruby_debian.png" alt="" width="300" height="83" />En installant rubygems et en l&#8217;utilisant avec <a href="http://www.netbeans.org/">Netbeans</a>, on se rend vite compte que rubygems est configuré pour stocker ses gemmes dans <code>/var/lib/gems</code> et que Netbeans n&#8217;a pas les droits d&#8217;écriture à cet endroit. En effet, la manière traditionnelle d&#8217;installer gem implique d&#8217;utiliser sudo, en ligne de commande :</p>
<pre>$ sudo gems install rails -y</pre>
<p>Oui mais voilà, Netbeans n&#8217;utilise pas sudo. Pour que Netbeans puisse gérer les gemmes lui-même, il lui faut donc les droits d&#8217;écriture sur le dossier <code>/var/lib/gems</code> et ses sous-répertoires. Le plus naïf est de donner tous les droits en écriture, mais c&#8217;est mal ! Sinon, on peut aussi créer un groupe nommé <code>rubygems</code> et donner le droit d&#8217;écriture à ce groupe. Cette approche est meilleure mais un problème se pose lorsque l&#8217;utilisateur y crée un nouveau fichier ou dossier : non seulement celui-ci appartient à l&#8217;utilisateur et non pas à root, mais en plus le groupe n&#8217;a pas le droit d&#8217;écriture. C&#8217;est là qu&#8217;interviennent les ACLs&#8230;</p>
<p><span id="more-29"></span></p>
<h3>Démonstration avec l&#8217;utilisateur foo.</h3>
<p>On crée un groupe ruby gems et on s&#8217;y ajoute</p>
<pre>
$ sudo addgroup rubygems
$ sudo adduser foo rubygems
</pre>
<p>On se déconnecte puis reconnecte pour prendre en compte le nouveau groupe, puis on vérifie les permissions</p>
<pre>
$ sudo mkdir /test
$ sudo chgrp rubygems /test
$ sudo chmod g+w /test
$ ls -ld /test
drwxrwxr-x 2 root rubygems 4096 2008-12-03 22:16 /test
$ touch /test/bar
$ ls -l /test/bar
-rw-r--r-- 1 foo foo 0 2008-12-03 22:21 /test/bar
</pre>
<p>Ce n&#8217;est pas bon du tout. On préférerait avoir quelque chose comme <code>-rw-rw-r-- 1 foo rubygems</code> afin que les autres membres du groupe <code>rubygems</code> puissent eux aussi modifier ce fichier. De manière plus générale, on veut que :</p>
<ul>
<li>le groupe soit <code>rubygems</code> ;</li>
<li>les permissions du groupe soient rwx pour un dossier et rw- pour un fichier ;</li>
<li>et que les permissions des autres soient r-x pour un dossier et r&#8211; pour un fichier.</li>
</ul>
<p>La partie qui va suivre est issu des connaissances acquises grâce à l&#8217;article <a href="http://www.udel.edu/topics/os/unix/general/groupsharing.html">Group sharing a directory</a>.</p>
<h3>Attribuer le groupe automatiquement</h3>
<p>Il est simple d&#8217;affecter le groupe <code>rubygems</code> automatiquement à chaque nouveau dossier créé dès qu&#8217;on connait l&#8217;astuce : il suffit de lever le bit &#8217;set groupid&#8217; du groupe du dossier pour que tout nouveau fichier ou dossier créé appartienne au groupe du dossier parent plutôt qu&#8217;au groupe de l&#8217;utilisateur</p>
<pre>
$ sudo chmod g+s /test
$ ls -ld /test
drwxrwsr-x 2 root rubygems 4096 2008-12-05 07:54 /test
$ touch f
$ mkdir /test/d
$ ls -l /test
total 4
drwxr-sr-x 2 foo rubygems 4096 2008-12-05 07:59 d
-rw-r--r-- 1 foo rubygems    0 2008-12-05 07:59 f
$ cd /test/d
$ touch bar
$ ls -l
-rw-r--r-- 1 foo rubygems 0 2008-12-05 08:00 bar
</pre>
<h3>Permettre l&#8217;écriture au groupe automatiquement </h3>
<p>Cette solution fait usage des ACLs. La commande</p>
<pre>
$ sudo setfacl -m default:user::rwx,default:group::rwx,default:mask:rwx,default:other:r-x /test
</pre>
<p>permet de définir les permissions par défaut pour les futurs fichiers du dossier <code>/test</code>. La commande est longue et peut être abrégée en</p>
<pre>
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:m:rwx,d:o:r-x /test
</pre>
<p>Si la commande <code>setfacl</code> ne fonctionne pas, c&#8217;est parce que l&#8217;option <code>acl</code> n&#8217;est pas active pour votre volume. Assurez-vous d&#8217;avoir une ligne qui ressemble contienne l&#8217;option <code>acl</code> dans votre <code>/etc/fstab</code> :</p>
<pre>
/dev/hda2 / ext3 defaults,acl 0 1
</pre>
<p>Ensuite remontez votre volume pour prendre en compte les modifications</p>
<pre>
sudo mount / -o remount
</pre>
<p>Observons maintenant d&#8217;un peu plus près la définition d&#8217;ACLs</p>
<pre>
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:m:rwx,d:o:r-x /test
$ ls -ld /test
drwxrwsr-x+ 3 root rubygems 4096 2008-12-05 07:59 /test
$ getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: rubygems
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::r-x
</pre>
<p>Le + à droite des permissions affichées par la commande <code>ls</code> indique qu&#8217;il y a des permissions supplémentaires visibles par <code>getfacl</code>. Ce dernier permet d&#8217;afficher les permissions définies avec <code>setfacl</code>. Essayons de créer des fichiers.</p>
<pre>
$ cd /test
$ touch polop.txt
$ mkdir hello
$ ls -l
total 16
drwxr-sr-x  2 foo rubygems 4096 2008-12-05 08:00 d
-rw-r--r--  1 foo rubygems    0 2008-12-05 07:59 f
drwxrwsr-x+ 2 foo rubygems 4096 2008-12-05 08:17 hello
-rw-rw-r--+ 1 foo rubygems    0 2008-12-05 08:17 polop.txt
$ getfacl hello
# file: hello
# owner: foo
# group: rubygems
user::rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::r-x
</pre>
<p>Les ACLs ont bien rempli leur rôle : les nouveaux fichiers créés ont la permission d&#8217;écriture pour le groupe et ont aux aussi les ACLs définis (notez le +).</p>
<h3>Application au dossier de gemmes de ruby</h3>
<p>Il nous faut définir le groupe les permissions pour tout fichier ou dossier existant du dossier <code>/var/lib/gems</code> et les ACLs ainsi que le &#8217;set groupid&#8217; bit pour tout dossier, sans oublier de changer le groupe pour qu&#8217;il devienne <code>rubygems</code>.</p>
<pre>
$ sudo chgrp -R rubygems /var/lib/gems
$ sudo chmod -R -s,g=rwX,o=rX /var/lib/gems
$ for dir in $(find /var/lib/gems -type d) ; do
> sudo chmod g+s "$dir"
> sudo setfacl -m d:u::rwx,d:g::rwx,d:o:r--,d:m:rwx "$dir"
> done
</pre>
<p>notez que si vous étiez sous <a href="http://fr.wikipedia.org/wiki/Zsh">zsh</a>, vous auriez pu écrire</p>
<pre>
$ sudo chgrp rubygems /var/lib/gems/**/*
$ sudo chmod -s,g=rwX,o=rX /var/lib/gems/**/*
$ sudo chmod g+s /var/lib/gems/**/*(/)
$ sudo setfacl -m d:u::rwx,d:g::rwx,d:o:r--,d:m:rwx /var/lib/gems/**/*(/)
</pre>
<p>Voilà ! désomais vous pouvez taper</p>
<pre>
$ gems install rails -y
</pre>
<p>en simple utilisateur, ce qui signifie que d&#8217;autres programmes tiers comme NetBeans peuvent également installer des gemmes.</p>
<h3>Autres applications</h3>
<p>On peut trouver d&#8217;autres application très utiles au partage de dossier par ACL. Comme ça de tête :</p>
<ul>
<li>Quand votre serveur web est partagé entre plusieurs personnes, partager le dossier <code>/var/www</code> d&#8217;apache pour que l&#8217;utilisateur système <code>www-data</code> ait le droit d&#8217;écriture sur tous les fichiers sans donner ces droits à tout le monde ;</li>
<li>Partager des fichiers sur un disque dur externe pour que chacun puisse y gérer ses films et photos sans se retrouver bloqué quand on veut déplacer ou supprimer certains éléments créés par d&#8217;autres utilisateurs.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://trux.info/2008/12/utiliser-rubygems-avec-netbeans-sur-ubuntu-grace-aux-acls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
