SlideShare a Scribd company logo
1 of 47
Download to read offline
Content-Driven
 Web Applications with
Magnolia and Ruby on Rails
    Patrik Metzmacher, Dievision
      http://www.dievision.de
I’m not really talking about
       Ruby or Rails
Creating an environment which
       clients enjoy to
          work with
            and
    (our) developers love
       to develop for.
The Approach

How to run a Rails app within Magnolia

       Developing a minimal
      Magnolia/Rails application

               Testing

         The Rails Ecosystem
The Approach
Clean, consistent MVC architecture

               Same paradigms for
     content- and application-driven websites
File-based configuration and
       application data
    Work with version control and
    your favorite text editors/IDEs
Invent as few wheels as possible

  Leverage ready-made web-focussed solutions,
best practices and a large development community
Clie
                                                                             nt-s
                                                                      perf       ide
                       Dependency                                          orm
                                          E-Mails                    opti      ance
     ching             Management                                ing      miza
  Ca                                                   U nit Test              tion


     Templating                         ce Reu                             Integration
                                     an
                                    m g       sable
                                  or rin Comp                                Testing
                             P erf ito        onents            Hel pers/
                                  on
                                M                                Ut ilites
                  Prototyping

       /CSS                                    Scalab
 HTML                             ORM                  ility
     roce ssors                                                           JavaScript
Prep                                                                      Integration
                                                                 F orms
                        AJAX
    IDE/Editor                          Validation                            Dep
                                                          Sec                    loym
      support                    VC                            urit                    ent
                               M                                   y
Running Rails within Magnolia
Developers    Clients




                JCR
             Repository
Hierarchical NoSQL-Store
  that can be edited by
     normal people.
SQL
Database




   JCR
Repository




   …
100% Java-based
Ruby implementation

Mature

Fastest Ruby 1.8.7
implementation

Web apps can be deployed in
standard Servlet containers
JRuby Rack Filter




              Rack Connector



Rack Web Application
Installation
Rack Filter
                                        Aggregation Filter
                                        Rendering Filter
Magnolia Filter Chain




                           Rails “Base” controller providing
                           content, page, state objects
                           Mapping between Magnolia Templates
                           and Rails Layouts

                        Rails Application
config/routes.rb                     app/views/layouts/homepage.html.erb


                                    <html>
                                      <head>
                                        <title>
                                           <%= cms_out :title %>
MyApp::Application.routes.draw do       </title>
                                      </head>
  match "/(*cmspath)" =>              <body>
 "sinicum/controllers/base#index"       <%= main_bar %>
                                        <h1>
end                                        <%= cms_out :title %>
                                        </h1>
                                        <%= edit_bar :dialog =>
                                           "title_dialog" %>
                                      </body>
                                    </html>
Model                           View                               Controller


     File-based
    configuration



ActiveRecord-like JCR/
    Object Mapper



  JCR-Wrapper with                 Helpers to match the                 Magnolia/Rails “Base”
   Ruby Semantics                         Taglib                            Controller


                         Utilities: Scheduler, Imaging, Testing, etc.



                     Magnolia Module for JRuby/Rack integration
Developing a minimal
Magnolia/Rails application
The Task
app/models/templates/press_release.rb




class Templates::PressRelease
  include Sinicum::Jcr::Base

  def title_homepage
    title_short || title
  end
end
app/models/templates/press_release.rb


class Templates::PressRelease
  include Sinicum::Jcr::Base

  def title_homepage
    title_short || title
  end

  def title_short
    @content[:title_short]
  end

  def title
    @content[:title]
  end
end
config/routes.rb


MyApp::Application.routes.draw do

  match "/en" => "home#index"
  match "/(*cmspath)" => "sinicum/controllers/base#index"

end
app/controllers/home_controller.rb


class HomeController < Sinicum::Controllers::Base

  def index
    @releases = Templates::PressRelease.for_homepage
    cms_render
  end

end


app/views/layouts/homepage.html.erb


<ul>
  <% @releases.each do |release| -%>
     <li>
       <%= link_to release.title_homepage, release %>
     </li>
  <% end -%>
</ul>
app/models/templates/press_release.rb


class Templates::PressRelease
  include Sinicum::Jcr::Base

  def self.for_homepage
    where(:show_on_homepage => true).
    order("release_date desc", "order_day").
    limit(2)
  end

  def title_homepage
    title_short || title
  end
end
app/models/templates/press_release.rb



class Templates::PressRelease
  include Sinicum::Jcr::Base

  scope :ordered, order("release_date desc", "order_day")
  scope :for_homepage, ordered.where(:show_on_homepage => true).limit(2)

  def title_homepage
    title_short || title
  end
end
Configuration
Consistent
     Editable
Version-Controlable
Tied to the models
<?xml version="1.0" encoding="UTF-8"?>
<sv:node sv:name="box_picture_teaser_large_item_dialog" xmlns:sv="http://
www.jcp.org/jcr/sv/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <sv:property sv:name="jcr:primaryType" sv:type="Name">
    <sv:value>mgnl:contentNode</sv:value>
  </sv:property>
  <sv:property sv:name="jcr:mixinTypes" sv:type="Name">
    <sv:value>mix:lockable</sv:value>
  </sv:property>
  <sv:property sv:name="jcr:uuid" sv:type="String">
    <sv:value>92a944c5-c5b3-423c-af93-34a7b948c5be</sv:value>
  </sv:property>
  <sv:node sv:name="MetaData">
    <sv:property sv:name="jcr:primaryType" sv:type="Name">
      <sv:value>mgnl:metaData</sv:value>
    </sv:property>
    <sv:property sv:name="mgnl:activated" sv:type="Boolean">
      <sv:value>true</sv:value>
    </sv:property>
    <sv:property sv:name="mgnl:activatorid" sv:type="String">
      <sv:value>username</sv:value>
    </sv:property>
    <sv:property sv:name="mgnl:authorid" sv:type="String">
      <sv:value>authorname</sv:value>
    </sv:property>
db/migrate/20100916101243_create_product_registration.rb


class CreateProductRegistration < ActiveRecord::Migration
  def self.up
    create_table :product_registrations do |t|
      t.column :first_name, :string
      t.column :last_name, :string
      t.column :email, :string
      t.column :date_of_birth, :date
      t.column :date_of_purchase, :date
      t.column :point_of_sale, :string
      t.column :roles, :string
      t.column :newsletter_subscription, :boolean
    end
  end

  def self.down
    drop_table :product_registrations
  end
end
db/jcr/module/dialogs/video_dialog.yml


video_dialog:

  height: 500

  tab_main:

     title:
       controlType: edit
       label: Title

     video_file:
       controlType: uuidLink
       description: Link to the video file
       repository: dms
       label: Video
Testing
app/views/layouts/homepage.html.erb


<ul>
  <% @releases.each do |release| -%>
     <li>
       <%= link_to release.title_homepage, release %>
     </li>
  <% end -%>
</ul>
spec/views/layouts/homepage.html.erb_spec.rb




require 'spec_helper'

describe "layouts/homepage.html.erb" do

  it "displays the title of a press release" do
    render
    rendered.should contain("Sustainability World Index")
  end

end
spec/views/layouts/homepage.html.erb_spec.rb



require 'spec_helper'

describe "layouts/homepage.html.erb" do
  it "displays the title of a press release" do

     releases = [Templates::PressRelease.new(
        :title => "Lorem ipsum Sustainability World Index dolor sit amet",
        :title_short => "Sustainability World Index"
     )]
     assign(:releases, releases)

    render
    rendered.should contain("Sustainability World Index")
  end
end
spec/views/layouts/homepage.html.erb_spec.rb


describe "layouts/homepage.html.erb" do

  before(:each) do
    assign(:releases, [Factory(:sustainability_release)])
  end

  it "displays the title of a press release" do
    render
    rendered.should contain("Sustainability World Index")
  end
end



spec/factories/templates/press_releases.rb


Factory.define :sustainability_release,
    :class => Templates::PressRelease do |r|
  r.title "Lorem ipsum Sustainability World Index dolor sit amet",
  r.title_short "Sustainability World Index"
end
The Ecosystem

   What we use
Capistrano for deployment

       Haml/Sass for better
     HTML templates and CSS

NewRelic for performance monitoring

Many high-quality Gems and Plugins
Our Conclusion
Very productive and “scalable” environment

Performance is just fine

Save/Reload vs. Save/Compile/Restart/Reload

You can refactor in a dynamic language

Collaboration is easier when everyone uses the
same tools
http://www.dievision.de

More Related Content

What's hot

Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Kazuyuki Kawamura
 
Intro To Sap Netweaver Java
Intro To Sap Netweaver JavaIntro To Sap Netweaver Java
Intro To Sap Netweaver Java
Leland Bartlett
 
Ruby On Rails Tutorial
Ruby On Rails TutorialRuby On Rails Tutorial
Ruby On Rails Tutorial
sunniboy
 
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
Dacartec Servicios Informáticos
 

What's hot (20)

Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Intro To Sap Netweaver Java
Intro To Sap Netweaver JavaIntro To Sap Netweaver Java
Intro To Sap Netweaver Java
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Struts N E W
Struts N E WStruts N E W
Struts N E W
 
Jsp quick reference card
Jsp quick reference cardJsp quick reference card
Jsp quick reference card
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
 
Spring mvc 2.0
Spring mvc 2.0Spring mvc 2.0
Spring mvc 2.0
 
Java Web Programming [7/9] : Struts2 Basics
Java Web Programming [7/9] : Struts2 BasicsJava Web Programming [7/9] : Struts2 Basics
Java Web Programming [7/9] : Struts2 Basics
 
Spring Portlet MVC
Spring Portlet MVCSpring Portlet MVC
Spring Portlet MVC
 
Ruby On Rails Tutorial
Ruby On Rails TutorialRuby On Rails Tutorial
Ruby On Rails Tutorial
 
Jsf Framework
Jsf FrameworkJsf Framework
Jsf Framework
 
Lap trinh web [Slide jsp]
Lap trinh web [Slide jsp]Lap trinh web [Slide jsp]
Lap trinh web [Slide jsp]
 
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
IBM WebSphere Portal Integrator for SAP - Escenario de ejemplo.
 
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsJava Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom Tags
 
Introduction to JSP pages
Introduction to JSP pagesIntroduction to JSP pages
Introduction to JSP pages
 
Modular applications with montage components
Modular applications with montage componentsModular applications with montage components
Modular applications with montage components
 
Built to Last
Built to LastBuilt to Last
Built to Last
 
10 jsp-scripting-elements
10 jsp-scripting-elements10 jsp-scripting-elements
10 jsp-scripting-elements
 

Similar to Content-Driven Web Applications with Magnolia CMS and Ruby on Rails

Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
Tuna Tore
 

Similar to Content-Driven Web Applications with Magnolia CMS and Ruby on Rails (20)

MVC Demystified: Essence of Ruby on Rails
MVC Demystified: Essence of Ruby on RailsMVC Demystified: Essence of Ruby on Rails
MVC Demystified: Essence of Ruby on Rails
 
Jasig Rubyon Rails
Jasig Rubyon RailsJasig Rubyon Rails
Jasig Rubyon Rails
 
RoR 101: Session 2
RoR 101: Session 2RoR 101: Session 2
RoR 101: Session 2
 
Intro to Ruby on Rails
Intro to Ruby on RailsIntro to Ruby on Rails
Intro to Ruby on Rails
 
Spring and DWR
Spring and DWRSpring and DWR
Spring and DWR
 
AEM Sightly Deep Dive
AEM Sightly Deep DiveAEM Sightly Deep Dive
AEM Sightly Deep Dive
 
RubyConf Brazil 2011
RubyConf Brazil 2011RubyConf Brazil 2011
RubyConf Brazil 2011
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Templates, partials and layouts
Templates, partials and layoutsTemplates, partials and layouts
Templates, partials and layouts
 
Client Side MVC with Backbone and Rails
Client Side MVC with Backbone and RailsClient Side MVC with Backbone and Rails
Client Side MVC with Backbone and Rails
 
S314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache TuscanyS314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache Tuscany
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Ruby on rails RAD
Ruby on rails RADRuby on rails RAD
Ruby on rails RAD
 
Useful Rails Plugins
Useful Rails PluginsUseful Rails Plugins
Useful Rails Plugins
 
Knolx session
Knolx sessionKnolx session
Knolx session
 
Rails + Sencha = Netzke
Rails + Sencha = NetzkeRails + Sencha = Netzke
Rails + Sencha = Netzke
 
Phoenix for Rails Devs
Phoenix for Rails DevsPhoenix for Rails Devs
Phoenix for Rails Devs
 

More from bkraft

The Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing webThe Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing web
bkraft
 
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
bkraft
 
Single sourcing desktop and mobile websites
Single sourcing desktop and mobile websitesSingle sourcing desktop and mobile websites
Single sourcing desktop and mobile websites
bkraft
 
Solr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of MagnoliaSolr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of Magnolia
bkraft
 
End to end content managed online mobile banking
End to end content managed online mobile bankingEnd to end content managed online mobile banking
End to end content managed online mobile banking
bkraft
 
Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris
bkraft
 

More from bkraft (20)

The Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing webThe Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing web
 
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
 
Magnolia Conference 2013: Keynote
Magnolia Conference 2013: KeynoteMagnolia Conference 2013: Keynote
Magnolia Conference 2013: Keynote
 
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
 
Webinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For ITWebinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For IT
 
Increase Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop ModuleIncrease Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop Module
 
Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013
 
High performance and scalability
High performance and scalability High performance and scalability
High performance and scalability
 
Multilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pagesMultilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pages
 
Blossom on the web
Blossom on the webBlossom on the web
Blossom on the web
 
Single sourcing desktop and mobile websites
Single sourcing desktop and mobile websitesSingle sourcing desktop and mobile websites
Single sourcing desktop and mobile websites
 
Work life balance
Work life balanceWork life balance
Work life balance
 
Magnolia and PHPCR
Magnolia and PHPCRMagnolia and PHPCR
Magnolia and PHPCR
 
Solr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of MagnoliaSolr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of Magnolia
 
End to end content managed online mobile banking
End to end content managed online mobile bankingEnd to end content managed online mobile banking
End to end content managed online mobile banking
 
MBC Group - Magnolia in the Media
MBC Group - Magnolia in the MediaMBC Group - Magnolia in the Media
MBC Group - Magnolia in the Media
 
Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris
 
Bridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured SoftwareBridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured Software
 
User Management and SSO for Austrian Government
User Management and SSO for Austrian GovernmentUser Management and SSO for Austrian Government
User Management and SSO for Austrian Government
 
Enterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's ImagingEnterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's Imaging
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

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
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
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
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 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...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

Content-Driven Web Applications with Magnolia CMS and Ruby on Rails