Tour of language landscape

Yan Cui
Yan CuiSpeaker at Self
tour guide : Yan Cui @theburningmonk
Hi, my name is Yan Cui.
Tour of language landscape
1MILLION USERS
ACTIVE
DAILY
250MILLION DAY
PER
REQUEST
2MONTH
TB
P E R
sec
ops
25,000
agenda
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
disclaimers
syntax!
doesn’t
matter
Tour of language landscape
Being literate isn't simply a matter of being
able to put words on the page, it's solidifying
our thoughts such that they can be written.
Interpreting and applying someone else's
thoughts is the equivalent for reading. We call
these composition and comprehension.
And they are what literacy really is.
- Chris Granger
Coding, like writing, is a mechanical act…
Just like writing, we have to know how to solidify
our thoughts and get them out of our head…!
We build mental models of everything… If we
want computers to be able to compute for us,
then we have to accurately extract these
models from our heads and record them.
- Chris Granger
IDEAS
matter
“Programming languages
have a devious influence:
they shape our thinking
habits.”
- Edsger W. Dijkstra
“One of the most disastrous
thing we can learn is the first
programming language, even
if it's a good programming
language.”
- Alan Kay
“Just as there are odours that dogs can smell and
we cannot, as well as sounds that dogs can hear
and we cannot, so too there are wavelengths of light
we cannot see and flavours we cannot taste. Why
then, given our brains wired the way they are, does
the remark "Perhaps there are thoughts we cannot
think," surprise you? Evolution, so far, may possibly
have blocked us from being able to think in some
directions; there could be unthinkable thoughts.”
- Richard Hamming
“Just as there are odours that dogs can smell and
we cannot, as well as sounds that dogs can hear
and we cannot, so too there are wavelengths of light
we cannot see and flavours we cannot taste. Why
then, given our brains wired the way they are, does
the remark "Perhaps there are thoughts we cannot
think," surprise you? Evolution, so far, may possibly
have blocked us from being able to think in some
directions; there could be unthinkable thoughts.”
- Richard Hamming
Tour of language landscape
Tour of language landscape
Tour of language landscape
Tour of language landscape
“The limits of my
language means the
limits of my world.”
- Ludwig Wittgenstein
Tour of language landscape
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
your
app
your
app
CSVCSVCSV
CSVCSVXML
your
app
CSVCSVCSV
CSVCSVXML
some
service
your
app
CSVCSVCSV
CSVCSVXML
some
service
DB
1. define DTO types!
2. I/O!
3. marshal data into DTO!
4. do useful work
1. define DTO types!
2. I/O!
3. marshal data into DTO!
4. do useful work
compiler
provideexternal
data source typed info
type providers
intellisense!
tooltips!
…
Tour of language landscape
Tour of language landscape
compile time validation
no code generation
R
FunScript
Azure
Amazon S3
CSVSQLite
SQL Server
WSDL
WorldBank
Regex
ODATA IKVM
Facebook
Apiary
XAMLFreebaseHadoop
Oracle
Minesweeper
Don Syme
Powershell
JSON
Fizzbuzz
Mixin
RSS
Matlab
Dates
NorthPole
XML
Python
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
“…a clean design is one that
supports visual thinking so
people can meet their
informational needs with a
minimum of conscious effort.”
- Daniel Higginbotham
(www.visualmess.com)
Whilst talking with an ex-colleague, a question came up on how to implement the Stable Marriage
problem using a message passing approach. Naturally, I wanted to answer that question with Erlang!!
!
Let’s first dissect the problem and decide what processes we need and how they need to interact with
one another.!
!
The stable marriage problem is commonly stated as:!
Given n men and n women, where each person has ranked all members of the opposite sex with a
unique number between 1 and n in order of preference, marry the men and women together such that
there are no two people of opposite sex who would both rather have each other than their current
partners. If there are no such people, all the marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).!
From the problem description, we can see that we need:!
* a module for man!
* a module for woman!
* a module for orchestrating the experiment!
In terms of interaction between the different modules, I imagined something along the lines of…
how we read ENGLISH
see also http://bit.ly/1KN8cd0
Whilst talking with an ex-colleague, a question came up on how to implement the Stable Marriage
problem using a message passing approach. Naturally, I wanted to answer that question with Erlang!!
!
Let’s first dissect the problem and decide what processes we need and how they need to interact with
one another.!
!
The stable marriage problem is commonly stated as:!
Given n men and n women, where each person has ranked all members of the opposite sex with a
unique number between 1 and n in order of preference, marry the men and women together such that
there are no two people of opposite sex who would both rather have each other than their current
partners. If there are no such people, all the marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).!
From the problem description, we can see that we need:!
* a module for man!
* a module for woman!
* a module for orchestrating the experiment!
In terms of interaction between the different modules, I imagined something along the lines of…
2.top-to-bottom
1.left-to-right
how we read ENGLISH
see also http://bit.ly/1KN8cd0
how we read CODE
public void DoSomething(int x, int y)!
{!
Foo(y,!
Bar(x,!
Zoo(Monkey())));!
}
see also http://bit.ly/1KN8cd0
how we read CODE
public void DoSomething(int x, int y)!
{!
Foo(y,!
Bar(x,!
Zoo(Monkey())));!
}
2.bottom-to-top
1.right-to-left
see also http://bit.ly/1KN8cd0
Whilst talking with an ex-colleague, a question came up on
how to implement the Stable Marriage problem using a
message passing approach. Naturally, I wanted to answer
that question with Erlang!!
!
Let’s first dissect the problem and decide what processes we
need and how they need to interact with one another.!
!
The stable marriage problem is commonly stated as:!
Given n men and n women, where each person has ranked
all members of the opposite sex with a unique number
between 1 and n in order of preference, marry the men and
women together such that there are no two people of
opposite sex who would both rather have each other than
their current partners. If there are no such people, all the
marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).!
From the problem description, we can see that we need:!
* a module for man!
* a module for woman!
* a module for orchestrating the experiment!
In terms of interaction between the different modules, I
imagined something along the lines of…
2.top-to-bottom
1.left-to-right
how we read ENGLISH
public void DoSomething(int x, int y)!
{!
Foo(y,!
Bar(x,!
Zoo(Monkey())));!
}
2.top-to-bottom
1.right-to-left
how we read CODE
see also http://bit.ly/1KN8cd0
“…a clean design is one that
supports visual thinking so
people can meet their
informational needs with a
minimum of conscious effort.”
|>
how we read CODE
let drawCircle x y radius =
radius |> circle
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
see also http://bit.ly/1KN8cd0
how we read CODE
let drawCircle x y radius =
radius |> circle
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
2.top-to-bottom
1.left-to-right
see also http://bit.ly/1KN8cd0
let drawCircle x y radius =
circle radius
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
see also http://bit.ly/1KN8cd0
let drawCircle x y radius =
circle radius
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
see also http://bit.ly/1KN8cd0
let drawCircle x y radius =
circle radius
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
see also http://bit.ly/1KN8cd0
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
NASA orbiter crashed
because one engineer
accidentally used miles
instead of kilometres
you’re never too smart
to make mistakes
unit-of-measure
[<Measure>]!
type Pence
e.g.! 42<Pence>!
! 153<Pence>!
! …
10<Meter> / 2<Second> ! = 5<Meter/Second>!
10<Meter> * 2<Second> ! = 20<Meter Second> !
10<Meter> + 10<Meter> ! = 20<Meter>!
10<Meter> * 10! ! ! = 100<Meter>!
10<Meter> * 10<Meter> ! = 100<Meter2>!
10<Meter> + 2<Second> ! // error!
10<Meter> + 2 ! ! ! // error
10<Meter> / 2<Second> ! = 5<Meter/Second>!
10<Meter> * 2<Second> ! = 20<Meter Second> !
10<Meter> + 10<Meter> ! = 20<Meter>!
10<Meter> * 10! ! ! = 100<Meter>!
10<Meter> * 10<Meter> ! = 100<Meter2>!
10<Meter> + 2<Second> ! // error!
10<Meter> + 2 ! ! ! // error
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
Duck Typing
If it looks like a duck
and quacks like a
duck, it's a duck
def say_quack(duck):
duck.quack()
def say_quack(duck):
duck.quack()
class Duck:
def quack(self):
print("quack quack!”)
class Duck:
def quack(self):
print("quack quack!”)
!
duck = Duck()
say_quack(duck)
!
> quack quack!
class Bird:
def quack(self):
print(“tweet tweet!”)
class Bird:
def quack(self):
print(“tweet tweet!”)
!
bird = Bird()
say_quack(bird)
!
> tweet tweet!
Convenience
Safety
what if…
Convenience Safety
see also http://bit.ly/1H2fN9i
statically
resolved!
type parameters
let inline sayQuack (duck : ^a) =
(^a : (member Quack : unit -> unit) duck)
see also http://bit.ly/1H2fN9i
let inline sayQuack (duck : ^a) =
(^a : (member Quack : unit -> unit) duck)
see also http://bit.ly/1H2fN9i
let inline sayQuack (duck : ^a) =
(^a : (member Quack : unit -> unit) duck)
see also http://bit.ly/1H2fN9i
let inline sayQuack (duck : ^a) =
(^a : (member Quack : unit -> unit) duck)
see also http://bit.ly/1H2fN9i
type Duck () =
member __.Quack() =
printfn “quack quack!”
!
let duck = Duck()
sayQuack duck
!
> quack quack!
see also http://bit.ly/1H2fN9i
type Bird () =
member __.Quack() =
printfn “tweet tweet!”
!
let bird = Bird()
sayQuack bird
!
> tweet tweet!
see also http://bit.ly/1H2fN9i
type Dog () =
member __.Bark() =
printfn “woof woof!”
!
let dog = Dog()
sayQuack dog
!
error FS0001: The type ‘Dog’ does not
support the operator ‘Quack’
see also http://bit.ly/1H2fN9i
Convenience Safety
see also http://bit.ly/1H2fN9i
Tour of language landscape
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
implicit
interface!
implementation
type Duck interface
{
Quack()
}
see also http://bit.ly/1ER5zVs
func sayQuack(duck Duck) {
duck.Quack()
}
see also http://bit.ly/1ER5zVs
type Donald struct { }
func (d Donald) Quack()
{
fmt.Println(“quack quack!”)
}
see also http://bit.ly/1ER5zVs
type Bird struct { }
func (b Bird) Quack()
{
fmt.Println(“tweet tweet!”)
}
see also http://bit.ly/1ER5zVs
func main() {
donald := Donald{}
sayQuack(donald)
bird := Bird{}
sayQuack(bird)
}
see also http://bit.ly/1ER5zVs
quack quack!
func main() {
donald := Donald{}
sayQuack(donald)
bird := Bird{}
sayQuack(bird)
}
tweet tweet!
func main() {
donald := Donald{}
sayQuack(donald)
bird := Bird{}
sayQuack(bird)
}
type Dog struct { }
func (d Dog) Bark()
{
fmt.Println(“woof woof!”)
}
see also http://bit.ly/1ER5zVs
func main() {
dog := Dog{}
sayQuack(dog)
}
main.go:40: cannot use dog (type Dog) as type
Duck in argument to sayQuack:!
! Dog does not implement Duck (missing
Quack method)
see also http://bit.ly/1ER5zVs
Convenience Safety
see also http://bit.ly/1ER5zVs
patterns are observed
after the fact
see also http://bit.ly/1ER5zVs
system building is also
a process of learning
and discovery
see also http://bit.ly/1ER5zVs
implementation
package
interface package
see also http://bit.ly/1ER5zVs
encourages precise
interface definitions
see also http://bit.ly/1ER5zVs
Tour of language landscape
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
Homoiconicity
…homoiconicity is a property of some
programming languages in which the program
structure is similar to its syntax, and therefore
the program’s internal representation can be
inferred by reading the text’s layout…
code is data
data is code
(let [x 1]
(inc x))
see also http://bit.ly/1PpIrjS
(let [x 1]
(inc x))
!
=> 2
see also http://bit.ly/1PpIrjS
list (1 2 3)
vector [1 2 3]
see also http://bit.ly/1PpIrjS
(let [x 1]
(inc x))
!
list
see also http://bit.ly/1PpIrjS
(let [x 1]
(inc x))
!
symbol
see also http://bit.ly/1PpIrjS
(let [x 1]
(inc x))
!
vector
see also http://bit.ly/1PpIrjS
(let [x 1]
(inc x))
!
list
see also http://bit.ly/1PpIrjS
form :
code as data structure
see also http://bit.ly/1PpIrjS
code data
quote
eval
see also http://bit.ly/1PpIrjS
quote
(+ 1 2)
=> 3
see also http://bit.ly/1PpIrjS
quote
(+ 1 2)
=> 3
(quote (+ 1 2))
=> (+ 1 2)
see also http://bit.ly/1PpIrjS
quote
(+ 1 2)
=> 3
(quote (+ 1 2))
=> (+ 1 2)
‘(+ 1 2)
=> (+ 1 2)
see also http://bit.ly/1PpIrjS
eval
‘(+ 1 2)
=> (+ 1 2)
(eval ‘(+ 1 2))
=> 3
see also http://bit.ly/1PpIrjS
macros
(defmacro assert-equals [actual expected]
‘(let [actual-val# ~actual]
(when-not (= actual-val# ~expected)
(throw
(AssertionError.
(str “FAIL in “ ‘~actual
“n expected: “ ‘~expected
“n actual: “ actual-val#))))))
see also http://bit.ly/1PpIrjS
(assert-equals (inc 1) 2) ; => nil
(assert-equals (inc 1) (+ 0 1))
; => AssertionError FAIL in (inc 1)
; expected: (+ 0 1)
; actual: 2
see also http://bit.ly/1PpIrjS
(assert-equals (inc 1) 2) ; => nil
(assert-equals (inc 1) (+ 0 1))
; => AssertionError FAIL in (inc 1)
; expected: (+ 0 1)
; actual: 2
see also http://bit.ly/1PpIrjS
(assert-equals (inc 1) 2) ; => nil
(assert-equals (inc 1) (+ 0 1))
; => AssertionError FAIL in (inc 1)
; expected: (+ 0 1)
; actual: 2
see also http://bit.ly/1PpIrjS
huh?? where? what? how?
(defmacro assert-equals [actual expected]
‘(let [actual-val# ~actual]
(when-not (= actual-val# ~expected)
(throw
(AssertionError.
(str “FAIL in “ ‘~actual
“n expected: “ ‘~expected
“n actual: “ actual-val#))))))
(assert-equals (inc 1) (+ 0 1))
see also http://bit.ly/1PpIrjS
(defmacro assert-equals [actual expected]
‘(let [actual-val# ~actual]
(when-not (= actual-val# ~expected)
(throw
(AssertionError.
(str “FAIL in “ ‘~actual
“n expected: “ ‘~expected
“n actual: “ actual-val#))))))
(assert-equals (inc 1) (+ 0 1))
see also http://bit.ly/1PpIrjS
(defmacro assert-equals [actual expected]
‘(let [actual-val# ~actual]
(when-not (= actual-val# ~expected)
(throw
(AssertionError.
(str “FAIL in “ ‘~actual
“n expected: “ ‘~expected
“n actual: “ actual-val#))))))
(assert-equals (inc 1) (+ 0 1))
see also http://bit.ly/1PpIrjS
see also http://bit.ly/1PpIrjS
(defmacro assert-equals [actual expected]
‘(let [actual-val# ~actual]
(when-not (= actual-val# ~expected)
(throw
(AssertionError.
(str “FAIL in “ ‘~actual
“n expected: “ ‘~expected
“n actual: “ actual-val#))))))
expanded at
compile time
see also http://bit.ly/1PpIrjS
see also http://bit.ly/1PpIrjS
(macroexpand '(assert-equals (inc 1) (+ 0 1)))
; =>
; (let* [actual-value__16087__auto__ (inc 1)]
; (clojure.core/when-not
; (clojure.core/= actual-value__16087__auto__ (+ 0 1))
; (throw (java.lang.AssertionError.
; (clojure.core/str
; "FAIL in " (quote (inc 1))
; "nexpected: " (quote (+ 0 1))
; "n actual: " actual-value__16087__auto__)))))
Tour of language landscape
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness Types
Bit Syntax
Signals
Macros
Unit-of-Measure
Actor Model
GC is great
runtime cost
ownership
see also http://bit.ly/1F6WBVD
memory safety
without GC
see also http://bit.ly/1F6WBVD
ZERO
runtime cost
see also http://bit.ly/1F6WBVD
safety + speed
see also http://bit.ly/1F6WBVD
fn foo() {
// v has ownership of the vector
let v = vec![1, 2, 3];
// mutable binding
let mut v2 = vec![];
}
// vector is deallocated at the
// end of scope,
// this happens deterministically
see also http://bit.ly/1F6WBVD
immutable by default
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
!
// moved ownership to v2
let v2 = v;
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
!
// moved ownership to v2
let v2 = v;
!
println!("v[0] is {}", v[0]);
// error: use of moved value: `v`
// println!("v[0] is {}", v[0]);
// ^
see also http://bit.ly/1F6WBVD
fn take(v : Vec<i32>) {
// ownership of vector transferred
// to v in this scope
}
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
!
// moved ownership
take(v);
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
!
// moved ownership
take(v);
!
println!("v[0] is {}", v[0]);
// error: use of moved value: `v`
// println!("v[0] is {}", v[0]);
// ^
see also http://bit.ly/1F6WBVD
see also http://bit.ly/1F6WBVD
see also http://bit.ly/1F6WBVD
let me buy
your book
see also http://bit.ly/1F6WBVD
sure thing!
see also http://bit.ly/1F6WBVD
thanks
see also http://bit.ly/1F6WBVD
BURN!!! !
>:D
see also http://bit.ly/1F6WBVD
but I
still need it..!
:’(
borrowing
see also http://bit.ly/1F6WBVD
// note we're taking a reference,
// &Vec<i32>, instead of Vec<i32>
fn take(v : &Vec<i32>) {
// no need to deallocate the vector
// after we go out of scope here
}
see also http://bit.ly/1F6WBVD
// take ownership
let v = vec![1, 2, 3];
!
// notice we're passing a reference,
// &v, instead of v
take(&v); // borrow ownership
!
println!("v[0] is {}", v[0]);
// v[0] is 1
see also http://bit.ly/1F6WBVD
see also http://bit.ly/1F6WBVD
let me
borrow your
book
see also http://bit.ly/1F6WBVD
sure thing!
see also http://bit.ly/1F6WBVD
thanks
see also http://bit.ly/1F6WBVD
I’m done,
here you go
see also http://bit.ly/1F6WBVD
thanks
see also http://bit.ly/1F6WBVD
immutable by default
fn take(v : &Vec<i32>) {
v.push(5);
}
!
let v = vec![];
take(&v);
// cannot borrow immutable borrowed
// content `*v` as mutable
// v.push(5);
// ^
see also http://bit.ly/1F6WBVD
fn take(v : &mut Vec<i32>) {
v.push(5);
}
!
let mut v = vec![];
take(&mut v);
!
println!("v[0] is {}", v[0]);
// v[0] is 5
see also http://bit.ly/1F6WBVD
borrowing
rules
see also http://bit.ly/1F6WBVD
see also http://bit.ly/1F6WBVD
Rule 1.!
!
the borrower’s scope must not
outlast the owner
see also http://bit.ly/1F6WBVD
Rule 2.!
!
one of the following, but not both:!
2.1 0 or more refs to a resource!
2.2 exactly 1 mutable ref
see also http://bit.ly/1F6WBVD
data race
There is a ‘data race’ when two or more pointers
access the same memory location at the same
time, where at least one of them is writing, and
the operations are not synchronised.
see also http://bit.ly/1F6WBVD
data race
a. two or more pointers to the same resource!
b. at least one is writing!
c. operations are not synchronised
see also http://bit.ly/1F6WBVD
Data Race Conditions!
a. two or more pointers to the same resource!
b. at least one is writing!
c. operations are not synchronised
Borrowing Rules!
one of the following, but not both:!
! 2.1 0 or more refs to a resource!
! 2.2 exactly 1 mutable ref
see also http://bit.ly/1F6WBVD
Data Race Conditions!
a. two or more pointers to the same resource!
b. at least one is writing!
c. operations are not synchronised
Borrowing Rules!
one of the following, but not both:!
! 2.1 0 or more refs to a resource!
! 2.2 exactly 1 mutable ref
see also http://bit.ly/1F6WBVD
Tour of language landscape
Dependent Types
Uniqueness Types
Bit Syntax
Borrowed Pointers
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Signals
Macros
Unit-of-Measure
Actor Model
seen generics?
aka parametric polymorphism
List<T>
List<T>
List<int> List<Cat>
List<string>
what if…
types that depend on
arbitrary values?
Vect n a
vector of n elements of type a
zipWith :
(a -> b -> c)
-> Vect n a
-> Vect n b
-> Vect n c
zipWith f [] [] = []
zipWith f (x :: xs) (y :: ys) =
f x y :: zipWith f xs ys
Type Driven Development
making invalid state
UNREPRESENTABLE
see also https://vimeo.com/123606435
Tour of language landscape
Signals
Dependent Types
Uniqueness Types
Bit Syntax
Borrowed Pointers
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Macros
Unit-of-Measure
Actor Model
Function Reactive
Programming
Value over Time
Time
Value
Signals
Move Up
Move Down
private var arrowKeyUp:Bool;
private var arrowKeyDown:Bool;
!
private var platform1:Platform;
private var platform2:Platform;
private var ball:Ball;
function keyDown(event:KeyboardEvent):Void
{
if (currentGameState == Paused &&
event.keyCode == 32) {
setGameState(Playing);
} else if (event.keyCode == 38) {
! ! arrowKeyUp = true;!
}else if (event.keyCode == 40) {
! ! arrowKeyDown = true;!
}
}
function keyUp(event:KeyboardEvent):Void {
if (event.keyCode == 38) {
! ! arrowKeyUp = false;!
} else if (event.keyCode == 40) {
! ! arrowKeyDown = false;!
}
}
function everyFrame(event:Event):Void {
if(currentGameState == Playing){
if (arrowKeyUp) {
platform1.y -= platformSpeed;
}
if (arrowKeyDown) {
platform1.y += platformSpeed;
}
if (platform1.y < 5)
platform1.y = 5;
if (platform1.y > 395)
platform1.y = 395;
}
}
function everyFrame(event:Event):Void {
if(currentGameState == Playing){
if (arrowKeyUp) {
platform1.y -= platformSpeed;
}
if (arrowKeyDown) {
platform1.y += platformSpeed;
}
if (platform1.y < 5) !
! ! ! platform1.y = 5;!
! ! if (platform1.y > 395) !
! ! ! platform1.y = 395;!
}
}
source files
state changes
source files execution
source files execution
mental model
input state new state behaviour
{ x; y } { x; y-speed }
{ x; y } { x; y+speed }
timer { x; y } { x; y } draw platform
… … … …
transformation
let y = f(x)
Imperative Functional
x.f()
mutation
transformations
simplify problem
decomposition
Move Up
Move Down
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
type alias Platform = {x:Int, y:Int}!
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
Keyboard.arrows
UP { x=0, y=1 }
DOWN { x=0, y=-1 }
LEFT { x=-1, y=0 }
RIGHT { x=1, y=0 }
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform!
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
type alias Platform = {x:Int, y:Int}
defaultPlatform = {x=5, y=0}
!
delta = Time.fps 20
input = Signal.sampleOn delta Keyboard.arrows
!
cap x = max 5 <| min x 395
!
p1 : Signal Platform
p1 = foldp ({x, y} s -> {s | y <- cap <| s.y + 5*y})
defaultPlatform
input
“I thought of objects being like
biological cells and/or
individual computers on a
network, only able to
communicate with messages.”
- Alan Kay
“OOP to me means only
messaging, local retention and
protection and hiding of state-
process, and extreme late-
binding of all things.”
- Alan Kay
Tour of language landscape
Borrowed Pointers
Actor Model
Bit Syntax
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Dependent Types
Uniqueness Types
Signals
Macros
Unit-of-Measure
actor model
actor
state
mailbox
actors share nothing
actor
state
mailbox
actor
actor
state
mailbox
actor
processing!
storage!
communication
loop (Map) ->!
receive!
{get, Key, Pid} ->!
Pid ! maps:get(Key, Map, not_found),!
loop(Map);!
{set, Key, Value} ->!
loop(maps:put(Key, Value, Map))!
end.
loop (Map) ->!
receive!
{get, Key, Pid} ->!
Pid ! maps:get(Key, Map, not_found),!
loop(Map);!
{set, Key, Value} ->!
loop(maps:put(Key, Value, Map))!
end.
loop (Map) ->!
receive!
{get, Key, Pid} ->!
Pid ! maps:get(Key, Map, not_found),!
loop(Map);!
{set, Key, Value} ->!
loop(maps:put(Key, Value, Map))!
end.
loop (Map) ->!
receive!
{get, Key, Pid} ->!
Pid ! maps:get(Key, Map, not_found),!
loop(Map);!
{set, Key, Value} ->!
loop(maps:put(Key, Value, Map))!
end.
client (N, Pid) ->!
Pid ! {set, N, N},!
Pid ! {get, N, self()},!
receive!
not_found -> io:format(“~p :-(~n”, [N]);!
N -> io:format(“~p :-)~n”, [N]);!
_ -> io:format(“~p …~n”, [N])!
end.
client (N, Pid) ->!
Pid ! {set, N, N},!
Pid ! {get, N, self()},!
receive!
not_found -> io:format(“~p :-(~n”, [N]);!
N -> io:format(“~p :-)~n”, [N]);!
_ -> io:format(“~p …~n”, [N])!
end.
client (N, Pid) ->!
Pid ! {set, N, N},!
Pid ! {get, N, self()},!
receive!
not_found -> io:format(“~p :-(~n”, [N]);!
N -> io:format(“~p :-)~n”, [N]);!
_ -> io:format(“~p …~n”, [N])!
end.
start(N) ->!
Kvs = spawn(mod, loop, [#{}]),!
[spawn(mod, client, [X, Kvs]) !
|| X <- lists:seq(1,N)].
Tour of language landscape
actors are cheap
no locks!
need state?!
talk to the actor!
location
transparency
pre-emptive
scheduling
makes you !
THINK !
about !
distributed systems
messaging promotes
failure thinking
Distributed
Computing
Network is reliable!
Latency is zero!
Bandwidth is infinite!
Network is secure!
Topology doesn't change!
There is one administrator!
Transport cost is zero!
The network is homogeneous
8 fallacies of distributed computing
supervise & restart
Tour of language landscape
http://www.ustream.tv/recorded/61443262
https://aphyr.com/posts
Borrowed Pointers
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Dependent Types
Uniqueness Types
Signals
Macros
Unit-of-Measure
Bit Syntax
Actor Model
pattern matching
{ X, Y } = { 1, 2 }
{ X, Y } = { 1, 2 }
[ H | T ] = [ 1, 2, 3 ]
image from http://learnyousomeerlang.com/
[ H | T ] = [ 1, 2, 3 ]
what if…
you can pattern
match binary data?!
e.g. TCP payload
Tour of language landscape
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
Tour of language landscape
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
Tour of language landscape
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
.!
.!
.
<<SourcePort:16, DestinationPort:16, !
SeqNumber:32,!
AckNumber:32, DataOffset:4, !
Reserved:3, Flags:9, WindSize:16,!
CheckSum:16, UrgentPointer:16,!
Payload/binary>> = SomeBinary
case Packet of!
<<SeqNum:16/big-unsigned-integer, !
Timestamp:32/big-unsigned-integer, !
Src:32/little-signed-integer, !
_/binary>> ->!
! % do something useful!
! …!
_ ->!
! % invalid format!
! …!
end
case Packet of!
<<SeqNum:16/big-unsigned-integer, !
Timestamp:32/big-unsigned-integer, !
Src:32/little-signed-integer, !
_/binary>> ->!
! % do something useful!
! …!
_ ->!
! % invalid format!
! …!
end
case Packet of!
<<SeqNum:16/big-unsigned-integer, !
Timestamp:32/big-unsigned-integer, !
Src:32/little-signed-integer, !
_/binary>> ->!
! % do something useful!
! …!
_ ->!
! % invalid format!
! …!
end
case Packet of!
<<SeqNum:16/big-unsigned-integer, !
Timestamp:32/big-unsigned-integer, !
Src:32/little-signed-integer, !
_/binary>> ->!
! % do something useful!
! …!
_ ->!
! % invalid format!
! …!
end
case Packet of!
<<SeqNum:16/big-unsigned-integer, !
Timestamp:32/big-unsigned-integer, !
Src:32/little-signed-integer, !
_/binary>> ->!
! % do something useful!
! …!
_ ->!
! % invalid format!
! …!
end
Type Provider Pipes
Statically Resolved TP
Implicit Interface
Implementation
Borrowed Pointers Dependent Types
Uniqueness TypesOTP
Bit Syntax
Signals
Macros
Unit-of-Measure
10,000 hours to be
good at something
see also http://bit.ly/1KN7SLq
10,000 hours to be
good at something
see also http://bit.ly/1KN7SLq
10,000 hours to reach
top of an ultra-
competitive field
see also http://bit.ly/1KN7SLq
Tour of language landscape
the first 20 hours -
how to learn anything
see also http://bit.ly/1KN7SLq
Practice Time
Howgoodyouare
see also http://bit.ly/1KN7SLq
1.Deconstruct the skill
see also http://bit.ly/1KN7SLq
1.Deconstruct the skill!
2.Learn enough to self-correct
see also http://bit.ly/1KN7SLq
1.Deconstruct the skill!
2.Learn enough to self-correct!
3.Remove practice barriers
see also http://bit.ly/1KN7SLq
1.Deconstruct the skill!
2.Learn enough to self-correct!
3.Remove practice barriers!
4.Practice at least 20 hrs
see also http://bit.ly/1KN7SLq
Tour of language landscape
learn a new paradigm!
not a new syntax
see also http://bit.ly/1IzXVSo
logic programming
stack-oriented
programming
array programming
“A language that doesn't
affect the way you think
about programming, is not
worth knowing.”
- Alan Perlis
see also http://bit.ly/1IzXVSo
see also http://bit.ly/1IzXVSo
Enterprise Tic-Tac-Toe -
a Functional Approach
Type Driven Development
Computation expression in context :
a history of the otter king
Learning From Haskell
“Learning is an act of creation
itself, because something
happens in you that wasn't
there before.”
- Alan Kay
@theburningmonk
theburningmonk.com
github.com/theburningmonk
@theburningmonk
theburningmonk.com
github.com/theburningmonk
WE’RE HIRING
www.gamesyscorporate.com/careers
1 of 285

Recommended

Tour of language landscape by
Tour of language landscapeTour of language landscape
Tour of language landscapeYan Cui
4.5K views156 slides
Tour of language landscape (katsconf) by
Tour of language landscape (katsconf)Tour of language landscape (katsconf)
Tour of language landscape (katsconf)Yan Cui
7.4K views236 slides
Tour of language landscape (code.talks) by
Tour of language landscape (code.talks)Tour of language landscape (code.talks)
Tour of language landscape (code.talks)Yan Cui
4.4K views233 slides
7 ineffective coding habits many F# programmers don't have by
7 ineffective coding habits many F# programmers don't have7 ineffective coding habits many F# programmers don't have
7 ineffective coding habits many F# programmers don't haveYan Cui
709.5K views207 slides
AWS Lambda from the trenches by
AWS Lambda from the trenchesAWS Lambda from the trenches
AWS Lambda from the trenchesYan Cui
5.3K views200 slides
Tame cloud complexity with F#-powered DSLs by
Tame cloud complexity with F#-powered DSLsTame cloud complexity with F#-powered DSLs
Tame cloud complexity with F#-powered DSLsYan Cui
20.8K views204 slides

More Related Content

Similar to Tour of language landscape

Tour of language landscape (BuildStuff) by
Tour of language landscape (BuildStuff)Tour of language landscape (BuildStuff)
Tour of language landscape (BuildStuff)Yan Cui
498 views179 slides
Large Components in the Rearview Mirror by
Large Components in the Rearview MirrorLarge Components in the Rearview Mirror
Large Components in the Rearview MirrorMichelle Brush
105 views146 slides
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the user by
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the userVoxxed Athens 2018 - UX design and back-ends: When the back-end meets the user
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the userVoxxed Athens
150 views49 slides
From Natural Language Processing to Artificial Intelligence by
From Natural Language Processing to Artificial IntelligenceFrom Natural Language Processing to Artificial Intelligence
From Natural Language Processing to Artificial IntelligenceJonathan Mugan
5.4K views64 slides
Data Day Seattle, From NLP to AI by
Data Day Seattle, From NLP to AIData Day Seattle, From NLP to AI
Data Day Seattle, From NLP to AIJonathan Mugan
1.1K views67 slides
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P... by
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...Sri Ambati
4.2K views59 slides

Similar to Tour of language landscape(20)

Tour of language landscape (BuildStuff) by Yan Cui
Tour of language landscape (BuildStuff)Tour of language landscape (BuildStuff)
Tour of language landscape (BuildStuff)
Yan Cui498 views
Large Components in the Rearview Mirror by Michelle Brush
Large Components in the Rearview MirrorLarge Components in the Rearview Mirror
Large Components in the Rearview Mirror
Michelle Brush105 views
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the user by Voxxed Athens
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the userVoxxed Athens 2018 - UX design and back-ends: When the back-end meets the user
Voxxed Athens 2018 - UX design and back-ends: When the back-end meets the user
Voxxed Athens150 views
From Natural Language Processing to Artificial Intelligence by Jonathan Mugan
From Natural Language Processing to Artificial IntelligenceFrom Natural Language Processing to Artificial Intelligence
From Natural Language Processing to Artificial Intelligence
Jonathan Mugan5.4K views
Data Day Seattle, From NLP to AI by Jonathan Mugan
Data Day Seattle, From NLP to AIData Day Seattle, From NLP to AI
Data Day Seattle, From NLP to AI
Jonathan Mugan1.1K views
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P... by Sri Ambati
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...
Explaining Black-Box Machine Learning Predictions - Sameer Singh, Assistant P...
Sri Ambati4.2K views
HarambeeNet: Data by the people, for the people by Michael Bernstein
HarambeeNet: Data by the people, for the peopleHarambeeNet: Data by the people, for the people
HarambeeNet: Data by the people, for the people
Michael Bernstein854 views
SpringOne Tour: The Influential Software Engineer by VMware Tanzu
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
VMware Tanzu40 views
Moved to https://slidr.io/azzazzel/web-application-performance-tuning-beyond-xmx by Milen Dyankov
Moved to https://slidr.io/azzazzel/web-application-performance-tuning-beyond-xmxMoved to https://slidr.io/azzazzel/web-application-performance-tuning-beyond-xmx
Moved to https://slidr.io/azzazzel/web-application-performance-tuning-beyond-xmx
Milen Dyankov35.8K views
Semantic web and information graph by Chao-Hsuan Shen
Semantic web and information graphSemantic web and information graph
Semantic web and information graph
Chao-Hsuan Shen293 views
It's Not Just About Code by Dan Pickett
It's Not Just About CodeIt's Not Just About Code
It's Not Just About Code
Dan Pickett3.3K views
Calin Constantinov - Neo4j - Bucharest Big Data Week Meetup - Bucharest 2018 by Calin Constantinov
Calin Constantinov - Neo4j - Bucharest Big Data Week Meetup - Bucharest 2018Calin Constantinov - Neo4j - Bucharest Big Data Week Meetup - Bucharest 2018
Calin Constantinov - Neo4j - Bucharest Big Data Week Meetup - Bucharest 2018
Calin Constantinov102 views
Frontiers of Computational Journalism week 1 - Introduction and High Dimensio... by Jonathan Stray
Frontiers of Computational Journalism week 1 - Introduction and High Dimensio...Frontiers of Computational Journalism week 1 - Introduction and High Dimensio...
Frontiers of Computational Journalism week 1 - Introduction and High Dimensio...
Jonathan Stray480 views
Build a Chatbot with IBM Watson - No Coding Required by Charlotte Han
Build a Chatbot with IBM Watson - No Coding RequiredBuild a Chatbot with IBM Watson - No Coding Required
Build a Chatbot with IBM Watson - No Coding Required
Charlotte Han710 views
Schemas for the Real World [Madison RubyConf 2013] by Carina C. Zona
Schemas for the Real World [Madison RubyConf 2013]Schemas for the Real World [Madison RubyConf 2013]
Schemas for the Real World [Madison RubyConf 2013]
Carina C. Zona1.6K views
How to Design a Bot Experience Like Your Reputation Depends on it - Ben Scott... by Eventz.Digital
How to Design a Bot Experience Like Your Reputation Depends on it - Ben Scott...How to Design a Bot Experience Like Your Reputation Depends on it - Ben Scott...
How to Design a Bot Experience Like Your Reputation Depends on it - Ben Scott...
Eventz.Digital309 views
Usable Language | How Content Shapes The User Experience by Randall Snare
Usable Language | How Content Shapes The User ExperienceUsable Language | How Content Shapes The User Experience
Usable Language | How Content Shapes The User Experience
Randall Snare4.6K views

More from Yan Cui

How to win the game of trade-offs by
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offsYan Cui
21 views84 slides
How to choose the right messaging service by
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging serviceYan Cui
135 views118 slides
How to choose the right messaging service for your workload by
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workloadYan Cui
65 views113 slides
Patterns and practices for building resilient serverless applications.pdf by
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdfYan Cui
170 views137 slides
Lambda and DynamoDB best practices by
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practicesYan Cui
817 views148 slides
Lessons from running AppSync in prod by
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prodYan Cui
1.1K views102 slides

More from Yan Cui(20)

How to win the game of trade-offs by Yan Cui
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offs
Yan Cui21 views
How to choose the right messaging service by Yan Cui
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging service
Yan Cui135 views
How to choose the right messaging service for your workload by Yan Cui
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workload
Yan Cui65 views
Patterns and practices for building resilient serverless applications.pdf by Yan Cui
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdf
Yan Cui170 views
Lambda and DynamoDB best practices by Yan Cui
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practices
Yan Cui817 views
Lessons from running AppSync in prod by Yan Cui
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prod
Yan Cui1.1K views
Serverless observability - a hero's perspective by Yan Cui
Serverless observability - a hero's perspectiveServerless observability - a hero's perspective
Serverless observability - a hero's perspective
Yan Cui385 views
How to ship customer value faster with step functions by Yan Cui
How to ship customer value faster with step functionsHow to ship customer value faster with step functions
How to ship customer value faster with step functions
Yan Cui652 views
How serverless changes the cost paradigm by Yan Cui
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigm
Yan Cui1.1K views
Why your next serverless project should use AWS AppSync by Yan Cui
Why your next serverless project should use AWS AppSyncWhy your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSync
Yan Cui1.3K views
Build social network in 4 weeks by Yan Cui
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeks
Yan Cui642 views
Patterns and practices for building resilient serverless applications by Yan Cui
Patterns and practices for building resilient serverless applicationsPatterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applications
Yan Cui393 views
How to bring chaos engineering to serverless by Yan Cui
How to bring chaos engineering to serverlessHow to bring chaos engineering to serverless
How to bring chaos engineering to serverless
Yan Cui456 views
Migrating existing monolith to serverless in 8 steps by Yan Cui
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 steps
Yan Cui402 views
Building a social network in under 4 weeks with Serverless and GraphQL by Yan Cui
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQL
Yan Cui289 views
FinDev as a business advantage in the post covid19 economy by Yan Cui
FinDev as a business advantage in the post covid19 economyFinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economy
Yan Cui546 views
How to improve lambda cold starts by Yan Cui
How to improve lambda cold startsHow to improve lambda cold starts
How to improve lambda cold starts
Yan Cui866 views
What can you do with lambda in 2020 by Yan Cui
What can you do with lambda in 2020What can you do with lambda in 2020
What can you do with lambda in 2020
Yan Cui1K views
A chaos experiment a day, keeping the outage away by Yan Cui
A chaos experiment a day, keeping the outage awayA chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage away
Yan Cui385 views
How to debug slow lambda response times by Yan Cui
How to debug slow lambda response timesHow to debug slow lambda response times
How to debug slow lambda response times
Yan Cui317 views

Recently uploaded

CXL at OCP by
CXL at OCPCXL at OCP
CXL at OCPCXL Forum
208 views66 slides
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi by
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi
"AI Startup Growth from Idea to 1M ARR", Oleksandr UspenskyiFwdays
26 views9 slides
.conf Go 2023 - Data analysis as a routine by
.conf Go 2023 - Data analysis as a routine.conf Go 2023 - Data analysis as a routine
.conf Go 2023 - Data analysis as a routineSplunk
90 views12 slides
Photowave Presentation Slides - 11.8.23.pptx by
Photowave Presentation Slides - 11.8.23.pptxPhotowave Presentation Slides - 11.8.23.pptx
Photowave Presentation Slides - 11.8.23.pptxCXL Forum
126 views16 slides
The details of description: Techniques, tips, and tangents on alternative tex... by
The details of description: Techniques, tips, and tangents on alternative tex...The details of description: Techniques, tips, and tangents on alternative tex...
The details of description: Techniques, tips, and tangents on alternative tex...BookNet Canada
110 views24 slides
ChatGPT and AI for Web Developers by
ChatGPT and AI for Web DevelopersChatGPT and AI for Web Developers
ChatGPT and AI for Web DevelopersMaximiliano Firtman
174 views82 slides

Recently uploaded(20)

CXL at OCP by CXL Forum
CXL at OCPCXL at OCP
CXL at OCP
CXL Forum208 views
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi by Fwdays
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi
"AI Startup Growth from Idea to 1M ARR", Oleksandr Uspenskyi
Fwdays26 views
.conf Go 2023 - Data analysis as a routine by Splunk
.conf Go 2023 - Data analysis as a routine.conf Go 2023 - Data analysis as a routine
.conf Go 2023 - Data analysis as a routine
Splunk90 views
Photowave Presentation Slides - 11.8.23.pptx by CXL Forum
Photowave Presentation Slides - 11.8.23.pptxPhotowave Presentation Slides - 11.8.23.pptx
Photowave Presentation Slides - 11.8.23.pptx
CXL Forum126 views
The details of description: Techniques, tips, and tangents on alternative tex... by BookNet Canada
The details of description: Techniques, tips, and tangents on alternative tex...The details of description: Techniques, tips, and tangents on alternative tex...
The details of description: Techniques, tips, and tangents on alternative tex...
BookNet Canada110 views
[2023] Putting the R! in R&D.pdf by Eleanor McHugh
[2023] Putting the R! in R&D.pdf[2023] Putting the R! in R&D.pdf
[2023] Putting the R! in R&D.pdf
Eleanor McHugh38 views
AI: mind, matter, meaning, metaphors, being, becoming, life values by Twain Liu 刘秋艳
AI: mind, matter, meaning, metaphors, being, becoming, life valuesAI: mind, matter, meaning, metaphors, being, becoming, life values
AI: mind, matter, meaning, metaphors, being, becoming, life values
Data-centric AI and the convergence of data and model engineering: opportunit... by Paolo Missier
Data-centric AI and the convergence of data and model engineering:opportunit...Data-centric AI and the convergence of data and model engineering:opportunit...
Data-centric AI and the convergence of data and model engineering: opportunit...
Paolo Missier29 views
Empathic Computing: Delivering the Potential of the Metaverse by Mark Billinghurst
Empathic Computing: Delivering  the Potential of the MetaverseEmpathic Computing: Delivering  the Potential of the Metaverse
Empathic Computing: Delivering the Potential of the Metaverse
Mark Billinghurst449 views
"Ukrainian Mobile Banking Scaling in Practice. From 0 to 100 and beyond", Vad... by Fwdays
"Ukrainian Mobile Banking Scaling in Practice. From 0 to 100 and beyond", Vad..."Ukrainian Mobile Banking Scaling in Practice. From 0 to 100 and beyond", Vad...
"Ukrainian Mobile Banking Scaling in Practice. From 0 to 100 and beyond", Vad...
Fwdays40 views
MemVerge: Gismo (Global IO-free Shared Memory Objects) by CXL Forum
MemVerge: Gismo (Global IO-free Shared Memory Objects)MemVerge: Gismo (Global IO-free Shared Memory Objects)
MemVerge: Gismo (Global IO-free Shared Memory Objects)
CXL Forum112 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 Bouraqadi113 views
"Quality Assurance: Achieving Excellence in startup without a Dedicated QA", ... by Fwdays
"Quality Assurance: Achieving Excellence in startup without a Dedicated QA", ..."Quality Assurance: Achieving Excellence in startup without a Dedicated QA", ...
"Quality Assurance: Achieving Excellence in startup without a Dedicated QA", ...
Fwdays33 views
AMD: 4th Generation EPYC CXL Demo by CXL Forum
AMD: 4th Generation EPYC CXL DemoAMD: 4th Generation EPYC CXL Demo
AMD: 4th Generation EPYC CXL Demo
CXL Forum126 views
"Thriving Culture in a Product Company — Practical Story", Volodymyr Tsukur by Fwdays
"Thriving Culture in a Product Company — Practical Story", Volodymyr Tsukur"Thriving Culture in a Product Company — Practical Story", Volodymyr Tsukur
"Thriving Culture in a Product Company — Practical Story", Volodymyr Tsukur
Fwdays40 views
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu... by NUS-ISS
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
NUS-ISS32 views
"How we switched to Kanban and how it integrates with product planning", Vady... by Fwdays
"How we switched to Kanban and how it integrates with product planning", Vady..."How we switched to Kanban and how it integrates with product planning", Vady...
"How we switched to Kanban and how it integrates with product planning", Vady...
Fwdays61 views
Future of Learning - Khoong Chan Meng by NUS-ISS
Future of Learning - Khoong Chan MengFuture of Learning - Khoong Chan Meng
Future of Learning - Khoong Chan Meng
NUS-ISS31 views

Tour of language landscape