SlideShare a Scribd company logo
1 of 66
Download to read offline
http://qooxdoo.org


        1
EXAMPLES




   2
EXAMPLES




   3
EXAMPLES




   4
5
IT'S NOT A TOY




      6
IT'S NOT A TOY

                     let's count files:

Penny:downloads singles$ wget http://downloads..../qooxdoo-1.5-sdk.zip
[...]
HTTP request sent, awaiting response... 200 OK
Length: 67875249 (65M) [application/zip] !!!
Saving to: `qooxdoo-1.5-sdk.zip'

100%[=======================================>] 67,875,249      616K/s   in 96s

2011-10-01 19:10:51 (693 KB/s) - `qooxdoo-1.5-sdk.zip' saved
[67875249/67875249]

Penny:downloads singles$ tar -xf qooxdoo-1.5-sdk.zip
Penny:downloads singles$ ls -R qooxdoo-1.5-sdk | wc -l
   15517 !!! (includes test files, icons for 3 themes etc.)




                                     7
IT'S NOT A TOY

let's see example api page:




             8
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                        9
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',                                     class type
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                        10
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,                        inheritance
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                       11
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],         interfaces
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                       12
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],                             mixins !
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                        13
IT'S NOT A TOY

              let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",                          like C#, but better :)
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {
        _onError : function() {
            this.showError(Tools.tr("io.request:error"));
        },
    }
});



                                       14
IT'S NOT A TOY

                let's see some code:
qx.Class.define("foo.lib.io.HttpRequest",
{
    type: 'abstract',
    extend : qx.io.request.Xhr,
    implement: [IFooInterface, IBarInterface],
    include : [app.MMessage],
    properties : {
        showLoadingDialog : {
            check : "Boolean",
            init : true
        }
    },
    construct : function(vUrl, vMethod) {
        this.base(arguments, vUrl);
        this.addListener("fail", this._onError, this);
    },
    members : {                                               protected member
                                                              (also private & public)
          _onError : function() {
              this.showError(Tools.tr("io.request:error"));
          },
      }
});



                                         15
OVERENGINERED?




      16
OVERENGINERED?

     NO.




      17
OVERENGINERED?

     NO.

WELL DESIGNED!


      18
BUT!




 19
BUT!

YOU HAVE TO KNOW WHAT
    YOU ARE DOING



          20
BUT!

YOU HAVE TO KNOW WHAT
    YOU ARE DOING

   IN ANOTHER CASE...

           21
22
QOOXDOO
    =
FRAMEWORK
    +
GUI TOOLKIT

     23
LOT OF FEATURES




       24
LOT OF FEATURES

BUT WE DON'T HAVE TIME
 TO TALK ABOUT ALL OF
       THEM, SO...



          25
LOT OF FEATURES

BUT WE DON'T HAVE TIME
 TO TALK ABOUT ALL OF
       THEM, SO...

 HTTP://QOOXDOO.ORG/ABOUT


            26
THINGS WORTH
MENTIONING *


               * IMHO
     27
DOCUMENTATION




      28
DOCUMENTATION




      463pages
    justmanual
  withoutapidocs


                 29
DOCUMENTATION



   + DEMOS

+ PLAYGROUND
 (RIA  MOBILE)

       30
MIXINS




  31
MIXINS




Something like interfaces, but
   with implementation.



              32
MIXINS

qx.Mixin.define(foo.lib.tools.MAwesomeLogger,
{
  members : {
    logWithTrace : function(what) {
      console.log(what);
      console.trace();
    }
  }
});

qx.Class.define(foo.app.Bar,
{
  include: [foo.lib.tools.MAwesomeLogger],
  construct: function() {
    this.logWithTrace(this);
  }
}




                                     33
PROPERTIES




    34
35
qx.Class.define('foo.bar', {
  extend: qx.core.Object,
  properties: {
    phrase: {                              // autogenerate setter and getter and ...
      apply: '_applyPhrase'                // fire on property modification (not init!) - return
                                           // value is ignored

      nullable: true,                      //   can be null
      event: 'someEvent'                   //   default changeFoo - fires on property change
      check: ['suit up', 'bazinga'],       //   check possible inserts, also could be defined as a
                                           //   function - works only in development!

      transform: '_transformPhrase'        // transform value - BEFORE check and apply
      validate: qx.util.Validate.string    // works in development and production
    },
    awesome:   { init: false, check: 'Boolean' }
    nerd:      { init: false, check: 'Boolean' }
  },
  members: {
     _transformPhrase: function(value) {
       return value + '!';
     }
     _applyPhrase: function(value, old, name) {
       if (value === 'suit up!') {
         this.toggleAwesome('awesome');
       } else if (value === 'bazinga!') {
         this.toggleAwesome('nerd');
       }
     }
  }
});



                                                   36
LOT OF CONSISTENT(!) GUI
     COMPONENTS



           37
GUI COMPONENTS




      38
GUI COMPONENTS




      39
GUI COMPONENTS




      40
GUI COMPONENTS




      41
GUI COMPONENTS




Themeable of course ;)




          42
EASY KEY/COMMANDS
      BINDING



        43
EASY KEY/COMMANDS BINDING

var findWindow = new qx.ui.window.Window('search');
//findWindow configuration...

var find = new qx.event.Command(Ctrl+F),
    close = new qx.event.Command('Esc');

find.addListener(execute, function() {
  findWindow.open();
}, this);
close.addListener(execute, function() {
  findWindow.close();
}, this);




                           44
EASY ELEMENTS
  POSITIONING
(WITH LAYOUTS)



      45
EASY ELEMENTS POSITIONING




           46
EASY REST CALLS




       47
EASY REST CALLS
var description = {
  index:    { method: GET, url: /photos }
  create:   { method: POST, url: /photos }
  show:     { method: GET, url: /photos/:id }
  update:   { method: PUT, url: /photos/:id }
}
var photos = new qx.io.rest.Resource(description); //declaratively
photos.map('destroy', 'DELETE', '/photos/:id');    //programatically
photos.index(); // -- GET /photos
photos.show({id: 1}); // -- GET /photos/1

// success is fired when any request associated to resource receives a
response
photos.addListener(success, function(e) {
  e.getAction(); // -- index or show
});

// indexSuccess is fired when the request associated to the index action
receives a response
photos.addListener(indexSuccess, function(e) {
  e.getAction(); // -- index
});



                                       48
HTML EDITOR
OUT OF THE BOX



      49
HTML EDITOR




The html editor does have some issues. Just not to give the impression
that it would try to compete with more advanced editors like ckEditor,
     etc., because it doesn't. Still fine for many products, though.
                             [Andreas Ecker]

                                50
ADVANCED BUILD TOOL




         51
ADVANCED BUILD TOOL

Penny:frontend singles$ ./generate.py list
 Available jobs:
  - api     -- create api doc for the current library
  - api-data     -- create api doc json data files
  - build
  - clean -- remove local cache and generated .js files (source/build)
  - distclean    -- remove the cache and all generated artefacts of this library (source,
build, ...)
  - fix     -- normalize whitespace in .js files of the current library (tabs, eol, ...)
  - info    -- collects environment information like the qooxdoo version etc., and prints it out
  - inspector    -- create an inspector instance in the current library
  - lint    -- check the source code of the .js files of the current library
  - migration    -- migrate the .js files of the current library to the current qooxdoo version
  - pretty
  - profiling    -- includer job, to activate profiling
  - simulation-build       -- (experimental) create a runner app for simulated interaction tests
  - simulation-run    -- (experimental) launches simulated interaction tests generated with
simulation-build
  - source
  - source-all -- create source version of current application, with all classes
  - source-hybrid     -- create a hybrid version (app classes as source files, others compiled)
  - test    -- create a test runner app for unit tests of the current library
  - test-source       -- create a test runner app for unit tests (source version) of the current
library
  - translation       -- create .po files for current library




                                               52
WORKS:
 STANDALONE (IN BROWSER),
INSIDE EXISTING WEBPAGES OR
   NATIVE (WITHOUT GUI)




            53
MOBILE SUPPORT




      54
MOBILE SUPPORT




      55
DEVELOPER FRIENDLY
  (TESTS  TOOLS)




        56
DEVELOPER FRIENDLY




        57
DEVELOPER FRIENDLY




        58
LOCALIZATION AND
  TRANSLATION



       59
AND MUCH MORE...




       60
WAIT W AIT. I T L OOKS L IKE I
CAN U SE I T J UST F OR U GLY A N
  BORING W EB A PPLICATIONS


                                         61
NOT REALLY...




      62
HTTP://WWW.LORDOFULTIMA.COM/EN/

              63
QUESTIONS?




    64
THANKS!




   65
name: Radosław Benkel
                                   nick: singles
                                   www: http://www.rbenkel.me
                                   twitter: @singlespl




* and I have nothing in common with http://www.singles.pl ;]


                                              66

More Related Content

What's hot

The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
Reactive, component 그리고 angular2
Reactive, component 그리고  angular2Reactive, component 그리고  angular2
Reactive, component 그리고 angular2Jeado Ko
 
Workshop 5: JavaScript testing
Workshop 5: JavaScript testingWorkshop 5: JavaScript testing
Workshop 5: JavaScript testingVisual Engineering
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.jsMatthew Beale
 
AngularJS Animations
AngularJS AnimationsAngularJS Animations
AngularJS AnimationsEyal Vardi
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS ArchitectureEyal Vardi
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript ConceptsNaresh Kumar
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneRafael Felix da Silva
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Konstantin Kudryashov
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
 
AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.Yan Yankowski
 
Practical JavaScript Programming - Session 1/8
Practical JavaScript Programming - Session 1/8Practical JavaScript Programming - Session 1/8
Practical JavaScript Programming - Session 1/8Wilson Su
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUIAdam Lu
 
Introductionandgreetings
IntroductionandgreetingsIntroductionandgreetings
IntroductionandgreetingsPozz ZaRat
 

What's hot (20)

The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
Reactive, component 그리고 angular2
Reactive, component 그리고  angular2Reactive, component 그리고  angular2
Reactive, component 그리고 angular2
 
Workshop 5: JavaScript testing
Workshop 5: JavaScript testingWorkshop 5: JavaScript testing
Workshop 5: JavaScript testing
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.js
 
AngularJS Animations
AngularJS AnimationsAngularJS Animations
AngularJS Animations
 
Introduccion a Jasmin
Introduccion a JasminIntroduccion a Jasmin
Introduccion a Jasmin
 
Workshop 10: ECMAScript 6
Workshop 10: ECMAScript 6Workshop 10: ECMAScript 6
Workshop 10: ECMAScript 6
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS Architecture
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript Concepts
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Jason parsing
Jason parsingJason parsing
Jason parsing
 
Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
Ruby - Design patterns tdc2011
Ruby - Design patterns tdc2011Ruby - Design patterns tdc2011
Ruby - Design patterns tdc2011
 
AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.AngularJs $provide API internals & circular dependency problem.
AngularJs $provide API internals & circular dependency problem.
 
Practical JavaScript Programming - Session 1/8
Practical JavaScript Programming - Session 1/8Practical JavaScript Programming - Session 1/8
Practical JavaScript Programming - Session 1/8
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUI
 
Introductionandgreetings
IntroductionandgreetingsIntroductionandgreetings
Introductionandgreetings
 

Similar to meet.js - QooXDoo

How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js frameworkBen Lin
 
Javascript Frameworks for Joomla
Javascript Frameworks for JoomlaJavascript Frameworks for Joomla
Javascript Frameworks for JoomlaLuke Summerfield
 
Bonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsBonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsFrancois Zaninotto
 
The next step, part 2
The next step, part 2The next step, part 2
The next step, part 2Pat Cavit
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScriptAndrew Dupont
 
Intro programacion funcional
Intro programacion funcionalIntro programacion funcional
Intro programacion funcionalNSCoder Mexico
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgetsscottw
 
Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPressAvinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPresswpnepal
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejsNick Lee
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
Orlando BarCamp Why Javascript Doesn't Suck
Orlando BarCamp Why Javascript Doesn't SuckOrlando BarCamp Why Javascript Doesn't Suck
Orlando BarCamp Why Javascript Doesn't Suckerockendude
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - ServicesNir Kaufman
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery ApplicationsRebecca Murphey
 
Heroku pop-behind-the-sense
Heroku pop-behind-the-senseHeroku pop-behind-the-sense
Heroku pop-behind-the-senseBen Lin
 

Similar to meet.js - QooXDoo (20)

How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
Javascript Frameworks for Joomla
Javascript Frameworks for JoomlaJavascript Frameworks for Joomla
Javascript Frameworks for Joomla
 
JDK Power Tools
JDK Power ToolsJDK Power Tools
JDK Power Tools
 
Bonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node jsBonnes pratiques de développement avec Node js
Bonnes pratiques de développement avec Node js
 
The next step, part 2
The next step, part 2The next step, part 2
The next step, part 2
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Rails is not just Ruby
Rails is not just RubyRails is not just Ruby
Rails is not just Ruby
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
 
Metaprogramming in ES6
Metaprogramming in ES6Metaprogramming in ES6
Metaprogramming in ES6
 
Intro programacion funcional
Intro programacion funcionalIntro programacion funcional
Intro programacion funcional
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgets
 
Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPressAvinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPress
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejs
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Orlando BarCamp Why Javascript Doesn't Suck
Orlando BarCamp Why Javascript Doesn't SuckOrlando BarCamp Why Javascript Doesn't Suck
Orlando BarCamp Why Javascript Doesn't Suck
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - Services
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Building Large jQuery Applications
Building Large jQuery ApplicationsBuilding Large jQuery Applications
Building Large jQuery Applications
 
Heroku pop-behind-the-sense
Heroku pop-behind-the-senseHeroku pop-behind-the-sense
Heroku pop-behind-the-sense
 

Recently uploaded

Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 

Recently uploaded (20)

Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 

meet.js - QooXDoo

  • 5. 5
  • 6. IT'S NOT A TOY 6
  • 7. IT'S NOT A TOY let's count files: Penny:downloads singles$ wget http://downloads..../qooxdoo-1.5-sdk.zip [...] HTTP request sent, awaiting response... 200 OK Length: 67875249 (65M) [application/zip] !!! Saving to: `qooxdoo-1.5-sdk.zip' 100%[=======================================>] 67,875,249 616K/s in 96s 2011-10-01 19:10:51 (693 KB/s) - `qooxdoo-1.5-sdk.zip' saved [67875249/67875249] Penny:downloads singles$ tar -xf qooxdoo-1.5-sdk.zip Penny:downloads singles$ ls -R qooxdoo-1.5-sdk | wc -l 15517 !!! (includes test files, icons for 3 themes etc.) 7
  • 8. IT'S NOT A TOY let's see example api page: 8
  • 9. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 9
  • 10. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', class type extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 10
  • 11. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, inheritance implement: [IFooInterface, IBarInterface], include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 11
  • 12. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], interfaces include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 12
  • 13. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], include : [app.MMessage], mixins ! properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 13
  • 14. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", like C#, but better :) init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 14
  • 15. IT'S NOT A TOY let's see some code: qx.Class.define("foo.lib.io.HttpRequest", { type: 'abstract', extend : qx.io.request.Xhr, implement: [IFooInterface, IBarInterface], include : [app.MMessage], properties : { showLoadingDialog : { check : "Boolean", init : true } }, construct : function(vUrl, vMethod) { this.base(arguments, vUrl); this.addListener("fail", this._onError, this); }, members : { protected member (also private & public) _onError : function() { this.showError(Tools.tr("io.request:error")); }, } }); 15
  • 17. OVERENGINERED? NO. 17
  • 18. OVERENGINERED? NO. WELL DESIGNED! 18
  • 20. BUT! YOU HAVE TO KNOW WHAT YOU ARE DOING 20
  • 21. BUT! YOU HAVE TO KNOW WHAT YOU ARE DOING IN ANOTHER CASE... 21
  • 22. 22
  • 23. QOOXDOO = FRAMEWORK + GUI TOOLKIT 23
  • 25. LOT OF FEATURES BUT WE DON'T HAVE TIME TO TALK ABOUT ALL OF THEM, SO... 25
  • 26. LOT OF FEATURES BUT WE DON'T HAVE TIME TO TALK ABOUT ALL OF THEM, SO... HTTP://QOOXDOO.ORG/ABOUT 26
  • 29. DOCUMENTATION 463pages justmanual withoutapidocs 29
  • 30. DOCUMENTATION + DEMOS + PLAYGROUND (RIA MOBILE) 30
  • 32. MIXINS Something like interfaces, but with implementation. 32
  • 33. MIXINS qx.Mixin.define(foo.lib.tools.MAwesomeLogger, { members : { logWithTrace : function(what) { console.log(what); console.trace(); } } }); qx.Class.define(foo.app.Bar, { include: [foo.lib.tools.MAwesomeLogger], construct: function() { this.logWithTrace(this); } } 33
  • 35. 35
  • 36. qx.Class.define('foo.bar', { extend: qx.core.Object, properties: { phrase: { // autogenerate setter and getter and ... apply: '_applyPhrase' // fire on property modification (not init!) - return // value is ignored nullable: true, // can be null event: 'someEvent' // default changeFoo - fires on property change check: ['suit up', 'bazinga'], // check possible inserts, also could be defined as a // function - works only in development! transform: '_transformPhrase' // transform value - BEFORE check and apply validate: qx.util.Validate.string // works in development and production }, awesome: { init: false, check: 'Boolean' } nerd: { init: false, check: 'Boolean' } }, members: { _transformPhrase: function(value) { return value + '!'; } _applyPhrase: function(value, old, name) { if (value === 'suit up!') { this.toggleAwesome('awesome'); } else if (value === 'bazinga!') { this.toggleAwesome('nerd'); } } } }); 36
  • 37. LOT OF CONSISTENT(!) GUI COMPONENTS 37
  • 43. EASY KEY/COMMANDS BINDING 43
  • 44. EASY KEY/COMMANDS BINDING var findWindow = new qx.ui.window.Window('search'); //findWindow configuration... var find = new qx.event.Command(Ctrl+F), close = new qx.event.Command('Esc'); find.addListener(execute, function() { findWindow.open(); }, this); close.addListener(execute, function() { findWindow.close(); }, this); 44
  • 45. EASY ELEMENTS POSITIONING (WITH LAYOUTS) 45
  • 48. EASY REST CALLS var description = { index: { method: GET, url: /photos } create: { method: POST, url: /photos } show: { method: GET, url: /photos/:id } update: { method: PUT, url: /photos/:id } } var photos = new qx.io.rest.Resource(description); //declaratively photos.map('destroy', 'DELETE', '/photos/:id'); //programatically photos.index(); // -- GET /photos photos.show({id: 1}); // -- GET /photos/1 // success is fired when any request associated to resource receives a response photos.addListener(success, function(e) { e.getAction(); // -- index or show }); // indexSuccess is fired when the request associated to the index action receives a response photos.addListener(indexSuccess, function(e) { e.getAction(); // -- index }); 48
  • 49. HTML EDITOR OUT OF THE BOX 49
  • 50. HTML EDITOR The html editor does have some issues. Just not to give the impression that it would try to compete with more advanced editors like ckEditor, etc., because it doesn't. Still fine for many products, though. [Andreas Ecker] 50
  • 52. ADVANCED BUILD TOOL Penny:frontend singles$ ./generate.py list Available jobs: - api -- create api doc for the current library - api-data -- create api doc json data files - build - clean -- remove local cache and generated .js files (source/build) - distclean -- remove the cache and all generated artefacts of this library (source, build, ...) - fix -- normalize whitespace in .js files of the current library (tabs, eol, ...) - info -- collects environment information like the qooxdoo version etc., and prints it out - inspector -- create an inspector instance in the current library - lint -- check the source code of the .js files of the current library - migration -- migrate the .js files of the current library to the current qooxdoo version - pretty - profiling -- includer job, to activate profiling - simulation-build -- (experimental) create a runner app for simulated interaction tests - simulation-run -- (experimental) launches simulated interaction tests generated with simulation-build - source - source-all -- create source version of current application, with all classes - source-hybrid -- create a hybrid version (app classes as source files, others compiled) - test -- create a test runner app for unit tests of the current library - test-source -- create a test runner app for unit tests (source version) of the current library - translation -- create .po files for current library 52
  • 53. WORKS: STANDALONE (IN BROWSER), INSIDE EXISTING WEBPAGES OR NATIVE (WITHOUT GUI) 53
  • 56. DEVELOPER FRIENDLY (TESTS TOOLS) 56
  • 59. LOCALIZATION AND TRANSLATION 59
  • 61. WAIT W AIT. I T L OOKS L IKE I CAN U SE I T J UST F OR U GLY A N BORING W EB A PPLICATIONS 61
  • 65. THANKS! 65
  • 66. name: Radosław Benkel nick: singles www: http://www.rbenkel.me twitter: @singlespl * and I have nothing in common with http://www.singles.pl ;] 66