Javascript: 8 Reasons Every PHP Developer Should Love It

Boy Baukema
Boy BaukemaSecurity Consultant at Veracode
JavaScript
8 Reasons Every PHP Developer Should Love It




                             Boy Baukema
                          24 January 2008


                                               1
Welcome!




           2
               2
What I’ll cover

-   8 Reasons to love JavaScript
-   JavaScript to PHP
-   Availability
-   Lambda functions & closures
-   Libraries
-   Future
-   Resources
-   Q&A



                                   3
                                       3
Gmail?




         4
             4
jQuery? Prototype.js? Dojo?




                              5
                                  5
Quirksmode.org?




                  6
                      6
JavaScript Evangelist @




                          7
                              7
1. JavaScript is misunderstood




                                 8
                                     8
2. JavaScript IS the web




                           9
                               9
3. JavaScript is EVERYWHERE

     Do we really need graceful degradation?




                                               10
                                                    10
3. JavaScript is EVERYWHERE




                              11
                                   11
3. JavaScript is EVERYWHERE




                              12
                                   12
3. JavaScript is EVERYWHERE




                              13
                                   13
3. JavaScript is EVERYWHERE




                              14
                                   14
3. JavaScript is EVERYWHERE




                              15
                                   15
4. JavaScript has lambda functions




             VS




                                     16
                                          16
4. JavaScript has lambda functions




                     VS




                                     17
                                          17
4. JavaScript has lambda functions



PHP 4 >= 4.0.1, PHP 5




                                     18
                                          18
4. JavaScript has lambda functions



PHP 5.3




                                     19
                                          19
4. JavaScript has lambda functions




                                     20
                                          20
4. JavaScript has lambda functions




                                     21
                                          21
5. JavaScript has closures


Javascript closure example




                             22
                                  22
5. JavaScript has closures



PHP closure




                             23
                                  23
5. JavaScript has closures


PHP closure continued...




“I never thought I'd say this, but I miss closures.”
- Marco Tabini, php|architect

                                                       24
                                                            24
6. JavaScript is different




                             25
                                  25
7. Small and easy to extend




                              26
                                   26
7. Small and easy to extend
                                                                                                             strcmp
                        array_walk_recursive   echo                        intval          nl2br             stripos
     abs
                        asinh                  empty                       in_array        number_format     stripslashes
acos
                        asin                   end                         ip2long         octdec            strip_tags
addslashes
                        atanh                  exit                        isset           ord               stristr
array
                        atan                   explode                     is_array        parse_str         strlen
array_change_key_case
                        base64_decode          exp                         is_bool         pi                strnatcmp
array_chunk
                        base64_encode          filesize                    is_double       pow               strncasecmp
array_combine
                        basename               file                        is_finite       preg_quote        strpbrk
array_count_values
                        base_convert           file_exists                 is_float        printf            strpos
array_diff
                        bin2hex                file_get_contents           is_infinite     print_r           strrev
array_diff_assoc
                        bindec                 floatval                    is_integer      property_exists   strripos
array_diff_key
                        call_user_func         floor                       is_int          quotemeta         strrpos
array_fill
                        call_user_func_array   fmod                        is_long         rad2deg           strspn
array_fill_keys
                        ceil                   function_exists             is_nan          rand              strstr
array_filter
                        checkdate              func_get_args               is_null         range             strtolower
array_flip
                        chop                   func_get_arg                is_numeric      require           strtotime
array_keys
                        chr                    func_num_args               is_object       require_once      strtoupper
array_key_exists
                        chunk_split            getdate                     is_scalar       reset             str_ireplace
array_map
                        class_exists           getrandmax                  is_string       round             str_pad
array_merge
                        compact                gettype                     join            rsort             str_repeat
array_merge_recursive
                        constant               get_class                   krsort          rtrim             str_replace
array_pad
                        cosh                   get_defined_functions       ksort           serialize         str_rot13
array_pop
                        cos                    get_defined_vars            lcg_value       setcookie         str_split
array_product
                        count                  get_headers                 levenshtein     sha1              substr
array_push
                        count_chars            get_html_translation_tabl   log10           sha1_file         substr_count
array_rand
                        crc32                  e                           log             shuffle           tanh
array_reduce
                        create_function        get_included_files          long2ip         sinh              tan
array_reverse
                        date                   hexdec                      ltrim           sin               time
array_search
                        decbin                 htmlentities                max             sizeof            trim
array_shift
                        dechex                 htmlspecialchars            md5             sleep             ucfirst
array_slice
                        decoct                 htmlspecialchars_decode     md5_file        sort              ucwords
array_splice
                        defined                html_entity_decode          method_exists   soundex           unserialize
array_sum
                        define                 http_build_query            microtime       split             urldecode
array_unique
                        deg2rad                hypot                       min             sprintf           urlencode
array_unshift
                        die                    implode                     mktime          sqrt              utf8_decode
array_values
                        dirname                include                     mt_getrandmax   strcasecmp        utf8_encode
array_walk
                        each                   include_once                mt_rand         strchr            var_export
                                                                                                             wordwrap


                                                                                                                            27
                                                                                                                                 27
8. JavaScript is the future


       “JavaScript is probably the most important
       language in the world today.“
       - Steve Yegge (ex-Amazon, now Google)


       “Our JIT compiler generates code that is roughly
       equivalent to the performance
       of unoptimized C code (gcc -O0).”
       - Andreas Gal, Mozilla Tracemonkey dev




                                                      28
                                                           28
Learn JavaScript!




                    29
                         29
8 Reasons

1. JavaScript is misunderstood
2. JavaScript IS the web
3. JavaScript is EVERYWHERE
4. JavaScript has lambda functions
5. JavaScript has closures
6. JavaScript is different
7. Small and easy to extend
8. JavaScript is the future
                                 30
                                      30
Thank you!
http://tinyurl.com/ilovejs
                 Contact details:
                     Boy Baukema
                 boy@ibuildings.nl
      http://twitter.com/relaxnow




                                     31
Questions ?




              32
                   32
1 of 32

Recommended

What lies beneath the beautiful code? by
What lies beneath the beautiful code?What lies beneath the beautiful code?
What lies beneath the beautiful code?Niranjan Sarade
3.7K views47 slides
Rapid Development with Ruby/JRuby and Rails by
Rapid Development with Ruby/JRuby and RailsRapid Development with Ruby/JRuby and Rails
Rapid Development with Ruby/JRuby and Railselliando dias
901 views45 slides
Perl intro by
Perl introPerl intro
Perl introSwapnesh Singh
745 views21 slides
Magic in ruby by
Magic in rubyMagic in ruby
Magic in rubyDavid Lin
1.8K views63 slides
Hijacking Ruby Syntax in Ruby by
Hijacking Ruby Syntax in RubyHijacking Ruby Syntax in Ruby
Hijacking Ruby Syntax in RubySATOSHI TAGOMORI
43.8K views59 slides
What is new and cool j2se & java by
What is new and cool j2se & javaWhat is new and cool j2se & java
What is new and cool j2se & javaEugene Bogaart
853 views55 slides

More Related Content

Viewers also liked

Vn Macro Jpn by
Vn Macro JpnVn Macro Jpn
Vn Macro JpnShusaku Hayakawa
500 views11 slides
July 2012 by
July 2012July 2012
July 2012Shusaku Hayakawa
453 views10 slides
Community labs vn 2009 jpn by
Community labs vn 2009 jpnCommunity labs vn 2009 jpn
Community labs vn 2009 jpnShusaku Hayakawa
489 views11 slides
Sync The World by
Sync The WorldSync The World
Sync The WorldShusaku Hayakawa
1K views39 slides
Hehehehtest by
HehehehtestHehehehtest
Hehehehtesttrent solant
235 views17 slides
Verifying Drupal modules with OWASP ASVS 2014 by
Verifying Drupal modules with OWASP ASVS 2014Verifying Drupal modules with OWASP ASVS 2014
Verifying Drupal modules with OWASP ASVS 2014Boy Baukema
713 views28 slides

Similar to Javascript: 8 Reasons Every PHP Developer Should Love It

Scilab vs matlab by
Scilab vs matlabScilab vs matlab
Scilab vs matlabDadan Bagenda
2.9K views12 slides
Construction Techniques For Domain Specific Languages by
Construction Techniques For Domain Specific LanguagesConstruction Techniques For Domain Specific Languages
Construction Techniques For Domain Specific LanguagesThoughtWorks
1K views133 slides
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov by
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Nayden Gochev
6.2K views129 slides
Hacking with ruby2ruby by
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2rubyMarc Chung
1.4K views60 slides
The Enterprise Strikes Back by
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes BackBurke Libbey
1.2K views171 slides
JRuby - Programmer's Best Friend on JVM by
JRuby - Programmer's Best Friend on JVMJRuby - Programmer's Best Friend on JVM
JRuby - Programmer's Best Friend on JVMRaimonds Simanovskis
1.6K views41 slides

Similar to Javascript: 8 Reasons Every PHP Developer Should Love It(20)

Construction Techniques For Domain Specific Languages by ThoughtWorks
Construction Techniques For Domain Specific LanguagesConstruction Techniques For Domain Specific Languages
Construction Techniques For Domain Specific Languages
ThoughtWorks1K views
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov by Nayden Gochev
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Nayden Gochev6.2K views
Hacking with ruby2ruby by Marc Chung
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
Marc Chung1.4K views
The Enterprise Strikes Back by Burke Libbey
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
Burke Libbey1.2K views
Scientific computing on jruby by Prasun Anand
Scientific computing on jrubyScientific computing on jruby
Scientific computing on jruby
Prasun Anand1.9K views
Aprendendo solid com exemplos by vinibaggio
Aprendendo solid com exemplosAprendendo solid com exemplos
Aprendendo solid com exemplos
vinibaggio1.1K views
How Scala code is expressed in the JVM by Koichi Sakata
How Scala code is expressed in the JVMHow Scala code is expressed in the JVM
How Scala code is expressed in the JVM
Koichi Sakata8.3K views
Angular Weekend by Troy Miles
Angular WeekendAngular Weekend
Angular Weekend
Troy Miles1.2K views
Profiling Ruby by Ian Pointer
Profiling RubyProfiling Ruby
Profiling Ruby
Ian Pointer2.3K views
A Post About Analyzing PHP by Andrey Karpov
A Post About Analyzing PHPA Post About Analyzing PHP
A Post About Analyzing PHP
Andrey Karpov285 views
RubyEnRails2007 - Dr Nic Williams - Keynote by Dr Nic Williams
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - Keynote
Dr Nic Williams2.8K views
Javascriptbootcamp by oscon2007
JavascriptbootcampJavascriptbootcamp
Javascriptbootcamp
oscon2007418 views
Fosdem2017 Scientific computing on Jruby by Prasun Anand
Fosdem2017  Scientific computing on JrubyFosdem2017  Scientific computing on Jruby
Fosdem2017 Scientific computing on Jruby
Prasun Anand1.6K views
Celery: The Distributed Task Queue by Richard Leland
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task Queue
Richard Leland7.2K views
ChakraCore: analysis of JavaScript-engine for Microsoft Edge by PVS-Studio
ChakraCore: analysis of JavaScript-engine for Microsoft EdgeChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
PVS-Studio241 views

More from Boy Baukema

Security horrors by
Security horrorsSecurity horrors
Security horrorsBoy Baukema
133 views36 slides
Tampering with JavaScript by
Tampering with JavaScriptTampering with JavaScript
Tampering with JavaScriptBoy Baukema
140 views26 slides
Code by the sea: Web Application Security by
Code by the sea: Web Application SecurityCode by the sea: Web Application Security
Code by the sea: Web Application SecurityBoy Baukema
324 views46 slides
Ibuildings ISO 27001 lunchbox by
Ibuildings ISO 27001 lunchboxIbuildings ISO 27001 lunchbox
Ibuildings ISO 27001 lunchboxBoy Baukema
204 views19 slides
OWASP ASVS 3 - What's new for level 1? by
OWASP ASVS 3 - What's new for level 1?OWASP ASVS 3 - What's new for level 1?
OWASP ASVS 3 - What's new for level 1?Boy Baukema
774 views38 slides
Secure Drupal, from start to finish by
Secure Drupal, from start to finishSecure Drupal, from start to finish
Secure Drupal, from start to finishBoy Baukema
532 views46 slides

More from Boy Baukema(12)

Security horrors by Boy Baukema
Security horrorsSecurity horrors
Security horrors
Boy Baukema133 views
Tampering with JavaScript by Boy Baukema
Tampering with JavaScriptTampering with JavaScript
Tampering with JavaScript
Boy Baukema140 views
Code by the sea: Web Application Security by Boy Baukema
Code by the sea: Web Application SecurityCode by the sea: Web Application Security
Code by the sea: Web Application Security
Boy Baukema324 views
Ibuildings ISO 27001 lunchbox by Boy Baukema
Ibuildings ISO 27001 lunchboxIbuildings ISO 27001 lunchbox
Ibuildings ISO 27001 lunchbox
Boy Baukema204 views
OWASP ASVS 3 - What's new for level 1? by Boy Baukema
OWASP ASVS 3 - What's new for level 1?OWASP ASVS 3 - What's new for level 1?
OWASP ASVS 3 - What's new for level 1?
Boy Baukema774 views
Secure Drupal, from start to finish by Boy Baukema
Secure Drupal, from start to finishSecure Drupal, from start to finish
Secure Drupal, from start to finish
Boy Baukema532 views
Security as a part of quality assurance by Boy Baukema
Security as a part of quality assuranceSecurity as a part of quality assurance
Security as a part of quality assurance
Boy Baukema912 views
Recursive descent parsing by Boy Baukema
Recursive descent parsingRecursive descent parsing
Recursive descent parsing
Boy Baukema5.7K views
Dpc14 security as part of Quality Assurance by Boy Baukema
Dpc14   security as part of Quality AssuranceDpc14   security as part of Quality Assurance
Dpc14 security as part of Quality Assurance
Boy Baukema459 views
SURFconext and Mobile by Boy Baukema
SURFconext and MobileSURFconext and Mobile
SURFconext and Mobile
Boy Baukema669 views
WebAppSec @ Ibuildings in 2014 by Boy Baukema
WebAppSec @ Ibuildings in 2014WebAppSec @ Ibuildings in 2014
WebAppSec @ Ibuildings in 2014
Boy Baukema1.6K views
Let's build a parser! by Boy Baukema
Let's build a parser!Let's build a parser!
Let's build a parser!
Boy Baukema11.1K views

Recently uploaded

Serverless computing with Google Cloud (2023-24) by
Serverless computing with Google Cloud (2023-24)Serverless computing with Google Cloud (2023-24)
Serverless computing with Google Cloud (2023-24)wesley chun
11 views33 slides
Melek BEN MAHMOUD.pdf by
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 slide
PharoJS - Zürich Smalltalk Group Meetup November 2023 by
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023Noury Bouraqadi
132 views17 slides
Uni Systems for Power Platform.pptx by
Uni Systems for Power Platform.pptxUni Systems for Power Platform.pptx
Uni Systems for Power Platform.pptxUni Systems S.M.S.A.
56 views21 slides
Case Study Copenhagen Energy and Business Central.pdf by
Case Study Copenhagen Energy and Business Central.pdfCase Study Copenhagen Energy and Business Central.pdf
Case Study Copenhagen Energy and Business Central.pdfAitana
16 views3 slides
20231123_Camunda Meetup Vienna.pdf by
20231123_Camunda Meetup Vienna.pdf20231123_Camunda Meetup Vienna.pdf
20231123_Camunda Meetup Vienna.pdfPhactum Softwareentwicklung GmbH
41 views73 slides

Recently uploaded(20)

Serverless computing with Google Cloud (2023-24) by wesley chun
Serverless computing with Google Cloud (2023-24)Serverless computing with Google Cloud (2023-24)
Serverless computing with Google Cloud (2023-24)
wesley chun11 views
PharoJS - Zürich Smalltalk Group Meetup November 2023 by Noury Bouraqadi
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023
Noury Bouraqadi132 views
Case Study Copenhagen Energy and Business Central.pdf by Aitana
Case Study Copenhagen Energy and Business Central.pdfCase Study Copenhagen Energy and Business Central.pdf
Case Study Copenhagen Energy and Business Central.pdf
Aitana16 views
Voice Logger - Telephony Integration Solution at Aegis by Nirmal Sharma
Voice Logger - Telephony Integration Solution at AegisVoice Logger - Telephony Integration Solution at Aegis
Voice Logger - Telephony Integration Solution at Aegis
Nirmal Sharma39 views
TouchLog: Finger Micro Gesture Recognition Using Photo-Reflective Sensors by sugiuralab
TouchLog: Finger Micro Gesture Recognition  Using Photo-Reflective SensorsTouchLog: Finger Micro Gesture Recognition  Using Photo-Reflective Sensors
TouchLog: Finger Micro Gesture Recognition Using Photo-Reflective Sensors
sugiuralab21 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely25 views
STPI OctaNE CoE Brochure.pdf by madhurjyapb
STPI OctaNE CoE Brochure.pdfSTPI OctaNE CoE Brochure.pdf
STPI OctaNE CoE Brochure.pdf
madhurjyapb14 views
HTTP headers that make your website go faster - devs.gent November 2023 by Thijs Feryn
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023
Thijs Feryn22 views
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by Dr. Jimmy Schwarzkopf
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院 by IttrainingIttraining
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院

Javascript: 8 Reasons Every PHP Developer Should Love It

  • 1. JavaScript 8 Reasons Every PHP Developer Should Love It Boy Baukema 24 January 2008 1
  • 2. Welcome! 2 2
  • 3. What I’ll cover - 8 Reasons to love JavaScript - JavaScript to PHP - Availability - Lambda functions & closures - Libraries - Future - Resources - Q&A 3 3
  • 4. Gmail? 4 4
  • 8. 1. JavaScript is misunderstood 8 8
  • 9. 2. JavaScript IS the web 9 9
  • 10. 3. JavaScript is EVERYWHERE Do we really need graceful degradation? 10 10
  • 11. 3. JavaScript is EVERYWHERE 11 11
  • 12. 3. JavaScript is EVERYWHERE 12 12
  • 13. 3. JavaScript is EVERYWHERE 13 13
  • 14. 3. JavaScript is EVERYWHERE 14 14
  • 15. 3. JavaScript is EVERYWHERE 15 15
  • 16. 4. JavaScript has lambda functions VS 16 16
  • 17. 4. JavaScript has lambda functions VS 17 17
  • 18. 4. JavaScript has lambda functions PHP 4 >= 4.0.1, PHP 5 18 18
  • 19. 4. JavaScript has lambda functions PHP 5.3 19 19
  • 20. 4. JavaScript has lambda functions 20 20
  • 21. 4. JavaScript has lambda functions 21 21
  • 22. 5. JavaScript has closures Javascript closure example 22 22
  • 23. 5. JavaScript has closures PHP closure 23 23
  • 24. 5. JavaScript has closures PHP closure continued... “I never thought I'd say this, but I miss closures.” - Marco Tabini, php|architect 24 24
  • 25. 6. JavaScript is different 25 25
  • 26. 7. Small and easy to extend 26 26
  • 27. 7. Small and easy to extend strcmp array_walk_recursive echo intval nl2br stripos abs asinh empty in_array number_format stripslashes acos asin end ip2long octdec strip_tags addslashes atanh exit isset ord stristr array atan explode is_array parse_str strlen array_change_key_case base64_decode exp is_bool pi strnatcmp array_chunk base64_encode filesize is_double pow strncasecmp array_combine basename file is_finite preg_quote strpbrk array_count_values base_convert file_exists is_float printf strpos array_diff bin2hex file_get_contents is_infinite print_r strrev array_diff_assoc bindec floatval is_integer property_exists strripos array_diff_key call_user_func floor is_int quotemeta strrpos array_fill call_user_func_array fmod is_long rad2deg strspn array_fill_keys ceil function_exists is_nan rand strstr array_filter checkdate func_get_args is_null range strtolower array_flip chop func_get_arg is_numeric require strtotime array_keys chr func_num_args is_object require_once strtoupper array_key_exists chunk_split getdate is_scalar reset str_ireplace array_map class_exists getrandmax is_string round str_pad array_merge compact gettype join rsort str_repeat array_merge_recursive constant get_class krsort rtrim str_replace array_pad cosh get_defined_functions ksort serialize str_rot13 array_pop cos get_defined_vars lcg_value setcookie str_split array_product count get_headers levenshtein sha1 substr array_push count_chars get_html_translation_tabl log10 sha1_file substr_count array_rand crc32 e log shuffle tanh array_reduce create_function get_included_files long2ip sinh tan array_reverse date hexdec ltrim sin time array_search decbin htmlentities max sizeof trim array_shift dechex htmlspecialchars md5 sleep ucfirst array_slice decoct htmlspecialchars_decode md5_file sort ucwords array_splice defined html_entity_decode method_exists soundex unserialize array_sum define http_build_query microtime split urldecode array_unique deg2rad hypot min sprintf urlencode array_unshift die implode mktime sqrt utf8_decode array_values dirname include mt_getrandmax strcasecmp utf8_encode array_walk each include_once mt_rand strchr var_export wordwrap 27 27
  • 28. 8. JavaScript is the future “JavaScript is probably the most important language in the world today.“ - Steve Yegge (ex-Amazon, now Google) “Our JIT compiler generates code that is roughly equivalent to the performance of unoptimized C code (gcc -O0).” - Andreas Gal, Mozilla Tracemonkey dev 28 28
  • 30. 8 Reasons 1. JavaScript is misunderstood 2. JavaScript IS the web 3. JavaScript is EVERYWHERE 4. JavaScript has lambda functions 5. JavaScript has closures 6. JavaScript is different 7. Small and easy to extend 8. JavaScript is the future 30 30
  • 31. Thank you! http://tinyurl.com/ilovejs Contact details: Boy Baukema boy@ibuildings.nl http://twitter.com/relaxnow 31
  • 32. Questions ? 32 32