SlideShare a Scribd company logo
1 of 37
Download to read offline
Making	JavaFX	Groovy	
Dierk	König	
Canoo	Engineering	AG	
dierk.koenig@canoo.com	
@mittie	on	Twitter	
GroovyFX
GroovyFXFirst	App		
import static groovyx.javafx.GroovyFX.start
start {
stage(title: "GroovyFX @ JavaONE", show: true ) {
scene(fill: groovyblue, width: 420, height: 420 ) {
text("Hello World!", layoutY: 50, font: ”bold 48pt serif")
}
}
}
GroovyFXFirst	App	(Java)	
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class HelloWorld extends Application {
@Override
public void start(Stage primaryStage) {
Font font = Font.font("serif", FontWeight.BOLD, 48);
Text text = new Text("Hello World!");
text.setLayoutY(50);
text.setFont(font);
Group parent = new Group(text);
Scene scene = new Scene(parent, 420, 420, Color.rgb(99, 152, 170));
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX @ JavaONE");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
import static groovyx.javafx.GroovyFX.start
GroovyFX.start {
stage(title: "GroovyFX @ JavaONE", show: true ) {
scene(fill: groovyblue, width: 420, height: 420 ) {
text("Hello World!", layoutY: 50,
font: ”bold 48pt serif")
}
}
}
GroovyFXThe	SceneGraph	
stage(title: "GroovyFX BorderPane Demo", show: true) {
scene(fill: groovyblue, width: 650, height:450) {
borderPane {
top(align: CENTER, margin: [10,0,10,0]) {
button("Top Button")
}
right(align: CENTER, margin: [0,10,0,1]) {
toggleButton("Right Toggle")
}
left(align: CENTER, margin: [0,10]) {
checkBox("Left Check")
}
bottom(align: CENTER, margin: 10) {
textField("Bottom TextField")
}
label("Center Label")
}
}
}
GroovyFXWhat	you	see
GroovyFXColors	-	Gradients	
stage(title: "GroovyFX @ JavaONE”, show: true) {
scene(width: 420, height:420) {
fill linearGradient(
start: [0, 0.4], end: [0.9, 0.9],
stops: [groovyblue, rgb(153,255,255)])
==================================================================
fill radialGradient(radius: 0.6, center:[0.5, 0.5],
focusDistance: 0.6, focusAngle: -65,
stops: [groovyblue, '#99FFFF'])
GroovyFXWhat	you	see
GroovyFXGraphics	&	Effects 		
stage(title: 'GroovyFX ColorfulCircles', resizable: false, show: true) {
scene(width: 800, height: 600, fill: black) {
group {
group {
30.times {
circle(radius: 200, strokeWidth: 4, strokeType: 'outside',
fill: rgb(255, 255, 255, 0.05),
stroke: rgb(255, 255, 255, 0.16))
}
effect boxBlur(width: 10, height: 10, iterations: 3)
}
rectangle(width: 800, height: 600, blendMode: 'overlay') {
def stops = ['#f8bd55', '#c0fe56', '#5dfbc1', '#64c2f8',
'#be4af7', '#ed5fc2', '#ef504c', '#f2660f']
fill linearGradient(start: [0f, 1f], end: [1f, 0f], stops: stops)
}
}
}
}
GroovyFXWhat	you	see
GroovyFXAnimation	
		stage(title:	"GroovyFX	@	JavaONE",	show:	true)	{	
									scene(fill:	groovyblue,	width:	420,	height:420)	{	
													rect	=	rectangle(width:	75,	height:	50,	fill:	navy)	{	
																	effect	reflection()	
																	animation	=	parallelTransition(cycleCount:	indefinite,	autoReverse:	true)	{	
																					translateTransition(4.s,	fromX:	0,	fromY:	0,	toX:	420-75,	toY:	300)	
																					rotateTransition(4.s,	toAngle:	360)	
																					fillTransition(4.s,	from:	navy,	to:	cyan)	
																					sequentialTransition()	{	
																									scaleTransition(2.s,	from:	1.0,	to:	2)	
																									scaleTransition(2.s,	from:	2,	to:	1.0)	
																					}	
																	}	animation.playFromStart();	
													}	
									}	
				}
GroovyFXWhat	you	see
GroovyFXAnimation	-	Timeline	
start {
stage(title: "GroovyFX Timeline Demo", show: true) {
scene(fill: groovyblue, width: 300, height:200) {
circle(id: “circ”, radius: 25, rotationAxis: [0,1,1]) {
fill radialGradient(radius: 1, center:[0.5, 1],
stops:[[0, magenta], [0.75, indigo], [1, black]])
effect dropShadow()
}
}
timeline (cycleCount: indefinite, autoReverse: true) {
at(2.s) {
change(circ.layoutXProperty()) { to 150; tween easeboth }
change(circ.layoutYProperty()) { to 150; tween easeboth }
change(circ.scaleXProperty()) { to 2 }
change(circ.scaleYProperty()) { to 2 }
change(circ.rotateProperty()) { to 180 }
}
}.playFromStart()
}
}
GroovyFXWhat	you	see
GroovyFXGroovyFX	Binding
GroovyFXBinding	–	Analog	Clock	
@FXBindable
class Time {
Integer hours
Integer minutes
Integer seconds
Double hourAngle
Double minuteAngle
Double secondAngle
public Time() {
// bind the angle properties to the clock time
hourAngleProperty.bind((hours() * 30.0) + (minutes() * 0.5))
minuteAngleProperty.bind(minutes() * 6.0)
secondAngleProperty.bind(seconds() * 6.0)
// Set the initial clock time
def calendar = Calendar.instance
hours = calendar.get(Calendar.HOUR)
minutes = calendar.get(Calendar.MINUTE)
seconds = calendar.get(Calendar.SECOND)
}
public void addOneSecond() {
seconds = (seconds + 1) % 60
if (seconds == 0) {
minutes = (minutes + 1) % 60
if (minutes == 0)
hours = (hours + 1) % 12
}
}
}
JavaFX	Properties	
GroovyFX	
Binding	DSL
GroovyFXBinding	–	Analog	Clock	
// hour hand
path(fill: black) {
rotate(angle: bind(time.hourAngle()))
moveTo(x: 4, y: -4)
arcTo(radiusX: -1, radiusY: -1, x: -4, y: -4)
lineTo(x: 0, y: -radius / 4 * 3)
}
// minute hand
path(fill: black) {
rotate(angle: bind(time.minuteAngle()))
moveTo(x: 4, y: -4)
arcTo(radiusX: -1, radiusY: -1, x: -4, y: -4)
lineTo(x: 0, y: -radius)
}
// second hand
line(endY: -radius - 3, strokeWidth: 2, stroke: red) {
rotate(angle: bind(time.secondAngle()))
}
GroovyFXMore	Binding	
class QuickTest {
@FXBindable String qtText = "Quick Test”
private int clickCount = 0
def onClick = {
qtText = "Quick Test ${++clickCount}"
}
}
start {
def qt = new QuickTest()
stage(title: "GroovyFX Bind Demo", x: 100, y: 100, show: true) {
scene(fill: groovyblue, width: 400, height: 400) {
vbox(spacing: 10, padding: 10) {
TextField tf = textField(text: 'Change Me!')
button(text: bind(tf,'text'), onAction: {qt.onClick()})
label(text: bind(tf.textProperty()))
label(text: bind({tf.text}))
label(text: bind(tf.text()))
// Bind to POGO fields annotated with @FXBindable
// These next two bindings are equivalent
label(text: bind(qt, 'qtText'))
label(text: bind(qt.qtText()))
label(text: bind(qt.qtTextProperty()).using({"<<< ${it} >>>"}) )
}
}
}
}
GroovyFXWhat	you	see
GroovyFXTableView	Control	
The	Java	Way:	
public class Person {
private StringProperty firstName;
public void setFirstName(String val) { firstNameProperty().set(val); }
public String getFirstName() { return firstNameProperty().get(); }
public StringProperty firstNameProperty() {
if (firstName == null)
firstName = new SimpleStringProperty(this, "firstName");
return firstName;
}
private StringProperty lastName;
public void setLastName(String value) { lastNameProperty().set(value); }
public String getLastName() { return lastNameProperty().get(); }
public StringProperty lastNameProperty() {
// etc.
}
}
GroovyFXTableView	Control	
The	Java	Way:	
ObservableList<Person> items = ...
TableView<Person> tableView = new TableView<Person>(items);
TableColumn<Person,String> firstNameCol =
new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(
new Callback<CellDataFeatures<Person, String>,
ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
return p.getValue().firstNameProperty();
}
});
tableView.getColumns().add(firstNameCol);
GroovyFXTableView	Control	
enum Gender { MALE, FEMALE }
@Canonical
Class Person {
@FXBindable String name
@FXBindable int age
@FXBindable Gender gender
@FXBindable Date dob
}
def persons = [
new Person("Jim Clarke", 29, Gender.MALE, new Date()),
new Person(”Dierk König", 30, Gender.MALE, new Date()),
new Person("Angelina Jolie", 36, Gender.FEMALE, new Date())
]
GroovyFXTableView	Control	
def dateFormat = new SimpleDateFormat("yyyy-MM-dd");
start {
stage(title: "GroovyFX Table Demo", show: true) {
scene(fill: groovyblue, width: 500, height: 200) {
tableView(items: persons) {
tableColumn(property: "name", text: "Name", prefWidth: 150)
tableColumn(property: "age", text: "Age", prefWidth: 50)
tableColumn(property: "gender", text: "Gender", prefWidth: 150)
tableColumn(property: "dob", text: "Birth", prefWidth: 150,
type: Date,
converter: { from ->
return dateFormat.format(from)
}
)
}
}
}
}
GroovyFXWhat	you	see
GroovyFXTableView	Control	
tableView(items: persons, selectionMode: "single",
cellSelectionEnabled: true, editable: true) {
tableColumn(editable: true, property: "name", text: "Name",
prefWidth: 150,
onEditCommit: { event ->
int row = event.tablePosition.row
Person item = event.tableView.items.get(row)
item.name = event.newValue
})
tableColumn(editable: true, property: "dob", text: "Birth",
prefWidth: 150, type: Date,
converter: { from ->
return dateFormat.format(from)
},
onEditCommit: { event ->
int row = event.tablePosition.row
Person item = event.tableView.items.get(row)
// convert TextField string to a date object.
Date date = dateFormat.parse(event.newValue)
item.dob = date
})
}
GroovyFXWhat	you	see
GroovyFXLayout	
JavaFX	uses	static	methods	to	set	constraints:	
	
TextField urlField = new TextField(“http://www.google.com”);
HBox.setHgrow(urlField, Priority.ALWAYS);
HBox hbox = new HBox();
hbox.getChildren().add(urlField);
WebView webView = new WebView();
VBox.setVgrow(webView, Priority.ALWAYS);
VBox vbox = new VBox();
vbox.getChildren().addAll(hbox, webView);
GroovyFXLayout	
stage(title:	"GroovyFX	WebView	Demo",	visible:	true)	{	
				scene(fill:	groovyblue,	width:	1024,	height:	800)	{	
								vbox	{	
												hbox(padding:	10,	spacing:	5)	{	
																urlField	=	textField(text:	homePage,	onAction:	goAction,	hgrow:	"always")	
																button("Go",	onAction:	goAction)	
												}	
												webView(vgrow:	"always")	
								}	
				}	
}
GroovyFXWhat	you	see
GroovyFXLayout	
gridPane(hgap: 5, vgap: 10, padding: 25) {
columnConstraints(minWidth: 50, halignment: "right")
columnConstraints(prefWidth: 250)
label("Send Us Your Feedback", font: "24pt sanserif",
row: 0, columnSpan: GridPane.REMAINING, halignment: "center",
margin: [0, 0, 10])
label("Name: ", row: 1, column: 0)
textField(promptText: "Your name", row: 1, column: 1, hgrow: 'always')
label("Email:", row: 2, column: 0)
textField(promptText: "Your email", row: 2, column: 1, hgrow: 'always')
label("Message:", row: 3, column: 0, valignment: "baseline")
textArea(row: 3, column: 1, hgrow: "always", vgrow: "always")
button("Send Message", row: 4, column: 1, halignment: "right")
}
GroovyFXWhat	you	see
GroovyFXGroovyFX	+	Griffon
GroovyFXGroovyFX	+	Griffon	
•  Download	JavaFX	archetype	from:		
–  http://deanriverson.github.com/griffon-javafx-archetype	
•  griffon	install-archetype	javafx-griffon-archetype.zip	
•  griffon	create-app	CoolApp	-archetype=javafx
GroovyFXGroovyFX	+	Griffon
GroovyFXGroovyFX	usage	
in	OpenDolphin
GroovyFXGroovyFX	usage	
in	OpenDolphin
GroovyFXGroovyFX	3D	usage	
in	OpenDolphin
GroovyFXResources	
•  GroovyFX	Website:	
– http://groovyfx.org	
•  Griffon	Website:	
– http://griffon.codehaus.org	
•  OpenDolphin	
– http://open-dolphin.org

More Related Content

What's hot

Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察
Tsuyoshi Yamamoto
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
Jan Kronquist
 

What's hot (20)

The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196The Ring programming language version 1.7 book - Part 73 of 196
The Ring programming language version 1.7 book - Part 73 of 196
 
Jersey Guice AOP
Jersey Guice AOPJersey Guice AOP
Jersey Guice AOP
 
The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202The Ring programming language version 1.8 book - Part 75 of 202
The Ring programming language version 1.8 book - Part 75 of 202
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察
 
The Ring programming language version 1.5.1 book - Part 64 of 180
The Ring programming language version 1.5.1 book - Part 64 of 180The Ring programming language version 1.5.1 book - Part 64 of 180
The Ring programming language version 1.5.1 book - Part 64 of 180
 
COScheduler In Depth
COScheduler In DepthCOScheduler In Depth
COScheduler In Depth
 
The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196The Ring programming language version 1.7 book - Part 72 of 196
The Ring programming language version 1.7 book - Part 72 of 196
 
The Ring programming language version 1.9 book - Part 99 of 210
The Ring programming language version 1.9 book - Part 99 of 210The Ring programming language version 1.9 book - Part 99 of 210
The Ring programming language version 1.9 book - Part 99 of 210
 
The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202The Ring programming language version 1.8 book - Part 74 of 202
The Ring programming language version 1.8 book - Part 74 of 202
 
Testing a 2D Platformer with Spock
Testing a 2D Platformer with SpockTesting a 2D Platformer with Spock
Testing a 2D Platformer with Spock
 
多治見IT勉強会 Groovy Grails
多治見IT勉強会 Groovy Grails多治見IT勉強会 Groovy Grails
多治見IT勉強会 Groovy Grails
 
What’s new in C# 6
What’s new in C# 6What’s new in C# 6
What’s new in C# 6
 
The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189The Ring programming language version 1.6 book - Part 70 of 189
The Ring programming language version 1.6 book - Part 70 of 189
 
The Ring programming language version 1.5.1 book - Part 12 of 180
The Ring programming language version 1.5.1 book - Part 12 of 180The Ring programming language version 1.5.1 book - Part 12 of 180
The Ring programming language version 1.5.1 book - Part 12 of 180
 
Intro to Clojure's core.async
Intro to Clojure's core.asyncIntro to Clojure's core.async
Intro to Clojure's core.async
 
The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84The Ring programming language version 1.2 book - Part 48 of 84
The Ring programming language version 1.2 book - Part 48 of 84
 
The Ring programming language version 1.5.4 book - Part 67 of 185
The Ring programming language version 1.5.4 book - Part 67 of 185The Ring programming language version 1.5.4 book - Part 67 of 185
The Ring programming language version 1.5.4 book - Part 67 of 185
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камни
 

Similar to Greach, GroovyFx Workshop

How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
Giordano Scalzo
 
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
Tsuyoshi Yamamoto
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLE
Darwin Durand
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with Groovy
James Williams
 

Similar to Greach, GroovyFx Workshop (20)

Griffon @ Svwjug
Griffon @ SvwjugGriffon @ Svwjug
Griffon @ Svwjug
 
JavaFX 2.0 With Alternative Languages - JavaOne 2011
JavaFX 2.0 With Alternative Languages - JavaOne 2011JavaFX 2.0 With Alternative Languages - JavaOne 2011
JavaFX 2.0 With Alternative Languages - JavaOne 2011
 
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
 
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
JavaFX 2.0 With Alternative Languages - Groovy, Clojure, Scala, Fantom, and V...
 
JavaFX 2.0 With Alternative Languages [Portuguese]
JavaFX 2.0 With Alternative Languages [Portuguese]JavaFX 2.0 With Alternative Languages [Portuguese]
JavaFX 2.0 With Alternative Languages [Portuguese]
 
Groovy & Grails: Scripting for Modern Web Applications
Groovy & Grails: Scripting for Modern Web ApplicationsGroovy & Grails: Scripting for Modern Web Applications
Groovy & Grails: Scripting for Modern Web Applications
 
JavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative LanguagesJavaFX 2.0 and Alternative Languages
JavaFX 2.0 and Alternative Languages
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
 
Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen ChinHacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLE
 
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative LanguagesJavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~
 
JavaFX Your Way - Devoxx Version
JavaFX Your Way - Devoxx VersionJavaFX Your Way - Devoxx Version
JavaFX Your Way - Devoxx Version
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
 
JavaFX introduction
JavaFX introductionJavaFX introduction
JavaFX introduction
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with Groovy
 

More from Dierk König

UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013
Dierk König
 
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and MobileOpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
Dierk König
 

More from Dierk König (12)

OpenDolphin with GroovyFX Workshop at GreachConf, Madrid
OpenDolphin with GroovyFX Workshop at GreachConf, MadridOpenDolphin with GroovyFX Workshop at GreachConf, Madrid
OpenDolphin with GroovyFX Workshop at GreachConf, Madrid
 
Monads from Definition
Monads from DefinitionMonads from Definition
Monads from Definition
 
FregeFX - JavaFX with Frege, a Haskell for the JVM
FregeFX - JavaFX with Frege, a Haskell for the JVMFregeFX - JavaFX with Frege, a Haskell for the JVM
FregeFX - JavaFX with Frege, a Haskell for the JVM
 
Software Transactional Memory (STM) in Frege
Software Transactional Memory (STM) in Frege Software Transactional Memory (STM) in Frege
Software Transactional Memory (STM) in Frege
 
Quick into to Software Transactional Memory in Frege
Quick into to Software Transactional Memory in FregeQuick into to Software Transactional Memory in Frege
Quick into to Software Transactional Memory in Frege
 
Frege Tutorial at JavaOne 2015
Frege Tutorial at JavaOne 2015Frege Tutorial at JavaOne 2015
Frege Tutorial at JavaOne 2015
 
Frege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVMFrege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVM
 
FregeDay: Parallelism in Frege compared to GHC Haskell (Volker Steiss)
FregeDay: Parallelism in Frege compared to GHC Haskell (Volker Steiss) FregeDay: Parallelism in Frege compared to GHC Haskell (Volker Steiss)
FregeDay: Parallelism in Frege compared to GHC Haskell (Volker Steiss)
 
FregeDay: Design and Implementation of the language (Ingo Wechsung)
FregeDay: Design and Implementation of the language (Ingo Wechsung)FregeDay: Design and Implementation of the language (Ingo Wechsung)
FregeDay: Design and Implementation of the language (Ingo Wechsung)
 
FregeDay: Roadmap for resolving differences between Haskell and Frege (Ingo W...
FregeDay: Roadmap for resolving differences between Haskell and Frege (Ingo W...FregeDay: Roadmap for resolving differences between Haskell and Frege (Ingo W...
FregeDay: Roadmap for resolving differences between Haskell and Frege (Ingo W...
 
UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013
 
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and MobileOpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Greach, GroovyFx Workshop