From d2ed4ede2737ab6887e6ff29d64b14f851d6462a Mon Sep 17 00:00:00 2001
From: Eike Hirsch
Date: Thu, 31 Dec 2015 00:02:47 +0100
Subject: [PATCH 01/47] added post about the smartsteuer snap app
---
_posts/2015-12-31-smartsteuer-snap-app.md | 109 ++++++++++++++++++++++
1 file changed, 109 insertions(+)
create mode 100644 _posts/2015-12-31-smartsteuer-snap-app.md
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
new file mode 100644
index 0000000..cfd651c
--- /dev/null
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -0,0 +1,109 @@
+---
+layout: post
+title: Creating the smartsteuer 'snap' app
+subtitle: A backstage report
+description: A behind the scenes view of the birth of our youngest creation.
+category: smartsteuer
+author: Eike Hirsch
+author_email: eike.hirsch@smartsteuer.de
+---
+
+### Motivation ###
+
+As we at smartsteuer really enjoyed how this app was imagined and eventually created, I thought it might be fun to
+write about it. This blog post is not that much technical but describes our journey to a product which (hopefully)
+will create value for our customers.
+
+### Background
+
+At smartsteuer we create tools for people who want to do their tax filings online. For that, we
+continuously seek for smart solutions to make this task as easy as possible. One example is an app that we created to
+answer one question which always nags our customers:
+
+> Why should I care? Can I even expect a refund?
+
+To answer this seriously you have to do a whole lot of calculations for which you need quite some information
+from the user. Which in turn would create a process which is _not_ fast and easy. So, some years ago we created this
+app which would do two things:
+
+1. Only asks for about five thinks every user knows of the top of their heads.
+2. Make some educated guesses to answer all the other questions with rough estimates.
+
+The result couldn't be exact but it was good enough to answer said question. It worked quite well even though you still
+had to provide those five figures.
+
+### Theory
+
+Now, with the help and cooperation of our fellow colleagues from "Haufe Lohn & Gehalt" we wanted to take the app to the
+next level. It was our aim to reduce the number of questions the user needs to answer and at the same time increase the
+accuracy of the calculation. I will spare you the details but the result of our efforts was a QR-Code which every user
+of "Haufe Lohn & Gehalt" would get and which would contain all wage and tax information an employee needs to file her
+taxes.
+
+So the plan was to enhance the app with a qr-code scanner to safe the user some typing.
+
+We created a quick briefing for our mobile dev agency - they returned an offer - we signed it - the deal was sealed.
+
+You might wonder why I am writing the blog post in the first place, as this sounds all to familiar and is in any regards
+special. Well you are right. Up until here this story is _only_ an example of solid work.
+But please bare with me and read on.
+
+### Reality kicks in
+
+About an hour before the agency would come by to kick the project off I was holding an internal meeting to get everybody
+on the same page. During this meeting it came to light that the project somehow managed to stay under the radar and that
+everybody in the room did not know about it. This is quite uncommon in our company as everybody is eager to know what is
+going on and to contribute her ideas and we encourage everyone to do so. But in this particular case this somehow did
+not happen until said meeting.
+
+And so it was this meeting when all the experts where questioning the new feature and its purpose:
+
+> Why are we doing this?
+> What is the benefit for the user?
+> Is the benefit big enough to justify the work?
+> What data is included in the qr-code?
+> Is this really the best we can do for our customers?
+> …
+
+It turned out that, while we would get a lot more data to replace some of our guesses with real values, the user
+would still need to answer four out of the former five questions and instead would need to turn on the scanner and snap
+the code.
+That was not the benefit we hoped to deliver.
+
+### Adaption
+
+Luckily we did not stop there. When you happen to have a bunch of smart people in the room, new ideas come up and
+so a totally new app slowly came into shape.
+
+**What can we do with that qr-code?** It contained lots of data which the user would need to manually enter into her tax
+filing - a tedious and error-prone process.
+
+**But our main product - the tax filing software - runs in the browser on desktop-PCs.** You don't normally scan qr-codes
+with an desktop-PC.
+
+**What if we could transform the qr-code-scanner into an input device for our software?** We would need to find a way to
+link the app with the software without needing the user to do some fancy stuff or even worse needing to understand the
+whole process. And at the same time keeping her data safe and protected.
+
+**Can't we create a second qr-code which contains the data needed for the linking?**
+
+**And why not use OCR to read any other document**
+
+By the time the agency arrived we had totally rewritten the plan. And they had no idea…
+
+### Outcome
+
+Well, we had to start the meeting with a lot of apologies. The app we original signed up for was from the table but we
+still wanted *an* app. Luckily our agency was flexible enough to adapt to the new plan and within only one week we had a
+working prototype.
+From that day on everything worked according to the plan and now the app is in the
+[app store](https://itunes.apple.com/de/app/smartsteuer/id1068423226?mt=8) and will very soon be in
+the play store as well. Check it out if you like and let me now what you think.
+
+Finally I'd like to give a big shout out to our colleagues at [Haufe-Lexware](http://haufe-lexware.com) and to our
+agency [Wissenswerft](http://wissenswerft.net) for the great teamwork and flexibility!
+
+
+
+
+
From d405319aa470268945d3722620ef0e24b3a1d5fd Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:22:43 +0100
Subject: [PATCH 02/47] Update 2015-12-31-smartsteuer-snap-app.md
Removing first header to allow rendering of initial paragraph
---
_posts/2015-12-31-smartsteuer-snap-app.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index cfd651c..99dd5a9 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -8,8 +8,6 @@ author: Eike Hirsch
author_email: eike.hirsch@smartsteuer.de
---
-### Motivation ###
-
As we at smartsteuer really enjoyed how this app was imagined and eventually created, I thought it might be fun to
write about it. This blog post is not that much technical but describes our journey to a product which (hopefully)
will create value for our customers.
From 807f792d4f54e86102106501ffe4ab4aac0dd4cc Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:30:01 +0100
Subject: [PATCH 03/47] Update 2015-12-31-smartsteuer-snap-app.md
Reformatting
---
_posts/2015-12-31-smartsteuer-snap-app.md | 59 ++++++-----------------
1 file changed, 14 insertions(+), 45 deletions(-)
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index 99dd5a9..edc4b59 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -8,51 +8,34 @@ author: Eike Hirsch
author_email: eike.hirsch@smartsteuer.de
---
-As we at smartsteuer really enjoyed how this app was imagined and eventually created, I thought it might be fun to
-write about it. This blog post is not that much technical but describes our journey to a product which (hopefully)
-will create value for our customers.
+As we at smartsteuer really enjoyed how our [Smartsteuer App](https://www.smartsteuer.de/blog/2015/03/03/app-sofort-smartsteuer-als-app/) was imagined and eventually created, I thought it might be fun to write about it. This blog post is not that much technical but describes our journey to a product which (hopefully) will create value for our customers.
### Background
-At smartsteuer we create tools for people who want to do their tax filings online. For that, we
-continuously seek for smart solutions to make this task as easy as possible. One example is an app that we created to
-answer one question which always nags our customers:
+At smartsteuer we create tools for people who want to do their tax filings online. For that, we continuously seek for smart solutions to make this task as easy as possible. One example is an app that we created to answer one question which always nags our customers:
> Why should I care? Can I even expect a refund?
-To answer this seriously you have to do a whole lot of calculations for which you need quite some information
-from the user. Which in turn would create a process which is _not_ fast and easy. So, some years ago we created this
-app which would do two things:
+To answer this seriously you have to do a whole lot of calculations for which you need quite some information from the user. Which in turn would create a process which is _not_ fast and easy. So, some years ago we created this app which would do two things:
1. Only asks for about five thinks every user knows of the top of their heads.
2. Make some educated guesses to answer all the other questions with rough estimates.
-The result couldn't be exact but it was good enough to answer said question. It worked quite well even though you still
-had to provide those five figures.
+The result couldn't be exact but it was good enough to answer said question. It worked quite well even though you still had to provide those five figures.
### Theory
-Now, with the help and cooperation of our fellow colleagues from "Haufe Lohn & Gehalt" we wanted to take the app to the
-next level. It was our aim to reduce the number of questions the user needs to answer and at the same time increase the
-accuracy of the calculation. I will spare you the details but the result of our efforts was a QR-Code which every user
-of "Haufe Lohn & Gehalt" would get and which would contain all wage and tax information an employee needs to file her
-taxes.
+Now, with the help and cooperation of our fellow colleagues from "Haufe Lohn & Gehalt" we wanted to take the app to the next level. It was our aim to reduce the number of questions the user needs to answer and at the same time increase the accuracy of the calculation. I will spare you the details but the result of our efforts was a QR-Code which every user of "Haufe Lohn & Gehalt" would get and which would contain all wage and tax information an employee needs to file her taxes.
So the plan was to enhance the app with a qr-code scanner to safe the user some typing.
We created a quick briefing for our mobile dev agency - they returned an offer - we signed it - the deal was sealed.
-You might wonder why I am writing the blog post in the first place, as this sounds all to familiar and is in any regards
-special. Well you are right. Up until here this story is _only_ an example of solid work.
-But please bare with me and read on.
+You might wonder why I am writing the blog post in the first place, as this sounds all to familiar and is in any regards special. Well you are right. Up until here this story is _only_ an example of solid work. But please bare with me and read on.
### Reality kicks in
-About an hour before the agency would come by to kick the project off I was holding an internal meeting to get everybody
-on the same page. During this meeting it came to light that the project somehow managed to stay under the radar and that
-everybody in the room did not know about it. This is quite uncommon in our company as everybody is eager to know what is
-going on and to contribute her ideas and we encourage everyone to do so. But in this particular case this somehow did
-not happen until said meeting.
+About an hour before the agency would come by to kick the project off I was holding an internal meeting to get everybody on the same page. During this meeting it came to light that the project somehow managed to stay under the radar and that everyone in the room did not know about it. This is quite uncommon in our company as everybody is eager to know what is going on and to contribute her ideas and we encourage everyone to do so. But in this particular case this somehow did not happen until said meeting.
And so it was this meeting when all the experts where questioning the new feature and its purpose:
@@ -63,25 +46,17 @@ And so it was this meeting when all the experts where questioning the new featur
> Is this really the best we can do for our customers?
> …
-It turned out that, while we would get a lot more data to replace some of our guesses with real values, the user
-would still need to answer four out of the former five questions and instead would need to turn on the scanner and snap
-the code.
-That was not the benefit we hoped to deliver.
+It turned out that, while we would get a lot more data to replace some of our guesses with real values, the user would still need to answer four out of the former five questions and instead would need to turn on the scanner and snap the code. That was not the benefit we hoped to deliver.
### Adaption
-Luckily we did not stop there. When you happen to have a bunch of smart people in the room, new ideas come up and
-so a totally new app slowly came into shape.
+Luckily we did not stop there. When you happen to have a bunch of smart people in the room, new ideas come up and so a totally new app slowly came into shape.
-**What can we do with that qr-code?** It contained lots of data which the user would need to manually enter into her tax
-filing - a tedious and error-prone process.
+**What can we do with that qr-code?** It contained lots of data which the user would need to manually enter into her tax filing - a tedious and error-prone process.
-**But our main product - the tax filing software - runs in the browser on desktop-PCs.** You don't normally scan qr-codes
-with an desktop-PC.
+**But our main product - the tax filing software - runs in the browser on desktop-PCs.** You don't normally scan qr-codes with an desktop-PC.
-**What if we could transform the qr-code-scanner into an input device for our software?** We would need to find a way to
-link the app with the software without needing the user to do some fancy stuff or even worse needing to understand the
-whole process. And at the same time keeping her data safe and protected.
+**What if we could transform the qr-code-scanner into an input device for our software?** We would need to find a way to link the app with the software without needing the user to do some fancy stuff or even worse needing to understand the whole process. And at the same time keeping her data safe and protected.
**Can't we create a second qr-code which contains the data needed for the linking?**
@@ -91,15 +66,9 @@ By the time the agency arrived we had totally rewritten the plan. And they had n
### Outcome
-Well, we had to start the meeting with a lot of apologies. The app we original signed up for was from the table but we
-still wanted *an* app. Luckily our agency was flexible enough to adapt to the new plan and within only one week we had a
-working prototype.
-From that day on everything worked according to the plan and now the app is in the
-[app store](https://itunes.apple.com/de/app/smartsteuer/id1068423226?mt=8) and will very soon be in
-the play store as well. Check it out if you like and let me now what you think.
+Well, we had to start the meeting with a lot of apologies. The app we original signed up for was from the table but we still wanted *an* app. Luckily our agency was flexible enough to adapt to the new plan and within only one week we had a working prototype. From that day on everything worked according to the plan and now our Smartsteuer App is available at the [IOS App Store](https://itunes.apple.com/de/app/smartsteuer/id1068423226?mt=8) and will be very soon be in the Android Play store as well (We will post the link as soon as its up). Check it out if you like and let me now what you think.
-Finally I'd like to give a big shout out to our colleagues at [Haufe-Lexware](http://haufe-lexware.com) and to our
-agency [Wissenswerft](http://wissenswerft.net) for the great teamwork and flexibility!
+Finally I'd like to give a big shout out to our colleagues at [Haufe-Lexware](http://haufe-lexware.com) and to our agency [Wissenswerft](http://wissenswerft.net) for the great teamwork and flexibility!
From 625cda523626114fa2266fb7e9bd7eb6403735fa Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:36:33 +0100
Subject: [PATCH 04/47] Update 2015-12-31-smartsteuer-snap-app.md
---
_posts/2015-12-31-smartsteuer-snap-app.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index edc4b59..06be3d1 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -1,9 +1,9 @@
---
layout: post
-title: Creating the smartsteuer 'snap' app
+title: Creating the Smartsteuer 'Snap' App
subtitle: A backstage report
description: A behind the scenes view of the birth of our youngest creation.
-category: smartsteuer
+category: Smartsteuer
author: Eike Hirsch
author_email: eike.hirsch@smartsteuer.de
---
From 51eed3f87918a3a9fcf8b6b16e7b913a52c13e40 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:37:35 +0100
Subject: [PATCH 05/47] Update 2015-12-17-letsencrypt.md
---
_posts/2015-12-17-letsencrypt.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/_posts/2015-12-17-letsencrypt.md b/_posts/2015-12-17-letsencrypt.md
index b4e9f35..68879f9 100644
--- a/_posts/2015-12-17-letsencrypt.md
+++ b/_posts/2015-12-17-letsencrypt.md
@@ -1,9 +1,9 @@
---
layout: post
-title: How-to - Leverage Let's Encrypt on an Azure Ubuntu VM
+title: Howto - Leverage 'Let's Encrypt' on Azure Ubuntu VM
subtitle: Create free valid SSL certificates in 20 minutes.
description: How-to - Leverage Let's Encrypt on an Azure Ubuntu VM
-category: how-to
+category: howto
author: Martin
author_email: martin.danielsson@haufe-lexware.com
---
From 86cfe0f344ef4d308011f74482155c79b27b492c Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:37:51 +0100
Subject: [PATCH 06/47] Update 2015-12-17-letsencrypt.md
---
_posts/2015-12-17-letsencrypt.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_posts/2015-12-17-letsencrypt.md b/_posts/2015-12-17-letsencrypt.md
index 68879f9..25f4684 100644
--- a/_posts/2015-12-17-letsencrypt.md
+++ b/_posts/2015-12-17-letsencrypt.md
@@ -2,7 +2,7 @@
layout: post
title: Howto - Leverage 'Let's Encrypt' on Azure Ubuntu VM
subtitle: Create free valid SSL certificates in 20 minutes.
-description: How-to - Leverage Let's Encrypt on an Azure Ubuntu VM
+description: Howto - Leverage Let's Encrypt on an Azure Ubuntu VM
category: howto
author: Martin
author_email: martin.danielsson@haufe-lexware.com
From 2f4809cfc6a6984f1411e8a631cd6e839bc81490 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Thu, 31 Dec 2015 12:40:37 +0100
Subject: [PATCH 07/47] Update 2015-12-17-letsencrypt.md
---
_posts/2015-12-17-letsencrypt.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/_posts/2015-12-17-letsencrypt.md b/_posts/2015-12-17-letsencrypt.md
index 25f4684..cd0dafc 100644
--- a/_posts/2015-12-17-letsencrypt.md
+++ b/_posts/2015-12-17-letsencrypt.md
@@ -1,8 +1,8 @@
---
layout: post
-title: Howto - Leverage 'Let's Encrypt' on Azure Ubuntu VM
+title: Howto - Leverage 'Let's Encrypt' on Azure
subtitle: Create free valid SSL certificates in 20 minutes.
-description: Howto - Leverage Let's Encrypt on an Azure Ubuntu VM
+description: Howto - Leverage 'Let's Encrypt' on an Azure Ubuntu VM
category: howto
author: Martin
author_email: martin.danielsson@haufe-lexware.com
From 52639a0032453cdb8b03089c8d068ee6f110b882 Mon Sep 17 00:00:00 2001
From: Eike Hirsch
Date: Mon, 4 Jan 2016 09:25:58 +0100
Subject: [PATCH 08/47] added backlink to smartsteuer and removed a typo.
---
_posts/2015-12-31-smartsteuer-snap-app.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index cfd651c..69e2a86 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -10,9 +10,9 @@ author_email: eike.hirsch@smartsteuer.de
### Motivation ###
-As we at smartsteuer really enjoyed how this app was imagined and eventually created, I thought it might be fun to
-write about it. This blog post is not that much technical but describes our journey to a product which (hopefully)
-will create value for our customers.
+As we at [smartsteuer](https://www.smartsteuer.de) really enjoyed how this app was imagined and eventually created,
+I thought it might be fun to write about it. This blog post is not that much technical but describes our journey to a
+product which (hopefully) will create value for our customers.
### Background
@@ -26,7 +26,7 @@ To answer this seriously you have to do a whole lot of calculations for which yo
from the user. Which in turn would create a process which is _not_ fast and easy. So, some years ago we created this
app which would do two things:
-1. Only asks for about five thinks every user knows of the top of their heads.
+1. Only asks for about five things every user knows of the top of their heads.
2. Make some educated guesses to answer all the other questions with rough estimates.
The result couldn't be exact but it was good enough to answer said question. It worked quite well even though you still
From 277511ab4bd00d41d6440e31960ee11afa33352b Mon Sep 17 00:00:00 2001
From: Eike Hirsch
Date: Mon, 4 Jan 2016 09:37:32 +0100
Subject: [PATCH 09/47] Merge branch 'master' of
https://github.com/Haufe-Lexware/Haufe-Lexware.github.io and changed the link
to the correct app.
---
_posts/2015-12-31-smartsteuer-snap-app.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index 56d966f..62ba747 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -8,7 +8,7 @@ author: Eike Hirsch
author_email: eike.hirsch@smartsteuer.de
---
-As we at [smartsteuer](https://www.smartsteuer.de) really enjoyed how our [Smartsteuer App](https://www.smartsteuer.de/blog/2015/03/03/app-sofort-smartsteuer-als-app/) was imagined and eventually created, I thought it might be fun to write about it. This blog post is not that much technical but describes our journey to a product which (hopefully) will create value for our customers.
+As we at [smartsteuer](https://www.smartsteuer.de) really enjoyed how our [Smartsteuer Smartphone App](https://www.smartsteuer.de/online/steuererklaerung-online/#smartphone) was imagined and eventually created, I thought it might be fun to write about it. This blog post is not that much technical but describes our journey to a product which (hopefully) will create value for our customers.
### Background
From 6142daef72a74ca6bf8e019a8ae7794e5effaf97 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 11:13:29 +0100
Subject: [PATCH 10/47] Update 2015-12-15-dockercon_eu_2015.md
Normalizing titles
---
_posts/2015-12-15-dockercon_eu_2015.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_posts/2015-12-15-dockercon_eu_2015.md b/_posts/2015-12-15-dockercon_eu_2015.md
index 6c1505d..87ad0c4 100644
--- a/_posts/2015-12-15-dockercon_eu_2015.md
+++ b/_posts/2015-12-15-dockercon_eu_2015.md
@@ -1,6 +1,6 @@
---
layout: post
-title: Impressions from DockerCon 2015
+title: Impressions from DockerCon 2015 - Part 2
subtitle: Barcelona 16. + 17.11.2015
description: my highlights and picks from DockerCon 2015
category: docker
From a49f68d6008c9113033227bc8d2c150ffec8cc16 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 11:14:19 +0100
Subject: [PATCH 11/47] Update 2015-12-08-DockerCon-EU-2015.md
Normalizing title
---
_posts/2015-12-08-DockerCon-EU-2015.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_posts/2015-12-08-DockerCon-EU-2015.md b/_posts/2015-12-08-DockerCon-EU-2015.md
index 2675ee1..a88d9c2 100644
--- a/_posts/2015-12-08-DockerCon-EU-2015.md
+++ b/_posts/2015-12-08-DockerCon-EU-2015.md
@@ -1,6 +1,6 @@
---
layout: post
-title: DockerCon EU 2015
+title: Impressions from DockerCon EU 2015 - Part 1
subtite: Insights, Outlooks and Inbetweens
description: Notes from DevOpsCon 2015
category: general
From a488bb0f59e3d6d7f571da5c3474176148026238 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 13:09:07 +0100
Subject: [PATCH 12/47] adding tags and categories
---
_data/categories.yml | 19 +++++++++++
_data/tags.yml | 35 +++++++++++++++++++
_layouts/blog_by_category.html | 37 +++++++++++++++++++++
_layouts/blog_by_tag.html | 37 +++++++++++++++++++++
_layouts/post.html | 34 +++++++++++++++++++
_posts/2015-11-11-Hello-World.md | 1 +
_posts/2015-11-17-oscon.md | 3 +-
_posts/2015-11-19-api-journey.md | 1 +
_posts/2015-12-07-devopscon-2015.md | 3 +-
_posts/2015-12-08-DockerCon-EU-2015.md | 3 +-
_posts/2015-12-11-apidays-paris.md | 3 +-
_posts/2015-12-15-dockercon_eu_2015.md | 3 +-
_posts/2015-12-17-letsencrypt.md | 1 +
_posts/2015-12-31-smartsteuer-snap-app.md | 3 +-
_posts/2015-12-8-microservices-devopscon.md | 3 +-
index.html | 4 ++-
16 files changed, 182 insertions(+), 8 deletions(-)
create mode 100644 _data/categories.yml
create mode 100644 _data/tags.yml
create mode 100644 _layouts/blog_by_category.html
create mode 100644 _layouts/blog_by_tag.html
diff --git a/_data/categories.yml b/_data/categories.yml
new file mode 100644
index 0000000..fa63c9a
--- /dev/null
+++ b/_data/categories.yml
@@ -0,0 +1,19 @@
+- slug: general
+ name: General
+ color: '#3498db'
+
+- slug: conference
+ name: Conference
+ color: '#1abc9c'
+
+- slug: howto
+ name: Howto
+ color: '#1abc9c'
+
+- slug: api
+ name: API
+ color: '#1abc9c'
+
+- slug: product
+ name: Product
+ color: '#1abc9c'
diff --git a/_data/tags.yml b/_data/tags.yml
new file mode 100644
index 0000000..998d113
--- /dev/null
+++ b/_data/tags.yml
@@ -0,0 +1,35 @@
+- slug: security
+ name: Security
+
+- slug: cloud
+ name: Cloud
+
+- slug: cto
+ name: CTO
+
+- slug: communication
+ name: Communication
+
+- slug: open-source
+ name: Open Source
+
+- slug: api
+ name: API
+
+- slug: microservice
+ name: Microservice
+
+- slug: devops
+ name: Devops
+
+- slug: docker
+ name: Docker
+
+- slug: mobile
+ name: Mobile
+
+- slug: custdev
+ name: Customer Development
+
+- slug: smartsteuer
+ name: Smartsteuer
\ No newline at end of file
diff --git a/_layouts/blog_by_category.html b/_layouts/blog_by_category.html
new file mode 100644
index 0000000..3da3280
--- /dev/null
+++ b/_layouts/blog_by_category.html
@@ -0,0 +1,37 @@
+---
+layout: default
+---
+
+
+
+
+ {% if site.categories[page.category] %}
+ {% for post in site.categories[page.category] %}
+ {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
+ {% if forloop.first %}
+
{{ post_year }}
+ {% endif %}
+
+ {% if forloop.first == false %}
+ {% assign previous_index = forloop.index0 | minus: 1 %}
+ {% capture previous_post_year %}{{ site.categories[page.category][previous_index].date | date: '%Y' }}{% endcapture %}
+ {% if post_year != previous_post_year %}
+
{{ post_year }}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+
There are no posts in this category.
+ {% endif %}
+
\ No newline at end of file
diff --git a/_layouts/blog_by_tag.html b/_layouts/blog_by_tag.html
new file mode 100644
index 0000000..69ea789
--- /dev/null
+++ b/_layouts/blog_by_tag.html
@@ -0,0 +1,37 @@
+---
+layout: default
+---
+
+
+
+
+ {% if site.tags[page.tag] %}
+ {% for post in site.tags[page.tag] %}
+ {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
+ {% if forloop.first %}
+
{{ post_year }}
+ {% endif %}
+
+ {% if forloop.first == false %}
+ {% assign previous_index = forloop.index0 | minus: 1 %}
+ {% capture previous_post_year %}{{ site.tags[page.tag][previous_index].date | date: '%Y' }}{% endcapture %}
+ {% if post_year != previous_post_year %}
+
{{ post_year }}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+
There are no posts for this tag.
+ {% endif %}
+
\ No newline at end of file
diff --git a/_layouts/post.html b/_layouts/post.html
index 288aaf3..fb75435 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -2,6 +2,8 @@
layout: default
---
+{% assign post = page %}
+
{{page.title}}
@@ -9,6 +11,38 @@ layout: default
{{page.date | date: "%B %d, %Y" }}
/
by {{page.author}}
+
+ {% if post.category %}
+ {% for site_category in site.data.categories %}
+ {% if site_category.slug == post.category %}
+ {% assign category = site_category %}
+ {% endif %}
+ {% endfor %}
+ {% if category %}
+ {% capture category_content %} in {{ category.name }}{% endcapture %}
+ {% endif %}
+ {% else %}
+ {% assign category_content = '' %}
+ {% endif %}
+
+ {% if post.tags.size > 0 %}
+ {% capture tags_content %} with {% if post.tags.size == 1 %}{% else %}{% endif %}: {% endcapture %}
+ {% for post_tag in post.tags %}
+ {% for data_tag in site.data.tags %}
+ {% if data_tag.slug == post_tag %}
+ {% assign tag = data_tag %}
+ {% endif %}
+ {% endfor %}
+ {% if tag %}
+ {% capture tags_content_temp %}{{ tags_content }}{{ tag.name }}{% if forloop.last == false %}, {% endif %}{% endcapture %}
+ {% assign tags_content = tags_content_temp %}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+ {% assign tags_content = '' %}
+ {% endif %}
+
+ Posted {{ category_content }}{{ tags_content }}
diff --git a/_posts/2015-11-11-Hello-World.md b/_posts/2015-11-11-Hello-World.md
index b379612..ac470f0 100644
--- a/_posts/2015-11-11-Hello-World.md
+++ b/_posts/2015-11-11-Hello-World.md
@@ -4,6 +4,7 @@ title: We are live or How to start a developer blog
subtite: A short introduction
description: How to start our developer blog
category: general
+tags: [cto, communication]
author: Holger
author_email: holger.reinhardt@haufe-lexware.com
---
diff --git a/_posts/2015-11-17-oscon.md b/_posts/2015-11-17-oscon.md
index 46214bb..d583784 100644
--- a/_posts/2015-11-17-oscon.md
+++ b/_posts/2015-11-17-oscon.md
@@ -3,7 +3,8 @@ layout: post
title: Notes from OSCON Europe 2015
subtite:
description: Notes from OSCON Europe 2015
-category: general
+category: conference
+tags: [open-source]
author: Marco
author_email: marco.seifried@haufe-lexware.com
---
diff --git a/_posts/2015-11-19-api-journey.md b/_posts/2015-11-19-api-journey.md
index 14ca2d3..b3e85bc 100644
--- a/_posts/2015-11-19-api-journey.md
+++ b/_posts/2015-11-19-api-journey.md
@@ -4,6 +4,7 @@ title: The beginnings of our API Journey
subtite: Intro to our API style guide
description: Got API?
category: api
+tags: [api]
author: Holger
author_email: holger.reinhardt@haufe-lexware.com
---
diff --git a/_posts/2015-12-07-devopscon-2015.md b/_posts/2015-12-07-devopscon-2015.md
index 90a763c..b42e812 100644
--- a/_posts/2015-12-07-devopscon-2015.md
+++ b/_posts/2015-12-07-devopscon-2015.md
@@ -3,7 +3,8 @@ layout: post
title: Notes from DevOpsCon 2015
subtite:
description: Notes from DevOpsCon 2015
-category: general
+category: conference
+tags: [docker, devops]
author: Rainer
author_email: rainer.zehnle@haufe-lexware.com
---
diff --git a/_posts/2015-12-08-DockerCon-EU-2015.md b/_posts/2015-12-08-DockerCon-EU-2015.md
index a88d9c2..8867de1 100644
--- a/_posts/2015-12-08-DockerCon-EU-2015.md
+++ b/_posts/2015-12-08-DockerCon-EU-2015.md
@@ -3,7 +3,8 @@ layout: post
title: Impressions from DockerCon EU 2015 - Part 1
subtite: Insights, Outlooks and Inbetweens
description: Notes from DevOpsCon 2015
-category: general
+category: conference
+tags: [docker, security]
author: ThomasSc
author_email: thomas.schuering@haufe-lexware.com
---
diff --git a/_posts/2015-12-11-apidays-paris.md b/_posts/2015-12-11-apidays-paris.md
index 4ec7fc5..f6a9561 100644
--- a/_posts/2015-12-11-apidays-paris.md
+++ b/_posts/2015-12-11-apidays-paris.md
@@ -3,7 +3,8 @@ layout: post
title: APIdays Paris - From Philosophy to Technology and back again
subtite: A biased report from APIdays global in Paris
description: APIdays Paris - From Philosophy to Technology and back again
-category: general
+category: conference
+tags: [api]
author: Martin
author_email: martin.danielsson@haufe-lexware.com
---
diff --git a/_posts/2015-12-15-dockercon_eu_2015.md b/_posts/2015-12-15-dockercon_eu_2015.md
index 87ad0c4..69f3efb 100644
--- a/_posts/2015-12-15-dockercon_eu_2015.md
+++ b/_posts/2015-12-15-dockercon_eu_2015.md
@@ -3,7 +3,8 @@ layout: post
title: Impressions from DockerCon 2015 - Part 2
subtitle: Barcelona 16. + 17.11.2015
description: my highlights and picks from DockerCon 2015
-category: docker
+category: conference
+tags: [docker]
author: Peter Frey
author_email: peter.frey@haufe-lexware.com
---
diff --git a/_posts/2015-12-17-letsencrypt.md b/_posts/2015-12-17-letsencrypt.md
index cd0dafc..748bd44 100644
--- a/_posts/2015-12-17-letsencrypt.md
+++ b/_posts/2015-12-17-letsencrypt.md
@@ -4,6 +4,7 @@ title: Howto - Leverage 'Let's Encrypt' on Azure
subtitle: Create free valid SSL certificates in 20 minutes.
description: Howto - Leverage 'Let's Encrypt' on an Azure Ubuntu VM
category: howto
+tags: [security, cloud]
author: Martin
author_email: martin.danielsson@haufe-lexware.com
---
diff --git a/_posts/2015-12-31-smartsteuer-snap-app.md b/_posts/2015-12-31-smartsteuer-snap-app.md
index 62ba747..d22d9ad 100644
--- a/_posts/2015-12-31-smartsteuer-snap-app.md
+++ b/_posts/2015-12-31-smartsteuer-snap-app.md
@@ -3,7 +3,8 @@ layout: post
title: Creating the Smartsteuer 'Snap' App
subtitle: A backstage report
description: A behind the scenes view of the birth of our youngest creation.
-category: Smartsteuer
+category: product
+tags: [smartsteuer, mobile, custdev]
author: Eike Hirsch
author_email: eike.hirsch@smartsteuer.de
---
diff --git a/_posts/2015-12-8-microservices-devopscon.md b/_posts/2015-12-8-microservices-devopscon.md
index 2bd7e14..94c9cc6 100644
--- a/_posts/2015-12-8-microservices-devopscon.md
+++ b/_posts/2015-12-8-microservices-devopscon.md
@@ -3,7 +3,8 @@ layout: post
title: DevOpsCon Munich - Is it really about the tools?
subtite: A opinionated commentary by Elias Weingaertner
description: My personal findings from DevOpsCon 2015 in Munich
-category: general
+category: conference
+tags: [devops, microservice]
author: Elias Weingaertner
author_email: elias.weingaertner@haufe-lexware.com
---
diff --git a/index.html b/index.html
index 9c35f0e..410716c 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,7 @@ layout: default
---
- {% for post in site.posts %}
+ {% for post in site.posts limit: 6 %}
@@ -15,4 +15,6 @@ layout: default
Read More
{% endfor %}
+
+
more
From 2a4576bed7945d9439832328b3757334258bc582 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:04:16 +0100
Subject: [PATCH 13/47] Changing layout of category and tags
---
_layouts/post.html | 12 ++++++------
index.html | 4 +---
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/_layouts/post.html b/_layouts/post.html
index fb75435..4aedddd 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -8,10 +8,6 @@ layout: default
{{page.title}}
- {{page.date | date: "%B %d, %Y" }}
- /
- by {{page.author}}
-
{% if post.category %}
{% for site_category in site.data.categories %}
{% if site_category.slug == post.category %}
@@ -26,7 +22,7 @@ layout: default
{% endif %}
{% if post.tags.size > 0 %}
- {% capture tags_content %} with {% if post.tags.size == 1 %}{% else %}{% endif %}: {% endcapture %}
+ {% capture tags_content %} with tags: {% endcapture %}
{% for post_tag in post.tags %}
{% for data_tag in site.data.tags %}
{% if data_tag.slug == post_tag %}
@@ -42,7 +38,11 @@ layout: default
{% assign tags_content = '' %}
{% endif %}
-
Posted {{ category_content }}{{ tags_content }}
+ {{page.date | date: "%B %d, %Y" }}
+ /
+ by {{page.author}}
+ /
+ Posted {{ category_content }}{{ tags_content }}
diff --git a/index.html b/index.html
index 410716c..9c35f0e 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,7 @@ layout: default
---
- {% for post in site.posts limit: 6 %}
+ {% for post in site.posts %}
@@ -15,6 +15,4 @@ layout: default
Read More
{% endfor %}
-
-
more
From 7e2d0ec41b7d0f0898381dd8547431a986769b34 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:16:43 +0100
Subject: [PATCH 14/47] linebreak
---
_layouts/post.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_layouts/post.html b/_layouts/post.html
index 4aedddd..7569e18 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -41,7 +41,7 @@ layout: default
{{page.date | date: "%B %d, %Y" }}
/
by {{page.author}}
- /
+
Posted {{ category_content }}{{ tags_content }}
From f06493136c78dc49778e912429a860472acdeb8a Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:22:21 +0100
Subject: [PATCH 15/47] adding general category path
---
meta/category/general.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 meta/category/general.md
diff --git a/meta/category/general.md b/meta/category/general.md
new file mode 100644
index 0000000..ff47ae3
--- /dev/null
+++ b/meta/category/general.md
@@ -0,0 +1,5 @@
+---
+layout: blog_by_category
+title: 'Articles by category: general'
+category: general
+---
\ No newline at end of file
From 1279e2d5159a2917ccf8436052dc5c05dedbb0bd Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:24:15 +0100
Subject: [PATCH 16/47] fixing path
---
_layouts/post.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/_layouts/post.html b/_layouts/post.html
index 7569e18..d6e25bf 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -15,7 +15,7 @@ layout: default
{% endif %}
{% endfor %}
{% if category %}
- {% capture category_content %} in {{ category.name }}{% endcapture %}
+ {% capture category_content %} in {{ category.name }}{% endcapture %}
{% endif %}
{% else %}
{% assign category_content = '' %}
@@ -30,7 +30,7 @@ layout: default
{% endif %}
{% endfor %}
{% if tag %}
- {% capture tags_content_temp %}{{ tags_content }}{{ tag.name }}{% if forloop.last == false %}, {% endif %}{% endcapture %}
+ {% capture tags_content_temp %}{{ tags_content }}{{ tag.name }}{% if forloop.last == false %}, {% endif %}{% endcapture %}
{% assign tags_content = tags_content_temp %}
{% endif %}
{% endfor %}
From a2adac6a6fb2764bcb0795485aec587c24c932ea Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:29:48 +0100
Subject: [PATCH 17/47] wip
---
meta/category/general.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/meta/category/general.md b/meta/category/general.md
index ff47ae3..f5796b5 100644
--- a/meta/category/general.md
+++ b/meta/category/general.md
@@ -2,4 +2,5 @@
layout: blog_by_category
title: 'Articles by category: general'
category: general
----
\ No newline at end of file
+permalink: /meta/category/general
+---
From c50f2d4a16b0ccd4a1ac82ba9c1505ebe532b160 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:31:33 +0100
Subject: [PATCH 18/47] wip
---
meta/category/general.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meta/category/general.md b/meta/category/general.md
index f5796b5..59f8b56 100644
--- a/meta/category/general.md
+++ b/meta/category/general.md
@@ -2,5 +2,5 @@
layout: blog_by_category
title: 'Articles by category: general'
category: general
-permalink: /meta/category/general
+permalink: /meta/category/general/
---
From 25707bb8a49c2e6c679db689550def254f0f4d4b Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:49:37 +0100
Subject: [PATCH 19/47] wip
---
_layouts/blog_by_category.html | 37 ----------------
_layouts/post_by_category.html | 44 +++++++++++++++++++
.../{blog_by_tag.html => post_by_tag.html} | 0
meta/category/general.md | 4 +-
4 files changed, 47 insertions(+), 38 deletions(-)
delete mode 100644 _layouts/blog_by_category.html
create mode 100644 _layouts/post_by_category.html
rename _layouts/{blog_by_tag.html => post_by_tag.html} (100%)
diff --git a/_layouts/blog_by_category.html b/_layouts/blog_by_category.html
deleted file mode 100644
index 3da3280..0000000
--- a/_layouts/blog_by_category.html
+++ /dev/null
@@ -1,37 +0,0 @@
----
-layout: default
----
-
-
-
-
- {% if site.categories[page.category] %}
- {% for post in site.categories[page.category] %}
- {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
- {% if forloop.first %}
-
{{ post_year }}
- {% endif %}
-
- {% if forloop.first == false %}
- {% assign previous_index = forloop.index0 | minus: 1 %}
- {% capture previous_post_year %}{{ site.categories[page.category][previous_index].date | date: '%Y' }}{% endcapture %}
- {% if post_year != previous_post_year %}
-
{{ post_year }}
- {% endif %}
- {% endfor %}
- {% else %}
-
There are no posts in this category.
- {% endif %}
-
\ No newline at end of file
diff --git a/_layouts/post_by_category.html b/_layouts/post_by_category.html
new file mode 100644
index 0000000..5ea5564
--- /dev/null
+++ b/_layouts/post_by_category.html
@@ -0,0 +1,44 @@
+---
+layout: default
+---
+
+
+ {{site.data.categories[page.category].name}}
+
+
+ Articles by category
+
+
+
+
+
+ {% if site.categories[page.category] %}
+ {% for post in site.categories[page.category] %}
+ {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
+ {% if forloop.first %}
+
{{ post_year }}
+ {% endif %}
+
+ {% if forloop.first == false %}
+ {% assign previous_index = forloop.index0 | minus: 1 %}
+ {% capture previous_post_year %}{{ site.categories[page.category][previous_index].date | date: '%Y' }}{% endcapture %}
+ {% if post_year != previous_post_year %}
+
{{ post_year }}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+ There are no posts in this category.
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/_layouts/blog_by_tag.html b/_layouts/post_by_tag.html
similarity index 100%
rename from _layouts/blog_by_tag.html
rename to _layouts/post_by_tag.html
diff --git a/meta/category/general.md b/meta/category/general.md
index 59f8b56..01314d9 100644
--- a/meta/category/general.md
+++ b/meta/category/general.md
@@ -1,6 +1,8 @@
---
-layout: blog_by_category
+layout: page
title: 'Articles by category: general'
category: general
permalink: /meta/category/general/
---
+
+## foobar
\ No newline at end of file
From 017a46856d4ebdadd3ccbc6e1b67eb03ae3d6d6d Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 21:52:46 +0100
Subject: [PATCH 20/47] removing some temp content
---
meta/category/general.md | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/meta/category/general.md b/meta/category/general.md
index 01314d9..8750916 100644
--- a/meta/category/general.md
+++ b/meta/category/general.md
@@ -1,8 +1,6 @@
---
-layout: page
+layout: post_by_category
title: 'Articles by category: general'
category: general
permalink: /meta/category/general/
---
-
-## foobar
\ No newline at end of file
From 0e39c749bff75f6985999342100ef9a34aad5787 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 22:06:34 +0100
Subject: [PATCH 21/47] Category fine-tuning
---
_data/categories.yml | 5 -----
_layouts/post.html | 2 +-
_layouts/post_by_category.html | 2 +-
meta/category/general.md | 2 +-
4 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/_data/categories.yml b/_data/categories.yml
index fa63c9a..9efe06e 100644
--- a/_data/categories.yml
+++ b/_data/categories.yml
@@ -1,19 +1,14 @@
- slug: general
name: General
- color: '#3498db'
- slug: conference
name: Conference
- color: '#1abc9c'
- slug: howto
name: Howto
- color: '#1abc9c'
- slug: api
name: API
- color: '#1abc9c'
- slug: product
name: Product
- color: '#1abc9c'
diff --git a/_layouts/post.html b/_layouts/post.html
index d6e25bf..5de6c54 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -15,7 +15,7 @@ layout: default
{% endif %}
{% endfor %}
{% if category %}
- {% capture category_content %} in {{ category.name }}{% endcapture %}
+ {% capture category_content %} in {{ category.name }}{% endcapture %}
{% endif %}
{% else %}
{% assign category_content = '' %}
diff --git a/_layouts/post_by_category.html b/_layouts/post_by_category.html
index 5ea5564..fe4dbae 100644
--- a/_layouts/post_by_category.html
+++ b/_layouts/post_by_category.html
@@ -3,7 +3,7 @@ layout: default
---
- {{site.data.categories[page.category].name}}
+ {{page.title}}
Articles by category
diff --git a/meta/category/general.md b/meta/category/general.md
index 8750916..053e765 100644
--- a/meta/category/general.md
+++ b/meta/category/general.md
@@ -1,6 +1,6 @@
---
layout: post_by_category
-title: 'Articles by category: general'
+title: General
category: general
permalink: /meta/category/general/
---
From ef31064b853fa7ed5fcc836d13fd96cb9c1936b3 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 22:19:40 +0100
Subject: [PATCH 22/47] activating tags, finishing categories
---
_layouts/post_by_tag.html | 67 ++++++++++++++++++++-----------------
meta/category/api.md | 6 ++++
meta/category/conference.md | 6 ++++
meta/category/howto.md | 6 ++++
meta/category/product.md | 6 ++++
meta/tag/docker.md | 6 ++++
meta/tag/security.md | 6 ++++
7 files changed, 73 insertions(+), 30 deletions(-)
create mode 100644 meta/category/api.md
create mode 100644 meta/category/conference.md
create mode 100644 meta/category/howto.md
create mode 100644 meta/category/product.md
create mode 100644 meta/tag/docker.md
create mode 100644 meta/tag/security.md
diff --git a/_layouts/post_by_tag.html b/_layouts/post_by_tag.html
index 69ea789..296c54a 100644
--- a/_layouts/post_by_tag.html
+++ b/_layouts/post_by_tag.html
@@ -2,36 +2,43 @@
layout: default
---
-
+
+ {{page.title}}
-
- {% if site.tags[page.tag] %}
- {% for post in site.tags[page.tag] %}
- {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
- {% if forloop.first %}
-
{{ post_year }}
- {% endif %}
-
- {% if forloop.first == false %}
- {% assign previous_index = forloop.index0 | minus: 1 %}
- {% capture previous_post_year %}{{ site.tags[page.tag][previous_index].date | date: '%Y' }}{% endcapture %}
- {% if post_year != previous_post_year %}
-
{{ post_year }}
+
+ Articles by tag
+
+
+
+
+
+ {% if site.tags[page.tag] %}
+ {% for post in site.tags[page.tag] %}
+ {% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
+ {% if forloop.first %}
+
{{ post_year }}
{% endif %}
- {% endif %}
-
-
- {{ post.title }}
-
+
+ {% if forloop.first == false %}
+ {% assign previous_index = forloop.index0 | minus: 1 %}
+ {% capture previous_post_year %}{{ site.tags[page.tag][previous_index].date | date: '%Y' }}{% endcapture %}
+ {% if post_year != previous_post_year %}
+
{{ post_year }}
- {% endif %}
- {% endfor %}
- {% else %}
-
There are no posts for this tag.
- {% endif %}
-
\ No newline at end of file
+ {% if forloop.last %}
+
+ {% endif %}
+ {% endfor %}
+ {% else %}
+
There are no posts for this tag.
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/meta/category/api.md b/meta/category/api.md
new file mode 100644
index 0000000..423cf62
--- /dev/null
+++ b/meta/category/api.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_category
+title: API
+category: api
+permalink: /meta/category/api/
+---
diff --git a/meta/category/conference.md b/meta/category/conference.md
new file mode 100644
index 0000000..ac2a777
--- /dev/null
+++ b/meta/category/conference.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_category
+title: Conference
+category: conference
+permalink: /meta/category/conference/
+---
diff --git a/meta/category/howto.md b/meta/category/howto.md
new file mode 100644
index 0000000..73f73b7
--- /dev/null
+++ b/meta/category/howto.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_category
+title: Howto
+category: howto
+permalink: /meta/category/howto/
+---
diff --git a/meta/category/product.md b/meta/category/product.md
new file mode 100644
index 0000000..31e8a28
--- /dev/null
+++ b/meta/category/product.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_category
+title: Product
+category: product
+permalink: /meta/category/product/
+---
diff --git a/meta/tag/docker.md b/meta/tag/docker.md
new file mode 100644
index 0000000..47d5f9f
--- /dev/null
+++ b/meta/tag/docker.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Docker
+tag: docker
+permalink: /meta/tag/docker/
+---
\ No newline at end of file
diff --git a/meta/tag/security.md b/meta/tag/security.md
new file mode 100644
index 0000000..82e9015
--- /dev/null
+++ b/meta/tag/security.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Security
+tag: security
+permalink: /meta/tag/security/
+---
From 4efb8aa1121d155592853c3ec868fda5d3bae730 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 22:42:52 +0100
Subject: [PATCH 23/47] Finishing up tag and category support
---
_data/tags.yml | 4 ++--
_posts/2015-11-11-Hello-World.md | 2 +-
meta/tag/api.md | 6 ++++++
meta/tag/cto.md | 6 ++++++
meta/tag/culture.md | 6 ++++++
meta/tag/custdev.md | 6 ++++++
meta/tag/devops.md | 6 ++++++
meta/tag/microservice.md | 6 ++++++
meta/tag/mobile.md | 6 ++++++
meta/tag/open-source.md | 6 ++++++
meta/tag/smartsteuer.md | 6 ++++++
11 files changed, 57 insertions(+), 3 deletions(-)
create mode 100644 meta/tag/api.md
create mode 100644 meta/tag/cto.md
create mode 100644 meta/tag/culture.md
create mode 100644 meta/tag/custdev.md
create mode 100644 meta/tag/devops.md
create mode 100644 meta/tag/microservice.md
create mode 100644 meta/tag/mobile.md
create mode 100644 meta/tag/open-source.md
create mode 100644 meta/tag/smartsteuer.md
diff --git a/_data/tags.yml b/_data/tags.yml
index 998d113..8244207 100644
--- a/_data/tags.yml
+++ b/_data/tags.yml
@@ -7,8 +7,8 @@
- slug: cto
name: CTO
-- slug: communication
- name: Communication
+- slug: culture
+ name: Culture
- slug: open-source
name: Open Source
diff --git a/_posts/2015-11-11-Hello-World.md b/_posts/2015-11-11-Hello-World.md
index ac470f0..3f7a15f 100644
--- a/_posts/2015-11-11-Hello-World.md
+++ b/_posts/2015-11-11-Hello-World.md
@@ -4,7 +4,7 @@ title: We are live or How to start a developer blog
subtite: A short introduction
description: How to start our developer blog
category: general
-tags: [cto, communication]
+tags: [cto, culture]
author: Holger
author_email: holger.reinhardt@haufe-lexware.com
---
diff --git a/meta/tag/api.md b/meta/tag/api.md
new file mode 100644
index 0000000..497291a
--- /dev/null
+++ b/meta/tag/api.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: API
+tag: api
+permalink: /meta/tag/api/
+---
\ No newline at end of file
diff --git a/meta/tag/cto.md b/meta/tag/cto.md
new file mode 100644
index 0000000..012ea78
--- /dev/null
+++ b/meta/tag/cto.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: CTO
+tag: cto
+permalink: /meta/tag/cto/
+---
\ No newline at end of file
diff --git a/meta/tag/culture.md b/meta/tag/culture.md
new file mode 100644
index 0000000..ec8474f
--- /dev/null
+++ b/meta/tag/culture.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Culture
+tag: culture
+permalink: /meta/tag/culture/
+---
\ No newline at end of file
diff --git a/meta/tag/custdev.md b/meta/tag/custdev.md
new file mode 100644
index 0000000..8df887c
--- /dev/null
+++ b/meta/tag/custdev.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Customer Development
+tag: custdev
+permalink: /meta/tag/custdev/
+---
\ No newline at end of file
diff --git a/meta/tag/devops.md b/meta/tag/devops.md
new file mode 100644
index 0000000..233a048
--- /dev/null
+++ b/meta/tag/devops.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Devops
+tag: devops
+permalink: /meta/tag/devops/
+---
\ No newline at end of file
diff --git a/meta/tag/microservice.md b/meta/tag/microservice.md
new file mode 100644
index 0000000..76fa770
--- /dev/null
+++ b/meta/tag/microservice.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Microservice
+tag: microservice
+permalink: /meta/tag/microservice/
+---
\ No newline at end of file
diff --git a/meta/tag/mobile.md b/meta/tag/mobile.md
new file mode 100644
index 0000000..e1b1cd5
--- /dev/null
+++ b/meta/tag/mobile.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Mobile
+tag: mobile
+permalink: /meta/tag/mobile/
+---
\ No newline at end of file
diff --git a/meta/tag/open-source.md b/meta/tag/open-source.md
new file mode 100644
index 0000000..72aca33
--- /dev/null
+++ b/meta/tag/open-source.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Open Source
+tag: open-source
+permalink: /meta/tag/open-source/
+---
\ No newline at end of file
diff --git a/meta/tag/smartsteuer.md b/meta/tag/smartsteuer.md
new file mode 100644
index 0000000..3df2783
--- /dev/null
+++ b/meta/tag/smartsteuer.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Smartsteuer
+tag: smartsteuer
+permalink: /meta/tag/smartsteuer/
+---
\ No newline at end of file
From e952d7ec3e4ea575417dffc0de588c891506a800 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 22:47:14 +0100
Subject: [PATCH 24/47] forgot cloud tag
---
meta/tag/cloud.md | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 meta/tag/cloud.md
diff --git a/meta/tag/cloud.md b/meta/tag/cloud.md
new file mode 100644
index 0000000..d4e8e79
--- /dev/null
+++ b/meta/tag/cloud.md
@@ -0,0 +1,6 @@
+---
+layout: post_by_tag
+title: Cloud
+tag: cloud
+permalink: /meta/tag/cloud/
+---
\ No newline at end of file
From 3bc386a95aa398780c0d497537cada3b392a93ee Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 23:02:31 +0100
Subject: [PATCH 25/47] Finishing tag and category support
---
README.md | 4 +++-
_posts/2015-12-07-devopscon-2015.md | 2 +-
_posts/2015-12-08-DockerCon-EU-2015.md | 2 +-
_posts/2015-12-8-microservices-devopscon.md | 2 +-
4 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index ad075cd..691fa9b 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,9 @@
Pull Requests from our design, development and operations teams of [Haufe.Group](http://www.haufe-lexware.com) and its subsidiaries are greatly appreciated. If you've never contributed to an open source project before we are more than happy to walk you through how to create a pull request.
-If you want to find out more about or want to improve our blog the following links might be a good starting point
+Support for Categories and Tags was inspired by [this blog entry](http://www.minddust.com/post/tags-and-categories-on-github-pages/)). A list of the defined categories and tags can be found at `_data/categories.yml` and `_data\tags.yml` respectively. If you want to add new categories or tags, you need to add them to the corresponding `.yml` file and add the matching template into the `meta/category` or `meta/tag` directories.
+
+If you want to find out more about using `github-pages` for blogging or want to improve our blog the following links might be good starting points
* [Jekyll documentation, i.e. how to include images](http://jekyllrb.com/docs/posts/)
* [Github pages powered by Jekyll](https://github.com/jekyll/jekyll/wiki/sites)
diff --git a/_posts/2015-12-07-devopscon-2015.md b/_posts/2015-12-07-devopscon-2015.md
index b42e812..b21323c 100644
--- a/_posts/2015-12-07-devopscon-2015.md
+++ b/_posts/2015-12-07-devopscon-2015.md
@@ -1,6 +1,6 @@
---
layout: post
-title: Notes from DevOpsCon 2015
+title: Notes from DevOpsCon 2015 - Part 1
subtite:
description: Notes from DevOpsCon 2015
category: conference
diff --git a/_posts/2015-12-08-DockerCon-EU-2015.md b/_posts/2015-12-08-DockerCon-EU-2015.md
index 8867de1..604249b 100644
--- a/_posts/2015-12-08-DockerCon-EU-2015.md
+++ b/_posts/2015-12-08-DockerCon-EU-2015.md
@@ -1,6 +1,6 @@
---
layout: post
-title: Impressions from DockerCon EU 2015 - Part 1
+title: Impressions from DockerCon 2015 - Part 1
subtite: Insights, Outlooks and Inbetweens
description: Notes from DevOpsCon 2015
category: conference
diff --git a/_posts/2015-12-8-microservices-devopscon.md b/_posts/2015-12-8-microservices-devopscon.md
index 94c9cc6..5f55029 100644
--- a/_posts/2015-12-8-microservices-devopscon.md
+++ b/_posts/2015-12-8-microservices-devopscon.md
@@ -1,6 +1,6 @@
---
layout: post
-title: DevOpsCon Munich - Is it really about the tools?
+title: DevOpsCon 2015 - Is it really about the tools?
subtite: A opinionated commentary by Elias Weingaertner
description: My personal findings from DevOpsCon 2015 in Munich
category: conference
From 381f3e110f9f935d912e79e97edbbc945285d350 Mon Sep 17 00:00:00 2001
From: Holger Reinhardt
Date: Mon, 4 Jan 2016 23:10:51 +0100
Subject: [PATCH 26/47] fixing some typos
---
README.md | 2 +-
_layouts/post.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 691fa9b..51a623d 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Pull Requests from our design, development and operations teams of [Haufe.Group](http://www.haufe-lexware.com) and its subsidiaries are greatly appreciated. If you've never contributed to an open source project before we are more than happy to walk you through how to create a pull request.
-Support for Categories and Tags was inspired by [this blog entry](http://www.minddust.com/post/tags-and-categories-on-github-pages/)). A list of the defined categories and tags can be found at `_data/categories.yml` and `_data\tags.yml` respectively. If you want to add new categories or tags, you need to add them to the corresponding `.yml` file and add the matching template into the `meta/category` or `meta/tag` directories.
+Support for Categories and Tags were inspired by [this blog entry](http://www.minddust.com/post/tags-and-categories-on-github-pages/). A list of the defined categories and tags can be found at `_data/categories.yml` and `_data\tags.yml` respectively. If you want to add new categories or tags, you need to add them to the corresponding `.yml` file and add the matching template into the `meta/category` or `meta/tag` directories.
If you want to find out more about using `github-pages` for blogging or want to improve our blog the following links might be good starting points
* [Jekyll documentation, i.e. how to include images](http://jekyllrb.com/docs/posts/)
diff --git a/_layouts/post.html b/_layouts/post.html
index 5de6c54..a129891 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -22,7 +22,7 @@ layout: default
{% endif %}
{% if post.tags.size > 0 %}
- {% capture tags_content %} with tags: {% endcapture %}
+ {% capture tags_content %} with tags {% endcapture %}
{% for post_tag in post.tags %}
{% for data_tag in site.data.tags %}
{% if data_tag.slug == post_tag %}
From f482e6d566c407d7243a7aa89b312418810d93e1 Mon Sep 17 00:00:00 2001
From: dutzu
Date: Wed, 13 Jan 2016 10:03:09 +0200
Subject: [PATCH 27/47] Added log aggregation blog post
---
_posts/2016-01-11-Log-aggregation | 195 +++++++++++++++++++++++
images/logaggregation-analyzed-field.png | Bin 0 -> 24169 bytes
images/logaggregation-efk.png | Bin 0 -> 86295 bytes
images/logaggregation-elk.png | Bin 0 -> 129237 bytes
4 files changed, 195 insertions(+)
create mode 100644 _posts/2016-01-11-Log-aggregation
create mode 100644 images/logaggregation-analyzed-field.png
create mode 100644 images/logaggregation-efk.png
create mode 100644 images/logaggregation-elk.png
diff --git a/_posts/2016-01-11-Log-aggregation b/_posts/2016-01-11-Log-aggregation
new file mode 100644
index 0000000..62f0510
--- /dev/null
+++ b/_posts/2016-01-11-Log-aggregation
@@ -0,0 +1,195 @@
+---
+title: Log aggregation
+subtite: A short introduction
+description: Introduction to log aggregation using Fluentd, Elasticsearch and Kibana
+category: howto
+tags: [fluentd, log, ELK, EFK]
+author: Doru Mihai
+author_email: doru.mihai@haufe-lexware.com
+---
+
+With an increasing number of systems decoupled and scattered throughout the landscape it becomes increasingly difficult to track and trace events across all systems.
+Log aggregation solutions provides a series of benefits to distributed systems.
+
+The problems it tackles are:
+- Centralized, aggregated view over all log events
+- Normalization of log schema
+- Automated processing of log messages
+- Support for a great number of event sources and outputs
+
+One of the most prolific open source solutions on the market is the [ELK stack](https://www.elastic.co/videos/introduction-to-the-elk-stack) created by Elastic.
+
+
+
+ELK stands for Elasticsearch – Logstash – Kibana and they are respectively their Search engine, Log Shipper and Visualization frontend solutions.
+Elasticsearch becomes the nexus for gathering and storing the log data and it is not exclusive to Logstash.
+
+Another very good data collection solution on the market is Fluentd, and it also supports Elasticsearch (amongst others) as the destination for it’s gathered data. So using the same data repository and frontend solutions, this becomes the EFK stack and if you do a bit of searching you will discover many people have chosen to substitute Elastic's logstash with FluentD and we will talk about why that is in a minute.
+
+
+
+
+
+# Logstash vs FluentD
+Both of them are very capable, have [hundreds](https://www.elastic.co/guide/en/logstash/current/input-plugins.html) and [hundreds](http://www.fluentd.org/plugins) of plugins available and are being maintained actively by corporation backed support.
+### Technology - Fluentd wins
+The big elephant in the room is that Logstash is written in JRuby and FluentD is [written in Ruby with performance sensitive parts in C](http://www.fluentd.org/faqs). As a result the overhead of running a JVM for the log shipper translates in large memory consumption, especially when you compare it to the footprint of Fluentd. The only advantage that Logstash can still invoke is the good parallelism support that the JVM brings and very good [Grok](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) support.
+
+The only downside for Fluentd was the lack of support for Windows, but even that has been [solved](https://github.com/fluent/fluentd/pull/674) and [grok](https://github.com/kiyoto/fluent-plugin-grok-parser) support is also available for Fluentd and you can even re-use the grok libraries you had used/built, even [Logstash grok patterns](https://github.com/elastic/logstash/tree/v1.4.2/patterns).
+### Shippers - Fluentd wins
+They both however offer the option of deploying lightweight components that will only read and send the log messages to a fully fledged instance that will do the necessary processing. These are called log forwarders and both have lightweight forwarders written in Go. As of this writing Elastic has released a replacement for it's [logstash-forwarder](https://github.com/elastic/logstash-forwarder)(formerly called Lumberjack) and it is built on top of it's new Data shipper platform [Beats](https://www.elastic.co/products/beats), and it is called [Filebeat](https://github.com/elastic/beats/tree/master/filebeat).
+
+This new Logstash forwarder allows for a TLS secured communication with the log shipper, something that the old one was not capable of but it is still lacking a very valuable feature that fluentd offers, and that is buffering.
+### Resiliency - Fluentd wins
+As mentioned previously fluentd offers buffering, something that you get "for free" and coupled with the active client-side load balancing you get a very competent solution without a large footprint.
+
+On the other side, logstash doesn't have buffering and only has an in-memory queue of messages that is fixed in length (20 messages) so in case messages can't get through, they are lost. To alleviate this weakness the common practice is to set up an external queue (like [Redis](http://www.logstash.net/docs/1.3.2//tutorials/getting-started-centralized)) for persistence of the messages in case something goes wrong at either end. They are [working on it](https://github.com/elastic/logstash/issues/2605) though, so in the future we might see an improvement in this area.
+
+Fluentd offers in-memory or file based buffering coupled with [active-active and active-standby load balancing and even weighted load balancing](http://docs.fluentd.org/articles/high-availability) and last but not least it also offers [at-most-once and at-least-once](http://docs.fluentd.org/articles/out_forward#requireackresponse) semantics.
+
+# Additional considerations
+
+Logstash benefits from a more chiselled, mature implementation due to the fact that the core and a lot of the essential plugins are maintained by Elastic, and some may argue that it's easier to deploy a JRE and the logstash jar and be done with it while others would consider it overkill to have a JVM running for such a small task. Plus the need to deploy and maintain a separate queueing
+
+Fluentd provides just the core and a couple of input/output plugins and filters and the rest of the large number of plugins available are community driven and so you are exposed to the risk of potential version incompatibilities and lack of documentation and support.
+
+I have personally seen that there is a bit of chaos since each plugin creator will define his own set of configuration input variables and there isn't a sense of consistency when you look at different plugins. You will encounter variables that are optional and have different default values, variables that are not properly documented but you can deduct their usage from the examples that the author offers and virtually all known naming conventions will appear in your config file.
+
+# What next?
+
+Well, as you can probably already tell, I have chosen to go with fluentd, and as such it became quickly apparent that I need to integrate it with Elasticsearch and Kibana to have a complete solution, and that wasn't a smooth ride due to 2 issues:
+- Timestamps were sent to Elasticsearch without milliseconds
+- All field values were by default analyzed fields
+
+For communicating with Elasticsearch I used the plugin [fluent-plugin-elasticsearch](https://github.com/uken/fluent-plugin-elasticsearch) as presented in one of their very helpful [use case tutorials](http://docs.fluentd.org/articles/free-alternative-to-splunk-by-fluentd).
+
+This plugin allows fluentd to impersonate logstash by just enabling the setting `logstash-format` in the configuration file. I snooped arround a bit and found that basically the only difference is that the plugin will make sure that the message sent has a timestamp field named `@timestamp`.
+
+And here we arrive at our first problem....
+
+### Timestamp fix
+This is a pain because if you want to properly visualize a set of log messages gathered from multiple systems, in sequence, to be able to see exactly what step followed the other.....well, you see the problem.
+
+Let's take a look at what fluentd sends to Elasticsearch. Here is a sample log file with 2 log messages:
+
+~~~java
+2015-11-12 06:34:01,471 [ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO ==== Request ===
+2015-11-12 06:34:01,473 [ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO GET /monitor/broker/ HTTP/1.1
+~~~
+
+A message sent to Elasticsearch from fluentd would contain these values:
+
+*-this isn't the exact message, this is the result of the stdout output plugin-*
+~~~ruby
+2015-11-12 06:34:01 -0800 tag.common: {"message":"[ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO ==== Request ===","time_as_string":"2015-11-12 06:34:01 -0800"}
+
+2015-11-12 06:34:01 -0800 tag.common: {"message":"[ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO GET /monitor/broker/ HTTP/1.1\n","time_as_string":"2015-11-12 06:34:01 -0800"}
+~~~
+
+I added the `time_as_string` field in there just so you can see the literal string that is sent as the time value.
+
+This is a known issue and initially it was the fault of fluentd for not supporting that level of granularity, but is had been [fixed](https://github.com/fluent/fluentd/issues/461). Sadly, the fix has not made it's way to the Elasticsearch plugin and so, [alternatives have appeared](https://github.com/shivaken/fluent-plugin-better-timestamp).
+
+The fix basically involves manually formatting the `@timestamp` field to have the format `YYYY-MM-ddThh:mm:ss.SSSZ`. So you can either bring on the previously mentioned `fluent-plugin-better-timestamp` into your log processing pipeline to act as a filter that fixes your timestamps OR you can build it yourself.
+
+In order to build it yourself you only need the `record_transformer` filter that is part of the core of plugins that fluentd comes with and that I anyway would recommend you use for enriching your messages with things like the source hostname for example.
+
+Next you need to parse the timestamp of your logs into separate date, time and millisecond components (which is basically what the better-timestamp plugin asks you to do, to some extent), and then to create a filter that would match all the messages you will send to Elasticsearch and to create the `@timestamp` value by appending the 3 components. This makes use of the fact that fluentd also allows you to run ruby code within your record_transformer filters to accommodate for more special log manipulation tasks.
+
+~~~xml
+
+ type record_transformer
+ enable_ruby true
+
+ @timestamp ${date_string + "T" + time_string + "." + msec + "Z"}
+
+
+~~~
+
+The result is that the above sample will come out like this:
+~~~ruby
+2015-12-12 05:26:15 -0800 akai.common: {"date_string":"2015-11-12","time_string":"06:34:01","msec":"471","message":"[ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO ==== Request ===","@timestamp":"2015-11-12T06:34:01.471Z"}
+2015-12-12 05:26:15 -0800 akai.common: {"date_string":"2015-11-12","time_string":"06:34:01","msec":"473","message":"[ ajp-apr-127.0.0.1-8009-exec-3] LogInterceptor INFO GET /monitor/broker/ HTTP/1.1\n","@timestamp":"2015-11-12T06:34:01.473Z"}
+~~~
+
+*__Note__: you can use the same record_transformer filter to remove the 3 separate time components after creating the `@timestamp` field via the `remove_keys` option.*
+
+### Do not analyse
+
+There are 2 reasons why you shouldn't want your fields to be analyzed in this scenario:
+- It will potentially increase the storage requirements
+- It will make it impossible to do proper analysis and visualization on your data if you have field values that contain hyphens, dots or others.
+
+Ok, so first, why does it increase the storage requirements?
+
+Well, while researching what would be the proper hardware sizing requirements for setting up our production EFK installation I stumbled upon [this](http://peter.mistermoo.com/2015/01/05/hardware-sizing-or-how-many-servers-do-i-really-need/) post that goes in detail about what and why and how big can the problem become.
+
+Worst case scenario, you could be using up to **40% more** disk space than you really need. Pretty bad huh?
+
+And the second issue which would become apparent much quicker than the first is that when you will try to make use of Kibana to visualize your data you will encounter the issue that fields that contain hyphens for example will appear split and duplicate when used in visualizations.
+
+For instance, by using the record_transformer I would send the hostname and also a statically specified field called `sourceProject`, to be able to group together messages that came from different identical instances of a project application.
+
+Using this example configuration I tried to create a pie chart showing the number of messages per project for a dashboard. Here is what I got.
+
+~~~ruby
+
+ type record_transformer
+ enable_ruby true
+
+ @timestamp ${date_string + "T" + time_string + "." + msec + "Z"}
+ sourceProject Test-Analyzed-Field
+
+
+~~~
+
+Sample output from stdout:
+~~~ruby
+2015-12-12 06:01:35 -0800 clear: {"date_string":"2015-10-15","time_string":"06:37:32","msec":"415","message":"[amelJettyClient(0xdc64419)-706] jetty:test/test INFO totallyAnonymousContent: http://whyAreYouReadingThis?:)/history/3374425?limit=1","@timestamp":"2015-10-15T06:37:32.415Z","sourceProject":"Test-Analyzed-Field"}
+~~~
+
+And here is the result of trying to use it in a visualization:
+
+
+
+
+I should mention, what you are seeing is the result of 6 messages that all have the field sourceProject set to the value "Test-Analyzed-Field".
+
+Sadly, once you put some data into Elasticsearch, indices are automatically created (by the fluent-plugin-elasticsearch) and mappings along with them and once a field is mapped as being analyzed [it cannot be changed](https://www.elastic.co/blog/changing-mapping-with-zero-downtime).
+
+Curiously this did not happen when using Logstash, which made me look into how they are handling this problem. Then I discovered the issue was discussed also in the context of the fluent-plugin-elasticsearch and [the solution was posted there](https://github.com/uken/fluent-plugin-elasticsearch/issues/33) along with the request to include it in future versions of the plugin.
+
+And the solution is: When Elasticsearch creates a new index, it will rely on the existence of a template to create that index. Logstash comes with a template of its own that it uses to tell Elasticsearch to create not analyzed copies of the fields it sends to it so that users can benefit from the analyzed fields for searching and the not analyzed fields when doing visualizations. And that template can be found [here](https://github.com/logstash-plugins/logstash-output-elasticsearch/blob/master/lib/logstash/outputs/elasticsearch/elasticsearch-template.json).
+
+And what you basically need to do is to do a curl put with that json content to ES and then all the indices created that are prefixed with `logstash-*` will use that template. Be aware that with the fluent-plugin-elasticsearch you can specify your own index prefix so make sure to adjust the template to match your prefix:
+
+~~~bash
+curl -XPUT localhost:9200/_template/template_doru -d '{
+ "template" : "logstash-*",
+ "settings" : {....
+}'
+~~~
+
+The main thing to note in the whole template is this section:
+~~~json
+"string_fields" : {
+ "match" : "*",
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "string", "index" : "analyzed", "omit_norms" : true,
+ "fielddata" : { "format" : "disabled" },
+ "fields" : {
+ "raw" : {"type": "string", "index" : "not_analyzed", "doc_values" : true, "ignore_above" : 256}
+ }
+ }
+}
+~~~
+
+This tells Elasticsearch that for any field of type string that it receives it should create a mapping of type string that is analyzed + another field that adds a `.raw` suffix that will not be analyzed.
+
+The `not_analyzed` suffixed field is the one you can safely use in visualizations, but do keep in mind that this creates the scenario mentioned before where you can have up to 40% inflation in storage requirements because you will have both analyzed and not_analyzed fields in store.
+
+# Have fun
+So, now you know what we went through here at Haufe and what problems we faced and how we can overcome them.
+
+If you want to give it a try you can take a look at our docker templates on github, there you will find a template for an EFK setup + a shipper that can transfer messages securely to the EFK solution and you can have it up and running in a matter of minutes: https://github.com/Haufe-Lexware/docker-templates/tree/master/logaggregation
diff --git a/images/logaggregation-analyzed-field.png b/images/logaggregation-analyzed-field.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a5846641a5d323157255f4c547c37082fa87afb
GIT binary patch
literal 24169
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
literal 0
HcmV?d00001
diff --git a/images/logaggregation-efk.png b/images/logaggregation-efk.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d200cb9c6973eade0b3d068dde27be61b1a51b6
GIT binary patch
literal 86295
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