SlideShare a Scribd company logo
From Zero to Application Delivery
#phillyete
Philadelphia
April 11, 2016
Susan Potter @ Lookout
twitter: @SusanPotter
github: mbbx6spp
% whoami
Figure: From backend dev to infra eng; bias FP advocate
Agenda
1 Problem space
control infrastructure, consistently through reliability
Agenda
1 Problem space
control infrastructure, consistently through reliability
2 Path to Reliability
how could we deploy more reliable configuration?
Agenda
1 Problem space
control infrastructure, consistently through reliability
2 Path to Reliability
how could we deploy more reliable configuration?
3 Nix* Solutions
common problems: dev envs, CI dependencies, deploys
Convergent Mayhem
1 Partial Definition
APT sources/YUM repos change OOB
Convergent Mayhem
1 Partial Definition
APT sources/YUM repos change OOB
2 Shared Mutable State
files modified in shared paths
Convergent Mayhem
1 Partial Definition
APT sources/YUM repos change OOB
2 Shared Mutable State
files modified in shared paths
3 Hopefully Converges
Resource expectation not always able to be met
Convergent Mayhem
1 Partial Definition
APT sources/YUM repos change OOB
2 Shared Mutable State
files modified in shared paths
3 Hopefully Converges
Resource expectation not always able to be met
4 Unreliable
Reliability
Reliability
“Those who want really reliable software will discover that they must find
means of avoiding the majority of bugs to start with, and as a result the
programming process will become cheaper.”
The Humble Programmer, 1972 (EWD340)
Why care about reliability now?
Why care about reliability now?
1 Economic factors
large distributed deployments
Why care about reliability now?
1 Economic factors
large distributed deployments
2 Human factors
high churn/turnover, low quality of ops life
Why care about reliability now?
1 Economic factors
large distributed deployments
2 Human factors
high churn/turnover, low quality of ops life
3 Technological factors
programmable infrastructure & FP no longer just for academics
More Services
1 Currently 20-30 services
2 More services ready each month
3 Expect 50+ by end of year
4 Various stacks/runtimes
More Environments
1 Ephemeral (integration testing)
2 Product lines (consumer vs enterprise)
3 Performance
4 Partners
More Persistence
Problem: Software Delivery
Environment provisioning not repeatable
in practice
Problem: Software Delivery
Continuous integration builds break with
app dependency changes
Problem: Software Delivery
Deploys have unexpected consequences
that --dry-run/--why-run cannot
catch
Requirements: Optimize for . . .
1 Scalability
solved by on-demand ”cloud”
Requirements: Optimize for . . .
1 Scalability
solved by on-demand ”cloud”
2 Reliability
solved by . . . ???
So what yields reliability?
So what yields reliability?
Ability to reason about code.
What allows you to reason about code?
What allows you to reason about code?
Referential transparency (RT)!
RT (Re)fresher
Functions have inputs (Scala)
object Functions {
// Two typed input arguments here
def add(x: Int , y: Int) = x + y
// One typed input argument here
def len(s: String) = s.size
}
Functions have inputs (Nix)
let
add = x: y: x + y;
len = s: builtins.stringLength s;
in {
inherit add len;
}
Functions have inputs
# Ruby
def add(x, y)
x + y
end
def len(s)
s.size
end
# JavaScript
function add(x, y) { return (x + y); }
function len(s) { return s.length; }
Packages have inputs (Nix)
# stdenv , fetchurl , gcc , help2man are
# (package) inputs to our hello package
{ stdenv , fetchurl , gcc , help2man }:
let
version = "2.1.1";
in stdenv.mkDerivation {
inherit version;
name = "hello -${version}";
src = fetchurl { ... };
# gcc and help2man are build deps
buildInputs = [ gcc help2man ];
}
Functions return a result
scala > add(5, 6)
res0: Int = 11
scala > len("Hello ,␣PhillyETE")
res1: Int = 16
Functions return a result (Nix)
$ nix -repl ’<nixpkgs >’
Loading <nixpkgs >...
Added 5876 variables .
nix -repl > hello = import ./ hello.nix { 
inherit stdenv fetchurl gcc help2man; 
}
nix -repl > hello
derivation /nix/store /...0am -hello -2.1.1. drv
Functions return a result (Nix)
nix -repl > "${hello}"
"/nix/store/jg1l1 ...lsj -hello -2.1.1"
nix -repl > :q
$ nix -build hello.nix 
--arg stdenv "(import␣<nixpkgs >␣{}). stdenv" 
--arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" 
--arg gcc "(import␣<nixpkgs >␣{}). gcc" 
--arg help2man "(import␣<nixpkgs >␣{}). help2man"
/nix/store/jg1l1 ...lsj -hello -2.1.1
Only depend on inputs (Nix)
# Remove help2man from package input arguments
$ cat hello.nix hello.nix.1
1c1
< { stdenv , fetchurl , gcc , help2man }:
---
> { stdenv , fetchurl , gcc }:
$ nix -build hello.nix.1 
--arg stdenv "(import␣<nixpkgs >␣{}). stdenv" 
--arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" 
--arg gcc "(import␣<nixpkgs >␣{}). gcc"
error: undefined variable help2man at hello.nix :11:23
Only depend on inputs
# Remove help2man from buildInputs
$ cat hello.nix hello.nix.2
11c11
< buildInputs = [ gcc help2man ];
---
> buildInputs = [ gcc ];
$ nix -build hello.nix.2 
--arg stdenv "(import␣<nixpkgs >␣{}). stdenv" 
--arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" 
--arg gcc "(import␣<nixpkgs >␣{}). gcc" 
--arg help2man "(import␣<nixpkgs >␣{}). help2man"
...
Only depend on inputs
these derivations will be built:
/nix/store /19 x32rhqx ...mn80 -hello -2.1.1. drv
building path(s) /nix/store/v38 ...2 m58h -hello -2.1.1
unpacking sources
unpacking source archive /nix/store /...-hello -2.1.1. tar.gz
source root is hello -2.1.1
...
/nix /...-bash -.../ bash: help2man:
command not found
Makefile :282: recipe for target ‘hello .1’ failed
make [2]: *** [hello .1] Error 127
...
error: build of /nix /...n80 -hello -2.1.1. drv failed
Return same result given same inputs
scala > len("Hello ,␣PhillyETE")
res0: Int = 16
scala > len("Hello ,␣PhillyETE")
res1: Int = 16
scala > len("Hello ,␣PhillyETE")
res2: Int = 16
...
scala > len("Hello ,␣PhillyETE")
res3333333333: Int = 16
Return same result given same inputs
$ while true; do
nix -build 
--arg stdenv "(import␣<nixpkgs >␣{}). stdenv" 
--arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" 
--arg gcc "(import␣<nixpkgs >␣{}). gcc" 
--arg help2man "(import␣<nixpkgs >␣{}). help2man" 
hello.nix
done
/nix/store/jg1l1kw ...sj -hello -2.1.1
/nix/store/jg1l1kw ...sj -hello -2.1.1
...
/nix/store/jg1l1kw ...sj -hello -2.1.1
^Cerror: interrupted by the user
The Big idea
Referential Transparency
Given same inputs, return same result. Always.
Questions so far?
Figure: Awake?
Mainstream Package Management
Based on shared + mutable state (filesystem)
Violates RT
Alternative Approaches
• shared + immutable
• private + mutable
• expensive coarse grained locks
• hybrid without the expense
What Nix does . . .
• Define all inputs
chroot, explicit inputs, full dependency definition
• Ensure RT
private + mutable build area, diff inputs ⇒ diff results, symlink results into profile
• Congruent vs Convergent
Nix Ecosystem
• Expression language: Nix
• Package management: Nix
• Channel: <nixpkgs>
• Operating System: NixOS
• Configuration ”modules”: NixOS modules
• Provisioning: NixOps
• Orchestration: Disnix
• CI: Hydra
Repeatable Dev Envs
$ nix -shell -p erlangR17_odbc
these paths will be fetched (37.65 MiB download , 112.65 MiB unpacked ):
/nix/store /0jvs ...3vd -unixODBC -2.3.2
/nix/store/wf7w ...6fp -erlang -17.5 - odbc
fetching path /nix/store /0jvs...- unixODBC -2.3.2...
...
[nix -shell :~]$ erl
Erlang/OTP 17 [erts -6.4] [source] [64-bit] ...
Eshell V6.4 (abort with ^G)
1>
Repeatable Dev Envs
$ nix -shell -p erlangR18_javac
these paths will be fetched (38.04 MiB download , 113.91 MiB unpacked ):
/nix/store /94a...b3xn -erlang -18.2
fetching path /nix/store /94a...b3xn -erlang -18.2...
...
[nix -shell :~]$ erl
Erlang/OTP 18 [erts -7.2] [source] [64-bit] ...
Eshell V7.2 (abort with ^G)
1>
Repeatable Dev Envs
$ declare pkghost="releases.nixos.org"
$ declare release_url="https ://${pkghost }/ nixos"
$ nix -channel --add 
"${release_url }/16.03 - beta/nixos -16.03.30.2068621 " 
nixpkgs
$ nix -shell
these derivations will be built:
/nix/store /267y...-elm -0.16.0. drv
these paths will be fetched (31.49 MiB download , 379.99 MiB unpacked ):
/nix/store /0d3y...-nodejs -4.3.1
...
building path(s) /nix/store/jjzr ...-elm -0.16.0
created 6 symlinks in user environment
Repeatable Dev Envs
$ cat shell.nix
{ pkgs ? import <nixpkgs > {}, ... }:
let
inherit (pkgs) stdenv;
in stdenv.mkDerivation {
name = "myscalaprj -devenv";
buildInputs = with pkgs; [
gitFull # Developer dependency
scala sbt # Scala/SBT
postgresql # RDBMS
elmPackages.elm # for front -end compiler
];
...
Repeatable Dev Envs
...
shellHook = ’’
export SERVICE_PORT =4444
export DATABASE_PORT =5432
export DATABASE_PATH=$PWD/data
export LOG_PATH=$PWD/log
if [ ! -d "${DATABASE_PATH }" ]; then
initdb "${DATABASE_PATH }"
fi
pg_ctl -D "${DATABASE_PATH }" 
-l "${LOG_PATH}" 
-o --path="${DATABASE_PORT }" start
’’;
}
Consistent CI Deps
$ head -3 z/ci/verify
#!/usr/bin/env nix -shell
#!nix -shell -I nixpkgs=URL
#!nix -shell -p scala sbt postgresql -i bash
Consistent CI Deps
...
set -eu
! test -d "${ DATABASE_PATH }" && 
initdb "${ DATABASE_PATH }"
elm -make elm/*
sbt clean scalastyle
pg_ctl -D "${ DATABASE_PATH }" 
-l "${LOG_PATH}" -o 
--port="${ DATABASE_PORT }" start
sbt test
pg_ctl -D "${ DATABASE_PATH }" stop
Consistent CI Deps
• Pin channel versions ⇒ source + CI consistency
• Update CI build deps with app code
• No OOB ‘converge’-ing CI build hosts!
Diff Dependencies
$ nix -store -qR /nix/store /*-myscalaprj -*
/nix/store /8 jhy2j7v0mpwybw13nd4fjlsfqc9xnlh -write -mirror -list.sh
/nix/store /17 h0mw5sipbvg70hdsn8i5mai4619l8c -move -docs.sh
...
/nix/store/ p6gn7inwvm61phqw3whhlbl20n8c5dgb -git -2.7.1. drv
/nix/store/ z2jvckzhy5322d9ir0xv2hbqp6yakayj -myscalaprj -devenv.drv
Predictable Deploys
• Diff dependency path tree
• Test node configuration in VM
• Test NixOS module logic
• Security auditing
Machine Config
{ config , pkgs , ... }:
let
inherit (pkgs) lib;
ntpF = (idx: "${idx}. amazon.pool.ntp.org")
domain = "example.com";
in {
boot.cleanTmpDir = true;
boot.kernel.sysctl = {
"net.ipv4. tcp_keepalive_time " = 1500;
# other sysctl key -values here ...
};
networking.hostName = " nixallthethings .${domain}";
networking.firewall.enable = true;
services.ntp.servers = map ntpF (lib.range 0 3);
services.zookeeper.enable = true;
security.pki. certificateFiles = [./ internal_ca.crt];
time.timeZone = "UTC";
}
Test Machine Config (VM)
$ env NIXOS_CONFIG=$PRJROOT/nix/config.nix 
nixos -rebuild build -vm
$ ./ result/bin/run -hostname -vm
...
$ env NIXOS_CONFIG=$PRJROOT/nix/config.nix 
--target -host myscalaprj -test -1. integ.bla 
nixos -rebuild build -vm
Module Integration Testing
$ grep -A8 elasticsearch.enable $PWD/nix/config.nix
elasticsearch.enable = true;
elasticsearch.jre =
mychannel. elasticsearch_2_2_0 ;
elasticsearch.jre =
mychannel.oraclejre8u74;
elasticsearch.node.name =
"elasticsearch -0.${domain}";
elasticsearch.dataDir =
[ "/data0" "/data1" "/data3" ];
Module Integration Testing
$ grep -A8 "node␣health" $PWD/nix/modules/elasticsearch.nix
subtest "elasticsearch ␣node␣health", sub {
$es0 ->waitForUnit("elasticsearch .service");
$es1 ->waitForUnit("elasticsearch .service");
$es0 ->succeed("${ waitForTcpPort ␣"es0"␣9300␣60}");
$es1 ->succeed("${ waitForTcpPort ␣"es1"␣9300␣60}");
$es0 ->succeed("${curl␣"es0"␣9200␣"/"}");
$es1 ->succeed("${curl␣"es1"␣9200␣"/"}");
}
Security Auditing
$ nix -store -qR /path/to/app/pkg | sort | uniq
/nix/store /002v...- libdc1394 -2.2.3
/nix/store /04bw...-expat -2.1.0
/nix/store /04df...- haskell -x509 -validation -ghc7 .8.4 -1.5.1 - shared
/nix/store /06p6...-packer - e3c2f01cb8d8f759c02bd3cfc9d27cc1a941d498 -src
...
/nix/store/zv9r ...-perl -libwww -perl -6.05
/nix/store/zvgj ...- pypy2 .5-stevedore -0.15
/nix/store/zw00 ...- libpciaccess -0.13.3
/nix/store/zz78 ...- libdvbpsi -0.2.2
Security Auditing
$ nix -store -qR /run/current -system | grep openssl
/nix/store/ x1zwzk4hrvj5fz ...9hyn -openssl -1.0.1p
/nix/store/ m4kzbwji9jkw71 ...lx92 -openssl -1.0.1p
Tradeoffs
• Provisioning not solved
Nixops expressiveness vs Terraform ‘coverage’
• Steep learning curve
Docs great reference, but bad for n00bs!
• Some upfront setup
Internal Nix channels vs nixpkgs fork curation
Benefits
• Repeatable dev envs
• Consistent CI
• Predictable deploys
• Real rollback support (machine-level)
The Win!
Simplicity at its core
What Next?
• Nix AWS Provisioning
• Idris to Nix Backend
• NixBSD Anyone????
• Nix to JVM Bytecode???
Where to Next?
• Nix Manual:
http://nixos.org/nix/manual
• NixOS Manual:
http://nixos.org/nixos/manual
• Nix Cookbook:
http://funops.co/nix-cookbook
• Nix Pills (by Lethalman)
InfraEng @ Lookout
# finger infraeng
Login: infraeng
Name: Infra Eng @ Lookout
Shell: /run/current -system/sw/bin/bash
Last login Mon Mar 11 14:10 (PST) on pts /10
* Multiple services in prod
* ~350 hosts monitored already
* Internal Nix channel
* Internal binary cache
* One repository per service
* Repository is source of truth
* We are hiring! Come talk to me. :)
Questions
Figure: Heckle me @SusanPotter later too.

More Related Content

What's hot

Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
Locaweb
 
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
Alessandro Cinelli (cirpo)
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
Christian Melchior
 
Performance Profiling in Rust
Performance Profiling in RustPerformance Profiling in Rust
Performance Profiling in Rust
InfluxData
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
Survey Department
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
Domenic Denicola
 
PostgreSQL and PL/Java
PostgreSQL and PL/JavaPostgreSQL and PL/Java
PostgreSQL and PL/Java
Peter Eisentraut
 
Python postgre sql a wonderful wedding
Python postgre sql   a wonderful weddingPython postgre sql   a wonderful wedding
Python postgre sql a wonderful wedding
Stéphane Wirtel
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programming
Rodolfo Finochietti
 
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
Wei Lin
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl BytecodeDonal Fellows
 
"PostgreSQL and Python" Lightning Talk @EuroPython2014
"PostgreSQL and Python" Lightning Talk @EuroPython2014"PostgreSQL and Python" Lightning Talk @EuroPython2014
"PostgreSQL and Python" Lightning Talk @EuroPython2014
Henning Jacobs
 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
Brandon Lamb
 
Lua: the world's most infuriating language
Lua: the world's most infuriating languageLua: the world's most infuriating language
Lua: the world's most infuriating language
jgrahamc
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
Michiel Borkent
 
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
Big Data Spain
 
Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5
Donal Fellows
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
Michiel Borkent
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scriptingTony Fabeen
 
Modern technologies in data science
Modern technologies in data science Modern technologies in data science
Modern technologies in data science
Chucheng Hsieh
 

What's hot (20)

Lua tech talk
Lua tech talkLua tech talk
Lua tech talk
 
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
 
Performance Profiling in Rust
Performance Profiling in RustPerformance Profiling in Rust
Performance Profiling in Rust
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
PostgreSQL and PL/Java
PostgreSQL and PL/JavaPostgreSQL and PL/Java
PostgreSQL and PL/Java
 
Python postgre sql a wonderful wedding
Python postgre sql   a wonderful weddingPython postgre sql   a wonderful wedding
Python postgre sql a wonderful wedding
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programming
 
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
Building Distributed System with Celery on Docker Swarm - PyCon JP 2016
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl Bytecode
 
"PostgreSQL and Python" Lightning Talk @EuroPython2014
"PostgreSQL and Python" Lightning Talk @EuroPython2014"PostgreSQL and Python" Lightning Talk @EuroPython2014
"PostgreSQL and Python" Lightning Talk @EuroPython2014
 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
 
Lua: the world's most infuriating language
Lua: the world's most infuriating languageLua: the world's most infuriating language
Lua: the world's most infuriating language
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
 
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
Apache MXNet Distributed Training Explained In Depth by Viacheslav Kovalevsky...
 
Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scripting
 
Modern technologies in data science
Modern technologies in data science Modern technologies in data science
Modern technologies in data science
 

Viewers also liked

Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids Applied
Susan Potter
 
Distributed Developer Workflows using Git
Distributed Developer Workflows using GitDistributed Developer Workflows using Git
Distributed Developer Workflows using Git
Susan Potter
 
Writing Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptWriting Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScript
Susan Potter
 
Link Walking with Riak
Link Walking with RiakLink Walking with Riak
Link Walking with Riak
Susan Potter
 
Designing for Concurrency
Designing for ConcurrencyDesigning for Concurrency
Designing for Concurrency
Susan Potter
 
Running Free with the Monads
Running Free with the MonadsRunning Free with the Monads
Running Free with the Monads
kenbot
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
Susan Potter
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Lorenzo Alberton
 
Scaling Teams, Processes and Architectures
Scaling Teams, Processes and ArchitecturesScaling Teams, Processes and Architectures
Scaling Teams, Processes and Architectures
Lorenzo Alberton
 
Your data structures are made of maths!
Your data structures are made of maths!Your data structures are made of maths!
Your data structures are made of maths!
kenbot
 
Scalable Architectures - Taming the Twitter Firehose
Scalable Architectures - Taming the Twitter FirehoseScalable Architectures - Taming the Twitter Firehose
Scalable Architectures - Taming the Twitter FirehoseLorenzo Alberton
 
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Susan Potter
 
Graphs in the Database: Rdbms In The Social Networks Age
Graphs in the Database: Rdbms In The Social Networks AgeGraphs in the Database: Rdbms In The Social Networks Age
Graphs in the Database: Rdbms In The Social Networks Age
Lorenzo Alberton
 
The Art of Scalability - Managing growth
The Art of Scalability - Managing growthThe Art of Scalability - Managing growth
The Art of Scalability - Managing growth
Lorenzo Alberton
 
NoSQL Databases: Why, what and when
NoSQL Databases: Why, what and whenNoSQL Databases: Why, what and when
NoSQL Databases: Why, what and when
Lorenzo Alberton
 
Monitoring at scale - Intuitive dashboard design
Monitoring at scale - Intuitive dashboard designMonitoring at scale - Intuitive dashboard design
Monitoring at scale - Intuitive dashboard design
Lorenzo Alberton
 
Trees In The Database - Advanced data structures
Trees In The Database - Advanced data structuresTrees In The Database - Advanced data structures
Trees In The Database - Advanced data structures
Lorenzo Alberton
 
Category theory for beginners
Category theory for beginnersCategory theory for beginners
Category theory for beginners
kenbot
 
Data made out of functions
Data made out of functionsData made out of functions
Data made out of functions
kenbot
 

Viewers also liked (19)

Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids Applied
 
Distributed Developer Workflows using Git
Distributed Developer Workflows using GitDistributed Developer Workflows using Git
Distributed Developer Workflows using Git
 
Writing Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptWriting Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScript
 
Link Walking with Riak
Link Walking with RiakLink Walking with Riak
Link Walking with Riak
 
Designing for Concurrency
Designing for ConcurrencyDesigning for Concurrency
Designing for Concurrency
 
Running Free with the Monads
Running Free with the MonadsRunning Free with the Monads
Running Free with the Monads
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
Scaling Teams, Processes and Architectures
Scaling Teams, Processes and ArchitecturesScaling Teams, Processes and Architectures
Scaling Teams, Processes and Architectures
 
Your data structures are made of maths!
Your data structures are made of maths!Your data structures are made of maths!
Your data structures are made of maths!
 
Scalable Architectures - Taming the Twitter Firehose
Scalable Architectures - Taming the Twitter FirehoseScalable Architectures - Taming the Twitter Firehose
Scalable Architectures - Taming the Twitter Firehose
 
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
 
Graphs in the Database: Rdbms In The Social Networks Age
Graphs in the Database: Rdbms In The Social Networks AgeGraphs in the Database: Rdbms In The Social Networks Age
Graphs in the Database: Rdbms In The Social Networks Age
 
The Art of Scalability - Managing growth
The Art of Scalability - Managing growthThe Art of Scalability - Managing growth
The Art of Scalability - Managing growth
 
NoSQL Databases: Why, what and when
NoSQL Databases: Why, what and whenNoSQL Databases: Why, what and when
NoSQL Databases: Why, what and when
 
Monitoring at scale - Intuitive dashboard design
Monitoring at scale - Intuitive dashboard designMonitoring at scale - Intuitive dashboard design
Monitoring at scale - Intuitive dashboard design
 
Trees In The Database - Advanced data structures
Trees In The Database - Advanced data structuresTrees In The Database - Advanced data structures
Trees In The Database - Advanced data structures
 
Category theory for beginners
Category theory for beginnersCategory theory for beginners
Category theory for beginners
 
Data made out of functions
Data made out of functionsData made out of functions
Data made out of functions
 

Similar to From Zero to Application Delivery with NixOS

Making the most of your gradle build - Gr8Conf 2017
Making the most of your gradle build - Gr8Conf 2017Making the most of your gradle build - Gr8Conf 2017
Making the most of your gradle build - Gr8Conf 2017
Andres Almiray
 
Making the most of your gradle build - Greach 2017
Making the most of your gradle build - Greach 2017Making the most of your gradle build - Greach 2017
Making the most of your gradle build - Greach 2017
Andres Almiray
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Cosimo Streppone
 
Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36
Halil Kaya
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
Ruslan Shevchenko
 
React native
React nativeReact native
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdfKubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Srinivasa Rao
 
Gitlab and Lingvokot
Gitlab and LingvokotGitlab and Lingvokot
Gitlab and Lingvokot
Lingvokot
 
Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2
 Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2   Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2
Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2 Adil Khan
 
(1) cpp introducing the_cpp_programming_language
(1) cpp introducing the_cpp_programming_language(1) cpp introducing the_cpp_programming_language
(1) cpp introducing the_cpp_programming_language
Nico Ludwig
 
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them AllScylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
ScyllaDB
 
Ropython-windbg-python-extensions
Ropython-windbg-python-extensionsRopython-windbg-python-extensions
Ropython-windbg-python-extensions
Alin Gabriel Serdean
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
Lindsay Holmwood
 
Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
Rafael Dohms
 
IR Journal (itscholar.codegency.co.in).pdf
IR Journal (itscholar.codegency.co.in).pdfIR Journal (itscholar.codegency.co.in).pdf
IR Journal (itscholar.codegency.co.in).pdf
RahulRoy130127
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
biicode
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
Andrii Podanenko
 
ECMAScript 6 and the Node Driver
ECMAScript 6 and the Node DriverECMAScript 6 and the Node Driver
ECMAScript 6 and the Node Driver
MongoDB
 

Similar to From Zero to Application Delivery with NixOS (20)

Making the most of your gradle build - Gr8Conf 2017
Making the most of your gradle build - Gr8Conf 2017Making the most of your gradle build - Gr8Conf 2017
Making the most of your gradle build - Gr8Conf 2017
 
Making the most of your gradle build - Greach 2017
Making the most of your gradle build - Greach 2017Making the most of your gradle build - Greach 2017
Making the most of your gradle build - Greach 2017
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013
 
Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
React native
React nativeReact native
React native
 
Play framework
Play frameworkPlay framework
Play framework
 
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdfKubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
 
Gitlab and Lingvokot
Gitlab and LingvokotGitlab and Lingvokot
Gitlab and Lingvokot
 
Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2
 Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2   Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2
Recipe to build open splice dds 6.3.xxx Hello World example over Qt 5.2
 
(1) cpp introducing the_cpp_programming_language
(1) cpp introducing the_cpp_programming_language(1) cpp introducing the_cpp_programming_language
(1) cpp introducing the_cpp_programming_language
 
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them AllScylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
Scylla Summit 2022: ScyllaDB Rust Driver: One Driver to Rule Them All
 
Ropython-windbg-python-extensions
Ropython-windbg-python-extensionsRopython-windbg-python-extensions
Ropython-windbg-python-extensions
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
 
IR Journal (itscholar.codegency.co.in).pdf
IR Journal (itscholar.codegency.co.in).pdfIR Journal (itscholar.codegency.co.in).pdf
IR Journal (itscholar.codegency.co.in).pdf
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
 
ECMAScript 6 and the Node Driver
ECMAScript 6 and the Node DriverECMAScript 6 and the Node Driver
ECMAScript 6 and the Node Driver
 

More from Susan Potter

Thinking in Properties
Thinking in PropertiesThinking in Properties
Thinking in Properties
Susan Potter
 
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Susan Potter
 
From Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedFrom Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons Learned
Susan Potter
 
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Susan Potter
 
Deploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatDeploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweat
Susan Potter
 

More from Susan Potter (6)

Thinking in Properties
Thinking in PropertiesThinking in Properties
Thinking in Properties
 
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
 
From Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedFrom Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons Learned
 
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
 
Twitter4R OAuth
Twitter4R OAuthTwitter4R OAuth
Twitter4R OAuth
 
Deploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatDeploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweat
 

Recently uploaded

Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
Roshan Dwivedi
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
QuickwayInfoSystems3
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 

Recently uploaded (20)

Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 

From Zero to Application Delivery with NixOS

  • 1. From Zero to Application Delivery #phillyete Philadelphia April 11, 2016 Susan Potter @ Lookout twitter: @SusanPotter github: mbbx6spp
  • 2. % whoami Figure: From backend dev to infra eng; bias FP advocate
  • 3. Agenda 1 Problem space control infrastructure, consistently through reliability
  • 4. Agenda 1 Problem space control infrastructure, consistently through reliability 2 Path to Reliability how could we deploy more reliable configuration?
  • 5. Agenda 1 Problem space control infrastructure, consistently through reliability 2 Path to Reliability how could we deploy more reliable configuration? 3 Nix* Solutions common problems: dev envs, CI dependencies, deploys
  • 6. Convergent Mayhem 1 Partial Definition APT sources/YUM repos change OOB
  • 7. Convergent Mayhem 1 Partial Definition APT sources/YUM repos change OOB 2 Shared Mutable State files modified in shared paths
  • 8. Convergent Mayhem 1 Partial Definition APT sources/YUM repos change OOB 2 Shared Mutable State files modified in shared paths 3 Hopefully Converges Resource expectation not always able to be met
  • 9. Convergent Mayhem 1 Partial Definition APT sources/YUM repos change OOB 2 Shared Mutable State files modified in shared paths 3 Hopefully Converges Resource expectation not always able to be met 4 Unreliable
  • 11. Reliability “Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with, and as a result the programming process will become cheaper.”
  • 12. The Humble Programmer, 1972 (EWD340)
  • 13. Why care about reliability now?
  • 14. Why care about reliability now? 1 Economic factors large distributed deployments
  • 15. Why care about reliability now? 1 Economic factors large distributed deployments 2 Human factors high churn/turnover, low quality of ops life
  • 16. Why care about reliability now? 1 Economic factors large distributed deployments 2 Human factors high churn/turnover, low quality of ops life 3 Technological factors programmable infrastructure & FP no longer just for academics
  • 17. More Services 1 Currently 20-30 services 2 More services ready each month 3 Expect 50+ by end of year 4 Various stacks/runtimes
  • 18. More Environments 1 Ephemeral (integration testing) 2 Product lines (consumer vs enterprise) 3 Performance 4 Partners
  • 20. Problem: Software Delivery Environment provisioning not repeatable in practice
  • 21. Problem: Software Delivery Continuous integration builds break with app dependency changes
  • 22. Problem: Software Delivery Deploys have unexpected consequences that --dry-run/--why-run cannot catch
  • 23. Requirements: Optimize for . . . 1 Scalability solved by on-demand ”cloud”
  • 24. Requirements: Optimize for . . . 1 Scalability solved by on-demand ”cloud” 2 Reliability solved by . . . ???
  • 25. So what yields reliability?
  • 26. So what yields reliability? Ability to reason about code.
  • 27. What allows you to reason about code?
  • 28. What allows you to reason about code? Referential transparency (RT)!
  • 30. Functions have inputs (Scala) object Functions { // Two typed input arguments here def add(x: Int , y: Int) = x + y // One typed input argument here def len(s: String) = s.size }
  • 31. Functions have inputs (Nix) let add = x: y: x + y; len = s: builtins.stringLength s; in { inherit add len; }
  • 32. Functions have inputs # Ruby def add(x, y) x + y end def len(s) s.size end # JavaScript function add(x, y) { return (x + y); } function len(s) { return s.length; }
  • 33. Packages have inputs (Nix) # stdenv , fetchurl , gcc , help2man are # (package) inputs to our hello package { stdenv , fetchurl , gcc , help2man }: let version = "2.1.1"; in stdenv.mkDerivation { inherit version; name = "hello -${version}"; src = fetchurl { ... }; # gcc and help2man are build deps buildInputs = [ gcc help2man ]; }
  • 34. Functions return a result scala > add(5, 6) res0: Int = 11 scala > len("Hello ,␣PhillyETE") res1: Int = 16
  • 35. Functions return a result (Nix) $ nix -repl ’<nixpkgs >’ Loading <nixpkgs >... Added 5876 variables . nix -repl > hello = import ./ hello.nix { inherit stdenv fetchurl gcc help2man; } nix -repl > hello derivation /nix/store /...0am -hello -2.1.1. drv
  • 36. Functions return a result (Nix) nix -repl > "${hello}" "/nix/store/jg1l1 ...lsj -hello -2.1.1" nix -repl > :q $ nix -build hello.nix --arg stdenv "(import␣<nixpkgs >␣{}). stdenv" --arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" --arg gcc "(import␣<nixpkgs >␣{}). gcc" --arg help2man "(import␣<nixpkgs >␣{}). help2man" /nix/store/jg1l1 ...lsj -hello -2.1.1
  • 37. Only depend on inputs (Nix) # Remove help2man from package input arguments $ cat hello.nix hello.nix.1 1c1 < { stdenv , fetchurl , gcc , help2man }: --- > { stdenv , fetchurl , gcc }: $ nix -build hello.nix.1 --arg stdenv "(import␣<nixpkgs >␣{}). stdenv" --arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" --arg gcc "(import␣<nixpkgs >␣{}). gcc" error: undefined variable help2man at hello.nix :11:23
  • 38. Only depend on inputs # Remove help2man from buildInputs $ cat hello.nix hello.nix.2 11c11 < buildInputs = [ gcc help2man ]; --- > buildInputs = [ gcc ]; $ nix -build hello.nix.2 --arg stdenv "(import␣<nixpkgs >␣{}). stdenv" --arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" --arg gcc "(import␣<nixpkgs >␣{}). gcc" --arg help2man "(import␣<nixpkgs >␣{}). help2man" ...
  • 39. Only depend on inputs these derivations will be built: /nix/store /19 x32rhqx ...mn80 -hello -2.1.1. drv building path(s) /nix/store/v38 ...2 m58h -hello -2.1.1 unpacking sources unpacking source archive /nix/store /...-hello -2.1.1. tar.gz source root is hello -2.1.1 ... /nix /...-bash -.../ bash: help2man: command not found Makefile :282: recipe for target ‘hello .1’ failed make [2]: *** [hello .1] Error 127 ... error: build of /nix /...n80 -hello -2.1.1. drv failed
  • 40. Return same result given same inputs scala > len("Hello ,␣PhillyETE") res0: Int = 16 scala > len("Hello ,␣PhillyETE") res1: Int = 16 scala > len("Hello ,␣PhillyETE") res2: Int = 16 ... scala > len("Hello ,␣PhillyETE") res3333333333: Int = 16
  • 41. Return same result given same inputs $ while true; do nix -build --arg stdenv "(import␣<nixpkgs >␣{}). stdenv" --arg fetchurl "(import␣<nixpkgs >␣{}). fetchurl" --arg gcc "(import␣<nixpkgs >␣{}). gcc" --arg help2man "(import␣<nixpkgs >␣{}). help2man" hello.nix done /nix/store/jg1l1kw ...sj -hello -2.1.1 /nix/store/jg1l1kw ...sj -hello -2.1.1 ... /nix/store/jg1l1kw ...sj -hello -2.1.1 ^Cerror: interrupted by the user
  • 42. The Big idea Referential Transparency Given same inputs, return same result. Always.
  • 44. Mainstream Package Management Based on shared + mutable state (filesystem)
  • 46. Alternative Approaches • shared + immutable • private + mutable • expensive coarse grained locks • hybrid without the expense
  • 47. What Nix does . . . • Define all inputs chroot, explicit inputs, full dependency definition • Ensure RT private + mutable build area, diff inputs ⇒ diff results, symlink results into profile • Congruent vs Convergent
  • 48. Nix Ecosystem • Expression language: Nix • Package management: Nix • Channel: <nixpkgs> • Operating System: NixOS • Configuration ”modules”: NixOS modules • Provisioning: NixOps • Orchestration: Disnix • CI: Hydra
  • 49. Repeatable Dev Envs $ nix -shell -p erlangR17_odbc these paths will be fetched (37.65 MiB download , 112.65 MiB unpacked ): /nix/store /0jvs ...3vd -unixODBC -2.3.2 /nix/store/wf7w ...6fp -erlang -17.5 - odbc fetching path /nix/store /0jvs...- unixODBC -2.3.2... ... [nix -shell :~]$ erl Erlang/OTP 17 [erts -6.4] [source] [64-bit] ... Eshell V6.4 (abort with ^G) 1>
  • 50. Repeatable Dev Envs $ nix -shell -p erlangR18_javac these paths will be fetched (38.04 MiB download , 113.91 MiB unpacked ): /nix/store /94a...b3xn -erlang -18.2 fetching path /nix/store /94a...b3xn -erlang -18.2... ... [nix -shell :~]$ erl Erlang/OTP 18 [erts -7.2] [source] [64-bit] ... Eshell V7.2 (abort with ^G) 1>
  • 51. Repeatable Dev Envs $ declare pkghost="releases.nixos.org" $ declare release_url="https ://${pkghost }/ nixos" $ nix -channel --add "${release_url }/16.03 - beta/nixos -16.03.30.2068621 " nixpkgs $ nix -shell these derivations will be built: /nix/store /267y...-elm -0.16.0. drv these paths will be fetched (31.49 MiB download , 379.99 MiB unpacked ): /nix/store /0d3y...-nodejs -4.3.1 ... building path(s) /nix/store/jjzr ...-elm -0.16.0 created 6 symlinks in user environment
  • 52. Repeatable Dev Envs $ cat shell.nix { pkgs ? import <nixpkgs > {}, ... }: let inherit (pkgs) stdenv; in stdenv.mkDerivation { name = "myscalaprj -devenv"; buildInputs = with pkgs; [ gitFull # Developer dependency scala sbt # Scala/SBT postgresql # RDBMS elmPackages.elm # for front -end compiler ]; ...
  • 53. Repeatable Dev Envs ... shellHook = ’’ export SERVICE_PORT =4444 export DATABASE_PORT =5432 export DATABASE_PATH=$PWD/data export LOG_PATH=$PWD/log if [ ! -d "${DATABASE_PATH }" ]; then initdb "${DATABASE_PATH }" fi pg_ctl -D "${DATABASE_PATH }" -l "${LOG_PATH}" -o --path="${DATABASE_PORT }" start ’’; }
  • 54. Consistent CI Deps $ head -3 z/ci/verify #!/usr/bin/env nix -shell #!nix -shell -I nixpkgs=URL #!nix -shell -p scala sbt postgresql -i bash
  • 55. Consistent CI Deps ... set -eu ! test -d "${ DATABASE_PATH }" && initdb "${ DATABASE_PATH }" elm -make elm/* sbt clean scalastyle pg_ctl -D "${ DATABASE_PATH }" -l "${LOG_PATH}" -o --port="${ DATABASE_PORT }" start sbt test pg_ctl -D "${ DATABASE_PATH }" stop
  • 56. Consistent CI Deps • Pin channel versions ⇒ source + CI consistency • Update CI build deps with app code • No OOB ‘converge’-ing CI build hosts!
  • 57. Diff Dependencies $ nix -store -qR /nix/store /*-myscalaprj -* /nix/store /8 jhy2j7v0mpwybw13nd4fjlsfqc9xnlh -write -mirror -list.sh /nix/store /17 h0mw5sipbvg70hdsn8i5mai4619l8c -move -docs.sh ... /nix/store/ p6gn7inwvm61phqw3whhlbl20n8c5dgb -git -2.7.1. drv /nix/store/ z2jvckzhy5322d9ir0xv2hbqp6yakayj -myscalaprj -devenv.drv
  • 58. Predictable Deploys • Diff dependency path tree • Test node configuration in VM • Test NixOS module logic • Security auditing
  • 59. Machine Config { config , pkgs , ... }: let inherit (pkgs) lib; ntpF = (idx: "${idx}. amazon.pool.ntp.org") domain = "example.com"; in { boot.cleanTmpDir = true; boot.kernel.sysctl = { "net.ipv4. tcp_keepalive_time " = 1500; # other sysctl key -values here ... }; networking.hostName = " nixallthethings .${domain}"; networking.firewall.enable = true; services.ntp.servers = map ntpF (lib.range 0 3); services.zookeeper.enable = true; security.pki. certificateFiles = [./ internal_ca.crt]; time.timeZone = "UTC"; }
  • 60. Test Machine Config (VM) $ env NIXOS_CONFIG=$PRJROOT/nix/config.nix nixos -rebuild build -vm $ ./ result/bin/run -hostname -vm ... $ env NIXOS_CONFIG=$PRJROOT/nix/config.nix --target -host myscalaprj -test -1. integ.bla nixos -rebuild build -vm
  • 61. Module Integration Testing $ grep -A8 elasticsearch.enable $PWD/nix/config.nix elasticsearch.enable = true; elasticsearch.jre = mychannel. elasticsearch_2_2_0 ; elasticsearch.jre = mychannel.oraclejre8u74; elasticsearch.node.name = "elasticsearch -0.${domain}"; elasticsearch.dataDir = [ "/data0" "/data1" "/data3" ];
  • 62. Module Integration Testing $ grep -A8 "node␣health" $PWD/nix/modules/elasticsearch.nix subtest "elasticsearch ␣node␣health", sub { $es0 ->waitForUnit("elasticsearch .service"); $es1 ->waitForUnit("elasticsearch .service"); $es0 ->succeed("${ waitForTcpPort ␣"es0"␣9300␣60}"); $es1 ->succeed("${ waitForTcpPort ␣"es1"␣9300␣60}"); $es0 ->succeed("${curl␣"es0"␣9200␣"/"}"); $es1 ->succeed("${curl␣"es1"␣9200␣"/"}"); }
  • 63. Security Auditing $ nix -store -qR /path/to/app/pkg | sort | uniq /nix/store /002v...- libdc1394 -2.2.3 /nix/store /04bw...-expat -2.1.0 /nix/store /04df...- haskell -x509 -validation -ghc7 .8.4 -1.5.1 - shared /nix/store /06p6...-packer - e3c2f01cb8d8f759c02bd3cfc9d27cc1a941d498 -src ... /nix/store/zv9r ...-perl -libwww -perl -6.05 /nix/store/zvgj ...- pypy2 .5-stevedore -0.15 /nix/store/zw00 ...- libpciaccess -0.13.3 /nix/store/zz78 ...- libdvbpsi -0.2.2
  • 64. Security Auditing $ nix -store -qR /run/current -system | grep openssl /nix/store/ x1zwzk4hrvj5fz ...9hyn -openssl -1.0.1p /nix/store/ m4kzbwji9jkw71 ...lx92 -openssl -1.0.1p
  • 65. Tradeoffs • Provisioning not solved Nixops expressiveness vs Terraform ‘coverage’ • Steep learning curve Docs great reference, but bad for n00bs! • Some upfront setup Internal Nix channels vs nixpkgs fork curation
  • 66. Benefits • Repeatable dev envs • Consistent CI • Predictable deploys • Real rollback support (machine-level)
  • 68. What Next? • Nix AWS Provisioning • Idris to Nix Backend • NixBSD Anyone???? • Nix to JVM Bytecode???
  • 69. Where to Next? • Nix Manual: http://nixos.org/nix/manual • NixOS Manual: http://nixos.org/nixos/manual • Nix Cookbook: http://funops.co/nix-cookbook • Nix Pills (by Lethalman)
  • 70. InfraEng @ Lookout # finger infraeng Login: infraeng Name: Infra Eng @ Lookout Shell: /run/current -system/sw/bin/bash Last login Mon Mar 11 14:10 (PST) on pts /10 * Multiple services in prod * ~350 hosts monitored already * Internal Nix channel * Internal binary cache * One repository per service * Repository is source of truth * We are hiring! Come talk to me. :)
  • 71. Questions Figure: Heckle me @SusanPotter later too.