SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
Tuesday, 12 July 2011
Tuesday, 12 July 2011
stripped down catalyst
                        stripped the M out of the VC




Tuesday, 12 July 2011
pure NoSQL
                        no relational DB left in the entire stack




Tuesday, 12 July 2011
iwmn in 5

                    • as lightweight as one gets a catalyst app
                    • custom authentication architecture
                    • Redis based session handling
                    • RabbitMQ driven backend
                    • multi language/domain/currency/anything

Tuesday, 12 July 2011
in a bit more detail



Tuesday, 12 July 2011
lightweight

                    • stripped out the model handling entirely
                    • stripped out the authentication handling
                    • many custom plugins (core and contrib)


Tuesday, 12 July 2011
authentication
                              architecture
                    • multi platform handling (including different
                        session cookie domains)
                    • CouchDB based storage
                    • OAuth
                    • API login (release pending)

Tuesday, 12 July 2011
session handling

                    • started with Postgres and the standard
                        session handler
                    • moved to CouchDB for multi domain
                        handling
                    • moved to Redis for speed

Tuesday, 12 July 2011
backend

                    • all business logic in the backend
                    • clusters of perl/erlang daemons
                    • reading off RabbitMQ
                    • answers cached in Redis

Tuesday, 12 July 2011
multi anything

                    • multi domain support
                    • different platforms in one daemon
                    • i18n + multi currency
                    • separate template trees

Tuesday, 12 July 2011
static content



Tuesday, 12 July 2011
Tuesday, 12 July 2011
content
                    • pages in CouchDB
                    • pages rendered with information out of
                        CouchDB
                    • page skeletons entirely i18n
                    • template branches in git repository per
                        platform/language


Tuesday, 12 July 2011
backend
                           request handling
                    • Catalyst pushes request to RabbitMQ
                    • backend daemons read off queue
                    • push response to Redis
                    • Catalyst reads off Redis (direct or through
                        Ajax)



Tuesday, 12 July 2011
Tuesday, 12 July 2011
backend in detail

                    • Dæmonise daemons
                     • plugin based daemon framework
                     • dungenkeeper maintaining population
                     • git://github.com/ideegeo/Daemonise.git

Tuesday, 12 July 2011
workflow engine

                    • CouchDB based workflows
                    • RabbitMQ based processing
                    • perl based daemons
                    • talked about it before: http://lnz.me/cVcW

Tuesday, 12 July 2011
evolution
                    • out of the box Catalyst app (mid 2008)
                     • home grown message queue for backend
                    • split out template tree
                    • moved more content to CouchDB
                    • moved to RabbitMQ in the backend
                    • moved to CouchDB for sessions
Tuesday, 12 July 2011
evolution 2
                    • moved more functionality from controller
                        to plugins
                    • moved to custom Engine
                    • phased out Model
                    • moved to Redis for session handling
                    • moved to Redis for RabbitMQ response
                        handling


Tuesday, 12 July 2011
lessons learned

                    • Redis rocks (not only for session handling)
                    • CouchDB rocks
                    • RabbitMQ scales like hell and rocks too
                    • Catalyst rocks with lots of memory too
                    • choose your weapons wisely

Tuesday, 12 July 2011
Catalyst lessons
                    • write plugins, lots of them
                    • do it the Catalyst way or you die
                    • message driven development is hard with
                        Catalyst
                    • watch your memory and your leaks
                    • use a fast session storage engine
Tuesday, 12 July 2011
coding lessons learned
                    • bump out the first version as quick as
                        possible
                    • rewrite it with the user feedback over time
                    • dense code helps avoiding bugs
                    • get to the point quickly, don’t spend ages
                        on nice code


Tuesday, 12 July 2011
questions?



Tuesday, 12 July 2011
springtimesoft.com/lenz



Tuesday, 12 July 2011
credits
                    •   http://www.flickr.com/photos/amagill/        •   http://www.flickr.com/photos/scania/


                    •   http://www.flickr.com/photos/n0rthw1nd/      •   http://www.flickr.com/photos/brewbooks/


                    •   http://www.flickr.com/photos/kemped/         •   http://www.flickr.com/photos/dunechaser


                    •   http://www.flickr.com/photos/vistavision/    •   http://www.flickr.com/photos/neenahhistory


                    •   http://www.flickr.com/photos/brenda-starr/   •   http://www.flickr.com/photos/mlrs193/


                    •   http://www.flickr.com/photos/                •   http://www.flickr.com/photos/axis/
                        abbeychristine/

                                                                    •   http://www.flickr.com/photos/thevlue/
                    •   http://www.flickr.com/photos/beigephotos/




Tuesday, 12 July 2011

Más contenido relacionado

La actualidad más candente

Camel oneactivemq posta-final
Camel oneactivemq posta-finalCamel oneactivemq posta-final
Camel oneactivemq posta-final
Christian Posta
 
ActiveMQ Performance Tuning
ActiveMQ Performance TuningActiveMQ Performance Tuning
ActiveMQ Performance Tuning
Christian Posta
 
Hpts 2011 flexible_oltp
Hpts 2011 flexible_oltpHpts 2011 flexible_oltp
Hpts 2011 flexible_oltp
Jags Ramnarayan
 
Ichii mysql-osc2011tokyofall
Ichii mysql-osc2011tokyofallIchii mysql-osc2011tokyofall
Ichii mysql-osc2011tokyofall
Takashi Ichii
 

La actualidad más candente (20)

Essential Camel Components
Essential Camel ComponentsEssential Camel Components
Essential Camel Components
 
Camel oneactivemq posta-final
Camel oneactivemq posta-finalCamel oneactivemq posta-final
Camel oneactivemq posta-final
 
SSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJSSSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJS
 
Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014
Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014
Lessons Learned from Real-World Deployments of Java EE 7 at JavaOne 2014
 
Eureka moment
Eureka momentEureka moment
Eureka moment
 
Java EE | Apache TomEE - Java EE Web Profile on Tomcat | Jonathan Gallimore
Java EE | Apache TomEE - Java EE Web Profile on Tomcat | Jonathan GallimoreJava EE | Apache TomEE - Java EE Web Profile on Tomcat | Jonathan Gallimore
Java EE | Apache TomEE - Java EE Web Profile on Tomcat | Jonathan Gallimore
 
MySQL Failover and Orchestrator
MySQL Failover and OrchestratorMySQL Failover and Orchestrator
MySQL Failover and Orchestrator
 
Web micro-framework BATTLE!
Web micro-framework BATTLE!Web micro-framework BATTLE!
Web micro-framework BATTLE!
 
ActiveMQ Performance Tuning
ActiveMQ Performance TuningActiveMQ Performance Tuning
ActiveMQ Performance Tuning
 
Maven
Maven Maven
Maven
 
CFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful CodeCFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful Code
 
Real-world #microservices with Apache Camel, Fabric8, and OpenShift
Real-world #microservices with Apache Camel, Fabric8, and OpenShiftReal-world #microservices with Apache Camel, Fabric8, and OpenShift
Real-world #microservices with Apache Camel, Fabric8, and OpenShift
 
Hpts 2011 flexible_oltp
Hpts 2011 flexible_oltpHpts 2011 flexible_oltp
Hpts 2011 flexible_oltp
 
High performance web sites with multilevel caching
High performance web sites with multilevel cachingHigh performance web sites with multilevel caching
High performance web sites with multilevel caching
 
Microservices with Apache Camel, Docker and Fabric8 v2
Microservices with Apache Camel, Docker and Fabric8 v2Microservices with Apache Camel, Docker and Fabric8 v2
Microservices with Apache Camel, Docker and Fabric8 v2
 
Stackato v2
Stackato v2Stackato v2
Stackato v2
 
Ichii mysql-osc2011tokyofall
Ichii mysql-osc2011tokyofallIchii mysql-osc2011tokyofall
Ichii mysql-osc2011tokyofall
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic website
 
Always on in sql server 2017
Always on in sql server 2017Always on in sql server 2017
Always on in sql server 2017
 
Tiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startup
 

Destacado (6)

Mojolicious
MojoliciousMojolicious
Mojolicious
 
Linuxconf 2011 parallel languages talk
Linuxconf 2011 parallel languages talkLinuxconf 2011 parallel languages talk
Linuxconf 2011 parallel languages talk
 
Docker intro
Docker introDocker intro
Docker intro
 
Scaling web apps_with_message_queues
Scaling web apps_with_message_queuesScaling web apps_with_message_queues
Scaling web apps_with_message_queues
 
Cloud architectures
Cloud architecturesCloud architectures
Cloud architectures
 
No sql
No sqlNo sql
No sql
 

Similar a Iwmn architecture

A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
DATAVERSITY
 
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
Ivan Zoratti
 
Tulsa tech fest 2010 - web speed and scalability
Tulsa tech fest 2010  - web speed and scalabilityTulsa tech fest 2010  - web speed and scalability
Tulsa tech fest 2010 - web speed and scalability
Jason Ragsdale
 
SeaJUG May 2012 mybatis
SeaJUG May 2012 mybatisSeaJUG May 2012 mybatis
SeaJUG May 2012 mybatis
Will Iverson
 
Clouds against the Floods (RubyConfBR2011)
Clouds against the Floods (RubyConfBR2011) Clouds against the Floods (RubyConfBR2011)
Clouds against the Floods (RubyConfBR2011)
Leonardo Borges
 
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
kennethaliu
 

Similar a Iwmn architecture (20)

Java EE and Google App Engine
Java EE and Google App EngineJava EE and Google App Engine
Java EE and Google App Engine
 
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
A Case Study of NoSQL Adoption: What Drove Wordnik Non-Relational?
 
RubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipelineRubyConf China 2015 - Rails off assets pipeline
RubyConf China 2015 - Rails off assets pipeline
 
HTML5 and Sencha Touch
HTML5 and Sencha TouchHTML5 and Sencha Touch
HTML5 and Sencha Touch
 
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
Ora mysql bothGetting the best of both worlds with Oracle 11g and MySQL Enter...
 
Kubernetes Manchester - 6th December 2018
Kubernetes Manchester - 6th December 2018Kubernetes Manchester - 6th December 2018
Kubernetes Manchester - 6th December 2018
 
Tulsa tech fest 2010 - web speed and scalability
Tulsa tech fest 2010  - web speed and scalabilityTulsa tech fest 2010  - web speed and scalability
Tulsa tech fest 2010 - web speed and scalability
 
SeaJUG May 2012 mybatis
SeaJUG May 2012 mybatisSeaJUG May 2012 mybatis
SeaJUG May 2012 mybatis
 
Play
PlayPlay
Play
 
Apcug 2011 07-17-intro_to_drupal_jeff_schuler
Apcug 2011 07-17-intro_to_drupal_jeff_schulerApcug 2011 07-17-intro_to_drupal_jeff_schuler
Apcug 2011 07-17-intro_to_drupal_jeff_schuler
 
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
 
Conferences andcommunity
Conferences andcommunityConferences andcommunity
Conferences andcommunity
 
Clouds against the Floods (RubyConfBR2011)
Clouds against the Floods (RubyConfBR2011) Clouds against the Floods (RubyConfBR2011)
Clouds against the Floods (RubyConfBR2011)
 
Docker in the Enterprise
Docker in the EnterpriseDocker in the Enterprise
Docker in the Enterprise
 
Using Docker in production: Get started today!
Using Docker in production: Get started today!Using Docker in production: Get started today!
Using Docker in production: Get started today!
 
Devoxx 2017 "Continuous Delivery with Containers: The Good, the Bad, and the ...
Devoxx 2017 "Continuous Delivery with Containers: The Good, the Bad, and the ...Devoxx 2017 "Continuous Delivery with Containers: The Good, the Bad, and the ...
Devoxx 2017 "Continuous Delivery with Containers: The Good, the Bad, and the ...
 
eZ Publish nextgen
eZ Publish nextgeneZ Publish nextgen
eZ Publish nextgen
 
HTML5, are we there yet?
HTML5, are we there yet?HTML5, are we there yet?
HTML5, are we there yet?
 
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
Modularizing your Grails Application with Private Plugins - SpringOne 2GX 2012
 
Kuby, ActiveDeployment for Rails Apps
Kuby, ActiveDeployment for Rails AppsKuby, ActiveDeployment for Rails Apps
Kuby, ActiveDeployment for Rails Apps
 

Más de Lenz Gschwendtner (8)

Url ux
Url uxUrl ux
Url ux
 
realising ideas
realising ideasrealising ideas
realising ideas
 
The Eye
The EyeThe Eye
The Eye
 
MPI, Erlang and the web
MPI, Erlang and the webMPI, Erlang and the web
MPI, Erlang and the web
 
RabbitMQ + CouchDB = Awesome
RabbitMQ + CouchDB = AwesomeRabbitMQ + CouchDB = Awesome
RabbitMQ + CouchDB = Awesome
 
RabbitMQ for Perl mongers
RabbitMQ for Perl mongersRabbitMQ for Perl mongers
RabbitMQ for Perl mongers
 
RabbitMQ
RabbitMQRabbitMQ
RabbitMQ
 
Umleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB appUmleitung: a tiny mochiweb/CouchDB app
Umleitung: a tiny mochiweb/CouchDB app
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

Iwmn architecture

  • 3. stripped down catalyst stripped the M out of the VC Tuesday, 12 July 2011
  • 4. pure NoSQL no relational DB left in the entire stack Tuesday, 12 July 2011
  • 5. iwmn in 5 • as lightweight as one gets a catalyst app • custom authentication architecture • Redis based session handling • RabbitMQ driven backend • multi language/domain/currency/anything Tuesday, 12 July 2011
  • 6. in a bit more detail Tuesday, 12 July 2011
  • 7. lightweight • stripped out the model handling entirely • stripped out the authentication handling • many custom plugins (core and contrib) Tuesday, 12 July 2011
  • 8. authentication architecture • multi platform handling (including different session cookie domains) • CouchDB based storage • OAuth • API login (release pending) Tuesday, 12 July 2011
  • 9. session handling • started with Postgres and the standard session handler • moved to CouchDB for multi domain handling • moved to Redis for speed Tuesday, 12 July 2011
  • 10. backend • all business logic in the backend • clusters of perl/erlang daemons • reading off RabbitMQ • answers cached in Redis Tuesday, 12 July 2011
  • 11. multi anything • multi domain support • different platforms in one daemon • i18n + multi currency • separate template trees Tuesday, 12 July 2011
  • 14. content • pages in CouchDB • pages rendered with information out of CouchDB • page skeletons entirely i18n • template branches in git repository per platform/language Tuesday, 12 July 2011
  • 15. backend request handling • Catalyst pushes request to RabbitMQ • backend daemons read off queue • push response to Redis • Catalyst reads off Redis (direct or through Ajax) Tuesday, 12 July 2011
  • 17. backend in detail • Dæmonise daemons • plugin based daemon framework • dungenkeeper maintaining population • git://github.com/ideegeo/Daemonise.git Tuesday, 12 July 2011
  • 18. workflow engine • CouchDB based workflows • RabbitMQ based processing • perl based daemons • talked about it before: http://lnz.me/cVcW Tuesday, 12 July 2011
  • 19. evolution • out of the box Catalyst app (mid 2008) • home grown message queue for backend • split out template tree • moved more content to CouchDB • moved to RabbitMQ in the backend • moved to CouchDB for sessions Tuesday, 12 July 2011
  • 20. evolution 2 • moved more functionality from controller to plugins • moved to custom Engine • phased out Model • moved to Redis for session handling • moved to Redis for RabbitMQ response handling Tuesday, 12 July 2011
  • 21. lessons learned • Redis rocks (not only for session handling) • CouchDB rocks • RabbitMQ scales like hell and rocks too • Catalyst rocks with lots of memory too • choose your weapons wisely Tuesday, 12 July 2011
  • 22. Catalyst lessons • write plugins, lots of them • do it the Catalyst way or you die • message driven development is hard with Catalyst • watch your memory and your leaks • use a fast session storage engine Tuesday, 12 July 2011
  • 23. coding lessons learned • bump out the first version as quick as possible • rewrite it with the user feedback over time • dense code helps avoiding bugs • get to the point quickly, don’t spend ages on nice code Tuesday, 12 July 2011
  • 26. credits • http://www.flickr.com/photos/amagill/ • http://www.flickr.com/photos/scania/ • http://www.flickr.com/photos/n0rthw1nd/ • http://www.flickr.com/photos/brewbooks/ • http://www.flickr.com/photos/kemped/ • http://www.flickr.com/photos/dunechaser • http://www.flickr.com/photos/vistavision/ • http://www.flickr.com/photos/neenahhistory • http://www.flickr.com/photos/brenda-starr/ • http://www.flickr.com/photos/mlrs193/ • http://www.flickr.com/photos/ • http://www.flickr.com/photos/axis/ abbeychristine/ • http://www.flickr.com/photos/thevlue/ • http://www.flickr.com/photos/beigephotos/ Tuesday, 12 July 2011