SlideShare a Scribd company logo
1 of 109
Download to read offline
µServices
By Peter Kriens
OSGi Technical Director & Evangelist
1dinsdag 9 november 2010
In the beginnings there
were bits ...
2dinsdag 9 november 2010
0100111100110010000000001111000
0001000010001110010100000010011
1000100011011111100010001110111
1101101001000010011101000000111
1110000010100000110111000010000
0110110100000001100100010001110
10000001110110
Bits
3dinsdag 9 november 2010
0100111100110010000000001111000
0001000010001110010100000010011
1000100011011111100010001110111
1101101001000010011101000000111
1110000010100000110111000010000
0110110100000001100100010001110
10000001110110
Bits
3dinsdag 9 november 2010
117
062
000
360
041
034
240
116
043
176
043
276
322
023
240
176
012
015
302
015
240
062
043
240
166
Octal
4dinsdag 9 november 2010
4F
32 00 F0
21 1C A0
4E
23
7E
23
BE
D2 13 A0
7E
0A
0D
C2 0D A0
32 23 A0
76
Hex
5dinsdag 9 november 2010
Code MOV C,A
STA F000H
LXI H,A01CH
MOV C,M
INX H
MOV A,M
INX H
CMP M
JNC A013H
MOV A,M
DCR C
JNZ A00DH
STA A023H
HLT
6dinsdag 9 november 2010
Code MOV C,A
STA F000H
LXI H,A01CH
MOV C,M
INX H
MOV A,M
INX H
CMP M
JNC A013H
MOV A,M
DCR C
JNZ A00DH
STA A023H
HLT
6dinsdag 9 november 2010
Code
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
7dinsdag 9 november 2010
Code
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
7dinsdag 9 november 2010
int global;
int shared;
int local;
Code
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
7dinsdag 9 november 2010
int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
8dinsdag 9 november 2010
int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
8dinsdag 9 november 2010
int global;
int shared;
int local;
Functions
void foo() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
9dinsdag 9 november 2010
int global;
int shared;
Functions
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local;
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
10dinsdag 9 november 2010
A
int global;
int shared;
Modules
B
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
11dinsdag 9 november 2010
A
int global;
int shared;
Modules
B
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
11dinsdag 9 november 2010
A
int global;
Modules
B
int shared;
int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
12dinsdag 9 november 2010
Class A
Objects
Class B
int shared;
int shared;
1
n
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
13dinsdag 9 november 2010
Class A
Objects
Class B
int shared;
int shared;
1
n
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void foo() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local++)
shared *= 10;
}
13dinsdag 9 november 2010
com.acme.abc
Packages
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class C int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
14dinsdag 9 november 2010
com.acme.abc
Packages
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
Class C int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local+
+)
shared *= 10;
}
14dinsdag 9 november 2010
“Chapter 7 describes the structure of a
program which is organized into packages
similar to the modules of Modula.”
Java Language Specification, 3rd edition
15dinsdag 9 november 2010
abc-1.2.3-SNAPSHOT.jar
JARs
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
def-4.5.6.jar
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
16dinsdag 9 november 2010
abc-1.2.3-SNAPSHOT.jar
JARs
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
def-4.5.6.jar
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
16dinsdag 9 november 2010
com.acme.abc-1.2.3
Bundles
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def-9.9.1
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
17dinsdag 9 november 2010
com.acme.abc-1.2.3
Bundles
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def-9.9.1
com.acme.abc
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.def
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
com.acme.ghi
Class A int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void bar() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Class B int shared;
void foo() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
void xyz() {
int local
global = shared;
for (local=0;
local<10; local
++)
shared *= 10;
}
Private Exported
Private Exported
17dinsdag 9 november 2010
The Face of Modularity
18dinsdag 9 november 2010
The Face of Modularity
18dinsdag 9 november 2010
Archetype of Modularity
EXPORT
IMPORT
PRIVATE
EXPORT
IMPORT
PRIVATE
19dinsdag 9 november 2010
A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
20dinsdag 9 november 2010
A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
Pub
20dinsdag 9 november 2010
A B
C D
• modules have a private
space and share a
public space
• modules limit their
visibility and exposure
• From geometric to
linear complexity
Modularity’s Secret
Pub
20dinsdag 9 november 2010
A B
C D
• Modules require other
modules
• Dependencies are
transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
A B
C D
• Modules require other
modules
• Dependencies are
transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
Evolution
• Modularization is about minimizing the changes
need to support the evolution of itself and its
dependencies.
• Module change should only be required for:
• New functionality
• An embedded assumption is violated
• Ergo: assumptions about other modules should be
minimized
22dinsdag 9 november 2010
What Happens When
You’re Inflexible?
23dinsdag 9 november 2010
Things break ...
24dinsdag 9 november 2010
Inflexibility!
25dinsdag 9 november 2010
Module friction is:
Depending on hard to
maintain assumptions
about other modules
26dinsdag 9 november 2010
Module Friction
A
B
27dinsdag 9 november 2010
Module Friction
A
B
27dinsdag 9 november 2010
Why Break A?
A
B
CA
B
28dinsdag 9 november 2010
Why Break A?
A
B
CA
B
28dinsdag 9 november 2010
Module Friction
A
B
29dinsdag 9 november 2010
Because we can … ?
30dinsdag 9 november 2010
POJO Programming is
Best Practice
31dinsdag 9 november 2010
Interfaces/API
Con-
sumer
ProviderInterface
32dinsdag 9 november 2010
Access to Impls.
Con-
sumer
ProviderInterface
33dinsdag 9 november 2010
Access to Impls.
Con-
sumer
ProviderInterface
X
33dinsdag 9 november 2010
Factory Pattern
Con-
sumer
ProviderInterface
Factory
Class
uses
Active Passive
impls
34dinsdag 9 november 2010
Factory Pattern
Con-
sumer
ProviderInterface
Factory
Class
uses
Active Passive
impls
?
34dinsdag 9 november 2010
Listener Pattern
Con-
sumer
ProviderInterface
Provider
Admin
Interface
Passive Active
impls uses
impls
35dinsdag 9 november 2010
Dependency Injection
Con-
sumer
ProviderInterface
Depen-
dency
Injection
Passive Passive
36dinsdag 9 november 2010
Patterns
Passive Active
Passive
Dependency
Injection
Listener
Active Factory
?
Consumer
Provider
37dinsdag 9 november 2010
?
Con-
sumer
ProviderInterface
?
Active Active
38dinsdag 9 november 2010
Patterns
Passive Active
Passive
Dependency
Injection
Listener
Active Factory ?
Consumer
Provider
39dinsdag 9 november 2010
Patterns
Passive Active
Passive
Active
Consumer
Provider
40dinsdag 9 november 2010
µServices
Con-
sumer
ProviderInterface
OSGi
µServices
Active Active
41dinsdag 9 november 2010
Module Friction?
42dinsdag 9 november 2010
Module Friction?
Speak
42dinsdag 9 november 2010
Module Friction?
Talker Mac
Speak
Speak
42dinsdag 9 november 2010
Module Friction
Talker Speak
Mac
Speak
43dinsdag 9 november 2010
Services
Talker
Mac
Speak
Speak
44dinsdag 9 november 2010
Basic
Talker
Mac
Speak
45dinsdag 9 november 2010
aQute.service.speak
Basic
Talker
Mac
Speak
public interface Speak {
void say(String s);
}
45dinsdag 9 november 2010
aQute.service.speak
Basic
Talker
Mac
Speak
public interface Speak {
void say(String s);
}
1. Register a SpeakImpl
instance
45dinsdag 9 november 2010
aQute.service.speak
Basic
Talker
Mac
Speak
public interface Speak {
void say(String s);
}
1. Register a SpeakImpl
instance
2. notify
45dinsdag 9 november 2010
aQute.service.speak
Basic
Talker
Mac
Speak
public interface Speak {
void say(String s);
}
1. Register a SpeakImpl
instance
3. Get a Speak
instance
2. notify
45dinsdag 9 november 2010
aQute.service.speak
Basic
Talker
Mac
Speak
public interface Speak {
void say(String s);
}
1. Register a SpeakImpl
instance
3. Get a Speak
instance
4. instance.say(“Hello”)
2. notify
45dinsdag 9 november 2010
All Good
• The provider creates the instance
• Life cycle control in the hands of the
implementer
• No Statics
• Full context defined by implementer
• Type Safe
• Discovery by User
46dinsdag 9 november 2010
Services
User
Imple-
menter
S
47dinsdag 9 november 2010
Services
User
Imple-
menter
S
register
47dinsdag 9 november 2010
Services
User
Imple-
menter
S
get register
47dinsdag 9 november 2010
Services
User
Imple-
menter
S
get register
Service
Listener
service
listener
47dinsdag 9 november 2010
Services
User
Imple-
menter
S
get register
Service
Hooker
Service
Listener
service
hooks
service
listener
47dinsdag 9 november 2010
Cardinality
User
Imple-
menter
S
Service
Hooker
Service
Listener
n m m n nn
n
m
m
n
48dinsdag 9 november 2010
Factory Pattern
Con-
sumer
Provider
Active Passive
49dinsdag 9 november 2010
Listener Pattern
Con-
sumer
Provider
Passive Active
50dinsdag 9 november 2010
Dependency Pattern
Depends
On
B
A
C
51dinsdag 9 november 2010
Discovery Pattern
Discovers B
A
C
52dinsdag 9 november 2010
Variations
Talker Mac
Speak
Speak
Shell
Console
Shell
Command
Servlet
Web
Console
Jetty
Http
Server
53dinsdag 9 november 2010
The new Shell
Command
Processor
Aggregate
Converter
Thread IO
Aggregate
Formatter
Formatter
Converter
…
Handler
…
Commands
ThreadIO
osgi.command.scope=…
osgi.command.function=...
Command
Processor
Aggregate
Converter
Aggregate
Formatter
Formatter
Converter
54dinsdag 9 november 2010
Distributed OSGi
Distribution
Provider
Distribution
Provider
X’
Bundle
B
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
imports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
imports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
imports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
imports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
Bundle
A
X
Distribution
Provider
Distribution
Provider
X’
Bundle
B
exports
service
imports
service
Framework 1 Framework 2
55dinsdag 9 november 2010
56dinsdag 9 november 2010
57dinsdag 9 november 2010
Conclusion
• µServices are a primitive for:
• dependency handling
• dynamics
• discovery
• hiding the implementations
• µServices provide a primitive solution to common
software problems
• µServices require virtually no code to handle
58dinsdag 9 november 2010
Conclusion
A B C
D ? E
F G H
59dinsdag 9 november 2010
Conclusion
A B C
D ? E
F G H
59dinsdag 9 november 2010
Conclusion
B C
D ? E
F G H
A
60dinsdag 9 november 2010
Conclusion
B C
D ? E
F G H
A
60dinsdag 9 november 2010
Conclusion
B C
D ? E
F G H
A
60dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
D
61dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
Yes!D
61dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
Yes!D
X
61dinsdag 9 november 2010
Q&A
Masterclass on OSGi
www.aqute.biz/MasterClass
USA Bay Area
18-21 January 2011
OSGi DevCon
www.osgi.org/DevCon2011
Santa Clara, CA
21-24 March 2011
62dinsdag 9 november 2010

More Related Content

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Recently uploaded (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

Featured

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

µServices