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

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 
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...apidays
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
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.pdfsudhanshuwaghmare1
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
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 businesspanagenda
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
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.pdfUK Journal
 
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, ...apidays
 
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 WoodJuan lago vázquez
 

Recently uploaded (20)

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - 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...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
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
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
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
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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
 
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, ...
 
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
 

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