SlideShare a Scribd company logo
1 of 37
Download to read offline
The KILROY case – Umbraco DK Festival




                             Building KILROY




                    Umbraco DK Festival 2012 - Aarhus
                                        Friday 13th April

                                                            1
The KILROY case – Umbraco DK Festival


                                        Agenda


   About Us
   Brief Project Overview
   3 Themes
       1. Using Umbraco – Managing 10.000 destination pages
       2. Performance – A Leaky Abstraction & Lessons Learned
       3. The Toolbox – From Team Development to Deployment
   Final Questions


                                                                2
The KILROY case – Umbraco DK Festival


                                                        Please interrupt




     We don’t mind getting derailed



http://www.flickr.com/photos/gorillaradio/2474695970/                      3
The KILROY case – Umbraco DK Festival


                                        About Us

  Emil Rasmussen
  Project Manager
       @emilr



  Fabrice Loudet
  Senior .NET developer




                                                   4
The KILROY case – Umbraco DK Festival


                                 About Novicell

   Based in Aarhus
   38 employees
   Full service web development agency
   Proud Umbraco Gold Partner




                                                  5
The KILROY case – Umbraco DK Festival


                                   Project Brief

   New platform for KILROYs online marketing activities
   Migrate content and URLs
   Launched July 2011
   Peaked at a 5 man development team
   Still in active development - 1 week release schedule
   Umbraco 4.7.1.1 (patched)




                                                            6
The KILROY case – Umbraco DK Festival


                                By the Numbers

   7 languages (soon to be 8)
   21 sites
   30 content editors
   94 master pages (templates)
   100 razor macros
   830 dictionary items
   5000 images
   26000 pages
   33000 active nodes
   700.000 monthly visitors
   2.800.000 monthly page views
                                                 14
The KILROY case – Umbraco DK Festival




       Theme 1: Using Umbraco




                                        15
The KILROY case – Umbraco DK Festival


                       10,000 destination pages




  Problem: create and maintain 10.000 destination pages.

  Solution: common destination structure with automatic
  creation of sub pages. And onPublish event update of JSON
  data files.


                                                              16
The KILROY case – Umbraco DK Festival


                                        Discussion



   What do you do when you need to create a database
    of stuff (e.g. staff list, product videos, events, etc.)?




                                                                21
The KILROY case – Umbraco DK Festival




       Theme 2: Performance




                                        22
The KILROY case – Umbraco DK Festival


               The Umbraco Macro Cache - #h5is




      Your are in big trouble, when you entire performance
      strategy is the Umbraco Macro Cache…




                                                             23
http://tourismeautrement.files.wordpress.com/2010/04/slow.jpg
The Law of Leaky Abstractions



      "All non-trivial abstractions, to some degree, are leaky.
      Abstractions fail. Sometimes a little, sometimes a lot. There's
      leakage. Things go wrong. It happens all over the place when
      you have abstractions."
      Joel Spolsky, http://www.joelonsoftware.com/articles/LeakyAbstractions.html




http://lifeattheendoftheroad.files.wordpress.com/2009/07/270709-022.jpg
The KILROY case – Umbraco DK Festival


                      A Robust Caching Solution

  1.   Use the standard ASP.NET cache
        Problem: when we deploy or when the AppPool recycles, we loose the
         cache
  2.   Use Microsoft AppFabric.
        It provides a distributed, in-memory, application cache service in
         separate process than the webserver.
        Problem solved: we have a persistent cache – even when the web
         server restarts or the AppPool recycles


       We update the cache OnPublish events or after timeout.

                                                                              26
The KILROY case – Umbraco DK Festival




            4 Quick Tips for Good (Razor)
                                Performance


         …besides using custom caching :-)

                                              27
The KILROY case – Umbraco DK Festival


           Wisely use HasProperty and HasValue



 if (myDynamicNode.HasProperty("myCoolProperty") &&
       myDynamicNode.HasValue("myCoolProperty"))
 {
       int tmpInt;
       if (int.TryParse(myDynamicNode.GetProperty("myCoolProperty")
                                        .Value, out tmpInt))
               ....
 }




                                                                      28
The KILROY case – Umbraco DK Festival


          Use DynamicNode Extensions and Razor common helper

  public static class DocumentExtensions {
      public static bool IsValidProperty(this DynamicNode doc, string propertyAlias)
      {
          if (doc.HasProperty(propertyAlias) && doc.HasValue(propertyAlias))
                return true;
          return false;
      }
      public static string GetPropertyAsString(this DynamicNode doc, string propertyAlias)
      {
                if (!doc.IsValidProperty(propertyAlias))   return string.Empty;
                return doc.GetProperty(propertyAlias).Value;
      }
      public static int? GetPropertyAsInt(this DynamicNode doc, string propertyAlias)
          ...
  }


  Usage
  int? myIntProp = myDynamicNode.GetPropertyAsInt("mypropertyAlias");
                                                                                             29
The KILROY case – Umbraco DK Festival


                 Use Children if first level search

  Be aware of performance when using DynamicNode.Descendant(docType).
  Use "Children" if possible.
  For example to get a direct child node :

  Don’t use:
  DynamicNode dNode =
     rootNode.Descendants("myDocType").Items.FirstOrDefault();




  You can use instead :
  DynamicNode dNode = rootNode.GetChildrenAsList
            .Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType");



                                                                          30
The KILROY case – Umbraco DK Festival


            Dynamic notation considered harmfull?

  Be aware of performance using dynamic notation like node.DocTypeName =>
  same problem as last slide.
  To get a direct child node :

  Don’t use:
  dynamic rootNode = new DynamicNode(xxx);
  DynamicNodeList allMyDocType = rootNode.MyDocType; // can have performance issue
  // PS :   string myProp = rootNode.MyProp is OK is the prop exist


  You can use instead:
  DynamicNode dNode = rootNode.GetChildrenAsList
                          .Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType");




                                                                                   31
The KILROY case – Umbraco DK Festival


                                        Discussion



        What is your hard learned tips for blinding fast
                    Umbraco performance?




                                                           32
http://media.photobucket.com/image/toolbox/LilToe01/Shop/Toolbox017.jpg




What’s in Our Toolbox?
The KILROY case – Umbraco DK Festival



                              The Basics + a Tip
       Visual Studio 2010 (and Resharper)
       Kiln (Mercurial)
       Shared MS SQL Database




                                XmlCacheEnabled = false




                                                          34
The KILROY case – Umbraco DK Festival


                                   Deployment

   Deployment
        Web Deploy from Visual Studio
        XML Config transformations
   Updating Umbraco Doc Types and other settings
        Two approaches:
             Create an Umbraco Package containing every Doc Type, every
              template, every macro and so on
             Create an Umbraco Package containing new and updates Doc
              Types, templates etc.



                                                                           35
The KILROY case – Umbraco DK Festival


                                        Discussion


                              How do you deploy?


    Have you felt the pain of updating an highly utilized
                          DocType?




                                                            36
Any final Questions
                  or Comments?




http://www.europaszkola.pl/O%20szkole_html_4ff13fb7.jpg

More Related Content

Similar to Umbraco festival Building Killroy

Hooking up Semantic MediaWiki with external tools via SPARQL
Hooking up Semantic MediaWiki with external tools via SPARQLHooking up Semantic MediaWiki with external tools via SPARQL
Hooking up Semantic MediaWiki with external tools via SPARQL
Samuel Lampa
 
Machine Learning for Big Data Analytics: Scaling In with Containers while Sc...
Machine Learning for Big Data Analytics:  Scaling In with Containers while Sc...Machine Learning for Big Data Analytics:  Scaling In with Containers while Sc...
Machine Learning for Big Data Analytics: Scaling In with Containers while Sc...
Ian Lumb
 
Digital Fabrication Studio 0.3 Fabbing and FabLabs
Digital Fabrication Studio 0.3 Fabbing and FabLabsDigital Fabrication Studio 0.3 Fabbing and FabLabs
Digital Fabrication Studio 0.3 Fabbing and FabLabs
Massimo Menichinelli
 
A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...
inovex GmbH
 
Using RAG to create your own Podcast conversations.pdf
Using RAG to create your own Podcast conversations.pdfUsing RAG to create your own Podcast conversations.pdf
Using RAG to create your own Podcast conversations.pdf
Richard Rodger
 
Your java script library
Your java script libraryYour java script library
Your java script library
jasfog
 

Similar to Umbraco festival Building Killroy (20)

Docker up & running
Docker   up & runningDocker   up & running
Docker up & running
 
IDA - Eclipse Workshop II (In Danish)
IDA - Eclipse Workshop II (In Danish)IDA - Eclipse Workshop II (In Danish)
IDA - Eclipse Workshop II (In Danish)
 
Hooking up Semantic MediaWiki with external tools via SPARQL
Hooking up Semantic MediaWiki with external tools via SPARQLHooking up Semantic MediaWiki with external tools via SPARQL
Hooking up Semantic MediaWiki with external tools via SPARQL
 
notesnet.dk - Eclipse Modelling Tools
notesnet.dk - Eclipse Modelling Toolsnotesnet.dk - Eclipse Modelling Tools
notesnet.dk - Eclipse Modelling Tools
 
NetflixOSS and ZeroToDocker Talk
NetflixOSS and ZeroToDocker TalkNetflixOSS and ZeroToDocker Talk
NetflixOSS and ZeroToDocker Talk
 
Digital Fabrication Studio.06 _3D_PrintingScanning @ Aalto Media Factory
Digital Fabrication Studio.06 _3D_PrintingScanning @ Aalto Media FactoryDigital Fabrication Studio.06 _3D_PrintingScanning @ Aalto Media Factory
Digital Fabrication Studio.06 _3D_PrintingScanning @ Aalto Media Factory
 
Rapid Prototyping in PySpark Streaming: The Thermodynamics of Docker Containe...
Rapid Prototyping in PySpark Streaming: The Thermodynamics of Docker Containe...Rapid Prototyping in PySpark Streaming: The Thermodynamics of Docker Containe...
Rapid Prototyping in PySpark Streaming: The Thermodynamics of Docker Containe...
 
Machine Learning for Big Data Analytics: Scaling In with Containers while Sc...
Machine Learning for Big Data Analytics:  Scaling In with Containers while Sc...Machine Learning for Big Data Analytics:  Scaling In with Containers while Sc...
Machine Learning for Big Data Analytics: Scaling In with Containers while Sc...
 
Freebase: Wikipedia Mining 20080416
Freebase: Wikipedia Mining 20080416Freebase: Wikipedia Mining 20080416
Freebase: Wikipedia Mining 20080416
 
Digital Fabrication Studio 0.3 Fabbing and FabLabs
Digital Fabrication Studio 0.3 Fabbing and FabLabsDigital Fabrication Studio 0.3 Fabbing and FabLabs
Digital Fabrication Studio 0.3 Fabbing and FabLabs
 
A WebGL scene in 30 mins
A WebGL scene in 30 minsA WebGL scene in 30 mins
A WebGL scene in 30 mins
 
OpenCms All Dressed Up with skinnDriva
OpenCms All Dressed Up with skinnDrivaOpenCms All Dressed Up with skinnDriva
OpenCms All Dressed Up with skinnDriva
 
A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...
 
A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...A system architect guide - ten ways to ruin your cloud experience ...and how ...
A system architect guide - ten ways to ruin your cloud experience ...and how ...
 
Using RAG to create your own Podcast conversations.pdf
Using RAG to create your own Podcast conversations.pdfUsing RAG to create your own Podcast conversations.pdf
Using RAG to create your own Podcast conversations.pdf
 
2012.09.26.CUbRIK at CHORUS + (the progress)
2012.09.26.CUbRIK at CHORUS + (the progress)2012.09.26.CUbRIK at CHORUS + (the progress)
2012.09.26.CUbRIK at CHORUS + (the progress)
 
User Experience Sketching for Lean and Agile Teams
User Experience Sketching for Lean and Agile TeamsUser Experience Sketching for Lean and Agile Teams
User Experience Sketching for Lean and Agile Teams
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Your java script library
Your java script libraryYour java script library
Your java script library
 
CNCF Québec Meetup du 16 Novembre 2023
CNCF Québec Meetup du 16 Novembre 2023CNCF Québec Meetup du 16 Novembre 2023
CNCF Québec Meetup du 16 Novembre 2023
 

Recently uploaded

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Recently uploaded (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
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?
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
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
 
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
 
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
 
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
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 

Umbraco festival Building Killroy

  • 1. The KILROY case – Umbraco DK Festival Building KILROY Umbraco DK Festival 2012 - Aarhus Friday 13th April 1
  • 2. The KILROY case – Umbraco DK Festival Agenda  About Us  Brief Project Overview  3 Themes 1. Using Umbraco – Managing 10.000 destination pages 2. Performance – A Leaky Abstraction & Lessons Learned 3. The Toolbox – From Team Development to Deployment  Final Questions 2
  • 3. The KILROY case – Umbraco DK Festival Please interrupt We don’t mind getting derailed http://www.flickr.com/photos/gorillaradio/2474695970/ 3
  • 4. The KILROY case – Umbraco DK Festival About Us Emil Rasmussen Project Manager @emilr Fabrice Loudet Senior .NET developer 4
  • 5. The KILROY case – Umbraco DK Festival About Novicell  Based in Aarhus  38 employees  Full service web development agency  Proud Umbraco Gold Partner 5
  • 6. The KILROY case – Umbraco DK Festival Project Brief  New platform for KILROYs online marketing activities  Migrate content and URLs  Launched July 2011  Peaked at a 5 man development team  Still in active development - 1 week release schedule  Umbraco 4.7.1.1 (patched) 6
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14. The KILROY case – Umbraco DK Festival By the Numbers  7 languages (soon to be 8)  21 sites  30 content editors  94 master pages (templates)  100 razor macros  830 dictionary items  5000 images  26000 pages  33000 active nodes  700.000 monthly visitors  2.800.000 monthly page views 14
  • 15. The KILROY case – Umbraco DK Festival Theme 1: Using Umbraco 15
  • 16. The KILROY case – Umbraco DK Festival 10,000 destination pages Problem: create and maintain 10.000 destination pages. Solution: common destination structure with automatic creation of sub pages. And onPublish event update of JSON data files. 16
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. The KILROY case – Umbraco DK Festival Discussion What do you do when you need to create a database of stuff (e.g. staff list, product videos, events, etc.)? 21
  • 22. The KILROY case – Umbraco DK Festival Theme 2: Performance 22
  • 23. The KILROY case – Umbraco DK Festival The Umbraco Macro Cache - #h5is Your are in big trouble, when you entire performance strategy is the Umbraco Macro Cache… 23
  • 25. The Law of Leaky Abstractions "All non-trivial abstractions, to some degree, are leaky. Abstractions fail. Sometimes a little, sometimes a lot. There's leakage. Things go wrong. It happens all over the place when you have abstractions." Joel Spolsky, http://www.joelonsoftware.com/articles/LeakyAbstractions.html http://lifeattheendoftheroad.files.wordpress.com/2009/07/270709-022.jpg
  • 26. The KILROY case – Umbraco DK Festival A Robust Caching Solution 1. Use the standard ASP.NET cache  Problem: when we deploy or when the AppPool recycles, we loose the cache 2. Use Microsoft AppFabric.  It provides a distributed, in-memory, application cache service in separate process than the webserver.  Problem solved: we have a persistent cache – even when the web server restarts or the AppPool recycles We update the cache OnPublish events or after timeout. 26
  • 27. The KILROY case – Umbraco DK Festival 4 Quick Tips for Good (Razor) Performance …besides using custom caching :-) 27
  • 28. The KILROY case – Umbraco DK Festival Wisely use HasProperty and HasValue if (myDynamicNode.HasProperty("myCoolProperty") && myDynamicNode.HasValue("myCoolProperty")) { int tmpInt; if (int.TryParse(myDynamicNode.GetProperty("myCoolProperty") .Value, out tmpInt)) .... } 28
  • 29. The KILROY case – Umbraco DK Festival Use DynamicNode Extensions and Razor common helper public static class DocumentExtensions { public static bool IsValidProperty(this DynamicNode doc, string propertyAlias) { if (doc.HasProperty(propertyAlias) && doc.HasValue(propertyAlias)) return true; return false; } public static string GetPropertyAsString(this DynamicNode doc, string propertyAlias) { if (!doc.IsValidProperty(propertyAlias)) return string.Empty; return doc.GetProperty(propertyAlias).Value; } public static int? GetPropertyAsInt(this DynamicNode doc, string propertyAlias) ... } Usage int? myIntProp = myDynamicNode.GetPropertyAsInt("mypropertyAlias"); 29
  • 30. The KILROY case – Umbraco DK Festival Use Children if first level search Be aware of performance when using DynamicNode.Descendant(docType). Use "Children" if possible. For example to get a direct child node : Don’t use: DynamicNode dNode = rootNode.Descendants("myDocType").Items.FirstOrDefault(); You can use instead : DynamicNode dNode = rootNode.GetChildrenAsList .Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType"); 30
  • 31. The KILROY case – Umbraco DK Festival Dynamic notation considered harmfull? Be aware of performance using dynamic notation like node.DocTypeName => same problem as last slide. To get a direct child node : Don’t use: dynamic rootNode = new DynamicNode(xxx); DynamicNodeList allMyDocType = rootNode.MyDocType; // can have performance issue // PS : string myProp = rootNode.MyProp is OK is the prop exist You can use instead: DynamicNode dNode = rootNode.GetChildrenAsList .Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType"); 31
  • 32. The KILROY case – Umbraco DK Festival Discussion What is your hard learned tips for blinding fast Umbraco performance? 32
  • 34. The KILROY case – Umbraco DK Festival The Basics + a Tip  Visual Studio 2010 (and Resharper)  Kiln (Mercurial)  Shared MS SQL Database XmlCacheEnabled = false 34
  • 35. The KILROY case – Umbraco DK Festival Deployment  Deployment  Web Deploy from Visual Studio  XML Config transformations  Updating Umbraco Doc Types and other settings  Two approaches:  Create an Umbraco Package containing every Doc Type, every template, every macro and so on  Create an Umbraco Package containing new and updates Doc Types, templates etc. 35
  • 36. The KILROY case – Umbraco DK Festival Discussion How do you deploy? Have you felt the pain of updating an highly utilized DocType? 36
  • 37. Any final Questions or Comments? http://www.europaszkola.pl/O%20szkole_html_4ff13fb7.jpg