Browse Source

Nicht mehr bulma, sondern lanyon

feature/bulma
Christian Aust 1 month ago
parent
commit
5b0f080f87
  1. 15
      .editorconfig
  2. 52
      .gitignore
  3. 2
      .ruby-gemset
  4. 2
      .ruby-version
  5. 8
      404.md
  6. 30
      Dockerfile
  7. 40
      Gemfile
  8. 31
      Gemfile.lock
  9. 7
      LICENSE.md
  10. 5
      README.md
  11. 22
      Rakefile
  12. 55
      _config.orig.yml
  13. 133
      _config.yml
  14. 30
      _includes/head.html
  15. 34
      _includes/sidebar.html
  16. 16
      _includes/tracking.html
  17. 10
      _layouts/compress.html
  18. 35
      _layouts/default.html
  19. 11
      _layouts/page.html
  20. 30
      _layouts/post.html
  21. 0
      _plugins/plantuml.jar
  22. 8
      _plugins/plantuml.rb
  23. 0
      _plugins/related.rb
  24. 1
      _posts/2015-07-03-schatten-it.md
  25. 1
      _posts/2015-08-05-problem-der-eda-schnittstellen.md
  26. 1
      _posts/2015-10-13-excel-allein-ist-keine-digitalisierung.md
  27. 1
      _posts/2015-12-22-wissenswertes-uber-schotter.md
  28. 1
      _posts/2016-04-04-digitalisierung-vs-diskretion.md
  29. 1
      _posts/2016-06-01-welchen-wert-hat-qualitaet.md
  30. 1
      _posts/2016-08-21-sprechen-wir-uber-geld.md
  31. 1
      _posts/2016-08-26-risiko-top-programmierer.md
  32. 1
      _posts/2016-11-11-in-geiselhaft.md
  33. 1
      _posts/2018-12-02-wieder-online.md
  34. 1
      _posts/2018-12-12-spielt.md
  35. 1
      _posts/2018-12-19-2018.md
  36. 5
      _posts/2019-01-05-matomo-mit-docker.md
  37. 1
      _posts/2019-01-09-alles-beim-alten.md
  38. 10
      _posts/2019-01-26-docker-einsatz-sorgfaeltig-pruefen.md
  39. 11
      _posts/2019-02-15-das-ruby-labor.md
  40. 6
      _posts/2019-03-16-regain-it-nur-selber-denken-macht-schlau.md
  41. 6
      _posts/2019-04-13-keine-kekse.md
  42. 6
      _posts/2019-05-04-7-dinge-die-ich-aus-meiner-selbstaendigkeit-gelernt-habe.md
  43. 6
      _posts/2019-08-07-unglaublich-agil.md
  44. 7
      _posts/2019-08-15-lvm-system-vergroessern.md
  45. 6
      _posts/2019-09-01-vorteil-statischer-cms.md
  46. 3
      _posts/2019-09-29-alles-unter-kontrolle.md
  47. 7
      _posts/2019-11-24-software-standards.md
  48. 7
      _posts/2019-12-01-tech-recruiting.md
  49. 5
      _posts/2019-12-06-pendlerpauschale.md
  50. 6
      _posts/2020-01-09-schilde-hoch-fail2ban-und-ufw.md
  51. 6
      _posts/2020-03-14-telefonie-anno-2020.md
  52. 6
      _posts/2020-06-15-meine-docker-sammlung.md
  53. 22
      _posts/2021-01-24-neue-firewall-hardware.md
  54. 28
      atom.xml
  55. 10
      datenschutz.md
  56. 37
      index.html
  57. 0
      keybase.txt
  58. BIN
      public/apple-touch-icon-precomposed.png
  59. 562
      public/css/lanyon.css
  60. 430
      public/css/poole.css
  61. 65
      public/css/syntax.css
  62. 0
      public/favicon.ico
  63. 0
      public/images/cartridge.jpg
  64. 0
      public/images/christian_aust.jpg
  65. 0
      public/images/desk.jpg
  66. 0
      public/images/favicon-16x16.png
  67. 0
      public/images/favicon-32x32.png
  68. 0
      public/images/logo.svg
  69. 0
      public/images/matomo-setup.svg
  70. 0
      public/images/matomo.png
  71. 0
      public/images/monowall-appliance.jpg
  72. 0
      public/images/opnsense-dashboard.png
  73. 0
      public/images/ruby-lab.svg
  74. 1
      public/images/uml/db378f2f25dae71cccf02a2a6e2471c8.svg
  75. 0
      public/images/yanling-nuc-j3160.jpg
  76. 15
      public/js/script.js
  77. 32
      source/404.html
  78. 0
      source/_drafts/.keep
  79. 21
      source/_drafts/2020-09-14-bist-du-senior-oder-nur-alt.md
  80. 16
      source/_drafts/2021-01-10-entspannt-euch-mal.md
  81. 2
      source/_includes/comments.html
  82. 15
      source/_includes/footer.html
  83. 54
      source/_includes/head.html
  84. 32
      source/_includes/header.html
  85. 13
      source/_includes/hero.html
  86. 23
      source/_includes/pagination.html
  87. 31
      source/_includes/post-card.html
  88. 43
      source/_includes/seo.html
  89. 20
      source/_includes/share-buttons.html
  90. 18
      source/_layouts/blog.html
  91. 11
      source/_layouts/default.html
  92. 13
      source/_layouts/page.html
  93. 43
      source/_layouts/post.html
  94. 15
      source/_layouts/redirect.html
  95. 10
      source/_plugins/flatify.rb
  96. 119
      source/_plugins/image.rb
  97. 0
      source/_posts/.keep
  98. 13
      source/_posts/2019-01-03-geschlossen.md
  99. 24
      source/_posts/2019-06-14-tiefschwarz.md
  100. 5
      source/assets/css/app.scss

15
.editorconfig

@ -0,0 +1,15 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.py]
indent_style = space
indent_size = 4

52
.gitignore

@ -1,23 +1,43 @@
# Ignore metadata generated by Jekyll
# Ignore docs files
_gh_pages
_site
.sass-cache
.jekyll-cache/
.jekyll-metadata
.ruby-version
.jekyll-cache
# Ignore folders generated by Bundler
.bundle/
vendor/
# Numerous always-ignore extensions
*.diff
*.err
*.orig
*.log
*.rej
*.swo
*.swp
*.zip
*.vi
*~
# Ignore JS modules
node_modules
# Sublime Editor project files
# OS or Editor folders
.DS_Store
._*
Thumbs.db
.cache
.project
.settings
.tmproj
*.esproj
nbproject
*.sublime-project
*.sublime-workspace
/.project
.idea
# OSX specific files
.DS_Store
# Komodo
*.komodoproject
.komodotools
# grunt-html-validation
validation-status.json
validation-report.json
# generated uml files
source/assets/uml/*.svg
# Folders to ignore
node_modules
bower_components

2
.ruby-gemset

@ -1 +1 @@
jekyll
swc-jekyll-poole

2
.ruby-version

@ -1 +1 @@
ruby-2.7.1
ruby-2.7.2

8
404.md

@ -0,0 +1,8 @@
---
layout: default
title: "404: Page not found"
permalink: 404.html
---
# 404: Page not found
Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. [Head back home]({{ site.url }}) to try finding it again.

30
Dockerfile

@ -1,30 +0,0 @@
# Jekyll build
#
FROM jekyll/jekyll:4.2.0 as builder
ENV TZ=Europe/Berlin \
JEKYLL_ENV=production \
PLANTUML_VERSION=1.2021.0
RUN apk add --upgrade --no-cache imagemagick openjdk8-jre graphviz ttf-droid ttf-droid-nonlatin curl
RUN mkdir /site && chown -R jekyll:jekyll /site
USER jekyll
WORKDIR /site
COPY --chown=jekyll:jekyll Gemfile* /site/
RUN bundle install --deployment
COPY --chown=jekyll:jekyll _config.yml /site/
COPY --chown=jekyll:jekyll source /site/source
RUN jekyll build
# nginx runtime
#
FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder --chown=nginx:nginx /site/_site/ /usr/share/nginx/html

40
Gemfile

@ -1,16 +1,32 @@
source 'https://rubygems.org'
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem 'jekyll'
gem 'rouge'
gem 'mini_magick'
gem "jekyll", "~> 4.2.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
# gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
gem 'jekyll-feed'
gem 'jekyll-last-modified-at'
gem 'jekyll-paginate'
gem 'jekyll-compose'
gem 'jekyll-sitemap'
gem 'jekyll-redirect-from'
gem "jekyll-feed", "~> 0.12"
gem "jekyll-paginate"
gem "jekyll-seo-tag"
end
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
platforms :mingw, :x64_mingw, :mswin, :jruby do
gem "tzinfo", "~> 1.2"
gem "tzinfo-data"
end
# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]

31
Gemfile.lock

@ -29,20 +29,13 @@ GEM
rouge (~> 3.0)
safe_yaml (~> 1.0)
terminal-table (~> 2.0)
jekyll-compose (0.12.0)
jekyll (>= 3.7, < 5.0)
jekyll-feed (0.15.1)
jekyll (>= 3.7, < 5.0)
jekyll-last-modified-at (1.3.0)
jekyll (>= 3.7, < 5.0)
posix-spawn (~> 0.3.9)
jekyll-paginate (1.1.0)
jekyll-redirect-from (0.16.0)
jekyll (>= 3.3, < 5.0)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-seo-tag (2.7.1)
jekyll (>= 3.8, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.3.1)
@ -54,10 +47,8 @@ GEM
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
mini_magick (4.11.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
posix-spawn (0.3.15)
public_suffix (4.0.6)
rb-fsevent (0.11.0)
rb-inotify (0.10.1)
@ -72,18 +63,16 @@ GEM
unicode-display_width (1.7.0)
PLATFORMS
ruby
x86_64-darwin-17
DEPENDENCIES
jekyll
jekyll-compose
jekyll-feed
jekyll-last-modified-at
jekyll (~> 4.2.0)
jekyll-feed (~> 0.12)
jekyll-paginate
jekyll-redirect-from
jekyll-sitemap
mini_magick
rouge
jekyll-seo-tag
tzinfo (~> 1.2)
tzinfo-data
wdm (~> 0.1.1)
BUNDLED WITH
2.1.4
2.2.4

7
LICENSE → LICENSE.md

@ -1,8 +1,9 @@
MIT License
Copyright (c) 2018 Christian Aust
# Released under MIT License
Copyright (c) 2014 Mark Otto.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

5
README.md

@ -1,5 +0,0 @@
# software-berater.net
[![Build Status](https://drone.software-berater.net/api/badges/christian/software-berater.net/status.svg)](https://drone.software-berater.net/christian/software-berater.net)
Meine Homepage.

22
Rakefile

@ -1,22 +0,0 @@
require 'cgi'
require 'open-uri'
SITEMAP = 'https://software-berater.net/sitemap.xml'
desc "Ping Google, Bing"
task :ping do
index_location = CGI.escape(SITEMAP)
{
google: "http://www.google.com/webmasters/sitemaps/ping?sitemap=#{index_location}",
bing: "http://www.bing.com/webmaster/ping.aspx?siteMap=#{index_location}",
sitemap_writer: "http://www.sitemapwriter.com/notify.php?crawler=all&url=#{index_location}"
}.each do |engine, link|
begin
open(link)
puts "Successful ping of #{engine}"
rescue Timeout::Error, StandardError => e
puts "Ping failed for #{engine}: #{e.inspect}"
end
end
end

55
_config.orig.yml

@ -0,0 +1,55 @@
# Welcome to Jekyll!
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
#
# If you need help with YAML syntax, here are some quick references for you:
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
title: Your awesome title
email: your-email@example.com
description: >- # this means to ignore newlines until "baseurl:"
Write an awesome description for your new site here. You can edit this
line in _config.yml. It will appear in your document head meta (for
Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username: jekyll
# Build settings
theme: minima
plugins:
- jekyll-feed
# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
# exclude:
# - .sass-cache/
# - .jekyll-cache/
# - gemfiles/
# - Gemfile
# - Gemfile.lock
# - node_modules/
# - vendor/bundle/
# - vendor/cache/
# - vendor/gems/
# - vendor/ruby/

133
_config.yml

@ -1,95 +1,56 @@
# SEO settings
title: Software-Berater
author:
name: Christian Aust
url: https://software-berater.net/ueber-mich/
description: Christian Aust, Software Berater. Meine Themen sind Software-Entwicklung, Internet und DevOps Automatisierung.
keywords:
- Christian Aust
- Developer
- DevOps
- Software
url: https://software-berater.net
cover: assets/images/desk.jpg
host: 0.0.0.0
# social settings
og_locale: "de_DE"
locale: de
timezone: Europe/Berlin
# Setup
title: Software Berater
tagline: '#neuland seit 1993'
description: 'Erfahrung ist der Name, mit dem jeder seine Dummheiten bezeichnet.'
url: https://software-berater.net
baseurl: ''
paginate: 5
locale: de_DE
timezone: Europe/Berlin
date:
format: "%d.%m.%Y"
theme_color: "#a80000"
format: "%d.%m.%Y"
google_site_verification: lOfN2lZ-loEQSEgj0342kxaOvyyuiiL7C7THFpxS_iY
# Build settings
permalink: /:year/:title/
markdown: kramdown
highlighter: rouge
kramdown:
transliterated_header_ids: true
input: GFM
auto_ids: true
syntax_highlighter: rouge
paginate: 6
paginate_path: "/page/:num/"
comments: false
source: source
destination: _site
exclude:
- .keep
- assets/scss
- assets/images/_fullsize
# Sass configuration
permalink: /:year/:title/
markdown: kramdown
highlighter: rouge
sass:
sass_dir: assets/scss
style: compressed # compressed, expanded
line_comments: false
style: compressed
redirect_from:
json: false
# Gems
plugins:
- jekyll-feed
- jekyll-paginate
- jekyll-seo-tag
resize:
source: assets/images/_fullsize
output: assets/images/generated
presets:
header:
width: 1200
card:
width: 600
height: 300
users:
attr:
class: user-portrait
itemprop: image
width: 350
exclude:
- .gitignore
- .git
- LICENSE.md
- '*.sublime-*'
# navbar pages
navigation:
- link : /themen/
name: Themen
- link : /ueber-mich/
name: Über mich
- link : /blogroll/
name: Blogroll
# Markdown settings
kramdown:
transliterated_header_ids: true
input: GFM
auto_ids: true
syntax_highlighter: rouge
# footer links
footer:
- link: /impressum/
name: Impressum
- link: /Datenschutz/
name: Datenschutz
- link: /feed.xml
name: RSS
# Custom vars
tracking:
id: 1
url: https://stats.software-berater.net
blogroll:
- url: https://it-fettchen.de/
title: DesastrÖÖs - IT-F(r)ettchens Projektwelt
- url: http://www.dkriesel.com/
title: David Kriesel, Data Science
- url: https://www.sistrix.de/news/
title: Der Sistrix SEO Blog
# About/contact
author:
name: Christian Aust
url: https://software-berater.net
email: datenimperator@gmail.com
social:
links:
- https://www.linkedin.com/in/christianaust/
- https://github.com/datenimperator
- https://repl.it/@ChristianAust
- https://keybase.io/datenimperator

30
_includes/head.html

@ -0,0 +1,30 @@
<head>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>
{% if page.title == "Home" %}
{{ site.title }} &middot; {{ site.tagline }}
{% else %}
{{ page.title }} &middot; {{ site.title }}
{% endif %}
</title>
{% if page.url and site.baseurl %}
<link rel="canonical" href="{{ page.url | absolute_url }}">
{% endif %}
<link rel="stylesheet" href="{{ '/public/css/poole.css' }}">
<link rel="stylesheet" href="{{ '/public/css/syntax.css' }}">
<link rel="stylesheet" href="{{ '/public/css/lanyon.css' }}">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700%7CPT+Sans:400">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ '/public/apple-touch-icon-precomposed.png'}}">
<link rel="shortcut icon" href="{{ '/public/favicon.ico' }}">
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ '/atom.xml' | absolute_url }}">
{% seo %}
</head>

34
_includes/sidebar.html

@ -0,0 +1,34 @@
<!-- Target for toggling the sidebar `.sidebar-checkbox` is for regular
styles, `#sidebar-checkbox` for behavior. -->
<input type="checkbox" class="sidebar-checkbox" id="sidebar-checkbox">
<!-- Toggleable sidebar -->
<div class="sidebar" id="sidebar">
<div class="sidebar-item">
<p>{{ site.description }}</p>
</div>
<nav class="sidebar-nav">
<a class="sidebar-nav-item{% if page.title == 'Start' %} active{% endif %}" href="{{ '/' }}">Start</a>
{% comment %}
The code below dynamically generates a sidebar nav of pages with
`layout: page` in the front-matter. See readme for usage.
{% endcomment %}
{% assign pages_list = site.pages | sort:"url" %}
{% for node in pages_list %}
{% if node.title != null %}
{% if node.layout == "page" %}
<a class="sidebar-nav-item{% if page.url == node.url %} active{% endif %}" href="{{ node.url }}">{{ node.title }}</a>
{% endif %}
{% endif %}
{% endfor %}
</nav>
<div class="sidebar-item">
<p>
&copy; {{ site.time | date: '%Y' }}. Alle Rechte vorbehalten.
</p>
</div>
</div>

16
_includes/tracking.html

@ -0,0 +1,16 @@
{% if site.tracking.id %}
<script type="text/javascript">
var _paq = _paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="{{ site.tracking.url }}";
_paq.push(['setTrackerUrl', u+'/piwik.php']);
_paq.push(['setSiteId', '{{ site.tracking.id }}']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'/piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<noscript><p><img src="{{ site.tracking.url }}/piwik.php?idsite={{ site.tracking.id }}&amp;rec=1" style="border:0;" alt="" /></p></noscript>
{% endif %}

10
_layouts/compress.html

@ -0,0 +1,10 @@
---
# Jekyll layout that compresses HTML
# v3.1.0
# http://jch.penibelst.de/
# © 2014–2015 Anatol Broder
# MIT License
---
{% capture _LINE_FEED %}
{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}</{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "<!-- -->" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "<pre" %}{% assign _content = "" %}{% for _pre_before in _pre_befores %}{% assign _pres = _pre_before | split: "</pre>" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "</pre>" %}<pre{{ _pres.first }}</pre>{% endif %}{% unless _pre_before contains "</pre>" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " <e;<e; </e>;</e>;</e> ;</e>" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} <table id="compress_html_profile_{{ site.time | date: "%Y%m%d" }}" class="compress_html_profile"> <thead> <tr> <td>Step <td>Bytes <tbody> <tr> <td>raw <td>{{ content | size }}{% if _profile_endings %} <tr> <td>endings <td>{{ _profile_endings }}{% endif %}{% if _profile_startings %} <tr> <td>startings <td>{{ _profile_startings }}{% endif %}{% if _profile_comments %} <tr> <td>comments <td>{{ _profile_comments }}{% endif %}{% if _profile_collapse %} <tr> <td>collapse <td>{{ _profile_collapse }}{% endif %}{% if _profile_clippings %} <tr> <td>clippings <td>{{ _profile_clippings }}{% endif %} </table>{% endif %}{% endif %}

35
_layouts/default.html

@ -0,0 +1,35 @@
---
layout: compress
---
<!DOCTYPE html>
<html lang="de-de">
{% include head.html %}
<body class="theme-base-08">
{% include sidebar.html %}
<!-- Wrap is the content to shift when toggling the sidebar. We wrap the
content to avoid any CSS collisions with our real content. -->
<div class="wrap">
<div class="masthead">
<div class="container">
<h3 class="masthead-title">
<a href="{{ site.baseurl }}/" title="Home">{{ site.title }}</a>
<small>{{ site.tagline }}</small>
</h3>
</div>
</div>
<div class="container content">
{{ content }}
</div>
</div>
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
<script src='{{ site.baseurl }}/public/js/script.js'></script>
{% include tracking.html %}
</body>
</html>

11
_layouts/page.html

@ -0,0 +1,11 @@
---
layout: default
---
<div class="page">
<h1 class="page-title">{{ page.title }}</h1>
{% if page.description %}
<p class="page-intro">{{ page.description }}</p>
{% endif %}
{{ content }}
</div>

30
_layouts/post.html

@ -0,0 +1,30 @@
---
layout: default
---
<div class="post">
<h1 class="post-title">{{ page.title }}</h1>
<span class="post-date">{{ page.date | date_to_string }}</span>
{% if page.description %}
<p class="post-intro">{{ page.description }}</p>
{% endif %}
{{ content }}
</div>
{% if page.related.size >= 1 %}
<div class="related">
<h2>Weiteres&hellip;</h2>
<ul class="related-posts">
{% for post in page.related %}
<li>
<h3>
<a href="{{ site.baseurl }}{{ post.url }}">
{{ post.title }}
<small>{{ post.date | date_to_string }}</small>
</a>
</h3>
</li>
{% endfor %}
</ul>
</div>
{% endif %}

0
source/_plugins/plantuml.jar → _plugins/plantuml.jar

8
source/_plugins/plantuml.rb → _plugins/plantuml.rb

@ -45,7 +45,7 @@ module Jekyll
site = context.registers[:site]
name = Digest::MD5.hexdigest(super)
outdir = File.join(site.source, 'assets/uml')
outdir = File.join(site.source, 'public/images/uml')
FileUtils.mkdir_p(outdir) unless File.exists?(outdir)
svg = File.join(outdir, "#{name}.svg")
if File.exists?(svg) && File.size(svg) > 0
@ -65,20 +65,20 @@ module Jekyll
cmd = "cat #{tmpfile.path} | #{config(context)['executable']} #{config(context)['options']} -tsvg > #{svg}"
if system(cmd)
site.static_files << Jekyll::StaticFile.new(
site, site.source, 'assets/uml', "#{name}.svg"
site, site.source, 'public/images/uml', "#{name}.svg"
)
Jekyll.logger.info LOGGER_TOPIC, "File #{svg} created (#{File.size(svg)} bytes)"
else
Jekyll.logger.error LOGGER_TOPIC, "#{cmd} exited with #{$?}"
if File.exists?(svg) && File.size(svg) == 0
File.delete(svg)
Jekyll.logger.info LOGGER_TOPIC, "Deleted empty result file"
Jekyll.logger.info LOGGER_TOPIC, 'Deleted empty result file'
end
raise "PlantUML error"
end
end
"<p><img src='#{site.baseurl}/assets/uml/#{name}.svg' #{@html} class='plantuml'></p>"
"<p><img src='#{site.baseurl}/public/images/uml/#{name}.svg' #{@html} class='plantuml'></p>"
end
end
end

0
source/_plugins/related.rb → _plugins/related.rb

1
source/_posts/2015-07-03-schatten-it.md → _posts/2015-07-03-schatten-it.md

@ -3,7 +3,6 @@ layout: post
archive: true
title: Raus aus der Schatten-IT
date: 2015-07-03
category: [Enterprise, Strategie]
description: >
Schatten-IT ist der Teil der Informationstechnik, den es
eigentlich nicht geben sollte. Sie stellt für Firmen ein

1
source/_posts/2015-08-05-problem-der-eda-schnittstellen.md → _posts/2015-08-05-problem-der-eda-schnittstellen.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: Digitalisierung
title: Am seidenen Faden
date: 2015-08-05
description: >

1
source/_posts/2015-10-13-excel-allein-ist-keine-digitalisierung.md → _posts/2015-10-13-excel-allein-ist-keine-digitalisierung.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: [Enterprise, Digitalisierung]
title: Excel ist keine Digitalisierung
description: >
Alle glauben, die Digitalisierung sei bereits weit vorangeschritten,

1
source/_posts/2015-12-22-wissenswertes-uber-schotter.md → _posts/2015-12-22-wissenswertes-uber-schotter.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: [Unternehmer, Planung]
title: Wissenswertes über Schotter
date: 2015-12-22 09:00 CET
description: >

1
source/_posts/2016-04-04-digitalisierung-vs-diskretion.md → _posts/2016-04-04-digitalisierung-vs-diskretion.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: Strategie
title: Digitalisierung vs Diskretion
date: 2016-04-04
description: >

1
source/_posts/2016-06-01-welchen-wert-hat-qualitaet.md → _posts/2016-06-01-welchen-wert-hat-qualitaet.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: Unternehmer
title: Welchen Wert hat Qualität?
date: 2016-06-01
description: >

1
source/_posts/2016-08-21-sprechen-wir-uber-geld.md → _posts/2016-08-21-sprechen-wir-uber-geld.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: Unternehmer
title: Sprechen wir über Geld
date: 2016-08-21
description: >

1
source/_posts/2016-08-26-risiko-top-programmierer.md → _posts/2016-08-26-risiko-top-programmierer.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: Strategie
title: Risiko Top-Programmierer
date: 2016-08-26
description: >

1
source/_posts/2016-11-11-in-geiselhaft.md → _posts/2016-11-11-in-geiselhaft.md

@ -1,7 +1,6 @@
---
layout: post
archive: true
category: [Enterprise, Strategie]
title: In Geiselhaft
description: >
Hersteller von Software nehmen die Daten ihrer Kunden gefangen,

1
source/_posts/2018-12-02-wieder-online.md → _posts/2018-12-02-wieder-online.md

@ -3,7 +3,6 @@ layout: post
title: Wieder online
date: 2018-12-02 17:55 +0100
description: Nach einer online-Pause habe ich jetzt wieder Lust zu bloggen.
category: Persönliches
---
Veränderungen brauchen ihre Zeit. Gut 10 Monate nachdem ich meine Firma beendete, habe ich jetzt wieder Sinn für eigene Online-Aktivität. Was ich zuvor verwendet habe, ist alles weg: Server, Accounts, die alte Website.

1
source/_posts/2018-12-12-spielt.md → _posts/2018-12-12-spielt.md

@ -2,7 +2,6 @@
layout: post
title: Spielt!
date: 2018-12-12 20:41 +0100
category: Entwickler
---

1
source/_posts/2018-12-19-2018.md → _posts/2018-12-19-2018.md

@ -2,7 +2,6 @@
layout: post
title: '2018'
date: 2018-12-19 20:46 +0100
category: Persönliches
---
**Das war ein Ritt.** Das Jahr ist fast rum, mein Wechsel aus der Selbständigkeit in das Angestelltendasein ist vollbracht. Aber das Abschließen aller Aktivitäten war recht mühsam.

5
source/_posts/2019-01-05-matomo-mit-docker.md → _posts/2019-01-05-matomo-mit-docker.md

@ -1,7 +1,6 @@
---
layout: post
title: Matomo mit Docker
category: Entwickler
description: Ich habe die Software Matomo (früher Piwik) mit Docker auf meinem eigenen Server installiert.
date: 2019-01-05 15:12 +0100
keywords:
@ -16,11 +15,11 @@ keywords:
[Matomo](https://matomo.org) (früher "Piwik") ist eine Software zur Analyse von Zugriffen auf Websites, ähnlich wie Google Analytics. Im Unterschied dazu betreibt man Matomo auf dem eigenen Server, gibt also für die Analyse keine Daten an Dritte weiter. Auch wenn ich privat zahlreiche Google-Dienste nutze, wollte ich für diese Webseite lieber nicht Analytics einsetzen, um die Privatsphäre meiner Leser zu schützen.
![Matomo Ansicht](/assets/images/matomo.png)
![Matomo Ansicht](/public/images/matomo.png)
Nun ist Matomo durchaus recht umfangreich, eine ordentliche Installation nicht *mal eben so* gemacht. Hier bietet sich Docker an, um möglichst wenige Komponenten auf der eigenen Maschine installieren (und pflegen!) zu müssen. Schematisch schaut das dann so aus:
![Matomo Setup](/assets/images/matomo-setup.svg)
![Matomo Setup](/public/images/matomo-setup.svg)
Der nginx-Server oben nimmt Webanfragen entgegen, den habe ich sowieso installiert. Dort sind auch SSL-Zertifikate hinterlegt. Nginx wiederum gibt als *reverse proxy* die Anfragen weiter an 3 separate Prozesse, die als Docker Container laufen:

1
source/_posts/2019-01-09-alles-beim-alten.md → _posts/2019-01-09-alles-beim-alten.md

@ -2,7 +2,6 @@
layout: post
title: Alles beim Alten
date: 2019-01-09 13:01 +0100
category: Strategie
description: "Wenn die Leute nach Digitalisierung rufen, meinen sie meistens: Weniger Nerv. as ist alles schön und gut. Meistens bedeutet es aber in der Praxis auch, dass althergebrachte Vorgänge digital eins zu eins abgebildet werden."
references:
- _posts/2015-10-13-excel-allein-ist-keine-digitalisierung.md

10
source/_posts/2019-01-26-docker-einsatz-sorgfaeltig-pruefen.md → _posts/2019-01-26-docker-einsatz-sorgfaeltig-pruefen.md

@ -1,13 +1,8 @@
---
layout: post
date: 2019-01-26 16:38 +0100
title: Docker Einsatz will sorgfältig geprüft sein
description: Wann ist der Einsatz von Docker sinnvoll, was spricht dagegen? Ich betrachte einige Eigenschaften und Anwendungsfälle.
date: 2019-01-26 16:38 +0100
cover:
url: markus-winkler-27ysfpP3BRA-unsplash.jpg
author:
name: "Markus Winkler on Unsplash"
url: "https://unsplash.com/@markuswinkler?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- Docker
- Virtualisierung
@ -15,7 +10,6 @@ keywords:
- Supplier
- Cloud
category: Strategie
---
Seit seiner Einführung 2013 war Docker *der heisse Shice* im Infrastruktur Management. Wie bei neuen Technologien üblich, wurde Docker für alles verwendet: Entwicklung, Tests, Betrieb, Systeme. Prinzip: Wenn ich nur einen Hammer besitze, schaut jedes Problem aus wie ein Nagel. Heute sehen wir das deutlich ruhiger. Wann ist der Einsatz geboten?
@ -28,7 +22,7 @@ Docker ist eine Variante von Containern, die ursprünglich auf Linux-Systemen ve
Während die beiden letzten ganze Betriebssysteme incl Rootzugriff virtualisieren, kapselt Docker Anwendungen mit all ihren Abhängigkeiten wie Bibliotheken und Daten. Trotzdem werden die Begriffe oft synonym verwendet, und Docker kommt auch dann zum Einsatz, wenn der Anwendungszweck eigentlich ein ganzes Betriebssystem erfordern würde.
<img src="/assets/images/fullsize/catridge.jpg">
![Atari 7800 mit Cartridge](/public/images/cartridge.jpg)
Um es klar zu sagen: Docker ist eine Paketierung von lauffähigen Anwendungen, nicht von ganzen Betriebssystemen. Das hat eine Reihe von Konsequenzen:

11
source/_posts/2019-02-15-das-ruby-labor.md → _posts/2019-02-15-das-ruby-labor.md

@ -1,21 +1,14 @@
---
layout: post
title: Das Ruby-Labor
date: 2019-02-15 19:45 +0100
description: Im kommenden Halbjahr werde ich 18 Schülern knapp 4 Monate lang Gelegenheit geben, die Programmierung eines Computers auszuprobieren. Wie schaffe ich eine Infrastruktur, in der alle Kursteilnehmer teilnehmen können?
cover:
url: heylagostechie-IgUR1iX0mqM-unsplash.jpg
author:
name: "heylagostechie on Unsplash"
url: "https://unsplash.com/@heylagostechie?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- ruby
- lxc
- vagrant
- Ansible
date: 2019-02-15 19:45 +0100
category: Entwickler
excerpt: Im kommenden Halbjahr werde ich 18 Schülern knapp 4 Monate lang Gelegenheit geben, die Programmierung eines Computers auszuprobieren. Wie schaffe ich eine Infrastruktur, in der alle Kursteilnehmer teilnehmen können?
---
Ich hatte unserer lokalen [Gesamtschule in Lohmar](https://www.gesamtschule-lohmar.de) schon länger vorgeschlagen, eine Informatik-AG zu unterstützen. Vor ein paar Tagen kam dann die Bestätigung: Im kommenden Halbjahr werde ich 18 Schülern knapp 4 Monate lang Gelegenheit geben, die Programmierung eines Computers auszuprobieren. Wie schaffe ich eine Infrastruktur, in der alle Kursteilnehmer teilnehmen können?
@ -30,7 +23,7 @@ Die Schule verfügt über zwei Computerräume mit insgesamt 40 PCs, auf denen ak
Meine Idee sieht nun vor, dass die Schüler von ihrem PC auf einen virtuellen Server zugreifen, auf dem die erforderlichen Teile vorbereitet sind. Dabei soll möglichst keine Software auf den PCs zusätzlich installiert werden müssen. Der virtuelle Server soll leicht neu aufzusetzen sein, die Einrichtung erfolgt automatisch.
![Ruby Labor Aufbau](/assets/images/ruby-lab.svg)
![Ruby Labor Aufbau](/public/images/ruby-lab.svg)
Die Basis ist somit für mich [Microsoft Remote Desktop](https://support.microsoft.com/de-de/help/17463/windows-7-connect-to-another-computer-remote-desktop-connection). Das ist auf den PCs verfügbar. Da auf dem Zielserver Linux eingesetzt werden soll, kommt dort [xrdp](http://www.xrdp.org) zum Einsatz. Als zentrale Hardware dient mein ThinkPad E470 mit stolzen 16GB RAM, somit soll die Umgebung möglichst schlank und ressourcenschonend laufen. Das erziele ich mit dem [xfce4 Desktop](https://www.xfce.org). Den virtuellen Server erstelle ich erneut mit [Vagrant](https://www.vagrantup.com), die verschiedenen Einstellungen nehme ich im Rahmen der Provisionierung mit [Ansible](https://docs.ansible.com/ansible/latest/index.html) vor.

6
source/_posts/2019-03-16-regain-it-nur-selber-denken-macht-schlau.md → _posts/2019-03-16-regain-it-nur-selber-denken-macht-schlau.md

@ -3,12 +3,6 @@ layout: post
title: "ReGain IT - Nur selber denken macht schlau"
description: Wer nichts mehr kann, ist hilflos. In diesen Zustand haben sich die IT-Abteilungen vieler Firmen manövriert. Aber die Fähigkeit zur digitalen Selbstbestimmung ist in Zukunft entscheidend. Wir müssen wieder lernen, selbst Verantwortung für unsere Informationslandschaft zu übernehmen.
date: 2019-03-16 15:12 +0100
cover:
url: hung-do-mo4UZiHy_KU-unsplash.jpg
author:
name: "Hung Do on Unsplash"
url: "https://unsplash.com/@tpptech?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
category: Strategie
keywords:
- outsourcing
- supplier it

6
source/_posts/2019-04-13-keine-kekse.md → _posts/2019-04-13-keine-kekse.md

@ -3,15 +3,9 @@ layout: post
title: Keine Kekse
date: 2019-04-13 10:52 +0200
description: Um neue Technologien sinnvoll verwenden zu können, werden viel mehr Menschen programmieren lernen müssen, als sich heute bereits damit beschäftigen. Davon sind wir aber noch weit entfernt.
category: Strategie
keywords:
- big data
- machine learning
cover:
url: venus.jpg
author:
name: "Jastrow (2007)"
url: "https://commons.wikimedia.org/w/index.php?curid=1999030"
---

6
source/_posts/2019-05-04-7-dinge-die-ich-aus-meiner-selbstaendigkeit-gelernt-habe.md → _posts/2019-05-04-7-dinge-die-ich-aus-meiner-selbstaendigkeit-gelernt-habe.md

@ -1,12 +1,6 @@
---
layout: post
title: 7 Dinge die ich aus meiner Selbständigkeit gelernt habe
cover:
url: anthony-tori-9qYKMbBCFjc-unsplash.jpg
author:
name: "Anthony Tori on Unsplash"
url: "https://unsplash.com/@anthonytori?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
category: Unternehmer
description: Ich war bisher zwei Mal in meinem Leben wirtschaftlich selbständig. Manches war gut, anderes ein Fehlschlag. Wie sagt man so schön? "Nichts ist so schlecht, dass es nicht wenigstens als schlechtes Beispiel dienen könnte." Na dann mal los.
date: 2019-05-04 21:26 +0200
keywords:

6
source/_posts/2019-08-07-unglaublich-agil.md → _posts/2019-08-07-unglaublich-agil.md

@ -2,13 +2,7 @@
layout: post
title: Unglaublich Agil
date: 2019-08-07 12:56 +0200
category: Strategie
description: Agil zu sein ist das A und O. Alle wollen es, vor allem große Organisationen sehen darin einen Ausweg aus der selbst geschaffenen Bewegungsunfähigkeit. Spotify ist als Vorbild in aller Munde. Aber kann es funktionieren, einfach die Schweden zu kopieren?
cover:
url: anupam-mahapatra-Vz0RbclzG_w-unsplash.jpg
author:
name: "Anupam Mahapatra on Unsplash"
url: "https://unsplash.com/@mister_a?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- agil
- transformation

7
source/_posts/2019-08-15-lvm-system-vergroessern.md → _posts/2019-08-15-lvm-system-vergroessern.md

@ -3,17 +3,12 @@ layout: post
title: LVM System vergrößern
date: 2019-08-15 19:46 +0200
description: Mehr CPU, RAM, Festplatte? Virtuell kein Problem. Aber wie aktiviert man den neu gewonnenen Reichtum? Ich zeige, wie das auf der Basis von Linux und LVM funktioniert.
category: Entwickler
cover:
url: henry-perks-BYm1kkFasEI-unsplash.jpg
author:
name: "herny perks on Unsplash"
url: "https://unsplash.com/@hjkp?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- linux
- lvm
- kvm
- resize
---
Die freundlichen Menschen bei [Tänzer Medien](https://taenzer.de) waren so nett, mir mehr Platz am Server zuzuweisen: Mehr CPU-Kerne, mehr RAM, mehr Festplatte. Da Tänzer (wie ich früher auch) auf Proxmox als Virtualisierungsbasis setzt, ist das eine KVM Maschine. Da man in meinem Alter :-) *Kopf wie Sieb* haben darf, muss ich aufschreiben, wie das Resizing funktioniert.

6
source/_posts/2019-09-01-vorteil-statischer-cms.md → _posts/2019-09-01-vorteil-statischer-cms.md

@ -2,12 +2,6 @@
layout: post
title: Vorteil von statischen CMS
date: 2019-09-01 17:14 +0200
category: Entwickler
cover:
url: natalia-y-bMybTSV7RFY-unsplash.jpg
author:
name: "Natalia Y on Unsplash"
url: "https://unsplash.com/@foxfox?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
description: >
Content Management Systeme halten oft den Content stark unter ihrer
Kontrolle. Das ist schlecht, wenn man mal was migrieren muss. Auf

3
source/_posts/2019-09-29-alles-unter-kontrolle.md → _posts/2019-09-29-alles-unter-kontrolle.md

@ -2,14 +2,11 @@
layout: post
title: Alles unter Kontrolle
date: 2019-09-29 12:45 +0200
category: Strategie
description: "Vorstände lieben die Idee agiler Transformation. Aber so einfach ist der Wechsel nicht: Veränderung beginnt im Kopf, und von liebgewonnenem Abschied zu nehmen fällt schwer."
keywords:
- agil
- transformation
- hierarchie
cover:
url: abteilungsleiter.jpg
---

7
source/_posts/2019-11-24-software-standards.md → _posts/2019-11-24-software-standards.md

@ -1,15 +1,8 @@
---
layout: post
cover: generated/mathew-schwartz-Ktxql22DyMk-unsplash-1200x808-23ddc3.jpg
title: Was Softwarestandards mit meinem Auto und Lafontaine zu tun haben
date: 2019-11-25 07:30 +0100
category: Strategie
description: "Alle wollen Standards erlassen, aber keiner will sie befolgen. Welche Aspekte könnten als Vorgabe wirkungsvoller sein, und warum?"
cover:
url: mathew-schwartz-Ktxql22DyMk-unsplash.jpg
author:
name: "Mathew Schwartz on Unsplash"
url: "https://unsplash.com/@cadop?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
references:
- _posts/2015-07-03-schatten-it.md
- _posts/2016-11-11-in-geiselhaft.md

7
source/_posts/2019-12-01-tech-recruiting.md → _posts/2019-12-01-tech-recruiting.md

@ -1,15 +1,8 @@
---
layout: post
title: Tech Recruiting mit codewars.com
cover: generated/headway-5QgIuuBxKwM-unsplash-1200x800-a31424.jpg
date: 2019-12-01 11:50 +0100
description: Bewerber in der IT sollten fachlich getestet werden. Das tun aber nur die wenigsten Unternehmen, wieso eigentlich? Ich verwende gerne die Rätsel von codewars.com im Auswahlverfahren.
category: Entwickler
cover:
url: headway-5QgIuuBxKwM-unsplash.jpg
author:
name: "Headway on Unsplash"
url: "https://unsplash.com/@headwayio?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
references:
- _posts/2016-08-26-risiko-top-programmierer.md
- _posts/2018-12-12-spielt.md

5
source/_posts/2019-12-06-pendlerpauschale.md → _posts/2019-12-06-pendlerpauschale.md

@ -3,11 +3,6 @@ layout: post
title: Pendlerpauschale oder Home-Office?
date: 2019-12-06 08:52 +0100
description: Ich will nicht pendeln. Aber zuhause arbeiten ist auch nicht erstrebenswert. Wer kommt bloss auf die Idee, es müssten jetzt alle zuhause bleiben?
cover:
url: iwona-castiello-d-antonio-oWU2w0JuHnE-unsplash.jpg
author:
name: "Iwona Castiello d'Antonio on Unsplash"
url: "https://unsplash.com/@aquadrata?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
---

6
source/_posts/2020-01-09-schilde-hoch-fail2ban-und-ufw.md → _posts/2020-01-09-schilde-hoch-fail2ban-und-ufw.md

@ -2,13 +2,7 @@
layout: post
title: "Schilde hoch: fail2ban und ufw"
date: 2020-01-09 09:55 +0100
category: Entwickler
description: Als wäre Spam nicht schon nervig genug, versuchen automatisierte Skripte meinen Server zu knacken. Bestimmte IP-Adressen der Angreifer treten dabei besonders hervor. Ich zeige, wie man sich mithilfe freier Tools schützt.
cover:
url: thomas-jensen-ISG-rUel0Uw-unsplash.jpg
author:
name: "Thomas Jensen on Unsplash"
url: "https://unsplash.com/@thomasjsn?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- fail2ban
- opnsense

6
source/_posts/2020-03-14-telefonie-anno-2020.md → _posts/2020-03-14-telefonie-anno-2020.md

@ -2,13 +2,7 @@
layout: post
title: Telefonie Anno 2020
date: 2020-03-14 11:53 +0100
category: Entwickler
description: "Telefonieren war mal einfach: Kabel rein und gut Heute ist es das in Zeiten von VoIP und Firewalls nicht mehr. Ich zeige mein Setup am Beispiel von Unitymedia, opnSense und VoIP."
cover:
url: maarten-van-den-heuvel-risZYPun2ao-unsplash.jpg
author:
name: "Maarten van den Heuvel on Unsplash"
url: "https://unsplash.com/@mvdheuvel?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
keywords:
- unitymedia
- opnsense

6
source/_posts/2020-06-15-meine-docker-sammlung.md → _posts/2020-06-15-meine-docker-sammlung.md

@ -1,14 +1,8 @@
---
layout: post
title: "Alles schön verpackt: Meine Docker-Sammlung"
category: Entwickler
date: 2020-09-13 21:14 +0200
description: Inzwischen habe ich sieben Anwendungen dockerisiert und veröffentliche meine docker-compose Konfigurationen, ua für Matomo, Gitea, Nextcloud und Drone.
cover:
url: erda-estremera-sxNt9g77PE0-unsplash.jpg
author:
name: "Erda Estremera on Unsplash"
url: "https://unsplash.com/@erdaest?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
references:
- _posts/2019-01-05-matomo-mit-docker.md
- _posts/2019-01-26-docker-einsatz-sorgfaeltig-pruefen.md

22
source/_posts/2021-01-24-neue-firewall-hardware.md → _posts/2021-01-24-neue-firewall-hardware.md

@ -2,23 +2,17 @@
layout: post
title: Neue Firewall-Hardware
date: 2021-01-24 14:48 +0100
description: "Firewalls sind Vertrauenssache, für mich jedenfalls. Ich setze schon länger auf OPNsense und habe bei Aliexpress mit dem Yanling NUC neue Hardware dafür gefunden."
category: Entwickler
cover:
url: karim-manjra-6iM5GOht664-unsplash.jpg
author:
name: "Karim MANJRA on Unsplash"
url: "https://unsplash.com/@karim_manjra?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText"
references:
- _posts/2019-08-15-lvm-system-vergroessern.md
- _posts/2020-01-09-schilde-hoch-fail2ban-und-ufw.md
- _posts/2020-03-14-telefonie-anno-2020.md
keywords:
- opnsense
- monowall
- apu2
- alix
- yanling nuc
references:
- _posts/2019-08-15-lvm-system-vergroessern.md
- _posts/2020-01-09-schilde-hoch-fail2ban-und-ufw.md
- _posts/2020-03-14-telefonie-anno-2020.md
---
@ -26,7 +20,7 @@ Manche würden vielleicht sagen, ich wär ein lächerlicher, kleiner Kontrollfre
Kann man eine Firewall lieben? Als die [m0n0wall](https://de.wikipedia.org/wiki/M0n0wall) rauskam, war ich jedenfalls schwer verliebt. M0n0wall ist eine schlanke, simple und dennoch vollkommen ausreichende Router-Lösung auf FreeBSD-Basis. Das Projekt von Manuel Kasper war bis zu seiner Einstellung 2015 meine bevorzugte Firewall. Die m0n0wall braucht nur sehr wenig Ressourcen und kann auf winziger Hardware bis zu 100 Mbit Routing abbilden. Meine ersten Appliances waren daher [ALIX-Boards von PC Engines](https://www.pcengines.ch/alix.htm).
![m0n0wall Appliance, von Deciso](/assets/images/monowall-appliance.jpg)
![m0n0wall Appliance, von Deciso](/public/images/monowall-appliance.jpg)
Als das M0n0wall-Projekt dann beendet wurde, bin ich der Empfehlung des Autors gefolgt und habe [OPNsense](https://opnsense.org/) eingesetzt. Gerade im Vergleich zum verwandten Tool pfSense erscheint mir OPNsense moderner, schneller in der Entwicklung und die Community dahinter schlicht freundlicher.
@ -34,11 +28,11 @@ In dem Maß, in dem meine WAN-Verbindung schneller wurde (von 18MBit, 50MBit üb
Und dann kam das 1-Gigabit-Angebot von Unitymedia/Vodafone. Nicht nur, dass FreeBSD seit einiger Zeit Probleme mit der Netzwerkperformance hat ([hier](https://forums.freebsd.org/threads/slow-network-performance-compared-to-linux-again.71679/) oder [hier](https://www.reddit.com/r/freebsd/comments/eu9d0i/slow_speed_on_gigabit_network_using_freebsd_samba/) oder [hier](https://forum.opnsense.org/index.php?topic=18754.0)) auch die CPU und IO-Fähigkeit der kleinen APU2 Kisten stößt an ihre Grenzen. Mehr als 600MBit habe ich aus der WAN-Verbindung nicht herausholen können. Was also als nächstes? **Meet the Yanling NUC.**
![Yanling NUC J3160](/assets/images/yanling-nuc-j3160.jpg)
![Yanling NUC J3160](/public/images/yanling-nuc-j3160.jpg)
Diese kleinen Kisten (ca 13 ⨉ 13 ⨉ 4cm) basieren auf einem [Intel Celeron J3160](https://ark.intel.com/content/www/de/de/ark/products/91533/intel-celeron-processor-j3160-2m-cache-up-to-2-24-ghz.html) 4-core Prozessor mit 1.6 GHz Takt (Burst bis 2.24GHz), der nur 6W Leistung aufnimmt. Beim [freundlichen China-Versand](https://www.aliexpress.com/item/1005001510522500.html) habe ich für die Version mit 32GB SSD und 4GB RAM seinerzeit weniger als 150 EUR bezahlt. Und was soll ich sagen? OPNsense rennt wie bekloppt, ich sehe bis zu 970 MBit effektive Routerleistung LAN→WAN. Dabei bleibt die CPU-Last minimal, die CPU-Temperatur bei 45-49 Grad Celsius und das Gehäuse außen handwarm.
![OPNsense Dashboard](/assets/images/opnsense-dashboard.png)
![OPNsense Dashboard](/public/images/opnsense-dashboard.png)
Ich konnte sogar das originale AMIBIOS gegen coreboot tauschen, da die [4-port Vaults](https://protectli.com/vault-4-port/) von Protectli auf der gleichen Hardware beruhen: [Hier die Anleitung zum Upgrade des Bios.](https://protectli.com/kb/coreboot-on-the-vault/)

28
atom.xml

@ -0,0 +1,28 @@
---
layout: null
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{ site.title }}</title>
<link href="{{ site.url }}{{ site.baseurl }}/atom.xml" rel="self"/>
<link href="{{ site.url }}{{ site.baseurl }}/"/>
<updated>{{ site.time | date_to_xmlschema }}</updated>
<id>{{ site.url }}</id>
<author>
<name>{{ site.author.name }}</name>
<email>{{ site.author.email }}</email>
</author>
{% for post in site.posts %}
<entry>
<title>{{ post.title }}</title>
<link href="{{ site.url }}{{ post.url }}"/>
<updated>{{ post.date | date_to_xmlschema }}</updated>
<id>{{ site.url }}{{ site.baseurl }}{{ post.id }}</id>
<content type="html">{{ post.content | xml_escape }}</content>
</entry>
{% endfor %}
</feed>

10
source/datenschutz.md → datenschutz.md

@ -77,12 +77,14 @@ Sie können hier die Speicherung und Nutzung Ihrer Daten deaktivieren. Ihr Brows
<iframe style="border: 0; height: 200px; width: 100%"
src="https://stats.software-berater.net/index.php?module=CoreAdminHome&action=optOut&language=de&backgroundColor=F2F1F1&fontColor=090C02&fontSize=16px&fontFamily=system-ui%2C-apple-system%2CBlinkMacSystemFont%2C%22Avenir%20Next%22%2C%22Avenir%22%2C%22Segoe%20UI%22%2C%22Lucida%20Grande%22%2C%22Helvetica%20Neue%22%2C%22Helvetica%22%2C%22Fira%20Sans%22%2C%22Roboto%22%2C%22Noto%22%2C%22Droid%20Sans%22%2C%22Cantarell%22%2C%22Oxygen%22%2C%22Ubuntu%22%2C%22Franklin%20Gothic%20Medium%22%2C%22Century%20Gothic%22%2C%22Liberation%20Sans%22%2Csans-serif"></iframe>
## Font Awesome
## Google Web Fonts
Unsere Website verwendet zur einheitlichen Darstellung von Schriftarten bzw. Icons so genannte Web Fonts bzw. Icons, die von Fonticons, Inc. bereitgestellt werden. Beim Aufruf einer Seite lädt Ihr Browser die benötigten Web Fonts bzw. Icons in ihren Browsercache, um Texte, Schriftarten und Icons korrekt anzuzeigen.
Unsere Website verwendet Web Fonts von Google. Anbieter ist die Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA.
Zu diesem Zweck muss der von Ihnen verwendete Browser Verbindung zu den Servern von Fonticons, Inc. aufnehmen. Hierdurch erlangt Fonticons, Inc. Kenntnis darüber, dass über Ihre IP-Adresse unsere Website aufgerufen wurde. Die Nutzung von Font Awesome erfolgt im Interesse einer einheitlichen und ansprechenden Darstellung unserer Online-Angebote. Dies stellt ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO dar.
Durch den Einsatz dieser Web Fonts wird es möglich Ihnen die von uns gewünschte Darstellung unserer Website zu präsentieren, unabhängig davon welche Schriften Ihnen lokal zur Verfügung stehen. Dies erfolgt über den Abruf der Google Web Fonts von einem Server von Google in den USA und der damit verbundenen Weitergabe Ihre Daten an Google. Dabei handelt es sich um Ihre IP-Adresse und welche Seite Sie bei uns besucht haben. Der Einsatz von Google Web Fonts erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Als Betreiber dieser Website haben wir ein berechtigtes Interesse an der optimalen Darstellung und Übertragung unseres Webauftritts.
Wenn Ihr Browser Font Awesome nicht unterstützt, wird eine Standardschrift von Ihrem Computer genutzt. Weitere Informationen zu Font Awesome finden Sie unter https://fontawesome.com/help und in der Datenschutzerklärung von Fonticons, Inc.: <https://fontawesome.com/privacy>.
Das Unternehmen Google ist für das us-europäische Datenschutzübereinkommen "Privacy Shield" zertifiziert. Dieses Datenschutzübereinkommen soll die Einhaltung des in der EU geltenden Datenschutzniveaus gewährleisten.
Einzelheiten über Google Web Fonts finden Sie unter: https://www.google.com/fonts#AboutPlace:about und weitere Informationen in den Datenschutzbestimmungen von Google: https://policies.google.com/privacy/partners?hl=de
Quelle: Datenschutz-Konfigurator von <https://mein-datenschutzbeauftragter.de>

37
index.html

@ -0,0 +1,37 @@
---
layout: default
title: Start
---
<div class="posts">
{% for post in paginator.posts %}
<div class="post">
<h1 class="post-title">
<a href="{{ post.url }}">
{{ post.title }}
</a>
</h1>
<span class="post-date">{{ post.date | date_to_string }}</span>
{{ post.content }}
</div>
{% endfor %}
</div>
<div class="pagination">
{% if paginator.next_page %}
<a class="pagination-item older" href="{{ paginator.next_page_path }}">Ältere</a>
{% else %}
<span class="pagination-item older">Ältere</span>
{% endif %}
{% if paginator.previous_page %}
{% if paginator.page == 2 %}
<a class="pagination-item newer" href="{{ '/' }}">Newer</a>
{% else %}
<a class="pagination-item newer" href="{{ paginator.previous_page_path }}">Neuere</a>
{% endif %}
{% else %}
<span class="pagination-item newer">Neuere</span>
{% endif %}
</div>

0
source/keybase.txt → keybase.txt

BIN
public/apple-touch-icon-precomposed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

562
public/css/lanyon.css

@ -0,0 +1,562 @@
/*
* ___
* /\_ \
* \//\ \ __ ___ __ __ ___ ___
* \ \ \ /'__`\ /' _ `\/\ \/\ \ / __`\ /' _ `\
* \_\ \_/\ \_\.\_/\ \/\ \ \ \_\ \/\ \_\ \/\ \/\ \
* /\____\ \__/.\_\ \_\ \_\/`____ \ \____/\ \_\ \_\
* \/____/\/__/\/_/\/_/\/_/`/___/> \/___/ \/_/\/_/
* /\___/
* \/__/
*
* Designed, built, and released under MIT license by @mdo. Learn more at
* https://github.com/poole/lanyon.
*/
/*
* Contents
*
* Global resets
* Masthead
* Sidebar
* Slide effect
* Posts and pages
* Pagination
* Reverse layout
* Themes
*/
/*
* Global resets
*
* Update the foundational and global aspects of the page.
*/
/* Prevent scroll on narrow devices */
html,
body {
overflow-x: hidden;
}
html {
font-family: "PT Serif", Georgia, "Times New Roman", serif;
}
h1, h2, h3, h4, h5, h6 {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
font-weight: 400;
color: #313131;
letter-spacing: -.025rem;
}
/*
* Wrapper
*
* The wrapper is used to position site content when the sidebar is toggled. We
* use an outter wrap to position the sidebar without interferring with the
* regular page content.
*/
.wrap {
position: relative;
width: 100%;
}
/*
* Container
*
* Center the page content.
*/
.container {
max-width: 28rem;
}
@media (min-width: 38em) {
.container {
max-width: 32rem;
}
}
@media (min-width: 56em) {
.container {
max-width: 38rem;
}
}
/*
* Masthead
*
* Super small header above the content for site name and short description.
*/
.masthead {
padding-top: 1rem;
padding-bottom: 1rem;
margin-bottom: 3rem;
border-bottom: 1px solid #eee;
}
.masthead-title {
margin-top: 0;
margin-bottom: 0;
color: #505050;
}
.masthead-title a {
color: #505050;
}
.masthead-title small {
font-size: 75%;
font-weight: 400;
color: #c0c0c0;
letter-spacing: 0;
}
@media (max-width: 48em) {
.masthead-title {
text-align: center;
}
.masthead-title small {
display: none;
}
}
/*
* Sidebar
*
* The sidebar is the drawer, the item we are toggling with our handy hamburger
* button in the corner of the page.
*
* This particular sidebar implementation was inspired by Chris Coyier's
* "Offcanvas Menu with CSS Target" article, and the checkbox variation from the
* comments by a reader. It modifies both implementations to continue using the
* checkbox (no change in URL means no polluted browser history), but this uses
* `position` for the menu to avoid some potential content reflow issues.
*
* Source: http://css-tricks.com/off-canvas-menu-with-css-target/#comment-207504
*/
/* Style and "hide" the sidebar */
.sidebar {
position: fixed;
top: 0;
bottom: 0;
left: -14rem;
width: 14rem;
visibility: hidden;
overflow-y: auto;
font-family: "PT Sans", Helvetica, Arial, sans-serif;
font-size: .875rem; /* 15px */
color: rgba(255,255,255,.6);
background-color: #202020;
-webkit-transition: all .3s ease-in-out;
transition: all .3s ease-in-out;
}
@media (min-width: 30em) {
.sidebar {
font-size: .75rem; /* 14px */
}
}
/* Sidebar content */
.sidebar a {
font-weight: normal;
color: #fff;
}
.sidebar-item {
padding: 1rem;
}
.sidebar-item p:last-child {
margin-bottom: 0;
}
/* Sidebar nav */
.sidebar-nav {
border-bottom: 1px solid rgba(255,255,255,.1);
}
.sidebar-nav-item {
display: block;
padding: .5rem 1rem;
border-top: 1px solid rgba(255,255,255,.1);
}
.sidebar-nav-item.active,
a.sidebar-nav-item:hover,
a.sidebar-nav-item:focus {
text-decoration: none;
background-color: rgba(255,255,255,.1);
border-color: transparent;
}
@media (min-width: 48em) {
.sidebar-item {
padding: 1.5rem;
}
.sidebar-nav-item {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
/* Hide the sidebar checkbox that we toggle with `.sidebar-toggle` */
.sidebar-checkbox {
position: absolute;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
/* Style the `label` that we use to target the `.sidebar-checkbox` */
.sidebar-toggle {
position: absolute;
top: .8rem;
left: 1rem;
display: flex;
align-items: center;
padding: .25rem .75rem;
color: #505050;
background-color: #fff;
border-radius: .25rem;
cursor: pointer;
}
.sidebar-toggle::before {
display: inline-block;
width: 32px;
height: 32px;
content: "";
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23555' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M2.5 11.5A.5.5 0 013 11h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 7h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 3h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5z' clip-rule='evenodd'/%3E%3C/svg%3E") no-repeat;
}
.sidebar-toggle:active,
#sidebar-checkbox:focus ~ .sidebar-toggle,
#sidebar-checkbox:checked ~ .sidebar-toggle {
color: #fff;
background-color: #555;
}
.sidebar-toggle:active:before,
#sidebar-checkbox:focus ~ .sidebar-toggle::before,
#sidebar-checkbox:checked ~ .sidebar-toggle::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M2.5 11.5A.5.5 0 013 11h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 7h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 3h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5z' clip-rule='evenodd'/%3E%3C/svg%3E") no-repeat;
}
@media (min-width: 30.1em) {
.sidebar-toggle {
position: fixed;
}
}
@media print {
.sidebar-toggle {
display: none;
}
}
/* Slide effect
*
* Handle the sliding effects of the sidebar and content in one spot, seperate
* from the default styles.
*
* As an a heads up, we don't use `transform: translate3d()` here because when
* mixed with `position: fixed;` for the sidebar toggle, it creates a new
* containing block. Put simply, the fixed sidebar toggle behaves like
* `position: absolute;` when transformed.
*
* Read more about it at http://meyerweb.com/eric/thoughts/2011/09/12/.
*/
.wrap,
.sidebar,
.sidebar-toggle {
-webkit-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
}
.wrap,
.sidebar-toggle {
-webkit-transition: -webkit-transform .3s ease-in-out;
transition