SlideShare a Scribd company logo
SCALA in the
Enterprise
Getting FuNkEd Up with the JVM
Peter Pilgrim
Scala and Java EE
Independent contractor
@peter_pilgrim	
  
Xenonique @peter_pilgrim 2	
  
Xenonique @peter_pilgrim 3	
  
Agenda
•  Technical Focus
•  Adoption of Scala
•  Best Practice
•  Magnet Compass
Xenonique @peter_pilgrim
Creative Commons 3.0
Attribution-NonCommercial-NoDerivs 3.0 UK:
England & Wales (CC BY-NC-ND 3.0 UK)
https://creativecommons.org/licenses/by-nc-nd/3.0//
•  Attribute — you must always attribute the source
•  Share — copy and redistribute the material in any
medium or format
•  No Deriv— remix, transform, and build upon the
material, but you cannot distribute modified
The licensor cannot revoke these freedoms as long as
you follow the license terms.
4	
  
Xenonique @peter_pilgrim
About Me
•  Java Champion
•  Java EE and Scala developer independent
contractor
•  Digital / Finance / E-commerce
•  Working on the JVM since 1998
5	
  
Xenonique @peter_pilgrim
About Me
6	
  
Xenonique @peter_pilgrim 7	
  
Xenonique @peter_pilgrim 8	
  
Xenonique @peter_pilgrim 9	
  
Xenonique @peter_pilgrim 10	
  
#1 Unlearn
“Learn a new language, people!”
Expand your horizons
Dianne Marsh
Netflix Director, Engineering Tools
http://diannemarsh.com/
Xenonique @peter_pilgrim 11	
  
Xenonique @peter_pilgrim
Scala Test #1
import collection.mutable.Stack
import org.scalatest._

class StackSpec extends 
FlatSpec with Matchers {

/* ... */
}
12	
  
Xenonique @peter_pilgrim
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)
}
/* ... */
}
13	
  
Xenonique @peter_pilgrim
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()
} 
}
}
14	
  
Xenonique @peter_pilgrim
How to avoid null pointers in
Scala Programming?
val greeting1: Option[String] = 
Some(”QCL15")

val greeting2: Option[String] = None

15	
  
Xenonique @peter_pilgrim
Pattern Matching
def checker(p : Option[String]): String = {
p match {
case Some(v) => v
case _ => "Unexpected"
}
}

checker(greeting1) // "Hello QCL15"
checker(greeting2) // "Unexpected"
16	
  
Xenonique @peter_pilgrim
Scala’s generic immutable list
collection type
val list: List[Int] = List(1,2,3,4)
list.foreach { x => println(x) }
// 1,2,3,4
17	
  
Xenonique @peter_pilgrim
Scala’s option behaves like
collection type #2
greeting1.foreach { x =>
println(s"Work: ${x}" ) }
// Work: Hello QCL15

greeting2.foreach { x => 
println(s"Work: ${x}" ) } 
// *** nothing happens ***
18	
  
Xenonique @peter_pilgrim 19	
  
#2 Unlearn More
“If you only ever learn one thing in
Scala, learn the Collection classes”
Dick Wall
Former JavaPosse Podcaster
http://scalawags.com/
Xenonique @peter_pilgrim 20	
  
Xenonique @peter_pilgrim
Jump To Intermediate Level
class DigitalMicroService(

warehouseClient: WarehouseClient,
applicationClient: ApplicationClient
) extends Logging with PricingFactor {

def startApplication(productName: String, 

params: Map[String, String]): Future[AppId] = {
applicationClient.startApplication(

productName, params)
}

// ...
}

21	
  
Xenonique @peter_pilgrim
Async Reactive Service
Methods
class DigitalMicroService(
// ...
def submit(applicationId: String): Future[Boolean] = {
val future: Future[Boolean] = for {
result <- applicationClient.submit(applicationId)
} yield {
result
}
future recover {
case e: DuplicateSubmissionException => 

logger.info("Application already submitted: " + e); 

true
}
}
}
22	
  
Xenonique @peter_pilgrim
Testing With Specifications #1
class ApplicationClientSpec extends 

Specification with Mocking 

with Futuristic with WsClient {

val applicationClient = 

new ApplicationClient("/service", ws)

"start application" should {
"return the AppId" in {

 
/* . . . */
}
}
}
23	
  
Xenonique @peter_pilgrim
Testing With Specifications #2
"start application" should {
"return the AppId" in {

val responseBodyContent = 
"""{"id": "777"}"""
setUpGlobalResponse(

 "/service/application", 200, responseBodyContent)
response.body returns responseBodyContent

/* . . . */
}
}
24	
  
Xenonique @peter_pilgrim
Testing With Specifications #2
"start application" should { /* ... */
mockRequestHolder.post(
Matchers.eq(

"""{"productName":"digital-service","params":
{}}"""

))(any[Writeable[String]], 

 
any[ContentTypeOf[String]]) 

 
 
returns Future.successful(response)
val responseBody = 
await(applicationClient.startApplication(

 
”digital-service", Map()))
responseBody must_== AppId("777")
}
}
25	
  
Xenonique @peter_pilgrim 26	
  
Xenonique @peter_pilgrim 27	
  
So a does a modern Digital Engineer
learn a new language?
Xenonique @peter_pilgrim 28	
  
The answer is Yes.
Perhaps learn several languages and
DSLs. Puppet, SBT, Grunt etc
Xenonique @peter_pilgrim 29	
  
Xenonique @peter_pilgrim 30	
  
#2 DailyWork2014 GOV.UK
•  Develop Scala applications
•  Play Framework, RESTful Services, MongoDB
•  Cucumber testing: acceptance & functional
•  Collaborative design, pairing and reviews
•  SCRUM, Sometimes Kanban
•  Physical storyboards, retros, planning
•  Heavy dose of UX / User Centric
•  Government Digital Service
Xenonique @peter_pilgrim 31	
  
Xenonique @peter_pilgrim 32	
  
#4 Scala Adoption
Highly competent & talented teams
Motivation is key
Developers drives the decision to
learn Scala; already self-organising
Xenonique @peter_pilgrim 33	
  
#4 Scala Adoption
Somewhat confident and enthusiastic
development talented teams
Delivery is key
Large responsibility for the end
product; mixed Java and Scala
Xenonique @peter_pilgrim 34	
  
#4 Scala Adoption
Time sensitive teams
Time change is key
“We like everything you say about
Scala, however we can’t do this now.”
Wait for the early adopters to finish.
Xenonique @peter_pilgrim 35	
  
#4 Scala Adoption
Lesser acquainted teams
Consequences, uncertainty and
fear are keys
Overly concerned with risk : politics, society,
technology and the unknown-unknowns.
“How does X [Scala] help the business going forward?”
Xenonique @peter_pilgrim 36	
  
Xenonique @peter_pilgrim 37	
  
Functional Programming is here
Xenonique @peter_pilgrim 38	
  
Whether Scala or Java or
something entirely alternative
Xenonique @peter_pilgrim 39	
  
All that matters is your attitude to
programming in general
Xenonique @peter_pilgrim 40	
  
Let’s look at Java SE 8
Xenonique @peter_pilgrim 41	
  
Xenonique @peter_pilgrim 42	
  
#5 Java SE 8
Very respectful to computer science
Lambdas ó Alonzo Church
λ - Calculus (1930)
Lambda expressions
Xenonique @peter_pilgrim 43	
  
#5 Java SE 8
Function Interfaces
Lambda expressions Streams
Default interface methods
Predicates, Filters, Suppliers, Combiners,
Collectors, Reducers, Utilities
Xenonique @peter_pilgrim 44	
  
#5 Java SE 8
The Great Closures Debate
2007
> anonymous inner classes
Parallel Streams; Fork Join;
CompletableFuture
Xenonique @peter_pilgrim 45	
  
#5 Java SE 8
The majority of application programming state of the art
(before modularity comes along).
Filter. Map. Reduce. 2015
Processing data over Java
Collections and Streams
Xenonique @peter_pilgrim
Lambdas Java SE 8
Function<Double,Double> double= x -> x + x

Function<Double,Double> square = x -> x * x

Predicate<String> qconFilter = 

(x: String) -> x.contains("qcon”)

46	
  
Xenonique @peter_pilgrim
Lambdas Java SE 8
// However there is no equivalent to Scala
Function<Double,Double, Double> f1 

= (x + 2) * (y -3 )

// Instead you still define Java interface
interface Multiple<T,U,R> {
R apply(T t, U u );
}

Multiple<Double,Double,Double> f1 
= (x + 2) * (y - 3 )


 47	
  
Xenonique @peter_pilgrim
Lambdas Java SE 8
Arrays.asList(
"Adventure","Romance","QCON London","science")
.stream()
.map( s -> s.toLowerCase())
.filter(qconFilter)
.forEach( e -> System.out.println(e) )

List<String> list = Arrays.asList(
"Adventure","Romance","QCON London","science")

list.stream() .map(String::toLowerCase)
.filter(qconFilter)
.forEach( System::out::println )
48	
  
Xenonique @peter_pilgrim
Design pattern #1 Replace
Factory Interface with Lambda
class TradeFileRetriever {

Function<Void,JSch> factory = 

 
() -> new JSch();


void setFactory(
Function<Void,JschSession> factory) 

 
return this.factory = factory;

} 

// jsch = this.factory.apply();
}


49	
  
Xenonique @peter_pilgrim
Lambda Factory #2– Mock Out
Hard Hat Frameworks
import com.jcraft.jsch.*

JSch mockJsch = mock(Jsch.class)
Session mockSession = mockSession(Session.class)

TradeFileRetriever retriever = 
new TradeFileRetriever();
retriever.setFactory( () -> mockJsch )

when(mockJsch.getSession()).thenReturn( 
mockSession )


 50	
  
Xenonique @peter_pilgrim
Lambda Flatmap – I just want
to process only trade Details
class TradeRecord {

List<String,TradeDetail> tradeDetailMap 
= new TreeMap<>();

// ...
}

List<TradeRecord> tradeRecords = retrieveSome();

tradeRecords.stream()
.flatMap( t ->
t.getTradeDetails().entrySet().stream())
.filter( s -> s.getKey().startsWith("ASIA") )
.forEach( s -> 

System.out.printf("%s -> %s", 

 
s.getKey(), s.getValue() ));


51	
  
Xenonique @peter_pilgrim
Lambda Flatmap – Emergency
Request Positions with Hsbc
IntSummaryStatistics hsbcFundSummary =

tradeRecords.stream()
.flatMap( 

t -> t.getTradeDetails().entrySet().stream())
.filter( 

s -> s.getValue().getCurrency().equals("GBP"))
.filter(

s.getValue().getCounterparty().equals("HSBC"))
.collect(

 
 
Collectors.summarizingInt(

 
 
 
s -> s.getValue().getQuantity()));
52	
  
Xenonique @peter_pilgrim 53	
  
Xenonique @peter_pilgrim 54	
  
#6
Functional Patterns
for Object Oriented People
Xenonique @peter_pilgrim
Prefer First-Class Functions
over Functors
// Java Classic 
class Comparator<TradeDetail,TradeDetail> {

public int compare(TradeDetail p1,
TradeDetail p2) {

 
return p1.getCurrency().compareTo( 

 
 
p2.getCurrency());
}


55	
  
Xenonique @peter_pilgrim
Prefer First-Class Functions
over Functors
// Scala
val currencyComparator = 

(p1:TradeDetail,p2:TradeDetail) => 

 
p1.currency.compareTo(p2.currency)

trades.sortWith( currencyComparator )
56	
  
Xenonique @peter_pilgrim
Prefer Internal Iterators
over External Interators
static int summation( List<Products> products) {

int sum = 0;

for (Product e: products) {

 
sum += e.getPrice();

}

return sum;
}
// Java 

57	
  
Xenonique @peter_pilgrim
Prefer Internal Iterator over
External Means
// Scala: internal iteration 

products.map( x => x.price ).sum

products.foldLeft(0) ( _.price + _.price )

// Soft (closure) white!
var sum = 0
products.foreach { 
e => sum = sum + e.price }
58	
  
Xenonique @peter_pilgrim
Prefer Functions over the
Command Pattern
// Java
interface Command {
void execute(Item item)
}

class Ingest implements Command { ... }
class Compress implements Command { ... }
class Enrich implements Command { ... }


59	
  
Xenonique @peter_pilgrim
Prefer Functions over the
Command Pattern
// Scala 
val ingest = (item: Item) => { ... }
val compress = (item: Item) => { ... }
val enrich = (item: Item) => { ... }

val items: List[Item] = ...
items.map { x => 
ingest(x); compress(x); enrich(x); x }


60	
  
Xenonique @peter_pilgrim
Prefer Functions over the
Command Pattern
// Scala : NB the order of composition!
val evenBetter = 
enrich compose compress compose ingest

val items: List[Item] = ...
items.map { x => evenBetter(x); x }


61	
  
Xenonique @peter_pilgrim
Wherever you Can: Filter, Map
and Reduce
val items: List[Item] = ...

val discountShoppingCartPrice =

items

 .filter( item => item.price >= 25.0)

 .map( item => item.nominal )

 .reduce( 

 
 
(total, price ) 

 
 
 => total + price * 0.90 ) 
62	
  
Xenonique @peter_pilgrim
Function Builders
def discounter(percent: Double): 

(Double) => Double = {

require( percent >= 0.0 && 

 
 
 
 
percent <= 100.0 )


(price: Double) => 

 
price - ( price * percent / 100.0)
} 

63	
  
Xenonique @peter_pilgrim
Function Builders
val tenPercenter = discounter(10)
val twentyPercenter = discounter(20)

val finalCartPrice = 
if (customer.loyaltyPoints >= 3000 )

 gardenItemPrices map tenPercenter sum +
foodItemsPrices map twentyPercenter sum
else
( gardenItemPrices ::: foodItemPrices ) sum

64	
  
Xenonique @peter_pilgrim
replace conditional logic with
Partially Applied Functions
abstract class Item { val nominal: Double }
case class GardenItem(val nominal:Double )
extends Item
case class EnergyItem(val nominal:Double )
extends Item

val gardenTaxCode: PartialFunction[Any, Int] =
{ case i: GardenItem => i.nominal * 0.025 }

val energyTaxCode: PartialFunction[Any, Int] =
{ case i: EnergyItem => i.nominal * 0.015 }

65	
  
Xenonique @peter_pilgrim
replace conditional logic with
Partially Applied Functions

gardenTaxCode.isDefinedAt( GardenItem(100))
gardenTaxCode.isDefinedAt( "What is this?"))

val items = List(
GardenItem(12.34), EnergyItem(73.99))

val gardenTax = items collect gardenTaxCode

66	
  
Xenonique @peter_pilgrim
Lean on to Tail Recursive
Functions
def summation(xs: List[Int]): Int = {
xs match {
case x :: tail => x + summation(tail) 
case Nil => 0
}
}

67	
  
Xenonique @peter_pilgrim
Lean on to Tail Recursive
Functions
def summation(xs: List[Int]): Int = {
@tailrec
def sum0(xs: List[Int], acc: Int): Int = {
xs match {
case x :: tail => sum0(tail, acc + x)
case Nil => acc
}
}

sum0(xs, 0)
}

68	
  
Xenonique @peter_pilgrim 69	
  
Xenonique @peter_pilgrim 70	
  
Let’s Come Up For Air!
Xenonique @peter_pilgrim 71	
  
Xenonique @peter_pilgrim 72	
  
#7 Adventures?
Please extend your inspiration to
Recursive functions (Tail Rec)
Focused mutability
Futures and Promises
Control Flow
Domain Specific Languages
Xenonique @peter_pilgrim 73	
  
Xenonique @peter_pilgrim 74	
  
#Conclusion(1)
Scala in the Enterprise: *Done*
How far do you want to go (FP)?
Java SE 8 changes everything
Everyone is learning.
Xenonique @peter_pilgrim 75	
  
#Conclusion(2)
Avoid over reliance on type inference
Break code down
Less is more; Einstein’s Simple
Spectrum of abilities, talent
Avoid silos if possible
Xenonique @peter_pilgrim 76	
  
#Conclusion(3)
Java has lots of frameworks, utilities
Scala has some great tools:
ScalaTest, IDE support
Developers work harder
Conciseness, readability, maintainability
Xenonique @peter_pilgrim 77	
  
Xenonique @peter_pilgrim 78	
  
#Conclusion(4)
The Future of Scala
Macros, Modularisation
Compiler performance, Push to FP
Integration with Java Lambdas
Who knows really when or next?
“Always a Left Field contender, there will be” Yodaspeak
Xenonique @peter_pilgrim 79	
  
#It Yours!
Get yourselves
FuNkEd Up
with the JVM
Xenonique @peter_pilgrim 80	
  
May 2014
Xenonique @peter_pilgrim 81	
  
@peter_pilgrim	
  
uk.linkedin.com/in/peterpilgrim2000/	
  
Xenonique @peter_pilgrim
List of Creative Commons (2.0)
photography attributions
https://flic.kr/p/dhf3FQ
https://www.flickr.com/photos/epsos/
epSos.de
Big Beautiful Face Statue in Tenerife
https://flic.kr/p/Pp93n
https://www.flickr.com/photos/spacesuitcatalyst/
William A. Clark Follow
Measurement
Measure twice, cut once.
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/81dXuT
https://www.flickr.com/photos/froboy/
Avi Schwab Follow
Equipment used for measuring planes of crystals
82	
  
Xenonique @peter_pilgrim
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/8XY4tr
https://www.flickr.com/photos/creative_stock/
Creativity 103
electronic circuit board
https://flic.kr/p/8Y2625
https://www.flickr.com/photos/creative_stock/
Creativity 103
computer motherboard tracks
https://flic.kr/p/2QHt7Q
https://www.flickr.com/photos/rosefirerising/
rosefirerising Follow
Pierre Curie, Piezo-Electroscope
83	
  
Xenonique @peter_pilgrim
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
84	
  
Xenonique @peter_pilgrim
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/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.
85	
  
Xenonique @peter_pilgrim
List of Creative Commons (2.0)
photography attributions
https://flic.kr/p/ae4ey4
https://www.flickr.com/photos/_marionkl/
Marion Klein
Untitled - London underground picture
https://flic.kr/p/7aJSXC
https://www.flickr.com/photos/ktylerconk/
Kathleen Conklin
Cambden Town Attitude
https://flic.kr/p/ozgHBw
https://www.flickr.com/photos/stevebraund/
Steve Braund
Carnaby Street
https://flic.kr/p/6npTQH
https://www.flickr.com/photos/christianpayne/
Christian Payne
Stephen Fry at Bletchley Park; infront of the statue of Alan Turing
https://flic.kr/p/pMijy2
https://www.flickr.com/photos/frenkieb/
Francis Bijl
London: Tower Bridge
86	
  
Xenonique @peter_pilgrim
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)
87	
  
Xenonique @peter_pilgrim
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/9F7Nnn
https://www.flickr.com/photos/followtheseinstructions/
Follow these instructions
The end ; Assignment: This time your assignment is to find or compose a scene that conveys the essence of the end.
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
88	
  

More Related Content

What's hot

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
 
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
 
The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論scalaconfjp
 
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
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysManuel Bernhardt
 
Concurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayConcurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayYardena Meymann
 
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
 
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
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akkanartamonov
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak SearchJustin Edelson
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to ScalaSaleem Ansari
 
Scala : language of the future
Scala : language of the futureScala : language of the future
Scala : language of the futureAnsviaLab
 
Scala introduction
Scala introductionScala introduction
Scala introductionvito jeng
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016Codemotion
 
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
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 

What's hot (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
 
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
 
The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論The Evolution of Scala / Scala進化論
The Evolution of Scala / Scala進化論
 
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
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Concurrency in Scala - the Akka way
Concurrency in Scala - the Akka wayConcurrency in Scala - the Akka way
Concurrency in Scala - the Akka way
 
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
 
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
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akka
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak Search
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
SCALA - Functional domain
SCALA -  Functional domainSCALA -  Functional domain
SCALA - Functional domain
 
Scala : language of the future
Scala : language of the futureScala : language of the future
Scala : language of the future
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
55 New Features in Java 7
55 New Features in Java 755 New Features in Java 7
55 New Features in Java 7
 
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
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 

Viewers also liked

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
 
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
 
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
 
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
 
Scratching the Surface with JavaFX
Scratching the Surface with JavaFXScratching the Surface with JavaFX
Scratching the Surface with JavaFXjavafxpert
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8javafxpert
 

Viewers also liked (6)

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
 
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
 
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
 
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...
 
Scratching the Surface with JavaFX
Scratching the Surface with JavaFXScratching the Surface with JavaFX
Scratching the Surface with JavaFX
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8
 

Similar to QCon 2015 Scala for the Enterprise: Get FuNkEd Up on the JVM

Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfssusercd195b
 
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.PilgrimJavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.PilgrimPayara
 
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 Frustrations
Scala FrustrationsScala Frustrations
Scala Frustrationstakezoe
 
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGNIntroducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGNManish Pandit
 
Introducing Scala in your existing Java project
Introducing Scala in your existing Java projectIntroducing Scala in your existing Java project
Introducing Scala in your existing Java projectING-IT
 
Scala, ECS, Docker: Delayed Execution @Coursera
Scala, ECS, Docker: Delayed Execution @CourseraScala, ECS, Docker: Delayed Execution @Coursera
Scala, ECS, Docker: Delayed Execution @CourseraC4Media
 
Lagergren jvmls-2014-final
Lagergren jvmls-2014-finalLagergren jvmls-2014-final
Lagergren jvmls-2014-finalMarcus Lagergren
 
The dark side of Akka and the remedy - bp.scala meetup
The dark side of Akka and the remedy - bp.scala meetupThe dark side of Akka and the remedy - bp.scala meetup
The dark side of Akka and the remedy - bp.scala meetupkrivachy
 
Spark - The Ultimate Scala Collections by Martin Odersky
Spark - The Ultimate Scala Collections by Martin OderskySpark - The Ultimate Scala Collections by Martin Odersky
Spark - The Ultimate Scala Collections by Martin OderskySpark Summit
 
Rafael Bagmanov «Scala in a wild enterprise»
Rafael Bagmanov «Scala in a wild enterprise»Rafael Bagmanov «Scala in a wild enterprise»
Rafael Bagmanov «Scala in a wild enterprise»e-Legion
 
Rapid prototyping with solr - By Erik Hatcher
Rapid prototyping with solr -  By Erik Hatcher Rapid prototyping with solr -  By Erik Hatcher
Rapid prototyping with solr - By Erik Hatcher lucenerevolution
 
From java to scala at crowd mix
From java to scala at crowd mixFrom java to scala at crowd mix
From java to scala at crowd mixStefano Galarraga
 
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
 
Scala Past, Present & Future
Scala Past, Present & FutureScala Past, Present & Future
Scala Past, Present & Futuremircodotta
 
Building Concurrent WebObjects applications with Scala
Building Concurrent WebObjects applications with ScalaBuilding Concurrent WebObjects applications with Scala
Building Concurrent WebObjects applications with ScalaWO Community
 
Scala at Treasure Data
Scala at Treasure DataScala at Treasure Data
Scala at Treasure DataTaro L. Saito
 

Similar to QCon 2015 Scala for the Enterprise: Get FuNkEd Up on the JVM (20)

Functional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdfFunctional Scala 2022 - scalajs Alexis.pdf
Functional Scala 2022 - scalajs Alexis.pdf
 
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.PilgrimJavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
JavaEE & GlassFish UG - Digital JavaEE 7 New & Noteworthy by P.Pilgrim
 
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...
 
Full Stack Scala
Full Stack ScalaFull Stack Scala
Full Stack Scala
 
Scala Frustrations
Scala FrustrationsScala Frustrations
Scala Frustrations
 
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGNIntroducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
 
Introducing Scala in your existing Java project
Introducing Scala in your existing Java projectIntroducing Scala in your existing Java project
Introducing Scala in your existing Java project
 
Scala, ECS, Docker: Delayed Execution @Coursera
Scala, ECS, Docker: Delayed Execution @CourseraScala, ECS, Docker: Delayed Execution @Coursera
Scala, ECS, Docker: Delayed Execution @Coursera
 
Lagergren jvmls-2014-final
Lagergren jvmls-2014-finalLagergren jvmls-2014-final
Lagergren jvmls-2014-final
 
The dark side of Akka and the remedy - bp.scala meetup
The dark side of Akka and the remedy - bp.scala meetupThe dark side of Akka and the remedy - bp.scala meetup
The dark side of Akka and the remedy - bp.scala meetup
 
Spark - The Ultimate Scala Collections by Martin Odersky
Spark - The Ultimate Scala Collections by Martin OderskySpark - The Ultimate Scala Collections by Martin Odersky
Spark - The Ultimate Scala Collections by Martin Odersky
 
Rafael Bagmanov «Scala in a wild enterprise»
Rafael Bagmanov «Scala in a wild enterprise»Rafael Bagmanov «Scala in a wild enterprise»
Rafael Bagmanov «Scala in a wild enterprise»
 
Rapid Prototyping with Solr
Rapid Prototyping with SolrRapid Prototyping with Solr
Rapid Prototyping with Solr
 
Rapid prototyping with solr - By Erik Hatcher
Rapid prototyping with solr -  By Erik Hatcher Rapid prototyping with solr -  By Erik Hatcher
Rapid prototyping with solr - By Erik Hatcher
 
From java to scala at crowd mix
From java to scala at crowd mixFrom java to scala at crowd mix
From java to scala at crowd mix
 
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
 
Scala Past, Present & Future
Scala Past, Present & FutureScala Past, Present & Future
Scala Past, Present & Future
 
CakePHP
CakePHPCakePHP
CakePHP
 
Building Concurrent WebObjects applications with Scala
Building Concurrent WebObjects applications with ScalaBuilding Concurrent WebObjects applications with Scala
Building Concurrent WebObjects applications with Scala
 
Scala at Treasure Data
Scala at Treasure DataScala at Treasure Data
Scala at Treasure Data
 

More from 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
 
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
 
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
 
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
 

More from Peter Pilgrim (7)

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
 
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
 
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...
 
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
 

Recently uploaded

AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...Product School
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Product School
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Product School
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...CzechDreamin
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutesconfluent
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesThousandEyes
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlPeter Udo Diehl
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsPaul Groth
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1DianaGray10
 
Free and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi IbrahimzadeFree and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi IbrahimzadeCzechDreamin
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaRTTS
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekCzechDreamin
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...CzechDreamin
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀DianaGray10
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...Sri Ambati
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...Product School
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
 
Introduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG EvaluationIntroduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG EvaluationZilliz
 

Recently uploaded (20)

AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1
 
Free and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi IbrahimzadeFree and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří Karpíšek
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Introduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG EvaluationIntroduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG Evaluation
 

QCon 2015 Scala for the Enterprise: Get FuNkEd Up on the JVM

  • 1. SCALA in the Enterprise Getting FuNkEd Up with the JVM Peter Pilgrim Scala and Java EE Independent contractor @peter_pilgrim  
  • 3. Xenonique @peter_pilgrim 3   Agenda •  Technical Focus •  Adoption of Scala •  Best Practice •  Magnet Compass
  • 4. Xenonique @peter_pilgrim Creative Commons 3.0 Attribution-NonCommercial-NoDerivs 3.0 UK: England & Wales (CC BY-NC-ND 3.0 UK) https://creativecommons.org/licenses/by-nc-nd/3.0// •  Attribute — you must always attribute the source •  Share — copy and redistribute the material in any medium or format •  No Deriv— remix, transform, and build upon the material, but you cannot distribute modified The licensor cannot revoke these freedoms as long as you follow the license terms. 4  
  • 5. Xenonique @peter_pilgrim About Me •  Java Champion •  Java EE and Scala developer independent contractor •  Digital / Finance / E-commerce •  Working on the JVM since 1998 5  
  • 10. Xenonique @peter_pilgrim 10   #1 Unlearn “Learn a new language, people!” Expand your horizons Dianne Marsh Netflix Director, Engineering Tools http://diannemarsh.com/
  • 12. Xenonique @peter_pilgrim Scala Test #1 import collection.mutable.Stack import org.scalatest._ class StackSpec extends FlatSpec with Matchers { /* ... */ } 12  
  • 13. Xenonique @peter_pilgrim 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) } /* ... */ } 13  
  • 14. Xenonique @peter_pilgrim 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() } } } 14  
  • 15. Xenonique @peter_pilgrim How to avoid null pointers in Scala Programming? val greeting1: Option[String] = Some(”QCL15") val greeting2: Option[String] = None 15  
  • 16. Xenonique @peter_pilgrim Pattern Matching def checker(p : Option[String]): String = { p match { case Some(v) => v case _ => "Unexpected" } } checker(greeting1) // "Hello QCL15" checker(greeting2) // "Unexpected" 16  
  • 17. Xenonique @peter_pilgrim Scala’s generic immutable list collection type val list: List[Int] = List(1,2,3,4) list.foreach { x => println(x) } // 1,2,3,4 17  
  • 18. Xenonique @peter_pilgrim Scala’s option behaves like collection type #2 greeting1.foreach { x => println(s"Work: ${x}" ) } // Work: Hello QCL15 greeting2.foreach { x => println(s"Work: ${x}" ) } // *** nothing happens *** 18  
  • 19. Xenonique @peter_pilgrim 19   #2 Unlearn More “If you only ever learn one thing in Scala, learn the Collection classes” Dick Wall Former JavaPosse Podcaster http://scalawags.com/
  • 21. Xenonique @peter_pilgrim Jump To Intermediate Level class DigitalMicroService( warehouseClient: WarehouseClient, applicationClient: ApplicationClient ) extends Logging with PricingFactor { def startApplication(productName: String, params: Map[String, String]): Future[AppId] = { applicationClient.startApplication( productName, params) } // ... } 21  
  • 22. Xenonique @peter_pilgrim Async Reactive Service Methods class DigitalMicroService( // ... def submit(applicationId: String): Future[Boolean] = { val future: Future[Boolean] = for { result <- applicationClient.submit(applicationId) } yield { result } future recover { case e: DuplicateSubmissionException => logger.info("Application already submitted: " + e); true } } } 22  
  • 23. Xenonique @peter_pilgrim Testing With Specifications #1 class ApplicationClientSpec extends Specification with Mocking with Futuristic with WsClient { val applicationClient = new ApplicationClient("/service", ws) "start application" should { "return the AppId" in { /* . . . */ } } } 23  
  • 24. Xenonique @peter_pilgrim Testing With Specifications #2 "start application" should { "return the AppId" in { val responseBodyContent = """{"id": "777"}""" setUpGlobalResponse( "/service/application", 200, responseBodyContent) response.body returns responseBodyContent /* . . . */ } } 24  
  • 25. Xenonique @peter_pilgrim Testing With Specifications #2 "start application" should { /* ... */ mockRequestHolder.post( Matchers.eq( """{"productName":"digital-service","params": {}}""" ))(any[Writeable[String]], any[ContentTypeOf[String]]) returns Future.successful(response) val responseBody = await(applicationClient.startApplication( ”digital-service", Map())) responseBody must_== AppId("777") } } 25  
  • 27. Xenonique @peter_pilgrim 27   So a does a modern Digital Engineer learn a new language?
  • 28. Xenonique @peter_pilgrim 28   The answer is Yes. Perhaps learn several languages and DSLs. Puppet, SBT, Grunt etc
  • 30. Xenonique @peter_pilgrim 30   #2 DailyWork2014 GOV.UK •  Develop Scala applications •  Play Framework, RESTful Services, MongoDB •  Cucumber testing: acceptance & functional •  Collaborative design, pairing and reviews •  SCRUM, Sometimes Kanban •  Physical storyboards, retros, planning •  Heavy dose of UX / User Centric •  Government Digital Service
  • 32. Xenonique @peter_pilgrim 32   #4 Scala Adoption Highly competent & talented teams Motivation is key Developers drives the decision to learn Scala; already self-organising
  • 33. Xenonique @peter_pilgrim 33   #4 Scala Adoption Somewhat confident and enthusiastic development talented teams Delivery is key Large responsibility for the end product; mixed Java and Scala
  • 34. Xenonique @peter_pilgrim 34   #4 Scala Adoption Time sensitive teams Time change is key “We like everything you say about Scala, however we can’t do this now.” Wait for the early adopters to finish.
  • 35. Xenonique @peter_pilgrim 35   #4 Scala Adoption Lesser acquainted teams Consequences, uncertainty and fear are keys Overly concerned with risk : politics, society, technology and the unknown-unknowns. “How does X [Scala] help the business going forward?”
  • 37. Xenonique @peter_pilgrim 37   Functional Programming is here
  • 38. Xenonique @peter_pilgrim 38   Whether Scala or Java or something entirely alternative
  • 39. Xenonique @peter_pilgrim 39   All that matters is your attitude to programming in general
  • 40. Xenonique @peter_pilgrim 40   Let’s look at Java SE 8
  • 42. Xenonique @peter_pilgrim 42   #5 Java SE 8 Very respectful to computer science Lambdas ó Alonzo Church λ - Calculus (1930) Lambda expressions
  • 43. Xenonique @peter_pilgrim 43   #5 Java SE 8 Function Interfaces Lambda expressions Streams Default interface methods Predicates, Filters, Suppliers, Combiners, Collectors, Reducers, Utilities
  • 44. Xenonique @peter_pilgrim 44   #5 Java SE 8 The Great Closures Debate 2007 > anonymous inner classes Parallel Streams; Fork Join; CompletableFuture
  • 45. Xenonique @peter_pilgrim 45   #5 Java SE 8 The majority of application programming state of the art (before modularity comes along). Filter. Map. Reduce. 2015 Processing data over Java Collections and Streams
  • 46. Xenonique @peter_pilgrim Lambdas Java SE 8 Function<Double,Double> double= x -> x + x Function<Double,Double> square = x -> x * x Predicate<String> qconFilter = (x: String) -> x.contains("qcon”) 46  
  • 47. Xenonique @peter_pilgrim Lambdas Java SE 8 // However there is no equivalent to Scala Function<Double,Double, Double> f1 = (x + 2) * (y -3 ) // Instead you still define Java interface interface Multiple<T,U,R> { R apply(T t, U u ); } Multiple<Double,Double,Double> f1 = (x + 2) * (y - 3 ) 47  
  • 48. Xenonique @peter_pilgrim Lambdas Java SE 8 Arrays.asList( "Adventure","Romance","QCON London","science") .stream() .map( s -> s.toLowerCase()) .filter(qconFilter) .forEach( e -> System.out.println(e) ) List<String> list = Arrays.asList( "Adventure","Romance","QCON London","science") list.stream() .map(String::toLowerCase) .filter(qconFilter) .forEach( System::out::println ) 48  
  • 49. Xenonique @peter_pilgrim Design pattern #1 Replace Factory Interface with Lambda class TradeFileRetriever { Function<Void,JSch> factory = () -> new JSch(); void setFactory( Function<Void,JschSession> factory) return this.factory = factory; } // jsch = this.factory.apply(); } 49  
  • 50. Xenonique @peter_pilgrim Lambda Factory #2– Mock Out Hard Hat Frameworks import com.jcraft.jsch.* JSch mockJsch = mock(Jsch.class) Session mockSession = mockSession(Session.class) TradeFileRetriever retriever = new TradeFileRetriever(); retriever.setFactory( () -> mockJsch ) when(mockJsch.getSession()).thenReturn( mockSession ) 50  
  • 51. Xenonique @peter_pilgrim Lambda Flatmap – I just want to process only trade Details class TradeRecord { List<String,TradeDetail> tradeDetailMap = new TreeMap<>(); // ... } List<TradeRecord> tradeRecords = retrieveSome(); tradeRecords.stream() .flatMap( t -> t.getTradeDetails().entrySet().stream()) .filter( s -> s.getKey().startsWith("ASIA") ) .forEach( s -> System.out.printf("%s -> %s", s.getKey(), s.getValue() )); 51  
  • 52. Xenonique @peter_pilgrim Lambda Flatmap – Emergency Request Positions with Hsbc IntSummaryStatistics hsbcFundSummary = tradeRecords.stream() .flatMap( t -> t.getTradeDetails().entrySet().stream()) .filter( s -> s.getValue().getCurrency().equals("GBP")) .filter( s.getValue().getCounterparty().equals("HSBC")) .collect( Collectors.summarizingInt( s -> s.getValue().getQuantity())); 52  
  • 54. Xenonique @peter_pilgrim 54   #6 Functional Patterns for Object Oriented People
  • 55. Xenonique @peter_pilgrim Prefer First-Class Functions over Functors // Java Classic class Comparator<TradeDetail,TradeDetail> { public int compare(TradeDetail p1, TradeDetail p2) { return p1.getCurrency().compareTo( p2.getCurrency()); } 55  
  • 56. Xenonique @peter_pilgrim Prefer First-Class Functions over Functors // Scala val currencyComparator = (p1:TradeDetail,p2:TradeDetail) => p1.currency.compareTo(p2.currency) trades.sortWith( currencyComparator ) 56  
  • 57. Xenonique @peter_pilgrim Prefer Internal Iterators over External Interators static int summation( List<Products> products) { int sum = 0; for (Product e: products) { sum += e.getPrice(); } return sum; } // Java 57  
  • 58. Xenonique @peter_pilgrim Prefer Internal Iterator over External Means // Scala: internal iteration products.map( x => x.price ).sum products.foldLeft(0) ( _.price + _.price ) // Soft (closure) white! var sum = 0 products.foreach { e => sum = sum + e.price } 58  
  • 59. Xenonique @peter_pilgrim Prefer Functions over the Command Pattern // Java interface Command { void execute(Item item) } class Ingest implements Command { ... } class Compress implements Command { ... } class Enrich implements Command { ... } 59  
  • 60. Xenonique @peter_pilgrim Prefer Functions over the Command Pattern // Scala val ingest = (item: Item) => { ... } val compress = (item: Item) => { ... } val enrich = (item: Item) => { ... } val items: List[Item] = ... items.map { x => ingest(x); compress(x); enrich(x); x } 60  
  • 61. Xenonique @peter_pilgrim Prefer Functions over the Command Pattern // Scala : NB the order of composition! val evenBetter = enrich compose compress compose ingest val items: List[Item] = ... items.map { x => evenBetter(x); x } 61  
  • 62. Xenonique @peter_pilgrim Wherever you Can: Filter, Map and Reduce val items: List[Item] = ... val discountShoppingCartPrice = items .filter( item => item.price >= 25.0) .map( item => item.nominal ) .reduce( (total, price ) => total + price * 0.90 ) 62  
  • 63. Xenonique @peter_pilgrim Function Builders def discounter(percent: Double): (Double) => Double = { require( percent >= 0.0 && percent <= 100.0 ) (price: Double) => price - ( price * percent / 100.0) } 63  
  • 64. Xenonique @peter_pilgrim Function Builders val tenPercenter = discounter(10) val twentyPercenter = discounter(20) val finalCartPrice = if (customer.loyaltyPoints >= 3000 ) gardenItemPrices map tenPercenter sum + foodItemsPrices map twentyPercenter sum else ( gardenItemPrices ::: foodItemPrices ) sum 64  
  • 65. Xenonique @peter_pilgrim replace conditional logic with Partially Applied Functions abstract class Item { val nominal: Double } case class GardenItem(val nominal:Double ) extends Item case class EnergyItem(val nominal:Double ) extends Item val gardenTaxCode: PartialFunction[Any, Int] = { case i: GardenItem => i.nominal * 0.025 } val energyTaxCode: PartialFunction[Any, Int] = { case i: EnergyItem => i.nominal * 0.015 } 65  
  • 66. Xenonique @peter_pilgrim replace conditional logic with Partially Applied Functions gardenTaxCode.isDefinedAt( GardenItem(100)) gardenTaxCode.isDefinedAt( "What is this?")) val items = List( GardenItem(12.34), EnergyItem(73.99)) val gardenTax = items collect gardenTaxCode 66  
  • 67. Xenonique @peter_pilgrim Lean on to Tail Recursive Functions def summation(xs: List[Int]): Int = { xs match { case x :: tail => x + summation(tail) case Nil => 0 } } 67  
  • 68. Xenonique @peter_pilgrim Lean on to Tail Recursive Functions def summation(xs: List[Int]): Int = { @tailrec def sum0(xs: List[Int], acc: Int): Int = { xs match { case x :: tail => sum0(tail, acc + x) case Nil => acc } } sum0(xs, 0) } 68  
  • 70. Xenonique @peter_pilgrim 70   Let’s Come Up For Air!
  • 72. Xenonique @peter_pilgrim 72   #7 Adventures? Please extend your inspiration to Recursive functions (Tail Rec) Focused mutability Futures and Promises Control Flow Domain Specific Languages
  • 74. Xenonique @peter_pilgrim 74   #Conclusion(1) Scala in the Enterprise: *Done* How far do you want to go (FP)? Java SE 8 changes everything Everyone is learning.
  • 75. Xenonique @peter_pilgrim 75   #Conclusion(2) Avoid over reliance on type inference Break code down Less is more; Einstein’s Simple Spectrum of abilities, talent Avoid silos if possible
  • 76. Xenonique @peter_pilgrim 76   #Conclusion(3) Java has lots of frameworks, utilities Scala has some great tools: ScalaTest, IDE support Developers work harder Conciseness, readability, maintainability
  • 78. Xenonique @peter_pilgrim 78   #Conclusion(4) The Future of Scala Macros, Modularisation Compiler performance, Push to FP Integration with Java Lambdas Who knows really when or next? “Always a Left Field contender, there will be” Yodaspeak
  • 79. Xenonique @peter_pilgrim 79   #It Yours! Get yourselves FuNkEd Up with the JVM
  • 81. Xenonique @peter_pilgrim 81   @peter_pilgrim   uk.linkedin.com/in/peterpilgrim2000/  
  • 82. Xenonique @peter_pilgrim List of Creative Commons (2.0) photography attributions https://flic.kr/p/dhf3FQ https://www.flickr.com/photos/epsos/ epSos.de Big Beautiful Face Statue in Tenerife https://flic.kr/p/Pp93n https://www.flickr.com/photos/spacesuitcatalyst/ William A. Clark Follow Measurement Measure twice, cut once. 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/81dXuT https://www.flickr.com/photos/froboy/ Avi Schwab Follow Equipment used for measuring planes of crystals 82  
  • 83. Xenonique @peter_pilgrim 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/8XY4tr https://www.flickr.com/photos/creative_stock/ Creativity 103 electronic circuit board https://flic.kr/p/8Y2625 https://www.flickr.com/photos/creative_stock/ Creativity 103 computer motherboard tracks https://flic.kr/p/2QHt7Q https://www.flickr.com/photos/rosefirerising/ rosefirerising Follow Pierre Curie, Piezo-Electroscope 83  
  • 84. Xenonique @peter_pilgrim 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 84  
  • 85. Xenonique @peter_pilgrim 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/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. 85  
  • 86. Xenonique @peter_pilgrim List of Creative Commons (2.0) photography attributions https://flic.kr/p/ae4ey4 https://www.flickr.com/photos/_marionkl/ Marion Klein Untitled - London underground picture https://flic.kr/p/7aJSXC https://www.flickr.com/photos/ktylerconk/ Kathleen Conklin Cambden Town Attitude https://flic.kr/p/ozgHBw https://www.flickr.com/photos/stevebraund/ Steve Braund Carnaby Street https://flic.kr/p/6npTQH https://www.flickr.com/photos/christianpayne/ Christian Payne Stephen Fry at Bletchley Park; infront of the statue of Alan Turing https://flic.kr/p/pMijy2 https://www.flickr.com/photos/frenkieb/ Francis Bijl London: Tower Bridge 86  
  • 87. Xenonique @peter_pilgrim 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) 87  
  • 88. Xenonique @peter_pilgrim 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/9F7Nnn https://www.flickr.com/photos/followtheseinstructions/ Follow these instructions The end ; Assignment: This time your assignment is to find or compose a scene that conveys the essence of the end. 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 88