SlideShare une entreprise Scribd logo
1  sur  69
Télécharger pour lire hors ligne
Developing Java EE 7 
Applications with 
Scala (CON2664) 
Demystifying the Object-Functional 
Peter Pilgrim 
Scala and Java EE 
Independent contractor 
@peter_pilgrim
Creative Commons 2.0 
Attribution-NonCommercial-ShareAlike 2.0 UK: 
England & Wales (CC BY-NC-SA 2.0 UK) 
https://creativecommons.org/licenses/by-nc-sa/2.0/uk/ 
• Share — copy and redistribute the material in 
any medium or format 
• Adapt — remix, transform, and build upon the 
material 
• The licensor cannot revoke these freedoms as 
long as you follow the license terms. 
Xenonique 
2
Xenonique 
About Me 
• Scala and Java EE developer independent 
contractor 
• Digital transformation / e-commerce 
• Java Champion 
• Working on the JVM since 1998 
3
Xenonique 
Java EE 7 
Developer 
Handbook 
September 
2013 
Packt 
Publishing 
Digital 
Java EE 7 
Web APPS 
December 
2014 
4
Xenonique 
5 
Agenda 
• Scala Technology 
• Java EE 7 
• CDI 
• JSF, Servlets 
• JAX-RS, JMS
Xenonique 
6
Xenonique 
7 
#1 Scala 
Object-functional 
Since 2003 
Statically typed programming 
Scalable Language 
Inventor: Professor Martin Odersky, EPFL, Typesafe
Xenonique 
8 
#1 Scala 
Pattern Matching 
Case Classes 
Traits, Mix-ins, Collections 
Expressions, In-fix operators 
Functions, Closures, Control Abstractions 
Extension through Library functions
Xenonique 
9 
#1 Scala 
Gradle, Gradle, Gradle v2.0 
Groovy assembler, builder 
Comprehensible, Configurable, Flexible 
Works with Scala since Gradle v1.7 
With Gradle, building WAR files is very straightforward
Xenonique 
Scala Language 
var age: Int = 37 
val pi: Double = 3.141596527 
val text: String = "human nature" 
val r = if (age >= 18 ) "Adult" else "Child" 
10
Xenonique 
Scala Test #1 
import collection.mutable.Stack 
import org.scalatest._ 
import org.scalatest.junit.JUnitRunner 
@RunWith(classOf[JUnitRunner]) 
class StackSpec extends 
FlatSpec with Matchers { 
/* ... */ 
} 
11
Xenonique 
Scala Test #2 
class StackSpec extends FlatSpec with Matchers { 
"A Stack" should 
"pop values in last-in-first-out order" in 
{ 
val stack = new Stack[Int] 
stack.push(1) 
stack.push(2) 
stack.pop() should be (2) 
stack.pop() should be (1) 
} 
/* ... */ 
} 
12
Xenonique 
Scala Test #3 
class StackSpec extends FlatSpec with Matchers { 
/* ... */ 
it should 
"throw NoSuchElementException if an empty 
stack is popped" 
in { 
val emptyStack = new Stack[Int] 
a [NoSuchElementException] 
should be thrownBy { 
emptyStack.pop() 
} 
} 
} 
13
Java is a programming language. 
Java is a virtual machine. 
Java is a platform. 
Xenonique 
14 
Java EE 7 released 2013 
Built products on top of a standard platform 
Transactions, Concurrency, Remote 
Endpoints, Lifecycle, State, Persistence
Xenonique 
15 
Java 
EE 
7
Xenonique 
16
Context & Dependency Injection 
• Writing Scala beans 
• Annotate with Scala @BeanProperty on 
POSI (Plain Old Scala Instances) 
• Ensure compatibility with Java code 
• @BeanProperty exposes properties to CDI 
Xenonique 
17
Plain Old Scala Instance 
@ApplicationScoped 
class CashierService 
{ 
@BeanProperty @Inject() 
var service: PaymentService = _ 
def process( acc: Account, 
Xenonique 
amount: BigDecimal): Unit = { 
service.debit(amount); 
acc.balance = acc.balance - amount 
} 
} 
18
CDI Dependent Object 
@ApplicationScoped 
class PaymentService { 
var message: String = _ 
def debit(amount: BigDecimal): Unit = { 
message = s"You paid ${amount}" 
} 
} 
// Note String interpolators 
Xenonique 
19
CDI Model instance 
class Account( 
var balance: BigDecimal 
) 
// This is a complete class definition! ;-) 
Xenonique 
20
Xenonique 
CDI Scala Gotchas 
• Companion Objects cannot be used 
• Case Classes (and obviously Case Objects) 
– Failure due to creation of multiple static methods 
in byte code 
• Implicit class parameters 
• Implicit method parameters 
• Lazy public vals also fail 
21
Building Java EE 7 War Files 
• Gradle allows developers to build WAR files 
very easy and also add customisation 
• Explicitly include the Scala Library JAR as a 
dependency 
• With SBT, it is harder to create WAR files 
– Battling between *.scala and *.sbt files 
Xenonique 
22
Sample Gradle Dependencies 
dependencies { 
providedCompile 'javax:javaee-api:7.0’ 
compile 
'org.scala-lang:scala-library:2.11.2' 
testCompile 'junit:junit:4.11' 
testCompile 
'org.scalatest:scalatest_2.11:2.2.0’ 
Xenonique 
} 
23
Xenonique 
CDI Factory #1 
trait Maker { 
def createSample(): Fruit 
} 
@ApplicationScoped 
class FruitFactory { 
private class CocktailMaker extends Maker { 
override def createSample():Fruit = new Strawberry 
} 
private class FruitSaladMaker extends Maker { 
override def createSample():Fruit = new Banana 
} 
} 
24
Xenonique 
CDI Factory #2 
@ApplicationScoped 
class FruitFactory { 
// ... 
@Produces 
def generateCocktail(): Maker = 
new CocktailMaker() 
@Produces 
def generateFruitSalad(): Maker = 
new FruitSaladMaker() 
} 
25
Xenonique 
CDI Factory #3 
trait Fruit { 
val price: Double; 
val name = this.getClass.getSimpleName 
} 
case class Apple() extends Fruit { 
override val price = 0.75 } 
case class Banana() extends Fruit { 
override val price = 0.95 } 
case class Strawberry() extends Fruit { 
override val price = 2.99 } 
26
#1 Collection Of Case 
Xenonique 
Classes 
@ApplicationScoped 
class FruitVendor { 
def sell( fruit: Fruit with Product with 
Serializable, quantity: Int): Double = { 
fruit.price * quantity 
} 
} 
27
#2 Collection Of Case 
Xenonique 
Classes 
@Test 
def shouldPriceFruitWithQuantity(): Unit = { 
val fruits = List((Apple,2), (Orange,4), 
(Banana,5)) 
for ( (fruit, quantity) <- fruits) { 
val product = 
fruitVendor.sell(fruit(), quantity) 
assertEquals( 
product, fruit().price * quantity, 0.01 ) 
} 
} 
28
#3 Collection Of Case Classes 
Xenonique 
Sugaring of Supertype 
scala> val list = List( Apple -> 1, 
Orange -> 4, Banana -> 7 ) 
list: List[(scala.runtime.AbstractFunction0[ 
Product with Serializable with Fruit] 
with Serializable, Int)] 
= List((Apple,1), (Orange,4), (Banana,7)) 
// [R]AbstractFunction0.apply() => R 
// fruit() returns the Fruit mix-in type 
29
Xenonique 
30 
#2 Arquillian: 
Prefer integration tests over unit tests. 
You can write Arquillian tests with Scala 
You cannot yet mix ScalaTest specifications
Writing Arquillian Tests with 
Xenonique 
Scala #1 
// HERE WOULD BE THE IDEAL WORLD 
import org.jboss.arquillian.junit.Arquillian 
import org.junit.runner.RunWith 
import org.scalatest.junit. JUnitSuite} 
import org.scalatest.{FlatSpecLike, Matcher} 
@RunWith(classOf[Arquillian], 
classOf[JUnitRunner]) /* ;-) */ 
class HelloArquillianSpec extends JUnitSuite 
with FlatSpecLike with Matchers { 
} 
31
Writing Arquillian Tests with 
Xenonique 
Scala #2 
// The Reality of the Situation in 2014 
@RunWith(classOf[Arquillian]) 
class HelloArquillianSpec extends JUnitSuite 
with Matchers { 
// You can’t use BDD like specificationsL 
} 
32
Writing Arquillian Tests with 
Xenonique 
Scala #3 
// Add a companion object, generate a WAR file 
object HelloArquillianSpec { 
@Deployment def createDeployment():WebArchive = { 
ShrinkWrap.create( 
classOf[WebArchive], "test.war") 
.addPackage("uk.co.xenonique.digitalone") 
.addAsLibrary( GradleDependency.resolve( 
"org.scala-lang:scala-library:2.11.1") ) 
.addAsLibrary( GradleDependency.resolve( 
"org.scalatest:scalatest_2.11:2.2.0") ) 
.addAsManifestResource(EmptyAsset.INSTANCE, 
"beans.xml”) 
} 
} 
33
Writing Arquillian Tests with 
Xenonique 
Scala #4 
// Add a companion object 
@RunWith(classOf[Arquillian]) 
class HelloArquillianSpec extends JUnitSuite 
with Matchers { 
@Inject var hello: Hello = _ 
@Test 
def shouldPrintAPoliteGreeting():Unit = { 
val msg = hello.hello("JavaOne 2014") 
// ;-) At least, we can use matchers! 
(msg) should be ("Hello JavaOne 2014") 
} 
} 
34
Xenonique 
35 
#3 
Servlets 
A 
Java 
Servlet 
is 
a 
web 
component 
managed 
container. 
Java 
Servlets 
are 
based 
on 
the 
Java 
technology, 
they 
generate 
dynamic 
content, 
and 
hence 
the 
container 
that 
manages 
them 
is 
capable 
of 
delivering 
dynamic 
content 
to 
the 
web 
client.
Simplest Json Servlet 
@WebServlet(Array("/simple")) 
class SimpleServlet extends HttpServlet { 
override def doGet(req: HttpServletRequest, 
Xenonique 
resp: HttpServletResponse): Unit = { 
resp.setContentType("application/json”) 
val writer = resp.getWriter() 
writer.println( 
s""" 
|{ 
| "trackTitle": "Two Tribes", 
| "class": "${this.getClass().getName}", 
| "date": "${new Date()}" 
|} 
""".stripMargin ) 
} 
} 
36
Xenonique 
37 
#4 JAX-RS 
Easy to write in Scala 
Jackson Annotations, Json4S 
We demand Json support with seamless Scala support 
Jackson, especially, FasterXML is extremely helpful 
https://github.com/FasterXML/jackson-annotations/ 
For Parsing JSON from text strings, then examine Json4S 
https://github.com/json4s/json4s
Convert Posis to Json 
// How do we convert this POSI to JSON 
// to seamlessly and easily? ;-/ 
class Traveller( 
@BeanProperty var givenName: String, 
@BeanProperty var familyName: String, 
@BeanProperty var dateOfBirth: Date , 
@BeanProperty var docNo: String ) 
Xenonique 
38
Jackson Json Jaxb Annotations 
// Look at the Jackson JAX-B project for 
// inspiration ;-D 
class Traveller2( 
@BeanProperty @JsonProperty("givenName") 
var givenName: String, 
@BeanProperty @JsonProperty("familyName") 
var familyName: String, 
@BeanProperty @JsonProperty("dateOfBirth") 
var dateOfBirth: Date, 
@BeanProperty @JsonProperty("documentNo") 
var docNo: String ) 
Xenonique 
39
Restful Scala JAX-RS Service 
Xenonique 
Endpoint 
@Path("/traveller") 
class TravellerServiceEndpoint { 
@GET() 
@Produces(Array(MediaType.APPLICATION_JSON)) 
def retrieve(): Response = { 
val cal = Calendar.getInstance() 
cal.set(1986, Calendar.MAY, 21) 
val dob = cal.getTime 
val traveller = new Traveller2("Sam", "Smith", 
dob, "1234567890") 
Response.ok(traveller).build() 
} 
} 
40
Jackson Json Mapping With 
Xenonique 
Provider 
@Singleton 
@Provider 
@Consumes(Array(MediaType.APPLICATION_JSON, 
"application/*+json", "text/json")) 
@Produces(Array(MediaType.APPLICATION_JSON, 
"application/*+json", "text/json")) 
class JacksonScalaContextResolver extends 
JacksonJaxbJsonProvider(JacksonScalaContextResolver.getObjectMapper, 
JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS) 
object JacksonScalaContextResolver { 
def getObjectMapper: ObjectMapper = { 
val mapper = new ObjectMapper with ScalaObjectMapper 
mapper.registerModule(new DefaultScalaModule) 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
mapper.setSerializationInclusion(Include.NON_NULL) 
mapper 
} 
} 
41
Case Classes Instances and 
Xenonique 
Jackson Annotations 
@JsonIgnoreProperties(Array("databaseId", 
"computedDeliveryDateTime")) 
case class Traveller3( 
@BeanProperty @JsonProperty("givenName") 
var givenName: String, 
@BeanProperty @JsonProperty("familyName") 
var familyName: String, 
@BeanProperty @JsonProperty("dateOfBirth") 
var dateOfBirth: Date , 
@BeanProperty @JsonProperty("documentNo") 
var docNo: Option[String], 
@BeanProperty 
var computedDeliveryDateTime: Date = new Date()) 
42
Consuming of Json to Scala 
Case Class Instance #1 
@POST() 
@Consumes(Array(MediaType.APPLICATION_JSON)) 
def store( traveller: Traveller3): Response = { 
if ( traveller.getDocNo().isEmpty ) { 
Response.status( 
Response.Status.BAD_REQUEST) 
.entity(ErrorMessage("E199", 
Xenonique 
"Missing document No")) 
.build() 
} 
else { 
Response.ok().build() 
} 
} 
43
Xenonique 
Case Class #2 
case class ErrorMessage( 
@JsonProperty("id") var id: String, 
@JsonProperty("error") var text: String) 
// Renders 
// { "id": "E199", 
// "error": "Missing document No" 
// } 
44
Xenonique 
45 
#5 JSF 
Easy to write in Scala 
Conversational, FlowScoped 
RequestScoped, SessionScoped 
All types of validation are supported including 
BeanValidation just like Java
Conversational Scoped 
Xenonique 
Managed Bean 
@Named("wizard") 
@ConversationScoped 
class RegisterDrivingLicense extends 
Serializable { 
@Inject 
var conversation: Conversation = _; 
@BeanProperty var title: String = _ 
@BeanProperty var firstName: String = _ 
@BeanProperty var lastName: String = _ 
/* ... */ } 
46
Controller Methods 
def jumpGettingStarted(): String = { 
beginConversation() 
"form1?faces-redirect=true" 
} 
def submitPage1(): String = { 
beginConversation() 
"form2?faces-redirect=true" 
} 
Xenonique 
47
Conversational States 
def beginConversation(): Unit = 
{ 
if (conversation.isTransient()) { 
conversation.begin() 
} 
} 
def endConversation(): Unit = 
{ 
if (!conversation.isTransient()) { 
conversation.end() 
} 
} 
Xenonique 
48
Finish Conversational Scopes 
def submitDeclarationPage(): String = { 
endConversation() 
if ( !declaration ) { 
// The declaration was not signed 
cancelApplication() 
} 
else { 
// Here the form is complete 
"end?faces-redirect=true" 
} 
} 
Xenonique 
49
Xenonique 
50 
#6 JMS 
JMS is straight forward to code with Scala 
MDB is essentially an asynchronous EJB 
Tricky part is publishing with JMS 2.0!
JMS with CDI Qualifiers #1 
class JMSResourceProducer { 
@Resource(name = "jms/OrderConnectionFactory") 
val orderConnFactory: QueueConnectionFactory = _ 
@Produces @Order 
@Resource(name = "jms/OrderQueue") 
val orderQueue: Queue = _ 
@Produces @Order 
def createOrderConnection(): QueueConnection = 
orderConnectionFactory.createQueueConnection() 
/* ... */ 
} 
Xenonique 
51
JMS with CDI Qualifiers #2 
class JMSResourceProducer { 
/* ... */ 
@Produces @Order 
def createOrderSession( 
@Order conn:QueueConnection): 
QueueSession 
= conn.createQueueSession( 
true, Session.AUTO_ACKNOWLEDGE) 
Xenonique 
} 
52
Xenonique 
53
Xenonique 
54 
#Conclusion(1) 
Source code is available now! 
https://github.com/peterpilgrim/digital-scala-javaone- 
2014
#Conclusion(2) 
Scala and Java EE 7 integrate well from 
an Object-Oriented point of view 
Java EE 8 and Lambda API promise a functional 
approach. Java EE 7 annotations work in Scala. 
The ability of Jackson annotations and a singleton provider to 
seamlessly handle Scala’s case classes is a wonderful addition. 
Arquillian almost works completely with ScalaTest. 
Xenonique 
55
Xenonique 
56 
#Conclusion(3) 
WAR files require the runtime Scala 
Library 
Decent server configuration using Chef and Puppet 
can obviate the bundling of the runtime 
Scala allows developers to avoid Java boilerplate 
Library writers should prefer to explicitly declare the 
return types of functions and methods
Xenonique 
57 
@peter_pilgrim 
uk.linkedin.com/in/peterpilgrim2000/
#101 Bonus Information on Scala 
A Powerful weapon that requires great responsibility 
Great developers can create apps 
AM #1: “Interactions and individuals over processes and tools” 
Xenonique 
58
How to avoid null pointers in 
Xenonique 
Scala Programming? 
val greeting1: Option[String] = 
Some("AOTB14") 
val greeting2: Option[String] = None 
59
Xenonique 
Pattern Matching 
def checker(p : Option[String]): String = { 
p match { 
case Some(v) => v 
case _ => "Unexpected" 
} 
} 
checker(greeting1) // "Hello AOTB14" 
checker(greeting2) // "Unspecified" 
60
Scala’s generic immutable list 
Xenonique 
collection type 
val list: List[Int] = List(1,2,3,4) 
list.foreach { x => println(x) } 
// 1,2,3,4 
61
Scala’s option behaves like 
Xenonique 
collection type #2 
greeting1.foreach { x => 
println(s"Work: ${x}" ) } 
// Work: Hello AOTB14 
greeting2.foreach { x => 
println(s"Work: ${x}" ) } 
// *** nothing happens *** 
62
Read, Evaluate, Print, Loop 
• Scala, Clojure, Groovy, Kotlin, Ceylon, Fantom 
All have a interpretative mode 
• Java JDK does not (yet) have an official REPL 
(However try out javarepl.com online) 
• Fingers crossed Project Kulla in JDK 9 
http://blog.gmane.org/gmane.comp.java.openjdk.general 
Xenonique 
63
List of Creative Commons (2.0) 
photography attributions 
https://flic.kr/p/ayqvZp 
https://www.flickr.com/photos/throughpaintedeyes/ 
Ryan Seyeau Follow 
1000 Faces of Canada # 0084 - Zombie Walk - Explore! 
Shot during the annual Zombie Walk in Ottawa. 
https://flic.kr/p/Pp93n 
https://www.flickr.com/photos/spacesuitcatalyst/ 
William A. Clark Follow 
Measurement 
Measure twice, cut once. 
https://flic.kr/p/81dXuT 
https://www.flickr.com/photos/froboy/ 
Avi Schwab Follow 
Equipment used for measuring planes of crystals 
https://flic.kr/p/2QHt7Q 
https://www.flickr.com/photos/rosefirerising/ 
rosefirerising Follow 
Pierre Curie, Piezo-Electroscope 
Xenonique 
64
List of Creative Commons (2.0) 
photography attributions 
https://www.flickr.com/photos/code_martial/ 
https://flic.kr/p/7jmU5n 
Tahir Hashmi Follow 
Developer Death 
10 Programmers and a UX Designer died all of a sudden in a war room situation. They were 
apparently working too hard. 
https://www.flickr.com/photos/8268882@N06/ 
https://flic.kr/p/duwd1M 
Peter Pilgrim 
IMG_1481 
European JUG leaders meeting in Devoxx 2013 
https://www.flickr.com/photos/unicefethiopia/ 
https://flic.kr/p/dv4ooi 
UNICEF Ethiopia Follow 
Hamer mother and child South Omo Zone, SNNPR 
Hamer mother and child South Omo Zone, SNNPR. 
©UNICEF Ethiopia/2005/Getachew 
Xenonique 
65
List of Creative Commons (2.0) 
photography attributions 
https://www.flickr.com/photos/15216811@N06/ 
https://flic.kr/p/baULpM 
N i c o l a Follow 
Tree - IMG_1242 
https://flic.kr/p/dwCQ7t 
https://www.flickr.com/photos/90585146@N08/ 
marsmetn tallahassee Follow 
IDA .. Integro-Differential Analyzer (Sept., 1952) ...item 2.. Richard Dreyfuss: Technology Has 'Killed Time' -- "In geopolitics, the removal of time is fatal." -- "And 
you will give up, the protection of Republican Democracy." (July 19 2010) ... 
https://flic.kr/p/6ZDbiZ 
https://www.flickr.com/photos/ingmar/ 
Ingmar Zahorsky Follow 
Traffic Jam 
Accidents are common on the narrow streets going through the mountains of Nepal. When such an accident occurs, traffic is often halted for up to 3-4 hours. 
https://flic.kr/p/opvVsg 
https://www.flickr.com/photos/gregbeatty/ 
Greg Beatty Follow 
Three Pillars 
Nikon D800 16-35MM F4.0 
https://flic.kr/p/FAskC 
https://www.flickr.com/photos/mari1008/ 
mari_1008 Follow 
traffic jam -B 
Date: April,2th 
Address: Jiangshu Rd,Shanghai,China. 
Around 8:30 AM today, A little accident on YuYuan Rd and JiangSu Rd caused traffic jam. 
Xenonique 
66
List of Creative Commons (2.0) 
photography attributions 
https://flic.kr/p/bpss6D 
https://www.flickr.com/photos/76029035@N02/ 
Victor1558 Follow 
Creative_Photoshop_HD_Wallpapers_laba.ws 
https://flic.kr/p/mLxu3m 
https://www.flickr.com/photos/astrangelyisolatedplace/ 
astrangelyisolatedplace Follow 
Office test #1. Setup fully functional. A rare 1200 no longer in production. Test run 
soundtracked by the only #vinyl in the office; The Sesame Street Soundtrack - a 
surprise present by @idinesh #technics #turntable #1200 #ocdv1 
via Instagram ift.tt/1hpeUEU 
https://flic.kr/p/gLPhEk 
https://www.flickr.com/photos/stevecorey/ 
Steve Corey Follow 
Treasure Hunt, a short story (5 images) 
Xenonique 
67
List of Creative Commons (2.0) 
photography attributions 
https://flic.kr/p/4JcerK 
https://www.flickr.com/photos/16949884@N00/ 
Bömmel Follow 
Ice Crystal 
Ice is nice 
https://flic.kr/p/dSsXiZ 
https://www.flickr.com/photos/jeremyhall/ 
Jeremy Hall Follow 
Called to Serve (suit and tie) 
https://flic.kr/p/3enERy 
https://www.flickr.com/photos/paolocampioni/ 
Paolo Campioni Follow 
scala 
Scendo (stair case spiral) 
Xenonique 
68
List of Creative Commons (2.0) 
photography attributions 
https://flic.kr/p/m62gmK 
https://www.flickr.com/photos/lata/ 
-p Follow 
Abstraction I. 
From my platycerium. (Guide: Voronoi diagram) 
https://flic.kr/p/6WSFR4 
https://www.flickr.com/photos/62337512@N00/ 
anthony kelly Follow 
big ben 
big ben and underground sign 
https://flic.kr/p/w7qef 
https://www.flickr.com/photos/cobalt/ 
cobalt123 Follow 
All We are Saying... (Thought for a New Year) 
Peace Pasta from Annie's, with peas, of course. 
Give Peace A Chance 
Xenonique 
69

Contenu connexe

Tendances

The Why and How of Scala at Twitter
The Why and How of Scala at TwitterThe Why and How of Scala at Twitter
The Why and How of Scala at TwitterAlex Payne
 
Spring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffJAX London
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play frameworkFelipe
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak SearchJustin Edelson
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysManuel Bernhardt
 
Web注入+http漏洞等描述
Web注入+http漏洞等描述Web注入+http漏洞等描述
Web注入+http漏洞等描述fangjiafu
 
Concurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayConcurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayYardena Meymann
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016Codemotion
 
The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論scalaconfjp
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akkanartamonov
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaKazuhiro Sera
 
From Ruby to Scala
From Ruby to ScalaFrom Ruby to Scala
From Ruby to Scalatod esking
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
Connect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIConnect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIstable|kernel
 
Connect.Tech- Swift Memory Management
Connect.Tech- Swift Memory ManagementConnect.Tech- Swift Memory Management
Connect.Tech- Swift Memory Managementstable|kernel
 

Tendances (20)

The Why and How of Scala at Twitter
The Why and How of Scala at TwitterThe Why and How of Scala at Twitter
The Why and How of Scala at Twitter
 
Spring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard Wolff
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak Search
 
SCALA - Functional domain
SCALA -  Functional domainSCALA -  Functional domain
SCALA - Functional domain
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Web注入+http漏洞等描述
Web注入+http漏洞等描述Web注入+http漏洞等描述
Web注入+http漏洞等描述
 
Concurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayConcurrency in Scala - the Akka way
Concurrency in Scala - the Akka way
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論
 
55 New Features in Java 7
55 New Features in Java 755 New Features in Java 7
55 New Features in Java 7
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akka
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
 
From Ruby to Scala
From Ruby to ScalaFrom Ruby to Scala
From Ruby to Scala
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Scale up your thinking
Scale up your thinkingScale up your thinking
Scale up your thinking
 
Connect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCIConnect.Tech- Level Up Your Game With TravisCI
Connect.Tech- Level Up Your Game With TravisCI
 
Java 5 and 6 New Features
Java 5 and 6 New FeaturesJava 5 and 6 New Features
Java 5 and 6 New Features
 
Connect.Tech- Swift Memory Management
Connect.Tech- Swift Memory ManagementConnect.Tech- Swift Memory Management
Connect.Tech- Swift Memory Management
 

Similaire à BOF2644 Developing Java EE 7 Scala apps

Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Ryan Weaver
 
Webpack Encore Symfony Live 2017 San Francisco
Webpack Encore Symfony Live 2017 San FranciscoWebpack Encore Symfony Live 2017 San Francisco
Webpack Encore Symfony Live 2017 San FranciscoRyan Weaver
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvmIsaias Barroso
 
Scala4sling
Scala4slingScala4sling
Scala4slingday
 
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Codemotion
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java ProgrammersEric Pederson
 
Customizing the Presentation Model and Physical Renderer in Siebel Open UI
Customizing the Presentation Model and Physical Renderer in Siebel Open UICustomizing the Presentation Model and Physical Renderer in Siebel Open UI
Customizing the Presentation Model and Physical Renderer in Siebel Open UITech OneStop
 
Scala Italy 2015 - Hands On ScalaJS
Scala Italy 2015 - Hands On ScalaJSScala Italy 2015 - Hands On ScalaJS
Scala Italy 2015 - Hands On ScalaJSAlberto Paro
 
Alberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsAlberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsScala Italy
 
Angular JS in 2017
Angular JS in 2017Angular JS in 2017
Angular JS in 2017Ayush Sharma
 
Scala in a wild enterprise
Scala in a wild enterpriseScala in a wild enterprise
Scala in a wild enterpriseRafael Bagmanov
 
DevOpSec_KubernetesOperatorUsingJava.pdf
DevOpSec_KubernetesOperatorUsingJava.pdfDevOpSec_KubernetesOperatorUsingJava.pdf
DevOpSec_KubernetesOperatorUsingJava.pdfkanedafromparis
 
Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)Davide Cerbo
 
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...Alain Hippolyte
 

Similaire à BOF2644 Developing Java EE 7 Scala apps (20)

Full Stack Scala
Full Stack ScalaFull Stack Scala
Full Stack Scala
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
 
Webpack Encore Symfony Live 2017 San Francisco
Webpack Encore Symfony Live 2017 San FranciscoWebpack Encore Symfony Live 2017 San Francisco
Webpack Encore Symfony Live 2017 San Francisco
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvm
 
Scala4sling
Scala4slingScala4sling
Scala4sling
 
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
 
CS2309 JAVA LAB MANUAL
CS2309 JAVA LAB MANUALCS2309 JAVA LAB MANUAL
CS2309 JAVA LAB MANUAL
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java Programmers
 
Customizing the Presentation Model and Physical Renderer in Siebel Open UI
Customizing the Presentation Model and Physical Renderer in Siebel Open UICustomizing the Presentation Model and Physical Renderer in Siebel Open UI
Customizing the Presentation Model and Physical Renderer in Siebel Open UI
 
Gradle
GradleGradle
Gradle
 
Scala Italy 2015 - Hands On ScalaJS
Scala Italy 2015 - Hands On ScalaJSScala Italy 2015 - Hands On ScalaJS
Scala Italy 2015 - Hands On ScalaJS
 
Alberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.jsAlberto Paro - Hands on Scala.js
Alberto Paro - Hands on Scala.js
 
Angular JS in 2017
Angular JS in 2017Angular JS in 2017
Angular JS in 2017
 
Scala at Netflix
Scala at NetflixScala at Netflix
Scala at Netflix
 
Play framework
Play frameworkPlay framework
Play framework
 
Scala in a wild enterprise
Scala in a wild enterpriseScala in a wild enterprise
Scala in a wild enterprise
 
DevOpSec_KubernetesOperatorUsingJava.pdf
DevOpSec_KubernetesOperatorUsingJava.pdfDevOpSec_KubernetesOperatorUsingJava.pdf
DevOpSec_KubernetesOperatorUsingJava.pdf
 
Agile Swift
Agile SwiftAgile Swift
Agile Swift
 
Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)
 
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...
Symfony Live 2018 - Développez votre frontend avec ReactJS et Symfony Webpack...
 

Plus de Peter Pilgrim

Devoxx 2019 - Why we pair?
Devoxx 2019 - Why we pair?Devoxx 2019 - Why we pair?
Devoxx 2019 - Why we pair?Peter Pilgrim
 
Cloud native java are we there yet go tech world 2019
Cloud native java   are we there yet  go tech world 2019Cloud native java   are we there yet  go tech world 2019
Cloud native java are we there yet go tech world 2019Peter Pilgrim
 
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!Peter Pilgrim
 
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017Peter Pilgrim
 
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...Peter Pilgrim
 
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and Noteworthy
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and NoteworthyJava EE & Glass Fish User Group: Digital JavaEE 7 - New and Noteworthy
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and NoteworthyPeter Pilgrim
 
AOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java PlatformAOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java PlatformPeter Pilgrim
 
JavaCro 2014 Digital Development with Java EE and Java Platform
JavaCro 2014 Digital Development with Java EE and Java PlatformJavaCro 2014 Digital Development with Java EE and Java Platform
JavaCro 2014 Digital Development with Java EE and Java PlatformPeter Pilgrim
 
ACCU 2013 Taking Scala into the Enterpise
ACCU 2013 Taking Scala into the EnterpiseACCU 2013 Taking Scala into the Enterpise
ACCU 2013 Taking Scala into the EnterpisePeter Pilgrim
 
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...Peter Pilgrim
 
JavaOne 2011 Progressive JavaFX 2.0 Custom Components
JavaOne 2011 Progressive JavaFX 2.0 Custom ComponentsJavaOne 2011 Progressive JavaFX 2.0 Custom Components
JavaOne 2011 Progressive JavaFX 2.0 Custom ComponentsPeter Pilgrim
 
ACCU 2011 Introduction to Scala: An Object Functional Programming Language
ACCU 2011 Introduction to Scala: An Object Functional Programming LanguageACCU 2011 Introduction to Scala: An Object Functional Programming Language
ACCU 2011 Introduction to Scala: An Object Functional Programming LanguagePeter Pilgrim
 

Plus de Peter Pilgrim (12)

Devoxx 2019 - Why we pair?
Devoxx 2019 - Why we pair?Devoxx 2019 - Why we pair?
Devoxx 2019 - Why we pair?
 
Cloud native java are we there yet go tech world 2019
Cloud native java   are we there yet  go tech world 2019Cloud native java   are we there yet  go tech world 2019
Cloud native java are we there yet go tech world 2019
 
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!
LJC 2018 - PEAT UK - Java EE - Ah, ah, ah! Staying Alive!
 
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017
CON6148 - You Are Not Cut Out To Be A Java Contractor - JavaOne 2017
 
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...
JavaOne 2015 CON5211 Digital Java EE 7 with JSF Conversations, Flows, and CDI...
 
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and Noteworthy
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and NoteworthyJava EE & Glass Fish User Group: Digital JavaEE 7 - New and Noteworthy
Java EE & Glass Fish User Group: Digital JavaEE 7 - New and Noteworthy
 
AOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java PlatformAOTB2014: Agile Testing on the Java Platform
AOTB2014: Agile Testing on the Java Platform
 
JavaCro 2014 Digital Development with Java EE and Java Platform
JavaCro 2014 Digital Development with Java EE and Java PlatformJavaCro 2014 Digital Development with Java EE and Java Platform
JavaCro 2014 Digital Development with Java EE and Java Platform
 
ACCU 2013 Taking Scala into the Enterpise
ACCU 2013 Taking Scala into the EnterpiseACCU 2013 Taking Scala into the Enterpise
ACCU 2013 Taking Scala into the Enterpise
 
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded...
 
JavaOne 2011 Progressive JavaFX 2.0 Custom Components
JavaOne 2011 Progressive JavaFX 2.0 Custom ComponentsJavaOne 2011 Progressive JavaFX 2.0 Custom Components
JavaOne 2011 Progressive JavaFX 2.0 Custom Components
 
ACCU 2011 Introduction to Scala: An Object Functional Programming Language
ACCU 2011 Introduction to Scala: An Object Functional Programming LanguageACCU 2011 Introduction to Scala: An Object Functional Programming Language
ACCU 2011 Introduction to Scala: An Object Functional Programming Language
 

Dernier

INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxHumphrey A Beña
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxAnupkumar Sharma
 
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfTechSoup
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersSabitha Banu
 
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)lakshayb543
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptxmary850239
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPCeline George
 
Full Stack Web Development Course for Beginners
Full Stack Web Development Course  for BeginnersFull Stack Web Development Course  for Beginners
Full Stack Web Development Course for BeginnersSabitha Banu
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxiammrhaywood
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceSamikshaHamane
 
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTiammrhaywood
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Mark Reed
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfMr Bounab Samir
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...Postal Advocate Inc.
 

Dernier (20)

INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
 
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginners
 
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
 
4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERP
 
Full Stack Web Development Course for Beginners
Full Stack Web Development Course  for BeginnersFull Stack Web Development Course  for Beginners
Full Stack Web Development Course for Beginners
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in Pharmacovigilance
 
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
 
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptxFINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
OS-operating systems- ch04 (Threads) ...
OS-operating systems- ch04 (Threads) ...OS-operating systems- ch04 (Threads) ...
OS-operating systems- ch04 (Threads) ...
 
Raw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptxRaw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptx
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
 

BOF2644 Developing Java EE 7 Scala apps

  • 1. Developing Java EE 7 Applications with Scala (CON2664) Demystifying the Object-Functional Peter Pilgrim Scala and Java EE Independent contractor @peter_pilgrim
  • 2. Creative Commons 2.0 Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales (CC BY-NC-SA 2.0 UK) https://creativecommons.org/licenses/by-nc-sa/2.0/uk/ • Share — copy and redistribute the material in any medium or format • Adapt — remix, transform, and build upon the material • The licensor cannot revoke these freedoms as long as you follow the license terms. Xenonique 2
  • 3. Xenonique About Me • Scala and Java EE developer independent contractor • Digital transformation / e-commerce • Java Champion • Working on the JVM since 1998 3
  • 4. Xenonique Java EE 7 Developer Handbook September 2013 Packt Publishing Digital Java EE 7 Web APPS December 2014 4
  • 5. Xenonique 5 Agenda • Scala Technology • Java EE 7 • CDI • JSF, Servlets • JAX-RS, JMS
  • 7. Xenonique 7 #1 Scala Object-functional Since 2003 Statically typed programming Scalable Language Inventor: Professor Martin Odersky, EPFL, Typesafe
  • 8. Xenonique 8 #1 Scala Pattern Matching Case Classes Traits, Mix-ins, Collections Expressions, In-fix operators Functions, Closures, Control Abstractions Extension through Library functions
  • 9. Xenonique 9 #1 Scala Gradle, Gradle, Gradle v2.0 Groovy assembler, builder Comprehensible, Configurable, Flexible Works with Scala since Gradle v1.7 With Gradle, building WAR files is very straightforward
  • 10. Xenonique Scala Language var age: Int = 37 val pi: Double = 3.141596527 val text: String = "human nature" val r = if (age >= 18 ) "Adult" else "Child" 10
  • 11. Xenonique Scala Test #1 import collection.mutable.Stack import org.scalatest._ import org.scalatest.junit.JUnitRunner @RunWith(classOf[JUnitRunner]) class StackSpec extends FlatSpec with Matchers { /* ... */ } 11
  • 12. Xenonique Scala Test #2 class StackSpec extends FlatSpec with Matchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should be (2) stack.pop() should be (1) } /* ... */ } 12
  • 13. Xenonique Scala Test #3 class StackSpec extends FlatSpec with Matchers { /* ... */ it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[Int] a [NoSuchElementException] should be thrownBy { emptyStack.pop() } } } 13
  • 14. Java is a programming language. Java is a virtual machine. Java is a platform. Xenonique 14 Java EE 7 released 2013 Built products on top of a standard platform Transactions, Concurrency, Remote Endpoints, Lifecycle, State, Persistence
  • 17. Context & Dependency Injection • Writing Scala beans • Annotate with Scala @BeanProperty on POSI (Plain Old Scala Instances) • Ensure compatibility with Java code • @BeanProperty exposes properties to CDI Xenonique 17
  • 18. Plain Old Scala Instance @ApplicationScoped class CashierService { @BeanProperty @Inject() var service: PaymentService = _ def process( acc: Account, Xenonique amount: BigDecimal): Unit = { service.debit(amount); acc.balance = acc.balance - amount } } 18
  • 19. CDI Dependent Object @ApplicationScoped class PaymentService { var message: String = _ def debit(amount: BigDecimal): Unit = { message = s"You paid ${amount}" } } // Note String interpolators Xenonique 19
  • 20. CDI Model instance class Account( var balance: BigDecimal ) // This is a complete class definition! ;-) Xenonique 20
  • 21. Xenonique CDI Scala Gotchas • Companion Objects cannot be used • Case Classes (and obviously Case Objects) – Failure due to creation of multiple static methods in byte code • Implicit class parameters • Implicit method parameters • Lazy public vals also fail 21
  • 22. Building Java EE 7 War Files • Gradle allows developers to build WAR files very easy and also add customisation • Explicitly include the Scala Library JAR as a dependency • With SBT, it is harder to create WAR files – Battling between *.scala and *.sbt files Xenonique 22
  • 23. Sample Gradle Dependencies dependencies { providedCompile 'javax:javaee-api:7.0’ compile 'org.scala-lang:scala-library:2.11.2' testCompile 'junit:junit:4.11' testCompile 'org.scalatest:scalatest_2.11:2.2.0’ Xenonique } 23
  • 24. Xenonique CDI Factory #1 trait Maker { def createSample(): Fruit } @ApplicationScoped class FruitFactory { private class CocktailMaker extends Maker { override def createSample():Fruit = new Strawberry } private class FruitSaladMaker extends Maker { override def createSample():Fruit = new Banana } } 24
  • 25. Xenonique CDI Factory #2 @ApplicationScoped class FruitFactory { // ... @Produces def generateCocktail(): Maker = new CocktailMaker() @Produces def generateFruitSalad(): Maker = new FruitSaladMaker() } 25
  • 26. Xenonique CDI Factory #3 trait Fruit { val price: Double; val name = this.getClass.getSimpleName } case class Apple() extends Fruit { override val price = 0.75 } case class Banana() extends Fruit { override val price = 0.95 } case class Strawberry() extends Fruit { override val price = 2.99 } 26
  • 27. #1 Collection Of Case Xenonique Classes @ApplicationScoped class FruitVendor { def sell( fruit: Fruit with Product with Serializable, quantity: Int): Double = { fruit.price * quantity } } 27
  • 28. #2 Collection Of Case Xenonique Classes @Test def shouldPriceFruitWithQuantity(): Unit = { val fruits = List((Apple,2), (Orange,4), (Banana,5)) for ( (fruit, quantity) <- fruits) { val product = fruitVendor.sell(fruit(), quantity) assertEquals( product, fruit().price * quantity, 0.01 ) } } 28
  • 29. #3 Collection Of Case Classes Xenonique Sugaring of Supertype scala> val list = List( Apple -> 1, Orange -> 4, Banana -> 7 ) list: List[(scala.runtime.AbstractFunction0[ Product with Serializable with Fruit] with Serializable, Int)] = List((Apple,1), (Orange,4), (Banana,7)) // [R]AbstractFunction0.apply() => R // fruit() returns the Fruit mix-in type 29
  • 30. Xenonique 30 #2 Arquillian: Prefer integration tests over unit tests. You can write Arquillian tests with Scala You cannot yet mix ScalaTest specifications
  • 31. Writing Arquillian Tests with Xenonique Scala #1 // HERE WOULD BE THE IDEAL WORLD import org.jboss.arquillian.junit.Arquillian import org.junit.runner.RunWith import org.scalatest.junit. JUnitSuite} import org.scalatest.{FlatSpecLike, Matcher} @RunWith(classOf[Arquillian], classOf[JUnitRunner]) /* ;-) */ class HelloArquillianSpec extends JUnitSuite with FlatSpecLike with Matchers { } 31
  • 32. Writing Arquillian Tests with Xenonique Scala #2 // The Reality of the Situation in 2014 @RunWith(classOf[Arquillian]) class HelloArquillianSpec extends JUnitSuite with Matchers { // You can’t use BDD like specificationsL } 32
  • 33. Writing Arquillian Tests with Xenonique Scala #3 // Add a companion object, generate a WAR file object HelloArquillianSpec { @Deployment def createDeployment():WebArchive = { ShrinkWrap.create( classOf[WebArchive], "test.war") .addPackage("uk.co.xenonique.digitalone") .addAsLibrary( GradleDependency.resolve( "org.scala-lang:scala-library:2.11.1") ) .addAsLibrary( GradleDependency.resolve( "org.scalatest:scalatest_2.11:2.2.0") ) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml”) } } 33
  • 34. Writing Arquillian Tests with Xenonique Scala #4 // Add a companion object @RunWith(classOf[Arquillian]) class HelloArquillianSpec extends JUnitSuite with Matchers { @Inject var hello: Hello = _ @Test def shouldPrintAPoliteGreeting():Unit = { val msg = hello.hello("JavaOne 2014") // ;-) At least, we can use matchers! (msg) should be ("Hello JavaOne 2014") } } 34
  • 35. Xenonique 35 #3 Servlets A Java Servlet is a web component managed container. Java Servlets are based on the Java technology, they generate dynamic content, and hence the container that manages them is capable of delivering dynamic content to the web client.
  • 36. Simplest Json Servlet @WebServlet(Array("/simple")) class SimpleServlet extends HttpServlet { override def doGet(req: HttpServletRequest, Xenonique resp: HttpServletResponse): Unit = { resp.setContentType("application/json”) val writer = resp.getWriter() writer.println( s""" |{ | "trackTitle": "Two Tribes", | "class": "${this.getClass().getName}", | "date": "${new Date()}" |} """.stripMargin ) } } 36
  • 37. Xenonique 37 #4 JAX-RS Easy to write in Scala Jackson Annotations, Json4S We demand Json support with seamless Scala support Jackson, especially, FasterXML is extremely helpful https://github.com/FasterXML/jackson-annotations/ For Parsing JSON from text strings, then examine Json4S https://github.com/json4s/json4s
  • 38. Convert Posis to Json // How do we convert this POSI to JSON // to seamlessly and easily? ;-/ class Traveller( @BeanProperty var givenName: String, @BeanProperty var familyName: String, @BeanProperty var dateOfBirth: Date , @BeanProperty var docNo: String ) Xenonique 38
  • 39. Jackson Json Jaxb Annotations // Look at the Jackson JAX-B project for // inspiration ;-D class Traveller2( @BeanProperty @JsonProperty("givenName") var givenName: String, @BeanProperty @JsonProperty("familyName") var familyName: String, @BeanProperty @JsonProperty("dateOfBirth") var dateOfBirth: Date, @BeanProperty @JsonProperty("documentNo") var docNo: String ) Xenonique 39
  • 40. Restful Scala JAX-RS Service Xenonique Endpoint @Path("/traveller") class TravellerServiceEndpoint { @GET() @Produces(Array(MediaType.APPLICATION_JSON)) def retrieve(): Response = { val cal = Calendar.getInstance() cal.set(1986, Calendar.MAY, 21) val dob = cal.getTime val traveller = new Traveller2("Sam", "Smith", dob, "1234567890") Response.ok(traveller).build() } } 40
  • 41. Jackson Json Mapping With Xenonique Provider @Singleton @Provider @Consumes(Array(MediaType.APPLICATION_JSON, "application/*+json", "text/json")) @Produces(Array(MediaType.APPLICATION_JSON, "application/*+json", "text/json")) class JacksonScalaContextResolver extends JacksonJaxbJsonProvider(JacksonScalaContextResolver.getObjectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS) object JacksonScalaContextResolver { def getObjectMapper: ObjectMapper = { val mapper = new ObjectMapper with ScalaObjectMapper mapper.registerModule(new DefaultScalaModule) mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) mapper.setSerializationInclusion(Include.NON_NULL) mapper } } 41
  • 42. Case Classes Instances and Xenonique Jackson Annotations @JsonIgnoreProperties(Array("databaseId", "computedDeliveryDateTime")) case class Traveller3( @BeanProperty @JsonProperty("givenName") var givenName: String, @BeanProperty @JsonProperty("familyName") var familyName: String, @BeanProperty @JsonProperty("dateOfBirth") var dateOfBirth: Date , @BeanProperty @JsonProperty("documentNo") var docNo: Option[String], @BeanProperty var computedDeliveryDateTime: Date = new Date()) 42
  • 43. Consuming of Json to Scala Case Class Instance #1 @POST() @Consumes(Array(MediaType.APPLICATION_JSON)) def store( traveller: Traveller3): Response = { if ( traveller.getDocNo().isEmpty ) { Response.status( Response.Status.BAD_REQUEST) .entity(ErrorMessage("E199", Xenonique "Missing document No")) .build() } else { Response.ok().build() } } 43
  • 44. Xenonique Case Class #2 case class ErrorMessage( @JsonProperty("id") var id: String, @JsonProperty("error") var text: String) // Renders // { "id": "E199", // "error": "Missing document No" // } 44
  • 45. Xenonique 45 #5 JSF Easy to write in Scala Conversational, FlowScoped RequestScoped, SessionScoped All types of validation are supported including BeanValidation just like Java
  • 46. Conversational Scoped Xenonique Managed Bean @Named("wizard") @ConversationScoped class RegisterDrivingLicense extends Serializable { @Inject var conversation: Conversation = _; @BeanProperty var title: String = _ @BeanProperty var firstName: String = _ @BeanProperty var lastName: String = _ /* ... */ } 46
  • 47. Controller Methods def jumpGettingStarted(): String = { beginConversation() "form1?faces-redirect=true" } def submitPage1(): String = { beginConversation() "form2?faces-redirect=true" } Xenonique 47
  • 48. Conversational States def beginConversation(): Unit = { if (conversation.isTransient()) { conversation.begin() } } def endConversation(): Unit = { if (!conversation.isTransient()) { conversation.end() } } Xenonique 48
  • 49. Finish Conversational Scopes def submitDeclarationPage(): String = { endConversation() if ( !declaration ) { // The declaration was not signed cancelApplication() } else { // Here the form is complete "end?faces-redirect=true" } } Xenonique 49
  • 50. Xenonique 50 #6 JMS JMS is straight forward to code with Scala MDB is essentially an asynchronous EJB Tricky part is publishing with JMS 2.0!
  • 51. JMS with CDI Qualifiers #1 class JMSResourceProducer { @Resource(name = "jms/OrderConnectionFactory") val orderConnFactory: QueueConnectionFactory = _ @Produces @Order @Resource(name = "jms/OrderQueue") val orderQueue: Queue = _ @Produces @Order def createOrderConnection(): QueueConnection = orderConnectionFactory.createQueueConnection() /* ... */ } Xenonique 51
  • 52. JMS with CDI Qualifiers #2 class JMSResourceProducer { /* ... */ @Produces @Order def createOrderSession( @Order conn:QueueConnection): QueueSession = conn.createQueueSession( true, Session.AUTO_ACKNOWLEDGE) Xenonique } 52
  • 54. Xenonique 54 #Conclusion(1) Source code is available now! https://github.com/peterpilgrim/digital-scala-javaone- 2014
  • 55. #Conclusion(2) Scala and Java EE 7 integrate well from an Object-Oriented point of view Java EE 8 and Lambda API promise a functional approach. Java EE 7 annotations work in Scala. The ability of Jackson annotations and a singleton provider to seamlessly handle Scala’s case classes is a wonderful addition. Arquillian almost works completely with ScalaTest. Xenonique 55
  • 56. Xenonique 56 #Conclusion(3) WAR files require the runtime Scala Library Decent server configuration using Chef and Puppet can obviate the bundling of the runtime Scala allows developers to avoid Java boilerplate Library writers should prefer to explicitly declare the return types of functions and methods
  • 57. Xenonique 57 @peter_pilgrim uk.linkedin.com/in/peterpilgrim2000/
  • 58. #101 Bonus Information on Scala A Powerful weapon that requires great responsibility Great developers can create apps AM #1: “Interactions and individuals over processes and tools” Xenonique 58
  • 59. How to avoid null pointers in Xenonique Scala Programming? val greeting1: Option[String] = Some("AOTB14") val greeting2: Option[String] = None 59
  • 60. Xenonique Pattern Matching def checker(p : Option[String]): String = { p match { case Some(v) => v case _ => "Unexpected" } } checker(greeting1) // "Hello AOTB14" checker(greeting2) // "Unspecified" 60
  • 61. Scala’s generic immutable list Xenonique collection type val list: List[Int] = List(1,2,3,4) list.foreach { x => println(x) } // 1,2,3,4 61
  • 62. Scala’s option behaves like Xenonique collection type #2 greeting1.foreach { x => println(s"Work: ${x}" ) } // Work: Hello AOTB14 greeting2.foreach { x => println(s"Work: ${x}" ) } // *** nothing happens *** 62
  • 63. Read, Evaluate, Print, Loop • Scala, Clojure, Groovy, Kotlin, Ceylon, Fantom All have a interpretative mode • Java JDK does not (yet) have an official REPL (However try out javarepl.com online) • Fingers crossed Project Kulla in JDK 9 http://blog.gmane.org/gmane.comp.java.openjdk.general Xenonique 63
  • 64. List of Creative Commons (2.0) photography attributions https://flic.kr/p/ayqvZp https://www.flickr.com/photos/throughpaintedeyes/ Ryan Seyeau Follow 1000 Faces of Canada # 0084 - Zombie Walk - Explore! Shot during the annual Zombie Walk in Ottawa. https://flic.kr/p/Pp93n https://www.flickr.com/photos/spacesuitcatalyst/ William A. Clark Follow Measurement Measure twice, cut once. https://flic.kr/p/81dXuT https://www.flickr.com/photos/froboy/ Avi Schwab Follow Equipment used for measuring planes of crystals https://flic.kr/p/2QHt7Q https://www.flickr.com/photos/rosefirerising/ rosefirerising Follow Pierre Curie, Piezo-Electroscope Xenonique 64
  • 65. List of Creative Commons (2.0) photography attributions https://www.flickr.com/photos/code_martial/ https://flic.kr/p/7jmU5n Tahir Hashmi Follow Developer Death 10 Programmers and a UX Designer died all of a sudden in a war room situation. They were apparently working too hard. https://www.flickr.com/photos/8268882@N06/ https://flic.kr/p/duwd1M Peter Pilgrim IMG_1481 European JUG leaders meeting in Devoxx 2013 https://www.flickr.com/photos/unicefethiopia/ https://flic.kr/p/dv4ooi UNICEF Ethiopia Follow Hamer mother and child South Omo Zone, SNNPR Hamer mother and child South Omo Zone, SNNPR. ©UNICEF Ethiopia/2005/Getachew Xenonique 65
  • 66. List of Creative Commons (2.0) photography attributions https://www.flickr.com/photos/15216811@N06/ https://flic.kr/p/baULpM N i c o l a Follow Tree - IMG_1242 https://flic.kr/p/dwCQ7t https://www.flickr.com/photos/90585146@N08/ marsmetn tallahassee Follow IDA .. Integro-Differential Analyzer (Sept., 1952) ...item 2.. Richard Dreyfuss: Technology Has 'Killed Time' -- "In geopolitics, the removal of time is fatal." -- "And you will give up, the protection of Republican Democracy." (July 19 2010) ... https://flic.kr/p/6ZDbiZ https://www.flickr.com/photos/ingmar/ Ingmar Zahorsky Follow Traffic Jam Accidents are common on the narrow streets going through the mountains of Nepal. When such an accident occurs, traffic is often halted for up to 3-4 hours. https://flic.kr/p/opvVsg https://www.flickr.com/photos/gregbeatty/ Greg Beatty Follow Three Pillars Nikon D800 16-35MM F4.0 https://flic.kr/p/FAskC https://www.flickr.com/photos/mari1008/ mari_1008 Follow traffic jam -B Date: April,2th Address: Jiangshu Rd,Shanghai,China. Around 8:30 AM today, A little accident on YuYuan Rd and JiangSu Rd caused traffic jam. Xenonique 66
  • 67. List of Creative Commons (2.0) photography attributions https://flic.kr/p/bpss6D https://www.flickr.com/photos/76029035@N02/ Victor1558 Follow Creative_Photoshop_HD_Wallpapers_laba.ws https://flic.kr/p/mLxu3m https://www.flickr.com/photos/astrangelyisolatedplace/ astrangelyisolatedplace Follow Office test #1. Setup fully functional. A rare 1200 no longer in production. Test run soundtracked by the only #vinyl in the office; The Sesame Street Soundtrack - a surprise present by @idinesh #technics #turntable #1200 #ocdv1 via Instagram ift.tt/1hpeUEU https://flic.kr/p/gLPhEk https://www.flickr.com/photos/stevecorey/ Steve Corey Follow Treasure Hunt, a short story (5 images) Xenonique 67
  • 68. List of Creative Commons (2.0) photography attributions https://flic.kr/p/4JcerK https://www.flickr.com/photos/16949884@N00/ Bömmel Follow Ice Crystal Ice is nice https://flic.kr/p/dSsXiZ https://www.flickr.com/photos/jeremyhall/ Jeremy Hall Follow Called to Serve (suit and tie) https://flic.kr/p/3enERy https://www.flickr.com/photos/paolocampioni/ Paolo Campioni Follow scala Scendo (stair case spiral) Xenonique 68
  • 69. List of Creative Commons (2.0) photography attributions https://flic.kr/p/m62gmK https://www.flickr.com/photos/lata/ -p Follow Abstraction I. From my platycerium. (Guide: Voronoi diagram) https://flic.kr/p/6WSFR4 https://www.flickr.com/photos/62337512@N00/ anthony kelly Follow big ben big ben and underground sign https://flic.kr/p/w7qef https://www.flickr.com/photos/cobalt/ cobalt123 Follow All We are Saying... (Thought for a New Year) Peace Pasta from Annie's, with peas, of course. Give Peace A Chance Xenonique 69