strangeloop2013-jasongilman-visualizationdrivendevelopment

Upload: markt

Post on 01-Jun-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    1/70

    VisualizationDrivenDevelopment

    Jason Gilman

    @jasongilmanelement 84

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    2/70

    About Me

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    3/70

    Are we at the pinnacle ofcomputing?

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    4/70

    Of course not!

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    5/70

    Computer

    Source: Heinz NixdorfMuseumsForum

    Developer

    Communication

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    6/70

    ?

    1. Write code 2. Execution

    NullPointerException

    3. Output

    What's happening?

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    7/70

    Tool BeltLogging Debugger REPL

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    8/70

    Deciencies:Computer

    Complicated State

    Logs,

    stack traces,alerts

    Developer

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    9/70

    Which of these is bigger?

    550mm 3m

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    10/70

    Which of these is bigger?

    source: commons.wikimedia.org/wiki/File:Baseball_(crop).jpg

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    11/70

    Steam SetMinidumpSteamID: Caching Steam ID: 76561198025064504 [API loaded no]

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    12/70

    Steam_SetMinidumpSteamID: Caching Steam ID: 76561198025064504 [API loaded no]Endless Space(863,0xac65aa28) malloc: *** error for object 0x20afa84c: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugEndless Space(863,0xac65aa28) malloc: *** error for object 0x20afa94b: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugEndless Space(863,0xac65aa28) malloc: *** error for object 0x92d3552: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugEndless Space(863,0xac65aa28) malloc: *** error for object 0x20afa94b: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugEndless Space(863,0xac65aa28) malloc: *** error for object 0x9169d52: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugEndless Space(863,0xac65aa28) malloc: *** error for object 0x20afa94b: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debugLib.dll into Unity Child DomainException in thread "main" java.io.FileNotFoundException: Could not locate clojure/tools/nrepl/ack__init.class or clojure/tools/nrepl/ack.clj on classpath:(lein2.clj:1) at clojure.lang.Compiler.eval(Compiler.java:5440) at clojure.lang.Compiler.eval(Compiler.java:5415) at clojure.lang.Compiler.load(Compiler.java:5857) at clojure.lang.RT.loadResourceScript(RT.java:340) at clojure.lang.RT.loadResourceScript(RT.java:331) at clojure.lang.RT.load(RT.java:409) at clojure.lang.RT.load(RT.java:381) at clojure.core$load$fn__4519.invoke(core.clj:4915) at clojure.core$load.doInvoke(core.clj:4914) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:4729) at clojure.core$load_lib.doInvoke(core.clj:4766) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invoke(core.clj:542) at clojure.core$load_libs.doInvoke(core.clj:4800) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:542) at clojure.core$require.doInvoke(core.clj:4881) at clojure.lang.RestFn.invoke(RestFn.java:408) at leinjacker.utils$try_resolve$fn__383.invoke(utils.clj:12) at leinjacker.utils$try_resolve.invoke(utils.clj:12) at clojure.lang.AFn.applyToHelper(AFn.java:161) at clojure.lang.AFn.applyTo(AFn.java:151) at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2906) at clojure.lang.Compiler$MapExpr.eval(Compiler.java:2472) at clojure.lang.Compiler$DefExpr.eval(Compiler.java:361) at clojure.lang.Compiler.eval(Compiler.java:5429) at clojure.lang.Compiler.load(Compiler.java:5857) at clojure.lang.RT.loadResourceScript(RT.java:340) at clojure.lang.RT.loadResourceScript(RT.java:331) at clojure.lang.RT.load(RT.java:409) at clojure.lang.RT.load(RT.java:381) at clojure.core$load$fn__4519.invoke(core.clj:4915)- Completed reload, in 0.075 secondsSwitching to 800x600 fullscreenPlatform assembly: /Users/mark/Library/Application Support/Steam/SteamApps/common/Endless Space/Endless Space.app/Contents/Data/Managed/System.dll (this messageis harmless)Platform assembly: /Users/mark/Library/Application Support/Steam/SteamApps/common/Endless Space/Endless Space.app/Contents/Data/Managed/System.Xml.dll (thismessage is harmless)Platform assembly: /Users/mark/Library/Application Support/Steam/SteamApps/common/Endless Space/Endless Space.app/Contents/Data/Managed/UnityScript.Lang.dll (thismessage is harmless)Platform assembly: /Users/mark/Library/Application Support/Steam/SteamApps/common/Endless Space/Endless Space.app/Contents/Data/Managed/Boo.Lang.dll (this messageis harmless)[Bootloader] version: 1.00.18 - 02 (Filename: /Applications/buildAgent/work/b0bcff80449a48aa/Runtime/ExportGenerated/MacStandalonePlayer/UnityEngineDebug.cpp Line: 43)[Bootloader] command line: /Users/mark/Library/Application Support/Steam/SteamApps/common/Endless Space/Endless Space.app/Contents/MacOS/Endless Space -single-instance -windowed -w 2560 -h 1440 Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    13/70

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    14/70

    http://www.ickr.com/photos/gavinbell/81011618

    You're planning a wedding

    Thursday, November 28, 13

    http://www.flickr.com/photos/gavinbell/81011618http://www.flickr.com/photos/gavinbell/81011618
  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    15/70

    Is this a good choice?

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    16/70

    A good cake for the reception?

    source: allrecipes.com/recipe/zuccotto-cupcakes

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    17/70

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    18/70

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    19/70

    source: google.com/trends/explore#q=clojure&cmpt=q

    Data Visualization

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    20/70

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    21/70

    Code Executionis Data

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    22/70

    data ! data

    !

    data v1data v2data v3

    data v4data v5

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    23/70

    ( defn qsort [[ pivot & xs ]] ( when pivot ( let [ smaller # ( < % pivot )

    before-pivot ( filter smaller xs ) after-pivot ( remove smaller xs )] ( lazy-cat ( qsort before-pivot ) [ pivot ]

    ( qsort after-pivot )))))

    Quick Sort

    source: rosettacode.org/wiki/Sorting_algorithms/Quicksort#Clojure

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    24/70

    ( defn qsort [[ pivot & xs ]] ( when pivot ( let [ smaller # ( < % pivot ) before-pivot ( filter smaller xs ) after-pivot ( remove smaller xs )] ( capture! { :left before-pivot

    :pivot pivot :right after-pivot })

    ( lazy-cat ( qsort before-pivot ) [ pivot ] ( qsort after-pivot )))))

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    25/70

    {:left [3 1 4 0 2] :pivot 5 :right [...{:left [1 0 2] :pivot 3 :right [4]}{:left [0] :pivot 1 :right [2]}{:left [] :pivot 0 :right []}{:left [] :pivot 2 :right []}{:left [] :pivot 4 :right []}...

    Captured

    (qsort [5 3 1 7 4 6 ...])

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    26/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    27/70

    pivotleft

    right

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    28/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    29/70

    New ideas are old ideas.

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    30/70

    forward 50

    right 90forward 50right 90forward 50...

    LOGO

    source: http://el.media.mit.edu/logo-foundation/logo/turtle.html

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    31/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    32/70

    source: http://cyberneticzoo.com/?p=1711

    Not Just for Kids

    Thursday, November 28, 13

    http://cyberneticzoo.com/?p=1711http://cyberneticzoo.com/?p=1711
  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    33/70

    Drawing a Housesquaretriangle

    squareright 30triangle

    A Plan

    right 90squareright 30triangle

    Success!Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    34/70

    VisualizationDriven

    DevelopmentThursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    35/70

    VDD Coregithub.com/element84/vdd-core

    Thursday, November 28, 13

    https://github.com/Element84/vdd-corehttps://github.com/Element84/vdd-core
  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    36/70

    Web Browser

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    37/70

    Browser Coding Env

    WebSockets

    Client

    Viz utilities

    Server

    EmbeddedHTTP Server

    Your Code Your

    Visualization

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    38/70

    UsingVDD Core

    Thursday, November 28, 13

    ( d f t [[ i t & ]]

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    39/70

    ( defn qsort [[ pivot & xs ]] ( when pivot ( let [ smaller # ( < % pivot ) before-pivot ( filter smaller xs ) after-pivot ( remove smaller xs )] ( capture! { :left before-pivot

    :pivot pivot :right after-pivot })

    ( lazy-cat ( qsort before-pivot ) [ pivot ] ( qsort after-pivot )))))

    ClientServer

    Your Code YourVisualization

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    40/70

    In the REPL:

    (require '[vdd-core.core :as vdd])(def server (vdd/start-viz))

    ClientServer

    Your Code YourVisualization

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    41/70

    In the Browser:

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    42/70

    In the REPL:(use 'qsort.driver)(viz-qsort [3 2 4 5 1])

    ( defn viz-qsort [ data ] ; Reset the global captured state ( capture/reset-captured! ) ; Run quicksort. Visualization data will be captured ( let [ results ( doall ( sorter/qsort data )) combined ( qsort-list-combiner ( capture/captured )) ; Prepend the unsorted data combined ( concat [{ :items data :left [] :right []}] combined [{ :items results :left [] :right []}])] ; Send the data to be visualized ( vdd/data->viz combined )))

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    43/70

    [{"items":[3,2,4,5,1], "left":[], "right":[] }, {"items":[2,1,3,4,5], "left":[2,1], "pivot":3, "right":[4,5]}, {"items":[1,2,3,4,5], "left":[1], "pivot":2, "right":[] }, {"items":[1,2,3,4,5], "left":[], "pivot":1, "right":[] }, {"items":[1,2,3,4,5], "left":[], "pivot":4, "right":[5] }, {"items":[1,2,3,4,5], "left":[], "pivot":5, "right":[] }, {"items":[1,2,3,4,5], "left":[], "right":[] }]

    Data Sent to the

    Visualization

    Thursday, November 28, 13

    h

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    44/70

    ( )Player component in VDD Core

    Bar Chart in D3

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    45/70

    {"items":[2,1,3,4,5], ...

    {"items":[3,2,4,5,1], ...

    {"items":[2,1,3,4,5], ...

    {"items":[1,2,3,4,5], ...

    ...

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    46/70

    (viz-qsort (shuffle (range 50)))

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    47/70

    How can I make my code visual?

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    48/70

    1. Identify nouns.

    2. Choose visual representation.3. Choose layout.

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    49/70

    GET /search?point=45,78&cloud_max=32&keywords=rain

    Data Search

    AND point = 45, 78 cloud < 0.32

    keywords = rainThursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    50/70

    AND OR provider=FOO ... AND

    point = 45, 78 cloud < 0.32 keywords = rain

    original

    query

    permitteddata rules

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    51/70

    1. Identify Nouns

    Conditions

    Operations - and, or, not Query

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    52/70

    2. Choose Visual Representation

    Conditions

    Operations

    Query

    cloud < 0.32

    &&or AND

    Tree Layout

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    53/70

    3. Choose a Layout

    1. D3 Tree Layout 2. HTML Lists

    &&

    cloud < 0.32 keywords = rain

    AND cloud < 0.32 keywords = rain

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    54/70

    Implementation vdd-core-examples/

    src/ ...

    viz/ boolean_logic_simpliers/ driver.clj index.html simpliers.css simpliers.js

    github.com/element84/vdd-core-examplesThursday, November 28, 13

    https://github.com/element84/vdd-core-exampleshttps://github.com/element84/vdd-core-exampleshttps://github.com/element84/vdd-core-examples
  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    55/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    56/70

    A Problem

    No Recursion

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    57/70

    Fixed

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    58/70

    This sounds hard!

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    59/70

    Keep it simple.

    Thursday, November 28, 13

    Lif l f B f Af

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    60/70

    Lifecycle ofa request

    Beforequery state

    Afterquery state

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    61/70

    Build reusablevisualizations.

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    62/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    63/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    64/70

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    65/70

    source: ickr.com/photos/epsos/6018530849

    Woodworking

    Carpentry

    &

    Developingsoftware is like

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    66/70

    Jig

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    67/70

    Jig

    source: ickr.com/photos/crown_molding/5079441077

    wood to cut

    Thursday, November 28, 13

    Jig Benets

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    68/70

    Jig Benets

    Makes work easier (faster)Higher quality results

    Thursday, November 28, 13

    Visualization Benets

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    69/70

    Visualization Benets

    Makes work easier (faster)Higher quality results

    Thursday, November 28, 13

  • 8/9/2019 StrangeLoop2013-JasonGilman-VisualizationDrivenDevelopment

    70/70

    Thanks Jason Gilman@jasongilman element 84