2015 Pharo Prague Lambda Meetup

129
Pharo: Live objects for complex projects http://stephane.ducasse.free.fr http://www.pharo.org

Transcript of 2015 Pharo Prague Lambda Meetup

Page 1: 2015 Pharo Prague Lambda Meetup

Pharo: Live objects for complex projects

http://stephane.ducasse.free.fr http://www.pharo.org

Page 2: 2015 Pharo Prague Lambda Meetup
Page 3: 2015 Pharo Prague Lambda Meetup

I did my PhD in Lisp and Scheme :)

Page 4: 2015 Pharo Prague Lambda Meetup
Page 5: 2015 Pharo Prague Lambda Meetup

Talk Roadmap• Pharo: an open-source project

• Get the feel

• Model/Syntax

• Coding with the audience

• Web Development in Pharo

• Ongoing works

• Wrap-up

Page 6: 2015 Pharo Prague Lambda Meetup

http://www.pharo.orgPure object language Great community of active doers Powerful and full access Elegant and fun to program Living system under your fingers 100% MIT inside Mac, Linuxes, Windows, iOS

Page 7: 2015 Pharo Prague Lambda Meetup

A powerful engine to invent (y)our future

Page 8: 2015 Pharo Prague Lambda Meetup

Some projectsWeb frameworks - Seaside, iliad, HTTP2, Tide, Aida, Mustache, Oauth, WebSocket CSS styling Format parsers - XML, HTML, NeoJSON, NeoCSV. Application Security, Graphics frameworks - Roassal, Mondrian, EyeSee, GraphET, Tool builders - Glamour, Spec, XUL, MacNative, Databases - DBXTalk, Mongo, Riak, CouchDB, MySql, PunQLite. Object-Oriented databases - Magma, Goods. Database abstraction - Voyage, ROE MetaCompiler - Petit Parser, SmaCC - Proxy, Logging - SystemLogger, Toothpick, SimpleLogger Units: Aconcagua, Units Time - Chronos Calendars, Timezones Productivity Tools - Codecritics, Refactorings, Cherry picking merge tools: merge tool, Komitter Versionner, Mock frameworks (baby mock), PDFgeneration - Artefact, Testing frameworks - PhExample, SUnit Assembly generation: ASMJIT, Integration Tools: Hudson, Alternate window manager, Games: Tetris, Sokoban, Miner, Chess, CrossWords MetaModeling Frameworks - Magritte, Platypus, Cloud deployement - cloudfork cloudPharo, 3D: Roassal3d, NBOpenGL, JVM connection Bio informatics, ODE solvers, Interactive Geometry - DrGeo…

Page 9: 2015 Pharo Prague Lambda Meetup

Some projectsWeb frameworks - Seaside, iliad, HTTP2, Tide, Aida, Mustache, Oauth, WebSocket CSS styling Format parsers - XML, HTML, NeoJSON, NeoCSV. Application Security, Graphics frameworks - Roassal, Mondrian, EyeSee, GraphET, Tool builders - Glamour, Spec, XUL, MacNative, Databases - DBXTalk, Mongo, Riak, CouchDB, MySql, PunQLite. Object-Oriented databases - Magma, Goods. Database abstraction - Voyage, ROE MetaCompiler - Petit Parser, SmaCC - Proxy, Logging - SystemLogger, Toothpick, SimpleLogger Units: Aconcagua, Units Time - Chronos Calendars, Timezones Productivity Tools - Codecritics, Refactorings, Cherry picking merge tools: merge tool, Komitter Versionner, Mock frameworks (baby mock), PDFgeneration - Artefact, Testing frameworks - PhExample, SUnit Assembly generation: ASMJIT, Integration Tools: Hudson, Alternate window manager, Games: Tetris, Sokoban, Miner, Chess, CrossWords MetaModeling Frameworks - Magritte, Platypus, Cloud deployement - cloudfork cloudPharo, 3D: Roassal3d, NBOpenGL, JVM connection Bio informatics, ODE solvers, Interactive Geometry - DrGeo…

AND MUCH

MORE

Page 10: 2015 Pharo Prague Lambda Meetup

Our goal...

Page 11: 2015 Pharo Prague Lambda Meetup

An ecosystem where innovation/business bloom

Page 12: 2015 Pharo Prague Lambda Meetup

We want that **you** can make money with Pharo. We want to be able to invent solutions to existing problems.

!

We want a powerful innovative dynamic language where we can build our future.

Page 13: 2015 Pharo Prague Lambda Meetup

We are a cool community

Page 14: 2015 Pharo Prague Lambda Meetup

Tweets, blogs, buzz

Pharo 3,303 tweets / 1092 followers S. Ducasse tweets 669 / 804 followers S. Stinckwich 8712 / 1006 followers Moose 502 tweets / 255 followers Youtube Pharo smalltalk: about 1540 videos!

Page 15: 2015 Pharo Prague Lambda Meetup

• Uni. of Buenos Aires • Uni. of Bern • Uni. of Maroua • Uni. of Brussels • Ecole des Mines de Douai • Uni. de Savoie • Ivan Franko Nat. Uni. of Lviv • Czech Technical Uni. • CULS Prague• Uni. of Quilmes • Uni. of La Plata • Northern Michigan Uni. • Uni. Technologica Nacional (UTN) • Uni. Catholic of Argentina • Uni. of Chile • Uni. Policnica de Catalunya • Uni. de Bretagne Occidentale • Uni. of Tomsk • Uni. of Fernhagen • IT University of Copenhagen • Uni. Cat del Sacro Cuore of Brescia

Pharo's Teachers

Page 16: 2015 Pharo Prague Lambda Meetup
Page 17: 2015 Pharo Prague Lambda Meetup

Lafhis (AR)Software Composition Group (CH) CAR (FR)RMOD (FR) Ummisco (IRD) Reveal (CH) Lysic (FR)Pleiad (CL) CEA-List (FR) Uqbar (AR) CCMI-FIT(CZ)

Research Groups

Page 18: 2015 Pharo Prague Lambda Meetup

www.2denker.de www.agilitic.com

www.airflowing.com www.anymorphic.com www.ardishealth.com

www.beta9.be www.bombardier.com

www.cmsbox.com www.finworks.biz

seaside.gemstone.com www.ibizlog.com www.inceptive.be www.jooshr.com www.majcon.de

www.mindclue.ch

www.miriamtech.com www.myneat.org www.netstyle.ch

www.panasoft.com www.pinesoft.co.uk

www.promedmedical.net www.sharedlogic.ca

www.smallworks.com.ar www.10pines.com www.trantaria.com www.yesplan.be

www.synectique.eu www.sorabito.com objectprofile.com

!

Companies

Page 19: 2015 Pharo Prague Lambda Meetup

BooksPharo by example http://www.pharobyexample.org

translated to french, merci!

translated to spanish, gracias!

translated to japanese, ありがとう!

Deep into Pharo http://www.deepintopharo.org

Numerical Methods

https://github.com/SquareBracketAssociates/NumericalMethods/releases

New books in preparation

Updated Pharo by Example

Entreprise Pharo

Fun with Pharo

Page 20: 2015 Pharo Prague Lambda Meetup

Some success stories…

Page 21: 2015 Pharo Prague Lambda Meetup
Page 22: 2015 Pharo Prague Lambda Meetup
Page 23: 2015 Pharo Prague Lambda Meetup

Continuous API Testingkeep your services under control 24/7

Norbert Hartl [email protected]

Page 24: 2015 Pharo Prague Lambda Meetup

eMCee is developed and deployed using pharo

- zinc

- seaside

- jquery

- magritte

- mongotalk

- magritte-mongo

- fuel

- metacello

[email protected]

Page 25: 2015 Pharo Prague Lambda Meetup

Sunday 20 May 12

Page 26: 2015 Pharo Prague Lambda Meetup

• Entry Level Track & Trace Product

• Complements T3 Full Product

• One Page Javascript HTML5 / Ajax Client

• REST Back End in Pharo Smalltalk

• Gateways to multiple data providers

Sunday 20 May 12

Page 27: 2015 Pharo Prague Lambda Meetup

WEBDRUCK.CHWeb-To-Print Solution

• Design and create individual printed matter

• eShop with credit card payment

• High quality PDF output with Printing Process integration

• Thousands of orders for seven Swiss printing companies

Page 28: 2015 Pharo Prague Lambda Meetup

NTed: disaster scenario recovery

Page 29: 2015 Pharo Prague Lambda Meetup

iBizLog - http://www.ibizlog.com

A product by SmallworksTuesday, May 15, 12

Page 30: 2015 Pharo Prague Lambda Meetup
Page 31: 2015 Pharo Prague Lambda Meetup
Page 32: 2015 Pharo Prague Lambda Meetup
Page 33: 2015 Pharo Prague Lambda Meetup
Page 34: 2015 Pharo Prague Lambda Meetup
Page 35: 2015 Pharo Prague Lambda Meetup
Page 36: 2015 Pharo Prague Lambda Meetup
Page 37: 2015 Pharo Prague Lambda Meetup
Page 38: 2015 Pharo Prague Lambda Meetup
Page 39: 2015 Pharo Prague Lambda Meetup

Pinesoft MBagger

Page 40: 2015 Pharo Prague Lambda Meetup

Since may 2008Pharo 4.0 - Apr/Jul 2015 (1271 issues closed…)

Pharo 3.0 - Apr 2013 (2364 issues closed)

Pharo 2.0 - Apr 2013 (1727 issues closed)

Pharo 1.4 - Apr 2012 (860 updates)

Pharo 1.3 (700 updates)

Pharo 1.2 - mar 2011 (500 updates)

Pharo 1.1 - jul 2010 (410 updates)

Page 41: 2015 Pharo Prague Lambda Meetup

We are improving the complete system!

Page 42: 2015 Pharo Prague Lambda Meetup

Of course not everything is perfect :) But it feels like that:

Page 43: 2015 Pharo Prague Lambda Meetup

Pharo is

yours

Page 44: 2015 Pharo Prague Lambda Meetup

with 20 min per week you can get an impact!

Page 45: 2015 Pharo Prague Lambda Meetup

Getting the object feel

• Live interaction

• Using Inspectors

• Talk and interact with objects

• Programs are objects too

Page 46: 2015 Pharo Prague Lambda Meetup

http://youtu.be/CuimMwuZiGA

Page 47: 2015 Pharo Prague Lambda Meetup

Scripting livehttps://www.youtube.com/watch?v=1Nze9tnwYxY

Page 48: 2015 Pharo Prague Lambda Meetup

http://www.pharocasts.com/2010/08/see-how-to-get-data-from-url-parse-xml.html

Page 49: 2015 Pharo Prague Lambda Meetup

Simplicity and elegance

• Syntax fits on a postcard!

• Simple but complete object model

Page 50: 2015 Pharo Prague Lambda Meetup

The complete syntaxexampleWithNumber: x “A method that illustrates every part of Smalltalk method syntax”

<menu>

| y | true & false not & (nil isNil) ifFalse: [self halt]. y := self size + super size. #($a #a ‘a’ 1 1.0)

do: [ :each | Transcript show: (each class name); show: (each printString); show: ‘ ‘].

^ x < y

Page 51: 2015 Pharo Prague Lambda Meetup

Page 52: 2015 Pharo Prague Lambda Meetup

The complete syntaxexampleWithNumber: x “A method that illustrates every part of Smalltalk method syntax”

<menu>

| y | true & false not & (nil isNil) ifFalse: [self halt]. y := self size + super size. #($a #a ‘a’ 1 1.0)

do: [ :each | Transcript show: (each class name); show: (each printString); show: ‘ ‘].

^ x < y

Page 53: 2015 Pharo Prague Lambda Meetup

Less is more!No constructors, no static methods, no operators

No type declaration, no primitive types,

No interfaces, no need for factory

No packages/private/protected modifiers

No parametrized types

No boxing/unboxing

Still powerful

Page 54: 2015 Pharo Prague Lambda Meetup

A Pure OO World

Only objects! mouse, booleans, arrays, numbers, strings, windows, scrollbars, canvas, files, trees, compilers, sound, url, socket, fonts, text, collections, stack, shortcut, streams, …

Page 55: 2015 Pharo Prague Lambda Meetup

Objects are instances of Classes

Page 56: 2015 Pharo Prague Lambda Meetup

Objects are instances of Classes

!

(10@200)

Page 57: 2015 Pharo Prague Lambda Meetup

Objects are instances of Classes

!

(10@200) class

Page 58: 2015 Pharo Prague Lambda Meetup

Objects are instances of Classes

!

(10@200) class

Point

Page 59: 2015 Pharo Prague Lambda Meetup

Classes are objects too

!

!

Page 60: 2015 Pharo Prague Lambda Meetup

Classes are objects too

!

Point selectors

!

!

!

Page 61: 2015 Pharo Prague Lambda Meetup

Classes are objects too

!

Point selectors

!

an IdentitySet(#eightNeighbors #+ #isZero #sortsBefore: #degrees #printOn: #sideOf: #fourNeighbors #hash #roundUpTo: #min: #min:max: #max #adaptToCollection:andSend: #quadrantOf: #crossProduct: #= #nearestPointOnLineFrom:to: #bitShiftPoint: #* #guarded #insideTriangle:with:with: #grid: #truncateTo: #y #setR:degrees: #normal #directionToLineFrom:to: #truncated #nearestPointAlongLineFrom:to: #theta #scaleTo: #encodePostscriptOn: #> #asPoint #extent: #r #roundTo: #max: #interpolateTo:at: #triangleArea:with: #angleWith: #dotProduct: #isSelfEvaluating #'<=' #to:intersects:to: #'//' #isInsideCircle:with:with: #< #scaleFrom:to: #corner: #to:sideOf: #x #'>=' #roundDownTo: #onLineFrom:to:within: #transposed #ceiling #angle #basicType #translateBy: #asFloatPoint #'\\' #adaptToNumber:andSend: #abs #negated #octantOf: #asIntegerPoint #flipBy:centerAt: #scaleBy: #floor #onLineFrom:to: #isPoint #reflectedAbout: #/ #dist: #asNonFractionalPoint #bearingToPoint: #reciprocal #rotateBy:centerAt: #rotateBy:about: #rounded #setX:setY: #squaredDistanceTo: #normalized #veryDeepCopyWith: #- #storeOn: #rect: #deepCopy #isIntegerPoint #min #adhereTo: #adaptToString:andSend:)

Page 62: 2015 Pharo Prague Lambda Meetup

Classes are objects too

!

Point instVarNames

Page 63: 2015 Pharo Prague Lambda Meetup

Classes are objects too

!

Point instVarNames

>#('x' 'y')

Page 64: 2015 Pharo Prague Lambda Meetup

Methods are public

Page 65: 2015 Pharo Prague Lambda Meetup

Methods are all late-bound

Page 66: 2015 Pharo Prague Lambda Meetup

Instance variables are protected

Page 67: 2015 Pharo Prague Lambda Meetup

Single Inheritance

Page 68: 2015 Pharo Prague Lambda Meetup

Summary• Everything is an object

• Single inheritance, public methods, protected attributes

• One single model

• Classes are simply objects too

• A class is instance of another class

• One unique method lookup, look in the class of the receiver

Page 69: 2015 Pharo Prague Lambda Meetup

Messages + Objects

Page 70: 2015 Pharo Prague Lambda Meetup

postman.send(mail,recipient);

Page 71: 2015 Pharo Prague Lambda Meetup

postman.send(mail,recipient);

Page 72: 2015 Pharo Prague Lambda Meetup

postman send mail recipient

Page 73: 2015 Pharo Prague Lambda Meetup

postman send mail to recipient

Page 74: 2015 Pharo Prague Lambda Meetup

postman send: mail to: recipient

Page 75: 2015 Pharo Prague Lambda Meetup

2 + 5

2 + 5

> 7

Yes + is a message sent to 2

Page 76: 2015 Pharo Prague Lambda Meetup

Unary messages

Binary messages

Keywords messages

5 factorial!Transcript cr

3 + 4

3 between: 10 and: 5!!Transcript show: 'hello world'

Page 77: 2015 Pharo Prague Lambda Meetup

Blocks: Closures all the way

• Anonymous method

• Passed as method argument or stored • Functions fct(x)= x*x+3, fct(2). !

fct :=[:x| x * x + 3]. fct value: 2

!

Page 78: 2015 Pharo Prague Lambda Meetup

Every control structure is a message

4 timesRepeat: [Beeper beep]

max: aNumber!! ^ self < aNumber !! ! ifTrue: [aNumber] !! ! ifFalse: [self]

Page 79: 2015 Pharo Prague Lambda Meetup

<= aPoint !! "Answer whether the receiver is neither!! below nor to the right of aPoint."!!! ^ x <= aPoint x and: [y <= aPoint y]

Method name Argument Comment

Return Binary messageKeyword messageInstance variable

Block

(2@3) <= (5@6) true

Page 80: 2015 Pharo Prague Lambda Meetup

Object subclass: #Point!! instanceVariableNames: 'x y'!! classVariableNames: ''!! category: 'Kernel-BasicObjects'

2 instance variables

subclass of Object

Page 81: 2015 Pharo Prague Lambda Meetup

Fun with numbers

1 class

Page 82: 2015 Pharo Prague Lambda Meetup

1 class

> SmallInteger

Page 83: 2015 Pharo Prague Lambda Meetup

1 class maxVal

> 1073741823

Page 84: 2015 Pharo Prague Lambda Meetup

(1 class maxVal + 1)

Page 85: 2015 Pharo Prague Lambda Meetup

(1 class maxVal + 1)

> 1073741824

Page 86: 2015 Pharo Prague Lambda Meetup

(1 class maxVal + 1) class

!

Page 87: 2015 Pharo Prague Lambda Meetup

(1 class maxVal + 1) class

> LargePositiveInteger

Page 88: 2015 Pharo Prague Lambda Meetup

1000 factorial

>

Page 89: 2015 Pharo Prague Lambda Meetup

1000 factorial

> 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Page 90: 2015 Pharo Prague Lambda Meetup

1000 factorial / 999 factorial

Page 91: 2015 Pharo Prague Lambda Meetup

1000

Page 92: 2015 Pharo Prague Lambda Meetup

1000

Page 93: 2015 Pharo Prague Lambda Meetup

Learning from the system…

Page 94: 2015 Pharo Prague Lambda Meetup
Page 95: 2015 Pharo Prague Lambda Meetup

Check in the system

Page 96: 2015 Pharo Prague Lambda Meetup
Page 97: 2015 Pharo Prague Lambda Meetup

Let us hack something…

Page 98: 2015 Pharo Prague Lambda Meetup

(3 D20 + 3 D4) roll

Page 99: 2015 Pharo Prague Lambda Meetup

The Pharo Stack is Gorgeous

Voyage/ DBXTalk / Mongo / (Gemstone :)

Magritte

Zinc, Zodiac(HTTPS), Oauth, ...

STON, JSON, LDAP...

Seaside, Rest, Zinc Rest, Illiad, Aida, Reef

Amber!

Page 100: 2015 Pharo Prague Lambda Meetup

Dynamic Web Applications with Seaside

!

http://seaside.st

Page 101: 2015 Pharo Prague Lambda Meetup

Demo

Page 102: 2015 Pharo Prague Lambda Meetup

1Natural Flow

Page 103: 2015 Pharo Prague Lambda Meetup

Demo

Page 104: 2015 Pharo Prague Lambda Meetup

<form action="result.html"> <input type="hidden" name="value1" value="<% value1 %>"> <input type="text" name="value2"> <input type="submit" value="OK"> </form>

<p> <% value1 + value2 %> </p>

<form action="second.html"> <input type="text" name="value1"> <input type="submit" value="OK"> </form>

<form action="result.html"> <input type="text" name="value2"> <input type="submit" value="OK"> </form>

Page 105: 2015 Pharo Prague Lambda Meetup

Who cares about HTTP anyway?

Page 106: 2015 Pharo Prague Lambda Meetup

is different

Page 107: 2015 Pharo Prague Lambda Meetup

Concentrate on your application ...

Page 108: 2015 Pharo Prague Lambda Meetup

... no manual request parsing

Page 109: 2015 Pharo Prague Lambda Meetup

... no XML configuration files

Page 110: 2015 Pharo Prague Lambda Meetup

3 user interactions

Page 111: 2015 Pharo Prague Lambda Meetup

3 lines of code

Page 112: 2015 Pharo Prague Lambda Meetup

value1 := self request: ‘First Number’.

value2 := self request: ‘Second Number’.

self inform: value1 + value2.

Page 113: 2015 Pharo Prague Lambda Meetup

AB

call:A Bx :=

Page 114: 2015 Pharo Prague Lambda Meetup

AB

answer:B

Page 115: 2015 Pharo Prague Lambda Meetup

A

x :=

Page 116: 2015 Pharo Prague Lambda Meetup

We don’t think in pages ...

Page 117: 2015 Pharo Prague Lambda Meetup

..., but in stateful components

Page 118: 2015 Pharo Prague Lambda Meetup

Valid

Sour

ce: s

tock

.xch

ng, A

l Nak

ib

Page 119: 2015 Pharo Prague Lambda Meetup

Did you notice?

Page 120: 2015 Pharo Prague Lambda Meetup

Web applications

Page 121: 2015 Pharo Prague Lambda Meetup

No URL fiddling

Page 122: 2015 Pharo Prague Lambda Meetup

No request parsing

Page 123: 2015 Pharo Prague Lambda Meetup

Development tools

Page 124: 2015 Pharo Prague Lambda Meetup

Control flow at ease

Page 125: 2015 Pharo Prague Lambda Meetup

On going work

• Working bootstrap for pharo reflective core

• Customized images (11k)

• First class variables for real

• associations

• data flow model

Page 126: 2015 Pharo Prague Lambda Meetup

Glimpse on going work

• Package catalog

• Git (the right subset)

• OSWindow (SDL)

• Multi touch support

• Full vector graphics

Page 127: 2015 Pharo Prague Lambda Meetup

VM• Spur: new memory manager (got *4 speed up)

• ephemerons, pinned object, fragmented memory, 64 bits

• Sista: next level JIT

• inliner, constant propagation…

• Unified FFI + threaded

• one syntax several back-ends

Page 128: 2015 Pharo Prague Lambda Meetup

Fun, simple Pure & elegant Productive Empowering Addictive Full access

Page 129: 2015 Pharo Prague Lambda Meetup

Creating good energy, software quality,

learning and having fun !

http://pharo.org

Join