Niveau :

Résumé : slirp
Si vous n'êtes pas admin de la machine sur laquelle vous êtes (université ?), mais que vous voudriez partager votre connexion, par exemple pour une machine virtuelle ou pour des amis qui voudraient emprunter votre IP ... Il vous faut du NAT (a moins que vous vous contentiez d'un simple tunnel).
Problème : vous ne pouvez pas le mettre en place puisque vous n'êtes pas admin sur la machine qui partage la connexion.
Solution : slirp.
Hé oui c'est tout simple, slirp décapsule du PPP pour l'injecter dans de une socket normale et donc fait l'équivalent du NAT. Mais avec quelques limitations, on ne peut pas faire passer n'importe quel paquet (genre ping) depuis l'espace utilisateur, malgré tout c'est largement suffisant.
Bon c'est pas si simple mais presque.
Slirp est une commande qui utilise le l'entrée et sortie standard pour communiquer ce qui fait que si on veut l'utiliser à distance il faut le connecter à un "listener", ici nous allons utiliser socat, mais si vous voulez un tunnel chiffré, utilisez stunnel.
Donc vous avez besoin de socat et slirp sur la machine où vous êtes simple utilisateur. Si vous ne les avez pas recompilez les vous avez le droit. Si vous n'avez pas de compilateur copiez-lez depuis une autre machine, si cela ne fonctionne pas, recompilez les chez-vous en statique ... enfin vous êtes grands que diable, ne me posez pas cette question !
Il vous faut un fichier de configuration minimaliste pour slirp (à mettre dans ~/.sliprc) :
ppp asyncmap 0
Puis lancez le service genre sur le port 2000 (fullbolt = pas de limitation de vitesse) :
$ socat -s tcp4-listen:2000,fork system:/usr/bin/slirp-fullbolt
Ici c'est légèrement plus compliqué. Tout d'abord il faut être root puisque nous allons faire un vpn, donc un réseau, donc une interface et du routage. Pour cela il nous faut l'autre bout du tunnel (toujours socat dans l'exemple, mais vous pouvez utiliser stunnel pour faire du ssl) et pppd qui est en quelque sorte le client naturel de slirp.
Petite configuration optimisée de pppd pour correspondre à celle de slirp (à mettre dans /etc/ppp/peers/slirp) :
notty 115200 noauth lcp-echo-interval 0 asyncmap 0 nodefaultroute nodetach
Et c'est parti on se connecte :
$ socat tcp-connect:host3.enstb.com:2000 system:"pppd call slirp"
Maintenant nous avons une connexion mais un peu spéciale car slirp a des exigences :
Et ppd configure le tout pas proprement donc il faut supprimer l'ip qu'il a ajouté. Malheureusement slirp non plus n'est pas très doué en configuration réseau et utilise l'adresse 10.0.2.0 ce qui fait que soit vous utilisez un /16 soit vous vous débrouillez pour que 10.0.2.0 soit correctement routée soit vous n'accédez jamais à l'interface de slirp à distance.
Choisissons le premier cas, donc pour activer le routage coté client configurez comme indiqué, en live cela donne :
$ ip addr del 10.0.2.15 dev ppp0 $ ip addr add 10.0.0.0/16 dev ppp0 $ ip route add default via 10.0.2.2 dev ppp0 # tout ce que vous voulez tout router par là
Et oualà !
Slirp est configurable dynamiquement, ce qui veut dire qu'un telnet 10.0.2.0 permet d'accéder à une interface d'admin de slirp.
Les commandes disponibles sont les mêmes que celle qu'on peut mettre dans le fichier de configuration. L'une de ces commandes est redir qui permet de faire des redirections qu'on appellerait port forwarding sur un routeur NAT.
redir [once|time] [udp|tcp] PORT [to] [ADDRESS:]LPORT
Exemple pour permettre l'accès au port ssh local depuis l'extérieur sur le port 2222 :
$ telnet 10.0.2.0 redir 2222 22 quit
Slirp a bien d'autres usages. Au départ slirp a été inventé pour faire du réseau sur un modem.
Mais il est aussi intégré à certains autre outils comme :
Niveau :

Résumé : housing, server hosting, vps, web hosting
Petite fiche technique pour ne pas se perdre dans le monde de l'hébergement :
C'est le même terme en français, on dit aussi colocation, il désigne en général la fourniture de l'espace dans une armoire, du réseau et de l'électricité et c'est tout.
Pourtant c'est en général l'offre la plus chère car la plus lourde à gérer pour l'hébergeur. C'est plutôt destiné aux entreprises qui ont leur propre matériel et/ou dont l'activité sera de revendre l'accès à leur propre matériel.
Ou serveur dédié en français. Pratique pour une PME, ce concept permet à un sysadmin ou une petite boite d'avoir un ou des serveurs qu'elle gère entièrement, sans contraintes mais aussi sans avoir à gérer la redondance électrique ou la redondance du réseau.
On a en général une bien meilleure disponibilité et un bien meilleur débit qu'un serveur hébergé chez soi. Donc valable dès qu'on offre des services à l'extérieur. De plus on ne s'embête plus avec les matériel et ses pannes ou presque.
Ou serveur virtuel en français. C'est une machine virtuelle sur laquelle vous avez tout pouvoir (root) mais située sur une machine physique partagée avec d'autres clients.
Cela permet de faire des machines très peu chères en contrepartie d'une absence de garantie de performances.
A noter qu'OVH a sorti un produit intermédiaire entre le vps et le dédié nommé RPS. Il s'agit d'un dédié léger mais dont le disque est partagé sur le réseau.
Hébergement mutualisé en français. Ce genre d'offre en général est la moins cher et la plus facile à gérer. Disponible immédiatement ou presque, vous avez plus ou moins d'espace disque, une base de données plus ou moins grosse et un virtualhost php avec parfois un nom de domaine.
A choisir lorsqu'on fait un "simple" site web.
Petit nouveau, le cloud désigne en fait un groupe de machines dont on vous vend la puissance de calcul. Il existe autant de formes de cloud que de vendeurs de cloud, tous ont cette particularité de vendre des quantités variables.. Il y a ceux qui vous vendent des vm en grande quantité, il y a ceux qui vous vendent des serveurs d'application, il y a ceux qui vous vendent de la base de données ou du simple dépôt de fichier.
A choisir lorsqu'on a des applications scalable et qu'on prévoit un grand nombre de clients potentiels.
Les hébergeur offrent aussi sous forme de pack des noms de domaine, des services dns, des services de boite mail, d'envoi en masse de mail, en général pour pas trop cher, cherchez, vous trouverez.
Il existe aussi d'autres offres plus rares d'hébergement d'application ruby, python, java mais il faudra chercher pour trouver quelque chose d'intéressant.
Dans le genre exotique vous verrez aussi des offres de type shell où vous avez un shell sur une machine partagée entre plusieurs utilisateurs. Ce genre d'activité nécessite en général une certaine confiance et a plutôt tendance à fonctionner à travers des réseaux sociaux.
Tags:Hébergement, Matériel
That’s a recurring question I get asked: What does “mraw” mean?
Over 2 years ago, I changed my mail signature from the traditional:
--
$FULLNAME
to:
Mraw,
KiBi.
I became a DD back then, so I put my now-become-my-login-as-well nickname there. About the “mraw” part, I kind of like felines in general, and felis catus in particular. Onomatopœias like “maw” or “meow” are nice, but that’s even cuter when there’s some purring happening at the same time, hence the ‘r’ addition in there.
The X Strike Force needs you! (redux)
This time, the focus is on the
xserver-xorg-video-intel
driver. KMS and UMS are going to be used heavily below, one may
want to check the
mode-setting wikipedia article
and the
modesetting page on X.org.
Intel follows a 3-month cycle for its video driver releases. Some comments on the last ones:
2.9: What we’ve had in Debian for some time already. Works mostly
fine, supports both KMS and UMS. What we’ve planned to release
with for some time already.
2.10: First version with ripped-off UMS support. Not a
significant improvement.
2.11: Apparently (still) having a bunch of regressions from 2.9,
which is why we didn’t switch to it.
2.12: Many regressions are supposed to be fixed, meaning it could
compete with 2.9, which is why we need you.
It’d be nice to have users install 2.12 from experimental and see
how it goes from here. If regressions are found, we should be able to
try hard(er) to get them fixed, so that we can move 2.12 to
unstable and release with it. If there are too many of them, and if
they’re not going to be fixed on time, we might stick with 2.9.
Pulling the driver from experimental should be quite easy: libdrm*
packages are going to be upgraded, but that’s mostly it (meaning the
server itself will stay the same, and rolling back should be as easy
as downgrading the driver and the libdrm* packages).
A note on KMS and UMS: a benefit of sticking with 2.9 was being
able to switch back to UMS in case KMS wasn’t usable for some
cards. Unfortunately, popular/well-spread cards like i8xx aren’t
well supported yet, that’s why Chris Wilson (upstream) is considering
introducing UMS support again for that kind of blacklisted
cards. This way, it should be possible to move to 2.12 (including
Chris’ work) without leaving some users behind.
Feedback appreciated as follows:
If 2.9 used to work and if 2.12 doesn’t: please
file a bug upstream.
If 2.12 works while 2.9 didn’t, reportbug -k or debian-x@.
Thanks already!
Pour ceux qui comme moi, se font avoir par aptitude et qui n'ont eu d'autre choix que de migrer vers Thunderbird 3, voilà une manip qui permet de bypasser la demande de mot de passe général :
Ensuite dans les préférences > sécurité > mot de passe, vous pouvez décocher "utiliser un mot de passe principal".
Par contre, il semble que si un user veut quand même un mot de passe, un bug fait que la popup s'ouvre plus d'une fois pour le demander...
Vous n’avez surement pas raté l’annonce de l’iPhone 4 et d’iOS 4 qui apporte bon nombre de fonctionnalités.
Il va donc falloir encore plus tapoter sur l’écran et les rare boutons de l’iPhone pour en profiter pleinement.
Et sinon pour l’iPhone 5 on aura le droit à une bouton en plus pour éviter d’avoir tapoter, double cliquer, triple tapoter et encore cliquer pour pouvoir faire quelque chose ?
Juste un chiffre : 99,4 heures. Le temps d'ensoleillement à Dresde au mois de mai de cette année. C'est moins de la moitié de la moyenne (224,7h en 2009 et 263,7h en 2008 par exemple). Il y eu 9 jours sans aucun soleil sur ce mois. C'est le record minimal du nombre d'heures depuis au moins 1976 (j'ai pas les données pour plus tôt...). Et une pluie six fois supérieure à ce que j'avais connu en mai 2008 en arrivant...
En résumé : un bon temps pourri, espérons que le mois de juin soit plus clément !
Aujourd'hui, je suis tombé sur un tweet d'Amandine :
:%s/\ r//g to remove all those nasty ^M from a file, or :%s/\ r$//g for only at the end of a line.
La source est ici : http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix, j'espère que ça vous servira autant qu'à moi !
Alors qu'un graphe moins ouvert que son nom l'indique laisse planer une ombre inquiétante sur la Toile et que l'air est électrique entre deux géants naguère alliés, cela fait bien longtemps que vous n'avez pas eu de nouvelles de votre serviteur. Se terrerait-il apeuré en attendant que l'orage passe ?
Non, il se trouve simplement que je suis un peu dans les nuages en ce moment et que j'ai fait le choix de dédier le temps libre qu'il me reste à des choses plus drôles que relater les tristes nouvelles du Réseau et du monde Libre.
En clair, ne vous attendez pas à une déferlante d'articles dans les mois à venir. En plus de ça, Arch Lua, qui n'a jamais vraiment été lancé, est enterré jusqu'à nouvel ordre, à moins que quelqu'un ne propose spontanément d'en prendre les rennes.
Moins drôle : j'ai appris le décès de funkyou, avec qui j'avais eu l'occasion de discuter par email et IRC comme nombre d'Archers. RIP et bravo pour le travail accompli.
C'est de l'information pas très fraîche, un peu comme du poisson de Bretagne qui arriverait en Saxe pendant qu'un nuage de cendre se promène sur l'Europe. Mais voilà, je suis de retour à Dresde depuis la toute fin mars. Après six mois de vie en collocation à Rennes pour suivre ma dernière année de formation d'ingénieur, je fais donc désormais mon stage de fin d'étude à la faculté technologique de Dresde.
Le sujet de mon stage est l'amélioration de JAP, j'en avais déjà parlé un peu dans un précédent billet. Actuellement ce logiciel fonctionne très bien et garanti une navigation anonyme sur internet. Mais il est malheureusement trop facile à censurer. L'installation de serveurs de Mix est très coûteuse, et n'est donc pas envisageable à grande échelle. Un censeur peut bloquer les IP de ces serveurs, et c'est la fin du système. C'est là qu'intervient mon stage, permettre un système anti-censure efficace (par utilisation de relais en P2P, en faisant de l'IP over Skype, et toutes les autres solutions étranges que l'on pourrait imaginer...). L'objectif est d'avoir suffisamment de solutions pour forcer la censure à bloquer l'ensemble de l'internet, ou à ne rien bloquer pour quelqu'un qui utilise le logiciel.
Au niveau des conditions de travails, c'est plutôt cool. Je fais ce que je veux sur mon ordinateur, j'ai deux grands écrans, deux adresses IP publiques rien que pour moi et aucun filtrage en flux sortants. Et plus important, au niveau humain, ça se passe très bien avec mon chef. Donc je suis très content d'avoir choisi ce stage 
Sans parler du logement qui sera le sujet d'un prochain billet, je suis content d'en avoir terminé la semaine dernière avec tous les points administratifs. L'inscription à la faculté a été un peu laborieuse (mais bon, c'est ça d'être un étudiant en dehors d'un accord, il y a plus de papiers à fournir que pour un erasmus...). En revanche, l'inscription à la ville à été des plus simples, J'avais de toute façon oublié de me désinscrire en sortant donc ils ont juste effectué un changement d'adresse. Et maintenant que tout ça est fait, je sais que je vais être tranquille pour les six mois à venir.
Juste un petit post pour signaler que Peck, un vieux du ResEl, a posté un excellent article de vulgarisation sur la nature d'Internet. Les barbus n'y apprendront rien, mais ceux qui cherchent à comprendre sans forcément avoir de notions techniques devraient y jeter un œil.
Dans le même ordre d'idées, le Standblog donne un lien vers une interview d'Eben Moglen qui explique comment on pourra tuer la bête Facebook. N'oubliez pas : le film est long mais la liberté triomphe à la fin.
Il y a longtemps que je pense que l’ordinateur tel que nous le connaissons n’a pas d’avenir chez la plupart des particuliers.
Si je pensai que Google était le mieux placer pour entrer dans ce concept avec une Google Box, on en a toujours pas vu le jour, et même si ils ont annoncé Chrome OS, il tarde à pointer le bout de son nez.
Au final c’est peut-être Apple, avec l’iPad qui va rafler la mise. Un navigateur pour surfer, un client email pour ceux qui n’utiliserait pas un webmail, et la possibilité de lancer des applications locales avec la possibilité de synchroniser les données avec la même application version “poche” (téléphone portable).
On se retrouve avec ni plus ni moins avec un écran “intelligent” qui ne sert qu’a afficher des données qui sont “quelque part”. Ca doit surement rappeler les années 70 à certain…
Quand j'écoute Sound of Silver de LCD Soundsystem, je me revois marcher au crépuscule, dans le parc devant la gare de Zagreb. Parce qu'en déambulant là, en attendant de reprendre le train pour la destination suivante, c'était l'album qui tournait dans (feu) iPied.
Ton invitation, de Louise Attaque, c'est avant tout Joseph, dans ce car à Taipeh en 1998, alors qu'on demande à sa cousine Florence, si dans ses écouteurs, c'était pas un peu fort. « mais c'est seulement à 8 !».
Alone again or, je l'ai dans mes oreilles, alors que je descends à vélo, à fond, de la colline près de Håga, derrière Flogsta (je sais que c'est mal de faire du vélo avec les écouteurs).
Is This It, les Strokes, ce n'est pas pour moi la pub pour EDF. Mais c'est scruter mon radio réveil, en 2001, pour écouter leur concert organisé par Oui FM, où j'ai failli aller, mais finalement non. J'aurais aimé.
Skeletal Lamping de Of Montreal, c'est plein de souvenirs, en concerts, ce sont des écoutes en boucle 24 fois de suite. Mais j'ai commencé dans le train entre Uppsala et Stockholm, en septembre 2008, quand je me demandais si c'était bien raisonnable de l'écouter alors que l'album n'était pas officiellement sorti, et que oh, finalement si.
Jean-Jacques Goldman, je suis allongé sur l'herbe, devant l'immeuble d'en face, alors que Flogsta s'est un peu vidé, ces derniers jours. Et qu'à ce moment, ça me rappelle quand on le chantait à l'école primaire. À nos actes manqués.
Et Kings of Convenience. Je n'arrive plus à les écouter. J'aimerais bien que ça revienne, j'aime bien leur musique.
Voilà 3 ans, j'ouvrais ce blog pour raconter mes aventures en deuxième année à Telecom Bretagne. Voilà 2 ans, je vous souhaitais la bonne année depuis la Californie (enfin, j'étais dans l'avion pour la grande partie du 1er janvier 2008 mais c'est le geste qui compte). Voilà 1 an, dans une tentative de raviver ce blog (avec un échec cuisant si vous... Lire Happy New Year !**
Rue Bleury, Montreal
L'autre jour, je suis allé au supermarché du coin acheter des carottes avec des fanes. C'était le 31, en fin d'après-midi, et forcément blindé de monde à la caisse. La caisse à ma droite est une caisse pour laquelle priorité est donnée aux «femmes enceintes, jeunes mamans, handicapés et invalides». Il faut donc les laisser passer. En vrai, ça n'arrive quasiment jamais. Mais là si.
La file fait la dizaine de personnes. Une maman arrive, un nourrisson dans les bras, un gosse de 3 ans lui tenant la main. Regards désolés, excuses, elle passe devant 5 ou 6 personnes. Normal, ils étaient conscients du panneau de priorité à droite.
3 minutes plus tard. Un vieille femme accompagne un homme en fauteuil roulant, à la motricité et l'élocution réduites. Le femme, très fort, «pardon, j'ai priorité, laissez le passer ». De manière très élégante. Elle arrive à hauteur de la maman avec le nourrisson et le gosse de 3 ans lui tenant la main. «laissez le passer madame». Regard désolé, coup d'œil vers le bébé, regard désolé. She wins.
I’ve not used RRDtool for a while and put back my attention on it few weeks ago. I found out that lots of new cool stuff are avalaible, like LSLSLOPE, LSLINT. These function return the parameters of the Least Squares Line (y = ax +b) approximating a dataset (LSLSLOPE return a, LSLINT return b).
This is interesting because with the function approximating your data you can graph a prediction of future data. Of course a Least Squares Line function will work best to approximate a dataset that tend to grow or shrink (like filesystem usage, memory usage, …) but not for data like temperature. I would say that if your data can be expressed in a percentage, an Least Squares Line can be fine. For data not tending to grow or shrink rrdtool provide some other function like TREND and PREDICT.
I will show how to use LSLSLOPE and LSLINT taking memory usage of a device as an example. My exemple will produce a graph like the following :

As you see, the graph show trend using two Least Squares Line function, one generated from the full dataset (dataset is starting 24 Oct 2009) and one generated only from last week data. Projection on time axis is done from 90% to 100% of memory usage and the date resulting of calculation for 90% and 100% of usage is displayed. I’ve seen lots of question asking how to do this but did not found any answer, so I hope that my example will provide an answer.
Here is the perl code I’m using to generate this graph. There is no Perl specific code, so it can be converted to a normal rrdtool command.
#! /usr/bin/perl use RRDs; $rrd_file = 'MEMORY.rrd'; RRDs::graph "MEMORY_Trend.png", '--start', "10/24/2009", '--end', "12/31/2009 00:00am", '--title', "Memory Usage", '--interlace', '--width=620', '--height=200', "--color","ARROW#009900", '--vertical-label', "Memory used (%)", '--lower-limit', '0', '--upper-limit', '100', '--border','0', '--rigid', "DEF:used1=$rrd_file:used:AVERAGE", "DEF:used2=$rrd_file:used:AVERAGE:start=10/24/2009", "DEF:used3=$rrd_file:used:AVERAGE:start=-1w", "DEF:used4=$rrd_file:used:AVERAGE:start=-2w", "DEF:used5=$rrd_file:used:AVERAGE:start=-4w", "DEF:free1=$rrd_file:free:AVERAGE", "DEF:free2=$rrd_file:free:AVERAGE:start=10/24/2009", "DEF:free3=$rrd_file:free:AVERAGE:start=-1w", "DEF:free4=$rrd_file:free:AVERAGE:start=-2w", "DEF:free5=$rrd_file:free:AVERAGE:start=-4w", "CDEF:pused1=used1,100,*,used1,free1,+,/", "CDEF:pused2=used2,100,*,used2,free2,+,/", "CDEF:pused3=used3,100,*,used3,free3,+,/", "CDEF:pused4=used4,100,*,used4,free4,+,/", "CDEF:pused5=used5,100,*,used5,free5,+,/", "HRULE:100#FF000044", "HRULE:99.5#FF000044", "HRULE:99#FF000044", "HRULE:98.5#FF000044", "HRULE:98#FF000044", "HRULE:97.5#FF000044", "HRULE:97#FF000044", "HRULE:96.5#FF000044", "HRULE:96#FF000044", "HRULE:95.5#FF000044", "HRULE:95#FF000044", "HRULE:94.5#FF000022", "HRULE:94#FF000022", "HRULE:93.5#FF000022", "HRULE:93#FF000022", "HRULE:92.5#FF000022", "HRULE:92#FF000022", "HRULE:91.5#FF000022", "HRULE:91#FF000022", "HRULE:90.5#FF000022", "HRULE:90#FF000022", "COMMENT: Now Min Avg Max\\n", "AREA:pused1#00880077:Memory Used", 'GPRINT:pused1:LAST:%12.0lf%s', 'GPRINT:pused1:MIN:%10.0lf%s', 'GPRINT:pused1:AVERAGE:%13.0lf%s', 'GPRINT:pused1:MAX:%13.0lf%s' . "\\n", "COMMENT: \\n", 'VDEF:D2=pused2,LSLSLOPE', 'VDEF:H2=pused2,LSLINT', 'CDEF:avg2=pused2,POP,D2,COUNT,*,H2,+', 'CDEF:abc2=avg2,90,100,LIMIT', 'VDEF:minabc2=abc2,FIRST', 'VDEF:maxabc2=abc2,LAST', 'VDEF:D3=pused3,LSLSLOPE', 'VDEF:H3=pused3,LSLINT', 'CDEF:avg3=pused3,POP,D3,COUNT,*,H3,+', 'CDEF:abc3=avg3,90,100,LIMIT', 'VDEF:minabc3=abc3,FIRST', 'VDEF:maxabc3=abc3,LAST', "AREA:abc2#FFBB0077", "AREA:abc3#0077FF77", "LINE2:abc2#FFBB00", "LINE2:abc3#0077FF", "LINE1:avg2#FFBB00:Trend since 24 Oct 2009 :dashes=10", "LINE1:avg3#0077FF:Trend since 1 week\\n:dashes=10", "GPRINT:minabc2: Reach 90% @ %c :strftime", "GPRINT:minabc3: Reach 90% @ %c \\n:strftime", "GPRINT:maxabc2: Reach 100% @ %c :strftime", "GPRINT:maxabc3: Reach 100% @ %c \\n:strftime", ; my $ERR=RRDs::error; die "ERROR : $ERR" if $ERR;
With work taking most of our time lately, my girlfriend and I needed to find as many ways as possible to change our minds once we were back home. This is how we found a real enjoyable online RPG called Nodiatis.
The game has reached quite a high level of maturity. There is a large community of players and the game allows a great deal of different characters' builds ranging from the basic but very efficient warrior to the more difficult to play but, in my opinion, more interesting to play spell caster.
With as many as 26 classes and a whole load of different skills, this is one of the richest web-based online RPG we have ever played.
Ok... Even though I am extremely busy and have had very little time to do anything Debian-related lately, I guess I'll have to do this one day or another, so here it is.
I created a new GPG key which I am transitionning to and I have prepared a transition document signed by both keys.
Presque 3 semaines sans nouvelles sur ce blog, une petite baisse de motivation et pourtant, ce n'est pas les choses qui manquent à raconter. En effet, nous avons terminé notre voyage avec Matt (et mes parents pour une partie), les photos et le compte rendu de notre tentative d'ascension du Mont Whitney, le sommet des États-Unis contiguës, sont... Lire Pas de nouvelle, bonne nouvelle ?
Samedi dernier (il y a donc une semaine), Nico, Alexis & moi même sommes allés sur l'île des pins, une île se trouvant au sud de la Nouvelle Calédonie.Après un voyage sans problème de tangage intensif ni de perte de lunettes (...), nous sortons du bateau pour découvrir un magnifique ciel bleu et une plage de sable blanc qui brûle les yeux. L'eau y... Lire L'île des pins
Tous ceux qui travaillent avec Eclipse et qui ont un plugin svn (subclipse la plupart du temps) ont du un jour rencontrer ce problème. On ajoute un repository svn dans la perspective « SVN Repositories » et entre son login/mdp de connexion au serveur. Pour une raison x ou y, on doit changer d’identifiant quelques temps après …et là aucun moyen de retrouver ce fichu prompt qui demande de s’identifier.
Dans ce post je vais passer rapidement en revue les méthodes pour supprimer les mots de passe enregistrés par svn en fonction de votre OS.
Sous Mac Os X
Sous Linux
Cela va dépendre de l’interface choisie pour SVN dans vos préférences Eclipse : Preferences > Team > SVN > SVN interface
Sous Windows
La encore cela dépend de l’interface SVN choisie :
A bientôt.
...pour un voyage à l'autre bout du monde. Ça va commencer à devenir une tradition, mais après une soirée assez (trop ?) bien arrosé, me voici après 4h30 de sommeil "frais et dispo" pour aller prendre mon train qui m'emmena directement à l'aéroport de Paris Charles de Gaulle. "Vous êtes bien arrivé à Paris..." La journée commence bien, avec le TGV... Lire Et c'est reparti...
Cet article est une proposition de traduction de l’article de Vicent Patington : Do we really need DAO ?
Commençons par la chose que vous allez probablement écrire en premier dans une application JPA : le data access object , aka DAO. Un premier point qu’il faut soulever avant même de commencer cet article est de savoir si oui ou non on a réellement besoin d’un DAO lorsqu’on utilise JPA. Il y a un peu plus d’un an, la conclusion de ce débat a été : « Ça dépend ! ». Et même s’il est assez difficile de discuter une telle conclusion
, pour moi, un DAO a bel et bien sa place dans une application JPA. On peut soutenir que ce n’est qu’une fine couche au dessus de JPA, mais avoir un DAO par entité persistante donne ce type d’avantages :
public List findExecutingChangePlans() { Query query = entityManager.createQuery( "SELECT plan FROM ChangePlan plan where plan.state = 'EXECUTING'"); return (List) query.getResultList(); }
Bon, maintenant que l’on est convaincu que les DAO c’est bien
: comment les écrit on ?
Dans la javadoc de la classe JpaTemplate (Spring) il est écrit en gras qu’il n’y a pas grand interêt à utiliser cette classe , ce qui rend la classe JpaDaoSupport également superflue. A la place, on peut écrire nos DAO JPA comme des POJO (Plain Old Java Object) en ajoutant l’annotation @PersistenceContext, ce qui permet de récupérer une référence vers un EntityManager. Cela va marcher avec les EJB 3.0 et avec Spring 2.0. (Pour Spring il faut ajouter au contexte le bean PersistenceAnnotationBeanPostProcessor).
Comme chaque DAO partage un grand nombre de fonctionnalités avec les autres DAO, il semble logique d’avoir une classe de base avec toutes ces fonctionnalités partagées et d’en faire héritier chaque DAO. Il y a un grand nombre de blogs qui traitent des type-safe generic DAO et on peut même télécharger du code depuis Google Code. Quand on combine des éléments provenant de toutes ces sources, on obtient l’implémentation de JPA qui suit.
L’entité
Disons que l’on veut persister la classe Order:
@Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue private int id; private String customerName; private Date date; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date;}
Ne vous inquiétez pas trop en lisant le contenu de cette classe. Nous allons en voir les détails dans d’autres articles sur les design
pattern implémentant JPA. Ici, on utilise l’annotation @Table parce que ORDER est un mot réservé en SQL.
L’interface DAO
Tout d’abord on définit une interface DAO générique avec toutes les méthodes qui seront partagées par les DAOs :
public interface Dao { void persist(E entity); void remove(E entity); E findById(K id); }
Le premier paramètre, K, et le type de l’objet que l’on va utiliser comme clé et le deuxième, E, est le type de l’Entité. En plus des méthodes classiques persist,remove et findById, on peut aussi ajouter listFindAll(). De toute façon, nous allons être amenés à modifier ce DAO (ansi que l’entité) en explorant d’autres design pattern de JPA.
Puis on définit une sous-interface pour chaque entité que l’on veut persister, en ajoutant toutes les méthodes spécifiques à cette entité. Par exemple, si on veut récupérer toutes les commandes passées après une certaine date, on peut ajouter cette méthode :
public interface OrderDao extends Dao { List findOrdersSubmittedSince(Date date); }
L’implémentation de base du DAO
La troisième étape est de créeer une implémentation de base d’un DAO JPA. Elle aura une implémentation basique de toutes les méthodes créer dans le DAO standard que nous avons créé à l’étape 1 :
public abstract class JpaDao implements Dao { protected Class entityClass; @PersistenceContext protected EntityManager entityManager; public JpaDao() { ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[1]; } public void persist(E entity) { entityManager.persist(entity); } public void remove(E entity) { entityManager.remove(entity); } public E findById(K id) { return entityManager.find(entityClass, id); } }
Le code précédent est assez simple à comprendre. Cependant, certains points méritent d’être étudiés plus en détail :
@PersistenceContext permet au container EJB 3.0 ou à Spring d’injecter l’EntityManager.EntityManager et entityClass sont protected, ainsi les sous-classes peuvent y accéder.L’implémentation spécifique du DAO
Enfin, nous créons une implémentation de DAO spécifique . Elle étend le DAO JPA de base et implémente l’interface spécifique du DAO.
public class JpaOrderDao extends JpaDao implements OrderDao { public List findOrdersSubmittedSince(Date date) { Query q = entityManager.createQuery( "SELECT e FROM " + entityClass.getName() + " e WHERE date >= :date_since"); q.setParameter("date_since", date); return (List) q.getResultList(); } }
Utilisation du DAO
le moyen d’obtenir une référence à notre instance du OrderDao va dépendre de si on utiliser les EJB ou Spring.
Avec les EJB 3.0 :
@EJB(name="orderDao") private OrderDao orderDao;
Alors qu’avec Spring on peut utiliserle fichier de contexte où sont déclarés les beans ou tout simplement utiliser l’annotation @Autowired
@Autowired public OrderDao orderDao;
Dans tous les cas, une fois que l’on a la référence vers notre DAO, on l’utilise de cette manière :
Order o = new Order(); o.setCustomerName("Peter Johnson"); o.setDate(new Date()); orderDao.persist(o);
Mais on peut aussi utiliser la requête que nous avons ajouté dans notre interface OrderDao :
List orders = orderDao.findOrdersSubmittedSince(date); for (Order each : orders) { System.out.println("order id = " + each.getId()); }
Avec ce DAO indépendant du type de l’entité nous avons les avantages suivants :
J’espère que maintenant vous êtes convaincu de l’on a besoin du design pattern DAO avec JPA !!