<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24909469</id><updated>2011-06-23T21:48:33.310+02:00</updated><title type='text'>Flyerenv</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24909469.post-114667407449443923</id><published>2006-05-03T18:30:00.000+02:00</published><updated>2006-05-03T18:34:34.503+02:00</updated><title type='text'>screen</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Tips pour screen&lt;/span&gt; : nommer ses session&lt;br /&gt;&lt;br /&gt;#démarre une session nommée flyer&lt;br /&gt;$&gt; screen -S flyer  &lt;br /&gt;#CTRL+d a pour quitter la session&lt;br /&gt;&lt;br /&gt;#voir les sessions en cours:&lt;br /&gt;$&gt; screen -list&lt;br /&gt;There is a screen on:&lt;br /&gt;        19140.flyer     (Detached)&lt;br /&gt;&lt;br /&gt;#reprendre la session flyer&lt;br /&gt;$&gt; screen -r flyer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114667407449443923?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114667407449443923/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114667407449443923' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114667407449443923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114667407449443923'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/05/screen.html' title='screen'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114665058429971460</id><published>2006-05-03T11:56:00.000+02:00</published><updated>2006-05-03T12:03:04.310+02:00</updated><title type='text'>iconv</title><content type='html'>Un wrapper c++ pour iconv:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &lt;string&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;#include &lt;langinfo.h&gt;&lt;br /&gt;#include &lt;iconv.h&gt;&lt;br /&gt;&lt;br /&gt;#define CODAGE_NATIF "ISO-8859-15"&lt;br /&gt;#define CODAGE_XML   "UTF-8"&lt;br /&gt;&lt;br /&gt;int ppIconv(const std::string &amp;pSource, &lt;br /&gt;            const std::string &amp;pFrom_charset, &lt;br /&gt;            const std::string &amp;pTo_charset, &lt;br /&gt;                  std::string &amp;pDestination) {&lt;br /&gt;&lt;br /&gt;        int retour=0;&lt;br /&gt;        char *s = (char *)pSource.c_str();&lt;br /&gt;        iconv_t cd = iconv_open(pTo_charset.c_str(), pFrom_charset.c_str());&lt;br /&gt;        if (cd != (iconv_t) (-1)) {&lt;br /&gt;                size_t s_len = pSource.length();&lt;br /&gt;                /* the maximum expansion when converting happens when converting&lt;br /&gt;                   tscii to utf-8; each tscii char can become up to 4 unicode chars&lt;br /&gt;                   and each one of those unicode chars can be 3 bytes long */&lt;br /&gt;                size_t ptr_len = 4 * 3 * s_len;&lt;br /&gt;                //alloca alloue sur la pile, la désallocation se fera&lt;br /&gt;                //automatiquement au retour de ppIconv&lt;br /&gt;                char *buf = (char *)alloca(ptr_len);&lt;br /&gt;                char *ptr = buf;&lt;br /&gt;                if ((iconv(cd, &amp;s, &amp;s_len, &amp;ptr, &amp;ptr_len)) != (size_t) (-1)) {&lt;br /&gt;                        *ptr = 0;&lt;br /&gt;                        pDestination = buf;&lt;br /&gt;                        retour=true;&lt;br /&gt;                }&lt;br /&gt;                iconv_close(cd);&lt;br /&gt;        }&lt;br /&gt;        if(!retour)&lt;br /&gt;            pDestination="";&lt;br /&gt;        return retour;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114665058429971460?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114665058429971460/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114665058429971460' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114665058429971460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114665058429971460'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/05/iconv.html' title='iconv'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114545398304709608</id><published>2006-04-19T15:34:00.000+02:00</published><updated>2006-04-19T15:39:43.056+02:00</updated><title type='text'>port forward avec netfilter</title><content type='html'>Voici comment faire un port forward + masquerade avec netfilter (sous linux à priori donc):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;iptables -F FORWARD&lt;/li&gt;&lt;li&gt;iptables -A FORWARD -j ACCEPT&lt;/li&gt;&lt;li&gt;iptables -F -t nat&lt;/li&gt;&lt;li&gt;iptables -A POSTROUTING -t nat -o eth99 -j MASQUERADE&lt;/li&gt;&lt;li&gt;iptables -A PREROUTING -t nat -p tcp --dport 9999 -j DNAT --to 192.168.99.99:9999&lt;/li&gt;&lt;li&gt;echo 1 &gt; /proc/sys/net/ipv4/ip_forward&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114545398304709608?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114545398304709608/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114545398304709608' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114545398304709608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114545398304709608'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/port-forward-avec-netfilter.html' title='port forward avec netfilter'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114543414797701671</id><published>2006-04-19T09:39:00.000+02:00</published><updated>2006-04-19T17:27:51.986+02:00</updated><title type='text'>DummyNet</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5969/2591/1600/beastie.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5969/2591/320/beastie.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aujourd'hui on installe &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt; et on utilise &lt;a href="http://info.iet.unipi.it/%7Eluigi/ip_dummynet/"&gt;DummyNet&lt;/a&gt; pour ajouter du temps de latence aux paquets IP et limiter la bande passante. &lt;tt&gt;&lt;/tt&gt;&lt;blockquote&gt;&lt;tt&gt;"dummynet&lt;/tt&gt; is a flexible tool originally designed for testing networking protocols, and since then (mis)used for bandwidth management."&lt;br /&gt;&lt;br /&gt;L'outil était prévu pour tester les protocols et quelqu'un a rajouté (sans doute à l'arrache) le controle de bande passante. Par conséquent ce n'est sans doute pas le meilleur outil mais il a le mérite d'être le plus simple que j'ai trouvé.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;J'aurais préféré utiliser &lt;a href="http://linux-net.osdl.org/index.php/Netem"&gt;netem&lt;/a&gt; sous linux hélas ce dernier ne traite que le flux sortant. Il faut jouer des pieds et des mains pour lui faire traiter les flûx entrant et sortant.&lt;br /&gt;&lt;br /&gt;Notons enfin l'article de &lt;a href="http://en.wikipedia.org/wiki/Main_Page"&gt;Wikipedia&lt;/a&gt; sur le sujet: "&lt;a href="http://en.wikipedia.org/wiki/Network_emulation"&gt;Network Emulation&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;L'installation de FreeBSD est facile mais en mode texte et demande quelques connaissances informatiques. J'ai installé la version 6.1 RC1 par FTP au travers d'un proxy HTTP. C'est plus rapide de télécharger les 24Mo du &lt;a href="ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/6.1/6.1-RC1-i386-bootonly.iso"&gt;CD-Rom d'installation minimaliste&lt;/a&gt; et de faire l'installation par FTP que de télécharger les ISO complètes.&lt;br /&gt;&lt;br /&gt;Une fois installé il faut activer le firewall. Dans /etc/rc.conf ajouter les lignes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;firewall_enable="YES"&lt;/li&gt;&lt;li&gt;firewall_type="open"&lt;/li&gt;&lt;li&gt;gateway_enable="YES" #si besoin&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;... et rebooter. Je n'ai pas cherché les commandes qui permettrait de ne pas rebooter (sans doute sysctl).&lt;br /&gt;&lt;br /&gt;En "pingant" la machine j'obtient moins de 1ms sur un réseau 100Mbits avec un taux de transfert de 8Mo/s : une situation normale.&lt;br /&gt;&lt;br /&gt;Il faut déjà recompiler le kernel :) Rien d'étonant pour FreeBSD puisque la section "Common Tasks" du &lt;a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/"&gt;Handbook&lt;/a&gt; contient un paragraphe "&lt;a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-building.html"&gt;Building and Installing a Custom Kernel&lt;/a&gt;". Ca m'amuse de trouver la recompilation du kernel dans la section "Tâches courante" :)&lt;br /&gt;&lt;br /&gt;Si comme moi vous n'aviez pas installé les sources du kernel il faut utiliser sysinstall (menu &lt;span class="GUIMENUITEM"&gt;Configure&lt;/span&gt; &gt; &lt;span class="GUIMENUITEM"&gt;Distributions&lt;/span&gt; &gt; &lt;span class="GUIMENUITEM"&gt;src&lt;/span&gt; &gt; &lt;span class="GUIMENUITEM"&gt;sys&lt;/span&gt;) pour installer le paquet manquant.&lt;br /&gt;&lt;br /&gt;Copier le fichier /usr/src/sys/i386/conf/GENERIC dans /usr/src/sys/i386/conf/MYKERNEL, puis rajouter les lignes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;options IPFIREWALL&lt;/li&gt;&lt;li&gt;options IPFIREWALL_DEFAULT_TO_ACCEPT&lt;/li&gt;&lt;li&gt;options IPFIREWALL_FORWARD&lt;/li&gt;&lt;li&gt;options IPFIREWALL_VERBOSE&lt;/li&gt;&lt;li&gt;options IPFIREWALL_VERBOSE_LIMIT=100&lt;/li&gt;&lt;li&gt;options DUMMYNET&lt;/li&gt;&lt;li&gt;options IPDIVERT&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;Puis lancer:&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;cd /usr/src/sys/i386/conf&lt;/li&gt;&lt;li&gt;/usr/sbin/config MYKERNEL&lt;br /&gt;&lt;/li&gt;&lt;li&gt;cd ../compile/MYKERNEL&lt;/li&gt;&lt;li&gt;make cleandepend #si nécessaire&lt;br /&gt;&lt;/li&gt;&lt;li&gt;make depend &amp;&amp;amp; make &amp;&amp;amp; make install&lt;/li&gt;&lt;/ul&gt;Un petit reboot plus tard (dans un /etc/rc.local par exemple):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sysctl net.inet.ip.fw.one_pass=0&lt;/li&gt;&lt;li&gt;natd -interface rl0 -redirect_port tcp super.host.com:8888 9999 #on redirige le port 9999 de notre machine vers super.host.com:8888&lt;/li&gt;&lt;li&gt;/sbin/ipfw -f flush&lt;/li&gt;&lt;li&gt;/sbin/ipfw add pipe 1 ip from any to any&lt;/li&gt;&lt;li&gt;/sbin/ipfw pipe 1 config bw 128Kbits/s queue 10 delay 200ms&lt;/li&gt;&lt;li&gt;/sbin/ipfw add divert natd ip from any to any&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;et voilà tout les accès IP à votre machine (même le localhost) sont limités à 128Kbits/s avec une latence de 200ms. On obtient donc un ping de 400ms et un taux de transfert approximatif de 12Ko/s.  La machine peut maintenant être utilisée pour filtrer les accès à super.host.com:9999.&lt;br /&gt;&lt;br /&gt;D'autres paramètres peuvent être changé avec DummyNet comme un pourcentage de perte de paquets, de paquets désordonnés, de paquets corrompu ou encore de parquets doublés. On peu aussi simuler des routes variables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114543414797701671?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114543414797701671/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114543414797701671' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114543414797701671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114543414797701671'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/dummynet.html' title='DummyNet'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114484653649070043</id><published>2006-04-12T14:53:00.000+02:00</published><updated>2006-04-12T14:55:36.503+02:00</updated><title type='text'>Le dernier jour en shell</title><content type='html'>Q: Comment trouver le numéro du dernier jour du mois en shell?&lt;br /&gt;R: Le dernier jour de février 2008 est le jour n°:&lt;pre&gt;cal 2 2008 | grep -v "^$" | tail -1 | awk '{print $NF}'&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114484653649070043?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114484653649070043/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114484653649070043' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114484653649070043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114484653649070043'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/le-dernier-jour-en-shell.html' title='Le dernier jour en shell'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114483083523407266</id><published>2006-04-12T10:30:00.000+02:00</published><updated>2006-04-12T10:33:55.246+02:00</updated><title type='text'>Envoyer un mail HTML en Shell</title><content type='html'>Vous avez un super script CGI qui produit une super page HTML. Vous souhaiter envoyer cette page HTML par mail. Voici comment faire:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;( echo "From: michel.martin@laposte.net"&lt;br /&gt;  echo "To: odette.martin@laposte.net"&lt;br /&gt;  echo "Subject: Le menu du soir"&lt;br /&gt;  echo "Content-type: text/html"&lt;br /&gt;  echo&lt;br /&gt;  /var/www/cgi-bin/mon_super_script.cgi | tail +3&lt;br /&gt;) | /usr/sbin/sendmail -oi -t&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114483083523407266?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114483083523407266/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114483083523407266' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114483083523407266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114483083523407266'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/envoyer-un-mail-html-en-shell.html' title='Envoyer un mail HTML en Shell'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114442248816503503</id><published>2006-04-07T16:27:00.000+02:00</published><updated>2006-05-19T16:08:49.103+02:00</updated><title type='text'>Practical Extraction and Report Language</title><content type='html'>Après Bash (utile pour traiter les noms de fichiers et leurs emplacements), voici Perl un langage très pratique et aussi barbare pour traiter le contenu des fichiers.&lt;br /&gt;&lt;br /&gt;Voici donc un scipts exemple pour mémoire (vous l'avez compris ce blog me sert surtout comme assistant de mémoire personnelle).&lt;br /&gt;&lt;br /&gt;# lancer cpan&lt;br /&gt;perl -MCPAN -e 'shell'&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# pour avoir les fonction starthtml, h3...&lt;/span&gt;&lt;br /&gt;use CGI qw(:standard);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# pour avoir les erreurs et warnings dans le navigateur web&lt;/span&gt;&lt;br /&gt;use CGI::Carp qw(warningsToBrowser fatalsToBrowser);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#pour faire des GET HTTP&lt;/span&gt;&lt;br /&gt;use LWP::Simple;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#pour les connexions BDD&lt;/span&gt;&lt;br /&gt;use DBI;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#C'est toujours mieux&lt;/span&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#Ca c'est de la balle, vous comprenez ce que ça fait?&lt;/span&gt;&lt;br /&gt;eval get "http://foo.bar/programme.pl";&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#encore de la balle, avoir une liste d'éléments uniques à partir d'une liste d'éléments non uniques&lt;br /&gt;&lt;/span&gt;my %seen;&lt;br /&gt;my @uniqed = grep !$seen{$_}++, @list;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#Un tri selon 2 clés d'un tableau de hashtables&lt;/span&gt;&lt;br /&gt;@clients = sort { $::a-&amp;gt;{"nom"} cmp $::b-&amp;gt;{"nom"}&lt;br /&gt;                or $::a-&amp;gt;{"type"} cmp $::b-&amp;gt;{"type"}&lt;br /&gt;              } @clients;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;print header();&lt;br /&gt;print start_html(-title=&amp;gt;'Deadlines',&lt;br /&gt;               -style=&amp;gt;{'src'=&amp;gt;'/styles.css'});&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#un trim&lt;/span&gt;&lt;br /&gt;sub trim {&lt;br /&gt;  my $string = shift;&lt;br /&gt;  for ($string) {&lt;br /&gt;      s/^\s+//;&lt;br /&gt;      s/\s+$//;&lt;br /&gt;  }&lt;br /&gt;  return $string;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#Une fonction qui découpe une chaine en sous-chaine de taille égale&lt;/span&gt;&lt;br /&gt;sub split_chunks&lt;br /&gt;{&lt;br /&gt;  my $texte        = shift(@_);&lt;br /&gt;  my $taille_chunk = shift(@_);&lt;br /&gt;&lt;br /&gt;  my @chunks;&lt;br /&gt;&lt;br /&gt;  while( length($texte)&amp;gt;0 ){&lt;br /&gt;      if( length($texte)&amp;lt;$taille_chunk ){&lt;br /&gt;          push @chunks, $texte;&lt;br /&gt;          $texte="";&lt;br /&gt;      }&lt;br /&gt;      else{&lt;br /&gt;          push @chunks, substr($texte,0,$taille_chunk);&lt;br /&gt;          $texte = substr($texte,$taille_chunk);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  return @chunks;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#Des jolies fonctions pour créer de beau tableaux&lt;/span&gt;&lt;br /&gt;sub tableau&lt;br /&gt;{&lt;br /&gt;  print "&amp;lt;p&amp;gt;&amp;lt;table cellpadding=\"2px\" cellspacing=\"0\"&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub tableau_end&lt;br /&gt;{&lt;br /&gt;  print "&amp;lt;/table&amp;gt;&amp;lt;/p&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub entete_colonne&lt;br /&gt;{&lt;br /&gt;  my $tmp=shift;&lt;br /&gt;  my $align=shift;&lt;br /&gt;  $align="center" unless $align;&lt;br /&gt;  print "&amp;lt;th align=\"$align\" class=\"HdrClmn\"&amp;gt;$tmp&amp;lt;/th&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub entete_colonne_end&lt;br /&gt;{&lt;br /&gt;  my $tmp=shift;&lt;br /&gt;  my $align=shift;&lt;br /&gt;  print "&amp;lt;th align=\"$align\" class=\"HdrClmnEnd\"&amp;gt;$tmp&amp;lt;/th&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub ligne&lt;br /&gt;{&lt;br /&gt;  print "&amp;lt;tr&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my $couleur="row1";&lt;br /&gt;sub ligne_end&lt;br /&gt;{&lt;br /&gt;  if( $couleur eq "row0" ){&lt;br /&gt;      $couleur="row1";&lt;br /&gt;  }&lt;br /&gt;  else{&lt;br /&gt;      $couleur="row0";&lt;br /&gt;  }&lt;br /&gt;  print "&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub colonne&lt;br /&gt;{&lt;br /&gt;  my $tmp=shift;&lt;br /&gt;  my $align=shift;&lt;br /&gt;  $align="left" unless $align;&lt;br /&gt;  if( !$tmp or $tmp eq "" ){&lt;br /&gt;      $tmp=" " unless $tmp;&lt;br /&gt;  }&lt;br /&gt;  print "&amp;lt;td align=\"$align\" style=\"border-right: 1px solid black\" class=\"$couleur\"&amp;gt;$tmp&amp;lt;/td&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sub colonne_end&lt;br /&gt;{&lt;br /&gt;  my $tmp=shift;&lt;br /&gt;  my $align=shift;&lt;br /&gt;  $align="left" unless $align;&lt;br /&gt;  if( !$tmp or $tmp eq "" ){&lt;br /&gt;      $tmp=" " unless $tmp;&lt;br /&gt;  }&lt;br /&gt;  print "&amp;lt;td align=\"$align\" class=\"$couleur\"&amp;gt;$tmp&amp;lt;/td&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#exmples de connexion BDD&lt;/span&gt;&lt;br /&gt;$ENV{'ORACLE_HOME'}    ="/oracle/8.1.7";&lt;br /&gt;$ENV{'NLS_LANG'}       = "french_france.we8iso8859p1";&lt;br /&gt;$ENV{'LD_LIBRARY_PATH'}="/oracle/8.1.7/lib:/usr/local/lib";&lt;br /&gt;&lt;br /&gt;my $dbh = = DBI-&amp;gt;connect("DBI:Oracle:montns", "login", "pass", {AutoCommit =&amp;gt; 0 } ) or die "$DBI::errstr\n";&lt;br /&gt;&lt;br /&gt;#mettre "DBI:mysql:mabdd" pour une connexion Mysql et enlever le dernier paramètre&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my $select = $dbh-&amp;gt;prepare("select champ1,champ2&lt;br /&gt;                          from table1&lt;br /&gt;                          where champ3=? and champ4=? ") or die "$DBI::errstr\n";&lt;br /&gt;&lt;br /&gt;$select-&amp;gt;execute("var1","var2");&lt;br /&gt;&lt;br /&gt;while( ($var1,$var2) = $select-&amp;gt;fetchrow() ){&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;#y a aussi $select-&amp;gt;finish() si on va pas au bout du fetchrow()&lt;br /&gt;&lt;br /&gt;$select-&amp;gt;commit(); # ou rollback&lt;br /&gt;$dbh-&amp;gt;disconnect();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#Les formulaires&lt;/span&gt;&lt;br /&gt;print start_form("POST");&lt;br /&gt;print textarea("nom","contenu",hauteur,largeur);&lt;br /&gt;print submit('envoyer','envoyer');&lt;br /&gt;print checkbox("nom",bool_checked,"valeur","libelle");&lt;br /&gt;print endform;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114442248816503503?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114442248816503503/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114442248816503503' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114442248816503503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114442248816503503'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/practical-extraction-and-report.html' title='Practical Extraction and Report Language'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114434880075872247</id><published>2006-04-06T19:04:00.000+02:00</published><updated>2006-04-07T08:17:57.130+02:00</updated><title type='text'>Bourne Again SHell</title><content type='html'>Un de mes premiers amours est bash. Il reste un langage de script de prédilection lorsqu'il s'agit de manipuler des fichiers (leurs noms et leurs emplacements) ou encore lorsqu'il s'agit de lancer une suite de commandes. Certains vous diront leur préférence pour zsh mais je ne le connais pas.&lt;br /&gt;&lt;br /&gt;Je ferai l'impasse sur les différentes astuces du style xargs, cd $(dirname "$0"), declare -a, trap, sed | grep | cut | sort | uniq | head | tail, for i in $(seq 1 10), set -xv ou fonctions de 3 lignes simplissimes... mais si vous me posez une question j'essairai de vous répondre.&lt;br /&gt;&lt;br /&gt;L'idée est d'archiver les commandes ou fonctions difficiles ou tout du moins qui ne se refond pas en 10 secondes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Fonctions de date:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Afficher une belle date&lt;/span&gt;&lt;br /&gt;$&gt; date +%A-%d-%B-%G_%T&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Fonctions de variables:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemple:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Transforme tous les / en \/&lt;br /&gt;&lt;/span&gt;SOURCE=/tmp/toto&lt;br /&gt;$&gt; sedise DESTINATION SOURCE&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Enlever le dernier caractère d'une variable&lt;/span&gt;&lt;br /&gt;$&gt; DESTRINATION=${SOURCE:0:$((${#SOURCE}-1))}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;function sedise&lt;br /&gt;{&lt;br /&gt;eval "$1=\${$2//\//\\\/}"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Fonctions de contrôle des entrées utilisateur:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemples:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#on pose une question&lt;br /&gt;&lt;/span&gt;$&gt; demander "Quel est votre prénom" "$ALPHA" PRENOM&lt;br /&gt;$&gt; echo "Votre prénom est $PRENOM"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#on pose la même question mais en proposant une valeur par défaut&lt;/span&gt;&lt;br /&gt;$&gt; proposer "Quel est votre prénom" "$ALPHA" PRENOM Florent&lt;br /&gt;$&gt; echo "Votre prénom est $PRENOM"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#on pose la même question en proposant une valeur par défaut&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#à la différence que si la question avait déjà été posée (plus haut&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#dans le script ou alors dans une exécution précédente du script, on propose&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#par défaut la précédente réponse de l'utilisateur&lt;/span&gt;&lt;br /&gt;$&gt; suggerer "Quel est votre prénom" "$ALPHA" PRENOM Florent&lt;br /&gt;$&gt; echo "Votre prénom est $PRENOM"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ALPHA="[^[:alnum:]._-]"&lt;br /&gt;EMAILS="[^[:alnum:].@,-]"&lt;br /&gt;RESEAUX="[^[:digit:].,/]"&lt;br /&gt;MOTS="[^[:alnum:]. -]"&lt;br /&gt;MIN="[^a-z0-9]"&lt;br /&gt;NUM="[^0-9]"&lt;br /&gt;&lt;br /&gt;demander (){&lt;br /&gt;typeset DEManDER_TmpVAR__&lt;br /&gt;&lt;br /&gt;while [ -z "$DEManDER_TmpVAR__" ] || $(echo "$DEManDER_TmpVAR__"|grep -q "$2")&lt;br /&gt;do&lt;br /&gt;     echo -n "$1: "&lt;br /&gt;     read DEManDER_TmpVAR__&lt;br /&gt;done&lt;br /&gt;eval "$3=\"\$DEManDER_TmpVAR__\""&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;proposer (){&lt;br /&gt;typeset PROpoSER_TmpVAR__='*'&lt;br /&gt;&lt;br /&gt;while $(echo "$PROpoSER_TmpVAR__"|grep -q "$2")&lt;br /&gt;do&lt;br /&gt;     echo -n "$1 [$4]: "&lt;br /&gt;     read PROpoSER_TmpVAR__&lt;br /&gt;done&lt;br /&gt;if [ -z "$PROpoSER_TmpVAR__" ]; then&lt;br /&gt; eval "$3=\"$4\""&lt;br /&gt;else&lt;br /&gt; eval "$3=\"\$PROpoSER_TmpVAR__\""&lt;br /&gt;fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#fonction utilisée par suggerer&lt;/span&gt;&lt;br /&gt;function ecrire_config&lt;br /&gt;{&lt;br /&gt;cat &amp;gt; config.sh &amp;lt;&amp;lt;EOF&lt;br /&gt;VAR1="$VAR1"&lt;br /&gt;VAR2="$VAR2"&lt;br /&gt;#...&lt;br /&gt;EOF&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# sugerer "question" "controle" "nomVar" "defaut"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# Cette fonction est utile lors de la réexécution du script.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# Elle permet de récupérer les précédentes valeurs de sa configuration.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# si var -&gt; proposer question controle nomVar var&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# sinon -&gt; si defaut -&gt; proposer question controle nomVar defaut&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#          sinon -&gt; demander question controle nomVar&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# ATTENTION: ne pas appeler la fonction avec NOMVAR et $NOMVAR pour le défaut&lt;/span&gt;&lt;br /&gt;suggerer (){&lt;br /&gt;QUESTION="$1"&lt;br /&gt;CONTROLE="$2"&lt;br /&gt;NOMVAR="$3"&lt;br /&gt;DEFAUT="$4"&lt;br /&gt;eval VAR="\${$NOMVAR}"&lt;br /&gt;&lt;br /&gt;if [ "$VAR" ]; then&lt;br /&gt;proposer "$QUESTION" "$CONTROLE" "$NOMVAR" "$VAR"&lt;br /&gt;else if [ "$DEFAUT" ]; then&lt;br /&gt;proposer "$QUESTION" "$CONTROLE" "$NOMVAR" "$DEFAUT"&lt;br /&gt;else&lt;br /&gt;demander "$QUESTION" "$CONTROLE" "$NOMVAR"&lt;br /&gt;fi&lt;br /&gt;fi&lt;br /&gt;ecrire_config&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Fonctions relatives à Oracle&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemple:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Suppresion - création d'un user oracle&lt;/span&gt;&lt;br /&gt;$&gt; BDD_SYS_USER=system&lt;br /&gt;$&gt; BDD_SYS_PASS=manager&lt;br /&gt;$&gt; BDD_TNS=montnsname&lt;br /&gt;$&gt; delete_create_user_oracle NOM_USER PASS TBLSPACE TBLSPACE_TEMP&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Lister les tablespaces disponibles&lt;/span&gt;&lt;br /&gt;$&gt; BDD_SYS_USER=system&lt;br /&gt;$&gt; BDD_SYS_PASS=manager&lt;br /&gt;$&gt; BDD_TNS=montnsname&lt;br /&gt;$&gt; liste_tablespace&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Trouver quel user est présent dans un dump&lt;/span&gt;&lt;br /&gt;$&gt; cherche_user_dans_dump mon_fichier.dump&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#Modifier les tablespace dans un dump&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#requiert sed version 4 et plus&lt;/span&gt;&lt;br /&gt;$&gt; corrige_tablespace_dump mon_fichier.dump NOUVEAU_TABLESPACE&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;#utilise par delete_create_user_oracle&lt;/span&gt;&lt;br /&gt;function sortie&lt;br /&gt;{&lt;br /&gt;echo "Erreur fatale: $1"&lt;br /&gt;exit 255&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;# USER PASS TABLESPACE TMPTABLESPACE&lt;/span&gt;&lt;br /&gt;function delete_create_user_oracle&lt;br /&gt;{&lt;br /&gt;LOG="/tmp/delete_create_user_oracle_$1.log"&lt;br /&gt;&lt;br /&gt;if ! echo "&lt;br /&gt;DROP USER $1&lt;br /&gt;CASCADE;&lt;br /&gt;&lt;br /&gt;CREATE USER $1&lt;br /&gt;IDENTIFIED BY $2&lt;br /&gt;DEFAULT TABLESPACE $3&lt;br /&gt;TEMPORARY TABLESPACE $4&lt;br /&gt;QUOTA UNLIMITED ON $4&lt;br /&gt;QUOTA UNLIMITED ON $3;&lt;br /&gt;&lt;br /&gt;GRANT CONNECT TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE CLUSTER TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE INDEXTYPE TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE OPERATOR TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE PROCEDURE TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE SEQUENCE TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE TABLE TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE TRIGGER TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE TYPE TO $1;&lt;br /&gt;&lt;br /&gt;GRANT CREATE VIEW TO $1;&lt;br /&gt;&lt;br /&gt;ALTER USER $1 DEFAULT ROLE ALL;&lt;br /&gt;&lt;br /&gt;exit;&lt;br /&gt;&lt;br /&gt;" | sqlplus -S "$BDD_SYS_USER/$BDD_SYS_PASS@$BDD_TNS" &gt;"$LOG" ; then&lt;br /&gt;sortie "Erreur lors de la création du user Oracle"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if grep -v "^ORA-01918" "$LOG" | grep "^ORA-"; then&lt;br /&gt;sortie "Erreur lors de la création du user Oracle"&lt;br /&gt;fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function liste_tablespace&lt;br /&gt;{&lt;br /&gt;echo&lt;br /&gt;echo "Liste des tablespaces Oracle:"&lt;br /&gt;echo -e "set heading off\n select TABLESPACE_NAME from  user_tablespaces;\n exit\n" | sqlplus -S "$BDD_SYS_USER/$BDD_SYS_PASS@$BDD_TNS" | grep -v "^ *$\|rows selected"&lt;br /&gt;echo&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function cherche_user_dans_dump&lt;br /&gt;{&lt;br /&gt;grep --binary-files=text "^CONNECT " "$1" | head -1 | sed -e "s/CONNECT //g"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function corrige_tablespace_dump&lt;br /&gt;{&lt;br /&gt;BBD_IMPORT_TBS=$(grep --binary-files=text "^CREATE TABLE" "$1" | head -1 | sed -e "s/^.*TABLESPACE \"\([^\"]\+\)\".*/\1/g")&lt;br /&gt;&lt;br /&gt;if [ "$2" != "$BBD_IMPORT_TBS" ]; then&lt;br /&gt;echo "Rectification des tablespaces dans $1: replacement par $2..."&lt;br /&gt;if ! sed -i -e "s/TABLESPACE \"\([^\"]\+\)\"/TABLESPACE \"$2\"/g" "$1"; then&lt;br /&gt;    sortie "Erreur lors de la modification du fichier $1"&lt;br /&gt;fi&lt;br /&gt;fi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;D'autres fonctions utiles un jour sûrement...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114434880075872247?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114434880075872247/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114434880075872247' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114434880075872247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114434880075872247'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/04/bourne-again-shell.html' title='Bourne Again SHell'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114384224990266312</id><published>2006-03-31T23:40:00.000+02:00</published><updated>2006-04-03T19:20:22.436+02:00</updated><title type='text'>2 lignes ADSL et 1 linux</title><content type='html'>Voilà le topo: vous avez 2 lignes ADSL connecté à 1 linux. Vous aimeriez pouvoir vous connecter sur votre linux en utilisant l'une (A) ou l'autre (B) des IP publiques. Seulement voilà si vous ne faite rien de spéciale, l'une des 2 lignes (A) sera celle "par défaut". Toutes les connexions entrante sur (B) ne fonctionneront pas correctement. La cause est l'unique passerelle par défaut de votre système. Tous les paquets sortant vont sur la ligne (A) même si la connexion a été initié sur (B).&lt;br /&gt;&lt;br /&gt;Je ne vais pas parler de load-balancing. Notre problème à régler sera de faire revenir les paquets réponses sur la même ligne que les paquets entrant grâce à iproute2. Cet outil est présent dans linux depuis la version 2.4. La commande route, que vous connaissez surement  n'est qu'un wrapper simplifié de iproute2. Avec route vous ne gérer qu'une seule table de routage, celle par défaut. Nous allons créer une nouvelle table de routage qui accueillira&lt;br /&gt;la 2 ième passerelle par défaut. Pour celà on rajoute une ligne dans /etc/iproute2/rt_tables :&lt;br /&gt;$&gt; echo "2 ligneB" &gt;&gt; /etc/iproute2/rt_tables&lt;br /&gt;&lt;br /&gt;2: c'est la priorité. Les valeurs possibles vont de 1 à 252&lt;br /&gt;ligneB: c'est un label&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à renseigner notre nouvelle table de routage:&lt;br /&gt;$&gt; ip route add default via passerelle_ligneB dev dev_ligneB table ligneB&lt;br /&gt;&lt;br /&gt;exemple:&lt;br /&gt;$&gt; ip route add default via 81.27.34.254 dev eth1 table ligneB&lt;br /&gt;&lt;br /&gt;Ensuite il faut indiquer au système d'utiliser cette table de routage pour les paquets qui concerne la ligne B:&lt;br /&gt;$&gt; ip rule add from ip_ligneB lookup ligneB prio 1000&lt;br /&gt;&lt;br /&gt;1000: c'est une priorité. Vous pouvez voir les priorité de tables avec "ip rule". Nous devons inclure notre nouvelle table avant la table "main" qui a une priorité de 32766.&lt;br /&gt;&lt;br /&gt;exemple:&lt;br /&gt;$&gt; ip rule add from 81.27.34.157 lookup ligneB prio 1000&lt;br /&gt;&lt;br /&gt;Une dernière commande pour la route, il faut reconstruire le cache des routes:&lt;br /&gt;$&gt; ip route flush table cache&lt;br /&gt;&lt;br /&gt;Vous pouvez maintenant vous connecter sur l'une ou autre des IP publiques. Tous les services locaux fonctionneront. Ceci n'est pas valable si vous faites des "port forwarding" sur des machines de votre LAN. De la même manière toutes les connexions sortantes utiliseront la ligne par défaut.&lt;br /&gt;&lt;br /&gt;Enfin n'oubliez pas de mettre les 3 commandes dans /etc/rc.d/rc.local pour vous éviter de les taper à chaque redémarrage de la machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114384224990266312?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114384224990266312/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114384224990266312' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114384224990266312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114384224990266312'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/03/2-lignes-adsl-et-1-linux.html' title='2 lignes ADSL et 1 linux'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114373518996905748</id><published>2006-03-30T17:40:00.000+02:00</published><updated>2006-04-07T16:21:39.266+02:00</updated><title type='text'>Macro Java avec OpenOffice.org</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5969/2591/1600/openoffice.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5969/2591/320/openoffice.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;Avec &lt;a href="http://fr.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; version 2 vous pouvez écrire des macros en Basic OOo, &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://fr.wikipedia.org/wiki/JavaScript"&gt;Javascript&lt;/a&gt;, &lt;a href="http://www.beanshell.org/"&gt;Beanshell&lt;/a&gt; et &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;. Tandis que les 4 premiers sont interprétés, Java doit être compilé au préalable avant d'être utilisé dans des documents.&lt;br /&gt;&lt;br /&gt;Voici un exemple de macros Java. J'ai utilisé JDK 1.5 et Ecplise 3.1 pour le réaliser.&lt;br /&gt;&lt;br /&gt;Dans Eclipse vous créez un nouveau projet. Vous y ajoutez les jars de OOo (répertoire program/classes). Le mieux est de créer une "user libray" correspondant à OOo. Ensuite, pour une macro destinée à être utilisée dans Calc, créez une nouvelle classe comme ceci:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//Jars inutilisés dans cet exemples, nécessaires à Axis&lt;br /&gt;import java.net.MalformedURLException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.rmi.RemoteException;&lt;br /&gt;import javax.xml.rpc.ServiceException;&lt;br /&gt;&lt;br /&gt;//Jars de OOo&lt;br /&gt;import com.sun.star.awt.ActionEvent;&lt;br /&gt;import com.sun.star.container.NoSuchElementException;&lt;br /&gt;import com.sun.star.lang.IndexOutOfBoundsException;&lt;br /&gt;import com.sun.star.lang.WrappedTargetException;&lt;br /&gt;import com.sun.star.script.provider.XScriptContext;&lt;br /&gt;import com.sun.star.sheet.XSpreadsheet;&lt;br /&gt;import com.sun.star.sheet.XSpreadsheetDocument;&lt;br /&gt;import com.sun.star.sheet.XSpreadsheets;&lt;br /&gt;import com.sun.star.table.XCell;&lt;br /&gt;import com.sun.star.uno.UnoRuntime;&lt;br /&gt;&lt;br /&gt;public class MyHelloWorld2 {&lt;br /&gt;     &lt;br /&gt;      public static void printHW(XScriptContext xSc, ActionEvent evenement) {&lt;br /&gt;          //evenement.ActionCommand&lt;br /&gt;          // Obtenir le document&lt;br /&gt;          XSpreadsheetDocument xcalcdocument = (XSpreadsheetDocument) UnoRuntime.queryInterface( XSpreadsheetDocument.class, xSc.getDocument());&lt;br /&gt;          //Obtenir le classeur&lt;br /&gt;          XSpreadsheets  classeur  = xcalcdocument.getSheets();&lt;br /&gt;          XSpreadsheet feuille1;&lt;br /&gt;          XSpreadsheet params;&lt;br /&gt;          XCell selection;&lt;br /&gt;          try {&lt;br /&gt;                  //Obtenir les feuilles nommée feuille1 et params&lt;br /&gt;                  feuille1 = (XSpreadsheet) UnoRuntime.queryInterface( XSpreadsheet.class, classeur.getByName("Feuille1"));&lt;br /&gt;                  params   = (XSpreadsheet) UnoRuntime.queryInterface( XSpreadsheet.class, classeur.getByName("params"));&lt;br /&gt;                 //Obtenir la/les cases sélectionnée(s) par l'utilisateur&lt;br /&gt;                  selection= (XCell)        UnoRuntime.queryInterface( XCell.class       , xSc.getDocument().getCurrentSelection());&lt;br /&gt;                                 &lt;br /&gt;                  String ret = "";&lt;br /&gt;                 &lt;br /&gt;                  try {&lt;br /&gt;                    //Obtenir la valeur d'une cellule&lt;br /&gt;                    double valeur = selection.getValue();&lt;br /&gt;                   &lt;br /&gt;                    int ligne=10;&lt;br /&gt;                    int colonne=0;&lt;br /&gt;                    int nb_lignes=12;&lt;br /&gt;                    int nb_colonnes=7;&lt;br /&gt;                   &lt;br /&gt;                    //On vide un ensemble de cellules&lt;br /&gt;                    for(int i=0; i&amp;lt;nb_lignes ; i++){&lt;br /&gt;                        for(int j=0; j&amp;lt;nb_colonnes; j++){&lt;br /&gt;                            feuille1.getCellByPosition(colonne+j,ligne+i).setFormula("");&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    //On renseigne une cellule&lt;br /&gt;                    feuille1.getCellByPosition( 2 , ligne-2  ).setValue( valeur);&lt;br /&gt;                    //...&lt;br /&gt;                   &lt;br /&gt;                  } catch (IndexOutOfBoundsException e) {&lt;br /&gt;                    e.printStackTrace();&lt;br /&gt;                    ret += e.toString();&lt;br /&gt;                  }&lt;br /&gt;                  feuille1.getCellByPosition( 1 , 29 ).setFormula( ret );&lt;br /&gt;                               &lt;br /&gt;          } catch (NoSuchElementException e1) {&lt;br /&gt;                e1.printStackTrace();&lt;br /&gt;          } catch (WrappedTargetException e1) {&lt;br /&gt;                e1.printStackTrace();&lt;br /&gt;          } catch (IndexOutOfBoundsException e) {&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;          }&lt;br /&gt;                   &lt;br /&gt;      }// printHW&lt;br /&gt;     &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le paramètre "ActionEvent evenement" est nécessaire si vous voulez nicher votre macro derrière un bouton que vous aurez placé dans le document.&lt;br /&gt;&lt;br /&gt;Une fois compilé le tout il faut "exporter" votre projet en .jar à l'aide d'Eclipse.&lt;br /&gt;&lt;br /&gt;Enfin il reste à enregistrer la macro dans openoffice. Un exemple est présent dans le répertoire share/Scripts/java/HelloWorld. En gros il faut mettre un .jar qui contient toutes vos classes et un fichier XML de description de la macro. Sous windows vous pouvez mettre la nouvelle macro dans "Application Data\OpenOffice.org2\user\Scripts\java".&lt;br /&gt;&lt;br /&gt;Si vous devez utiliser des bibliothèques additionnelles, il faut déclarer les .jar dans outils-&gt;option-&gt;java-&gt;classpath.&lt;br /&gt;&lt;br /&gt;Il est possible de distribuer des macros Java avec les documents. Il faut les ajouter dans le zip cat tous les document OOo sont en fait des archives zip.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114373518996905748?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114373518996905748/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114373518996905748' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114373518996905748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114373518996905748'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/03/macro-java-avec-openofficeorg.html' title='Macro Java avec OpenOffice.org'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24909469.post-114356030229072177</id><published>2006-03-28T17:27:00.000+02:00</published><updated>2006-03-28T17:38:22.300+02:00</updated><title type='text'>Ouverture du Blog</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5969/2591/1600/ouverture.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5969/2591/320/ouverture.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Souvent j'ai des infos à partager avec les autres ou avec moi-même (quand je veux retrouver des infos sur un travail passé). Auparavant je modifiais &lt;a href="http://florent.guiliani.free.fr/"&gt;une page web&lt;/a&gt; à la main. Ecrire des articles dans un blog est peut-être un meilleur moyen.&lt;br /&gt;&lt;br /&gt;Je ne sais pas quel service de blog utiliser alors j'ai pris celui référencé dans &lt;a href="http://www.google.com/intl/fr/options/"&gt;les outils google&lt;/a&gt; on verra bien ce que ça donne à l'usage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24909469-114356030229072177?l=flyerenv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyerenv.blogspot.com/feeds/114356030229072177/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24909469&amp;postID=114356030229072177' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114356030229072177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24909469/posts/default/114356030229072177'/><link rel='alternate' type='text/html' href='http://flyerenv.blogspot.com/2006/03/ouverture-du-blog.html' title='Ouverture du Blog'/><author><name>Florent Guiliani</name><uri>http://www.blogger.com/profile/14176233154545597855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.guiliani.fr/florent_guiliani.jpg'/></author><thr:total>1</thr:total></entry></feed>
