SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
0 to Production


December 3, 2008
Peter Higgins
SpringOne Americas
Me.



© SitePen, Inc. 2008. All Rights Reserved
Show of Hands?




© SitePen, Inc. 2008. All Rights Reserved
Quick Start



© SitePen, Inc. 2008. All Rights Reserved
Notes about Dojo


            Long Standing Development
            Large, Active Developer Base
            Friendly Professional Community
            Liberally Licensed, Clean IP




© SitePen, Inc. 2008. All Rights Reserved
Notes about Dojo


                    Comprised of Base, Core,
                    Dijit, and DojoX
                    Uni ed Tools and
                    Components
                    Extras: ShrinkSafe, Build
                    Utils
                    D.O.H.




© SitePen, Inc. 2008. All Rights Reserved
Base



© SitePen, Inc. 2008. All Rights Reserved
Using Dojo Base

         <html>
           <head>

                    <title>Hello, Dojo</title>

                    <!-- load Dojo from a CDN: -->
                    <script type=quot;text/javascriptquot;
                      src=quot;http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.jsquot;>
                    </script>

           </head>
           <body>
           </body>
         </html>




© SitePen, Inc. 2008. All Rights Reserved
Aka: dojo.js (26KB of Joy)
                    Ajax: dojo.xhr, dojo.xhrGet, dojo.xhrPost ...
                    Events: normalization, keys, Objects or Nodes
                    DOM/CSS: dojo.byId, dojo.style, dojo.place, dojo.attr
                    Animation: dojo.fadeIn/Out, dojo.animateProperty
                    Query/NodeList: CSS3 Selectors. aka: All of the Above
                    Advanced JS: dojo.delegate, .hitch, .partial, .exists ...
                          dojo.declare
                    Native JS: forEach, map, lter, some, every, indexOf ...
                    Browser Sni ng: dojo.isIE < 7, isFF, isWebKit ...


© SitePen, Inc. 2008. All Rights Reserved
Patterns in Dojo
         // style and add class to a node:
         dojo.addClass(“someNode”, “someClass”);
         dojo.style(“someNode”, { opacity:0.5, lineHeight:”1.3em” });
         dojo.attr(“someNode”, { id:”newId” });

         // or chained
         dojo.query(“#someNode”)
             .addClass(“someClass”)
             .attr({ id:”newId” })
             .style({ opacity:0.5, lineHeight:”1.3em” })

         // connect:
         dojo.connect(dojo.byId(“foo”), “onclick”, function(e){...});
         // or connect:
         dojo.query(“#foo”).connect(“onclick”, function(e){ ... });
         // or sugar:
         dojo.query(“#foo”).onclick(function(e){ ... });




© SitePen, Inc. 2008. All Rights Reserved
Simple OO, Simulated Inheritance
         dojo.declare(“some.Person”, null, {
             name: ”default”,
             constructor: function(args){
                 dojo.mixin(this, args);
             }
         });

         dojo.declare(“some.Employee”, some.Person, {
             employeeId: 0
         });

         var bob = new some.Person({ name:”Bob Bobson” });
         var joy = new some.Employee({ name:”Joy”, employeeId:24 });




© SitePen, Inc. 2008. All Rights Reserved
Package System == modular code
        And more...                                     Works with Dojo and custom code


                    Local:
                          dojo.require(“dojo.io.script”);
                          dojo.require(“my.Widget”);
                    Robust:
                          dojo.registerModulePath(“external”, “/external/js”);
                          dojo.require(“external.Thinger”);
                    Easy:
                          dojo.provide(“my.Widget”);
                    Ready: dojo.addOnLoad, .addOnUnLoad ...


© SitePen, Inc. 2008. All Rights Reserved
The   Core



© SitePen, Inc. 2008. All Rights Reserved
More Patterns
                    Use at will - everything additive.
                    No dependency tracking - just dojo.require(“it”)
                    Few, if any, “rules”
                    Scale: Grows to t your needs




© SitePen, Inc. 2008. All Rights Reserved
Added Joy - a require() away
                    dojo.data - Uni ed Data API
                    dojo.dnd - Drag and Drop API
                    dojo.fx / dojo.NodeList-fx - Additional Advanced FX
                    dojo.i18n - Internationalization tools
                    dojo.string, dojo.date, dojo.regexp - Common utility
                    dojo.io.iframe, dojo.io.script, dojo.rpc - Advanced IO


                    ... more: dojo.behavior, dojo.html, dojo.gears,
                    dojo.cookie, dojo.parser, dojo.jaxer ...



© SitePen, Inc. 2008. All Rights Reserved
Additional Debugging

                 FireBug Lite Shipped
                     console.* provided in less
                     sane browsers
                 Load with djCon g =
                 { isDebug:true }
                 if(dojo.con g.isDebug){ .. }




© SitePen, Inc. 2008. All Rights Reserved
The Dojo Widget Framework




© SitePen, Inc. 2008. All Rights Reserved
Take Your Pick
                    Compartmentalized Behavior using Existing Markup
                    Fully dynamic, reusable Templated components
                    Extend existing or Create ...




© SitePen, Inc. 2008. All Rights Reserved
Includes Suite of Widgets

                 Layouts - Accordions, Tabs
                 Form - Validation and
                 more ...
                 WYSIWYG Editor
                 Tree, Sliders, ProgressBar ...




© SitePen, Inc. 2008. All Rights Reserved
Setup is Easy
          <html>
            <head>
              <title>index.html</title>
              <!-- some css -->
              <link rel=”stylesheet”
                href=”dojotoolkit/dijit/themes/tundra/tundra.css”>

               <script type=quot;text/javascriptquot;
         	

 	

 src=quot;dojotoolkit/dojo/dojo.jsquot;></script>
            </head>
            <body class=”tundra”>
            </body>
         </html>




© SitePen, Inc. 2008. All Rights Reserved
Flexible Instantiation
         // load the resource:
         dojo.require(“dijit.dijit”); // Base Dijit
         dojo.require(“dijit.Dialog”); // Dialog Code

         // create programatically:
         var myDialog = new dijit.Dialog({
         title:”Login”
         }, “formArea”);

         <!-- or declaratively in markup -->
         <div id=”formArea” dojoType=”dijit.Dialog” title=”Login”>
         <p>...</p>
         </div>

         // access the instance:
         dijit.byId(“formArea”).show(); // myDialog.show();




© SitePen, Inc. 2008. All Rights Reserved
CSS Driven Skinning

                 Three full themes:
                      Tundra
                      Soria
                      Nihilo


                 Fully customizable


                 Even easier with
                 constraints:
                     Embedded WebKit ?



© SitePen, Inc. 2008. All Rights Reserved
Full Localization (i18n) Support




© SitePen, Inc. 2008. All Rights Reserved
Full Accessibility (a11y) Support


                                            Screen reader support

                                            High contrast mode support

                                            Keyboard navigation



                                            ... with every Dijit




© SitePen, Inc. 2008. All Rights Reserved
Custom Widgets
         dojo.provide(“my.Widget”);
         dojo.require(“dijit._Widget”);
         dojo.require(“dijit._Templated”);

         // define:
         dojo.declare(“my.Widget”, [dijit._Widget, dijit._Templated], {
           value:”default”,
           templatePath: dojo.moduleUrl(“my.templates”, “Widget.html”,
           postCreate: function(args){
             // init code
           }
         });

         // instantiate:
         new my.Widget({ value:”bar” }, “someNode”);
         // declarative way:
         <input id=”someNode” dojoType=”my.Widget” value=”Foo”>




© SitePen, Inc. 2008. All Rights Reserved
Custom Extensions



                                            Leverage the Dijit widget
                                            system for speci c purposes

                                            Reuse Existing a11y and i18n
                                            code in Dijit




© SitePen, Inc. 2008. All Rights Reserved
Custom Widgets: Subclassing
          dojo.require(“dijit.Dialog”);

         // “subclassing”:
         dojo.declare(“my.Dialog”, dijit.Dialog, {

               canShow: true,

               show: function(){
                 if(this.canShow){
                   // then call inherited:
                   this.inherited(arguments);
                 }
               }

         });

         var showable = new my.Dialog({ canShow: false });




© SitePen, Inc. 2008. All Rights Reserved
Ultra Rapid Prototyping
          <div id=”foo” dojoType=”dijit.Dialog” title=”Hello”>
            <p> ... </p>

               <script type=”dojo/method” event=”hide”>
                 // override instance’s hide() method ... test.
               </script>

               <script type=”dojo/connect” event=”show”>
                 // monitor instance’s show() method ...
               </script>

         </div>




© SitePen, Inc. 2008. All Rights Reserved
Helping Designers
         /* Convenience Rules added to <html> element */
         .mybox {
            width:250px;
         }

         /* love the quirks: */
         .dj_ie6 .mybox {
            margin-right:1px
         }

         .dj_ie7 .mybox {
            margin-right:2px;
         }

         .dj_quirks .mybox {
            margin:3px;
         }




© SitePen, Inc. 2008. All Rights Reserved
© SitePen, Inc. 2008. All Rights Reserved
Extensions, Extras, Experiments
                    Extend Dijit:
                          dojox.widget, dojox.layout, dojox.form
                    Additional FX: dojox.fx
                          Morph, Text, Extras ...
                    Image Gadgets:
                          FlickrBadge, Lightbox (Nano), SlideShow ...
                    Comet: dojox.cometd
                    Advanced IO:
                          RPC, REST, SMD, ScriptFrame ...


© SitePen, Inc. 2008. All Rights Reserved
... there’s more: DojoX GFX




                                Cross-browser vector graphics
                            GFX API, Charting: 2d / 3d, GFX Animation

© SitePen, Inc. 2008. All Rights Reserved
DojoX: DataGrid




                                   Fully dojo.data-Ready
                            Lazy Row Selection,Virtual Scrolling
                       Simplified Use: Layout Ready, Easy instantiation

© SitePen, Inc. 2008. All Rights Reserved
dojox.data Stores
                    AndOrReadStore          GoogleSearchStore
                    AppStore                HtmlStore
                    AtomReadStore           jsonPathStore
                    CouchDBRestStore        jsonRestStore
                    CssRuleStore            OpmlStore
                    CsvStore                QueryReadStore
                    FileStore               ServiceStore
                    FlickrRestStore /       S3Store
                    FlickrStore             WikipediaStore
                    GoogleFeedStore         XmlStore

© SitePen, Inc. 2008. All Rights Reserved
Other Goodies
                    dojox.av - Audio / Video helpers
                    dojox.dtl - django templating system implementation
                    dojox.o , dojox.storage - O ine helpers
                    dojox.lang - Advanced JS techniques
                    dojox.xmpp - Full protocol implementation
                    dojox.validate - Regexps + Functions


                    ... much, much more!




© SitePen, Inc. 2008. All Rights Reserved
Simple Gems: Google Analytics
                   Why Write This?

              <script type=quot;text/javascriptquot;>
              var gaJsHost = ((quot;https:quot; == document.location.protocol) ?
              quot;https://ssl.quot; : quot;http://www.quot;);
              document.write(unescape(quot;%3Cscript src='quot; + gaJsHost + quot;google-
              analytics.com/ga.js' type='text/javascript'%3E%3C/script%3Equot;));
              </script>
              <script type=quot;text/javascriptquot;>
              var pageTracker = _gat._getTracker(quot;UA-xxxxxx-xquot;);
              pageTracker._trackPageview();
              </script>




© SitePen, Inc. 2008. All Rights Reserved
Simple Gems: Google Analytics with Dojo
                   Just Write This:


              // load the resource
              dojo.require(“dojox.analytics.Urchin”);

              <!-- and create in markup -->
              <div dojoType=”dojox.analytics.Urchin”
              acct=”12345-UA-23”></div>

              // or in script:
              new dojox.analytics.Urchin({ acct:”UA-xxxxx-x” });




© SitePen, Inc. 2008. All Rights Reserved
in Production



© SitePen, Inc. 2008. All Rights Reserved
Dojo Build System
                    Reduce number of HTTP requests
                          Template Interning and resource concatenation
                    Reduce JavaScript le size:
                          Remove Comments and whitespace
                          Variable obfuscation (ShrinkSafe)
                    CSS Optimization
                          Comment Removal
                          @import “...” concatenation
                    StripConsole options


© SitePen, Inc. 2008. All Rights Reserved
Advanced Builds
                    Stubs Dojo (6k dojo.js)
                    Custom Base
                    “Layers”
                          Automatic dependency tracking
                          Cross-dependent layers
                          RestoreRequire
                    X-Domain Dojo - Local CDN
                    BuildExclude syntax



© SitePen, Inc. 2008. All Rights Reserved
D.O.H - Unit test Suite




           Supports Build Up, Tear Down, sync or async Testing
                doh.robot - Automated UI Unit testing

© SitePen, Inc. 2008. All Rights Reserved
Resources



© SitePen, Inc. 2008. All Rights Reserved
Basic Documentation
                    Full API Docs:
                          http://api.dojotoolkit.org
                    Full On-Line Docs:
                          http://docs.dojocampus.org
                    O ine Docs:
                          http://sitepen.com/labs/toolbox
                    Tutorials, Blogs, Examples:
                          http://dojocampus.org




© SitePen, Inc. 2008. All Rights Reserved
Additional Documentation




                                                 Dojo Dead Trees!


© SitePen, Inc. 2008. All Rights Reserved
That’s



© SitePen, Inc. 2008. All Rights Reserved
Questions?



© SitePen, Inc. 2008. All Rights Reserved

Weitere ähnliche Inhalte

Was ist angesagt?

Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014Endava
 
How dojo works
How dojo worksHow dojo works
How dojo worksAmit Tyagi
 
Rich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitRich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitalexklaeser
 
Building Dojo in the Cloud
Building Dojo in the CloudBuilding Dojo in the Cloud
Building Dojo in the CloudJames Thomas
 
Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slideshelenmga
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastGabriel Hamilton
 
jQuery Tips Tricks Trivia
jQuery Tips Tricks TriviajQuery Tips Tricks Trivia
jQuery Tips Tricks TriviaCognizant
 
Dojo: Getting Started Today
Dojo: Getting Started TodayDojo: Getting Started Today
Dojo: Getting Started TodayGabriel Hamilton
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeLaurence Svekis ✔
 
Better Selenium Tests with Geb - Selenium Conf 2014
Better Selenium Tests with Geb - Selenium Conf 2014Better Selenium Tests with Geb - Selenium Conf 2014
Better Selenium Tests with Geb - Selenium Conf 2014Naresha K
 
JavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderJavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderAndres Almiray
 
Starting with jQuery
Starting with jQueryStarting with jQuery
Starting with jQueryAnil Kumar
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)jeresig
 
Node.js in action
Node.js in actionNode.js in action
Node.js in actionSimon Su
 
State of jQuery and Drupal
State of jQuery and DrupalState of jQuery and Drupal
State of jQuery and Drupaljeresig
 
Why and How to Use Virtual DOM
Why and How to Use Virtual DOMWhy and How to Use Virtual DOM
Why and How to Use Virtual DOMDaiwei Lu
 

Was ist angesagt? (20)

Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
 
How dojo works
How dojo worksHow dojo works
How dojo works
 
Dojo & HTML5
Dojo & HTML5Dojo & HTML5
Dojo & HTML5
 
Rich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitRich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkit
 
Building Dojo in the Cloud
Building Dojo in the CloudBuilding Dojo in the Cloud
Building Dojo in the Cloud
 
Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slides
 
dojo.Patterns
dojo.Patternsdojo.Patterns
dojo.Patterns
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, Fast
 
jQuery Tips Tricks Trivia
jQuery Tips Tricks TriviajQuery Tips Tricks Trivia
jQuery Tips Tricks Trivia
 
Dojo: Getting Started Today
Dojo: Getting Started TodayDojo: Getting Started Today
Dojo: Getting Started Today
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
The jQuery Library
The  jQuery LibraryThe  jQuery Library
The jQuery Library
 
Better Selenium Tests with Geb - Selenium Conf 2014
Better Selenium Tests with Geb - Selenium Conf 2014Better Selenium Tests with Geb - Selenium Conf 2014
Better Selenium Tests with Geb - Selenium Conf 2014
 
JavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderJavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilder
 
Starting with jQuery
Starting with jQueryStarting with jQuery
Starting with jQuery
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)
 
ActiveDOM
ActiveDOMActiveDOM
ActiveDOM
 
Node.js in action
Node.js in actionNode.js in action
Node.js in action
 
State of jQuery and Drupal
State of jQuery and DrupalState of jQuery and Drupal
State of jQuery and Drupal
 
Why and How to Use Virtual DOM
Why and How to Use Virtual DOMWhy and How to Use Virtual DOM
Why and How to Use Virtual DOM
 

Ähnlich wie Zero To Dojo

The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build Systemklipstein
 
Bubbles & Trees with jQuery
Bubbles & Trees with jQueryBubbles & Trees with jQuery
Bubbles & Trees with jQueryBastian Feder
 
IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009Christopher Judd
 
Creating Custom Dojo Widgets Using WTP
Creating Custom Dojo Widgets Using WTPCreating Custom Dojo Widgets Using WTP
Creating Custom Dojo Widgets Using WTPnsandonato
 
Developer Student Clubs NUK - Flutter for Beginners
Developer Student Clubs NUK - Flutter for BeginnersDeveloper Student Clubs NUK - Flutter for Beginners
Developer Student Clubs NUK - Flutter for BeginnersJiaxuan Lin
 
Simple web browser
Simple web browserSimple web browser
Simple web browserSohag Babu
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overviewjeresig
 
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Peter Martin
 
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...Nagios
 
How to develop nice portlet with Juzu framework
How to develop nice portlet with Juzu frameworkHow to develop nice portlet with Juzu framework
How to develop nice portlet with Juzu frameworkNguyễn Tuyến
 
Maximise the Power of OSGi - Carsten Ziegeler & David Bosschaert
Maximise the Power of OSGi - Carsten Ziegeler & David BosschaertMaximise the Power of OSGi - Carsten Ziegeler & David Bosschaert
Maximise the Power of OSGi - Carsten Ziegeler & David Bosschaertmfrancis
 
Maximize the power of OSGi
Maximize the power of OSGiMaximize the power of OSGi
Maximize the power of OSGiDavid Bosschaert
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersTodd Anglin
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)jeresig
 
a friend in need-a js indeed / Yonatan levin
a friend in need-a js indeed / Yonatan levina friend in need-a js indeed / Yonatan levin
a friend in need-a js indeed / Yonatan levingeektimecoil
 
A friend in need - A JS indeed
A friend in need - A JS indeedA friend in need - A JS indeed
A friend in need - A JS indeedYonatan Levin
 

Ähnlich wie Zero To Dojo (20)

The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build System
 
Trimming The Cruft
Trimming The CruftTrimming The Cruft
Trimming The Cruft
 
Bubbles & Trees with jQuery
Bubbles & Trees with jQueryBubbles & Trees with jQuery
Bubbles & Trees with jQuery
 
IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009
 
Creating Custom Dojo Widgets Using WTP
Creating Custom Dojo Widgets Using WTPCreating Custom Dojo Widgets Using WTP
Creating Custom Dojo Widgets Using WTP
 
YUI 3
YUI 3YUI 3
YUI 3
 
Developer Student Clubs NUK - Flutter for Beginners
Developer Student Clubs NUK - Flutter for BeginnersDeveloper Student Clubs NUK - Flutter for Beginners
Developer Student Clubs NUK - Flutter for Beginners
 
Simple web browser
Simple web browserSimple web browser
Simple web browser
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overview
 
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
 
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...
Nagios Conference 2012 - Eric Loyd - Nagios Implementation Case Eastman Kodak...
 
How to develop nice portlet with Juzu framework
How to develop nice portlet with Juzu frameworkHow to develop nice portlet with Juzu framework
How to develop nice portlet with Juzu framework
 
Maximise the Power of OSGi - Carsten Ziegeler & David Bosschaert
Maximise the Power of OSGi - Carsten Ziegeler & David BosschaertMaximise the Power of OSGi - Carsten Ziegeler & David Bosschaert
Maximise the Power of OSGi - Carsten Ziegeler & David Bosschaert
 
Maximize the power of OSGi
Maximize the power of OSGiMaximize the power of OSGi
Maximize the power of OSGi
 
Extend sdk
Extend sdkExtend sdk
Extend sdk
 
Test02
Test02Test02
Test02
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
 
JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)JavaScript Libraries (Kings of Code)
JavaScript Libraries (Kings of Code)
 
a friend in need-a js indeed / Yonatan levin
a friend in need-a js indeed / Yonatan levina friend in need-a js indeed / Yonatan levin
a friend in need-a js indeed / Yonatan levin
 
A friend in need - A JS indeed
A friend in need - A JS indeedA friend in need - A JS indeed
A friend in need - A JS indeed
 

Mehr von Peter Higgins

Mehr von Peter Higgins (7)

Jsconf.us.2013
Jsconf.us.2013Jsconf.us.2013
Jsconf.us.2013
 
has("builds")
has("builds")has("builds")
has("builds")
 
has.js
has.jshas.js
has.js
 
Just JavaScript
Just JavaScriptJust JavaScript
Just JavaScript
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 
Txjs
TxjsTxjs
Txjs
 
dojo.things()
dojo.things()dojo.things()
dojo.things()
 

Kürzlich hochgeladen

Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 

Kürzlich hochgeladen (20)

Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 

Zero To Dojo

  • 1. 0 to Production December 3, 2008 Peter Higgins SpringOne Americas
  • 2. Me. © SitePen, Inc. 2008. All Rights Reserved
  • 3. Show of Hands? © SitePen, Inc. 2008. All Rights Reserved
  • 4. Quick Start © SitePen, Inc. 2008. All Rights Reserved
  • 5. Notes about Dojo Long Standing Development Large, Active Developer Base Friendly Professional Community Liberally Licensed, Clean IP © SitePen, Inc. 2008. All Rights Reserved
  • 6. Notes about Dojo Comprised of Base, Core, Dijit, and DojoX Uni ed Tools and Components Extras: ShrinkSafe, Build Utils D.O.H. © SitePen, Inc. 2008. All Rights Reserved
  • 7. Base © SitePen, Inc. 2008. All Rights Reserved
  • 8. Using Dojo Base <html> <head> <title>Hello, Dojo</title> <!-- load Dojo from a CDN: --> <script type=quot;text/javascriptquot; src=quot;http://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.jsquot;> </script> </head> <body> </body> </html> © SitePen, Inc. 2008. All Rights Reserved
  • 9. Aka: dojo.js (26KB of Joy) Ajax: dojo.xhr, dojo.xhrGet, dojo.xhrPost ... Events: normalization, keys, Objects or Nodes DOM/CSS: dojo.byId, dojo.style, dojo.place, dojo.attr Animation: dojo.fadeIn/Out, dojo.animateProperty Query/NodeList: CSS3 Selectors. aka: All of the Above Advanced JS: dojo.delegate, .hitch, .partial, .exists ... dojo.declare Native JS: forEach, map, lter, some, every, indexOf ... Browser Sni ng: dojo.isIE < 7, isFF, isWebKit ... © SitePen, Inc. 2008. All Rights Reserved
  • 10. Patterns in Dojo // style and add class to a node: dojo.addClass(“someNode”, “someClass”); dojo.style(“someNode”, { opacity:0.5, lineHeight:”1.3em” }); dojo.attr(“someNode”, { id:”newId” }); // or chained dojo.query(“#someNode”) .addClass(“someClass”) .attr({ id:”newId” }) .style({ opacity:0.5, lineHeight:”1.3em” }) // connect: dojo.connect(dojo.byId(“foo”), “onclick”, function(e){...}); // or connect: dojo.query(“#foo”).connect(“onclick”, function(e){ ... }); // or sugar: dojo.query(“#foo”).onclick(function(e){ ... }); © SitePen, Inc. 2008. All Rights Reserved
  • 11. Simple OO, Simulated Inheritance dojo.declare(“some.Person”, null, { name: ”default”, constructor: function(args){ dojo.mixin(this, args); } }); dojo.declare(“some.Employee”, some.Person, { employeeId: 0 }); var bob = new some.Person({ name:”Bob Bobson” }); var joy = new some.Employee({ name:”Joy”, employeeId:24 }); © SitePen, Inc. 2008. All Rights Reserved
  • 12. Package System == modular code And more... Works with Dojo and custom code Local: dojo.require(“dojo.io.script”); dojo.require(“my.Widget”); Robust: dojo.registerModulePath(“external”, “/external/js”); dojo.require(“external.Thinger”); Easy: dojo.provide(“my.Widget”); Ready: dojo.addOnLoad, .addOnUnLoad ... © SitePen, Inc. 2008. All Rights Reserved
  • 13. The Core © SitePen, Inc. 2008. All Rights Reserved
  • 14. More Patterns Use at will - everything additive. No dependency tracking - just dojo.require(“it”) Few, if any, “rules” Scale: Grows to t your needs © SitePen, Inc. 2008. All Rights Reserved
  • 15. Added Joy - a require() away dojo.data - Uni ed Data API dojo.dnd - Drag and Drop API dojo.fx / dojo.NodeList-fx - Additional Advanced FX dojo.i18n - Internationalization tools dojo.string, dojo.date, dojo.regexp - Common utility dojo.io.iframe, dojo.io.script, dojo.rpc - Advanced IO ... more: dojo.behavior, dojo.html, dojo.gears, dojo.cookie, dojo.parser, dojo.jaxer ... © SitePen, Inc. 2008. All Rights Reserved
  • 16. Additional Debugging FireBug Lite Shipped console.* provided in less sane browsers Load with djCon g = { isDebug:true } if(dojo.con g.isDebug){ .. } © SitePen, Inc. 2008. All Rights Reserved
  • 17. The Dojo Widget Framework © SitePen, Inc. 2008. All Rights Reserved
  • 18. Take Your Pick Compartmentalized Behavior using Existing Markup Fully dynamic, reusable Templated components Extend existing or Create ... © SitePen, Inc. 2008. All Rights Reserved
  • 19. Includes Suite of Widgets Layouts - Accordions, Tabs Form - Validation and more ... WYSIWYG Editor Tree, Sliders, ProgressBar ... © SitePen, Inc. 2008. All Rights Reserved
  • 20. Setup is Easy <html> <head> <title>index.html</title> <!-- some css --> <link rel=”stylesheet” href=”dojotoolkit/dijit/themes/tundra/tundra.css”> <script type=quot;text/javascriptquot; src=quot;dojotoolkit/dojo/dojo.jsquot;></script> </head> <body class=”tundra”> </body> </html> © SitePen, Inc. 2008. All Rights Reserved
  • 21. Flexible Instantiation // load the resource: dojo.require(“dijit.dijit”); // Base Dijit dojo.require(“dijit.Dialog”); // Dialog Code // create programatically: var myDialog = new dijit.Dialog({ title:”Login” }, “formArea”); <!-- or declaratively in markup --> <div id=”formArea” dojoType=”dijit.Dialog” title=”Login”> <p>...</p> </div> // access the instance: dijit.byId(“formArea”).show(); // myDialog.show(); © SitePen, Inc. 2008. All Rights Reserved
  • 22. CSS Driven Skinning Three full themes: Tundra Soria Nihilo Fully customizable Even easier with constraints: Embedded WebKit ? © SitePen, Inc. 2008. All Rights Reserved
  • 23. Full Localization (i18n) Support © SitePen, Inc. 2008. All Rights Reserved
  • 24. Full Accessibility (a11y) Support Screen reader support High contrast mode support Keyboard navigation ... with every Dijit © SitePen, Inc. 2008. All Rights Reserved
  • 25. Custom Widgets dojo.provide(“my.Widget”); dojo.require(“dijit._Widget”); dojo.require(“dijit._Templated”); // define: dojo.declare(“my.Widget”, [dijit._Widget, dijit._Templated], { value:”default”, templatePath: dojo.moduleUrl(“my.templates”, “Widget.html”, postCreate: function(args){ // init code } }); // instantiate: new my.Widget({ value:”bar” }, “someNode”); // declarative way: <input id=”someNode” dojoType=”my.Widget” value=”Foo”> © SitePen, Inc. 2008. All Rights Reserved
  • 26. Custom Extensions Leverage the Dijit widget system for speci c purposes Reuse Existing a11y and i18n code in Dijit © SitePen, Inc. 2008. All Rights Reserved
  • 27. Custom Widgets: Subclassing dojo.require(“dijit.Dialog”); // “subclassing”: dojo.declare(“my.Dialog”, dijit.Dialog, { canShow: true, show: function(){ if(this.canShow){ // then call inherited: this.inherited(arguments); } } }); var showable = new my.Dialog({ canShow: false }); © SitePen, Inc. 2008. All Rights Reserved
  • 28. Ultra Rapid Prototyping <div id=”foo” dojoType=”dijit.Dialog” title=”Hello”> <p> ... </p> <script type=”dojo/method” event=”hide”> // override instance’s hide() method ... test. </script> <script type=”dojo/connect” event=”show”> // monitor instance’s show() method ... </script> </div> © SitePen, Inc. 2008. All Rights Reserved
  • 29. Helping Designers /* Convenience Rules added to <html> element */ .mybox { width:250px; } /* love the quirks: */ .dj_ie6 .mybox { margin-right:1px } .dj_ie7 .mybox { margin-right:2px; } .dj_quirks .mybox { margin:3px; } © SitePen, Inc. 2008. All Rights Reserved
  • 30. © SitePen, Inc. 2008. All Rights Reserved
  • 31. Extensions, Extras, Experiments Extend Dijit: dojox.widget, dojox.layout, dojox.form Additional FX: dojox.fx Morph, Text, Extras ... Image Gadgets: FlickrBadge, Lightbox (Nano), SlideShow ... Comet: dojox.cometd Advanced IO: RPC, REST, SMD, ScriptFrame ... © SitePen, Inc. 2008. All Rights Reserved
  • 32. ... there’s more: DojoX GFX Cross-browser vector graphics GFX API, Charting: 2d / 3d, GFX Animation © SitePen, Inc. 2008. All Rights Reserved
  • 33. DojoX: DataGrid Fully dojo.data-Ready Lazy Row Selection,Virtual Scrolling Simplified Use: Layout Ready, Easy instantiation © SitePen, Inc. 2008. All Rights Reserved
  • 34. dojox.data Stores AndOrReadStore GoogleSearchStore AppStore HtmlStore AtomReadStore jsonPathStore CouchDBRestStore jsonRestStore CssRuleStore OpmlStore CsvStore QueryReadStore FileStore ServiceStore FlickrRestStore / S3Store FlickrStore WikipediaStore GoogleFeedStore XmlStore © SitePen, Inc. 2008. All Rights Reserved
  • 35. Other Goodies dojox.av - Audio / Video helpers dojox.dtl - django templating system implementation dojox.o , dojox.storage - O ine helpers dojox.lang - Advanced JS techniques dojox.xmpp - Full protocol implementation dojox.validate - Regexps + Functions ... much, much more! © SitePen, Inc. 2008. All Rights Reserved
  • 36. Simple Gems: Google Analytics Why Write This? <script type=quot;text/javascriptquot;> var gaJsHost = ((quot;https:quot; == document.location.protocol) ? quot;https://ssl.quot; : quot;http://www.quot;); document.write(unescape(quot;%3Cscript src='quot; + gaJsHost + quot;google- analytics.com/ga.js' type='text/javascript'%3E%3C/script%3Equot;)); </script> <script type=quot;text/javascriptquot;> var pageTracker = _gat._getTracker(quot;UA-xxxxxx-xquot;); pageTracker._trackPageview(); </script> © SitePen, Inc. 2008. All Rights Reserved
  • 37. Simple Gems: Google Analytics with Dojo Just Write This: // load the resource dojo.require(“dojox.analytics.Urchin”); <!-- and create in markup --> <div dojoType=”dojox.analytics.Urchin” acct=”12345-UA-23”></div> // or in script: new dojox.analytics.Urchin({ acct:”UA-xxxxx-x” }); © SitePen, Inc. 2008. All Rights Reserved
  • 38. in Production © SitePen, Inc. 2008. All Rights Reserved
  • 39. Dojo Build System Reduce number of HTTP requests Template Interning and resource concatenation Reduce JavaScript le size: Remove Comments and whitespace Variable obfuscation (ShrinkSafe) CSS Optimization Comment Removal @import “...” concatenation StripConsole options © SitePen, Inc. 2008. All Rights Reserved
  • 40. Advanced Builds Stubs Dojo (6k dojo.js) Custom Base “Layers” Automatic dependency tracking Cross-dependent layers RestoreRequire X-Domain Dojo - Local CDN BuildExclude syntax © SitePen, Inc. 2008. All Rights Reserved
  • 41. D.O.H - Unit test Suite Supports Build Up, Tear Down, sync or async Testing doh.robot - Automated UI Unit testing © SitePen, Inc. 2008. All Rights Reserved
  • 42. Resources © SitePen, Inc. 2008. All Rights Reserved
  • 43. Basic Documentation Full API Docs: http://api.dojotoolkit.org Full On-Line Docs: http://docs.dojocampus.org O ine Docs: http://sitepen.com/labs/toolbox Tutorials, Blogs, Examples: http://dojocampus.org © SitePen, Inc. 2008. All Rights Reserved
  • 44. Additional Documentation Dojo Dead Trees! © SitePen, Inc. 2008. All Rights Reserved
  • 45. That’s © SitePen, Inc. 2008. All Rights Reserved
  • 46. Questions? © SitePen, Inc. 2008. All Rights Reserved