Merge pull request #28 from hlgr360/master

Fixing image rendering caused by change to Kramdown
This commit is contained in:
Holger Reinhardt 2016-02-03 16:57:30 +01:00
commit 42e44ac3e9
23 changed files with 54 additions and 42 deletions

View file

@ -56,7 +56,7 @@ baseurl: ""
# !! You don't need to change any of the configuration flags below !! # !! You don't need to change any of the configuration flags below !!
# #
markdown: kramdown # markdown: kramdown
highlighter: rouge highlighter: rouge
permalink: /:title/ permalink: /:title/

View file

@ -11,10 +11,9 @@ header-img: "images/bg-post.jpg"
Having just recently come home again from the [APIdays](http://www.apidays.io) conference in Paris (Dec 8-9th 2015), memories are still quite fresh. It was a crowded event, the first day hosting a whopping 800 API enthusiasts, ranging from the geekiest of the geeks to a fair amount of suited business people, showing that talking about APIs is no longer something just the most avantgardist of companies, the most high tech of the tech companies, spend their time with. *Au contraire* (we were in Paris after all), APIs are mainstream, and they contribute to the advancing of collaboration and automatization of the (digital) world as such. Having just recently come home again from the [APIdays](http://www.apidays.io) conference in Paris (Dec 8-9th 2015), memories are still quite fresh. It was a crowded event, the first day hosting a whopping 800 API enthusiasts, ranging from the geekiest of the geeks to a fair amount of suited business people, showing that talking about APIs is no longer something just the most avantgardist of companies, the most high tech of the tech companies, spend their time with. *Au contraire* (we were in Paris after all), APIs are mainstream, and they contribute to the advancing of collaboration and automatization of the (digital) world as such.
<center> {:.center}
![Eiffel Tower - Paris]({{ site.url }}/images/2015-12-11-paris-eiffeltower.jpg) ![Eiffel Tower - Paris]({{ site.url }}/images/2015-12-11-paris-eiffeltower.jpg){:style="margin:auto"}
<small>(Image by Martin Danielsson, [CC BY 4.0 License](https://creativecommons.org/licenses/by/4.0/))</small> <small>(Image by Martin Danielsson, [CC BY 4.0 License](https://creativecommons.org/licenses/by/4.0/))</small>
</center>
This was also one of the reasons the topic of APIdays was chosen as such: **Automating IT, Business and the whole society with APIs**. The partly non-techy twist of the subtitle to APIdays was also reflected in the sessions: Split into roughly three (or four) categories, you had a choice between real tech stuff, business related sessions and quite a few workshops. In addition to that, the opening and ending keynotes were more kept in a philosophical tone, featuring (in the opening keynote) [Christian Fauré](http://www.christian-faure.net/) and renowned french philosopher [Bernard Stiegler](https://en.wikipedia.org/wiki/Bernard_Stiegler) (in the ending keynote), presenting their takes on digital automation, collaboration and its effects on society, with respect to APIs. Even [Steven Willmott](http://twitter.com/njyx) pulled off a rather non-techy talk, and even non-businessy talk, rather unusual for a CEO of one of the big players in API space ([3scale](http://www.3scale.net)). This was also one of the reasons the topic of APIdays was chosen as such: **Automating IT, Business and the whole society with APIs**. The partly non-techy twist of the subtitle to APIdays was also reflected in the sessions: Split into roughly three (or four) categories, you had a choice between real tech stuff, business related sessions and quite a few workshops. In addition to that, the opening and ending keynotes were more kept in a philosophical tone, featuring (in the opening keynote) [Christian Fauré](http://www.christian-faure.net/) and renowned french philosopher [Bernard Stiegler](https://en.wikipedia.org/wiki/Bernard_Stiegler) (in the ending keynote), presenting their takes on digital automation, collaboration and its effects on society, with respect to APIs. Even [Steven Willmott](http://twitter.com/njyx) pulled off a rather non-techy talk, and even non-businessy talk, rather unusual for a CEO of one of the big players in API space ([3scale](http://www.3scale.net)).
@ -52,10 +51,9 @@ Many of the more technical talks dealt with the usual suspects [Microservices an
The return to more serious topics, *Hypermedia* was an astonishingly big topic at the conference. Not that it's not a seriously good idea, but now adoption seems to find its way into real world scenarios, with practical and working specifications popping up, which are being adopted at an increasing rate. As Hypermedia leaves the state of a research topic (see below picture on [HATEOAS](https://en.wikipedia.org/wiki/HATEOAS) - Bless you!) and is actually being used. The return to more serious topics, *Hypermedia* was an astonishingly big topic at the conference. Not that it's not a seriously good idea, but now adoption seems to find its way into real world scenarios, with practical and working specifications popping up, which are being adopted at an increasing rate. As Hypermedia leaves the state of a research topic (see below picture on [HATEOAS](https://en.wikipedia.org/wiki/HATEOAS) - Bless you!) and is actually being used.
<center> {:.center}
![HATEOAS - Bless you!]({{ site.url }}/images/2015-12-11-hateoas.jpg) ![HATEOAS - Bless you!]({{ site.url }}/images/2015-12-11-hateoas.jpg){:style="margin:auto"}
<small>(Courtesy of [CommitStrip](http://www.commitstrip.com/en/2015/12/03/apiception/))</small> <small>(Courtesy of [CommitStrip](http://www.commitstrip.com/en/2015/12/03/apiception/))</small>
</center>
Many people are perhaps scared of the seemingly intransparent topic, but there are a lot of really good use cases for hypermedia. Jason Harmon of PayPal/Braintree ([@jharmn](http://twitter.com/jharmn)) pointed to some of the most prominent ones in his talk: Many people are perhaps scared of the seemingly intransparent topic, but there are a lot of really good use cases for hypermedia. Jason Harmon of PayPal/Braintree ([@jharmn](http://twitter.com/jharmn)) pointed to some of the most prominent ones in his talk:

View file

@ -27,15 +27,13 @@ You will need the following things, which this how-to does not provide you with:
To start things, open up the [Azure Portal](https://portal.azure.com) using your favorite web browser, and log in so that you have access to the Azure portal. Then click *Virtual machines (Classic)*, then *Add +*. To start things, open up the [Azure Portal](https://portal.azure.com) using your favorite web browser, and log in so that you have access to the Azure portal. Then click *Virtual machines (Classic)*, then *Add +*.
<center> {:.center}
![New VM]({{ site.url }}/images/letsencrypt-1-new-vm.png) ![New VM]({{ site.url }}/images/letsencrypt-1-new-vm.png){:style="margin:auto"}
</center>
Then, search for `ubuntu` and select *Ubuntu Server 14.04 LTS* (I think you can choose a regular Ubuntu, too, but this one definitely works). Then, search for `ubuntu` and select *Ubuntu Server 14.04 LTS* (I think you can choose a regular Ubuntu, too, but this one definitely works).
<center> {:.center}
![Select Ubuntu]({{ site.url }}/images/letsencrypt-2-select-ubuntu.png) ![Select Ubuntu]({{ site.url }}/images/letsencrypt-2-select-ubuntu.png){:style="margin:auto"}
</center>
Specify the correct settings for the VM. I chose the following specs for the VM: Specify the correct settings for the VM. I chose the following specs for the VM:
@ -46,9 +44,8 @@ Specify the correct settings for the VM. I chose the following specs for the VM:
* Add two endpoints: http (tunnel port 80) and https (tunnel port 443). See image below. * Add two endpoints: http (tunnel port 80) and https (tunnel port 443). See image below.
* Leave the rest of the setting to the defaults * Leave the rest of the setting to the defaults
<center> {:.center}
![VM Settings]({{ site.url }}/images/letsencrypt-3-vm-settings.png) ![VM Settings]({{ site.url }}/images/letsencrypt-3-vm-settings.png){:style="margin:auto"}
</center>
When you're done and all your settings have been confirmed (*OK*), click the *Create* button to provision your VM. When you're done and all your settings have been confirmed (*OK*), click the *Create* button to provision your VM.
@ -56,9 +53,8 @@ When you're done and all your settings have been confirmed (*OK*), click the *Cr
This will take some time (around 5 minutes), but after that, you will find the information on your machine in the following way: This will take some time (around 5 minutes), but after that, you will find the information on your machine in the following way:
<center> {:.center}
![Azure VM Provisioned]({{ site.url }}/images/letsencrypt-4-azure-name.png) ![Azure VM Provisioned]({{ site.url }}/images/letsencrypt-4-azure-name.png){:style="margin:auto"}
</center>
The automatically created DNS entry for your machine is displayed there, and this is the name you can use to connect to the machine using your favorite SSH tool (`ssh` if you're on Linux or Mac OS X, e.g PuTTY if you're on Windows). The automatically created DNS entry for your machine is displayed there, and this is the name you can use to connect to the machine using your favorite SSH tool (`ssh` if you're on Linux or Mac OS X, e.g PuTTY if you're on Windows).
@ -101,15 +97,13 @@ In the first step, Let's Encrypt will ask for an administration email address; t
After that, you will have to accept the license terms: After that, you will have to accept the license terms:
<center> {:.center}
![License Terms]({{ site.url }}/images/letsencrypt-5-terms.png) ![License Terms]({{ site.url }}/images/letsencrypt-5-terms.png){:style="margin:auto"}
</center>
In the next step, enter the domain name(s) you want to create the certificate for: In the next step, enter the domain name(s) you want to create the certificate for:
<center> {:.center}
![Domain Name]({{ site.url }}/images/letsencrypt-6-domain-name.png) ![Domain Name]({{ site.url }}/images/letsencrypt-6-domain-name.png){:style="margin:auto"}
</center>
Usually, you will create one certificate per domain you will use. Exceptions will be for example when creating a certificate which is both valid for `www.contoso.com` and `contoso.com`, if your web server answers to both. In this case, we will just provide `myserver.contoso.com` (this might be a web service or similar). Usually, you will create one certificate per domain you will use. Exceptions will be for example when creating a certificate which is both valid for `www.contoso.com` and `contoso.com`, if your web server answers to both. In this case, we will just provide `myserver.contoso.com` (this might be a web service or similar).

View file

@ -19,17 +19,17 @@ The problems it tackles are:
- Support for a great number of event sources and outputs - 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. 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.
<center>
<img src="/images/logaggregation-elk.png" width=50% align="middle"/> {:.center}
</center> ![Log aggregation Elk]({{ site.url }}/images/logaggregation-elk.png){:style="margin:auto; width:70%"}
ELK stands for Elasticsearch Logstash Kibana and they are respectively their Search engine, Log Shipper and Visualization frontend solutions. 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. 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 its 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. Another very good data collection solution on the market is Fluentd, and it also supports Elasticsearch (amongst others) as the destination for its 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.
<center>
<img src="/images/logaggregation-efk.png" width=20% align="middle"/>
</center>
{:.center}
![Log aggregation Efk]({{ site.url }}/images/logaggregation-efk.png){:style="margin:auto; width:40%"}
# Logstash vs FluentD # 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. 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.
@ -82,8 +82,7 @@ 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-* *-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 ==== 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"} 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"}
@ -99,7 +98,7 @@ In order to build it yourself you only need the `record_transformer` filter that
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. 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 ~~~
<filter tag.**> <filter tag.**>
type record_transformer type record_transformer
enable_ruby true enable_ruby true
@ -112,7 +111,7 @@ Next you need to parse the timestamp of your logs into separate date, time and m
The result is that the above sample will come out like this: 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":"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"} 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"}
~~~ ~~~
@ -137,7 +136,7 @@ For instance, by using the record_transformer I would send the hostname and also
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. 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 ~~~
<filter tag.**> <filter tag.**>
type record_transformer type record_transformer
enable_ruby true enable_ruby true
@ -151,14 +150,14 @@ Using this example configuration I tried to create a pie chart showing the numbe
Sample output from stdout: 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"} 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: And here is the result of trying to use it in a visualization:
<center>
<img src="/images/logaggregation-analyzed-field.png" width=35% align="middle"/> {:.center}
</center> ![Log aggregation analyzed]({{ site.url }}/images/logaggregation-analyzed-field.png){:style="margin:auto; width:35%"}
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". 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".
@ -170,7 +169,7 @@ And the solution is: When Elasticsearch creates a new index, it will rely on the
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: 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 '{ curl -XPUT localhost:9200/_template/template_doru -d '{
"template" : "logstash-*", "template" : "logstash-*",
"settings" : {.... "settings" : {....

View file

@ -257,6 +257,9 @@ hr.small {
margin-top: 60px; margin-top: 60px;
font-weight: 700; font-weight: 700;
} }
.center {
text-align: center;
}
.caption { .caption {
text-align: center; text-align: center;
font-size: 14px; font-size: 14px;

View file

@ -3,4 +3,5 @@ layout: post_by_category
title: API title: API
category: api category: api
permalink: /meta/category/api/ permalink: /meta/category/api/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_category
title: Conference title: Conference
category: conference category: conference
permalink: /meta/category/conference/ permalink: /meta/category/conference/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_category
title: General title: General
category: general category: general
permalink: /meta/category/general/ permalink: /meta/category/general/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_category
title: Howto title: Howto
category: howto category: howto
permalink: /meta/category/howto/ permalink: /meta/category/howto/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_category
title: Product title: Product
category: product category: product
permalink: /meta/category/product/ permalink: /meta/category/product/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: API title: API
tag: api tag: api
permalink: /meta/tag/api/ permalink: /meta/tag/api/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Cloud title: Cloud
tag: cloud tag: cloud
permalink: /meta/tag/cloud/ permalink: /meta/tag/cloud/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: CTO title: CTO
tag: cto tag: cto
permalink: /meta/tag/cto/ permalink: /meta/tag/cto/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Culture title: Culture
tag: culture tag: culture
permalink: /meta/tag/culture/ permalink: /meta/tag/culture/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Customer Development title: Customer Development
tag: custdev tag: custdev
permalink: /meta/tag/custdev/ permalink: /meta/tag/custdev/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Devops title: Devops
tag: devops tag: devops
permalink: /meta/tag/devops/ permalink: /meta/tag/devops/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Docker title: Docker
tag: docker tag: docker
permalink: /meta/tag/docker/ permalink: /meta/tag/docker/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Logging title: Logging
tag: logging tag: logging
permalink: /meta/tag/logging/ permalink: /meta/tag/logging/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Microservice title: Microservice
tag: microservice tag: microservice
permalink: /meta/tag/microservice/ permalink: /meta/tag/microservice/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Mobile title: Mobile
tag: mobile tag: mobile
permalink: /meta/tag/mobile/ permalink: /meta/tag/mobile/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Open Source title: Open Source
tag: open-source tag: open-source
permalink: /meta/tag/open-source/ permalink: /meta/tag/open-source/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Security title: Security
tag: security tag: security
permalink: /meta/tag/security/ permalink: /meta/tag/security/
header-img: images/bg-post.jpg
--- ---

View file

@ -3,4 +3,5 @@ layout: post_by_tag
title: Smartsteuer title: Smartsteuer
tag: smartsteuer tag: smartsteuer
permalink: /meta/tag/smartsteuer/ permalink: /meta/tag/smartsteuer/
header-img: images/bg-post.jpg
--- ---