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

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 

Recently uploaded (20)

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 

Featured

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 HubspotMarius Sescu
 
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 ChatGPTExpeed Software
 
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 EngineeringsPixeldarts
 
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 HealthThinkNow
 
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.pdfmarketingartwork
 
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 2024Neil Kimberley
 
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)contently
 
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 2024Albert Qian
 
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 InsightsKurio // The Social Media Age(ncy)
 
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 2024Search Engine Journal
 
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 summarySpeakerHub
 
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 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 Tessa Mero
 
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 IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
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 managementMindGenius
 
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...RachelPearson36
 

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