Your SlideShare is downloading. ×
0
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Qui a déjà entendu parler de l’AOP ?




 ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Qui a déjà au moins joué un peu
            avec l’AOP ?




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Qui a déjà utilisé l’AOP dans
              des projets ?




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Qui a une idée vague de ce que
       sont les principes et les
       mécanismes de l’AOP ?



ALT.NET Paris - Juin   Rom...
Qui veut prendre ma place ?




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Romain Verdier
                       http://codingly.com
                       http://twitter.com/romainverdier




    ...
1. Le problème
   Ou pourquoi nous aurions besoin de l’AOP
2. L’AOP, mais qu’est-ce ?
   Introduction : le principe de l’A...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Machine-level code
 Structural programming
    Procedural programming
          Modular programming
                Object...
L’OOP permet aujourd’hui d’atteindre
    un bon niveau d’abstraction, et
  autorise une modularité assez fine.




ALT.NET...
O RLY?


ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Separation of Concerns
                   (SoC)

Single Responsability Principle
            (SRP)

ALT.NET Paris - Juin  ...
L’OOP ne permet pas toujours
  d’isoler certains « concerns »




ALT.NET Paris - Juin   Romain Verdier   http://codingly....
Cross Cutting Concerns


   « Considérations Entrecroisées » ou
 « Préoccupations Transversales ». Haha.
ALT.NET Paris - J...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Méthode


                                        Code métier

                                        Transactions

     ...
Peut-on faire mieux ?




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Plein de trucs.



ALT.NET Paris - Juin       Romain Verdier   http://codingly.com
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
On retiendra surtout :


Aspect Oriented Programming


On parle aussi d’AOSD : Aspect Oriented Software Developement.




...
Le but :




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
(Eliminer les spaghettis !)


  Permettre l’isolation des Cross
   Cutting Concerns, ces aspects
transverses qu’il est imp...
Oui, mais comment ?



  En mettant la notion d’aspect
transverse au premier plan, et en
 offrant un complément à l’OOP.

...
L’AOP est donc un complément
              à l’OOP.




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
En AOP, comment définir un
              aspect ?

What ? Where ? When ?


ALT.NET Paris - Juin   Romain Verdier   http://...
Aspect = Advice(s) + Pointcut(s)




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Advice (Greffon)

       Pièce de code constituant tout
       ou une partie de la logique de
                  l’aspect.
...
Pointcut (Point d’action)
     Point de branchement, endroit
      du programme où placer une
     greffe. Il s’agit forcé...
Joinpoint (Point de jonction)

    Point valide de branchement
   dans le programme. Il y en a de
           différents ty...
(Vous l’attendiez, hein ?)
ALT.NET Paris - Juin    Romain Verdier   http://codingly.com
Identifier le cross cutting concern.




 ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Ecrire l’aspect.
Ici, un seul greffon qui pourrait
ressembler à quelque chose comme ça :




  ALT.NET Paris - Juin   Roma...
Choisir les points d’action.




Pointcut = « A l’entrée de chaque méthode »
 ALT.NET Paris - Juin   Romain Verdier   http...
En résumé, l’AOP consiste à :

• Identifier les « cross cutting concerns »

• Ecrire un ou plusieurs greffons – les advice...
… choisir où appliquer les greffons ?



 Justement, comment les
       appliquer ?


 ALT.NET Paris - Juin   Romain Verdi...
Méthode
                          Code métier                Logging




                                            Trans...
Code métier
                                     Aspects
                                          Logging
Pointcuts




 ...
Il va falloir tisser.


ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Hourra !
       Code métier
                                     Aspects
                                          Logging...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Non, il y a un truc.

Différentes techniques de tissage.



 ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Mais avant tout, il faut un
 moyen de décrire les aspects :
  greffons et points d’action.



ALT.NET Paris - Juin   Romai...
1     2     3     4



   Un nouveau langage de
programmation, une surcouche
ou une extension à un langage
          exist...
1     2     3     4




  Utilisation d’attributs, ou
  d’annotations : profiter du
support des métadonnées d’un
         ...
1     2     3     4



            Fichier de
   configuration/définition. TXT,
          XML, DSL, etc.



ALT.NET Paris ...
1     2     3     4




API classique. Définir comment
 appliquer les aspects par code.




ALT.NET Paris - Juin   Romain ...
Revenons au tissage


                       Aux techniques de tissage


ALT.NET Paris - Juin        Romain Verdier   http...
Tissage (Weaving) :

 Insertion des greffons dans le
programme à instrumenter, aux
    points d’action définis.


ALT.NET ...
2 ½ types de tissage
• Tissage statique
 Compile-time weaving
• Tissage dynamique
 Runtime weaving
• (Tissage hybride)
 Co...
1     2     3


           Tissage statique.
Le tissage à lieu avant la compilation,
 durant la compilation, ou juste aprè...
1     2     3



     Avoir son propre compilateur.




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
1     2     3




            Modifier le code source.



                                        Pré-compilation

ALT.NET...
1     2     3




               Modifier le bytecode.



                                        CIL, Java bytecode

ALT....
1     2     3




     Tissage dynamique.
Le tissage à lieu durant l’exécution
           du programme.


ALT.NET Paris - ...
1     2     3



Les techniques dépendent fortement de
             la plateforme.

                 Aujourd’hui, c’est .N...
1     2     3




Utiliser l’infrastructure de .NET Remoting



 RealProxy, TransparentProxy, MarshalByRefObjec
          ...
1     2     3




Génération dynamique de types à la volée.
               (Proxying)



                                 ...
1     2     3




      Sciences occultes : Profiling API,
               Debugging API




ALT.NET Paris - Juin   Romain ...
(Tissage                                        1     2     3

       Hybride)




                        Deux autres cat...
1     2     3




   Tissage statique au chargement: Le
    tissage sur le bytecode a lieu juste
    avant le chargement d...
1     2     3



              Instrumentation statique
                    (Join points)
                          +
    ...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Une myriade* d’outils.




* 10 000
  ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Mais peu* sont vivants, matures,
         utilisables, utilisés, etc.




*3<n<6
 ALT.NET Paris - Juin   Romain Verdier   ...
Cependant, l’AOP n’est pas, ou
     plus, un fantasme en .NET.




ALT.NET Paris - Juin   Romain Verdier   http://codingly...
Pour commencer :
         l’interception dynamique.




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Attention, l’interception, ce n’est pas
         vraiment de l’AOP.




ALT.NET Paris - Juin   Romain Verdier   http://cod...
Avant :

       Client                                              Service




                       Après :
           ...
Proxies .NET Remoting
•    RealProxy, TransparentProxy
•    MarshalByRefObject, ContextBoundObject
•    Contraignant
•    ...
Castle.DynamicProxy

•    System.Reflection.Emit
•    Très mature, très utilisé
•    Simple
•    (Castle.Windsor)




    ...
Linfu.DynamicProxy

•    System.Reflection.Emit
•    Lightweight
•    Performant
•    A la mode, commence à remplacer Cast...
IoC + Interception = AOP ?




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Spring.NET
•    Conteneur IoC
•    Spring.Aop
•    Interception dynamique
•    Assez riche
•    Mature
•    System.Reflect...
Tissage Statique



ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Linfu.AOP
•    Tissage Hybride
•    Simple
•    Utilise Mono.Cecil
•    Jeune
•    Supporte mal le debug




    ALT.NET P...
PostSharp (PostSharp.Laos)
•    Plateforme complète
•    Full static weaving
•    Supporte le Load-time weaving
•    Très ...
Mais encore :




ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
code;              Interception dynamique


          • Real/Transparent Proxy
          • Castle.DynamicProxy
          •...
code;              Tissage statique


          • PostSharp.Laos

          • Linfu.AOP


ALT.NET Paris - Juin     Romain ...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
code;              Conteneurs IoC & Interception


          • Spring.NET
          • (Castle.Windsor)
          • (Etc.)
...
code;              A la main ?


          • System.Reflection.Emit

          • Mono.Cecil


ALT.NET Paris - Juin    Roma...
ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Pas de conclusion.



ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
Pour mieux débattre ?



ALT.NET Paris - Juin   Romain Verdier   http://codingly.com
France
                   http://www.altnetfr.org
                   http://groups.google.com/group/parisaltnet




ALT.NE...
Photos

http://www.flickr.com/photos/kaztor/2974815584/
http://www.flickr.com/photos/fdecomite/1655939589/
http://www.flic...
Upcoming SlideShare
Loading in...5
×

AOP en .NET

3,147

Published on

La Programmation Orientée Aspect en .NET.

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
  • it's a goood representation
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
3,147
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
99
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "AOP en .NET"

  1. 1. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  2. 2. Qui a déjà entendu parler de l’AOP ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  3. 3. Qui a déjà au moins joué un peu avec l’AOP ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  4. 4. Qui a déjà utilisé l’AOP dans des projets ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  5. 5. Qui a une idée vague de ce que sont les principes et les mécanismes de l’AOP ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  6. 6. Qui veut prendre ma place ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  7. 7. Romain Verdier http://codingly.com http://twitter.com/romainverdier Consultant FastConnect http://fastconnect.fr http://blog.fastconnect.fr ALT.NET Paris - Juin Romain Verdier http://codingly.com
  8. 8. 1. Le problème Ou pourquoi nous aurions besoin de l’AOP 2. L’AOP, mais qu’est-ce ? Introduction : le principe de l’AOP 3. C’est magique ou quoi ? Démystification de l’AOP, les techniques, les méthodes 4. Et donc, en .NET ? Les outils qui existent et qui sont utilisés 5. Bullshit ! Un exemple, peut-être ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  9. 9. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  10. 10. Machine-level code Structural programming Procedural programming Modular programming Object Oriented Programming ALT.NET Paris - Juin Romain Verdier http://codingly.com
  11. 11. L’OOP permet aujourd’hui d’atteindre un bon niveau d’abstraction, et autorise une modularité assez fine. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  12. 12. O RLY? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  13. 13. Separation of Concerns (SoC) Single Responsability Principle (SRP) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  14. 14. L’OOP ne permet pas toujours d’isoler certains « concerns » ALT.NET Paris - Juin Romain Verdier http://codingly.com
  15. 15. Cross Cutting Concerns « Considérations Entrecroisées » ou « Préoccupations Transversales ». Haha. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  16. 16. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  17. 17. Méthode Code métier Transactions Logging ALT.NET Paris - Juin Romain Verdier http://codingly.com
  18. 18. Peut-on faire mieux ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  19. 19. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  20. 20. Plein de trucs. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  21. 21. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  22. 22. On retiendra surtout : Aspect Oriented Programming On parle aussi d’AOSD : Aspect Oriented Software Developement. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  23. 23. Le but : ALT.NET Paris - Juin Romain Verdier http://codingly.com
  24. 24. (Eliminer les spaghettis !) Permettre l’isolation des Cross Cutting Concerns, ces aspects transverses qu’il est impossible de factoriser convenablement grâce à l’OOP. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  25. 25. Oui, mais comment ? En mettant la notion d’aspect transverse au premier plan, et en offrant un complément à l’OOP. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  26. 26. L’AOP est donc un complément à l’OOP. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  27. 27. En AOP, comment définir un aspect ? What ? Where ? When ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  28. 28. Aspect = Advice(s) + Pointcut(s) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  29. 29. Advice (Greffon) Pièce de code constituant tout ou une partie de la logique de l’aspect. What. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  30. 30. Pointcut (Point d’action) Point de branchement, endroit du programme où placer une greffe. Il s’agit forcément d’un point de jonction. Where. (When.) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  31. 31. Joinpoint (Point de jonction) Point valide de branchement dans le programme. Il y en a de différents types. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  32. 32. (Vous l’attendiez, hein ?) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  33. 33. Identifier le cross cutting concern. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  34. 34. Ecrire l’aspect. Ici, un seul greffon qui pourrait ressembler à quelque chose comme ça : ALT.NET Paris - Juin Romain Verdier http://codingly.com
  35. 35. Choisir les points d’action. Pointcut = « A l’entrée de chaque méthode » ALT.NET Paris - Juin Romain Verdier http://codingly.com
  36. 36. En résumé, l’AOP consiste à : • Identifier les « cross cutting concerns » • Ecrire un ou plusieurs greffons – les advices – qui représentent l’aspect et qui permettent d’encapsuler la « préoccupation transverse ». • Choisir où appliquer ces greffons – les pointcuts… ALT.NET Paris - Juin Romain Verdier http://codingly.com
  37. 37. … choisir où appliquer les greffons ? Justement, comment les appliquer ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  38. 38. Méthode Code métier Logging Transactions OOP OOP + AOP ALT.NET Paris - Juin Romain Verdier http://codingly.com
  39. 39. Code métier Aspects Logging Pointcuts Transactions OOP + AOP ALT.NET Paris - Juin Romain Verdier http://codingly.com
  40. 40. Il va falloir tisser. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  41. 41. Hourra ! Code métier Aspects Logging Pointcuts Transactions Tisseur OOP + AOP ALT.NET Paris - Juin Romain Verdier http://codingly.com
  42. 42. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  43. 43. Non, il y a un truc. Différentes techniques de tissage. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  44. 44. Mais avant tout, il faut un moyen de décrire les aspects : greffons et points d’action. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  45. 45. 1 2 3 4 Un nouveau langage de programmation, une surcouche ou une extension à un langage existant. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  46. 46. 1 2 3 4 Utilisation d’attributs, ou d’annotations : profiter du support des métadonnées d’un langage. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  47. 47. 1 2 3 4 Fichier de configuration/définition. TXT, XML, DSL, etc. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  48. 48. 1 2 3 4 API classique. Définir comment appliquer les aspects par code. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  49. 49. Revenons au tissage Aux techniques de tissage ALT.NET Paris - Juin Romain Verdier http://codingly.com
  50. 50. Tissage (Weaving) : Insertion des greffons dans le programme à instrumenter, aux points d’action définis. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  51. 51. 2 ½ types de tissage • Tissage statique Compile-time weaving • Tissage dynamique Runtime weaving • (Tissage hybride) Compile-time + Runtime weaving ALT.NET Paris - Juin Romain Verdier http://codingly.com
  52. 52. 1 2 3 Tissage statique. Le tissage à lieu avant la compilation, durant la compilation, ou juste après la compilation. Mais avant l’exécution du programme. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  53. 53. 1 2 3 Avoir son propre compilateur. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  54. 54. 1 2 3 Modifier le code source. Pré-compilation ALT.NET Paris - Juin Romain Verdier http://codingly.com
  55. 55. 1 2 3 Modifier le bytecode. CIL, Java bytecode ALT.NET Paris - Juin Romain Verdier http://codingly.com
  56. 56. 1 2 3 Tissage dynamique. Le tissage à lieu durant l’exécution du programme. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  57. 57. 1 2 3 Les techniques dépendent fortement de la plateforme. Aujourd’hui, c’est .NET. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  58. 58. 1 2 3 Utiliser l’infrastructure de .NET Remoting RealProxy, TransparentProxy, MarshalByRefObjec t, ContextBoundObject ALT.NET Paris - Juin Romain Verdier http://codingly.com
  59. 59. 1 2 3 Génération dynamique de types à la volée. (Proxying) Proxies via SRE ALT.NET Paris - Juin Romain Verdier http://codingly.com
  60. 60. 1 2 3 Sciences occultes : Profiling API, Debugging API ALT.NET Paris - Juin Romain Verdier http://codingly.com
  61. 61. (Tissage 1 2 3 Hybride) Deux autres catégories. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  62. 62. 1 2 3 Tissage statique au chargement: Le tissage sur le bytecode a lieu juste avant le chargement de l’assembly. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  63. 63. 1 2 3 Instrumentation statique (Join points) + Injection dynamique (Advices) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  64. 64. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  65. 65. Une myriade* d’outils. * 10 000 ALT.NET Paris - Juin Romain Verdier http://codingly.com
  66. 66. Mais peu* sont vivants, matures, utilisables, utilisés, etc. *3<n<6 ALT.NET Paris - Juin Romain Verdier http://codingly.com
  67. 67. Cependant, l’AOP n’est pas, ou plus, un fantasme en .NET. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  68. 68. Pour commencer : l’interception dynamique. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  69. 69. Attention, l’interception, ce n’est pas vraiment de l’AOP. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  70. 70. Avant : Client Service Après : J’fais ce que je veux. Client Proxy Service ALT.NET Paris - Juin Romain Verdier http://codingly.com
  71. 71. Proxies .NET Remoting • RealProxy, TransparentProxy • MarshalByRefObject, ContextBoundObject • Contraignant • Lourd, performances • BCL • (Policy Injection Application Block) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  72. 72. Castle.DynamicProxy • System.Reflection.Emit • Très mature, très utilisé • Simple • (Castle.Windsor) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  73. 73. Linfu.DynamicProxy • System.Reflection.Emit • Lightweight • Performant • A la mode, commence à remplacer Castle.DP2 • Simple ALT.NET Paris - Juin Romain Verdier http://codingly.com
  74. 74. IoC + Interception = AOP ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  75. 75. Spring.NET • Conteneur IoC • Spring.Aop • Interception dynamique • Assez riche • Mature • System.Reflection.Emit ALT.NET Paris - Juin Romain Verdier http://codingly.com
  76. 76. Tissage Statique ALT.NET Paris - Juin Romain Verdier http://codingly.com
  77. 77. Linfu.AOP • Tissage Hybride • Simple • Utilise Mono.Cecil • Jeune • Supporte mal le debug ALT.NET Paris - Juin Romain Verdier http://codingly.com
  78. 78. PostSharp (PostSharp.Laos) • Plateforme complète • Full static weaving • Supporte le Load-time weaving • Très riche, mature • Plutôt « easy » • (Commercial) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  79. 79. Mais encore : ALT.NET Paris - Juin Romain Verdier http://codingly.com
  80. 80. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  81. 81. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  82. 82. code; Interception dynamique • Real/Transparent Proxy • Castle.DynamicProxy • Linfu.DynamicProxy ALT.NET Paris - Juin Romain Verdier http://codingly.com
  83. 83. code; Tissage statique • PostSharp.Laos • Linfu.AOP ALT.NET Paris - Juin Romain Verdier http://codingly.com
  84. 84. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  85. 85. code; Conteneurs IoC & Interception • Spring.NET • (Castle.Windsor) • (Etc.) ALT.NET Paris - Juin Romain Verdier http://codingly.com
  86. 86. code; A la main ? • System.Reflection.Emit • Mono.Cecil ALT.NET Paris - Juin Romain Verdier http://codingly.com
  87. 87. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  88. 88. Pas de conclusion. ALT.NET Paris - Juin Romain Verdier http://codingly.com
  89. 89. Pour mieux débattre ? ALT.NET Paris - Juin Romain Verdier http://codingly.com
  90. 90. France http://www.altnetfr.org http://groups.google.com/group/parisaltnet ALT.NET Paris - Juin Romain Verdier http://codingly.com
  91. 91. Photos http://www.flickr.com/photos/kaztor/2974815584/ http://www.flickr.com/photos/fdecomite/1655939589/ http://www.flickr.com/photos/mytripsmypics/551019306/ http://www.flickr.com/photos/st3f4n/143623934/ http://www.flickr.com/photos/artsyscience/51311029/ http://www.flickr.com/photos/wonderlane/298818505/ http://www.flickr.com/photos/juliaanderson/2769018395/ http://www.flickr.com/photos/putupyourdukes/3583539544/ http://www.flickr.com/photos/jokofoto/809920021/ http://www.flickr.com/photos/freakdiver/1390893431/ http://www.flickr.com/photos/strelitzia/259744405/ http://www.flickr.com/photos/shoves/427382857/ http://www.flickr.com/photos/isimmer/1033139937/ http://www.flickr.com/photos/jbevain/314035471/ http://www.flickr.com/photos/lamiacucina/3608223128/ http://imgur.com/fhxDb.jpg ALT.NET Paris - Juin Romain Verdier http://codingly.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×