tag:blogger.com,1999:blog-43856058239260579232024-03-13T18:46:42.159+01:00Blog of Nicolas GapaillardAnother coding blog about JAVA/JEE tricks.Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-4385605823926057923.post-87058247151089830222014-12-08T13:52:00.001+01:002014-12-08T14:09:50.522+01:00Camel: how to expose static resources in http with jetty component<h3>
Introduction </h3>
<br />
For easier developpement of the application, avoid the use of an apache http server configuration in developpement environment. Sometimes it can be interesting to embbed static resources such as html, javascript and css in the application.<br />
<br />
An example of use case:<br />
<br />
I expose some <b>REST services</b> consumed by an <b>angularjs</b> application. In development I like to have only my application running and I like to avoid a proxy configuration on apache.<br />
<br />
My static files are under <b>/static</b> in my project and my rest services exposed on <b>8080</b>.<br />
<br />
My camel context looks like:<br />
<br />
<br />
<pre class="brush: xml">
<restconfiguration bindingmode="off" component="jetty" host="localhost" port="8080">
</restconfiguration>
<rest> <post consumes="application/json" produces="application/json" uri="/rest/search">
<to uri="direct:searchMediator"> </to>
</post> </rest>
</pre>
<br />
Here I use the camel 2.14 include the rest dsl.<br />
First I declared the jetty component to serve rest service.<br />
<br />
For now only my rest service is declared no static resources are handled.<br />
So if I try to do <b>http://localhost:8080/static</b>, so I get a <b>404</b>. It's normal, because jetty only exposes the rest service.<br />
<br />
<h3>
How to deal with that ?</h3>
<br />
After some search about jetty and the camel component it is possible to define some request handlers in camel.<br />
And we are lucky but jetty provide a ResourceHandler that handle the resources.<br />
<br />
The solution:<br />
<br />
<pre class="brush: xml">
<bean id="staticHandler" class="org.eclipse.jetty.server.handler.ResourceHandler">
<property name="resourceBase" value="static" />
</bean>
</pre>
<br />
Here I instanciate a <b>ResourceHandler</b> which is a jetty class with spring camel dsl in specifying the resource base path. In my case <b>/static</b>.<br />
<br />
After I declare to camel-jetty component that I will use this handler:<br />
<br />
<pre class="brush: xml"> <!-- This route just initialized the static handler on the specified port number-->
<route>
<from uri="jetty:http://localhost:8080?handlers=#staticHandler" />
<to uri="mock:empty" />
</route>
</pre>
<br />
I just create a route that does nothing except declare the jetty component with handlers. Note the uri ending by <b>?handlers=#staticHandler</b> . It's possible to add several handlers separated by a quote.<br />
<br />
<h3>
Now try it !</h3>
<br />
If I try <b>http://localhost:8080/static</b>, so I can see my index.html file.<br />
<br />
Maybe you will consider, Why does it work ? Because we declare two times the jetty component on 8080 ?<br />
<br />
The trick is that camel instances only one time each jetty component for a specified host/port, so it means the jetty component between the route and the rest configuration, is exactly the same.<br />
<br />
So enjoy your static resources in your camel projet !<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com3tag:blogger.com,1999:blog-4385605823926057923.post-5125009940438076762014-06-26T21:07:00.001+02:002014-06-26T21:07:21.216+02:00Un vent d'indépendance - troisième partie<br />
<h3>
Trouver une mission</h3>
<div>
<br /></div>
<div>
Maintenant que la création de l'entreprise est sur les rails il va falloir penser à trouver une mission. </div>
<div>
<br /></div>
<div>
Après de nombreuses années à se faire amener ses missions par sa société de service, il fallait cette fois ci trouver une mission par sois-même. Ce qui demande plus d'effort mais aussi un nouvel aspect de mon travail que j'ai trouvé très intéressant.</div>
<div>
<br /></div>
<div>
J'ai commencé à mettre au courant tous les contacts que j'avais dans mon réseau, passer des coups de fils, demandé des recommandations sur linkedin ou viadeo. </div>
<div>
<br /></div>
<div>
A ce moment là mes efforts étaient concentrés sur la recherche de la mission.<br />
Lorsque l'on commence et que l'on est un peu à court d'argent on est pré disposé à accepter un peu n'importe quelle mission... Erreur ! Je pense que certaines sociétés en ont bien conscience et sont prêtes à faire des offres bien en dessous du marché.<br />
<br />
<br />
Je me souviens d'un cas où on m'appelle pour une mission potentielle en GWT: "...le développeur devra avoir 3 ans d'xp minimum dans le framework...". Autant dire un profil qui ne courrait pas trop les rues à l'époque.<br />
<br />
J'ai pris rendez-vous avec eux, le mec sympa, il m'expliquait un peu la mission, me demandait mon expérience... Rien d'extraordinaire.<br />
<br />
On commençait à parler facturation, et là il m'a sorti son TJM à 300 €/J !<br />
<br />
Si vous faites un calcul grosse maille avec 300€/J<br />
Vous allez bosser environ 20jrs/mois à 300 € en comptant que vous preniez des vacances.<br />
<br />
Soit 6000 €/mois HT vous aller devoir payer:<br />
<ul>
<li>Les impôts/l'URSSAF, le RSI</li>
<li>Des charges inhérentes à votre société telle que la comptabilité</li>
<li>Des inter contrats ou vous ne serez pas rémunéré.</li>
</ul>
<br />
Il ne vous restera donc que 3000€ environ dans votre poche.<br />
<br />
Sachant que lorsque la mission sera terminée vous ne bénéficierez pas du chômage, vous allez devoir gérer plus de paperasse administrative et galérer pour trouver un nouveau logement.<br />
<br />
Autant vous dire qu'à ce prix, il vaut mieux rester salarié pour le même poste.<br />
En fait le commercial me faisait un peu penser à ça:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://fr.blingee.com/blingee/view/106752421-tux-voleur" style="margin-left: 1em; margin-right: 1em;" target="_blank" title="tux voleur"><img alt="tux voleur" border="0" src="http://image.blingee.com/images17/content/output/000/000/000/65c/564468210_992833.gif" height="160" title="tux voleur" width="146" /></a></div>
<br />
<a href="http://fr.blingee.com/pictures/tux" target="_blank" title="tux images"><span style="font-size: x-small;">tux images</span></a><br />
<br />
<br />
Après quelques semaines de "réseauttage" j'ai été mis en relation avec une SSII via un ancien collègue.<br />
Entre-temps je suis parti en Chine pendant deux mois (la vie n'est pas chère là bas) . Trois jours après mon retour la SSII m'avait trouvé une mission qui débutait 3 jours plus tard.<br />
<br />
Ce qu'il faut savoir sur les offres de mission pour les indépendants, c'est que dans la grande majorité des cas, ce sont des besoins ASAP. Tout peut se passer très rapidement.<br />
Comme pour une mission en tant que prestataire vous allez passer un entretien et ensuite avoir un retour souvent dans la semaine pour commencer la semaine suivante.<br />
<br />
Ce qui signifie que le commencement d'une mission peut aller très vite, il n'est donc pas nécessaire de chercher la mission trop longtemps en avance, car il y a peu de clients prêts à accepter d'attendre deux mois. Par contre, il faut quand même activer son réseau en avance de phase pour préparer le terrain.<br />
<br />
Autre que le réseau, il existe des sites comme <a href="http://www.freelance-info.fr/">Freelance info</a> ou <a href="https://www.hopwork.com/">HopWork</a> qui permettent de trouver des missions en direct et aussi de se donner une idée des TJM.<br />
<h3>
La mission</h3>
<div>
Ici être indépendant diffère très peu que d'être prestataire de SSII. </div>
<div>
Peut être excepté quelques points:</div>
<div>
<ul>
<li>Parfois vous vous ferez charrier par vos collègues quand ils vous verront garder la note du repas. </li>
<li>Votre travail est le reflet de votre activité, tout problème peut nuire à la réputation de votre entreprise</li>
<li>Vous travaillez pour vous ce qui est plus motivant. Sur ce sujet vous pouvez lire ce billet: <a href="http://www.java-freelance.fr/freelance/siffler-en-travaillant">Siffler en travaillant</a></li>
</ul>
</div>
<div>
<h3>
Le premier paiement</h3>
</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMDTcCQOhXhnFIgsaFZFXtGdraj6IJiFQIlfMBBgMEoMP-hJfVAmEN3cf9lj0wZJsCH6RCwh2gDs8aB730lHUrnawgBF8a-2ajjRnncxmSiy_RD0TtMvLO022sBtz-EwylMcjpsGwdrf0/s1600/Tux-dollars.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMDTcCQOhXhnFIgsaFZFXtGdraj6IJiFQIlfMBBgMEoMP-hJfVAmEN3cf9lj0wZJsCH6RCwh2gDs8aB730lHUrnawgBF8a-2ajjRnncxmSiy_RD0TtMvLO022sBtz-EwylMcjpsGwdrf0/s1600/Tux-dollars.jpg" height="200" width="200" /></a></div>
<div>
<br /></div>
<div>
Alors voilà, vous avez suivi toutes les étapes, émis votre première facture 2 mois plus tôt et vous recevez le premier virement sur votre compte professionnel. La totalité a de quoi vous faire tourner la tête comparé aux virements d'un salarié. </div>
<div>
<br /></div>
<div>
Je me souviens encore du jour où j'ai vu des sommes d'argent à 4 zéros arriver sur mon compte pro, je n'étais pas habitué à ça. D'ailleurs le banquier non plus, qui si vous vous en souvenez m'avait refusé le crédit. D'un coup il était beaucoup plus enclin à m'offrir des crédits pour ma société, me faire de la publicité pour tous les services aux pros et m'appeler pour savoir si tout allait bien ! D'ailleurs ça doit vous rappelez une publicité (ridicule) avec Gad Elmaleh, oui oui c'est bien cette banque là ! </div>
<div>
</div>
<div>
Mais ne vous emballez pas trop vite ! Ce que vous n'aviez peut être pas vu, c'est Mr Etat, Mr Urssaf, Mr TVA et Mr RSI qui se sont cachés là au fond dans la cour derrière l'arbre ! </div>
<div>
</div>
<div>
Je ne vais pas lancer un débat sur la fiscalité mais juste vous conseiller de garder de l'argent sur votre compte pro car ces messieurs ne sont pas très patients en ce qui concerne les paiements même quand ils envoient la lettre après la date butoir dans le courrier.</div>
<div>
Et surtout de fonctionner en mode JMS avec les factures, vous recevez, vous traitez !<br />
<br /></div>
<div>
Il va donc falloir s'habituer à voir les 4 zéros se transformer en 3 zéros.</div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com0tag:blogger.com,1999:blog-4385605823926057923.post-40228874938682096172014-06-26T17:31:00.001+02:002014-06-26T21:12:48.116+02:00Un vent d'indépendance - deuxième partie<h2>
<br /></h2>
<h3>
Prendre un bon départ</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSDnE8XCbbf8HuER8n1UW0nRTmRmHmJbCjlv0rqCkQ5ECV4k8JyS4zHqYQItSNPPQzicD5EBk78RBvV6GjiX6Y29k1rXGNoLPuUfVL7NRwX8EfLX0Rv4g26QRQnyZCF4SfCxicZZoib4/s1600/40+BrunoCB+-+Tux+Loeb+Champion+2009+G2+512X512.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSDnE8XCbbf8HuER8n1UW0nRTmRmHmJbCjlv0rqCkQ5ECV4k8JyS4zHqYQItSNPPQzicD5EBk78RBvV6GjiX6Y29k1rXGNoLPuUfVL7NRwX8EfLX0Rv4g26QRQnyZCF4SfCxicZZoib4/s1600/40+BrunoCB+-+Tux+Loeb+Champion+2009+G2+512X512.png" height="320" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Ok j'ai décidé de devenir indépendant, mais par où commencer ? Je vais vous le dire tout de suite, le début est certainement le moment qui m'a semblé le plus difficile. Certainement le fait de ne pas savoir quoi faire, faire quelque chose de nouveau...</div>
<div>
<br /></div>
<div>
A ce moment là, j'ai eu beaucoup de chance d'avoir dans mon entourage des gens qui avaient déjà fait le pas. Si vous n'êtes pas entourés, ce n'est pas impossible, mais c'est plus compliqué et certainement plus anxiogène. Croyez moi ce n'est pas du luxe si vous n'avez jamais créé de société. </div>
<div>
De plus, je venais de démissionner et je n'avais pas énormément d'argent de côté, je devais donc créer la société et trouver une mission en parallèle.</div>
<div>
<br /></div>
<h3>
Le comptable</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismQX9-fza4xPK4eW8BHlGV4SKMFJVZQFtY0wtPhgIh-poKJ_lZT0sFqsnkxEewb2Rm9oZSxf6GuscIlz_qNLPCuaJPV_SmuwVAxMMWKJmoXnm2H2q7OT6QpERCTe_XLmN9Iun3PJuwxk/s1600/accessories-calculator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEismQX9-fza4xPK4eW8BHlGV4SKMFJVZQFtY0wtPhgIh-poKJ_lZT0sFqsnkxEewb2Rm9oZSxf6GuscIlz_qNLPCuaJPV_SmuwVAxMMWKJmoXnm2H2q7OT6QpERCTe_XLmN9Iun3PJuwxk/s1600/accessories-calculator.png" height="100" width="100" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Avant de penser à créer votre société, penser à trouver un comptable si vous n'avez aucune expérience dans le domaine. La fiscalité est assez complexe à appréhender, surtout la première année.</div>
<div>
Le comptable va aussi vous aider à choisir la structure de votre société et vous aider dans les démarches, soit par des conseils, soit en faisant les démarches à votre place contre rémunération supplémentaire (ce que j'ai fait). Il pourra aussi vous donner des conseils afin d'optimiser votre fiscalité.</div>
<div>
<br /></div>
<div>
Des cabinets de comptable il en existe beaucoup, là aussi je vous recommande de prendre un comptable conseillé par quelqu'un de votre entourage, ca vous évitera quelques mauvaises surprises.</div>
<div>
<br /></div>
<div>
Pour ma part j'ai choisi un cabinet de comptable de type "low cost", qui fait tout par internet, ce qui est assez pratique pour un profil comme le mien qui est habitué à utiliser l'outil informatique. Après il faut savoir qu'avec ce type d'offre que le prix est certe "bas" autour de 100 €/mois mais que tout extra à un coût. Par exemple pour un rendez vous avec le comptable il faudra payer une certaine somme. </div>
<div>
<br /></div>
<div>
Personnellement l'offre me convient. Maintenant je peux comprendre qu'elle puisse rebuter certains préférant avoir un contact plus direct.</div>
<div>
<br /></div>
<h3>
L'ACCRE</h3>
<div>
Si vous avez bénéficié de la rupture conventionnelle ou d'un licenciement ce qui n'a pas été mon cas, vous pouvez faire la demande de l'accre qui peut vous permettre d'obtenir un versement anticipé de vos indemnités chômages. Ce dispositif est très intéressant car il peut vous permettre entre autre d'avoir d'un seul coup une grosse somme d'argent et vous permettre de commencer l'activité sereinement. Pour tous les détails: <a href="http://les-aides.fr/fiche/bpNgC3tGxfTeBGZeTUzZ4$Vm/pole-emploi/versement-en-capital-arce-ou-cumul-de-l-are-pour-reprise-ou-creation-d-entreprise.html">http://les-aides.fr/fiche/bpNgC3tGxfTeBGZeTUzZ4$Vm/pole-emploi/versement-en-capital-arce-ou-cumul-de-l-are-pour-reprise-ou-creation-d-entreprise.html</a></div>
<div>
<br /></div>
<div>
<br /></div>
<h3>
La banque</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH1kLuJJ0J1lzsOaEpRtsqCXwJ0fLFTN0cneSbu5ThgR3JzNoRyOdH2jSumtLw2hILDMKMlf49yiemYArhuzEQ2xgmAueR4j9VTpeSRk19OTzEvjnMwzINLQl3PnvSJv7ob1dR0Z6S2Ck/s1600/tuxMonop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH1kLuJJ0J1lzsOaEpRtsqCXwJ0fLFTN0cneSbu5ThgR3JzNoRyOdH2jSumtLw2hILDMKMlf49yiemYArhuzEQ2xgmAueR4j9VTpeSRk19OTzEvjnMwzINLQl3PnvSJv7ob1dR0Z6S2Ck/s1600/tuxMonop.jpg" height="100" width="100" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Vient le moment d'aller à la banque pour créer son compte professionnel et potentiellement demander un petit crédit histoire de compenser l'absence de revenu au début de votre activité. Oui le deuxième point n'est pas à négliger, car même si vous trouvez une mission rapidement, il se peut que le client vous payes jusqu'à deux mois après... Je reviendrai dessus plus tard dans l'article.</div>
<div>
<br /></div>
<div>
Pour créer son compte professionnel, rien de plus simple, on vous demandera votre kbis temporaire (sans numéro de siret), les statuts de votre société et le montant de votre capital. Théoriquement la société peut être créée à partir de 1€ de capital, mais je vous conseille de mettre un peu plus, le capital de la société est public et une société à 1€ ca fait pas très sérieux... D'autant plus que vous ne serez pas obligé de verser la totalité du capital. </div>
<div>
<br /></div>
<div>
Pour la demande de crédit les ennuis ont commencé... </div>
<div>
Je me considère comme un bon client de ma banque, pas de découvert, tous mes comptes chez eux, alors lorsque je leur ai demandé 10 000€ pour commencer sereinement ma nouvelle activité je pensais que ca passerait comme une lettre à la poste je me berçais d'illusion.</div>
<div>
<br /></div>
<div>
<b>Première désillusion</b>: On a commencé à me demander un prévisionnel du CA sur 3 ans alors que je venais tout juste de commencer. A savoir que ce document n'a aucune valeur, puisque c'est le responsable de l'entreprise en l'occurence moi et le comptable qui fournissons ce prévisionnel, WTF !</div>
<div>
<br /></div>
<div>
<b>Deuxième désillusion:</b></div>
<div>
La décision du prêt arriva moins d'une semaine après et refusé ! Pourquoi ? Parce que je ne suis pas salarié, l'obtention du crédit était trop risqué ! WTF !!!</div>
<div>
<br /></div>
<div>
Si j'avais été salarié et que je voulais faire un crédit conso pour m'acheter le dernier écran 3D à la mode je l'aurai eu sans problème !!! Mais créer sa société pour être freelance dans un secteur prospère il faut croire que c'est trop "risqué" pour nos amis les banquiers français. </div>
<div>
<br /></div>
<div>
Donc un conseil assurez vos arrières au mieux pour éviter de vous retrouver dans une situation périlleuse qui a été mon cas.</div>
<div>
<br />
Aussi il faut savoir qu'il est possible de négocier des avances de facturations notamment si vous passez par un intermédiaire type SSII.</div>
<div>
<h3>
Les fausses obligations</h3>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvqP1O0oGVaJtSHMGJhJ_OMTrKKwgibd4nesVjXWbjxVAxdfEq4ZepaAWCqrhS4yoXw9fqSKLKivUXN4JBASLWjcF9To71fLVcWS1Y_ec8l_snaDOfA-vPjBO8Ck9dEgDiyoWeCkKZXyA/s1600/stop-arnaque.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvqP1O0oGVaJtSHMGJhJ_OMTrKKwgibd4nesVjXWbjxVAxdfEq4ZepaAWCqrhS4yoXw9fqSKLKivUXN4JBASLWjcF9To71fLVcWS1Y_ec8l_snaDOfA-vPjBO8Ck9dEgDiyoWeCkKZXyA/s1600/stop-arnaque.jpg" height="100" width="100" /></a></div>
<div>
<br /></div>
<div>
Dans les premiers mois, j'ai reçu beaucoup de courriers, certains officiels kbis, statuts, tva, urssaf, RSI et d'autres moins...</div>
<div>
<br /></div>
<div>
Dans ces derniers vous avez ce que moi j'appelle des escroqueries, ce que l'expéditeur appelle une obligation.</div>
<div>
<br /></div>
<div>
Il y en a un dont je me rappelle très clairement. J'ouvre l'enveloppe, je vois une lettre avec des couleurs bleu, blanc rouge, une facture dans les 700 € et un message sous entendant très fortement que cette somme est obligatoire. Méfiant je vais sur le site internet de la société qui m'a envoyé le courrier, je vois toujours un thème bleu/blanc/rouge et une photo du président de l'époque Nicolas Sarkozy. Donc tout a l'air d'être officiel. Mais dans le doute je demande à mon comptable. </div>
<div>
<br /></div>
<div>
Il s'avère qu'en lui montrant le courrier ceci n'avait rien d'obligatoire et que ca s'apparentait plus à une arnaque en bande organisée qu'un document officiel. En réalité il s'agissait d'un référencement dans un annuaire privé d'entreprise qui n'a aucune valeur ajoutée dans mon cas...<br />
<br />
C'est dans ces moments qu'on se dit qu'un comptable est utile.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
</div>
Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com0tag:blogger.com,1999:blog-4385605823926057923.post-68785526706421308272014-06-26T17:07:00.000+02:002014-06-26T21:12:27.436+02:00Un vent d'indépendance - Première partie<h2>
<br /></h2>
<div>
Je sais qu'il y a déjà eu pas mal d'articles d'indépendants mais je tenais à vous partager mon expérience, car chaque indépendant est différent et chacun a son ressenti.</div>
<div>
<br /></div>
<div>
Comme beaucoup de développeurs java, j'ai fait mes armes dans des sociétés de services ou autres toutes leaders dans leur domaine:</div>
<div>
<ol>
<li>Leader mondial dans le consulting informatique et fan de tiger woods</li>
<li>Leader français de l'open source </li>
<li>Leader sur les annuaires BtoB</li>
<li>Leader français de l'intégration d'outil open source (non, non c'est une autre société !)</li>
</ol>
<div>
Si vous retrouver le nom des sociétés je vous paierai une bière. Interdit d'aller voir sur linkedin !!</div>
</div>
<div>
<br /></div>
<div>
Du coup un jour en voyant tous ces leaders je me suis dit que c'était mon tour de devenir un leader. A minima le leader mondial de moi même.</div>
<div>
<br /></div>
<h3>
L'histoire de Walter</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwspirxihefyV1-baj8vxoYd-ODzrUqDdmLlCEKrs52dmxaAO6-aowdSTm-lU9WrBwxehNYYEC0BwiehqPCVgFmhSaUP4tj1hdjz-G_CD5royMNJic6JOXOKgmJobAKwN7wDpbVFqyyM/s1600/tuxbb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwspirxihefyV1-baj8vxoYd-ODzrUqDdmLlCEKrs52dmxaAO6-aowdSTm-lU9WrBwxehNYYEC0BwiehqPCVgFmhSaUP4tj1hdjz-G_CD5royMNJic6JOXOKgmJobAKwN7wDpbVFqyyM/s1600/tuxbb.png" height="100" width="100" /></a></div>
<div>
<br />
Ca commence par une histoire, celle de Walter qui débute sa carrière dans l'informatique il vient de se faire embaucher dans une société leader dans son domaine, il fait des missions chez des clients qui rémunèrent sa boîte pour le travail qu'il produit et ensuite sa boîte le rémunère à son tour en ayant fait un substentiel bénéfice.<br />
<br />
<br />
Ok soit, Walter a parfois l'impression de se faire arnaquer mais il sait que c'est pour sa société, sa communauté, son clan, sa team, sa vie quoi.<br />
<div>
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzrhhz29ZsPh9t_OhXMChZe_v4F_09NxQ-MHolkdH1nHurbRIEvfCmXZMOh3uNHMat46Abxsg12MIoIQgcKwKiI5m-rtExJkcQsmBxsWQIPh6fZpiB2EHD2ufk2j65gs5vx7Dzo_HkU4/s1600/pinguinito-tux-france-2179.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzrhhz29ZsPh9t_OhXMChZe_v4F_09NxQ-MHolkdH1nHurbRIEvfCmXZMOh3uNHMat46Abxsg12MIoIQgcKwKiI5m-rtExJkcQsmBxsWQIPh6fZpiB2EHD2ufk2j65gs5vx7Dzo_HkU4/s1600/pinguinito-tux-france-2179.png" height="100" width="100" /></a></div>
<br />
<br />
<br /></div>
<div>
Parce que sa société est bienveillante envers lui:</div>
<div>
<ul>
<li>Elle lui trouve des missions qui sont formatrices à la pointe de l'innovation, struts 1, EJB 2, JSP</li>
</ul>
</div>
<div>
<ul>
<li>Elle lui propose des formations en n'oubliant pas de le faire signer le dédit de formation et surtout de l'envoyer chez un client pour vérifier que il a bien appris sa leçon.</li>
</ul>
</div>
<div>
<ul>
<li>Elle organise des supers soirées où le pdg lui dit que sa société est la plus innovante qu'elle s'inspire de google, d'apple et d'amazon réunis. A vrai dire il a déjà bu plusieurs verres d'alcool et y croit !</li>
<li>Elle aimerait bien l'augmenter, mais malheureusement c'est la crise, elle peut quand même faire un effort de 2% parce qu'il travaille bien. Il faut croire pas aussi bien que le nouvel arrivant qui touche 30% de plus que lui.</li>
</ul>
</div>
<div>
<ul>
<li>Elle lui offre des T-Shirts et des mugs pour qu'il puisse revendiquer son appartenance à la société.</li>
<li>Elle lui suggère même d'expliquer à son travail, sur son blog, à sa grand mère et son poisson rouge cette magnifique bienveillance. </li>
</ul>
</div>
<div>
</div>
<div>
<br /></div>
<div>
Mais un jour Walter se réveille et se demande si l'herbe est plus verte ailleurs, il a entendu parler d'un collègue qui vient de changer de boîte et faire une plus value de 30 % sur son salaire. </div>
<div>
<br /></div>
<div>
Walter est impressionné qu'il existe des sociétés qui soient capables d'offrir un meilleur salaire que sa bienveillante société.</div>
<div>
A vrai dire il commence à se demander si sa société est si bienveillante que ca, beaucoup de collaborateurs sont déjà partis, il se dit qu'il devrait changer.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO9Zzc_EedjM4quGzqoULjnMCQbX2t1t7PkD4FXvfNn9RVVtOycI6PhB5lAtp85FN0zkgZCsImnVoSKcRKIYSnLFq5XAMIUdo4QV2VY6Fqgs2ah3fPIJs0u8Wt97kuwmqIEgvwTYzhOaw/s1600/1004-9879.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO9Zzc_EedjM4quGzqoULjnMCQbX2t1t7PkD4FXvfNn9RVVtOycI6PhB5lAtp85FN0zkgZCsImnVoSKcRKIYSnLFq5XAMIUdo4QV2VY6Fqgs2ah3fPIJs0u8Wt97kuwmqIEgvwTYzhOaw/s1600/1004-9879.png" height="100" width="100" /></a></div>
<br />
Quelques temps après il se décide enfin à partir ! Avec un pincement au coeur. Il quitte son cocon. Il remet son costume laisser au placard pendant des années.</div>
<div>
Il commence à faire des entretiens avec toutes les SSII avec des noms comportant "solutions" "future" "tech", où on lui pose plus ou moins toujours les mêmes questions: </div>
<div>
C'est quoi la dernière version de java, fait moi un singleton, c'est quoi volatile, c'est quoi synchronized etc. </div>
<div>
<br /></div>
<div>
Walter répond correctement à la moitié des questions, il demande un salaire 30 % supérieur à celui qu'il avait, la RH n'a pas l'air de trop sourciller elle essaie juste de gratter 3k ou 4k en sortant l'argument de son "package".</div>
<div>
<br /></div>
<div>
Walter est embauché, il commence dans sa nouvelle boîte, on lui file un mug de la société, on lui dit q'il fait parti d'un groupe leader et qu'il y a une mission innovante pour lui en Struts...</div>
<div>
<br /></div>
<h3>
Sur un air de Walter ! </h3>
<div>
Cette histoire inspirée de faits réels observés et entendus de ci de là peut paraître exagérée, mais je me plait à penser que tout presta a connu une partie de la vie de Walter. Il ne faut pas non plus ne voir que du négatif, la plupart de ces sociétés permettent aussi de se constituer un réseau et de monter en compétence.</div>
<div>
<br /></div>
<div>
C'est en prenant en compte ces observations et une envie de créer une entreprise que l'idée de l'indépendance a commencé à mûrir. </div>
<div>
De plus dans mon entourage je connaissais d'autre personnes qui avaient fait le pas et ne regrettaient pas de l'avoir fait. </div>
<div>
<br /></div>
<div>
Contrairement à ce que certains peuvent penser, on devient rarement indépendant sur un coup de tête. </div>
<div>
Faire le premier pas, demande une maturité, une introspection sur soit, connaître ses propres qualités et ses défauts. Car passer indépendant c'est travailler d'abord pour soit même, sa réputation. </div>
<div>
<br /></div>
<div>
Car jamais vous ne serez plus jugés sur votre travail que lorsque vous serez indépendants.</div>
<div>
Il en va de la survie de votre société.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com0tag:blogger.com,1999:blog-4385605823926057923.post-49455990858694066102013-10-03T22:22:00.000+02:002013-10-03T22:32:34.019+02:00Les architectures applicatives client/serveurAvec l'avènement des applications smartphones ainsi que celles exécutées sur le navigateur, nos applications n'ont jamais autant changé en un laps de temps aussi réduit. Les frontières entre client et serveur sont de plus en plus floues.<br />
<br />
Dans ce contexte, je vais tenter de retracer les différentes étapes qui ont amené aux évolutions de nos applications et tenter d'entrevoir ce qu'elles pourraient dans un futur proche.<br />
<h2>
Etats des lieux</h2>
<h3>
Les clients lourds</h3>
<br />
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD4JIdnaG7qU-hf-hmXdgx9H2wMR7GVJDx4lsAnSMr9N2YQX31_qSAFu9LfJYcAro6N-ORnYb6_V75cDX9HcJTkcyusd3ecQfNHpD2014wZhWLNw_vLB1itJgROvagu1DmBwq5xcV7Hp8/s1600/grolex-tux-tank.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD4JIdnaG7qU-hf-hmXdgx9H2wMR7GVJDx4lsAnSMr9N2YQX31_qSAFu9LfJYcAro6N-ORnYb6_V75cDX9HcJTkcyusd3ecQfNHpD2014wZhWLNw_vLB1itJgROvagu1DmBwq5xcV7Hp8/s1600/grolex-tux-tank.png" height="150" style="cursor: move;" width="150" /></a>Je me souviens au début de ma carrière, ils y avaient des applications dites lourdes qui étaient déployées chez les clients.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ces applications fonctionnent de cette manière:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un client dit <b>lourd</b> sur <b>chaque poste utilisateur</b> qui envoie des <b>requêtes en mode connecté</b> sur un <b>serveur centralisé</b> effectuant des traitements de type appel à la bdd, connexion avec le mainframe maison etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ces applications ont <b>l'avantage de fonctionner de la même manière</b> sur chaque client pour peu que la <b>configuration</b> soit identique sur chaque poste. Mais ont l'inconvénient d'avoir une <b>lourdeur dans les déploiements</b> de l'application qui doivent se faire sur <b>chaque poste de chaque employé</b> sans parler des <b>mises à jours</b> qui doivent se faire de la même manière.</div>
<div style="text-align: justify;">
Au niveau développement la grande majorité du <b>code métier est géré sur le client</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Suite à la pénibilité de ce fonctionnement, de nouvelles approches de déploiement à partir du serveur apparurent.</div>
<div style="text-align: justify;">
<br /></div>
<h3>
Les clients lourds via déploiement à partir du serveur</h3>
<div style="text-align: justify;">
Ici le client lourd est <b>déployé via une interface web sur chaque poste client</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il suffit à l'utilisateur d'aller sur une <b>page web</b> afin que le serveur déploie via <b>une applet/un activeX </b>l'application sur le poste de l'utilisateur.</div>
<div style="text-align: justify;">
Le <b>déploiement est alors moins pénible</b> au sein de l'entreprise.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Mais voilà, <b>en parallèle les technologies web ont évolué</b>, il est alors possible d'obtenir une application avec des <b>fonctionnalités similaires à nos chers clients lourds</b>. Ceci a favorisé <b>l'abandon des applications lourdes </b>au profit de <b>clients légers</b>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h3>
Les clients légers </h3>
<br />
<br />
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmJDigNdqGHeQMCYVCh-G7N0t3qD76c3fVrp4AC8kwoBhkC9KdUj2Ay_opQTcT5c_V8qXxAxfRih5qNfZNMt7mUogihOSa6etr34JHUfoCqO9JgQBF-xthTX22MN5WcfKFd7a4EWxki4w/s1600/pinguin_os-tux-firefox.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmJDigNdqGHeQMCYVCh-G7N0t3qD76c3fVrp4AC8kwoBhkC9KdUj2Ay_opQTcT5c_V8qXxAxfRih5qNfZNMt7mUogihOSa6etr34JHUfoCqO9JgQBF-xthTX22MN5WcfKFd7a4EWxki4w/s200/pinguin_os-tux-firefox.png" height="150" width="149" /></a>Un client dit <b>léger</b> est en fait un <b>navigateur web</b> capable d'interpréter des descriptions <b>html</b> servies par un <b>serveur web</b>.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La différence entre le client lourd et le client léger se situe dans le fait que le client léger a <b>une attitude passive</b>, c'est à dire qu'il ne s'occupe que du rendu de ce qui lui est décrit via le <b>html envoyé par le serveur</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
Bien que cette approche supprime les contraintes liées au déploiement des clients sur les postes utilisateurs, elle a aussi ses inconvénients:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
<ul>
<li><b>La réactivité du client léger est de très loin derrière la réactivité d'un client lourd</b> notamment du au manque d'un langage dynamique côté client. L'utilisateur doit effectuer une nouvelle requête pour avoir accès à une nouvelle information du serveur et attendre le rafraîchissement de la page.</li>
<li><b>La compatibilité entre chaque navigateur n'est pas toujours assurée</b>, il se peut que le rendu diffère selon le navigateur</li>
<li><b>Le rendu ne permet pas d'avoir un contenu riche</b>, c'est à dire des interfaces graphiques semblables à celles des clients lourds qui intègre une multitude de composants.</li>
</ul>
</div>
<br />
<h3>
Les clients légers avec JS </h3>
<div>
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbqJYW4yScUBUFrN5GyK61Bi3oC4EEbWiIt3-uIVNNvPU5FMR5jrP8f5atweauZnL-xSpnRHfbXjQDah13j4M7YbenTEGZyra2FCqxDvyJ59pcvym8ktpayL8pU6rSZMPJJzD2Mvn03M/s1600/javascript.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbqJYW4yScUBUFrN5GyK61Bi3oC4EEbWiIt3-uIVNNvPU5FMR5jrP8f5atweauZnL-xSpnRHfbXjQDah13j4M7YbenTEGZyra2FCqxDvyJ59pcvym8ktpayL8pU6rSZMPJJzD2Mvn03M/s200/javascript.png" height="128" width="150" /></a></div>
<b>Pour pallier au manque de réactivité</b>, les éditeurs ont inclus le langage <b>javascript</b> créé par <b>netscape</b> (RIP) dans leurs navigateurs respectifs. Ce langage a la particularité d'être <b>simple à implémenter</b> comparé aux langages que l'on rencontre sur nos clients lourds tels que <b>C/C++</b> ou <b>JAVA</b>. Ceci a permis d'avoir des<b> interactions dynamiques plus facilement</b> au sein du navigateur.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>La compatibilité a aussi été améliorée</b> au fil du temps notamment par <b>l'établissement d'un consortium W3C</b> dédié aux fonctionnalités des navigateurs <b>regroupant la plupart des éditeurs des navigateurs</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>En ce qui concerne la richesse du client</b> il a fallu attendre l'arrivée de la vague des <b>clients riches</b> et du <b>HTML 5</b>.</div>
<br />
<h3>
Les clients riches (Flex (RIP), Silverlight, JavaFX (RIP))</h3>
<div>
<br /></div>
<div>
<br /></div>
<br />
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEievOvyKUvWOf_sGf1JmHSDHsw6hDBoLqPFAQp5UttTfHxvMuMEsM8L3oq_pyvVytwPJxgJG5ccTBjyUXiXSLfn82bgpViJp3INXL-pKox5_YRzbZIb-x3hVr5agkREREhsymcBVreTA-U/s1600/GoldTux.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEievOvyKUvWOf_sGf1JmHSDHsw6hDBoLqPFAQp5UttTfHxvMuMEsM8L3oq_pyvVytwPJxgJG5ccTBjyUXiXSLfn82bgpViJp3INXL-pKox5_YRzbZIb-x3hVr5agkREREhsymcBVreTA-U/s200/GoldTux.png" height="150" width="150" /></a></div>
Comme le javascript, <b>le client riche s'éxécute au sein du navigateur web</b>, mais à une différence prête que <b>le rendu n'est pas effectué par le navigateur</b> mais <b>par un éxécutable</b> préalablement installé sur le poste client. Les clients riches ont la particularité de proposer des <b>composants grahiques</b> qui n'ont rien à envier à nos vieux clients lourds. Ces clients se reposent sur des <b>langages relativement simples</b>.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
L'inconvénient est qu'il faille préalablement <b>installer un plugin sur le navigateur</b> (le fameux éxécutable) ce qui ne satisfait pas toutes les sociétés et aussi le fait que<b> l'accessibilité soit difficilement prise en compte</b> par ces clients.</div>
<h3>
HTML 5 et AJAX</h3>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqABpRTQqS4FiIvL3M733JDXFbei9Akc4O8t9FXqB9-HxDmyLFzRBCg1sqBzHTgHQ7wCrAOJGuhvfFKobUCHhcqPrBsTcUDvk4XLg5wpXYB51ca_KsWdZ1tKO9l-oKnzCHion4hTkEUEY/s1600/HTML5_Logo_512.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqABpRTQqS4FiIvL3M733JDXFbei9Akc4O8t9FXqB9-HxDmyLFzRBCg1sqBzHTgHQ7wCrAOJGuhvfFKobUCHhcqPrBsTcUDvk4XLg5wpXYB51ca_KsWdZ1tKO9l-oKnzCHion4hTkEUEY/s200/HTML5_Logo_512.png" height="150" width="150" /></a><br />
<div style="text-align: justify;">
En parallèle des clients riches, arrivèrent le <b>HTML 5</b> qui améliore grandement les capacités du navigateur avec la possibilité par exemple de fournir du <b>multimédia</b>, stocker des données en <b>base de données sur le navigateur</b> et d'obtenir des <b>connexions persistantes</b> via WebSocket avec le serveur. Ces connexions persistantes permettent de pallier à la problématique de <b>connexions successives faites par les navigateurs</b>, comme le faisait déjà nos clients lourds.</div>
<br />
<br />
<br />
<br />
<br />
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPWb4OQAqEmaZgU1OJvvaiZJYjvEkwFeyqJDoUo4Bya2SwoJwrPaqSPW_yjDxNCFExxUGI1lgdM1Hkra2s1I47AgvScOQrgR1_5K_r2KT5BCk2EuH5I2q6Pq3RJKBQvvb3wt2N6IkVMwc/s1600/ajax.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPWb4OQAqEmaZgU1OJvvaiZJYjvEkwFeyqJDoUo4Bya2SwoJwrPaqSPW_yjDxNCFExxUGI1lgdM1Hkra2s1I47AgvScOQrgR1_5K_r2KT5BCk2EuH5I2q6Pq3RJKBQvvb3wt2N6IkVMwc/s1600/ajax.gif" width="150" /></a></div>
De plus, la présence d'<b>api AJAX simplifiées</b> permet de créer des <b>fortes interactions avec le serveur</b> et ce de <b>manière dynamique</b> réduisant la contrainte d'effectuer des rafraîchissements du navigateur ainsi que l''intégration du code de <b>communication avec le serveur qui est pré-mâché</b> par les API javascript telles que JQuery, Prototype, Scriptaculous...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il est alors possible d'avoir des <b>rendus similaires aux clients riches</b>,<b> sans toutefois devoir installer un plugin sur les postes client</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ceci a bien évidemment contribué au déclin des clients riches.</div>
<h2>
Les tendances actuelles</h2>
<h3>
RestFul</h3>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQZnZuLEKrbqZk9Cww2B5czEMF5P-TB3DkKY6lnIsp6jkdYhxBtLh-xqzkYpsTrkiUSJv49Guqb6U2E2d9oD5AIoDetoYeDLwFcV1IYtfV0SrhcnI-2CcQ3FobttADjxrR8I2HzoTcgI/s1600/restful_tech_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQZnZuLEKrbqZk9Cww2B5czEMF5P-TB3DkKY6lnIsp6jkdYhxBtLh-xqzkYpsTrkiUSJv49Guqb6U2E2d9oD5AIoDetoYeDLwFcV1IYtfV0SrhcnI-2CcQ3FobttADjxrR8I2HzoTcgI/s1600/restful_tech_logo.png" /></a><br />
<div style="text-align: justify;">
L'approche <b>RestFull</b> sans rentrer dans le détail, permet d'associer <b>une ressource à une uri</b>. C'est à dire celà se traduit souvent par créer <b>une url par ressource</b>. Le grand intérêt est d'avoir une approche <b>stateless</b> (sans état) qui améliore la <b>scalabilité</b> des serveurs et délègue les états applicatifs sur le client.</div>
</div>
<h3>
</h3>
<h3>
</h3>
<h3>
</h3>
<h3>
Le tout JS</h3>
<div>
Avec l'arrivée de <b>nouveaux</b> <b>frameworks JavaScript</b> orientés <b>Single Page Application</b> (applications dans la même page) facilitant le développement de la navigation côté client, il est possible de créer une grosse partie de la logique de navigation en JS, le serveur n'a alors qu'un rôle de mise à disposition des données dans un format simple pour le Javascript (souvent en <b>JSON</b>) via une approche <b>RestFul</b>. </div>
<div>
<br /></div>
<h3>
<b>Les applications mobiles</b></h3>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiuhyphenhyphenOqrMkUhne2Q6h-RWbngTxIT8XjOP2qLTxe0tBiXwBo6uquNiPyppq5qti0ccxTt77jShYzHze_sDtaAyz02hy0kYUE7Vp_RjGqjs_mAkTHwr9bkkpjX7M1wunc3s6zuogtt6zObs/s1600/android-survey-300x225.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiuhyphenhyphenOqrMkUhne2Q6h-RWbngTxIT8XjOP2qLTxe0tBiXwBo6uquNiPyppq5qti0ccxTt77jShYzHze_sDtaAyz02hy0kYUE7Vp_RjGqjs_mAkTHwr9bkkpjX7M1wunc3s6zuogtt6zObs/s1600/android-survey-300x225.gif" height="50" width="63" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4TkAdDG8Nmq93G7ro1ocCT8G-mfI3JP4gjN47aQNY6f9cFwaT8Ml4uHoSm3kclsAH3QdC4YsGvWqeFfSL7ij-GJZdq-y72As5rerDfMMD2dDdsBFZ_yRYamzt0ROqQ0FcxDDuCZmuz0I/s1600/ios.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4TkAdDG8Nmq93G7ro1ocCT8G-mfI3JP4gjN47aQNY6f9cFwaT8Ml4uHoSm3kclsAH3QdC4YsGvWqeFfSL7ij-GJZdq-y72As5rerDfMMD2dDdsBFZ_yRYamzt0ROqQ0FcxDDuCZmuz0I/s1600/ios.jpg" height="41" width="63" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoxVWCdzqghuBQHyIOHZ3214Eir9sg5YsQ1QdIDmfHSuokiyptgSiiUjW7FRuOKeI6DSIiMuF9o2TVLMV0pUGrX4l_4wRV1_e1wu6cDO6MHouqBnhiZoMHzwtycotdx0TNGM8Ofw9Cko/s1600/windows-phone-logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoxVWCdzqghuBQHyIOHZ3214Eir9sg5YsQ1QdIDmfHSuokiyptgSiiUjW7FRuOKeI6DSIiMuF9o2TVLMV0pUGrX4l_4wRV1_e1wu6cDO6MHouqBnhiZoMHzwtycotdx0TNGM8Ofw9Cko/s1600/windows-phone-logo.jpg" height="53" width="63" /></a></div>
<br /></div>
<div>
<div class="" style="clear: both; text-align: justify;">
<span style="text-align: start;"><b>Les applications mobiles</b> sont à leur manière des <b>clients riches</b> puisqu'ils reprennent point par point ce qui a fait leur succès. </span></div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ces applications tournent sur des terminaux de plus en plus puissant, ce qui <b>présage un enrichissement continue des fonctionnalités présentes dans nos applications</b>.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
En voyant toutes ces évolutions on peut se demander quelles seront les architectures de demain.</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2 style="text-align: start;">
Et si demain ...</h2>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglIjbXAXDjH-4hQvFcR2DJTJYvvtwhm8iEAs_59a3lG3s3PxjueZ-EsS3P9B3FlABz_a3awgIjWP0L-_uXdZ-3XZItU_EmA4hhZbaLw6T5OgtNhq18m5qfbqq7g9xgChhLCjFZksREDTM/s1600/jesuscanom_crystal_sphere.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglIjbXAXDjH-4hQvFcR2DJTJYvvtwhm8iEAs_59a3lG3s3PxjueZ-EsS3P9B3FlABz_a3awgIjWP0L-_uXdZ-3XZItU_EmA4hhZbaLw6T5OgtNhq18m5qfbqq7g9xgChhLCjFZksREDTM/s1600/jesuscanom_crystal_sphere.png" /></a></div>
<h3>
</h3>
<h3>
Des applications conçues pour des périphériques hétérogènes</h3>
<div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A l'instar du <b>smartphone qui a révolutionné l'usage de nos applications</b>, on peut se dire que d'autres périphériques connectés vont voir le jour. Cette tendance commence déjà avec par exemple <b>les lunettes ou bien les montres connectées</b>.</div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Ces nouveaux périphériques posent plusieurs questions dans le cadre du développement de nos applications:</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
<i>Pourra t'on toujours développer des applications très riches sur des périphériques exotiques et limités ?</i></div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
<i>Comment les applications des différents périphériques vont elle dialoguer ?</i></div>
<div style="text-align: justify;">
<i>Où seront stocker les <b>données</b> ? Dans le <b>Cloud</b> ? Sur les périphériques ?</i></div>
<br /></div>
<div>
On peut imaginer trois types d'approche:<br />
<br />
<ul>
<li>Tous ces nouveaux périphériques seront <b>connectés au web</b> et <b>les données seront présentes chez les géants du web</b> (google, microsoft, amazon etc.)</li>
</ul>
<br />
<i>Les lunettes, le téléphone portable et la montre connectés à internet avec les données dans le cloud</i>
<br />
<br />
<ul>
<li>Les périphériques seront <b>interconnectés</b>, les <b>données dispersées</b>, avec <b>certains</b> périphériques <b>connectés au web</b>.</li>
</ul>
<br />
<i>Les lunettes se connectent au téléphone et la montre aux lunettes etc. Avec certains se connectant à internet.</i><br />
<br />
<ul>
<li><b>Un seul périphérique</b> connecté au web faisant office de <b>serveur centralisé</b> <b>responsable du traitement des données</b>.</li>
</ul>
<br />
<i>Les lunettes et la montre se connectent sur le téléphone qui lui se charge de traiter la donnée, soit en local, soit dans le cloud.</i><br />
<i><br /></i>
Ceci impactera inévitablement notre vision de ce qu'est un client et un serveur.<br />
<br /></div>
<h3>
Retour vers des clients lourds pour le web</h3>
<div>
Ne sautez pas de votre chaise en voyant le titre du paragraphe, il est intentionnellement provocateur.</div>
<div>
<br />
Néanmoins <b>nos clients légers/riches ont de plus en plus de points communs avec nos clients lourds</b>:<br />
<br />
<ul>
<li>Une connexion persistante (WebSocket)</li>
<li>Appel à une base de donnée</li>
<li>Affichage de toute l'application dans une seule page web (single page application)</li>
<li>Contenu multimedia</li>
</ul>
<br />
<br />
<div style="text-align: justify;">
La grande différence se situe essentiellement sur la <b>responsabilité du code métier qui est aujourd'hui principalement effectuée côté serveur</b>, mais avec la simplification de l'utilisation du JS, il pourrait être tentant <b>d'utiliser ce langage pour faire du traitement métier</b>.</div>
<div style="text-align: justify;">
Si ce cap est franchi alors nos clients légers redeviendront des clients lourds.</div>
<br /></div>
<div>
L'avenir nous dira si l'informatique peut être comparée à l'Histoire où nous assistons à des cycles perpétuels.</div>
<div>
<br /></div>
<br />
Un merci à <i>Patrice Chalcol</i> et <i>Patrick Guillerm</i> d'avoir participé à la relecture de l'article.<br />
<br />
<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com0tag:blogger.com,1999:blog-4385605823926057923.post-7518054547427716222013-04-04T23:49:00.001+02:002013-04-05T08:50:48.399+02:00Recettes de chiffrages de projet informatique Le chiffrage d'un projet en informatique se révèle souvent être une tâche ardue que ce soit dans la définition des besoins ou dans l'évaluation du temps de réalisation. Ceci a pour conséquence que le chiffrage se base souvent sur des paramètres assez subjectifs.<br />
<br />
Dans cette idée, je me suis amusé à imaginer quelques techniques permettant de faire du chiffrage. Toutes ressemblances a des faits réels n'est que pure coïncidence ;).<br />
<br />
<h3>
Le compteligne</h3>
Cette technique prend en compte le nombre de ligne et la structure du document fournis par le client.<br />
<br />
Etapes:<br />
<ol>
<li>Découper le projet à chiffrer en tâches très macros. Le découpage revient souvent à reprendre les paragraphes de l'expression de besoin du client c.a.d 1 tâche égale 1 paragraphe ou 1 chapitre. </li>
<li>Prendre le nombre de ligne de chaque tâche et le multiplier par un autre
coeff en fonction de ce que vous avez compris de la tâche à réaliser.
Plus la tâche vous parait incompréhensible, plus le coeff doit
augmenter. </li>
<li>Ainsi vous obtenez un certain nombre de jours/homme. </li>
<li>Adapter le chiffrage en fonction des remords suscités par ce dernier.</li>
</ol>
<br />
<br />
Exemple: Une expression de besoin faisant 3 chapitres<br />
<br />
1er chapitre: 3 lignes<br />
Compréhension du chapitre: je n'ai rien compris => 3<br />
2e chapitre: 5 lignes<br />
Compréhension du chapitre: ca me paraît clair => 2 <br />
3e chapitre: 10 lignes<br />
Compréhension du chapitre: J'ai tout compris =>1<br />
<br />
Nombre de jour/homme = 3 x 3 + 5 x 2 + 10 x 1 = 29 jrs/homme<br />
Nombre de jour/homme après remords = 24 jrs/homme<br />
<br />
<h3>
Le comptemot (compteligne police proof)</h3>
<br />
Cette technique est une variante du compteligne mais a l'avantage de ne pas être sensible à la police. En effet le nombre de mot est pris en compte à la place du nombre de ligne.<br />
<br />
<h3>
Le mathétique</h3>
<br />
Cette technique est réservée aux psychopathes des mathématiques et aux fanas de préjugés.<br />
<br />
Etapes:<br />
<ol>
<li>Découper méticuleusement chaque besoin afin d'en faire des tâches très micros de l'ordre d'1j/h.</li>
<li>Avoir au préalable calculé la productivité de chacun de ses devs après une longue observation, en déduire des données en fonction de préjugés: Temps effectif devant le poste, temps passé à surfer sur le net, âge des développeurs, nombre de dev en couple, nombre de femmes etc. </li>
<li>Prendre le résultat de ces calculs et le corréler aux tâches à réaliser.</li>
<li>Savourer le chiffrage obtenu avec un rire sadique.</li>
</ol>
Exemple:<br />
Découpage du projet en 1101 micro-tâches d'1j/h. Dans l'équipe, il y a trois devs, deux hommes et 1 femme.<br />
Un homme est marié, ce qui fait de lui un dev avec des obligations => 75 % de dev,<br />
L'autre est célibataire à tendance nolife et à l'avantage d'être barbu => 120 % de dev,<br />
La femme a un beau physique => 50% de dev car pour ce type de chifffreur, elle n'est qu'un demi développeur.<br />
<br />
Résultat: 1101 * 125 / 100 * 80/100 * 150/100 = 1651.5 j/h<br />
Résultat en prenant en compte les jours de maladies potentiels: 1651.5 * 110 % = 1816.65 j/h<br />
<br />
<h3>
Le coffreur</h3>
<br />
Cette technique est réservé aux chiffreurs codeurs et très simple à réaliser. A adapter selon le langage préféré du geek.<br />
<br />
Etapes:<br />
<ol>
<li>Découpage des tâches aléatoire.</li>
<li>En fonction de la compléxité ressentie, choisir un nombre de jour max.</li>
<li>Coder un algo du genre Math.random() * nombre de j/h max.</li>
<li>Obtenez votre résultat. </li>
</ol>
<br />
<h3>
Le lancé de dés</h3>
<br />
Cette technique est équivalente au coffreur mais à l'avantage d'être utilisable par n'importe qui sachant lancer des dés.<br />
<br />
Etapes:<br />
<ol>
<li>Découpage des tâches aléatoire.</li>
<li>En fonction de la compléxité ressentie, changer le nombre de dés.</li>
<li>Lancer les dés.</li>
<li>Obtenez votre résultat.</li>
</ol>
<br />
<h3>
Le souk ou marchandage de tapis</h3>
<br />
Cette technique consiste à ne pas prendre en considération le besoin, mais uniquement à marchander avec le client. <br />
<br />
Etapes:<br />
<ol>
<li>Tenter de connaître la fourchette attendue par le client</li>
<li>Si la fourchette est connue, alors rendre un chiffre aléatoire contenu dans la fourchette.</li>
<li>Si la fourchette n'est pas connue, alors présenter plusieurs chiffrages successivement au client en prenant soin de temporiser avant chaque présentation. Si le client dit "c'est trop cher" alors rendre un chiffrage inférieur . Si le client dit "vous avez surement oublié quelque chose" alors gonfler le chiffrage. Réitérer jusqu'à ce que le client dise "Ok".</li>
<li>Le chiffrage est prêt.</li>
</ol>
<br />
Si vous avez d'autres idées, n'hésitez pas à m'en faire part.<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com1tag:blogger.com,1999:blog-4385605823926057923.post-84103223568825773182012-02-07T09:20:00.000+01:002015-03-11T10:28:36.846+01:00camel create routes dynamically<h1>
Apache camel, create routes dynamically</h1>
<h2>
Create camel routes dynamically</h2>
In this entry we'll create a camel route dynamically.
<br />The route uses the camel-mail component that permits to connect to pop/imap/smtp mailboxs.
<br />
<h3>
Dependencies</h3>
We use the version <b>2.9.0</b> of camel. <br />
maven<br />
<pre class="brush: xml"> <dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
<version>2.9.0</version>
</dependency>
</pre>
ivy<br />
<pre class="brush: xml"> <dependency org="org.apache.camel" name="camel-core" rev="2.9.0"/>
<dependency org="org.apache.camel" name="camel-mail" rev="2.9.0"/>
</pre>
<h3>
RouteBuilder</h3>
In order to create a new Route it is necessary to create a class that extends RouteBuilder.<br />
After you have to implement the method configure() that permits to configure your route.
<br />
Example for an imap email route<br />
<pre class="brush: java"> public class MailRouteBuilder extends RouteBuilder {
private String login;
private String password;
private String host;
public MailRouteBuilder(String login,String password,String host){
this.login=login;
this.password=password;
this.host=host;
}
@Override
public void configure() throws Exception {
fromUri=String.format("imap://%s?username=%s&password=%s",host,login,password);
from(fromUri).to("mock:myMock");
}
}
</pre>
If you use a processor, don't forget to assign an id to the bean inside the camel spring context ex:<br />
<pre class="brush: java"> from(fromUri).processRef("imapProcessor").to("mock:myMock");
</pre>
<pre class="brush: xml">
<bean id="imapProcessor" class="myPackage.MyProcessor" />
</pre>
Ok, now we have a builder for the new route in a very easy way.<br />
Now it is necessary to create a new spring bean that implements CamelContextAware.
If you use <b>spring</b> and <b>annotation</b> you can configure in a very easy way with the @Service annotation:
<br />
<pre class="brush: java"> @Service
public class CamelRouteManager implements CamelContextAware { ...
</pre>
If you don't use the annotation, so you have to edit the camel spring context:
<br />
<pre class="brush: xml"> <bean id="camelRouteManager" class="myPackage.CamelRouteManager" />
</pre>
The implementation of CamelContextAware need to implement the getter/setter for the camel context. It means you have to provide a camelContext field.<br />
<pre class="brush: java"> protected CamelContext camelContext;
public CamelContext getCamelContext() {
return camelContext;
}
public void setCamelContext(CamelContext camelContext) {
this.camelContext = camelContext;
}
</pre>
Now we can create a method named addMailRoute that creates a new imap route:<br />
<pre class="brush: java"> public void addMailRoute(String login,String password,String host){
MailRouteBuilder mailRouteBuilder=new MailRouteBuilder(login,password,host);
this.camelContext.addRoutes(mailRouteBuilder);
}
</pre>
If all is ok the route should start automatically.<br />
Ok, but if I want to remove, stop or suspend a route, how can I do ?<br />
Very easy, you have just to use:
<br />
<pre class="brush: java">camelContext.removeRoute(String routeId)</pre>
<pre class="brush: java">camelContext.stopRoute(String routeId)</pre>
<pre class="brush: java">camelContext.suspendRoute(String routeId)</pre>
Take care, for <b>remove</b> a route it is necessary to <b>stop</b> it before.
<br />
Ok, how can I retrieve the id of the route created dynamically ?<br />
Just have to retrieve the routeDefinition object, go back in the MailRouteBuilder class:<br />
<pre class="brush: java"> private RouteDefinition routeDefinition;
@Override
public void configure() throws Exception {
fromUri=String.format("imap://%s?username=%s&password=%s",host,login,password);
routeDefinition=from(fromUri).to("mock:myMock");
}
public RouteDefinition getRouteDefinition() {
return routeDefinition;
}
</pre>
Now retrieve the routeDefinition object and extract the id in the CamelRouteManager class:<br />
<pre class="brush: java"> public String addMailRoute(String login,String password,String host){
MailRouteBuilder mailRouteBuilder=new MailRouteBuilder(login,password,host);
this.camelContext.addRoutes(mailRouteBuilder);
return mailRouteBuilder.getRouteDefinition().getId();
}
</pre>
It is also possible to create several routes in one shot. You can adapt the code to have a list of routeDefinition instead of a simple String<br />
Now all is done, you can enjoy all your created routes.<br />
<br />
<a href="http://camel.apache.org/">apache camel official site</a>
Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com0tag:blogger.com,1999:blog-4385605823926057923.post-11926603283680233212012-02-07T08:40:00.000+01:002012-02-07T08:40:04.166+01:00Bayes algorithm with apache mahout<a name='more'></a>
<h1>Apache mahout in action using the java API and bayes algorithm.</h1>
<h2>Simple bayes implementation</h2>
For people that doesn't know what is apache mahout: <a href="http://mahout.apache.org/">mahout</a>
<br/>
Here we'll implement the bayes algorithm for a text classification.<br />
What does the example ?
<br />
<ul>
<li> Train apache mahout in order to make it smarter.</li>
<li> Automatic classification of a content. </li>
</ul>
<h3>
Dependencies</h3>
For the example we only need the mahout-core dependency. We use the version 0.5 .<br />
<b>maven</b><br />
<pre class="brush: xml">
<dependency>
<groupid>org.apache.mahout</groupid>
<artifactid>mahout-core</artifactid>
<version>0.5</version>
</dependency>
</pre>
<b>ivy</b><br />
<pre class="brush: xml">
<dependency name="mahout-core" org="org.apache.mahout" rev="0.5" />
</pre>
<h3>Training</h3>
Mahout training in order to recognize our content:<br />
<pre class="brush: java">
/**
* This method permits to make smarter apache mahout.
* @param label the label associated to the file.
* @param fileToClassify the file associated to the specified label.
* @param charset the charset of content of the file.
* @param tmpDir the directory where the transformed file will be stocked.
* @param databaseOutputDir the directory of the apache hadoops database, which contains reference data for future classification.
* @throws IOException
*/
public void training(String label, String fileToClassify, String charset, String outputDir,
String databaseOutputDir) throws IOException {
/*
* Take the document and associate to a label inside a file that
* respects the apache mahout input format:
* [LABEL] _TAB_ [TEXT]
* example:
* english mahout is a good product.
* french mahout est un bon produit.
* Note the analyzer =&gt; This is a lucene analyzer, by default apache mahout provide one. I used this one.
* In few words the analyzor permits to define how the words will be extracted from your file...
*/
BayesFileFormatter.format(label, new DefaultAnalyzer(), new File(fileToClassify), Charset.forName(charset),
new File(outputDir));
/*
* Here we build the bayes parameters object that permits to define some
* information about the way to stock the training data. Mahout use
* apache hadoops in background for save the classification data.
* See the hadoops documentation to know more about this object.
* Just take care to specify the classifierType and the basePath.
*/
BayesParameters bayesParameters = buildBayesParam(charset, databaseOutputDir);
/*
* Start the training !
*/
TrainClassifier.trainNaiveBayes(new Path(outputDir), new Path(databaseOutputDir), bayesParameters);
}
private BayesParameters buildBayesParam(String charset, String databaseOutputDir) {
BayesParameters bayesParameters = new BayesParameters();
bayesParameters.setGramSize(1);
bayesParameters.set("verbose", "true"); //If you want to see what happen.
bayesParameters.set("classifierType", "bayes");
bayesParameters.set("defaultCat", "other"); //The default category to return if a label is not found for a specified text.
bayesParameters.set("encoding", charset);
bayesParameters.set("alpha_i", "1.0");
bayesParameters.set("dataSource", "hdfs");
bayesParameters.set("basePath", databaseOutputDir);
return bayesParameters;
}
</pre>
<h3>Classification</h3>
This code try to find the good label in asking mahout for a specified content:<br />
<pre class="brush: java">
/**
* Ask to mahout to find the good label for the specified content.
*
* @param contentToClassify
* the content to classify.
* @param charset
* the charset of the content.
* @param databaseOutputDir
* mahout database directory.
* @return label the label retrieved by mahout.
* @throws InvalidDatastoreException
* @throws IOException
*/
public String searchLabel(String contentToClassify, String charset, String databaseOutputDir)
throws InvalidDatastoreException, IOException {
//define the algorithm to use
Algorithm algorithm = new BayesAlgorithm();
//specify the mahout datastore to use. (the path of hadoops database).
Datastore datastore = new InMemoryBayesDatastore(buildBayesParam(charset, databaseOutputDir));
//initialize the mahout context.
ClassifierContext context = new ClassifierContext(algorithm, datastore);
context.initialize();
//Make the search
ClassifierResult classifyResult = context.classifyDocument(new String[] { contentToClassify }, "other");
//Result
return classifyResult.getLabel();
}
</pre>
I strongly recommend to see the source of the dependency mahout-utils, very useful to understand the project.
<br />
References<br />
<a href="http://mahout.apache.org/">apache mahout official site</a><br />
<a href="http://aredko.blogspot.com/2010/11/getting-started-with-apache-mahout.html">An other example of use bayes algorithm with mahout</a>Anonymoushttp://www.blogger.com/profile/02320300219523167633noreply@blogger.com7