diff options
| author | Paul Buetow <paul@buetow.org> | 2021-12-26 12:50:19 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2021-12-26 12:50:19 +0000 |
| commit | 080b45fcd07a531754ca4045a40c94675c38ad40 (patch) | |
| tree | 821ba368e93f5ce4c75878181e173d7f6c2231d7 | |
| parent | b3a4ab1f27cfefb5deb8ab2ca98d90d201a52909 (diff) | |
new article
33 files changed, 351 insertions, 1888 deletions
diff --git a/contact-information.html b/contact-information.html index d9dbe670..d28cbc33 100644 --- a/contact-information.html +++ b/contact-information.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Contact information</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Contact information</h1> diff --git a/gemfeed/2008-06-26-perl-poetry.html b/gemfeed/2008-06-26-perl-poetry.html index 7271dad1..799faa18 100644 --- a/gemfeed/2008-06-26-perl-poetry.html +++ b/gemfeed/2008-06-26-perl-poetry.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Perl Poetry</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Perl Poetry</h1> diff --git a/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html b/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html index 0eea2fa0..c05ca583 100644 --- a/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html +++ b/gemfeed/2008-12-29-using-my-nokia-n95-for-fixing-my-mta.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Using my Nokia N95 for fixing my MTA</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Using my Nokia N95 for fixing my MTA</h1> diff --git a/gemfeed/2010-04-09-standard-ml-and-haskell.html b/gemfeed/2010-04-09-standard-ml-and-haskell.html index 89516771..bde49643 100644 --- a/gemfeed/2010-04-09-standard-ml-and-haskell.html +++ b/gemfeed/2010-04-09-standard-ml-and-haskell.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Standard ML and Haskell</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Standard ML and Haskell</h1> diff --git a/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html b/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html index 2df92939..a91c7c44 100644 --- a/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html +++ b/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Lazy Evaluation with Standard ML</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Lazy Evaluation with Standard ML</h1> diff --git a/gemfeed/2010-05-09-the-fype-programming-language.html b/gemfeed/2010-05-09-the-fype-programming-language.html index 5b794f41..97125059 100644 --- a/gemfeed/2010-05-09-the-fype-programming-language.html +++ b/gemfeed/2010-05-09-the-fype-programming-language.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The Fype Programming Language</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>The Fype Programming Language</h1> diff --git a/gemfeed/2011-05-07-perl-daemon-service-framework.html b/gemfeed/2011-05-07-perl-daemon-service-framework.html index a415ee86..d11bb9e8 100644 --- a/gemfeed/2011-05-07-perl-daemon-service-framework.html +++ b/gemfeed/2011-05-07-perl-daemon-service-framework.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Perl Daemon (Service Framework)</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Perl Daemon (Service Framework)</h1> diff --git a/gemfeed/2014-03-24-the-fibonacci.pl.c-polyglot.html b/gemfeed/2014-03-24-the-fibonacci.pl.c-polyglot.html index ab0a162a..50d3cecf 100644 --- a/gemfeed/2014-03-24-the-fibonacci.pl.c-polyglot.html +++ b/gemfeed/2014-03-24-the-fibonacci.pl.c-polyglot.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The fibonacci.pl.c Polyglot</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>The fibonacci.pl.c Polyglot</h1> diff --git a/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.html b/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.html index ec9e16ed..3248a2b1 100644 --- a/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.html +++ b/gemfeed/2015-12-05-run-debian-on-your-phone-with-debroid.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Run Debian on your phone with Debroid</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Run Debian on your phone with Debroid</h1> diff --git a/gemfeed/2016-04-03-offsite-backup-with-zfs.html b/gemfeed/2016-04-03-offsite-backup-with-zfs.html index 4c0b809b..c292a4c3 100644 --- a/gemfeed/2016-04-03-offsite-backup-with-zfs.html +++ b/gemfeed/2016-04-03-offsite-backup-with-zfs.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Offsite backup with ZFS</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Offsite backup with ZFS</h1> diff --git a/gemfeed/2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html b/gemfeed/2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html index 42c3e924..eb63bf37 100644 --- a/gemfeed/2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html +++ b/gemfeed/2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Jails and ZFS with Puppet on FreeBSD</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Jails and ZFS with Puppet on FreeBSD</h1> diff --git a/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.html b/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.html index e9a8c24f..ec1183a9 100644 --- a/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.html +++ b/gemfeed/2016-04-16-offsite-backup-with-zfs-part2.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Offsite backup with ZFS (Part 2)</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Offsite backup with ZFS (Part 2)</h1> diff --git a/gemfeed/2016-05-22-spinning-up-my-own-authoritative-dns-servers.html b/gemfeed/2016-05-22-spinning-up-my-own-authoritative-dns-servers.html index e85db87c..220428f0 100644 --- a/gemfeed/2016-05-22-spinning-up-my-own-authoritative-dns-servers.html +++ b/gemfeed/2016-05-22-spinning-up-my-own-authoritative-dns-servers.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Spinning up my own authoritative DNS servers</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Spinning up my own authoritative DNS servers</h1> diff --git a/gemfeed/2016-11-20-methods-in-c.html b/gemfeed/2016-11-20-methods-in-c.html index 48dd5bcf..58684be9 100644 --- a/gemfeed/2016-11-20-methods-in-c.html +++ b/gemfeed/2016-11-20-methods-in-c.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Methods in C</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Methods in C</h1> diff --git a/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.html b/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.html index 3e909488..5afba28c 100644 --- a/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.html +++ b/gemfeed/2018-06-01-realistic-load-testing-with-ioriot-for-linux.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Realistic load testing with I/O Riot for Linux</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Realistic load testing with I/O Riot for Linux</h1> diff --git a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.html b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.html index 23eeb3c0..8544e16d 100644 --- a/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.html +++ b/gemfeed/2021-04-22-dtail-the-distributed-log-tail-program.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DTail - The distributed log tail program</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>DTail - The distributed log tail program</h1> diff --git a/gemfeed/2021-04-24-welcome-to-the-geminispace.html b/gemfeed/2021-04-24-welcome-to-the-geminispace.html index b269a4fd..82e303c1 100644 --- a/gemfeed/2021-04-24-welcome-to-the-geminispace.html +++ b/gemfeed/2021-04-24-welcome-to-the-geminispace.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Welcome to the Geminispace</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Welcome to the Geminispace</h1> diff --git a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html index 4ac1124c..2f184b70 100644 --- a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html +++ b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Personal Bash coding style guide</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Personal Bash coding style guide</h1> diff --git a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.html b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.html index 3bea4252..2c0d8a1d 100644 --- a/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.html +++ b/gemfeed/2021-06-05-gemtexter-one-bash-script-to-rule-it-all.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Gemtexter - One Bash script to rule it all</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Gemtexter - One Bash script to rule it all</h1> diff --git a/gemfeed/2021-07-04-the-well-grounded-rubyist.html b/gemfeed/2021-07-04-the-well-grounded-rubyist.html index bacc8995..95bf87e0 100644 --- a/gemfeed/2021-07-04-the-well-grounded-rubyist.html +++ b/gemfeed/2021-07-04-the-well-grounded-rubyist.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The Well-Grounded Rubyist</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>The Well-Grounded Rubyist</h1> diff --git a/gemfeed/2021-08-01-on-being-pedantic-about-open-source.html b/gemfeed/2021-08-01-on-being-pedantic-about-open-source.html index 0e870820..e17f1a3d 100644 --- a/gemfeed/2021-08-01-on-being-pedantic-about-open-source.html +++ b/gemfeed/2021-08-01-on-being-pedantic-about-open-source.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>On being Pedantic about Open-Source</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>On being Pedantic about Open-Source</h1> diff --git a/gemfeed/2021-09-12-keep-it-simple-and-stupid.html b/gemfeed/2021-09-12-keep-it-simple-and-stupid.html index cc369bbb..666e0acd 100644 --- a/gemfeed/2021-09-12-keep-it-simple-and-stupid.html +++ b/gemfeed/2021-09-12-keep-it-simple-and-stupid.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Keep it simple and stupid</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Keep it simple and stupid</h1> diff --git a/gemfeed/2021-10-22-defensive-devops.html b/gemfeed/2021-10-22-defensive-devops.html index 81e26478..65a5b580 100644 --- a/gemfeed/2021-10-22-defensive-devops.html +++ b/gemfeed/2021-10-22-defensive-devops.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Defensive DevOps</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Defensive DevOps</h1> diff --git a/gemfeed/2021-11-28-bash-golf-part-2.draft.html b/gemfeed/2021-11-28-bash-golf-part-2.draft.html index a10d1f8d..e73d6ccd 100644 --- a/gemfeed/2021-11-28-bash-golf-part-2.draft.html +++ b/gemfeed/2021-11-28-bash-golf-part-2.draft.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bash Golf Part 2</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Bash Golf Part 2</h1> diff --git a/gemfeed/2021-11-29-bash-golf-part-1.html b/gemfeed/2021-11-29-bash-golf-part-1.html index 991b5637..d1d91598 100644 --- a/gemfeed/2021-11-29-bash-golf-part-1.html +++ b/gemfeed/2021-11-29-bash-golf-part-1.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bash Golf Part 1</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Bash Golf Part 1</h1> @@ -382,10 +319,10 @@ bash: 1: command not found... <p>For these kinds of expressions it's always better to use "let" though. And you should also use $((...expression...)) instead of the old (deprecated) way $[ ...expression... ] like this example demonstrates:</p> <pre> ❯ declare j=0 -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) ❯ echo $j 4 </pre> diff --git a/gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html b/gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html new file mode 100644 index 00000000..7516f9fd --- /dev/null +++ b/gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html @@ -0,0 +1,81 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>How to stay sane as a DevOps person </title> +<link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> +<link rel="stylesheet" href="style.css" /> +</head> +<body> +<h1>How to stay sane as a DevOps person </h1> +<pre> + ) + ) (( ( + ( )) ) + ) ) // ( + _ ( __ ( ~->> + ,-----' |__,_~~___<'__`)-~__--__-~->> < + | // : | -__ ~__ o)____)),__ - '> >- > + | // : |- \_ \ -\_\ -\ \ \ ~\_ \ ->> - , >> + | // : |_~_\ -\__\ \~'\ \ \, \__ . -<- >> + `-----._| ` -__`-- - ~~ -- ` --~> > + _/___\_ //)_`// | ||] + _____[_______]_[~~-_ (.L_/ || + [____________________]' `\_,/'/ + ||| / ||| ,___,'./ + ||| \ |||,'______| + ||| / /|| I==|| + ||| \ __/_|| __||__ +-----||-/------`-._/||-o--o---o--- + ~~~~~' +</pre> +<p class="quote"><i>Published by Paul Buetow 2021-12-26</i></p> +<p>Log4shell (CVE-2021-44228) made it clear, once again, that working in information technology is not an easy job (especially when you are a DevOps/SRE or a security engineer). I thought it would be interesting to summarize a few techniques to help you to relax.</p> +<a class="textlink" href="https://en.wikipedia.org/wiki/Log4Shell">https://en.wikipedia.org/wiki/Log4Shell</a><br /> +<h2>Set clear expectations</h2> +<p>It's important to set clear expectations. It can be quite overwhelming trying to interpret and guess what others might expect or might not expect from you. If you know exactly what you are supposed to do, you can work towards a specific goal and don't worry about all the other noise so much.</p> +<p>However, if you are in a more senior position, it is expected from you to plan your tasks by yourself to a large degree and also be flexible, so you can react quickly to new situations (e.g. resolving incidents). This can overthrow all of your plans. In this case, share your plans with your manager and/or the team and make sure that everyone agrees on it. Once done, be the execution machine. People will be happy when they see that stuff gets done. Communicate clearly all critical work you do. This will capture all the work done as it does not help you in the long run, then you fix everything in the background and everybody else thinks that all is fine.</p> +<p>Due to politeness, many people are afraid to set clear expectations. I personally may sound a little "too German" when setting expectations, but so far nobody complained, and I have only received positive feedback so far.</p> +<h2>Always respond to requests but set expectations and boundaries</h2> +<p>There are many temptations to get side-tracked by other projects and/or issues. It is important to set boundaries here. But always answer to all requests as nothing is more frustrating than asking a person and never getting any answer back. This is especially frustrating when everyone is working form home and people are using tools such as Slack and E-Mail for most of their communications.</p> +<h3>How to say no</h3> +<p>If the request is urgent, and you have the capacity, help. If it's not urgent, maybe ask to create a ticket. If it is urgent, but you don't have the knowledge or the capacity to help, try to defer the request to another colleague who might be able to help. You could also provide some quick tips and hints, so that the requester can resolve the issue by himself. You may also ask the person to come back a few hours later. Also, make it transparent to the requester why you might not have the time right now, as this can help the person to review his own priorities or to escalate. </p> +<h3>Escalation is only a tool</h3> +<p>Side note on escalation: Never make it personally. The only forms of escalation should be due to technical issues or lack of work resources. An escalation then becomes like a math equation and does not need human resources involved. So per-se, an escalation is nothing negative, but just a process people can follow to form decision-making. In a good company with a flat hierarchy, escalations tend to be an exception though, as staff know how to deal with the things by themselves without bothering management too much. </p> +<h2>Think positively</h2> +<p>If times are very stressful, think that it could be worse:</p> +<ul> +<li>Nobody is dying, we are only doing some IT stuff.</li> +<li>Your time after work is your own time, look forward to time with your family or a nice dinner or your favourite sports class.</li> +<li>You probably will never run out of work in the IT sector. So you will always be able to make a living.</li> +<li>Your IT job and life is actually pretty good (e.g. compared to a homeless person or a cleaner). You are probably part of the world's top 1% regarding salary and life standard.</li> +</ul> +<h2>Go slower even if you could go faster</h2> +<p>When working in a team, you may feel that you could get done things faster when you just did everything by yourself. This can be a bit frustrating at times, as you might need to work late hours and also might need to explain things over and over again to others.</p> +<h3>You work in a team</h3> +<p>Security is a team sport. So slow down and make sure that everyone is on track with the goals. You can go full-speed with your very own subtasks, though. Not everyone knows how to use all the tools so well like a full-time DevOps person. As a DevOps person, you are not a security expert, though. Security experts are different people in your company, but DevOps will be the main tribe deploying mitigations (following the security recommendations) and management will be the main tribe coordinating all the efforts. So even if you think that you can do everything faster by your own, can you really?</p> +<p>(PS: When I mean DevOps, I also mean Site Reliability Engineers and Sysadmins. I believe SRE and DevOps are just new words for Sysadmins, in most cases).</p> +<h3>Don't rush to prevent errors</h3> +<p>Slowing down also helps to avoid errors. Don't rush it, even if the task you are working on is urgent. Try to be quick, but don't rush it. Maybe you are writing a script to mitigate a production issue. You could others peer review that script, for example. Their primary programming language may not be the same (e.g. Java vs Ruby), but they would understand the logic (Or let another DevOps person from your company with good scripting skills review your mitigation, but he then may lack the domain knowledge of the software you are patching.</p> +<a class="textlink" href="./2021-10-22-defensive-devops.html">Read also "Defensive DevOps" about deploying mitigation scripts.</a><br /> +<p>So relax, don't always expect immediate results right away. Set clear and reasonable expectations to the management about the mitigations. You are not a superhero who has to do everything by yourself. Sometimes, you will miss a deadline. But that will have a good reason. Don't rush to complete just to meet a deadline. </p> +<h2>You are not a superhero</h2> +<p>Always keep that in mind. You can't solve all problems by your own. Maybe you could, but that would be a lot of additional pressure and stress (and this will reflect to your personal life). Also, Superman and Wonder Woman receive probably much higher salaries than you do ;-).</p> +<p>I have been a superhero multiple times mitigating critical incidents, and I was proud about it. But actually, I should not have been proud, as for everything there should be other people around who should be able to resolve an incident. No company should rely on a single person, there must always be a substitute. You are not a superhero and as harsh as it sounds, everyone is replaceable. Every superhero can be replaced with another superhero. The only thing it takes is time to get to know the infrastructure and tools very well, paired with work dedication.</p> +<p>This doesn't mean, that you shouldn't try your best. But you don't need to try to be the superhero. Maybe someone else will be the superhero, but that's OK as long as it's not always the same person every time. Everyone can have a good day after all. </p> +<h3>Give away some of your superpowers</h3> +<p>If you are a superhero, try to give away some of your superpowers, so that you can relax in the evening knowing that others (e.g. the on-call engineer of your team) knows how to tackle things. Every member of the team needs to do DevOps (even the team managers, in my humble opinion). Some may be less experienced than others or have other expertises, but to counteract this you could document the recurring tasks so that they are easy to follow (which then later could be either fully fixed or automated away).</p> +<p>So you are not a superhero. Or, if you are a superhero, then all colleagues should be superheroes too.</p> +<h2>Don't jump on all problems immediately</h2> +<p>In order to distribute the troubleshooting skills across the team, you should not jump on every problem immediately. Leave some space for others to resolve the issue. This is where the best learning happens. Nobody will learn from you when you solve all problems. People might learn something after you explained what you did, but the takeaways will be minimal compared to when people try to resolve issues by themselves. Always be available for questions which will help your colleagues to steer into the right direction and if you think it helps, give them some tips resolving the issue, even if they didn't ask for it. Sometimes, engineers are too proud to ask.</p> +<p>There is an exception, though: If the issue is a very critical one, then you might better off trying to resolve it as fast as possible with your full powers in order to avoid any major damage to the company. Best, in a team-effort though, but that's not always the fastest way, unfortunately. So in this particular circumstance, the company may be better off being saved by a single superhero. Make sure that the problem will not occur again or, at least, that others can fix it the next time without Superman flying in.</p> +<h2>Force breaks; and shutdown now</h2> +<p>Be strict about your time off. Nowadays, tech workers check their messages also out of office hours and are reachable 24/7. This really should only the case when you are on-call, to be honest (or if you work for a startup). All other out-of-office time is owned by you and not your employer. You have signed an 40 hour/week and not 7 days/week contract. Of course, there will be always some sort of flexibility and exceptions. You might need to work over the weekend to get a migration done or a problem solved. But to balance it out, you should have other days off.</p> +<p>It's important to shut down your brain from work during your breaks (be strict with your breaks, leave your desk for lunch or for a walk early afternoon and if you aren't on-call also don't take your work-phone with you). You will be happier and also much more energized and productive in the afternoon. Also, when you are reachable 24/7, your colleagues will start to think that you don't have anything more important to do than work.</p> +<h2>Block time every day for personal advance</h2> +<p>It does not matter how many tasks are in your backlog or how many issues are to be resolved. *Always* find time for personal advance. At the end of the day, you will have a nice feeling that you have accomplished something meaningful. This can be an interesting project or learning a new technology you are interested in. Of course, there must be consensus with your manager. </p> +<p>If you are too busy at work and just can't block time, then maybe it's time to think about alternatives. But before you do that, probably there is something else you can do. Perhaps you just think you can't block time, but you would be surprised to hear from your manager that he will fully support you. Of course, he won't agree to you working full-time on your pet projects. But a certain portion of your time should be allocated for personal advance. After all, your employer also want's you to stay happy so that you don't look for alternatives. It's of everyone's interest that you like your job and stay motivated. The more you are motivated, the more productive you will be. The more productive you are, the more valuable you are for the company.</p> +<p>E-Mail me your thoughts at comments@mx.buetow.org!</p> +<a class="textlink" href="../">Go back to the main site</a><br /> +</body> +</html> diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index d79573bc..349a4c42 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,12 +1,96 @@ <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>2021-12-01T09:12:31+00:00</updated> + <updated>2021-12-26T12:12:56+00:00</updated> <title>buetow.org feed</title> <subtitle>Having fun with computers!</subtitle> <link href="https://buetow.org/gemfeed/atom.xml" rel="self" /> <link href="https://buetow.org/" /> <id>https://buetow.org/</id> <entry> + <title>How to stay sane as a DevOps person </title> + <link href="https://buetow.org/gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html" /> + <id>https://buetow.org/gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html</id> + <updated>2021-12-26T12:02:02+00:00</updated> + <author> + <name>Paul Buetow</name> + <email>comments@mx.buetow.org</email> + </author> + <summary>Log4shell (CVE-2021-44228) made it clear, once again, that working in information technology is not an easy job (especially when you are a DevOps/SRE or a security engineer). I thought it would be interesting to summarize a few techniques to help you to relax.. .....to read on please visit my site.</summary> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <h1>How to stay sane as a DevOps person </h1> +<pre> + ) + ) (( ( + ( )) ) + ) ) // ( + _ ( __ ( ~->> + ,-----' |__,_~~___<'__`)-~__--__-~->> < + | // : | -__ ~__ o)____)),__ - '> >- > + | // : |- \_ \ -\_\ -\ \ \ ~\_ \ ->> - , >> + | // : |_~_\ -\__\ \~'\ \ \, \__ . -<- >> + `-----._| ` -__`-- - ~~ -- ` --~> > + _/___\_ //)_`// | ||] + _____[_______]_[~~-_ (.L_/ || + [____________________]' `\_,/'/ + ||| / ||| ,___,'./ + ||| \ |||,'______| + ||| / /|| I==|| + ||| \ __/_|| __||__ +-----||-/------`-._/||-o--o---o--- + ~~~~~' +</pre> +<p class="quote"><i>Published by Paul Buetow 2021-12-26</i></p> +<p>Log4shell (CVE-2021-44228) made it clear, once again, that working in information technology is not an easy job (especially when you are a DevOps/SRE or a security engineer). I thought it would be interesting to summarize a few techniques to help you to relax.</p> +<a class="textlink" href="https://en.wikipedia.org/wiki/Log4Shell">https://en.wikipedia.org/wiki/Log4Shell</a><br /> +<h2>Set clear expectations</h2> +<p>It's important to set clear expectations. It can be quite overwhelming trying to interpret and guess what others might expect or might not expect from you. If you know exactly what you are supposed to do, you can work towards a specific goal and don't worry about all the other noise so much.</p> +<p>However, if you are in a more senior position, it is expected from you to plan your tasks by yourself to a large degree and also be flexible, so you can react quickly to new situations (e.g. resolving incidents). This can overthrow all of your plans. In this case, share your plans with your manager and/or the team and make sure that everyone agrees on it. Once done, be the execution machine. People will be happy when they see that stuff gets done. Communicate clearly all critical work you do. This will capture all the work done as it does not help you in the long run, then you fix everything in the background and everybody else thinks that all is fine.</p> +<p>Due to politeness, many people are afraid to set clear expectations. I personally may sound a little "too German" when setting expectations, but so far nobody complained, and I have only received positive feedback so far.</p> +<h2>Always respond to requests but set expectations and boundaries</h2> +<p>There are many temptations to get side-tracked by other projects and/or issues. It is important to set boundaries here. But always answer to all requests as nothing is more frustrating than asking a person and never getting any answer back. This is especially frustrating when everyone is working form home and people are using tools such as Slack and E-Mail for most of their communications.</p> +<h3>How to say no</h3> +<p>If the request is urgent, and you have the capacity, help. If it's not urgent, maybe ask to create a ticket. If it is urgent, but you don't have the knowledge or the capacity to help, try to defer the request to another colleague who might be able to help. You could also provide some quick tips and hints, so that the requester can resolve the issue by himself. You may also ask the person to come back a few hours later. Also, make it transparent to the requester why you might not have the time right now, as this can help the person to review his own priorities or to escalate. </p> +<h3>Escalation is only a tool</h3> +<p>Side note on escalation: Never make it personally. The only forms of escalation should be due to technical issues or lack of work resources. An escalation then becomes like a math equation and does not need human resources involved. So per-se, an escalation is nothing negative, but just a process people can follow to form decision-making. In a good company with a flat hierarchy, escalations tend to be an exception though, as staff know how to deal with the things by themselves without bothering management too much. </p> +<h2>Think positively</h2> +<p>If times are very stressful, think that it could be worse:</p> +<ul> +<li>Nobody is dying, we are only doing some IT stuff.</li> +<li>Your time after work is your own time, look forward to time with your family or a nice dinner or your favourite sports class.</li> +<li>You probably will never run out of work in the IT sector. So you will always be able to make a living.</li> +<li>Your IT job and life is actually pretty good (e.g. compared to a homeless person or a cleaner). You are probably part of the world's top 1% regarding salary and life standard.</li> +</ul> +<h2>Go slower even if you could go faster</h2> +<p>When working in a team, you may feel that you could get done things faster when you just did everything by yourself. This can be a bit frustrating at times, as you might need to work late hours and also might need to explain things over and over again to others.</p> +<h3>You work in a team</h3> +<p>Security is a team sport. So slow down and make sure that everyone is on track with the goals. You can go full-speed with your very own subtasks, though. Not everyone knows how to use all the tools so well like a full-time DevOps person. As a DevOps person, you are not a security expert, though. Security experts are different people in your company, but DevOps will be the main tribe deploying mitigations (following the security recommendations) and management will be the main tribe coordinating all the efforts. So even if you think that you can do everything faster by your own, can you really?</p> +<p>(PS: When I mean DevOps, I also mean Site Reliability Engineers and Sysadmins. I believe SRE and DevOps are just new words for Sysadmins, in most cases).</p> +<h3>Don't rush to prevent errors</h3> +<p>Slowing down also helps to avoid errors. Don't rush it, even if the task you are working on is urgent. Try to be quick, but don't rush it. Maybe you are writing a script to mitigate a production issue. You could others peer review that script, for example. Their primary programming language may not be the same (e.g. Java vs Ruby), but they would understand the logic (Or let another DevOps person from your company with good scripting skills review your mitigation, but he then may lack the domain knowledge of the software you are patching.</p> +<a class="textlink" href="https://buetow.org/gemfeed/2021-10-22-defensive-devops.html">Read also "Defensive DevOps" about deploying mitigation scripts.</a><br /> +<p>So relax, don't always expect immediate results right away. Set clear and reasonable expectations to the management about the mitigations. You are not a superhero who has to do everything by yourself. Sometimes, you will miss a deadline. But that will have a good reason. Don't rush to complete just to meet a deadline. </p> +<h2>You are not a superhero</h2> +<p>Always keep that in mind. You can't solve all problems by your own. Maybe you could, but that would be a lot of additional pressure and stress (and this will reflect to your personal life). Also, Superman and Wonder Woman receive probably much higher salaries than you do ;-).</p> +<p>I have been a superhero multiple times mitigating critical incidents, and I was proud about it. But actually, I should not have been proud, as for everything there should be other people around who should be able to resolve an incident. No company should rely on a single person, there must always be a substitute. You are not a superhero and as harsh as it sounds, everyone is replaceable. Every superhero can be replaced with another superhero. The only thing it takes is time to get to know the infrastructure and tools very well, paired with work dedication.</p> +<p>This doesn't mean, that you shouldn't try your best. But you don't need to try to be the superhero. Maybe someone else will be the superhero, but that's OK as long as it's not always the same person every time. Everyone can have a good day after all. </p> +<h3>Give away some of your superpowers</h3> +<p>If you are a superhero, try to give away some of your superpowers, so that you can relax in the evening knowing that others (e.g. the on-call engineer of your team) knows how to tackle things. Every member of the team needs to do DevOps (even the team managers, in my humble opinion). Some may be less experienced than others or have other expertises, but to counteract this you could document the recurring tasks so that they are easy to follow (which then later could be either fully fixed or automated away).</p> +<p>So you are not a superhero. Or, if you are a superhero, then all colleagues should be superheroes too.</p> +<h2>Don't jump on all problems immediately</h2> +<p>In order to distribute the troubleshooting skills across the team, you should not jump on every problem immediately. Leave some space for others to resolve the issue. This is where the best learning happens. Nobody will learn from you when you solve all problems. People might learn something after you explained what you did, but the takeaways will be minimal compared to when people try to resolve issues by themselves. Always be available for questions which will help your colleagues to steer into the right direction and if you think it helps, give them some tips resolving the issue, even if they didn't ask for it. Sometimes, engineers are too proud to ask.</p> +<p>There is an exception, though: If the issue is a very critical one, then you might better off trying to resolve it as fast as possible with your full powers in order to avoid any major damage to the company. Best, in a team-effort though, but that's not always the fastest way, unfortunately. So in this particular circumstance, the company may be better off being saved by a single superhero. Make sure that the problem will not occur again or, at least, that others can fix it the next time without Superman flying in.</p> +<h2>Force breaks; and shutdown now</h2> +<p>Be strict about your time off. Nowadays, tech workers check their messages also out of office hours and are reachable 24/7. This really should only the case when you are on-call, to be honest (or if you work for a startup). All other out-of-office time is owned by you and not your employer. You have signed an 40 hour/week and not 7 days/week contract. Of course, there will be always some sort of flexibility and exceptions. You might need to work over the weekend to get a migration done or a problem solved. But to balance it out, you should have other days off.</p> +<p>It's important to shut down your brain from work during your breaks (be strict with your breaks, leave your desk for lunch or for a walk early afternoon and if you aren't on-call also don't take your work-phone with you). You will be happier and also much more energized and productive in the afternoon. Also, when you are reachable 24/7, your colleagues will start to think that you don't have anything more important to do than work.</p> +<h2>Block time every day for personal advance</h2> +<p>It does not matter how many tasks are in your backlog or how many issues are to be resolved. *Always* find time for personal advance. At the end of the day, you will have a nice feeling that you have accomplished something meaningful. This can be an interesting project or learning a new technology you are interested in. Of course, there must be consensus with your manager. </p> +<p>If you are too busy at work and just can't block time, then maybe it's time to think about alternatives. But before you do that, probably there is something else you can do. Perhaps you just think you can't block time, but you would be surprised to hear from your manager that he will fully support you. Of course, he won't agree to you working full-time on your pet projects. But a certain portion of your time should be allocated for personal advance. After all, your employer also want's you to stay happy so that you don't look for alternatives. It's of everyone's interest that you like your job and stay motivated. The more you are motivated, the more productive you will be. The more productive you are, the more valuable you are for the company.</p> +<p>E-Mail me your thoughts at comments@mx.buetow.org!</p> + </div> + </content> + </entry> + <entry> <title>Bash Golf Part 1</title> <link href="https://buetow.org/gemfeed/2021-11-29-bash-golf-part-1.html" /> <id>https://buetow.org/gemfeed/2021-11-29-bash-golf-part-1.html</id> @@ -330,10 +414,10 @@ bash: 1: command not found... <p>For these kinds of expressions it's always better to use "let" though. And you should also use $((...expression...)) instead of the old (deprecated) way $[ ...expression... ] like this example demonstrates:</p> <pre> ❯ declare j=0 -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) -❯ let i=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) +❯ let j=$((j + 1)) ❯ echo $j 4 </pre> diff --git a/gemfeed/index.html b/gemfeed/index.html index 0155ddee..3292c868 100644 --- a/gemfeed/index.html +++ b/gemfeed/index.html @@ -4,74 +4,12 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>buetow.org's Gemfeed</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>buetow.org's Gemfeed</h1> <h2>Having fun with computers!</h2> +<a class="textlink" href="./2021-12-26-how-to-stay-sane-as-a-devops-person.html">2021-12-26 (1975 words) - How to stay sane as a DevOps person </a><br /> <a class="textlink" href="./2021-11-29-bash-golf-part-1.html">2021-11-29 (1182 words) - Bash Golf Part 1</a><br /> <a class="textlink" href="./2021-10-22-defensive-devops.html">2021-10-22 (2276 words) - Defensive DevOps</a><br /> <a class="textlink" href="./2021-09-12-keep-it-simple-and-stupid.html">2021-09-12 (1365 words) - Keep it simple and stupid</a><br /> diff --git a/gemfeed/style.css b/gemfeed/style.css new file mode 100644 index 00000000..3eeced17 --- /dev/null +++ b/gemfeed/style.css @@ -0,0 +1,61 @@ +body { + margin: auto; + padding-left: 10px; + padding-right: 10px; + max-width: 900px; + font-family: "courier new"; + background-color: #ffffff; + color: #000000; +} + +h1,h2,h3 { + color: #55bc90; +} + +a { + color: #174f14; + text-decoration: none; +} + +a:hover { + color: #c0f; + text-decoration: none; +} + +li { + color: #174f14; +} + +img { + max-width: 600px; + max-height: 400px; + display: block; + margin: auto; +} + +pre { + display: block; + background-color: #111; + color: #66cdaa; + padding: 5px; + overflow-x: auto; +} + +a.textlink:before { + content: " ⇒ "; + padding-left: 2px; +} + +p.quote { + color: #174f14; +} + +p.quote:before { + content: " « "; + padding-left: 2px; +} + +p.quote:after { + content: " » "; + padding-right: 2px; +} @@ -5,70 +5,7 @@ <title>fprintf(stderr, 'Hello world ');</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>fprintf(stderr, "Hello world\n");</h1> @@ -109,6 +46,7 @@ p.quote:after { <a class="textlink" href="./gemfeed/index.html">Subscribe to this blog's Gemfeed</a><br /> <h3>Posts</h3> <p>I have switched blog software multiple times. I might be backfilling some of the older articles here. So please don't wonder when suddenly old posts appear here.</p> +<a class="textlink" href="./gemfeed/2021-12-26-how-to-stay-sane-as-a-devops-person.html">2021-12-26 - How to stay sane as a DevOps person </a><br /> <a class="textlink" href="./gemfeed/2021-11-29-bash-golf-part-1.html">2021-11-29 - Bash Golf Part 1</a><br /> <a class="textlink" href="./gemfeed/2021-10-22-defensive-devops.html">2021-10-22 - Defensive DevOps</a><br /> <a class="textlink" href="./gemfeed/2021-09-12-keep-it-simple-and-stupid.html">2021-09-12 - Keep it simple and stupid</a><br /> diff --git a/other-resources.html b/other-resources.html index f2c05583..07435683 100644 --- a/other-resources.html +++ b/other-resources.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Other resources</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Other resources</h1> @@ -101,7 +38,7 @@ _-" . ' + . . ,//////0\ | /00HHHHHHHMMMMM <ul> <li>2001 - Revelation Space (en) / Unendlichkeit (de) - Revelation Space Universe</li> <li>2003 - Chasm City - Revelation Space Universe</li> -<li>2004 - Redemption Ark (en) / Die Arche (de) - Revelation Space Universe - Currently Reading</li> +<li>2004 - Redemption Ark (en) / Die Arche (de) - Revelation Space Universe</li> </ul> <h3>Arthur C. Clarke</h3> <ul> @@ -134,12 +71,12 @@ _-" . ' + . . ,//////0\ | /00HHHHHHHMMMMM <ul> <li>1949 - 1984, George Orwell, Audio book</li> <li>1979 - The Hitchhikers Guide to the Galaxy (en) / Per Anhalter durch die Galaxis (de), Adam Douglas - All books of the series</li> +<li>1987 - Consider Pheblas (en) / Bedenke Pheblas (de), Ian Banks - Currently reading</li> <li>2009 - Quest, Andreas Eschbach</li> <li>2010 - The Icarus Hunt (en) / Jagt auf Ikarus (de), Timothy Zahn</li> </ul> <h3>Unread books already in my shelf</h3> <ul> -<li>1987 - Consider Pheblas (en) / Bedenke Pheblas (de), Ian Banks</li> <li>2004 - Absolution Gap (en) / Offenbarung (de) - Revelation Space Universe, Alastair Reynolds</li> <li>2019 - Eklipse (de), Andreas Brandhorst</li> </ul> diff --git a/resources.html b/resources.html index 2f9a7e71..de438b5d 100644 --- a/resources.html +++ b/resources.html @@ -4,70 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Resources</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> -<style type="text/css"> -body { - margin: auto; - padding-left: 10px; - padding-right: 10px; - max-width: 900px; - font-family: sans-serif; - font-size: 18px; - background-color: #222; - color: #ffffef; -} - -h1,h2,h3 { - color: #ffa500 -} - -a { - color: #0ca; - text-decoration: none; -} - -a:hover { - color: #c0f; - text-decoration: none; -} - -li { - color: #00bcd4; -} - -img { - max-width: 600px; - max-height: 400px; - display: block; - margin: auto; -} - -pre { - display: block; - background-color: #111; - color: #66cdaa; - padding: 5px; - overflow-x: auto; -} - -a.textlink:before { - content: " ⇒ "; - padding-left: 2px; -} - -p.quote { - color: #82eefd; -} - -p.quote:before { - content: " « "; - padding-left: 2px; -} - -p.quote:after { - content: " » "; - padding-right: 2px; -} -</style> +<link rel="stylesheet" href="style.css" /> </head> <body> <h1>Resources</h1> @@ -86,34 +23,35 @@ p.quote:after { </pre> <h2>Technical books</h2> <ul> -<li>Advanced Bash-Scripting Guide; Not an actual book, but could be</li> -<li>Data Science at the Command Line; Jeroen Janssens; O'Reilly</li> -<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li> -<li>Effective awk programming; Arnold Robbins; O'Reilly</li> -<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li> -<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly</li> -<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly</li> -<li>Java ist auch eine Insel; Christian Ullenboom; </li> -<li>Developing Games in Java; David Brackeen and others...; New Riders</li> -<li>21st Century C: C Tips from the New School; Ben Klemens; O'Reilly</li> <li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li> +<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly</li> +<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li> +<li>Pro Git; Scott Chacon, Ben Straub; Apress</li> +<li>The Docker Book; James Turnbull; Kindle</li> <li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li> -<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li> -<li>Concurrency in Go; Katherine Cox-Buday; O'Reilly</li> -<li>The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional</li> +<li>Developing Games in Java; David Brackeen and others...; New Riders</li> <li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li> -<li>Modern Perl; Chromatic ; Onyx Neon Press</li> +<li>Java ist auch eine Insel; Christian Ullenboom; </li> +<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li> +<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li> +<li>Data Science at the Command Line; Jeroen Janssens; O'Reilly</li> <li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li> -<li>C++ Programming Language; Bjarne Stroustrup;</li> -<li>The Docker Book; James Turnbull; Kindle</li> -<li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li> <li>Site Reliability Engineering; How Google runs production systems; O'Reilly</li> -<li>DNS and BIND; Cricket Liu; O'Reilly</li> -<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li> +<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li> +<li>Modern Perl; Chromatic ; Onyx Neon Press</li> <li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly</li> -<li>Pro Git; Scott Chacon, Ben Straub; Apress</li> +<li>Effective awk programming; Arnold Robbins; O'Reilly</li> +<li>The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional</li> +<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly</li> +<li>DNS and BIND; Cricket Liu; O'Reilly</li> +<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly</li> +<li>Concurrency in Go; Katherine Cox-Buday; O'Reilly</li> <li>Funktionale Programmierung; Peter Pepper; Springer</li> -<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly</li> +<li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li> +<li>C++ Programming Language; Bjarne Stroustrup;</li> +<li>Advanced Bash-Scripting Guide; Not an actual book, but could be</li> +<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li> +<li>21st Century C: C Tips from the New School; Ben Klemens; O'Reilly</li> </ul> <h2>Technical bibles</h2> <p>I didn't read them from the beginning to the end, but I am using them to look up things.</p> diff --git a/style.css b/style.css new file mode 100644 index 00000000..3eeced17 --- /dev/null +++ b/style.css @@ -0,0 +1,61 @@ +body { + margin: auto; + padding-left: 10px; + padding-right: 10px; + max-width: 900px; + font-family: "courier new"; + background-color: #ffffff; + color: #000000; +} + +h1,h2,h3 { + color: #55bc90; +} + +a { + color: #174f14; + text-decoration: none; +} + +a:hover { + color: #c0f; + text-decoration: none; +} + +li { + color: #174f14; +} + +img { + max-width: 600px; + max-height: 400px; + display: block; + margin: auto; +} + +pre { + display: block; + background-color: #111; + color: #66cdaa; + padding: 5px; + overflow-x: auto; +} + +a.textlink:before { + content: " ⇒ "; + padding-left: 2px; +} + +p.quote { + color: #174f14; +} + +p.quote:before { + content: " « "; + padding-left: 2px; +} + +p.quote:after { + content: " » "; + padding-right: 2px; +} |
