SlideShare a Scribd company logo
1 of 66
Lessons
from
a
Dying
CMS
Sandy Smith
sfsmith.com
@SandyS1
huh?
lesson
1:
history
ma7ers
why it was created
• clients: text-heavy policy shops
• needed topic-based lists (no silos)
• dates to 1998 (MySQL 3), no VC money
solu'on:
the
records
table
advantages
SELECT * FROM records WHERE topic = ‘health’
• Gets everything in the health topic
SELECT * FROM records WHERE topic = ‘health’
 AND datatype = 5
• Gets every document in the health
  topic
disadvantages
• HUGE table
• Self-joins are expensive
• Q: why don’t you fix it?
 A: Upgrades. <shudder>
     Also, did I mention no VCs?
configura'on
in
the
database

• Metadata about content types
  stored in 5 tables
• Coupled to content metadata like
  taxonomies
• Deploying changes was hard
what
I’d
do
now
• Normalize data, write converter
• Write manager to create
  normalized tables & columns
• Ensure everything has a title
  (Drupal does this...but still has a
  god table)
Lesson
2:
Decide
what

business
you’re
in




lesson
2:
What
business
are
you
in?
your
own
CMS:
Awesome!

• you have the features you need*
• not at mercy of “that idiot”*
• you gain experience
why
your
CMS
sucks

• you have the features you need*
  – *that you can afford

• care and feeding
• nobody’s going to help you*
• *“that idiot” is you
“what
am
I
payin’
you
for?”

1. website?
2. CMS?
what
I’d
do
now
what
I’d
do
now

• Use an open source CMS
  (switched to Drupal in 2008)
what
I’d
do
now

• Use an open source CMS
  (switched to Drupal in 2008)
• ...or at least use a framework
Lesson
3:
Beware
Lone

Wolves




lesson
3:
beware
lone
wolves

l’enfant
terrible:
fait
accompli
• Had been discussing common
   approach
• Started to use & critique data layer
  written by one programmer
• On one project, he wrote CMS
  after hours in 4 weeks
• Exec killed group project for ready-
  made CMS
2+
minds
are
beLer
than
1
           Custom Module
                                              -
           Pre-built Module




                                 Discussion


                                                  Quality
            Site Services


          Content Services


      Developer Services (SDK)




       Unified Content Model




   Syntax CMS Web Platform
                                              +
what
I’d
do
now
what
I’d
do
now

• Use an open source CMS
what
I’d
do
now

• Use an open source CMS
• ...or at least use a framework
what
I’d
do
now

• Use an open source CMS
• ...or at least use a framework
• Tight control of junior programmers
what
I’d
do
now

• Use an open source CMS
• ...or at least use a framework
• Tight control of junior programmers
• Remind execs of lost revenue
Lesson
5:
Highly
Coupled
==

Highly
Crappy




lesson
4:
highly
coupled
==
highly
crappy

uploading
a
file
 class pxdb_input extends pxdb_confront
 {
     function import($source = null)
     {
         parent::import($source);

         // uploaded files present somewhat of a
 special exception
         // that must be handled separately.
         $this->_import_uploaded_files();
     }
 }
uploading
a
file
 class pxdb_input extends pxdb_confront
 {
     function import($source = null)
     {
         parent::import($source);

         // uploaded files present somewhat of a
 special exception
         // that must be handled separately.
         $this->_import_uploaded_files();
     }
 }
uploading
a
file
 class pxdb_input extends pxdb_confront
 {
     function import($source = null)
     {
         parent::import($source); only exists in parent;
                                  not called anywhere else
         // uploaded files present somewhat of a
 special exception
         // that must be handled separately.
         $this->_import_uploaded_files();
     }
 }
Are
these
really
similar?
Inheritance
Inheritance

• Are generating forms, generating
  widgets, validating input, and
  writing data to the DB all the same
  type of action?
Inheritance

• Are generating forms, generating
  widgets, validating input, and
  writing data to the DB all the same
  type of action?

• They all use data, but they aren’t
  data.
Inheritance

• Are generating forms, generating
  widgets, validating input, and
  writing data to the DB all the same
  type of action?

• They all use data, but they aren’t
  data.

• WTF is confront anyway?
uploading
a
file
 class pxdb_input extends pxdb_confront
 {
     function import($source = null)
     {
         parent::import($source);

         // uploaded files present somewhat of a
 special exception
         // that must be handled separately.
         $this->_import_uploaded_files();
     }
 }
uploading
a
file
                                  parent::import() calls
 class pxdb_input extends pxdb_confront
                                  pxdb::import()
 {
     function import($source = null)
     {
         parent::import($source);

         // uploaded files present somewhat of a
 special exception
         // that must be handled separately.
         $this->_import_uploaded_files();
     }
 }
where
is
pxdb::import()?
sta'c,
singleton,
&
new
• “Couple” a method to other
  classes
• What if you want to do something
  different in one case?
• Increases complexity, makes
  debugging harder
• Increases rigidity
what
I’d
do
now
• Composition
  – pass data in as needed
  – pass widgets to form generator
  – pass validated data to model
• Separation of responsibility
  – controller imports data, hands to form
  – separate data model and data store
    (data mapper)
what
I’d
do
now

• Use configuration
  – enables changes based on environment
• Use a registry
  – configurable way to inject classes
lesson
5:
cheap
&
easy
hierarchies

the
problem

• You want to organize things in
  hierarchical categories, e.g.:
   Asia
   Asia/South Asia
   Asia/Central Asia
   Asia/East Asia
   Asia/South Asia/India
first
solu'on:
adjacency
list

  id   name           parent weight
   1   Asia
   2   South Asia       1       1
   3   East Asia        1       2
   4   Central Asia     1       3
   5   India            2
pluses

• Reordering is easy
• Insertion is easy
• Getting immediate children of a
  parent is easy
• Conceptually simple*
  – *if you know databases
minuses

• Some common functions require
  recursive functions
 – Reading entire branch of tree
 – Reading all ancestors of an entry
• Those functions are pretty
  common in breadcrumbs and
  menus
DBA
answer:
Nested
Sets
 id title          lft       rgt
  1 Asia                 1     10
  2 South Asia           2         5
  3 India                3         4
  4 East Asia            6         7
  5 Central Asia         8         9
pluses

• Most reads can be done with a
  single query
• Relies on fast numerical lookups
• Widely understood among DBA
  types
minuses
• Inserts require stored procedure or
  recursive function
• Deletes require stored procedure
  or recursive function
• Reordering requires stored
  procedure or recursive function
• Math is hard; let’s go shopping!
I
reinvent
Materialized
Path

• URIs already have hierarchy
• MySQL is pretty fast at text
  comparison
• Why not use URLs to map things,
  with a traditional weight field?
denormaliza'on
FTW

url                   name         weight
asia                  Asia
asia/south_asia       South Asia     1
asia/east_asia        East Asia      2
asia/central_asia     Central Asia   3
asia/south_asia/india India
pluses

• Selects are easy & familiar* with
  regexes:
   // get immediate children
   $sql = "
   SELECT *
   FROM
        records r
   WHERE
        r.url REGEXP '^$url/[^/]+$'
   ";
other
pluses

• Updates, deletes, inserts, and
  moving branches are easy
• Reordering still fairly easy
• Conceptually easy*
  – *if you have a background in Perl and
   regular expressions like me
minuses
• Requires processing to generate
  URLs, ensure no collisions
• REGEXP is slow
• Storage requirements much
  greater
• Selecting ordered trees requires
  trickery (consider code solution)
Lesson
7:
Measure
Everything




lesson
6:
measure
twice,
cut
once

why
is
this
so
SLOW?
• Default home page took 10
  seconds to load
• Complicated pages took longer
tools
maLer

• Tried various timing schemes;
  nothing gave much insight
• Convinced sysadmin to install
  XDebug 1.x
• Eureka!
xdebug
2.0|
maccallgrind
sample
discoveries

• ~1000 queries to generate page
  – Metadata calls killing us
• require_once is really expensive
• foreach() slower than while()*
  – * in PHP 4 ONLY!!!
solu'ons
• Queries:
  – Write cache object for metadata calls
  – Rewrite metadata classes to load all at
    beginning of request; store in memory
• Improve autoloader to put classes
  in array, include() if not present
• Foreach():
  – replace with while() when fixing/bored
results

• 1000 queries to 60-70
• 10 seconds load to 0.5 seconds
• Complex pages in 1.x seconds
lesson
review:
what
have
we
learned?

lessons:
lessons:
• Test. Don’t guess.
lessons:
• Test. Don’t guess.
• Research your problem.
  Somebody’s done it better than
  you.
lessons:
• Test. Don’t guess.
• Research your problem.
  Somebody’s done it better than
  you.
• Collaborate. Together we’re
  smarter than individually.
lessons:
• Test. Don’t guess.
• Research your problem.
  Somebody’s done it better than
  you.
• Collaborate. Together we’re
  smarter than individually.
• Don’t reinvent the wheel. Are you a
  wheelmaker or a driver?
Thank you
Sandy Smith
@SandyS1

More Related Content

What's hot

Oxford DrupalCamp 2012 - The things we found in your website
Oxford DrupalCamp 2012 - The things we found in your websiteOxford DrupalCamp 2012 - The things we found in your website
Oxford DrupalCamp 2012 - The things we found in your website
hernanibf
 
The things we found in your website
The things we found in your websiteThe things we found in your website
The things we found in your website
hernanibf
 
My site is slow
My site is slowMy site is slow
My site is slow
hernanibf
 

What's hot (20)

Not Just ORM: Powerful Hibernate ORM Features and Capabilities
Not Just ORM: Powerful Hibernate ORM Features and CapabilitiesNot Just ORM: Powerful Hibernate ORM Features and Capabilities
Not Just ORM: Powerful Hibernate ORM Features and Capabilities
 
Day 2 - Intro to Rails
Day 2 - Intro to RailsDay 2 - Intro to Rails
Day 2 - Intro to Rails
 
MWLUG 2016 : AD117 : Xpages & jQuery DataTables
MWLUG 2016 : AD117 : Xpages & jQuery DataTablesMWLUG 2016 : AD117 : Xpages & jQuery DataTables
MWLUG 2016 : AD117 : Xpages & jQuery DataTables
 
Software Development with Open Source
Software Development with Open SourceSoftware Development with Open Source
Software Development with Open Source
 
Apache Cayenne: a Java ORM Alternative
Apache Cayenne: a Java ORM AlternativeApache Cayenne: a Java ORM Alternative
Apache Cayenne: a Java ORM Alternative
 
flickr's architecture & php
flickr's architecture & php flickr's architecture & php
flickr's architecture & php
 
Lessons learned from the worlds largest XPage project
Lessons learned from the worlds largest XPage projectLessons learned from the worlds largest XPage project
Lessons learned from the worlds largest XPage project
 
Java EE revisits design patterns
Java EE revisits design patterns Java EE revisits design patterns
Java EE revisits design patterns
 
Introduction to CouchDB
Introduction to CouchDBIntroduction to CouchDB
Introduction to CouchDB
 
XFILES, the APEX 4 version - The truth is in there
XFILES, the APEX 4 version - The truth is in thereXFILES, the APEX 4 version - The truth is in there
XFILES, the APEX 4 version - The truth is in there
 
Alfresco Content Modelling and Policy Behaviours
Alfresco Content Modelling and Policy BehavioursAlfresco Content Modelling and Policy Behaviours
Alfresco Content Modelling and Policy Behaviours
 
Advanced Site Studio Class, June 18, 2012
Advanced Site Studio Class, June 18, 2012Advanced Site Studio Class, June 18, 2012
Advanced Site Studio Class, June 18, 2012
 
Oxford DrupalCamp 2012 - The things we found in your website
Oxford DrupalCamp 2012 - The things we found in your websiteOxford DrupalCamp 2012 - The things we found in your website
Oxford DrupalCamp 2012 - The things we found in your website
 
The things we found in your website
The things we found in your websiteThe things we found in your website
The things we found in your website
 
Introduce to XML
Introduce to XMLIntroduce to XML
Introduce to XML
 
NoSQL into E-Commerce: lessons learned
NoSQL into E-Commerce: lessons learnedNoSQL into E-Commerce: lessons learned
NoSQL into E-Commerce: lessons learned
 
2-5-14 “DSpace User Interface Innovation” Presentation Slides
2-5-14 “DSpace User Interface Innovation” Presentation Slides2-5-14 “DSpace User Interface Innovation” Presentation Slides
2-5-14 “DSpace User Interface Innovation” Presentation Slides
 
My site is slow
My site is slowMy site is slow
My site is slow
 
Content Modeling Behavior
Content Modeling BehaviorContent Modeling Behavior
Content Modeling Behavior
 
Persistence hibernate
Persistence hibernatePersistence hibernate
Persistence hibernate
 

Viewers also liked

How to report a bug
How to report a bugHow to report a bug
How to report a bug
Sandy Smith
 
EDUPUB 2013: Schema.org LRMI and A11Y for Discovery
EDUPUB 2013: Schema.org LRMI and A11Y for DiscoveryEDUPUB 2013: Schema.org LRMI and A11Y for Discovery
EDUPUB 2013: Schema.org LRMI and A11Y for Discovery
Gerardo Capiel
 

Viewers also liked (20)

Iterators, ArrayAccess & Countable (Oh My!) - Madison PHP 2014
Iterators, ArrayAccess & Countable (Oh My!) - Madison PHP 2014Iterators, ArrayAccess & Countable (Oh My!) - Madison PHP 2014
Iterators, ArrayAccess & Countable (Oh My!) - Madison PHP 2014
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Multibyte string handling in PHP
Multibyte string handling in PHPMultibyte string handling in PHP
Multibyte string handling in PHP
 
Grokking regex
Grokking regexGrokking regex
Grokking regex
 
Intoduction to php strings
Intoduction to php  stringsIntoduction to php  strings
Intoduction to php strings
 
TDA Center Depok update 2014 (Concept)
TDA Center Depok update 2014 (Concept)TDA Center Depok update 2014 (Concept)
TDA Center Depok update 2014 (Concept)
 
Hyperlocalisation or "localising everything"
Hyperlocalisation or "localising everything"Hyperlocalisation or "localising everything"
Hyperlocalisation or "localising everything"
 
Don't Fear the Regex LSP15
Don't Fear the Regex LSP15Don't Fear the Regex LSP15
Don't Fear the Regex LSP15
 
Dom
DomDom
Dom
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
GAIQ - Regular expressions-google-analytics
GAIQ - Regular expressions-google-analyticsGAIQ - Regular expressions-google-analytics
GAIQ - Regular expressions-google-analytics
 
Don't Fear the Regex - CapitalCamp/GovDays 2014
Don't Fear the Regex - CapitalCamp/GovDays 2014Don't Fear the Regex - CapitalCamp/GovDays 2014
Don't Fear the Regex - CapitalCamp/GovDays 2014
 
Architecting with Queues for Scale, Speed, and Separation (DCPHP 3/11/15)
Architecting with Queues for Scale, Speed, and Separation (DCPHP 3/11/15)Architecting with Queues for Scale, Speed, and Separation (DCPHP 3/11/15)
Architecting with Queues for Scale, Speed, and Separation (DCPHP 3/11/15)
 
Unicode Regular Expressions
Unicode Regular ExpressionsUnicode Regular Expressions
Unicode Regular Expressions
 
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
 
Architecting with Queues - Northeast PHP 2015
Architecting with Queues - Northeast PHP 2015Architecting with Queues - Northeast PHP 2015
Architecting with Queues - Northeast PHP 2015
 
How to report a bug
How to report a bugHow to report a bug
How to report a bug
 
Working with Databases and MySQL
Working with Databases and MySQLWorking with Databases and MySQL
Working with Databases and MySQL
 
EDUPUB 2013: Schema.org LRMI and A11Y for Discovery
EDUPUB 2013: Schema.org LRMI and A11Y for DiscoveryEDUPUB 2013: Schema.org LRMI and A11Y for Discovery
EDUPUB 2013: Schema.org LRMI and A11Y for Discovery
 

Similar to Lessons from a Dying CMS

Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
Drupalcon Paris
 
SharePoint 2014: Where to save my data, for devs!
SharePoint 2014: Where to save my data, for devs!SharePoint 2014: Where to save my data, for devs!
SharePoint 2014: Where to save my data, for devs!
Ben Steinhauser
 
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
 

Similar to Lessons from a Dying CMS (20)

SilverStripe From a Developer's Perspective
SilverStripe From a Developer's PerspectiveSilverStripe From a Developer's Perspective
SilverStripe From a Developer's Perspective
 
Drupal upgrades and migrations. BAD Camp 2013 version
Drupal upgrades and migrations. BAD Camp 2013 versionDrupal upgrades and migrations. BAD Camp 2013 version
Drupal upgrades and migrations. BAD Camp 2013 version
 
02 beginning code first
02   beginning code first02   beginning code first
02 beginning code first
 
02 beginning code first
02   beginning code first02   beginning code first
02 beginning code first
 
Domino testing presentation
Domino testing presentationDomino testing presentation
Domino testing presentation
 
Top ten-list
Top ten-listTop ten-list
Top ten-list
 
Modeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught MeModeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught Me
 
Introduction to memcached
Introduction to memcachedIntroduction to memcached
Introduction to memcached
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
 
Pure Speed Drupal 4 Gov talk
Pure Speed Drupal 4 Gov talkPure Speed Drupal 4 Gov talk
Pure Speed Drupal 4 Gov talk
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Modernizing Legacy Applications in PHP, por Paul Jones
Modernizing Legacy Applications in PHP, por Paul JonesModernizing Legacy Applications in PHP, por Paul Jones
Modernizing Legacy Applications in PHP, por Paul Jones
 
Add-On Development: EE Expects that Every Developer will do his Duty
Add-On Development: EE Expects that Every Developer will do his DutyAdd-On Development: EE Expects that Every Developer will do his Duty
Add-On Development: EE Expects that Every Developer will do his Duty
 
presentation
presentationpresentation
presentation
 
WordPress Themes 101 - dotEduGuru Summit 2013
WordPress Themes 101 - dotEduGuru Summit 2013WordPress Themes 101 - dotEduGuru Summit 2013
WordPress Themes 101 - dotEduGuru Summit 2013
 
Scaling php applications with redis
Scaling php applications with redisScaling php applications with redis
Scaling php applications with redis
 
Drupal theming - a practical approach (European Drupal Days 2015)
Drupal theming - a practical approach (European Drupal Days 2015)Drupal theming - a practical approach (European Drupal Days 2015)
Drupal theming - a practical approach (European Drupal Days 2015)
 
Magento performance feat. core Hacks
Magento performance feat. core HacksMagento performance feat. core Hacks
Magento performance feat. core Hacks
 
SharePoint 2014: Where to save my data, for devs!
SharePoint 2014: Where to save my data, for devs!SharePoint 2014: Where to save my data, for devs!
SharePoint 2014: Where to save my data, for devs!
 
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?
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 

Lessons from a Dying CMS

Editor's Notes

  1. \n
  2. \n
  3. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  4. Excited about contest, love doing this stuff\n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. Internet Consulting Firm \nHeadquartered in Alexandria, VA\nwww.forumone.com\n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n