SlideShare a Scribd company logo
1 of 28
Search my social circle…




STANLEY . F    STANLEY . N    KEUNG . H     STEVE . N


   Facebook Mobile Hack Hong Kong - 22nd March 2012
Current facebook search bar can only search people, pages, events, etc




                                                               page 2
But can we search by user profile details?




                                             page 3
Can we search by the comments?




                                 page 4
Can we search by the event details?




                                      page 5
Build a search engine for my social circle!

          ONLY in JAVASCRIPT!
Our Idea
• Crawl data from my social circle provided by Facebook Graph API
• Build inverted index from the content




                                                            page 7
Why Javascript?

   We love Javascript!

   To demonstrate how powerful Javascript can
    be

   For a facebook application, it should be more
    ethical to process users’ data in client side




                                              page 8
Benefits of Client Side Indexing

   Computation power and storage is now off-
    loaded to client side browsers

   facebook does not need to manage the huge
    amount of index data

   The search result is very personalized!
    You are searching for your own data and that
    is what you are interested in!


                                             page 9
Demo
Auto-complete
Query: “baby” – search all objects containing “baby”
We are searching facebook
objects based on the content!
Query: “birthday @photos” – search all photos object containing “birthday”
Query: “single @profile” – search all profile object containing “single”
Challenges

   Indexing performance

   Persistent storage for index

   Implementing inverted index algorithm




                                            page 17
Web Workers   Web DB




                 page 18
Indexing Performance

   For each user, we do a batch API call to
    Graph API already
   However, it still takes on average 3.8
    seconds for the data to return
   Most of my friends has around 300 friends
   So it takes 19 minutes to complete the
    crawling!?!?!?




                                            page 19
Web Workers come to save me!
                                   Time to index 100 facebook users
                 400


                 350


                 300
Time (seconds)




                 250


                 200


                 150


                 100


                  50


                  0
                       1   2   3    4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20
                                                    Number of web workers




                                                                                                         page 20
Web Workers


    Web Workers,
forked by main thread




 Crawl data and
 build sub-index




                            Main thread
                        merge all sub-indices



                                                page 21
Web Workers

   Web workers has much limitation, e.g. you
    cannot access the DOM
   You also cannot import the facebook SDK or
    jQuery library. It DOES NOT WORK!
   Luckily, you can still use the most
    fundamental function - xmlhttprequest
   So we have to use xmlhttprequest to
    simulate the FB.api function in batch mode



                                           page 22
Web DB

   Web DB provides us a solution for permanent
    offline storage
   My friends list has 556 users
   Generating a search index having ~18,000
    English keywords
   Only takes less than a second to save and
    load from the Web DB




                                           page 23
Problems still need to tackle

   Asian language (Chinese, Japanese, etc)
    tokenization

   Search relevancy improvement

   Need a more standardized query language




                                              page 24
Inverted Indexing concept




                            page 25
Conclusion

   Client side full text search is made possible
    with HTML5’s web workers and storage!

   How to put it forward?
       What if we are not using facebook’s data?
       Index content of viewed websites by users?
       Index RSS feeds?
       How to play with the indexed data?




                                                     page 26
Credits

   Javscript full text search engine from
    TheLadders.com

   iQuery Masonry

   Backbone.js




                                             page 27
Stanley Fok
Stanley Ng




             Steve Ng
                                      Hon




             Happy hacking!

More Related Content

Similar to Facebook Spotlight - Facebook Mobile Hack Hong Kong

Demystifying JavaScript & SEO
Demystifying JavaScript & SEODemystifying JavaScript & SEO
Demystifying JavaScript & SEOBotify
 
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...SEO Camp Association
 
Introducing the JotSpot Data Model and API
Introducing the JotSpot Data Model and APIIntroducing the JotSpot Data Model and API
Introducing the JotSpot Data Model and APIScott McMullan
 
Sp sat philly2019
Sp sat philly2019Sp sat philly2019
Sp sat philly2019Peter_1020
 
Going from Classic to Modern. 10 Things you must know before you commit
Going from Classic to Modern. 10 Things you must know before you commitGoing from Classic to Modern. 10 Things you must know before you commit
Going from Classic to Modern. 10 Things you must know before you commitspsnyc
 
Spsat nyc19 190621150118
Spsat nyc19 190621150118Spsat nyc19 190621150118
Spsat nyc19 190621150118Peter_1020
 
Share point saturday presentation 9 29-2012-2
Share point saturday presentation 9 29-2012-2Share point saturday presentation 9 29-2012-2
Share point saturday presentation 9 29-2012-2Derek Gusoff
 
Sp biz conf - using office graph api
Sp biz conf - using office graph apiSp biz conf - using office graph api
Sp biz conf - using office graph apiVincent Biret
 
The Days of Web Standards "IA" 20070715
The Days of Web Standards "IA" 20070715The Days of Web Standards "IA" 20070715
The Days of Web Standards "IA" 20070715Takashi Sakamoto
 
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDO
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDOMCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDO
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDORob Lancefield
 
Branding Wont Fix Crappy Content - SharePoint User Experience Discussion
Branding Wont Fix Crappy Content - SharePoint User Experience DiscussionBranding Wont Fix Crappy Content - SharePoint User Experience Discussion
Branding Wont Fix Crappy Content - SharePoint User Experience DiscussionMarcy Kellar
 
Wireframing and design short course
Wireframing and design short courseWireframing and design short course
Wireframing and design short coursecarishurd
 
Gurmeet Ghatora's Presentation
Gurmeet Ghatora's PresentationGurmeet Ghatora's Presentation
Gurmeet Ghatora's PresentationGurmeet Ghatora
 
Is AngularJS Right for Your Enterprise?
Is AngularJS Right for Your Enterprise?Is AngularJS Right for Your Enterprise?
Is AngularJS Right for Your Enterprise?seoClarity
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Nicholas Zakas
 
Scraping Webpage Information by using MS Excel VBA
Scraping Webpage Information by using MS Excel VBAScraping Webpage Information by using MS Excel VBA
Scraping Webpage Information by using MS Excel VBAPatrick Ho
 

Similar to Facebook Spotlight - Facebook Mobile Hack Hong Kong (20)

Demystifying JavaScript & SEO
Demystifying JavaScript & SEODemystifying JavaScript & SEO
Demystifying JavaScript & SEO
 
Seo analysis of jabong.com at Pravin K Gupta
Seo analysis of jabong.com at Pravin K GuptaSeo analysis of jabong.com at Pravin K Gupta
Seo analysis of jabong.com at Pravin K Gupta
 
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...
L’importance du crawl du JavaScript : pourquoi, comment et pour quels bénéfic...
 
Introducing the JotSpot Data Model and API
Introducing the JotSpot Data Model and APIIntroducing the JotSpot Data Model and API
Introducing the JotSpot Data Model and API
 
Sp sat philly2019
Sp sat philly2019Sp sat philly2019
Sp sat philly2019
 
PykQuery.js
PykQuery.jsPykQuery.js
PykQuery.js
 
Going from Classic to Modern. 10 Things you must know before you commit
Going from Classic to Modern. 10 Things you must know before you commitGoing from Classic to Modern. 10 Things you must know before you commit
Going from Classic to Modern. 10 Things you must know before you commit
 
Spsat nyc19 190621150118
Spsat nyc19 190621150118Spsat nyc19 190621150118
Spsat nyc19 190621150118
 
Fabrice Canel - Advanced Search Summit Napa 2019
Fabrice Canel - Advanced Search Summit Napa 2019Fabrice Canel - Advanced Search Summit Napa 2019
Fabrice Canel - Advanced Search Summit Napa 2019
 
Share point saturday presentation 9 29-2012-2
Share point saturday presentation 9 29-2012-2Share point saturday presentation 9 29-2012-2
Share point saturday presentation 9 29-2012-2
 
Sp biz conf - using office graph api
Sp biz conf - using office graph apiSp biz conf - using office graph api
Sp biz conf - using office graph api
 
The Days of Web Standards "IA" 20070715
The Days of Web Standards "IA" 20070715The Days of Web Standards "IA" 20070715
The Days of Web Standards "IA" 20070715
 
Ap Ams Bill
Ap Ams BillAp Ams Bill
Ap Ams Bill
 
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDO
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDOMCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDO
MCN 2014: Make One, Contribute Many: Sharing Image Metadata via LIDO
 
Branding Wont Fix Crappy Content - SharePoint User Experience Discussion
Branding Wont Fix Crappy Content - SharePoint User Experience DiscussionBranding Wont Fix Crappy Content - SharePoint User Experience Discussion
Branding Wont Fix Crappy Content - SharePoint User Experience Discussion
 
Wireframing and design short course
Wireframing and design short courseWireframing and design short course
Wireframing and design short course
 
Gurmeet Ghatora's Presentation
Gurmeet Ghatora's PresentationGurmeet Ghatora's Presentation
Gurmeet Ghatora's Presentation
 
Is AngularJS Right for Your Enterprise?
Is AngularJS Right for Your Enterprise?Is AngularJS Right for Your Enterprise?
Is AngularJS Right for Your Enterprise?
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
 
Scraping Webpage Information by using MS Excel VBA
Scraping Webpage Information by using MS Excel VBAScraping Webpage Information by using MS Excel VBA
Scraping Webpage Information by using MS Excel VBA
 

Recently uploaded

WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuidePixlogix Infotech
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingWSO2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
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
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...caitlingebhard1
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)Samir Dash
 

Recently uploaded (20)

WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
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
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 

Facebook Spotlight - Facebook Mobile Hack Hong Kong

  • 1. Search my social circle… STANLEY . F STANLEY . N KEUNG . H STEVE . N Facebook Mobile Hack Hong Kong - 22nd March 2012
  • 2. Current facebook search bar can only search people, pages, events, etc page 2
  • 3. But can we search by user profile details? page 3
  • 4. Can we search by the comments? page 4
  • 5. Can we search by the event details? page 5
  • 6. Build a search engine for my social circle! ONLY in JAVASCRIPT!
  • 7. Our Idea • Crawl data from my social circle provided by Facebook Graph API • Build inverted index from the content page 7
  • 8. Why Javascript?  We love Javascript!  To demonstrate how powerful Javascript can be  For a facebook application, it should be more ethical to process users’ data in client side page 8
  • 9. Benefits of Client Side Indexing  Computation power and storage is now off- loaded to client side browsers  facebook does not need to manage the huge amount of index data  The search result is very personalized! You are searching for your own data and that is what you are interested in! page 9
  • 10. Demo
  • 11.
  • 13. Query: “baby” – search all objects containing “baby”
  • 14. We are searching facebook objects based on the content!
  • 15. Query: “birthday @photos” – search all photos object containing “birthday”
  • 16. Query: “single @profile” – search all profile object containing “single”
  • 17. Challenges  Indexing performance  Persistent storage for index  Implementing inverted index algorithm page 17
  • 18. Web Workers Web DB page 18
  • 19. Indexing Performance  For each user, we do a batch API call to Graph API already  However, it still takes on average 3.8 seconds for the data to return  Most of my friends has around 300 friends  So it takes 19 minutes to complete the crawling!?!?!? page 19
  • 20. Web Workers come to save me! Time to index 100 facebook users 400 350 300 Time (seconds) 250 200 150 100 50 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Number of web workers page 20
  • 21. Web Workers Web Workers, forked by main thread Crawl data and build sub-index Main thread merge all sub-indices page 21
  • 22. Web Workers  Web workers has much limitation, e.g. you cannot access the DOM  You also cannot import the facebook SDK or jQuery library. It DOES NOT WORK!  Luckily, you can still use the most fundamental function - xmlhttprequest  So we have to use xmlhttprequest to simulate the FB.api function in batch mode page 22
  • 23. Web DB  Web DB provides us a solution for permanent offline storage  My friends list has 556 users  Generating a search index having ~18,000 English keywords  Only takes less than a second to save and load from the Web DB page 23
  • 24. Problems still need to tackle  Asian language (Chinese, Japanese, etc) tokenization  Search relevancy improvement  Need a more standardized query language page 24
  • 26. Conclusion  Client side full text search is made possible with HTML5’s web workers and storage!  How to put it forward?  What if we are not using facebook’s data?  Index content of viewed websites by users?  Index RSS feeds?  How to play with the indexed data? page 26
  • 27. Credits  Javscript full text search engine from TheLadders.com  iQuery Masonry  Backbone.js page 27
  • 28. Stanley Fok Stanley Ng Steve Ng Hon Happy hacking!