diff --git a/_config.yml b/_config.yml index d1b5dce..a0655f5 100644 --- a/_config.yml +++ b/_config.yml @@ -56,7 +56,7 @@ baseurl: "" # !! You don't need to change any of the configuration flags below !! # -markdown: kramdown +# markdown: kramdown highlighter: rouge permalink: /:title/ diff --git a/_posts/2015-12-11-apidays-paris.md b/_posts/2015-12-11-apidays-paris.md index 1448919..625e55a 100644 --- a/_posts/2015-12-11-apidays-paris.md +++ b/_posts/2015-12-11-apidays-paris.md @@ -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. -
-![Eiffel Tower - Paris]({{ site.url }}/images/2015-12-11-paris-eiffeltower.jpg) +{:.center} +![Eiffel Tower - Paris]({{ site.url }}/images/2015-12-11-paris-eiffeltower.jpg){:style="margin:auto"} (Image by Martin Danielsson, [CC BY 4.0 License](https://creativecommons.org/licenses/by/4.0/)) -
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. -
-![HATEOAS - Bless you!]({{ site.url }}/images/2015-12-11-hateoas.jpg) +{:.center} +![HATEOAS - Bless you!]({{ site.url }}/images/2015-12-11-hateoas.jpg){:style="margin:auto"} (Courtesy of [CommitStrip](http://www.commitstrip.com/en/2015/12/03/apiception/)) -
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: diff --git a/_posts/2015-12-17-letsencrypt.md b/_posts/2015-12-17-letsencrypt.md index 9bb68ff..c9b96b8 100644 --- a/_posts/2015-12-17-letsencrypt.md +++ b/_posts/2015-12-17-letsencrypt.md @@ -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 +*. -
-![New VM]({{ site.url }}/images/letsencrypt-1-new-vm.png) -
+{:.center} +![New VM]({{ site.url }}/images/letsencrypt-1-new-vm.png){:style="margin:auto"} 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). -
-![Select Ubuntu]({{ site.url }}/images/letsencrypt-2-select-ubuntu.png) -
+{:.center} +![Select Ubuntu]({{ site.url }}/images/letsencrypt-2-select-ubuntu.png){:style="margin:auto"} 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. * Leave the rest of the setting to the defaults -
-![VM Settings]({{ site.url }}/images/letsencrypt-3-vm-settings.png) -
+{:.center} +![VM Settings]({{ site.url }}/images/letsencrypt-3-vm-settings.png){:style="margin:auto"} 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: -
-![Azure VM Provisioned]({{ site.url }}/images/letsencrypt-4-azure-name.png) -
+{:.center} +![Azure VM Provisioned]({{ site.url }}/images/letsencrypt-4-azure-name.png){:style="margin:auto"} 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: -
-![License Terms]({{ site.url }}/images/letsencrypt-5-terms.png) -
+{:.center} +![License Terms]({{ site.url }}/images/letsencrypt-5-terms.png){:style="margin:auto"} In the next step, enter the domain name(s) you want to create the certificate for: -
-![Domain Name]({{ site.url }}/images/letsencrypt-6-domain-name.png) -
+{:.center} +![Domain Name]({{ site.url }}/images/letsencrypt-6-domain-name.png){:style="margin:auto"} 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). diff --git a/_posts/2016-01-11-log-aggregation.md b/_posts/2016-01-11-log-aggregation.md index 4c9da36..fd759ec 100644 --- a/_posts/2016-01-11-log-aggregation.md +++ b/_posts/2016-01-11-log-aggregation.md @@ -19,17 +19,17 @@ The problems it tackles are: - 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. -
- -
+ +{:.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. 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. -
- -
+{:.center} +![Log aggregation Efk]({{ site.url }}/images/logaggregation-efk.png){:style="margin:auto; width:40%"} # 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. @@ -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-* - -~~~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"} @@ -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. -~~~xml +~~~ type record_transformer 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: -~~~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"} ~~~ @@ -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. -~~~ruby +~~~ type record_transformer 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: -~~~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: -
- -
+ +{:.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". @@ -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: -~~~bash +~~~ curl -XPUT localhost:9200/_template/template_doru -d '{ "template" : "logstash-*", "settings" : {.... @@ -180,7 +179,7 @@ curl -XPUT localhost:9200/_template/template_doru -d '{ The main thing to note in the whole template is this section: -~~~json +~~~ json "string_fields" : { "match" : "*", "match_mapping_type" : "string", diff --git a/css/clean-blog.css b/css/clean-blog.css index 4ec0bf2..9843afe 100644 --- a/css/clean-blog.css +++ b/css/clean-blog.css @@ -257,6 +257,9 @@ hr.small { margin-top: 60px; font-weight: 700; } +.center { + text-align: center; +} .caption { text-align: center; font-size: 14px; diff --git a/meta/category/api.md b/meta/category/api.md index 423cf62..c1fc020 100644 --- a/meta/category/api.md +++ b/meta/category/api.md @@ -3,4 +3,5 @@ layout: post_by_category title: API category: api permalink: /meta/category/api/ +header-img: images/bg-post.jpg --- diff --git a/meta/category/conference.md b/meta/category/conference.md index ac2a777..3e23938 100644 --- a/meta/category/conference.md +++ b/meta/category/conference.md @@ -3,4 +3,5 @@ layout: post_by_category title: Conference category: conference permalink: /meta/category/conference/ +header-img: images/bg-post.jpg --- diff --git a/meta/category/general.md b/meta/category/general.md index 053e765..cd5c0ff 100644 --- a/meta/category/general.md +++ b/meta/category/general.md @@ -3,4 +3,5 @@ layout: post_by_category title: General category: general permalink: /meta/category/general/ +header-img: images/bg-post.jpg --- diff --git a/meta/category/howto.md b/meta/category/howto.md index 73f73b7..8417c95 100644 --- a/meta/category/howto.md +++ b/meta/category/howto.md @@ -3,4 +3,5 @@ layout: post_by_category title: Howto category: howto permalink: /meta/category/howto/ +header-img: images/bg-post.jpg --- diff --git a/meta/category/product.md b/meta/category/product.md index 31e8a28..0f14e9c 100644 --- a/meta/category/product.md +++ b/meta/category/product.md @@ -3,4 +3,5 @@ layout: post_by_category title: Product category: product permalink: /meta/category/product/ +header-img: images/bg-post.jpg --- diff --git a/meta/tag/api.md b/meta/tag/api.md index 497291a..52710ae 100644 --- a/meta/tag/api.md +++ b/meta/tag/api.md @@ -3,4 +3,5 @@ layout: post_by_tag title: API tag: api permalink: /meta/tag/api/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/cloud.md b/meta/tag/cloud.md index d4e8e79..d685206 100644 --- a/meta/tag/cloud.md +++ b/meta/tag/cloud.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Cloud tag: cloud permalink: /meta/tag/cloud/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/cto.md b/meta/tag/cto.md index 012ea78..1670ae9 100644 --- a/meta/tag/cto.md +++ b/meta/tag/cto.md @@ -3,4 +3,5 @@ layout: post_by_tag title: CTO tag: cto permalink: /meta/tag/cto/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/culture.md b/meta/tag/culture.md index ec8474f..da70122 100644 --- a/meta/tag/culture.md +++ b/meta/tag/culture.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Culture tag: culture permalink: /meta/tag/culture/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/custdev.md b/meta/tag/custdev.md index 8df887c..0b33d72 100644 --- a/meta/tag/custdev.md +++ b/meta/tag/custdev.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Customer Development tag: custdev permalink: /meta/tag/custdev/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/devops.md b/meta/tag/devops.md index 233a048..457de88 100644 --- a/meta/tag/devops.md +++ b/meta/tag/devops.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Devops tag: devops permalink: /meta/tag/devops/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/docker.md b/meta/tag/docker.md index 47d5f9f..d5588a6 100644 --- a/meta/tag/docker.md +++ b/meta/tag/docker.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Docker tag: docker permalink: /meta/tag/docker/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/logging.md b/meta/tag/logging.md index 153f12b..a226f92 100644 --- a/meta/tag/logging.md +++ b/meta/tag/logging.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Logging tag: logging permalink: /meta/tag/logging/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/microservice.md b/meta/tag/microservice.md index 76fa770..ff21a32 100644 --- a/meta/tag/microservice.md +++ b/meta/tag/microservice.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Microservice tag: microservice permalink: /meta/tag/microservice/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/mobile.md b/meta/tag/mobile.md index e1b1cd5..6e0c04a 100644 --- a/meta/tag/mobile.md +++ b/meta/tag/mobile.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Mobile tag: mobile permalink: /meta/tag/mobile/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/open-source.md b/meta/tag/open-source.md index 72aca33..d46332c 100644 --- a/meta/tag/open-source.md +++ b/meta/tag/open-source.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Open Source tag: open-source permalink: /meta/tag/open-source/ +header-img: images/bg-post.jpg --- \ No newline at end of file diff --git a/meta/tag/security.md b/meta/tag/security.md index 82e9015..698b006 100644 --- a/meta/tag/security.md +++ b/meta/tag/security.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Security tag: security permalink: /meta/tag/security/ +header-img: images/bg-post.jpg --- diff --git a/meta/tag/smartsteuer.md b/meta/tag/smartsteuer.md index 3df2783..43b51bc 100644 --- a/meta/tag/smartsteuer.md +++ b/meta/tag/smartsteuer.md @@ -3,4 +3,5 @@ layout: post_by_tag title: Smartsteuer tag: smartsteuer permalink: /meta/tag/smartsteuer/ +header-img: images/bg-post.jpg --- \ No newline at end of file