SlideShare a Scribd company logo
The Curious Case of
                         Dust
                          @vybs




Wednesday, July 11, 12
Curious about?

                    • Is logic-less working for us?
                    • Are we DRY?
                    • How much on the client?
                    • Really? is it more than just a blog post?
                         Show me the proof



Wednesday, July 11, 12
Let’ start



Wednesday, July 11, 12
How to Dust?



Wednesday, July 11, 12
•   “Dust is a JavaScript templating
                             engine designed to provide a clean
                             separation between presentation and
                             logic without sacrificing ease of use”

                         • “A pure JavaScript library, Dust runs
                             in both browser-side and server-side
                             environments.”




Wednesday, July 11, 12
Ok whatever!



Wednesday, July 11, 12
Really, tell me how
                         it works?


Wednesday, July 11, 12
1. Dust for markup                                2. JSON for data
                 _t = “Hello {name}!          json = {
                  You have {count} new          "name": ”James",
                 messages from                  "count": 2,
                    {#people}                   “people” : [{ “name” : “Jim”,
                        {name},                               “distance” : “2”
                      {/people}                             },{ “name”: ”Eran”
                   ”;                                          “distance” : “1”}
                                                            ]
                                                     }


                         !dust.render(_t, json, function(error, data) {!
                             $(“mydiv”).html(data);!
                          }!                        3. JAVASCRIPT for render

                               Hello James! You have 2 new
                                  messages from Jim, Eran!    4. HTML


Wednesday, July 11, 12
Tell me more!



Wednesday, July 11, 12
1. Dust Keys
                            references in JSON
     Hello {name}!
     You have {count} messages
     from
          {#people}
               {name},
          {/people}
                          2. Dust Sections
                         create a block for enumeration,
                                transformations




Wednesday, July 11, 12
Wait, is that it?



Wednesday, July 11, 12
Curious case of logic-less dust
Wednesday, July 11, 12
Is logic-less working?



Wednesday, July 11, 12
Let’s consider a LI
                              use case


Wednesday, July 11, 12
Use case
        Profile Connections                 Search Results




                         People You May Know
          Member Photo

                                                   ICON/BADGE




Wednesday, July 11, 12
It is just a badge!




Wednesday, July 11, 12
BADGE localized

               ENGLISH


                TURKEY


     PORTUGUESE


           JAPANESE

Wednesday, July 11, 12
How do we solve this simple use
                        case?

Wednesday, July 11, 12
Dust helpers

                    • Macro tags to the rescue, can be written
                         once, hence support DRY
                    • Takes params and executes in the context
                         they are declared
                    • uses the @ notation

Wednesday, July 11, 12
“icon” : {
                                                              “distance” : “1”,
                                                              “first” : “Bill”,
                                                              “last” : “Scott”
                         {#icon name="Bill Scott"}            }
                          {@if cond="{distance} == 0"}
                            <span class="network-degree you">
                             {@i18n key="YOU" text="YOU"/}
                            </span>
                           {:else}
                            {@if cond="{distance} == 1"}
                            <span class="network-degree one">
                           {@i18n key="FIRST" text="{name} is your connection"/}
                             </span>
                             {:else}
                                  ...
                                {/if}
                             {/if}
                          {/if}
                                                         logic = @if
                         {/icon}                 formatted name = @fmt
                                                  localized text = @i18n


Wednesday, July 11, 12
Helper code




                https://raw.github.com/linkedin/dustjs/master/lib/dust-
                                      helpers.js

Wednesday, July 11, 12
Curious about?

                    • Is logic-less working for us?
                    • Are we DRY?
                    • How much on the client?
                    • Really? is it more than just a blog post?
                         show me the proof



Wednesday, July 11, 12
Lets solve the badge
                     differently!


Wednesday, July 11, 12
Dust Partials

                    • Nested templates, have access to the
                         scope of the parent template
                    • Takes params and uses the “>” notation
                    • Partial names can be dynamic


Wednesday, July 11, 12
{
                                          "name": ”James",
                                          "count": 2,
                                          “people” : [{ “name” : “Jim”,

      badge.tl                                          “distance” : “2”
                                                      },{ “name”: ”Eran”
                                                         “distance” : “1”}
            {#people}
                                                      ]
            <li>
             {>”tl/shared/badge_{distance}”/} }
            </li>
            {/people}

       badge_1.tl                                  logic = dynamic
           {@i18n text=“first degree”/}
                                                        partials
       badge_2.tl
             {@i18n text=“second degree”/}
                                                   localized text =
                                                        @i18n


Wednesday, July 11, 12
“Partial” as a Helper
                            @partial, @jsControl




Wednesday, July 11, 12
{#people}
                          Partial as a helper
             {@partial altText=_memberFullName pictureId=primaryPictureID}
                  {>"tl/shared/member_photo"/}
             {/partial}                               pymk.tl includes member_photo.tl
          {/people}
        {!
        Renders Member's profile photo if pictureId is passed otherwise renders ghost image
           @partial member_photo
           @param pictureId {string} Id of photo
           @param size (Integer) Photo Size (default 40) - Photos are always square, so height and width will be same
           @param altText {String} Alt attribute for image
           @param className {String} Optional css class name to be added to the image
        !}


        {@param key="size" defaultVal="40"/}
                                                                                        member_photo.tl
        {?pictureId}
          <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/altText}
        width="{size}" height="{size}" src='{@pre.link alias="media" args="mediaID:
        {pictureId},mprCommand:shrink_{size}_{size}"/}'>
        {:else}
          <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/altText}


                                                  • local context, expected
        width="{size}" height="{size}" src='{@pre.img.link path="/img/icon/icon_no_photo_{size}
        x{size}.png"/}'>
        {/pictureId}

                                                       params, docs

Wednesday, July 11, 12
Helper code




                           https://gist.github.com/3083847



Wednesday, July 11, 12
Partial as a helper
    {#Education}
    {#educations}
        {#educations}
          <div id="education-{educationId}" class="editable-item">
            <div id="education-{educationId}-view">
              {>"tl/apps/profile/v2/embed/education_view"/}
            </div>
            {#formData}
            <div id="education-{educationId}-edit" class="edit-form">
              {>"tl/apps/profile/v2/embed/education_edit"/}
            </div>
            {/formData}
          </div>
          {@jsControl name="Sortable.Section"}
                                                           Dust key
            {
              existingDragHandlePath: '.edit-order',
              serverValue: '{educationId}',
              group: 'educations',
              additionalProxyClass:'subsection-drag-proxy'
            }
          {/jsControl}
        {/educations}
    {/educations}
    {/Education}




Wednesday, July 11, 12
QUESTIONS?



Wednesday, July 11, 12
Apps with Dust
                            Browser                            CDN       caching
                                                                         content delivery




     linkedin.com




                            UI /JSON Aggregator
                                                         Static Assets   static content
                                    V8                                   js, css, templates




            apps          Page   Embed     Embed
                                                    Partials


             data layer   JSON    JSON       JSON


Wednesday, July 11, 12
Profile Page




Wednesday, July 11, 12
Anatomy of a LI Page


                    • Page has a Layout
                    • Layout & Page have one or more Embeds


Wednesday, July 11, 12
Profile Page with Embeds
                                                   HEADER




                                                    Ads embed


                                                   WVYP embed


                                                   Activity
                                                    Feed
                                                   embed

Wednesday, July 11, 12
Anatomy of a Embed

                         • Embeds have
                          • Re-usable Dust Helpers
                          • Re-usable Dust Partials
                         • Pages degrade gracefully with embeds
                           that timeout or error



Wednesday, July 11, 12
Page code
        {>"layout"/}
        {<head}
         page specific head {! this is optional !}
         {@pre.scss path=”scss/a,scss/b”/}
        {/head}
        {<body}
         page body
         <script type="fs/embed" fs-uri="{url-to-embed-endpoint_1}">
        </script>
         <script type="fs/embed" fs-uri="{url-to-embed-endpoint_2}">
        </script>
        {/body}
        {<foot}
         page specific foot {! this is optional !}
        {/foot}




Wednesday, July 11, 12
Curious about?

                    • Is logic-less working for us?
                    • Are we DRY?
                    • How much on the client?
                    • Really? is it more than just a blog post?
                         show me the proof



Wednesday, July 11, 12
Curious case of client-rendered dust

Wednesday, July 11, 12
I meant client-rendering
                   and not client-mvc


Wednesday, July 11, 12
How much not on the
                          client?


Wednesday, July 11, 12
! on client
                         • Server side precompiled to JS
                          • Rendering times on client snappy
                                // CDN cached template to js

                                (function(){dust.register(null,body_0);function
                                body_0(chk,ctx){return
                                chk.section(ctx.get("people"),ctx,
                                {"block":body_1},null);}function body_1(chk,ctx)
                                {return chk.write("
                                ").reference(ctx.get("label"),ctx,"h").write("
                                ").reference(ctx.get("FMT_AUTO_NAME"),ctx,"h");}
                                return body_0;})();




Wednesday, July 11, 12
! on client
                         • Server side processed helper tags
                          • auto-generate template dependencies
                                {#people}
                                     {“>tl/shared/badge_{distance}”/}
                                {/people}




Wednesday, July 11, 12
! on client

               • Dust Preprocessed helper tags
                • leverage JVM based i18n, formatting and A/B
                         testing
                     • creates template driven, context based JSON


Wednesday, July 11, 12
Server-side helpers
                   • Similar to client-helpers, takes params, but
                         server processed in the context they are
                         declared
                 {?pictureId}
                   <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/
                 altText} width="{size}" height="{size}" src='{@pre.link alias="media"
                 args="mediaID:{pictureId},mprCommand:shrink_{size}_{size}"/}'>
                 {:else}
                   <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/
                 altText} width="{size}" height="{size}" src='{@pre.img.link path="/img/icon/
                 icon_no_photo_{size}x{size}.png"/}'>
                 {/pictureId}




Wednesday, July 11, 12
Wednesday, July 11, 12
! on client

                • No javascript, SEO pages
                • Seamless rendering of dust on the server using
                         V8




Wednesday, July 11, 12
Curious about?

                    • Is logic-less working for us?
                    • Are we DRY?
                    • How much on the client?
                    • Really? is it more than just a blog
                         post? show me the proof



Wednesday, July 11, 12
Is it more than just a
                                blog post?


Wednesday, July 11, 12
We even forked it!



Wednesday, July 11, 12
Is it more than just a
                                blog post?


Wednesday, July 11, 12
We will be open about
                          how we extend and
                            how we use it.



Wednesday, July 11, 12
Seriously, tell me how
                          it is helping us build
                                 features?



Wednesday, July 11, 12
Features
                    • Data-driven product, 60%-65% of features
                         we do are displays
                    • remaining 30-35%
                     • flows, ajaxy interactions
                     • writes/deletes


Wednesday, July 11, 12
Parallel
                           web-development
                         • Logic less templates, language of UX,
                           web-dev, front-end
                         • DRY, medium for quicker turn-around
                         • Mock JSON, language of front-end and
                           back-end



Wednesday, July 11, 12
Ok, tell me which LI
                          pages are in dust!


Wednesday, July 11, 12
•Search App
                         •   https://www.linkedin.com/search-fe/group_search?



                     •Profile

                     •College Alumni Pages
                         •   https://www.linkedin.com/college/alumni



                     •PYMK
                         •   https://www.linkedin.com/people/pymk




Wednesday, July 11, 12
We also are...

                         • Caching templates
                         • Unifying our stack with Javascript
                         • Developing for cross-device
                         • Moving as much as we need, to the client,
                           move as much as we can to JS



Wednesday, July 11, 12
If you watch this presentation backwards,
      it’s should be about a normal web-
               developers’s life!

Wednesday, July 11, 12
we dust!
                         https://github.com/linkedin/dustjs




Wednesday, July 11, 12

More Related Content

Similar to Curious case of Dust

A Tour Through the Groovy Ecosystem
A Tour Through the Groovy EcosystemA Tour Through the Groovy Ecosystem
A Tour Through the Groovy Ecosystem
Leonard Axelsson
 
Introduction To MongoDB
Introduction To MongoDBIntroduction To MongoDB
Introduction To MongoDB
Ynon Perek
 
MongoDB Hadoop and Humongous Data
MongoDB Hadoop and Humongous DataMongoDB Hadoop and Humongous Data
MongoDB Hadoop and Humongous Data
MongoDB
 
Gremlin
Gremlin Gremlin
Dominion Enterprises _H@&lt;k@th0n_
Dominion Enterprises _H@&lt;k@th0n_Dominion Enterprises _H@&lt;k@th0n_
Dominion Enterprises _H@&lt;k@th0n_
Ken Collins
 
The Path-o-Logical Gremlin
The Path-o-Logical GremlinThe Path-o-Logical Gremlin
The Path-o-Logical Gremlin
Marko Rodriguez
 
IPTC News in JSON AGM 2013
IPTC News in JSON AGM 2013IPTC News in JSON AGM 2013
IPTC News in JSON AGM 2013
Stuart Myles
 
Rcos presentation
Rcos presentationRcos presentation
Rcos presentation
mskmoorthy
 
XML-Javascript
XML-JavascriptXML-Javascript
XML-Javascript
tutorialsruby
 
XML-Javascript
XML-JavascriptXML-Javascript
XML-Javascript
tutorialsruby
 
Scaling DevOps
Scaling DevOpsScaling DevOps
Scaling DevOps
Jeffrey Hulten
 
Facilitando a Programação concorrente com o Fork/Join
Facilitando a Programação concorrente com o Fork/JoinFacilitando a Programação concorrente com o Fork/Join
Facilitando a Programação concorrente com o Fork/Join
Mario Amaral
 
Rails ORM De-mystifying Active Record has_many
Rails ORM De-mystifying Active Record has_manyRails ORM De-mystifying Active Record has_many
Rails ORM De-mystifying Active Record has_many
Blazing Cloud
 
MongoSV Schema Workshop
MongoSV Schema WorkshopMongoSV Schema Workshop
MongoSV Schema Workshop
MongoDB
 
Json
JsonJson
Json
soumya
 
Jan Lehnardt Couch Db In A Real World Setting
Jan Lehnardt Couch Db In A Real World SettingJan Lehnardt Couch Db In A Real World Setting
Jan Lehnardt Couch Db In A Real World Setting
George Ang
 
The Gremlin in the Graph
The Gremlin in the GraphThe Gremlin in the Graph
The Gremlin in the Graph
Marko Rodriguez
 
Enterprise javascriptsession3
Enterprise javascriptsession3Enterprise javascriptsession3
Enterprise javascriptsession3
Troy Miles
 
Logical Programming With ruby-prolog
Logical Programming With ruby-prologLogical Programming With ruby-prolog
Logical Programming With ruby-prolog
Preston Lee
 
Jongo mongo sv
Jongo mongo svJongo mongo sv
Jongo mongo sv
Katia Aresti
 

Similar to Curious case of Dust (20)

A Tour Through the Groovy Ecosystem
A Tour Through the Groovy EcosystemA Tour Through the Groovy Ecosystem
A Tour Through the Groovy Ecosystem
 
Introduction To MongoDB
Introduction To MongoDBIntroduction To MongoDB
Introduction To MongoDB
 
MongoDB Hadoop and Humongous Data
MongoDB Hadoop and Humongous DataMongoDB Hadoop and Humongous Data
MongoDB Hadoop and Humongous Data
 
Gremlin
Gremlin Gremlin
Gremlin
 
Dominion Enterprises _H@&lt;k@th0n_
Dominion Enterprises _H@&lt;k@th0n_Dominion Enterprises _H@&lt;k@th0n_
Dominion Enterprises _H@&lt;k@th0n_
 
The Path-o-Logical Gremlin
The Path-o-Logical GremlinThe Path-o-Logical Gremlin
The Path-o-Logical Gremlin
 
IPTC News in JSON AGM 2013
IPTC News in JSON AGM 2013IPTC News in JSON AGM 2013
IPTC News in JSON AGM 2013
 
Rcos presentation
Rcos presentationRcos presentation
Rcos presentation
 
XML-Javascript
XML-JavascriptXML-Javascript
XML-Javascript
 
XML-Javascript
XML-JavascriptXML-Javascript
XML-Javascript
 
Scaling DevOps
Scaling DevOpsScaling DevOps
Scaling DevOps
 
Facilitando a Programação concorrente com o Fork/Join
Facilitando a Programação concorrente com o Fork/JoinFacilitando a Programação concorrente com o Fork/Join
Facilitando a Programação concorrente com o Fork/Join
 
Rails ORM De-mystifying Active Record has_many
Rails ORM De-mystifying Active Record has_manyRails ORM De-mystifying Active Record has_many
Rails ORM De-mystifying Active Record has_many
 
MongoSV Schema Workshop
MongoSV Schema WorkshopMongoSV Schema Workshop
MongoSV Schema Workshop
 
Json
JsonJson
Json
 
Jan Lehnardt Couch Db In A Real World Setting
Jan Lehnardt Couch Db In A Real World SettingJan Lehnardt Couch Db In A Real World Setting
Jan Lehnardt Couch Db In A Real World Setting
 
The Gremlin in the Graph
The Gremlin in the GraphThe Gremlin in the Graph
The Gremlin in the Graph
 
Enterprise javascriptsession3
Enterprise javascriptsession3Enterprise javascriptsession3
Enterprise javascriptsession3
 
Logical Programming With ruby-prolog
Logical Programming With ruby-prologLogical Programming With ruby-prolog
Logical Programming With ruby-prolog
 
Jongo mongo sv
Jongo mongo svJongo mongo sv
Jongo mongo sv
 

Recently uploaded

Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
DianaGray10
 
AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
Ajin Abraham
 
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Neo4j
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
Edge AI and Vision Alliance
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid ResearchHarnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Neo4j
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
Fwdays
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
ssuserfac0301
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
c5vrf27qcz
 
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Pitangent Analytics & Technology Solutions Pvt. Ltd
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
Safe Software
 

Recently uploaded (20)

Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
 
AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
 
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and BioinformaticiansBiomedical Knowledge Graphs for Data Scientists and Bioinformaticians
Biomedical Knowledge Graphs for Data Scientists and Bioinformaticians
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid ResearchHarnessing the Power of NLP and Knowledge Graphs for Opioid Research
Harnessing the Power of NLP and Knowledge Graphs for Opioid Research
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
 
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
 

Curious case of Dust

  • 1. The Curious Case of Dust @vybs Wednesday, July 11, 12
  • 2. Curious about? • Is logic-less working for us? • Are we DRY? • How much on the client? • Really? is it more than just a blog post? Show me the proof Wednesday, July 11, 12
  • 5. “Dust is a JavaScript templating engine designed to provide a clean separation between presentation and logic without sacrificing ease of use” • “A pure JavaScript library, Dust runs in both browser-side and server-side environments.” Wednesday, July 11, 12
  • 7. Really, tell me how it works? Wednesday, July 11, 12
  • 8. 1. Dust for markup 2. JSON for data _t = “Hello {name}! json = { You have {count} new "name": ”James", messages from "count": 2, {#people} “people” : [{ “name” : “Jim”, {name}, “distance” : “2” {/people} },{ “name”: ”Eran” ”; “distance” : “1”} ] } !dust.render(_t, json, function(error, data) {! $(“mydiv”).html(data);! }! 3. JAVASCRIPT for render Hello James! You have 2 new messages from Jim, Eran! 4. HTML Wednesday, July 11, 12
  • 10. 1. Dust Keys references in JSON Hello {name}! You have {count} messages from {#people} {name}, {/people} 2. Dust Sections create a block for enumeration, transformations Wednesday, July 11, 12
  • 11. Wait, is that it? Wednesday, July 11, 12
  • 12. Curious case of logic-less dust Wednesday, July 11, 12
  • 14. Let’s consider a LI use case Wednesday, July 11, 12
  • 15. Use case Profile Connections Search Results People You May Know Member Photo ICON/BADGE Wednesday, July 11, 12
  • 16. It is just a badge! Wednesday, July 11, 12
  • 17. BADGE localized ENGLISH TURKEY PORTUGUESE JAPANESE Wednesday, July 11, 12
  • 18. How do we solve this simple use case? Wednesday, July 11, 12
  • 19. Dust helpers • Macro tags to the rescue, can be written once, hence support DRY • Takes params and executes in the context they are declared • uses the @ notation Wednesday, July 11, 12
  • 20. “icon” : { “distance” : “1”, “first” : “Bill”, “last” : “Scott” {#icon name="Bill Scott"} } {@if cond="{distance} == 0"} <span class="network-degree you"> {@i18n key="YOU" text="YOU"/} </span> {:else} {@if cond="{distance} == 1"} <span class="network-degree one"> {@i18n key="FIRST" text="{name} is your connection"/} </span> {:else} ... {/if} {/if} {/if} logic = @if {/icon} formatted name = @fmt localized text = @i18n Wednesday, July 11, 12
  • 21. Helper code https://raw.github.com/linkedin/dustjs/master/lib/dust- helpers.js Wednesday, July 11, 12
  • 22. Curious about? • Is logic-less working for us? • Are we DRY? • How much on the client? • Really? is it more than just a blog post? show me the proof Wednesday, July 11, 12
  • 23. Lets solve the badge differently! Wednesday, July 11, 12
  • 24. Dust Partials • Nested templates, have access to the scope of the parent template • Takes params and uses the “>” notation • Partial names can be dynamic Wednesday, July 11, 12
  • 25. { "name": ”James", "count": 2, “people” : [{ “name” : “Jim”, badge.tl “distance” : “2” },{ “name”: ”Eran” “distance” : “1”} {#people} ] <li> {>”tl/shared/badge_{distance}”/} } </li> {/people} badge_1.tl logic = dynamic {@i18n text=“first degree”/} partials badge_2.tl {@i18n text=“second degree”/} localized text = @i18n Wednesday, July 11, 12
  • 26. “Partial” as a Helper @partial, @jsControl Wednesday, July 11, 12
  • 27. {#people} Partial as a helper {@partial altText=_memberFullName pictureId=primaryPictureID} {>"tl/shared/member_photo"/} {/partial} pymk.tl includes member_photo.tl {/people} {! Renders Member's profile photo if pictureId is passed otherwise renders ghost image @partial member_photo @param pictureId {string} Id of photo @param size (Integer) Photo Size (default 40) - Photos are always square, so height and width will be same @param altText {String} Alt attribute for image @param className {String} Optional css class name to be added to the image !} {@param key="size" defaultVal="40"/} member_photo.tl {?pictureId} <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/altText} width="{size}" height="{size}" src='{@pre.link alias="media" args="mediaID: {pictureId},mprCommand:shrink_{size}_{size}"/}'> {:else} <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/altText} • local context, expected width="{size}" height="{size}" src='{@pre.img.link path="/img/icon/icon_no_photo_{size} x{size}.png"/}'> {/pictureId} params, docs Wednesday, July 11, 12
  • 28. Helper code https://gist.github.com/3083847 Wednesday, July 11, 12
  • 29. Partial as a helper {#Education} {#educations} {#educations} <div id="education-{educationId}" class="editable-item"> <div id="education-{educationId}-view"> {>"tl/apps/profile/v2/embed/education_view"/} </div> {#formData} <div id="education-{educationId}-edit" class="edit-form"> {>"tl/apps/profile/v2/embed/education_edit"/} </div> {/formData} </div> {@jsControl name="Sortable.Section"} Dust key { existingDragHandlePath: '.edit-order', serverValue: '{educationId}', group: 'educations', additionalProxyClass:'subsection-drag-proxy' } {/jsControl} {/educations} {/educations} {/Education} Wednesday, July 11, 12
  • 31. Apps with Dust Browser CDN caching content delivery linkedin.com UI /JSON Aggregator Static Assets static content V8 js, css, templates apps Page Embed Embed Partials data layer JSON JSON JSON Wednesday, July 11, 12
  • 33. Anatomy of a LI Page • Page has a Layout • Layout & Page have one or more Embeds Wednesday, July 11, 12
  • 34. Profile Page with Embeds HEADER Ads embed WVYP embed Activity Feed embed Wednesday, July 11, 12
  • 35. Anatomy of a Embed • Embeds have • Re-usable Dust Helpers • Re-usable Dust Partials • Pages degrade gracefully with embeds that timeout or error Wednesday, July 11, 12
  • 36. Page code {>"layout"/} {<head} page specific head {! this is optional !} {@pre.scss path=”scss/a,scss/b”/} {/head} {<body} page body <script type="fs/embed" fs-uri="{url-to-embed-endpoint_1}"> </script> <script type="fs/embed" fs-uri="{url-to-embed-endpoint_2}"> </script> {/body} {<foot} page specific foot {! this is optional !} {/foot} Wednesday, July 11, 12
  • 37. Curious about? • Is logic-less working for us? • Are we DRY? • How much on the client? • Really? is it more than just a blog post? show me the proof Wednesday, July 11, 12
  • 38. Curious case of client-rendered dust Wednesday, July 11, 12
  • 39. I meant client-rendering and not client-mvc Wednesday, July 11, 12
  • 40. How much not on the client? Wednesday, July 11, 12
  • 41. ! on client • Server side precompiled to JS • Rendering times on client snappy // CDN cached template to js (function(){dust.register(null,body_0);function body_0(chk,ctx){return chk.section(ctx.get("people"),ctx, {"block":body_1},null);}function body_1(chk,ctx) {return chk.write(" ").reference(ctx.get("label"),ctx,"h").write(" ").reference(ctx.get("FMT_AUTO_NAME"),ctx,"h");} return body_0;})(); Wednesday, July 11, 12
  • 42. ! on client • Server side processed helper tags • auto-generate template dependencies {#people} {“>tl/shared/badge_{distance}”/} {/people} Wednesday, July 11, 12
  • 43. ! on client • Dust Preprocessed helper tags • leverage JVM based i18n, formatting and A/B testing • creates template driven, context based JSON Wednesday, July 11, 12
  • 44. Server-side helpers • Similar to client-helpers, takes params, but server processed in the context they are declared {?pictureId} <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/ altText} width="{size}" height="{size}" src='{@pre.link alias="media" args="mediaID:{pictureId},mprCommand:shrink_{size}_{size}"/}'> {:else} <img {?className}class="{className}"{/className} {?altText}alt="{altText}"{/ altText} width="{size}" height="{size}" src='{@pre.img.link path="/img/icon/ icon_no_photo_{size}x{size}.png"/}'> {/pictureId} Wednesday, July 11, 12
  • 46. ! on client • No javascript, SEO pages • Seamless rendering of dust on the server using V8 Wednesday, July 11, 12
  • 47. Curious about? • Is logic-less working for us? • Are we DRY? • How much on the client? • Really? is it more than just a blog post? show me the proof Wednesday, July 11, 12
  • 48. Is it more than just a blog post? Wednesday, July 11, 12
  • 49. We even forked it! Wednesday, July 11, 12
  • 50. Is it more than just a blog post? Wednesday, July 11, 12
  • 51. We will be open about how we extend and how we use it. Wednesday, July 11, 12
  • 52. Seriously, tell me how it is helping us build features? Wednesday, July 11, 12
  • 53. Features • Data-driven product, 60%-65% of features we do are displays • remaining 30-35% • flows, ajaxy interactions • writes/deletes Wednesday, July 11, 12
  • 54. Parallel web-development • Logic less templates, language of UX, web-dev, front-end • DRY, medium for quicker turn-around • Mock JSON, language of front-end and back-end Wednesday, July 11, 12
  • 55. Ok, tell me which LI pages are in dust! Wednesday, July 11, 12
  • 56. •Search App • https://www.linkedin.com/search-fe/group_search? •Profile •College Alumni Pages • https://www.linkedin.com/college/alumni •PYMK • https://www.linkedin.com/people/pymk Wednesday, July 11, 12
  • 57. We also are... • Caching templates • Unifying our stack with Javascript • Developing for cross-device • Moving as much as we need, to the client, move as much as we can to JS Wednesday, July 11, 12
  • 58. If you watch this presentation backwards, it’s should be about a normal web- developers’s life! Wednesday, July 11, 12
  • 59. we dust! https://github.com/linkedin/dustjs Wednesday, July 11, 12