SlideShare a Scribd company logo
1 of 72
Download to read offline
Ole Michaelis & Sönke Ruempler | Jimdo
Make it SOLID
Software Architecture for System
Administrators
OSDC 2014
Ole Michaelis
“Open Source Rockstar”
@CodeStars
github.com/nesQuick
codestars.eu
OSDC 2014
Sönke
Ruempler
“Chief Trolling Officer”
@s0enke
github.com/s0enke
ruempler.eu
OSDC 2014
Jimdo
OSDC 2014
because infrastructure development is
neither a Jenga game!
S.O.L.I.D
OSDC 2014
a little poll!
http://images.fineartamerica.com/images-medium-large/live-long-mr-spock-tobias-woelki.jpg
OSDC 2014
OSDC 2014
S O L I D
OSDC 2014
A
dev/ops
story
Ole
as
Junior Admin
Sönke
as
Dr. Software
OSDC 2014
the basics
OSDC 2014
configuration management
Idempotent
Declarative
Convergent
Abstract
OSDC 2014
software architecture
VS.
36 years
>2000 years
OSDC 2014
OSDC 2014
node web-1 {
$role = 'web-app-a'
$has_apache = true;
include php5
}
node web-2 {
$role = 'web-app-b'
$has_fcgi=true
include php5
}
# has both enabled, but needs a special config
node web-3 {
$role = 'web-app-c'
$has_fcgi=true
$has_apache=true
include php5
}
Web
App 1
Web
App 2
Web
App 3
OSDC 2014
class php5 {
if ($::has_fcgi)
package { 'php5-cli' : ensure => installed }
}
if ($::has_apache) {
package { 'php5-apache' : ensure => installed }
}
if ($::role == 'web-app-c')
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source => 'puppet:///modules/php5/php.ini-web-app-c'
}
}
}
Global variable!
Out of Context!
No abstraction
OSDC 2014
class php5(
$has_fcgi = false,
$has_apache = false,
$role = undef
) {
if ($has_fcgi)
package { 'php5-cli' : ensure => installed }
}
if ($has_apache) {
package { 'php5-apache' : ensure => installed }
}
if ($role == 'web-app-c') {
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source => 'puppet:///modules/php5/php.ini-web-app-c',
require => Package[php-fcgi]
}
}
OSDC 2014
node 'web-1' {
$role = 'web-app-a'
$has_apache = true
class { 'php5' :
has_apache => true,
role => 'web-app-a'
}
}
node 'web-2' {
$role = 'web-app-b'
$has_fcgi = true
class { 'php5' :
has_fcgi => true,
role => 'web-app-b'
}
}
Injection!
Injection!
OSDC 2014
Would you solder a
lamp directly to the
electrical wiring in a
wall?
Dependency
Inversion
OSDC 2014
OSDC 2014
class php5(
$has_fcgi = false,
$has_apache = false,
$role = undef
) {
if ($has_fcgi)
package { 'php5-cli' : ensure => installed }
}
if ($has_apache) {
package { 'php5-apache' : ensure => installed }
}
if ($role == 'web-app-c') {
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source => 'puppet:///modules/php5/php.ini-web-app-c'
require => Package[php-fcgi]
}
}
}
OSDC 2014
Stuff tends to
get big
Beware of god classes!
OSDC 2014
if ($lighttpd) {
package { 'php5-cgi': }
configdir { '/etc/php5/cgi': require => Package['php5-cgi'] }
configdir { '/etc/php5/cgi/conf.d': require => Package['php5-cgi'] }
if ($testserver) {
configfile { '/etc/php5/cgi/php.ini': sourcename => 'php5/cgi/php.ini-testserver',
require => Package['php5-cgi'] }
} else {
if ($cms ) {
configfile { '/etc/php5/cgi/php.ini': sourcename => 'php5/cgi/php.ini-cms',
require => Package['php5-cgi'] }
} else {
if ($mgmt ) {
configfile { '/etc/php5/cgi/php.ini': sourcename => 'php5/cgi/php.ini-mgmt',
require => Package['php5-cgi'] }
} else {
if ($lc ) {
configfile { '/etc/php5/cgi/php.ini': sourcename => 'php5/cgi/php.ini-lc.
jimdo.com', require => Package['php5-cgi'] }
} else {
configfile { '/etc/php5/cgi/php.ini': sourcename => 'php5/cgi/php.ini',
require => Package['php5-cgi'] }
}
}
}
}
configfile { '/etc/php5/cgi/conf.d/pdo.ini': sourcename => 'php5/cgi/conf.d/pdo.ini',
require => Package['php5-cgi'] }
}
OSDC 2014
OSDC 2014
?
OSDC 2014
OSDC 2014
rspec-puppet
test-kitchen
OSDC 2014
OSDC 2014
describe :node => 'web-1' do
it { should contain_package ('php5-fcgi') }
end
describe :node => 'web-2' do
it { should contain_package ('php5-apache2' ) }
end
describe :node => 'web-3' do
it { should contain_package ('php5-fcgi') }
it { should contain_package ('php5-apache2' ) }
end
Test php5 class:
Install Package
?
OSDC 2014
describe :class => 'php5::fcgi' do
it { should contain_package('php5-cli') }
end
describe :class => 'php5::apache' do
it { should contain_package('php5-apache2') }
end
class php5::fgci {
package { 'php5-cgi' : ensure => installed }
}
class php5::apache {
package { 'php5-apache' : ensure => installed }
}
OSDC 2014
Just because you can,
doesn’t mean you
should!
Single
Responsibility
OSDC 2014
describe :node => 'web-1' do
it { should include_class('php5::fcgi') }
it { should contain_package('php5-fcgi') }
end
describe :node => 'web-2' do
it { should include_class('php5::apache') }
it { should contain_package('php5-apache2') }
end
node web-1 {
include php5::apache
}
node web-2 {
include php5::fcgi
}
Tests
Code
OSDC 2014
OSDC 2014
“programs […] are changed by adding
new code, rather than by changing
existing code”
Open Close
Principle
OSDC 2014
OSDC 2014
new
requirements...
now web app 1 needs a second
node
node web-1 {
$role = 'web-app-a'
include php5::apache
}
node web-1a {
$role = 'web-app-a'
include php5::apache
}
OSDC 2014
OSDC 2014
OSDC 2014
class role::web-app-a {
include php5::apache
}
node web-1 {
include role::web-app-
a
}
node web-1a {
include role::web-app-
a
}
Our new role!
And nodes just
include it!
OSDC 2014
>
OSDC 2014
OSDC 2014
?
class php5::fcgi($role = undef) {
if ($role == 'web-app-c') {
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source =>
'puppet:///modules/php5/php.ini-web-app-c',
require => Package[php-fcgi]
}
}
}
OSDC 2014
Don’t call us,
we call you!
Hollywood
Principle
OSDC 2014
class role::web-app-c::special-php-stuff {
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source => 'puppet:///modules/php5/php.ini-web-app-c'
}
}
1. Split out the special case into its own class.
OSDC 2014
class php5::fcgi($include_after_package_install = undef) {
package { 'php5-fcgi' : ensure => installed }
if ($include_after_package_install)
include $include_after_package_install
Package['php5-fcgi'] -> Class[$include_after_package_install]
}
}
2. Make the special case pluggable and
reusable.
2a. And name it abstract.
OSDC 2014
class role::web-app-c {
include php5::apache
class { 'php5::fcgi' :
include_after_package_install => 'profile::web-app-c::special-php-stuff'
}
}
3. Pass the special case as dependency in our
web-app-c.
OSDC 2014
OSDC 2014
class profile::web-app-c::special-php-stuff {
package { 'php5-web-app-c-special-module' }
file { '/etc/php5/php.ini' :
source => 'puppet:///modules/php5/php.ini-web-app-c'
}
}
?
OSDC 2014
define php5::specialconfig(
$ensure = present,
$sapi,
$module,
$key,
$value,
$section = undef,
$path = '/etc/php5/%s/conf.d/%s.ini'
) {
ini_setting { $title:
ensure => $ensure,
path => sprintf($path, $sapi, $module),
section => $section,
setting => $key,
value => $value,
require => Package["php5-${sapi}"]
}
}
OSDC 2014
OSDC 2014
?
OSDC 2014
“puppet separate code and data”
I’m feeling lucky
OSDC 2014
# /etc/puppet/hieradata/web1.yaml
---
classes:
- profile::web-app-a
# /etc/puppet/hieradata/web1a.yaml
---
classes:
- profile::web-app-a
# /etc/puppet/hieradata/web2.yaml
---
classes:
- profile::web-app-c
# /etc/puppet/hieradata/web3.yaml
---
classes:
- profile::web-app-c
puppet-hiera
example in YAML
OSDC 2014
node default {
hiera_include('classes')
}
node web-1 {
include role::web-app-a
}
node web-1a {
include role::web-app-a
}
node web-2 {
include role::web-app-b
}
node web-3 {
include role::web-app-c
}
OSDC 2014
hiera
AWS/Cloudformation LDAP
DNS
your selfwritten
stuff
OSDC 2014
OSDC 2014
OSDC 2014
OSDC 2014
What about
I and L
in SOLID?
OSDC 2014
You want me to plug
this in, where?
Interface
Segregation
OSDC 2014
If it looks like a duck,
quacks like a duck, but
need batteries - you
probably have the
wrong abstraction!
Liskov
Substitution
OSDC 2014
S O L I D
OSDC 2014
OSDC 2014
Structure your code!Node
ProfileProfilesRole ProfileModules
Resources
OSDC 2014
Puppet forge
puppet module registry
OSDC 2014
Librarian Puppet
r10k
Berkshelf (chef)
OSDC 2014
stdmod
https://github.com/stdmod
OSDC 2014
sandboxed
development
https://github.com/mlafeldt/skeleton-cookbook
https://github.com/Jimdo/puppet-skeleton
OSDC 2014
server spec
http://serverspec.org/
beaker
(puppet)
https://github.com/puppetlabs/beaker
OSDC 2014
Thank you!
OSDC 2014
@CodeStars
ole@jimdo.com
@s0enke
soenke@jimdo.com
Questions?
OSDC 2014
*I ’m just a blank slide*
OSDC 2014
Sources
• http://www.slideshare.net/PuppetLabs/garethrushgrove-puppetconf
• http://www.slideshare.net/PuppetLabs/alessandro-franceschi-new
• https://github.com/jedi4ever/stop-the-fork
• http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-
pictures/
• https://speakerdeck.com/jfryman/refactoring-puppet
• http://www.clker.com/cliparts/e/2/a/d/1206574733930851359Ryan_Taylor_Green_Tick.svg.med.
png
• http://www.craigdunn.org/2012/05/239/
• http://cdn.slashgear.com/wp-content/uploads/2012/10/google-datacenter-tech-13.jpg
• http://deviq.com/Media/Default/Article/Dont-Call-Us-Well-Call-You-Jun-2013.png
• http://www.timeshighereducation.co.uk/Pictures/web/g/q/g/copy_paste_keyboard_button_450.jpg
• http://sanremo.com.au/wp-content/uploads/2013/05/lasagna.jpg
• http://4.bp.blogspot.
com/_9kQQgQD35rY/SaV5p8YBGhI/AAAAAAAAAkg/HOvlhIo7yGI/s400/06_Red_Green_Refactor.
JPG
• http://www.thelolshop.com/wp-content/uploads/2012/11/20121126-101937.jpg
•

More Related Content

What's hot

PHP traits, treat or threat?
PHP traits, treat or threat?PHP traits, treat or threat?
PHP traits, treat or threat?
Nick Belhomme
 

What's hot (20)

Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiterZend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiter
 
Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
 
Php 7 hhvm and co
Php 7 hhvm and coPhp 7 hhvm and co
Php 7 hhvm and co
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
DevOps in PHP environment
DevOps in PHP environment DevOps in PHP environment
DevOps in PHP environment
 
C++ for Java Developers (JavaZone Academy 2018)
C++ for Java Developers (JavaZone Academy 2018)C++ for Java Developers (JavaZone Academy 2018)
C++ for Java Developers (JavaZone Academy 2018)
 
PHP traits, treat or threat?
PHP traits, treat or threat?PHP traits, treat or threat?
PHP traits, treat or threat?
 
Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2
 
Your code are my tests
Your code are my testsYour code are my tests
Your code are my tests
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13
 
Short Introduction To "perl -d"
Short Introduction To "perl -d"Short Introduction To "perl -d"
Short Introduction To "perl -d"
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
Api Design
Api DesignApi Design
Api Design
 
Smoking docker
Smoking dockerSmoking docker
Smoking docker
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoエラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
 
Getting Testy With Perl6
Getting Testy With Perl6Getting Testy With Perl6
Getting Testy With Perl6
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
 
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
 
Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018
 

Similar to OSDC 2014: Ole Michaelis & Sönke Rümpler: Make it SOLID - Software Architecture for System Administrators

DDD on example of Symfony (Webcamp Odessa 2014)
DDD on example of Symfony (Webcamp Odessa 2014)DDD on example of Symfony (Webcamp Odessa 2014)
DDD on example of Symfony (Webcamp Odessa 2014)
Oleg Zinchenko
 

Similar to OSDC 2014: Ole Michaelis & Sönke Rümpler: Make it SOLID - Software Architecture for System Administrators (20)

A General Purpose Docker Image for PHP
A General Purpose Docker Image for PHPA General Purpose Docker Image for PHP
A General Purpose Docker Image for PHP
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Mojolicious lite
Mojolicious liteMojolicious lite
Mojolicious lite
 
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
DDD on example of Symfony (Webcamp Odessa 2014)
DDD on example of Symfony (Webcamp Odessa 2014)DDD on example of Symfony (Webcamp Odessa 2014)
DDD on example of Symfony (Webcamp Odessa 2014)
 
Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011
 
Getting up & running with zend framework
Getting up & running with zend frameworkGetting up & running with zend framework
Getting up & running with zend framework
 
Getting up and running with Zend Framework
Getting up and running with Zend FrameworkGetting up and running with Zend Framework
Getting up and running with Zend Framework
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Tools
 
Converting Your Dev Environment to a Docker Stack - Cascadia
Converting Your Dev Environment to a Docker Stack - CascadiaConverting Your Dev Environment to a Docker Stack - Cascadia
Converting Your Dev Environment to a Docker Stack - Cascadia
 
Ansible new paradigms for orchestration
Ansible new paradigms for orchestrationAnsible new paradigms for orchestration
Ansible new paradigms for orchestration
 
ngManila - Codename: Fireball - Hello World in Angular
ngManila - Codename: Fireball - Hello World in AngularngManila - Codename: Fireball - Hello World in Angular
ngManila - Codename: Fireball - Hello World in Angular
 
Converting Your Dev Environment to a Docker Stack - php[world]
Converting Your Dev Environment to a Docker Stack - php[world]Converting Your Dev Environment to a Docker Stack - php[world]
Converting Your Dev Environment to a Docker Stack - php[world]
 
An intro to the JAMStack and Eleventy
An intro to the JAMStack and EleventyAn intro to the JAMStack and Eleventy
An intro to the JAMStack and Eleventy
 
How To Start Up With PHP In IBM i
How To Start Up With PHP In IBM iHow To Start Up With PHP In IBM i
How To Start Up With PHP In IBM i
 
How To Start Up With Php In Ibm I
How To Start Up With Php In Ibm IHow To Start Up With Php In Ibm I
How To Start Up With Php In Ibm I
 

Recently uploaded

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 

Recently uploaded (20)

%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 

OSDC 2014: Ole Michaelis & Sönke Rümpler: Make it SOLID - Software Architecture for System Administrators