SlideShare una empresa de Scribd logo
1 de 46
Plone Deployment:
Secrets & Tricks
Steve McMahon

Plone Symposium East, 2012
On  ly!
                        Tod  ay          ricks!
                                   ts orT
                          t Se cre
                  Wit hou

Plone Deployment:
Secrets & Tricks
Steve McMahon

Plone Symposium East, 2012
You: SysAdmin or Friend of SysAdmin
ix y
               SX , Un
           D, O
       , BS
Li nux

    You: SysAdmin or Friend of SysAdmin
ix y
               SX , Un
           D, O
       , BS
Li nux

    You: SysAdmin or Friend of SysAdmin


              Me: SysAdmin and person
               who talks to SysAdmins
Looking for something more
advanced?
Looking for something more
advanced?


      Clayton is next door!
Looking for something more
advanced?


      Clayton is next door!
       How I secretly rule the world with
          buildout and a pen knife.
How we look to PHP folks
How they look to us.
Real life, for both.
What we want.
Stand-Alone
Zope / Plone                         Internet




✤   This works, but …               Zope / Plone
                                   Port 80 or 8080

✤   Lacks:

    ✤   Versatility

    ✤   SSL
                                   ZODB / Blobs

    ✤   Plays poorly with others
+ Web Server                         Internet




✤   Modern Web Server as Reverse
                                    Web Server
    Proxy                            80 / 443


✤   Handles SSL

✤   Efficiently queues requests
                                   Zope / Plone
                                    Port 8080
✤   Handles URL rewrites

✤   Battle-hardened logging and
    request sanitizing
                                   ZODB / Blobs

✤   Plays well with others
+ Web Apps                                            Internet




                                                     Web Server
                                                      80 / 443



✤   URL Rewriting makes it easy to
    map in other best-of-breed
                                                                    Other
    apps.                             Zope / Plone
                                       Port 8080
                                                                  Web Apps
                                                                   Ports: ?


✤   Can share special authorization
    requirements.
                                      ZODB / Blobs
Optimizations
“Premature optimization is
 the root of all evil.”


                        Donald Knuth
“Measure, measure measure.
 Then act.”

                 E. Leddy
                 Budapest: Keynote Lecture in
                 Appreciation of Donald Knuth
Load Balancing
Load Balancing means always having a canon ready to fire.

L. DaVinci, Authenticity Disputed
+ZEO
                                      ZEO Client 1   ZEO Client 2   ZEO Client …
                                       Port 8081      Port 8082       Ports …



✤   Efficient with modern multi-
    core processors even on single
    machines.
                                                      ZEO Server
                                                       Port 8000
✤   Can scale to multiple machines.

✤   A good option even without
    load balancing: debugging and
    run scripts.                                     ZODB / Blobs



✤   Pack database by command
    line utility.
+Load                              Internet
                                                           Web Server
                                                            80 / 443


 Balancing
                                                             Load
                                                           Balancer
                                                           Port 9000

✤   Distributes work among ZEO
    clients.
                                              ZEO Client   ZEO Client   ZEO Client
                                                  1            2           …
✤   Can help avoid service                    Port 8081    Port 8082     Ports …
    interruptions.

✤   Balancing scheme can matter.                             ZEO
                                                                           ZODB /
                                                            Server
                                                           Port 8000        Blobs
Proxy Caching
“Good caching makes light work.”

John Heywood, 1546, Often Misquoted.
+Server Cache
                                               Web Server
                                    Internet    80 / 443




                                                Proxy
                                                Cache
                                               Port 6000
✤   Reverse-Proxy Cache

✤   Typically between web server
    and load balancer.                           Load
                                               Balancer
                                               Port 9000
✤   Can be on a separate machine.

✤   Cache in memory or on disk.
                                                ZEO
                                               Cluster
“Caching is hard.”


                     D. Glick,
                     Cioppino 2012
plone.app.caching
“plone.app.caching is your frenemy.”

Winston Churchill, 1944, Authenticity Disputed.
Choosing Tools
Take care of your tools and they will take care of you.

Traditional
Web Server
            Internet    80 / 443




                        Proxy
                        Cache

Best of Breed          Port 6000




Approach
                         Load
                       Balancer
                       Port 9000




                        ZEO
                       Cluster
Internet
                       Web Server
                        80 / 443
                                    Nginx




                        Proxy
                        Cache

Best of Breed          Port 6000




Approach
                         Load
                       Balancer
                       Port 9000




                        ZEO
                       Cluster
Internet
                       Web Server
                        80 / 443
                                    Nginx




                        Proxy
                        Cache       Varnish
Best of Breed          Port 6000




Approach
                         Load
                       Balancer
                       Port 9000




                        ZEO
                       Cluster
Internet
                       Web Server
                        80 / 443
                                    Nginx




                        Proxy
                        Cache       Varnish
Best of Breed          Port 6000




Approach
                         Load
                       Balancer
                       Port 9000
                                    HAProxy




                        ZEO
                       Cluster
Web Server                                Internet
                                                     Web Server


Does it All
                                                      80 / 443




Entia non sunt multiplicanda praeter                  Proxy
                                                      Cache
necessitatem.                                        Port 6000

(Entities must not be multiplied beyond
necessity.)
        — William of Occam
            (14th Century SysAdmin)                    Load
                                                     Balancer
                                                     Port 9000
Keep is Simple, Stupid.
      — Occam’s Razor, translated to
         modern sysadmin speak
                                                      ZEO
                                                     Cluster
How To?
http://collective-docs.readthedocs.org/en/latest/hosting/

Is This The Right Place For This Resource? Good Question!
“Backup is serious shit.”


                            E. Leddy,
                            Cioppino 2012
backup, rsync, restore


                         Is there another way?
Logs
“Rotate your logs or your server will die.”

E. Steele, The Missing 18 Minutes
“sudo   apt-get install logrotate”



                        Traditional Proverb,
                        England, 12th Century
logrotate rules

# rotate logs for client #2
/var/db/plone4.1/zeocluster/var/client2/Z2.log
/var/db/plone4.1/zeocluster/var/client2/event.log {
    rotate 5
    weekly
    sharedscripts
    postrotate
       kill -USR2 `cat /var/db/…/client2.pid`
    endscript
}
Database Packing
Early ZODB Packing Tool

Leonardo Da Vinci, ~1500
Better ZODB Packing



 bin/zeopack -h localhost -p 8000 -d 0
Platform Setup & Plone Install
“These days, I use system packages
 as much as possible.
 You should, too.”


                             E. Leddy,
                             Cioppino 2012
Unified Installer:
Least-Used Feature


 --with-python=/usr/bin/python2.7
Unified Installer:
Least-Known Feature


     --clients=client-count
“Never run buildout as root.”


                        S. McMahon,
                        PSE, Today
Questions?
Image Credits
✤   cobol: CC by: http://www.flickr.com/photos/philmanker/3654636770/

✤   complex: CC by: http://www.flickr.com/photos/medea_material/1692344189/

✤   plant crusher: CC by NC ND: http://www.flickr.com/photos/duanemoore/4908036590/

✤   diagram: CC by NC SA: http://www.flickr.com/photos/nataliedowne/6446884983/

✤   blue: CC BY NC ND: http://www.flickr.com/photos/barthanlon/3670183050/

✤   light timer: CC by NC SA: http://www.flickr.com/photos/dorkstyle/3783421698/

✤   chain reaction: CC by NC ND: http://www.flickr.com/photos/acplinfo/2315988501/

✤   Giant Crossbow courtesy of http://www.leonardoda-vinci.org

✤   Centrifuge: CC by SA: http://www.flickr.com/photos/lrosa/515028911/

✤   Mystery: CC by NC ND: http://www.flickr.com/photos/zeptonn/2631113046/

✤   Decoder: CC by NC SA: http://www.flickr.com/photos/curiousexpeditions/962394310/

✤   Screw Gear: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4308521250/

✤   Worm Gear: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4307997887/

✤   Pulleys: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4305293959/

✤   Ball Bearings: CC by: http://www.flickr.com/photos/cristic/312874252/

✤   Multi-Barrel: CC by NC SA: http://www.flickr.com/photos/malcubed/2930190065/

✤   Cannons: CC by: http://www.flickr.com/photos/jeanlouis_zimmermann/5554481148/

✤   Fan: CC by: http://www.flickr.com/photos/jeanlouis_zimmermann/5554419770

✤   Perpetual Motion: CC by NC SA: http://www.flickr.com/photos/grocel/274933518/

Más contenido relacionado

La actualidad más candente

Ruby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringRuby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringIlya Grigorik
 
Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ilya Grigorik
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-ServicesIlya Grigorik
 
Websocket protocol overview
Websocket protocol overviewWebsocket protocol overview
Websocket protocol overviewallenmeng
 
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc  2015 HTTP 1, HTTP 2 and folksDevoxx Maroc  2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folksNicolas Martignole
 
Ruby 1.9 Fibers
Ruby 1.9 FibersRuby 1.9 Fibers
Ruby 1.9 FibersKevin Ball
 
Real-Time with Flowdock
Real-Time with FlowdockReal-Time with Flowdock
Real-Time with FlowdockFlowdock
 
0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web servicesIlya Grigorik
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyKyle Drake
 
EC2ナイトセミナプレゼン資料 Rel2
EC2ナイトセミナプレゼン資料 Rel2EC2ナイトセミナプレゼン資料 Rel2
EC2ナイトセミナプレゼン資料 Rel2真一 藤川
 
Introduction to WebSockets
Introduction to WebSocketsIntroduction to WebSockets
Introduction to WebSocketsGunnar Hillert
 
Nuts and Bolts of WebSocket Devoxx 2014
Nuts and Bolts of WebSocket Devoxx 2014Nuts and Bolts of WebSocket Devoxx 2014
Nuts and Bolts of WebSocket Devoxx 2014Arun Gupta
 
Event Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikEvent Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikIlya Grigorik
 
MNPHP Scalable Architecture 101 - Feb 3 2011
MNPHP Scalable Architecture 101 - Feb 3 2011MNPHP Scalable Architecture 101 - Feb 3 2011
MNPHP Scalable Architecture 101 - Feb 3 2011Mike Willbanks
 

La actualidad más candente (20)

Ruby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringRuby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and Monitoring
 
Web sockets in Java
Web sockets in JavaWeb sockets in Java
Web sockets in Java
 
Php push notifications
Php push notificationsPhp push notifications
Php push notifications
 
Capistrano
CapistranoCapistrano
Capistrano
 
Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09
 
Dancing with websocket
Dancing with websocketDancing with websocket
Dancing with websocket
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services
 
Websocket protocol overview
Websocket protocol overviewWebsocket protocol overview
Websocket protocol overview
 
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc  2015 HTTP 1, HTTP 2 and folksDevoxx Maroc  2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
 
Ruby 1.9 Fibers
Ruby 1.9 FibersRuby 1.9 Fibers
Ruby 1.9 Fibers
 
Real-Time with Flowdock
Real-Time with FlowdockReal-Time with Flowdock
Real-Time with Flowdock
 
0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
 
EC2ナイトセミナプレゼン資料 Rel2
EC2ナイトセミナプレゼン資料 Rel2EC2ナイトセミナプレゼン資料 Rel2
EC2ナイトセミナプレゼン資料 Rel2
 
Introduction to WebSockets
Introduction to WebSocketsIntroduction to WebSockets
Introduction to WebSockets
 
CouchDB Google
CouchDB GoogleCouchDB Google
CouchDB Google
 
Nuts and Bolts of WebSocket Devoxx 2014
Nuts and Bolts of WebSocket Devoxx 2014Nuts and Bolts of WebSocket Devoxx 2014
Nuts and Bolts of WebSocket Devoxx 2014
 
Intro to WebSockets
Intro to WebSocketsIntro to WebSockets
Intro to WebSockets
 
Event Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikEvent Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya Grigorik
 
MNPHP Scalable Architecture 101 - Feb 3 2011
MNPHP Scalable Architecture 101 - Feb 3 2011MNPHP Scalable Architecture 101 - Feb 3 2011
MNPHP Scalable Architecture 101 - Feb 3 2011
 

Destacado

The New Fundamentals of Marketing 20120606 slide_share7
The New Fundamentals of Marketing 20120606 slide_share7The New Fundamentals of Marketing 20120606 slide_share7
The New Fundamentals of Marketing 20120606 slide_share7Bruno Teboul
 
What Hurt The Most Cascada
What Hurt The Most CascadaWhat Hurt The Most Cascada
What Hurt The Most Cascadaabonydavis
 
LandTrust Presentation at the West Rowan Senior Club
LandTrust Presentation at the West Rowan Senior ClubLandTrust Presentation at the West Rowan Senior Club
LandTrust Presentation at the West Rowan Senior ClubLandTrustCNC
 
Arscientia DIY @Venice
Arscientia DIY @VeniceArscientia DIY @Venice
Arscientia DIY @VeniceMirco Piccin
 
Social media nell' (per l') informazione
Social media nell' (per l') informazioneSocial media nell' (per l') informazione
Social media nell' (per l') informazioneEmanuele Dal Carlo
 
LandTrust for Central NC - Two Rivers Seminar
LandTrust for Central NC - Two Rivers SeminarLandTrust for Central NC - Two Rivers Seminar
LandTrust for Central NC - Two Rivers SeminarLandTrustCNC
 
PloneFormGen: Past, Present, Future
PloneFormGen: Past, Present, FuturePloneFormGen: Past, Present, Future
PloneFormGen: Past, Present, FutureSteve McMahon
 
Spay.Neuter Road Map Conf
Spay.Neuter Road Map ConfSpay.Neuter Road Map Conf
Spay.Neuter Road Map Confjlandsman
 
CoderDojo - Scratch 4 Arduino
CoderDojo - Scratch 4 ArduinoCoderDojo - Scratch 4 Arduino
CoderDojo - Scratch 4 ArduinoMirco Piccin
 
Pet Overpopulation, Politics And Mandatory Sterilization Spay Usa
Pet Overpopulation, Politics And Mandatory Sterilization Spay UsaPet Overpopulation, Politics And Mandatory Sterilization Spay Usa
Pet Overpopulation, Politics And Mandatory Sterilization Spay Usajlandsman
 
Rufty Senior Center The Importance Of Land Conservation
Rufty Senior Center   The Importance Of Land ConservationRufty Senior Center   The Importance Of Land Conservation
Rufty Senior Center The Importance Of Land ConservationLandTrustCNC
 
Measuring Knowledge Commercialization/ Denzil Doyle
Measuring Knowledge Commercialization/ Denzil DoyleMeasuring Knowledge Commercialization/ Denzil Doyle
Measuring Knowledge Commercialization/ Denzil Doyleclaplante
 
"Innovation and Wealth Creation: the British Library Perspective”
"Innovation and Wealth Creation: the British Library Perspective”"Innovation and Wealth Creation: the British Library Perspective”
"Innovation and Wealth Creation: the British Library Perspective”bridgingworlds2008
 
Facebook Applications and Playful Mood: the Construction of Online Third Places
Facebook Applications and Playful Mood: the Construction of Online Third PlacesFacebook Applications and Playful Mood: the Construction of Online Third Places
Facebook Applications and Playful Mood: the Construction of Online Third PlacesValentina Rao
 
“The physical library in the 2.0 age and beyond - a UK perspective”
“The physical library in the 2.0 age and beyond - a UK perspective”“The physical library in the 2.0 age and beyond - a UK perspective”
“The physical library in the 2.0 age and beyond - a UK perspective”bridgingworlds2008
 
Vlammen voor de Vrijheid
Vlammen voor de Vrijheid Vlammen voor de Vrijheid
Vlammen voor de Vrijheid Ilya van Marle
 
Some ideas for the evaluation of cross media interaction
Some ideas for the evaluation of cross media interactionSome ideas for the evaluation of cross media interaction
Some ideas for the evaluation of cross media interactionValentina Rao
 
ACE 2013 University of Twente
ACE 2013 University of Twente ACE 2013 University of Twente
ACE 2013 University of Twente Valentina Rao
 
Пасторское душепопечительство
Пасторское душепопечительствоПасторское душепопечительство
Пасторское душепопечительствоguest4df78
 
Sencillos pasos para publicar en timetoast
Sencillos pasos para publicar en timetoastSencillos pasos para publicar en timetoast
Sencillos pasos para publicar en timetoastalecanessas
 

Destacado (20)

The New Fundamentals of Marketing 20120606 slide_share7
The New Fundamentals of Marketing 20120606 slide_share7The New Fundamentals of Marketing 20120606 slide_share7
The New Fundamentals of Marketing 20120606 slide_share7
 
What Hurt The Most Cascada
What Hurt The Most CascadaWhat Hurt The Most Cascada
What Hurt The Most Cascada
 
LandTrust Presentation at the West Rowan Senior Club
LandTrust Presentation at the West Rowan Senior ClubLandTrust Presentation at the West Rowan Senior Club
LandTrust Presentation at the West Rowan Senior Club
 
Arscientia DIY @Venice
Arscientia DIY @VeniceArscientia DIY @Venice
Arscientia DIY @Venice
 
Social media nell' (per l') informazione
Social media nell' (per l') informazioneSocial media nell' (per l') informazione
Social media nell' (per l') informazione
 
LandTrust for Central NC - Two Rivers Seminar
LandTrust for Central NC - Two Rivers SeminarLandTrust for Central NC - Two Rivers Seminar
LandTrust for Central NC - Two Rivers Seminar
 
PloneFormGen: Past, Present, Future
PloneFormGen: Past, Present, FuturePloneFormGen: Past, Present, Future
PloneFormGen: Past, Present, Future
 
Spay.Neuter Road Map Conf
Spay.Neuter Road Map ConfSpay.Neuter Road Map Conf
Spay.Neuter Road Map Conf
 
CoderDojo - Scratch 4 Arduino
CoderDojo - Scratch 4 ArduinoCoderDojo - Scratch 4 Arduino
CoderDojo - Scratch 4 Arduino
 
Pet Overpopulation, Politics And Mandatory Sterilization Spay Usa
Pet Overpopulation, Politics And Mandatory Sterilization Spay UsaPet Overpopulation, Politics And Mandatory Sterilization Spay Usa
Pet Overpopulation, Politics And Mandatory Sterilization Spay Usa
 
Rufty Senior Center The Importance Of Land Conservation
Rufty Senior Center   The Importance Of Land ConservationRufty Senior Center   The Importance Of Land Conservation
Rufty Senior Center The Importance Of Land Conservation
 
Measuring Knowledge Commercialization/ Denzil Doyle
Measuring Knowledge Commercialization/ Denzil DoyleMeasuring Knowledge Commercialization/ Denzil Doyle
Measuring Knowledge Commercialization/ Denzil Doyle
 
"Innovation and Wealth Creation: the British Library Perspective”
"Innovation and Wealth Creation: the British Library Perspective”"Innovation and Wealth Creation: the British Library Perspective”
"Innovation and Wealth Creation: the British Library Perspective”
 
Facebook Applications and Playful Mood: the Construction of Online Third Places
Facebook Applications and Playful Mood: the Construction of Online Third PlacesFacebook Applications and Playful Mood: the Construction of Online Third Places
Facebook Applications and Playful Mood: the Construction of Online Third Places
 
“The physical library in the 2.0 age and beyond - a UK perspective”
“The physical library in the 2.0 age and beyond - a UK perspective”“The physical library in the 2.0 age and beyond - a UK perspective”
“The physical library in the 2.0 age and beyond - a UK perspective”
 
Vlammen voor de Vrijheid
Vlammen voor de Vrijheid Vlammen voor de Vrijheid
Vlammen voor de Vrijheid
 
Some ideas for the evaluation of cross media interaction
Some ideas for the evaluation of cross media interactionSome ideas for the evaluation of cross media interaction
Some ideas for the evaluation of cross media interaction
 
ACE 2013 University of Twente
ACE 2013 University of Twente ACE 2013 University of Twente
ACE 2013 University of Twente
 
Пасторское душепопечительство
Пасторское душепопечительствоПасторское душепопечительство
Пасторское душепопечительство
 
Sencillos pasos para publicar en timetoast
Sencillos pasos para publicar en timetoastSencillos pasos para publicar en timetoast
Sencillos pasos para publicar en timetoast
 

Similar a Plone Deployment Secrets & Tricks

Software Defined Data Centers - June 2012
Software Defined Data Centers - June 2012Software Defined Data Centers - June 2012
Software Defined Data Centers - June 2012Brent Salisbury
 
Alcançando alta performance com EventMachine
Alcançando alta performance com EventMachineAlcançando alta performance com EventMachine
Alcançando alta performance com EventMachinevinibaggio
 
Ari Zilka Cluster Architecture Patterns
Ari Zilka Cluster Architecture PatternsAri Zilka Cluster Architecture Patterns
Ari Zilka Cluster Architecture Patternsdeimos
 
Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Toni de la Fuente
 
Notes on a High-Performance JSON Protocol
Notes on a High-Performance JSON ProtocolNotes on a High-Performance JSON Protocol
Notes on a High-Performance JSON ProtocolDaniel Austin
 
Scalable Architecture 101
Scalable Architecture 101Scalable Architecture 101
Scalable Architecture 101ConFoo
 
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012Arun Gupta
 
OpenStack and OpenFlow Demos
OpenStack and OpenFlow DemosOpenStack and OpenFlow Demos
OpenStack and OpenFlow DemosBrent Salisbury
 
Cloud Best Practices
Cloud Best PracticesCloud Best Practices
Cloud Best PracticesEric Bottard
 
Thousands of Threads and Blocking I/O
Thousands of Threads and Blocking I/OThousands of Threads and Blocking I/O
Thousands of Threads and Blocking I/OGeorge Cao
 
Cross Training For Your Plone Deployment
Cross Training For Your Plone DeploymentCross Training For Your Plone Deployment
Cross Training For Your Plone Deploymentliterrbike
 
Scaling a Rails Application from the Bottom Up
Scaling a Rails Application from the Bottom Up Scaling a Rails Application from the Bottom Up
Scaling a Rails Application from the Bottom Up Abhishek Singh
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS drupalcampest
 

Similar a Plone Deployment Secrets & Tricks (20)

WebSocket protocol
WebSocket protocolWebSocket protocol
WebSocket protocol
 
Software Defined Data Centers - June 2012
Software Defined Data Centers - June 2012Software Defined Data Centers - June 2012
Software Defined Data Centers - June 2012
 
Varnish Cache
Varnish CacheVarnish Cache
Varnish Cache
 
IEEE latincom2012
IEEE latincom2012IEEE latincom2012
IEEE latincom2012
 
Alcançando alta performance com EventMachine
Alcançando alta performance com EventMachineAlcançando alta performance com EventMachine
Alcançando alta performance com EventMachine
 
Ari Zilka Cluster Architecture Patterns
Ari Zilka Cluster Architecture PatternsAri Zilka Cluster Architecture Patterns
Ari Zilka Cluster Architecture Patterns
 
Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012
 
Notes on a High-Performance JSON Protocol
Notes on a High-Performance JSON ProtocolNotes on a High-Performance JSON Protocol
Notes on a High-Performance JSON Protocol
 
Usenix lisa 2011
Usenix lisa 2011Usenix lisa 2011
Usenix lisa 2011
 
Scalable Architecture 101
Scalable Architecture 101Scalable Architecture 101
Scalable Architecture 101
 
Apache con 2011 gd
Apache con 2011 gdApache con 2011 gd
Apache con 2011 gd
 
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
Building HTML5 WebSocket Apps in Java at JavaOne Latin America 2012
 
OpenStack and OpenFlow Demos
OpenStack and OpenFlow DemosOpenStack and OpenFlow Demos
OpenStack and OpenFlow Demos
 
Cloud Best Practices
Cloud Best PracticesCloud Best Practices
Cloud Best Practices
 
Thousands of Threads and Blocking I/O
Thousands of Threads and Blocking I/OThousands of Threads and Blocking I/O
Thousands of Threads and Blocking I/O
 
RunningFreeBSDonLinuxKVM
RunningFreeBSDonLinuxKVMRunningFreeBSDonLinuxKVM
RunningFreeBSDonLinuxKVM
 
Websocket 1.0
Websocket 1.0Websocket 1.0
Websocket 1.0
 
Cross Training For Your Plone Deployment
Cross Training For Your Plone DeploymentCross Training For Your Plone Deployment
Cross Training For Your Plone Deployment
 
Scaling a Rails Application from the Bottom Up
Scaling a Rails Application from the Bottom Up Scaling a Rails Application from the Bottom Up
Scaling a Rails Application from the Bottom Up
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
 

Más de Steve McMahon

From the Client Side: JavaScript in Plone
From the Client Side: JavaScript in PloneFrom the Client Side: JavaScript in Plone
From the Client Side: JavaScript in PloneSteve McMahon
 
Plone Foundation Annual Meeting, Budapest 2009
Plone Foundation Annual Meeting, Budapest 2009Plone Foundation Annual Meeting, Budapest 2009
Plone Foundation Annual Meeting, Budapest 2009Steve McMahon
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MySteve McMahon
 
Plone 3 2: What's New
Plone 3 2: What's NewPlone 3 2: What's New
Plone 3 2: What's NewSteve McMahon
 

Más de Steve McMahon (7)

How diazo works
How diazo worksHow diazo works
How diazo works
 
Javascript in Plone
Javascript in PloneJavascript in Plone
Javascript in Plone
 
From the Client Side: JavaScript in Plone
From the Client Side: JavaScript in PloneFrom the Client Side: JavaScript in Plone
From the Client Side: JavaScript in Plone
 
How Plone Happens
How Plone HappensHow Plone Happens
How Plone Happens
 
Plone Foundation Annual Meeting, Budapest 2009
Plone Foundation Annual Meeting, Budapest 2009Plone Foundation Annual Meeting, Budapest 2009
Plone Foundation Annual Meeting, Budapest 2009
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh My
 
Plone 3 2: What's New
Plone 3 2: What's NewPlone 3 2: What's New
Plone 3 2: What's New
 

Último

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 

Último (20)

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 

Plone Deployment Secrets & Tricks

  • 1. Plone Deployment: Secrets & Tricks Steve McMahon Plone Symposium East, 2012
  • 2. On ly! Tod ay ricks! ts orT t Se cre Wit hou Plone Deployment: Secrets & Tricks Steve McMahon Plone Symposium East, 2012
  • 3. You: SysAdmin or Friend of SysAdmin
  • 4. ix y SX , Un D, O , BS Li nux You: SysAdmin or Friend of SysAdmin
  • 5. ix y SX , Un D, O , BS Li nux You: SysAdmin or Friend of SysAdmin Me: SysAdmin and person who talks to SysAdmins
  • 6. Looking for something more advanced?
  • 7. Looking for something more advanced? Clayton is next door!
  • 8. Looking for something more advanced? Clayton is next door! How I secretly rule the world with buildout and a pen knife.
  • 9. How we look to PHP folks
  • 10. How they look to us.
  • 11. Real life, for both.
  • 13. Stand-Alone Zope / Plone Internet ✤ This works, but … Zope / Plone Port 80 or 8080 ✤ Lacks: ✤ Versatility ✤ SSL ZODB / Blobs ✤ Plays poorly with others
  • 14. + Web Server Internet ✤ Modern Web Server as Reverse Web Server Proxy 80 / 443 ✤ Handles SSL ✤ Efficiently queues requests Zope / Plone Port 8080 ✤ Handles URL rewrites ✤ Battle-hardened logging and request sanitizing ZODB / Blobs ✤ Plays well with others
  • 15. + Web Apps Internet Web Server 80 / 443 ✤ URL Rewriting makes it easy to map in other best-of-breed Other apps. Zope / Plone Port 8080 Web Apps Ports: ? ✤ Can share special authorization requirements. ZODB / Blobs
  • 17. “Premature optimization is the root of all evil.” Donald Knuth
  • 18. “Measure, measure measure. Then act.” E. Leddy Budapest: Keynote Lecture in Appreciation of Donald Knuth
  • 19. Load Balancing Load Balancing means always having a canon ready to fire. L. DaVinci, Authenticity Disputed
  • 20. +ZEO ZEO Client 1 ZEO Client 2 ZEO Client … Port 8081 Port 8082 Ports … ✤ Efficient with modern multi- core processors even on single machines. ZEO Server Port 8000 ✤ Can scale to multiple machines. ✤ A good option even without load balancing: debugging and run scripts. ZODB / Blobs ✤ Pack database by command line utility.
  • 21. +Load Internet Web Server 80 / 443 Balancing Load Balancer Port 9000 ✤ Distributes work among ZEO clients. ZEO Client ZEO Client ZEO Client 1 2 … ✤ Can help avoid service Port 8081 Port 8082 Ports … interruptions. ✤ Balancing scheme can matter. ZEO ZODB / Server Port 8000 Blobs
  • 22. Proxy Caching “Good caching makes light work.” John Heywood, 1546, Often Misquoted.
  • 23. +Server Cache Web Server Internet 80 / 443 Proxy Cache Port 6000 ✤ Reverse-Proxy Cache ✤ Typically between web server and load balancer. Load Balancer Port 9000 ✤ Can be on a separate machine. ✤ Cache in memory or on disk. ZEO Cluster
  • 24. “Caching is hard.” D. Glick, Cioppino 2012
  • 25. plone.app.caching “plone.app.caching is your frenemy.” Winston Churchill, 1944, Authenticity Disputed.
  • 26. Choosing Tools Take care of your tools and they will take care of you. Traditional
  • 27. Web Server Internet 80 / 443 Proxy Cache Best of Breed Port 6000 Approach Load Balancer Port 9000 ZEO Cluster
  • 28. Internet Web Server 80 / 443 Nginx Proxy Cache Best of Breed Port 6000 Approach Load Balancer Port 9000 ZEO Cluster
  • 29. Internet Web Server 80 / 443 Nginx Proxy Cache Varnish Best of Breed Port 6000 Approach Load Balancer Port 9000 ZEO Cluster
  • 30. Internet Web Server 80 / 443 Nginx Proxy Cache Varnish Best of Breed Port 6000 Approach Load Balancer Port 9000 HAProxy ZEO Cluster
  • 31. Web Server Internet Web Server Does it All 80 / 443 Entia non sunt multiplicanda praeter Proxy Cache necessitatem. Port 6000 (Entities must not be multiplied beyond necessity.) — William of Occam (14th Century SysAdmin) Load Balancer Port 9000 Keep is Simple, Stupid. — Occam’s Razor, translated to modern sysadmin speak ZEO Cluster
  • 32. How To? http://collective-docs.readthedocs.org/en/latest/hosting/ Is This The Right Place For This Resource? Good Question!
  • 33. “Backup is serious shit.” E. Leddy, Cioppino 2012
  • 34. backup, rsync, restore Is there another way?
  • 35. Logs “Rotate your logs or your server will die.” E. Steele, The Missing 18 Minutes
  • 36. “sudo apt-get install logrotate” Traditional Proverb, England, 12th Century
  • 37. logrotate rules # rotate logs for client #2 /var/db/plone4.1/zeocluster/var/client2/Z2.log /var/db/plone4.1/zeocluster/var/client2/event.log { rotate 5 weekly sharedscripts postrotate kill -USR2 `cat /var/db/…/client2.pid` endscript }
  • 38. Database Packing Early ZODB Packing Tool Leonardo Da Vinci, ~1500
  • 39. Better ZODB Packing bin/zeopack -h localhost -p 8000 -d 0
  • 40. Platform Setup & Plone Install
  • 41. “These days, I use system packages as much as possible. You should, too.” E. Leddy, Cioppino 2012
  • 42. Unified Installer: Least-Used Feature --with-python=/usr/bin/python2.7
  • 43. Unified Installer: Least-Known Feature --clients=client-count
  • 44. “Never run buildout as root.” S. McMahon, PSE, Today
  • 46. Image Credits ✤ cobol: CC by: http://www.flickr.com/photos/philmanker/3654636770/ ✤ complex: CC by: http://www.flickr.com/photos/medea_material/1692344189/ ✤ plant crusher: CC by NC ND: http://www.flickr.com/photos/duanemoore/4908036590/ ✤ diagram: CC by NC SA: http://www.flickr.com/photos/nataliedowne/6446884983/ ✤ blue: CC BY NC ND: http://www.flickr.com/photos/barthanlon/3670183050/ ✤ light timer: CC by NC SA: http://www.flickr.com/photos/dorkstyle/3783421698/ ✤ chain reaction: CC by NC ND: http://www.flickr.com/photos/acplinfo/2315988501/ ✤ Giant Crossbow courtesy of http://www.leonardoda-vinci.org ✤ Centrifuge: CC by SA: http://www.flickr.com/photos/lrosa/515028911/ ✤ Mystery: CC by NC ND: http://www.flickr.com/photos/zeptonn/2631113046/ ✤ Decoder: CC by NC SA: http://www.flickr.com/photos/curiousexpeditions/962394310/ ✤ Screw Gear: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4308521250/ ✤ Worm Gear: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4307997887/ ✤ Pulleys: CC by NC: http://www.flickr.com/photos/travelinlibrarian/4305293959/ ✤ Ball Bearings: CC by: http://www.flickr.com/photos/cristic/312874252/ ✤ Multi-Barrel: CC by NC SA: http://www.flickr.com/photos/malcubed/2930190065/ ✤ Cannons: CC by: http://www.flickr.com/photos/jeanlouis_zimmermann/5554481148/ ✤ Fan: CC by: http://www.flickr.com/photos/jeanlouis_zimmermann/5554419770 ✤ Perpetual Motion: CC by NC SA: http://www.flickr.com/photos/grocel/274933518/

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n