SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
Spring 3 en
production
J U G S u m m e r C a m p
1 1 / 0 9 / 2 0 1 0
Qui suis-je?
Julien Dubois
Spring par la pratique
Ancien de
SpringSource
Responcia
Twitter: @juliendubois
Sommaire
(1)Introduction rapide à Spring
(2)Configurer Spring
(3)Spring à l'exécution
(4)Spring & Hibernate
(5)Spring & le Cloud
(6)Monitorer Spring
1 - Introduction
rapide à Spring
Si vous ne
connaissez pas,
c’est le moment
de vous jeter à
l’eau!
Qu’est-ce que
Spring?
Framework IoC
Open Source	

Meta-framework
Projets Spring-*
Les bases de Spring
Un Bean Spring = Un
objet Java «simple»
Généralement un
singleton, mais pas
forcément
Configuré et instancié au
démarrage de
l’application
L’injection de
dépendances
«Ne nous
appelez pas,
nous vous
rappellerons» -
pattern
d’Hollywood
Exemple: injection
par constructeur
public class MonServiceImpl
implements MonService {
private AutreService autreService;
public MonServiceImpl(
AutreService autreService) {
this.autreService = autreService;
}
}
La programmation
orientée aspect
Les beans
Spring sont
«améliorés»,
«enrichis»
lors de leur
injection
Exemple: transaction
& sécurité avec l’aop
public class MonServiceImpl
implements MonService {
@Transactional
@Secured("ROLE_USER")
public long methodeMetier(String value) {
// ...
}
}
2 - Configurer
Spring
Configuration de
Spring
Configuration XML
Configuration par
annotations
Spring JavaConfig
@Autowired
private MonBean monBean;
Fichiers XML
Divisez pour mieux
régner
Utilisez les namespaces
Stockez les fichiers
dans
META-INF/spring
La configuration
d’infrastructure varie
suivant les
environnements
Gestion des
propriétés
Gagnez en souplesse:
externalisez vos propriétés
Proposez des valeurs par
défaut, faciles à surcharger
<context:property-placeholder
location="classpath*:META-INF/spring/*.properties,
classpath*:*.properties"/>
Utilisez votre
serveur d’applications
Un serveur
d’applications fournit de
nombreux services
(DataSources, JMS...)
Plus performant, plus
simple à exploiter que
l’équivalent Spring
<jee:jndi-lookup id="dataSource"
jndi-name="java:comp/env/jdbc/myDS"/>
Les application
contexts hiérarchiques
On peut avoir une
hiérarchie de contexts
Spring
Souvent utilisé sans le
savoir (Spring MVC)
Permet une séparation
logique de l’architecture
Contexte parent
(métier)
Contexte enfant
(présentation)
3 - Spring à
l'exécution
Spring est partout
Démarrez du bon
pied
Valider
l’application au
démarrage
@Required et
@Autowired -
assurance d’une
injection réussie
Le lazy-loading
Lazy-loading sur les
beans «lents à
démarrer»
FBI: Fausse Bonne
Idée
L’AOP
Différentes
manières de
muscler ses objets
Proxy JDK vs
CGLIB
AspectJ
Après le démarrage
Les beans Spring sont
disponibles
Et vont être attaqués
par de nombreuses
threads en parallèle
Attention à être thread
safe!
Bean Spring
Scopes des Beans
Singleton, Session,
Flow, Request,
Prototype
<aop:scoped-proxy>
Attention au clustering
Lancement de
traitements asynchrones
@Async
TaskExecutor
Permet de tenir la charge
comme Twitter
Astuce: avoir un pool
d’une seule thread
<task:executor id="executor" pool-size="1"/>
OSGi
Oh est-ce j’y aïe?
4 - Spring &
Hibernate
Spring & Hibernate
Un secret peu ébruité par SpringSource et
JBoss
Une corrélation de 1 dans l’utilisation des
deux projets
Le chargement
«paresseux»
Lazy-loading ou outer
join?
Utilisez un cache de
2nd niveau
Optimisez vos named
queries
Hibernate Validator
Valide vos objets
du domaine
Mort au domaine
anémique
Supporté par
Spring 3
Hibernate Search
La méthode intelligente pour
embarquer un moteur de
recherche
Peut grandement alléger la
charge de votre base de
données
Parfaitement intégré à
Hibernate, transparent pour
Spring
5 - Spring &
le Cloud
Plusieurs types de
cloud
IaaS (Infrastructure As A
Service): Amazon
Simple location de
matériel à la demande
PaaS (Platform As A
Service): Google
Cache distribué, base
de données spécialisée
Spring dans le
nuage: la théorie
Configuration identique: IoC et AOP doivent fonctionner
de la même manière
Permet une plus grande portabilité, en particulier pour le
PaaS
Historiquement,
une force de
Spring: portabilité
entre les serveurs
d’applications
Spring dans le
nuage: la pratique
Lancer des Singletons dans une JVM
pose rarement un problème
Spring ne gère pas les vrais problèmes:
Cache distribué
Base de données
Sessions utilisateurs
6 - Monitorer
Spring
JMX
Standard
Simple à mettre en
place
Fonctionnalités
basiques
Exemple: Spring
JMX
<bean id="exporter"
class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=test" value-ref="testBean"/>
</map>
</property>
</bean>
Interro surprise
Cette configuration peut également être réalisée par
annotation, pourquoi privilégier le XML?
C’est une configuration d'infrastructure
Elle varie en fonction de l’environnement
Il suffit de copier/coller le fichier pour avoir du
monitoring
Hyperic
Historique des données,
agrégation de plusieurs
serveurs
Nombreuses technologies
reconnues, dont Spring
Open Source, financé par
VMWare
Monitoring de la
JVM
Pur monitoring, pas
de management
Niveau de détail très
fin
Monte en gamme et
attaque le
monitoring «métier»
Une offre commerciale intéressante: New Relic
Réveillez-vous,
c’est fini!
Des questions?
Vous pouvez les poser sur http://responcia.net
Par e-mail: julien@responcia.fr
Ou tout de suite, s’il reste du temps :-)
Un feedback?
Envoyez-le sur Twitter: @juliendubois
Crédits photos
La plupart des photos utilisées pour cette
présentation sont sous licence Creative
Commons
‣http://www.flickr.com/photos/sebpaquet/5221678/
‣http://www.flickr.com/photos/kooks2006/30477042/
‣http://www.flickr.com/photos/pedrosimoes7/118946291/
‣http://www.flickr.com/photos/liberato/149365463/
‣http://www.flickr.com/photos/livenature/177452444/
‣http://www.flickr.com/photos/liberato/185711145/
‣http://www.flickr.com/photos/gadl/312754502/
‣http://www.flickr.com/photos/mikebaird/343297515/
‣http://www.flickr.com/photos/mikebaird/343298668/
‣http://www.flickr.com/photos/mikebaird/343306006/
‣http://www.flickr.com/photos/mikebaird/393734903/
‣http://www.flickr.com/photos/revdancatt/449142212/
‣http://www.flickr.com/photos/noelzialee/481283924/
‣http://www.flickr.com/photos/mikebaird/1659436047/
‣http://www.flickr.com/photos/cipherswarm/2369136756/
‣http://www.flickr.com/photos/soldiersmediacenter/850896205/
‣
‣http://www.flickr.com/photos/yakobusan/2436481628/
‣http://www.flickr.com/photos/leomei/2651904068/
‣http://www.flickr.com/photos/henryleong/2684287324/
‣http://www.flickr.com/photos/srgblog/2831815666/
‣http://www.flickr.com/photos/bramus/2998573943/
‣http://www.flickr.com/photos/mogwai_83/3022261893/
‣http://www.flickr.com/photos/nnova/3060019732/
‣http://www.flickr.com/photos/mikebaird/3072645479/
‣http://www.flickr.com/photos/lrargerich/3366007510/
‣http://www.flickr.com/photos/nostri-imago/3413984703/
‣http://www.flickr.com/photos/kaibara/4068996309/
‣http://www.flickr.com/photos/8085704@N05/4343639127/
‣http://www.flickr.com/photos/jurvetson/4685661036/
‣http://www.flickr.com/photos/iancarroll/4743903048/

Weitere ähnliche Inhalte

Andere mochten auch

Présentation de Sceaux Smart (janvier 2015)
Présentation de Sceaux Smart (janvier 2015)Présentation de Sceaux Smart (janvier 2015)
Présentation de Sceaux Smart (janvier 2015)Jérôme Desboeufs
 
Contrataciones del estado dr.aponte
Contrataciones del estado dr.aponteContrataciones del estado dr.aponte
Contrataciones del estado dr.apontecefic
 
Presentation Locatis 2010
Presentation Locatis 2010Presentation Locatis 2010
Presentation Locatis 2010nane544
 
Modulo2
Modulo2Modulo2
Modulo2cefic
 
PréSentatique Helavio(PenséEs Intimidantes)
PréSentatique Helavio(PenséEs Intimidantes)PréSentatique Helavio(PenséEs Intimidantes)
PréSentatique Helavio(PenséEs Intimidantes)helavio
 
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...Économie sociale Estrie
 
Solución de controversias 2012
Solución de controversias  2012Solución de controversias  2012
Solución de controversias 2012cefic
 
Complaint Against Hawaii Public Housing Authority
Complaint Against Hawaii Public Housing AuthorityComplaint Against Hawaii Public Housing Authority
Complaint Against Hawaii Public Housing AuthorityHonolulu Civil Beat
 
Dra. marina
Dra. marinaDra. marina
Dra. marinacefic
 
Solución
 Solución Solución
Solucióncefic
 

Andere mochten auch (18)

Présentation de Sceaux Smart (janvier 2015)
Présentation de Sceaux Smart (janvier 2015)Présentation de Sceaux Smart (janvier 2015)
Présentation de Sceaux Smart (janvier 2015)
 
Contrataciones del estado dr.aponte
Contrataciones del estado dr.aponteContrataciones del estado dr.aponte
Contrataciones del estado dr.aponte
 
La rueda y el rodillo
La rueda y el rodilloLa rueda y el rodillo
La rueda y el rodillo
 
Presentation Locatis 2010
Presentation Locatis 2010Presentation Locatis 2010
Presentation Locatis 2010
 
Modulo2
Modulo2Modulo2
Modulo2
 
Coup de foudre
Coup de foudreCoup de foudre
Coup de foudre
 
PréSentatique Helavio(PenséEs Intimidantes)
PréSentatique Helavio(PenséEs Intimidantes)PréSentatique Helavio(PenséEs Intimidantes)
PréSentatique Helavio(PenséEs Intimidantes)
 
Métodos tradicionales
Métodos tradicionalesMétodos tradicionales
Métodos tradicionales
 
Elaragonito3
Elaragonito3Elaragonito3
Elaragonito3
 
Dia01 agt12
Dia01 agt12Dia01 agt12
Dia01 agt12
 
Metallerie
MetallerieMetallerie
Metallerie
 
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...
Forum citoyen memphrémagog: La présentation de la Coopérative de développemen...
 
Solución de controversias 2012
Solución de controversias  2012Solución de controversias  2012
Solución de controversias 2012
 
Torre résidence
Torre résidenceTorre résidence
Torre résidence
 
Complaint Against Hawaii Public Housing Authority
Complaint Against Hawaii Public Housing AuthorityComplaint Against Hawaii Public Housing Authority
Complaint Against Hawaii Public Housing Authority
 
Dra. marina
Dra. marinaDra. marina
Dra. marina
 
Les dommages environnementaux
Les dommages environnementauxLes dommages environnementaux
Les dommages environnementaux
 
Solución
 Solución Solución
Solución
 

Ähnlich wie Spring 3.0 en production

Spring 3 en production
Spring 3 en productionSpring 3 en production
Spring 3 en productionJulien Dubois
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
cours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfcours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfSliimAmiri
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Lbv Dev Meetup #2
 Lbv Dev Meetup #2 Lbv Dev Meetup #2
Lbv Dev Meetup #2LbvDev
 
Introduction à Spring.pdf
Introduction à Spring.pdfIntroduction à Spring.pdf
Introduction à Spring.pdfbadrfathallah2
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm
 
Java EE (Spring).pptx
Java EE (Spring).pptxJava EE (Spring).pptx
Java EE (Spring).pptxadiouf2
 
Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Société ELOSI
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
Hibernate vs le Cloud computing
Hibernate vs le Cloud computingHibernate vs le Cloud computing
Hibernate vs le Cloud computingJulien Dubois
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computingNormandy JUG
 

Ähnlich wie Spring 3.0 en production (20)

Spring 3 en production
Spring 3 en productionSpring 3 en production
Spring 3 en production
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Javavs net
Javavs netJavavs net
Javavs net
 
cours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfcours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdf
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Lbv Dev Meetup #2
 Lbv Dev Meetup #2 Lbv Dev Meetup #2
Lbv Dev Meetup #2
 
Introduction à Spring.pdf
Introduction à Spring.pdfIntroduction à Spring.pdf
Introduction à Spring.pdf
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
JavaCours1.ppt
JavaCours1.pptJavaCours1.ppt
JavaCours1.ppt
 
Java EE (Spring).pptx
Java EE (Spring).pptxJava EE (Spring).pptx
Java EE (Spring).pptx
 
Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !
 
Jpa(1)
Jpa(1)Jpa(1)
Jpa(1)
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
Hibernate vs le Cloud computing
Hibernate vs le Cloud computingHibernate vs le Cloud computing
Hibernate vs le Cloud computing
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computing
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 

Spring 3.0 en production

  • 1. Spring 3 en production J U G S u m m e r C a m p 1 1 / 0 9 / 2 0 1 0
  • 2. Qui suis-je? Julien Dubois Spring par la pratique Ancien de SpringSource Responcia Twitter: @juliendubois
  • 3. Sommaire (1)Introduction rapide à Spring (2)Configurer Spring (3)Spring à l'exécution (4)Spring & Hibernate (5)Spring & le Cloud (6)Monitorer Spring
  • 4. 1 - Introduction rapide à Spring Si vous ne connaissez pas, c’est le moment de vous jeter à l’eau!
  • 5. Qu’est-ce que Spring? Framework IoC Open Source Meta-framework Projets Spring-*
  • 6. Les bases de Spring Un Bean Spring = Un objet Java «simple» Généralement un singleton, mais pas forcément Configuré et instancié au démarrage de l’application
  • 7. L’injection de dépendances «Ne nous appelez pas, nous vous rappellerons» - pattern d’Hollywood
  • 8. Exemple: injection par constructeur public class MonServiceImpl implements MonService { private AutreService autreService; public MonServiceImpl( AutreService autreService) { this.autreService = autreService; } }
  • 9. La programmation orientée aspect Les beans Spring sont «améliorés», «enrichis» lors de leur injection
  • 10. Exemple: transaction & sécurité avec l’aop public class MonServiceImpl implements MonService { @Transactional @Secured("ROLE_USER") public long methodeMetier(String value) { // ... } }
  • 12. Configuration de Spring Configuration XML Configuration par annotations Spring JavaConfig @Autowired private MonBean monBean;
  • 13. Fichiers XML Divisez pour mieux régner Utilisez les namespaces Stockez les fichiers dans META-INF/spring La configuration d’infrastructure varie suivant les environnements
  • 14. Gestion des propriétés Gagnez en souplesse: externalisez vos propriétés Proposez des valeurs par défaut, faciles à surcharger <context:property-placeholder location="classpath*:META-INF/spring/*.properties, classpath*:*.properties"/>
  • 15. Utilisez votre serveur d’applications Un serveur d’applications fournit de nombreux services (DataSources, JMS...) Plus performant, plus simple à exploiter que l’équivalent Spring <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDS"/>
  • 16. Les application contexts hiérarchiques On peut avoir une hiérarchie de contexts Spring Souvent utilisé sans le savoir (Spring MVC) Permet une séparation logique de l’architecture Contexte parent (métier) Contexte enfant (présentation)
  • 17. 3 - Spring à l'exécution
  • 19. Démarrez du bon pied Valider l’application au démarrage @Required et @Autowired - assurance d’une injection réussie
  • 20. Le lazy-loading Lazy-loading sur les beans «lents à démarrer» FBI: Fausse Bonne Idée
  • 21. L’AOP Différentes manières de muscler ses objets Proxy JDK vs CGLIB AspectJ
  • 22. Après le démarrage Les beans Spring sont disponibles Et vont être attaqués par de nombreuses threads en parallèle Attention à être thread safe! Bean Spring
  • 23. Scopes des Beans Singleton, Session, Flow, Request, Prototype <aop:scoped-proxy> Attention au clustering
  • 24. Lancement de traitements asynchrones @Async TaskExecutor Permet de tenir la charge comme Twitter Astuce: avoir un pool d’une seule thread <task:executor id="executor" pool-size="1"/>
  • 26. 4 - Spring & Hibernate
  • 27. Spring & Hibernate Un secret peu ébruité par SpringSource et JBoss Une corrélation de 1 dans l’utilisation des deux projets
  • 28. Le chargement «paresseux» Lazy-loading ou outer join? Utilisez un cache de 2nd niveau Optimisez vos named queries
  • 29. Hibernate Validator Valide vos objets du domaine Mort au domaine anémique Supporté par Spring 3
  • 30. Hibernate Search La méthode intelligente pour embarquer un moteur de recherche Peut grandement alléger la charge de votre base de données Parfaitement intégré à Hibernate, transparent pour Spring
  • 31. 5 - Spring & le Cloud
  • 32. Plusieurs types de cloud IaaS (Infrastructure As A Service): Amazon Simple location de matériel à la demande PaaS (Platform As A Service): Google Cache distribué, base de données spécialisée
  • 33. Spring dans le nuage: la théorie Configuration identique: IoC et AOP doivent fonctionner de la même manière Permet une plus grande portabilité, en particulier pour le PaaS Historiquement, une force de Spring: portabilité entre les serveurs d’applications
  • 34. Spring dans le nuage: la pratique Lancer des Singletons dans une JVM pose rarement un problème Spring ne gère pas les vrais problèmes: Cache distribué Base de données Sessions utilisateurs
  • 36. JMX Standard Simple à mettre en place Fonctionnalités basiques
  • 37. Exemple: Spring JMX <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="bean:name=test" value-ref="testBean"/> </map> </property> </bean>
  • 38. Interro surprise Cette configuration peut également être réalisée par annotation, pourquoi privilégier le XML? C’est une configuration d'infrastructure Elle varie en fonction de l’environnement Il suffit de copier/coller le fichier pour avoir du monitoring
  • 39. Hyperic Historique des données, agrégation de plusieurs serveurs Nombreuses technologies reconnues, dont Spring Open Source, financé par VMWare
  • 40. Monitoring de la JVM Pur monitoring, pas de management Niveau de détail très fin Monte en gamme et attaque le monitoring «métier» Une offre commerciale intéressante: New Relic
  • 42. Des questions? Vous pouvez les poser sur http://responcia.net Par e-mail: julien@responcia.fr Ou tout de suite, s’il reste du temps :-) Un feedback? Envoyez-le sur Twitter: @juliendubois
  • 43. Crédits photos La plupart des photos utilisées pour cette présentation sont sous licence Creative Commons ‣http://www.flickr.com/photos/sebpaquet/5221678/ ‣http://www.flickr.com/photos/kooks2006/30477042/ ‣http://www.flickr.com/photos/pedrosimoes7/118946291/ ‣http://www.flickr.com/photos/liberato/149365463/ ‣http://www.flickr.com/photos/livenature/177452444/ ‣http://www.flickr.com/photos/liberato/185711145/ ‣http://www.flickr.com/photos/gadl/312754502/ ‣http://www.flickr.com/photos/mikebaird/343297515/ ‣http://www.flickr.com/photos/mikebaird/343298668/ ‣http://www.flickr.com/photos/mikebaird/343306006/ ‣http://www.flickr.com/photos/mikebaird/393734903/ ‣http://www.flickr.com/photos/revdancatt/449142212/ ‣http://www.flickr.com/photos/noelzialee/481283924/ ‣http://www.flickr.com/photos/mikebaird/1659436047/ ‣http://www.flickr.com/photos/cipherswarm/2369136756/ ‣http://www.flickr.com/photos/soldiersmediacenter/850896205/ ‣ ‣http://www.flickr.com/photos/yakobusan/2436481628/ ‣http://www.flickr.com/photos/leomei/2651904068/ ‣http://www.flickr.com/photos/henryleong/2684287324/ ‣http://www.flickr.com/photos/srgblog/2831815666/ ‣http://www.flickr.com/photos/bramus/2998573943/ ‣http://www.flickr.com/photos/mogwai_83/3022261893/ ‣http://www.flickr.com/photos/nnova/3060019732/ ‣http://www.flickr.com/photos/mikebaird/3072645479/ ‣http://www.flickr.com/photos/lrargerich/3366007510/ ‣http://www.flickr.com/photos/nostri-imago/3413984703/ ‣http://www.flickr.com/photos/kaibara/4068996309/ ‣http://www.flickr.com/photos/8085704@N05/4343639127/ ‣http://www.flickr.com/photos/jurvetson/4685661036/ ‣http://www.flickr.com/photos/iancarroll/4743903048/