<!doctype html><html lang="en"><head><meta name="generator" content="Hugo 0.115.2"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#31dbda"><meta name="description" content="dev-eth0.de"><link rel="alternate" type="application/rss+xml" href="https://www.dev-eth0.de/index.xml" title="dev-eth0.de"><title>dev-eth0.de - Home</title><link rel="stylesheet" href="https://www.dev-eth0.de/assets/main.min.334a0909655558529175fa431ecb4e46c5a598829e344ae2efef0c4041e058e7.css" integrity="sha256-M0oJCWVVWFKRdfpDHstORsWlmIKeNEri7&#43;8MQEHgWOc=" media="screen"><meta property="og:site_name" content="dev-eth0.de"><meta property="og:title" content="Home"><meta property="og:description" content=""><meta property="og:type" content="website"><meta property="og:url" content="https://www.dev-eth0.de/"><meta property="og:image" content="https://www.dev-eth0.de/assets/img/2017-08-19-mysensors_gateway_2-1366.jpg"><meta property="og:updated_time" content="2019-07-01T20:00:00-05:00"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="https://www.dev-eth0.de/assets/img/2017-08-19-mysensors_gateway_2-1366.jpg"><meta name="twitter:title" content="Home"><meta name="twitter:description" content=""><meta name="twitter:site" content="@deveth0"><meta name="twitter:creator" content="@deveth0"><link rel="shortcut icon" href="/assets/favicons/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicons/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicons/favicon-48x48.png"><link rel="manifest" href="/assets/favicons/manifest.json"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#31dbda"><meta name="application-name" content="dev-eth0.de"><link rel="apple-touch-icon" sizes="57x57" href="/assets/favicons/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/favicons/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/favicons/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/favicons/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/favicons/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/favicons/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/favicons/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/favicons/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/favicons/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/favicons/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/favicons/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dev-eth0.de"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/favicons/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2732x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/favicons/apple-touch-startup-image-2160x1620.png"><link rel="icon" type="image/png" sizes="228x228" href="/assets/favicons/coast-228x228.png"><meta name="msapplication-TileColor" content="#000000"><meta name="msapplication-TileImage" content="/assets/favicons/mstile-144x144.png"><meta name="msapplication-config" content="/assets/favicons/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/favicons/yandex-browser-manifest.json"></head><body id="top"><div data-svg-url="/assets/sprite-8fb3cc978684e125807bc24a40ca4f3b.svg" id="svg-sprite" style="display: none;"></div><header class="header" id="header-js"><svg class="header__background"><defs><pattern fill="none" height="47" id="header-svg" patternUnits="userSpaceOnUse" viewBox="56 -254 112 190" width="28"><path d="M168-127.1c.5 0 1 .1 1.3.3l53.4 30.5c.7.4 1.3 1.4 1.3 2.2v61c0 .8-.6 1.8-1.3 2.2L169.3-.3c-.7.4-1.9.4-2.6 0l-53.4-30.5c-.7-.4-1.3-1.4-1.3-2.2v-61c0-.8.6-1.8 1.3-2.2l53.4-30.5c.3-.3.8-.4 1.3-.4z"/><path d="M112-222.5c.5 0 1 .1 1.3.3l53.4 30.5c.7.4 1.3 1.4 1.3 2.2v61c0 .8-.6 1.8-1.3 2.2l-53.4 30.5c-.7.4-1.9.4-2.6 0l-53.4-30.5c-.7-.4-1.3-1.4-1.3-2.2v-61c0-.8.6-1.8 1.3-2.2l53.4-30.5c.3-.2.8-.3 1.3-.3z"/><path d="M168-317.8c.5 0 1 .1 1.3.3l53.4 30.5c.7.4 1.3 1.4 1.3 2.2v61c0 .8-.6 1.8-1.3 2.2L169.3-191c-.7.4-1.9.4-2.6 0l-53.4-30.5c-.7-.4-1.3-1.4-1.3-2.2v-61c0-.8.6-1.8 1.3-2.2l53.4-30.5c.3-.3.8-.4 1.3-.4z"/></pattern><linearGradient gradientTransform="rotate(20)" id="header-gradient"><stop offset="0" stop-color="#262626" stop-opacity="0"/><stop offset="0.25" stop-color="#262626" stop-opacity="0.1"/><stop offset="0.7" stop-color="#262626" stop-opacity="0.75"/><stop offset="1" stop-color="#262626" stop-opacity="1"/></linearGradient><mask id="header-mask"><rect fill="url(#header-svg)" height="100%" width="100%" x="0" y="0"></rect></mask></defs><rect height="100%" mask="url(#header-mask)" width="100%" x="0" y="0"></rect><rect fill="url(#header-gradient)" height="100%" width="100%" x="0" y="0"></rect></svg><div class="header__content"><div class="header__logo"><a aria-label="Home" class="e-link header__logo-link" href="https://www.dev-eth0.de"><svg class="header__logo-link-icon" viewBox="0 0 164 100"><use xlink:href="#logo"></use></svg></a></div><div class="search" data-search-url="/index.json" id="search-js"><form class="search__form" id="search__form-js" autocomplete="off"><input class="search__form-input" id="search__input-js" placeholder="Search..." type="text"><div class="search__form-icon"><svg class="search__form-icon-svg" viewBox="0 0 16 16"><use xlink:href="#search"></use></svg></div></form><div id="search__close-js" class="search__close"><svg class="search__close-icon" viewBox="0 0 16 16"><use xlink:href="#close"></use></svg></div><div class="search__content"><div class="search__result search--hidden" id="search__result-js"><div class="search__result-number" id="search__result-number-js">Found X results</div><div class="search__result-list" id="search__result-list-js"></div></div><div id="search__result-no-results-js" class="search__result-no-results search--hidden"><span>No results ...</span></div></div></div></div></header><div class="hero"><picture class="hero__picture"><source sizes="100vw" srcset="/assets/img/2017-08-19-mysensors_gateway_2-3840.webp 3840w,/assets/img/2017-08-19-mysensors_gateway_2-2560.webp 2560w,/assets/img/2017-08-19-mysensors_gateway_2-1920.webp 1920w,/assets/img/2017-08-19-mysensors_gateway_2-1600.webp 1600w,/assets/img/2017-08-19-mysensors_gateway_2-1366.webp 1366w,/assets/img/2017-08-19-mysensors_gateway_2-1024.webp 1024w,/assets/img/2017-08-19-mysensors_gateway_2-768.webp 768w,/assets/img/2017-08-19-mysensors_gateway_2-640.webp 640w," type="image/webp"><source sizes="100vw" srcset="/assets/img/2017-08-19-mysensors_gateway_2-3840.jpg 3840w,/assets/img/2017-08-19-mysensors_gateway_2-2560.jpg 2560w,/assets/img/2017-08-19-mysensors_gateway_2-1920.jpg 1920w,/assets/img/2017-08-19-mysensors_gateway_2-1600.jpg 1600w,/assets/img/2017-08-19-mysensors_gateway_2-1366.jpg 1366w,/assets/img/2017-08-19-mysensors_gateway_2-1024.jpg 1024w,/assets/img/2017-08-19-mysensors_gateway_2-768.jpg 768w,/assets/img/2017-08-19-mysensors_gateway_2-640.jpg 640w,"><img alt="/assets/img/2017-08-19-mysensors_gateway_2-640.jpg" class="hero__image" src="/assets/img/2017-08-19-mysensors_gateway_2-640.jpg"></picture></div><div class="content"><div class="content__header"><h1 class="e-headline-h1">Recent posts</h1></div><div class="page__content"><section class="postlist" id="postlist-js"><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2022/01/04/debug-android-application-traffic/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2022-01-04_android_traffic_02-3840.webp 3840w,/assets/img/2022-01-04_android_traffic_02-2560.webp 2560w,/assets/img/2022-01-04_android_traffic_02-1920.webp 1920w,/assets/img/2022-01-04_android_traffic_02-1600.webp 1600w,/assets/img/2022-01-04_android_traffic_02-1366.webp 1366w,/assets/img/2022-01-04_android_traffic_02-1024.webp 1024w,/assets/img/2022-01-04_android_traffic_02-768.webp 768w,/assets/img/2022-01-04_android_traffic_02-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2022-01-04_android_traffic_02-3840.png 3840w,/assets/img/2022-01-04_android_traffic_02-2560.png 2560w,/assets/img/2022-01-04_android_traffic_02-1920.png 1920w,/assets/img/2022-01-04_android_traffic_02-1600.png 1600w,/assets/img/2022-01-04_android_traffic_02-1366.png 1366w,/assets/img/2022-01-04_android_traffic_02-1024.png 1024w,/assets/img/2022-01-04_android_traffic_02-768.png 768w,/assets/img/2022-01-04_android_traffic_02-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2022-01-04_android_traffic_02-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2022-01-04_android_traffic_02-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">04.01.2022</h5><h2 class="postlist__tile-content-headline">Debug Android (Application) Traffic</h2><div><p>Ever wondered what your Android device is doing or what data an application sends home?</p><p>This post will help you set up a local proxy and intercept the http(s) traffic from an Android Virtual Device (AVD).</p></div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2021/05/19/diy-power-and-usb-supply-for-external-radiator/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2021-05-19_mora-cable_08-3840.webp 3840w,/assets/img/2021-05-19_mora-cable_08-2560.webp 2560w,/assets/img/2021-05-19_mora-cable_08-1920.webp 1920w,/assets/img/2021-05-19_mora-cable_08-1600.webp 1600w,/assets/img/2021-05-19_mora-cable_08-1366.webp 1366w,/assets/img/2021-05-19_mora-cable_08-1024.webp 1024w,/assets/img/2021-05-19_mora-cable_08-768.webp 768w,/assets/img/2021-05-19_mora-cable_08-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2021-05-19_mora-cable_08-3840.jpg 3840w,/assets/img/2021-05-19_mora-cable_08-2560.jpg 2560w,/assets/img/2021-05-19_mora-cable_08-1920.jpg 1920w,/assets/img/2021-05-19_mora-cable_08-1600.jpg 1600w,/assets/img/2021-05-19_mora-cable_08-1366.jpg 1366w,/assets/img/2021-05-19_mora-cable_08-1024.jpg 1024w,/assets/img/2021-05-19_mora-cable_08-768.jpg 768w,/assets/img/2021-05-19_mora-cable_08-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2021-05-19_mora-cable_08-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2021-05-19_mora-cable_08-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">19.05.2021</h5><h2 class="postlist__tile-content-headline">DIY Power and USB Supply for external Radiator</h2><div>Using an external radiator for a watercooling system is a great solution to get rid of heat but requires some kind of power / usb supply.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2021/03/09/autoscaling-gitlab-runner-instances-on-google-cloud-platform/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2020-03-10_gitlab-runner_job-3840.webp 3840w,/assets/img/2020-03-10_gitlab-runner_job-2560.webp 2560w,/assets/img/2020-03-10_gitlab-runner_job-1920.webp 1920w,/assets/img/2020-03-10_gitlab-runner_job-1600.webp 1600w,/assets/img/2020-03-10_gitlab-runner_job-1366.webp 1366w,/assets/img/2020-03-10_gitlab-runner_job-1024.webp 1024w,/assets/img/2020-03-10_gitlab-runner_job-768.webp 768w,/assets/img/2020-03-10_gitlab-runner_job-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2020-03-10_gitlab-runner_job-3840.png 3840w,/assets/img/2020-03-10_gitlab-runner_job-2560.png 2560w,/assets/img/2020-03-10_gitlab-runner_job-1920.png 1920w,/assets/img/2020-03-10_gitlab-runner_job-1600.png 1600w,/assets/img/2020-03-10_gitlab-runner_job-1366.png 1366w,/assets/img/2020-03-10_gitlab-runner_job-1024.png 1024w,/assets/img/2020-03-10_gitlab-runner_job-768.png 768w,/assets/img/2020-03-10_gitlab-runner_job-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2020-03-10_gitlab-runner_job-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2020-03-10_gitlab-runner_job-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">09.03.2021</h5><h2 class="postlist__tile-content-headline">Autoscaling GitLab Runner Instances on Google Cloud Platform</h2><div>Migrating GitLab CI jobs to Google Cloud Platform is possible with little effort due to the good support provided by GitLab and relieves the load off your hardware.<br>This can be worthwhile even for small projects or private GitLab instances without generating major costs.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2020/05/05/httpclient-spring-boot-starter/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">05.05.2020</h5><h2 class="postlist__tile-content-headline">HttpClient Spring Boot Starter</h2><div>As Spring does not support the configuration of the Apache and OkHttp HttpClients, this starter provides a simple drop-in replacement that allows to adds generic and host-based configurations like proxy servers.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/12/05/spring-cloud-use-feignclient-behind-a-corporate-proxy/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-12-05_spring_cloud_feign_proxy-3840.webp 3840w,/assets/img/2019-12-05_spring_cloud_feign_proxy-2560.webp 2560w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1920.webp 1920w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1600.webp 1600w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1366.webp 1366w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1024.webp 1024w,/assets/img/2019-12-05_spring_cloud_feign_proxy-768.webp 768w,/assets/img/2019-12-05_spring_cloud_feign_proxy-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-12-05_spring_cloud_feign_proxy-3840.png 3840w,/assets/img/2019-12-05_spring_cloud_feign_proxy-2560.png 2560w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1920.png 1920w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1600.png 1600w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1366.png 1366w,/assets/img/2019-12-05_spring_cloud_feign_proxy-1024.png 1024w,/assets/img/2019-12-05_spring_cloud_feign_proxy-768.png 768w,/assets/img/2019-12-05_spring_cloud_feign_proxy-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-12-05_spring_cloud_feign_proxy-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-12-05_spring_cloud_feign_proxy-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">05.12.2019</h5><h2 class="postlist__tile-content-headline">Spring Cloud: Use FeignClient behind a corporate proxy</h2><div>This post shows how to implement a custom HttpClientFactory which is used by Spring Cloud / Feign to configure a proxy.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/11/01/object-detection-in-images-and-videos-using-python-opencv-and-yolov3/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-11-01_python-opencv-cat3-3840.webp 3840w,/assets/img/2019-11-01_python-opencv-cat3-2560.webp 2560w,/assets/img/2019-11-01_python-opencv-cat3-1920.webp 1920w,/assets/img/2019-11-01_python-opencv-cat3-1600.webp 1600w,/assets/img/2019-11-01_python-opencv-cat3-1366.webp 1366w,/assets/img/2019-11-01_python-opencv-cat3-1024.webp 1024w,/assets/img/2019-11-01_python-opencv-cat3-768.webp 768w,/assets/img/2019-11-01_python-opencv-cat3-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-11-01_python-opencv-cat3-3840.jpg 3840w,/assets/img/2019-11-01_python-opencv-cat3-2560.jpg 2560w,/assets/img/2019-11-01_python-opencv-cat3-1920.jpg 1920w,/assets/img/2019-11-01_python-opencv-cat3-1600.jpg 1600w,/assets/img/2019-11-01_python-opencv-cat3-1366.jpg 1366w,/assets/img/2019-11-01_python-opencv-cat3-1024.jpg 1024w,/assets/img/2019-11-01_python-opencv-cat3-768.jpg 768w,/assets/img/2019-11-01_python-opencv-cat3-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-11-01_python-opencv-cat3-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-11-01_python-opencv-cat3-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">01.11.2019</h5><h2 class="postlist__tile-content-headline">Object Detection in Images and Videos using Python, OpenCV and YOLOv3</h2><div>It’s surprisingly easy to use a pretrained model for Object Detection in Images or Videos.<br>This post shows how to find cats or dogs or birds or whatever in an Image or Video.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/09/10/using-withrouter-in-a-typescript-react-component/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-09-10_react_router_1-3840.webp 3840w,/assets/img/2019-09-10_react_router_1-2560.webp 2560w,/assets/img/2019-09-10_react_router_1-1920.webp 1920w,/assets/img/2019-09-10_react_router_1-1600.webp 1600w,/assets/img/2019-09-10_react_router_1-1366.webp 1366w,/assets/img/2019-09-10_react_router_1-1024.webp 1024w,/assets/img/2019-09-10_react_router_1-768.webp 768w,/assets/img/2019-09-10_react_router_1-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-09-10_react_router_1-3840.png 3840w,/assets/img/2019-09-10_react_router_1-2560.png 2560w,/assets/img/2019-09-10_react_router_1-1920.png 1920w,/assets/img/2019-09-10_react_router_1-1600.png 1600w,/assets/img/2019-09-10_react_router_1-1366.png 1366w,/assets/img/2019-09-10_react_router_1-1024.png 1024w,/assets/img/2019-09-10_react_router_1-768.png 768w,/assets/img/2019-09-10_react_router_1-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-09-10_react_router_1-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-09-10_react_router_1-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">10.09.2019</h5><h2 class="postlist__tile-content-headline">Using withRouter in a TypeScript React Component</h2><div>When combining TypeScript with React, some of the tutorials cannot be adapted that simple.<br>In this example I show how to use <code>withRouter</code> to manipulate the history in a functional React component.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/08/04/spring-boot-application-in-openshift-/-okd/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-08-04_spring-boot-openshift_1-3840.webp 3840w,/assets/img/2019-08-04_spring-boot-openshift_1-2560.webp 2560w,/assets/img/2019-08-04_spring-boot-openshift_1-1920.webp 1920w,/assets/img/2019-08-04_spring-boot-openshift_1-1600.webp 1600w,/assets/img/2019-08-04_spring-boot-openshift_1-1366.webp 1366w,/assets/img/2019-08-04_spring-boot-openshift_1-1024.webp 1024w,/assets/img/2019-08-04_spring-boot-openshift_1-768.webp 768w,/assets/img/2019-08-04_spring-boot-openshift_1-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-08-04_spring-boot-openshift_1-3840.png 3840w,/assets/img/2019-08-04_spring-boot-openshift_1-2560.png 2560w,/assets/img/2019-08-04_spring-boot-openshift_1-1920.png 1920w,/assets/img/2019-08-04_spring-boot-openshift_1-1600.png 1600w,/assets/img/2019-08-04_spring-boot-openshift_1-1366.png 1366w,/assets/img/2019-08-04_spring-boot-openshift_1-1024.png 1024w,/assets/img/2019-08-04_spring-boot-openshift_1-768.png 768w,/assets/img/2019-08-04_spring-boot-openshift_1-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-08-04_spring-boot-openshift_1-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-08-04_spring-boot-openshift_1-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">04.08.2019</h5><h2 class="postlist__tile-content-headline">Spring Boot Application in OpenShift / OKD</h2><div>Now that we have packaged an existing Spring Boot application into a Docker Image, we can deploy it to a Kubernet cluster as well.<br>In this example the additional features of OpenShift/OKD are used to enable a continuous deployment of the application.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/29/dockerize-spring-boot-applications/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">29.07.2019</h5><h2 class="postlist__tile-content-headline">Dockerize Spring Boot Applications</h2><div>It’s quite easy to run a Spring Boot Application inside a Docker Container. Here, however, some pitfalls should be considered so that you can draw the maximum benefits from this.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/24/flaschenmanometer-im-selbstbau/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-24_flaschenmanometer_4-3840.webp 3840w,/assets/img/2019-07-24_flaschenmanometer_4-2560.webp 2560w,/assets/img/2019-07-24_flaschenmanometer_4-1920.webp 1920w,/assets/img/2019-07-24_flaschenmanometer_4-1600.webp 1600w,/assets/img/2019-07-24_flaschenmanometer_4-1366.webp 1366w,/assets/img/2019-07-24_flaschenmanometer_4-1024.webp 1024w,/assets/img/2019-07-24_flaschenmanometer_4-768.webp 768w,/assets/img/2019-07-24_flaschenmanometer_4-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-24_flaschenmanometer_4-3840.jpg 3840w,/assets/img/2019-07-24_flaschenmanometer_4-2560.jpg 2560w,/assets/img/2019-07-24_flaschenmanometer_4-1920.jpg 1920w,/assets/img/2019-07-24_flaschenmanometer_4-1600.jpg 1600w,/assets/img/2019-07-24_flaschenmanometer_4-1366.jpg 1366w,/assets/img/2019-07-24_flaschenmanometer_4-1024.jpg 1024w,/assets/img/2019-07-24_flaschenmanometer_4-768.jpg 768w,/assets/img/2019-07-24_flaschenmanometer_4-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-24_flaschenmanometer_4-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-24_flaschenmanometer_4-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">24.07.2019</h5><h2 class="postlist__tile-content-headline">Flaschenmanometer im Selbstbau</h2><div>Eine regelmäßige Kontrolle des Drucks in Ciderflaschen verhindert, dass diese platzen und ermöglicht einen Einblick in den aktuellen Stand der Karbonisierung.<br>Statt hier auf ein teures Produkt zu setzen, kann man mit wenig Aufwand eigene Flaschenmanometer bauen.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/23/cider-in-flaschen/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-20_cider-schnelleinstieg_5-3840.webp 3840w,/assets/img/2019-07-20_cider-schnelleinstieg_5-2560.webp 2560w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1920.webp 1920w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1600.webp 1600w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1366.webp 1366w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1024.webp 1024w,/assets/img/2019-07-20_cider-schnelleinstieg_5-768.webp 768w,/assets/img/2019-07-20_cider-schnelleinstieg_5-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-20_cider-schnelleinstieg_5-3840.jpg 3840w,/assets/img/2019-07-20_cider-schnelleinstieg_5-2560.jpg 2560w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1920.jpg 1920w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1600.jpg 1600w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1366.jpg 1366w,/assets/img/2019-07-20_cider-schnelleinstieg_5-1024.jpg 1024w,/assets/img/2019-07-20_cider-schnelleinstieg_5-768.jpg 768w,/assets/img/2019-07-20_cider-schnelleinstieg_5-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-20_cider-schnelleinstieg_5-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-20_cider-schnelleinstieg_5-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">23.07.2019</h5><h2 class="postlist__tile-content-headline">Cider in Flaschen</h2><div>Um einen prickelnden Cider zu erhalten, kann dieser gezielt mit etwas Zucker angeregt werden, in Flaschen etwas Kohlensäure zu erzeugen.<br>Bei diesem Prozess ist es wichtig, die Zuckermenge genau zu messen und regelmäßig den Druck in den Flaschen zu kontrollieren.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/20/cider-schnelleinstieg/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-20_cider-schnelleinstieg_hero-3840.webp 3840w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-2560.webp 2560w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1920.webp 1920w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1600.webp 1600w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1366.webp 1366w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1024.webp 1024w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-768.webp 768w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-20_cider-schnelleinstieg_hero-3840.jpg 3840w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-2560.jpg 2560w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1920.jpg 1920w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1600.jpg 1600w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1366.jpg 1366w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-1024.jpg 1024w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-768.jpg 768w,/assets/img/2019-07-20_cider-schnelleinstieg_hero-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-20_cider-schnelleinstieg_hero-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-20_cider-schnelleinstieg_hero-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">20.07.2019</h5><h2 class="postlist__tile-content-headline">Cider - Schnelleinstieg</h2><div>Bevor es an in die Details der Herstellung von Cider geht, gibt es hier einen Schnelleinstieg, mit dem der erste Durst befriedigt werden dürfte.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/17/commento-display-number-of-comments/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-17_commento-count_1-3840.webp 3840w,/assets/img/2019-07-17_commento-count_1-2560.webp 2560w,/assets/img/2019-07-17_commento-count_1-1920.webp 1920w,/assets/img/2019-07-17_commento-count_1-1600.webp 1600w,/assets/img/2019-07-17_commento-count_1-1366.webp 1366w,/assets/img/2019-07-17_commento-count_1-1024.webp 1024w,/assets/img/2019-07-17_commento-count_1-768.webp 768w,/assets/img/2019-07-17_commento-count_1-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-17_commento-count_1-3840.png 3840w,/assets/img/2019-07-17_commento-count_1-2560.png 2560w,/assets/img/2019-07-17_commento-count_1-1920.png 1920w,/assets/img/2019-07-17_commento-count_1-1600.png 1600w,/assets/img/2019-07-17_commento-count_1-1366.png 1366w,/assets/img/2019-07-17_commento-count_1-1024.png 1024w,/assets/img/2019-07-17_commento-count_1-768.png 768w,/assets/img/2019-07-17_commento-count_1-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-17_commento-count_1-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-17_commento-count_1-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">17.07.2019</h5><h2 class="postlist__tile-content-headline">Commento: Display number of comments</h2><div>We can create a simple Javascript to get the number of comments for a post using Commento’s <code>/api/comment/count</code> API and then display the number inside a HTML element.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/16/integration-of-commento-into-hugo/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-16_commento_1-3840.webp 3840w,/assets/img/2019-07-16_commento_1-2560.webp 2560w,/assets/img/2019-07-16_commento_1-1920.webp 1920w,/assets/img/2019-07-16_commento_1-1600.webp 1600w,/assets/img/2019-07-16_commento_1-1366.webp 1366w,/assets/img/2019-07-16_commento_1-1024.webp 1024w,/assets/img/2019-07-16_commento_1-768.webp 768w,/assets/img/2019-07-16_commento_1-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-16_commento_1-3840.png 3840w,/assets/img/2019-07-16_commento_1-2560.png 2560w,/assets/img/2019-07-16_commento_1-1920.png 1920w,/assets/img/2019-07-16_commento_1-1600.png 1600w,/assets/img/2019-07-16_commento_1-1366.png 1366w,/assets/img/2019-07-16_commento_1-1024.png 1024w,/assets/img/2019-07-16_commento_1-768.png 768w,/assets/img/2019-07-16_commento_1-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-16_commento_1-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-16_commento_1-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">16.07.2019</h5><h2 class="postlist__tile-content-headline">Integration of Commento into Hugo</h2><div>Giving users the opportunity to give feedback on blog posts is important. Although there are many free or inexpensive providers of comment functions, unfortunately data protection is always neglected here.<br>With the help of Commento it is possible to host your own comment platform and keep only the most necessary data.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/14/multistage-deployments-for-hugo-using-jenkins-pipelines/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2019-07-14-hugo-jenkins-pipeline_1-3840.webp 3840w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-2560.webp 2560w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1920.webp 1920w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1600.webp 1600w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1366.webp 1366w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1024.webp 1024w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-768.webp 768w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2019-07-14-hugo-jenkins-pipeline_1-3840.png 3840w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-2560.png 2560w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1920.png 1920w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1600.png 1600w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1366.png 1366w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-1024.png 1024w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-768.png 768w,/assets/img/2019-07-14-hugo-jenkins-pipeline_1-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2019-07-14-hugo-jenkins-pipeline_1-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2019-07-14-hugo-jenkins-pipeline_1-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">14.07.2019</h5><h2 class="postlist__tile-content-headline">Multistage deployments for Hugo using Jenkins Pipelines</h2><div>If you use a static site generator like hugo as a replacement for a cms, you will sooner or later reach the point where automatic deployments with Jenkins become useful. Using Jenkins pipelines, multi-stage deployments based on different git branches are no problem.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/07/13/convert-jekyll-to-hugo-permalinks/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">13.07.2019</h5><h2 class="postlist__tile-content-headline">Convert Jekyll to Hugo Permalinks</h2><div>While Jekyll is a great static site generator, I had a many bad moments with Ruby and now migrate to Hugo. Only minor changes in the posts were required but it took some time to rewrite all old incoming links to the new pages.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/03/11/docker-anonymize-logs/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">11.03.2019</h5><h2 class="postlist__tile-content-headline">Anonymize logs produced by docker</h2><div>The handling with the GDPR-requirements for the anonymization of protocol files that are produced by Docker seems to be a not trivial task. Help is available here in the form of syslog-ng which offers various configuration options as a replacement for syslog / rsyslogd.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/01/10/kubernetes-fluentd-logzio/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">10.01.2019</h5><h2 class="postlist__tile-content-headline">Kubernetes Logging with fluentd and logz.io</h2><div>By using logz.io, it is relatively easy to outsource Kubernetes logfiles that do not contain sensitive data to an external service and analyze them there with Kibana.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2019/01/04/kubernetes-cluster-ansible/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">04.01.2019</h5><h2 class="postlist__tile-content-headline">Setup a Kubernetes Cluster with Ansible</h2><div>Although all large Cloud provider nowadays offer Managed Kubernetes Clusters, I prefer to have access to a local cluster especially during development. In this post, we will setup a Kubernetes Cluster using Ansible and Kubeadm. The cluster will include a single master node and two (or more) worker nodes. Most of the work done here is based on a tutorial by bsder1. Requirements I will use three Ubuntu 18.04 LTS (Bionic Beaver) servers, each with 4GB RAM and 2 CPUs, you should also be fine with 1GB RAM.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/11/12/ut61e-backlight/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-11-12-ut61e_backlight_4-3840.webp 3840w,/assets/img/2017-11-12-ut61e_backlight_4-2560.webp 2560w,/assets/img/2017-11-12-ut61e_backlight_4-1920.webp 1920w,/assets/img/2017-11-12-ut61e_backlight_4-1600.webp 1600w,/assets/img/2017-11-12-ut61e_backlight_4-1366.webp 1366w,/assets/img/2017-11-12-ut61e_backlight_4-1024.webp 1024w,/assets/img/2017-11-12-ut61e_backlight_4-768.webp 768w,/assets/img/2017-11-12-ut61e_backlight_4-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-11-12-ut61e_backlight_4-3840.jpg 3840w,/assets/img/2017-11-12-ut61e_backlight_4-2560.jpg 2560w,/assets/img/2017-11-12-ut61e_backlight_4-1920.jpg 1920w,/assets/img/2017-11-12-ut61e_backlight_4-1600.jpg 1600w,/assets/img/2017-11-12-ut61e_backlight_4-1366.jpg 1366w,/assets/img/2017-11-12-ut61e_backlight_4-1024.jpg 1024w,/assets/img/2017-11-12-ut61e_backlight_4-768.jpg 768w,/assets/img/2017-11-12-ut61e_backlight_4-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-11-12-ut61e_backlight_4-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-11-12-ut61e_backlight_4-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">12.11.2017</h5><h2 class="postlist__tile-content-headline">Uni-T UT61E Backlight Mod</h2><div>It was about time for a second digital multimeter for my toolbox and as my current one is still the one I got from my father X years ago, I decided to buy a more sophisticated one as addition. I did not want to spend more than 100€ and my local dealer had a Uni-T UT61E1 available, so I gave it a try. Given that I just spend 50€, the multimeter is a great deal and provides several nice features including a serial interface.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/11/01/adafruit-feather-pinout/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-11-01-adafruit-feather-pinout-3840.webp 3840w,/assets/img/2017-11-01-adafruit-feather-pinout-2560.webp 2560w,/assets/img/2017-11-01-adafruit-feather-pinout-1920.webp 1920w,/assets/img/2017-11-01-adafruit-feather-pinout-1600.webp 1600w,/assets/img/2017-11-01-adafruit-feather-pinout-1366.webp 1366w,/assets/img/2017-11-01-adafruit-feather-pinout-1024.webp 1024w,/assets/img/2017-11-01-adafruit-feather-pinout-768.webp 768w,/assets/img/2017-11-01-adafruit-feather-pinout-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-11-01-adafruit-feather-pinout-3840.jpg 3840w,/assets/img/2017-11-01-adafruit-feather-pinout-2560.jpg 2560w,/assets/img/2017-11-01-adafruit-feather-pinout-1920.jpg 1920w,/assets/img/2017-11-01-adafruit-feather-pinout-1600.jpg 1600w,/assets/img/2017-11-01-adafruit-feather-pinout-1366.jpg 1366w,/assets/img/2017-11-01-adafruit-feather-pinout-1024.jpg 1024w,/assets/img/2017-11-01-adafruit-feather-pinout-768.jpg 768w,/assets/img/2017-11-01-adafruit-feather-pinout-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-11-01-adafruit-feather-pinout-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-11-01-adafruit-feather-pinout-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">01.11.2017</h5><h2 class="postlist__tile-content-headline">Adafruit Feather / Featherwing Pinouts</h2><div>Adafruit presented the Feather line of development boards1 some time ago and the number of available boards and addons (called FeatherWings) is still growing. For each board, you can find an great documentation on Adafruit’s Website including the pinouts. But when looking into the compatibility of different FeatherWings, I was missing a chart or table which lists all the used pins. As far as I can see, there is no ‘official’ naming convention for the pins, therefore I just picked one which starts by 1 on the 3.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/10/16/mysensors-bbq-thermometer/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">16.10.2017</h5><h2 class="postlist__tile-content-headline">MySensors BBQ Thermometer</h2><div>Thinking about additional uses of the rather easy MySensors Framework I came across a less common but really tasty purpose: why not build a BBQ thermometer which sends it’s data to the MySensors Gateway which is then visualized in Grafana. Thermistors The sensors of BBQ thermometers are usually NTC thermistors which means, that you can measure a resistant which decreases as the temperature rises. E.g. you might measure 100kΩ at 25°C and 6kΩ at 100°C.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/09/18/arduino-ds3231-alarm/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">18.09.2017</h5><h2 class="postlist__tile-content-headline">Use a DS3231 RTC to wakeup an Arduino</h2><div>Rocket Scream Electronics published a very cool low power library for Arduino1 which really helps if you need to save some power on your Arduino and and to power it down2. One limitation of the AVR hardware used on your Arduino is the rather small time you can put it to sleep without external hardware: max 8 seconds. If you want to disable the device for a longer period, you can either build a loop which triggers multiple 8 seconds sleeps or use an external interrupt to wakeup.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/09/08/jekyll_randomize_list/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">08.09.2017</h5><h2 class="postlist__tile-content-headline">Jekyll: Random List</h2><div>Jekyll provides a sample function which can be used to pick random entries from a given list.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/09/07/balkonbewaesserung-zusammenbau/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-09-03-balkon_tank_11-3840.webp 3840w,/assets/img/2017-09-03-balkon_tank_11-2560.webp 2560w,/assets/img/2017-09-03-balkon_tank_11-1920.webp 1920w,/assets/img/2017-09-03-balkon_tank_11-1600.webp 1600w,/assets/img/2017-09-03-balkon_tank_11-1366.webp 1366w,/assets/img/2017-09-03-balkon_tank_11-1024.webp 1024w,/assets/img/2017-09-03-balkon_tank_11-768.webp 768w,/assets/img/2017-09-03-balkon_tank_11-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-09-03-balkon_tank_11-3840.jpg 3840w,/assets/img/2017-09-03-balkon_tank_11-2560.jpg 2560w,/assets/img/2017-09-03-balkon_tank_11-1920.jpg 1920w,/assets/img/2017-09-03-balkon_tank_11-1600.jpg 1600w,/assets/img/2017-09-03-balkon_tank_11-1366.jpg 1366w,/assets/img/2017-09-03-balkon_tank_11-1024.jpg 1024w,/assets/img/2017-09-03-balkon_tank_11-768.jpg 768w,/assets/img/2017-09-03-balkon_tank_11-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-09-03-balkon_tank_11-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-09-03-balkon_tank_11-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">07.09.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - Finaler Aufbau</h2><div>Da nun sowohl die Software als auch Hardware einige problemlos lief, habe ich als finalen Schritt noch einen besseren Wasserbehälter als den 12 Liter Eimer gesucht. Fündig geworden bin ich bei der Firma Goebel, welche Wassertanks für den Campingbedarf anbietet. Hinter unserem Sofa sind knapp 30cm Platz zur Wand, daher passt hier der 76 Liter Tank (100cm x 40cm x 20cm) ideal. Die Einfüll und Reinigungsöffnung des Tanks ist auf der Seite, daher musste ich oben einen neuen Stutzen anbringen.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/08/24/arduino-battery/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-08-24-arduino_battery_2-3840.webp 3840w,/assets/img/2017-08-24-arduino_battery_2-2560.webp 2560w,/assets/img/2017-08-24-arduino_battery_2-1920.webp 1920w,/assets/img/2017-08-24-arduino_battery_2-1600.webp 1600w,/assets/img/2017-08-24-arduino_battery_2-1366.webp 1366w,/assets/img/2017-08-24-arduino_battery_2-1024.webp 1024w,/assets/img/2017-08-24-arduino_battery_2-768.webp 768w,/assets/img/2017-08-24-arduino_battery_2-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-08-24-arduino_battery_2-3840.jpg 3840w,/assets/img/2017-08-24-arduino_battery_2-2560.jpg 2560w,/assets/img/2017-08-24-arduino_battery_2-1920.jpg 1920w,/assets/img/2017-08-24-arduino_battery_2-1600.jpg 1600w,/assets/img/2017-08-24-arduino_battery_2-1366.jpg 1366w,/assets/img/2017-08-24-arduino_battery_2-1024.jpg 1024w,/assets/img/2017-08-24-arduino_battery_2-768.jpg 768w,/assets/img/2017-08-24-arduino_battery_2-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-08-24-arduino_battery_2-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-08-24-arduino_battery_2-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">24.08.2017</h5><h2 class="postlist__tile-content-headline">Battery-powered Arduino</h2><div>Running an Arduino on battery power is only useful, if you know, when to change the battery. Here it is handy, to measure the current battery level and get notifications, if it drops below a certain threshold. Thankfully you can use the analog Pins to measure a voltage. If you attach a voltage to e.g. A0, your Arduino will compare the input voltage with a reference voltage (by default VCC) and return a value between 0-1023 where 1023 means, that the input voltage is equal or higher than VCC.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/08/19/mysensors-sensorboards/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-08-19-mysensors_gateway_2-3840.webp 3840w,/assets/img/2017-08-19-mysensors_gateway_2-2560.webp 2560w,/assets/img/2017-08-19-mysensors_gateway_2-1920.webp 1920w,/assets/img/2017-08-19-mysensors_gateway_2-1600.webp 1600w,/assets/img/2017-08-19-mysensors_gateway_2-1366.webp 1366w,/assets/img/2017-08-19-mysensors_gateway_2-1024.webp 1024w,/assets/img/2017-08-19-mysensors_gateway_2-768.webp 768w,/assets/img/2017-08-19-mysensors_gateway_2-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-08-19-mysensors_gateway_2-3840.jpg 3840w,/assets/img/2017-08-19-mysensors_gateway_2-2560.jpg 2560w,/assets/img/2017-08-19-mysensors_gateway_2-1920.jpg 1920w,/assets/img/2017-08-19-mysensors_gateway_2-1600.jpg 1600w,/assets/img/2017-08-19-mysensors_gateway_2-1366.jpg 1366w,/assets/img/2017-08-19-mysensors_gateway_2-1024.jpg 1024w,/assets/img/2017-08-19-mysensors_gateway_2-768.jpg 768w,/assets/img/2017-08-19-mysensors_gateway_2-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-08-19-mysensors_gateway_2-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-08-19-mysensors_gateway_2-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">19.08.2017</h5><h2 class="postlist__tile-content-headline">PCB Boards for MySensors Nodes</h2><div>When I last worked with Atmel Microcontrollers in the early 2000s, it was simply unpayable to produce small batches of custom PCBs. Nowadays it’s hard to get an overview of all the companies that offer either prototype boards or small batches. Furthermore is the software by this time very advanced and the myriads of online tutorials make it easy to design simple and more complex circuits. In this post I’d like to show some of the PCBs I created and ordered and of the process to this.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/08/17/arduino-pro-mini-1mhz/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">17.08.2017</h5><h2 class="postlist__tile-content-headline">Low Power Arduino Pro Mini running at 1Mhz</h2><div>After playing with the MySensors1 framework and possible sensor types, I build a prototype of a Temperature Sensor which is battery powered. The MySensors website contains a great guide on battery powered nodes2 but I wanted to go one step further and reduce the clock of the used Arduino Pro Mini from 8Mhz to 1Mhz. Jean-Matthieu DECHRISTÉ wrote an extensive article on this topic3, so this post only includes the basics.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/29/balkonbewaesserung-tankinhalt/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-07-31-fhem-eimer-3840.webp 3840w,/assets/img/2017-07-31-fhem-eimer-2560.webp 2560w,/assets/img/2017-07-31-fhem-eimer-1920.webp 1920w,/assets/img/2017-07-31-fhem-eimer-1600.webp 1600w,/assets/img/2017-07-31-fhem-eimer-1366.webp 1366w,/assets/img/2017-07-31-fhem-eimer-1024.webp 1024w,/assets/img/2017-07-31-fhem-eimer-768.webp 768w,/assets/img/2017-07-31-fhem-eimer-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-07-31-fhem-eimer-3840.jpg 3840w,/assets/img/2017-07-31-fhem-eimer-2560.jpg 2560w,/assets/img/2017-07-31-fhem-eimer-1920.jpg 1920w,/assets/img/2017-07-31-fhem-eimer-1600.jpg 1600w,/assets/img/2017-07-31-fhem-eimer-1366.jpg 1366w,/assets/img/2017-07-31-fhem-eimer-1024.jpg 1024w,/assets/img/2017-07-31-fhem-eimer-768.jpg 768w,/assets/img/2017-07-31-fhem-eimer-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-07-31-fhem-eimer-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-07-31-fhem-eimer-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">29.07.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - Tankinhalt berechnen</h2><div>Nachdem der Füllstandsensor nun zuverlässig Distanzen an FHEM sendet, kann daraus der Tankinhalt berechnet werden. Mathematik eines Eimers Die dafür nötigen Formel unterscheiden sich je nachdem, welche Form der Tank hat, als ersten Protoypen habe ich einen Putzeimer genutzt. Über dem Eimer habe ich den Ultraschallsensor angebracht und die Entfernung der Unterkante bis zum Boden mit 24cm gemessen. Der Radius in dieser Höhe beträgt 14cm, am Boden sind es 12cm.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/27/mysensors-gateway/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-07-27-fhem_nrf24L01-3840.webp 3840w,/assets/img/2017-07-27-fhem_nrf24L01-2560.webp 2560w,/assets/img/2017-07-27-fhem_nrf24L01-1920.webp 1920w,/assets/img/2017-07-27-fhem_nrf24L01-1600.webp 1600w,/assets/img/2017-07-27-fhem_nrf24L01-1366.webp 1366w,/assets/img/2017-07-27-fhem_nrf24L01-1024.webp 1024w,/assets/img/2017-07-27-fhem_nrf24L01-768.webp 768w,/assets/img/2017-07-27-fhem_nrf24L01-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-07-27-fhem_nrf24L01-3840.jpg 3840w,/assets/img/2017-07-27-fhem_nrf24L01-2560.jpg 2560w,/assets/img/2017-07-27-fhem_nrf24L01-1920.jpg 1920w,/assets/img/2017-07-27-fhem_nrf24L01-1600.jpg 1600w,/assets/img/2017-07-27-fhem_nrf24L01-1366.jpg 1366w,/assets/img/2017-07-27-fhem_nrf24L01-1024.jpg 1024w,/assets/img/2017-07-27-fhem_nrf24L01-768.jpg 768w,/assets/img/2017-07-27-fhem_nrf24L01-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-07-27-fhem_nrf24L01-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-07-27-fhem_nrf24L01-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">27.07.2017</h5><h2 class="postlist__tile-content-headline">FHEM - MySensors Ethernet Gateway</h2><div>Damit nicht nur ein einzelnes Gerät Zugriff auf die Daten einer MySensors Node hat, wird ein Gateway benötigt. Dieses empfängt über 2.4Ghz die Daten und bietet diese über diverse Schnittstellen zur Weiterverarbeitung an. MySensors bietet mehrere Möglichkeiten ein Gateway für die Sensoren zur Verfügung zu stellen. Das Ganze reicht von einem Seriellen Gateway1 über den direkten Anschluss an einen Raspberry2 oder auch ein WLAN Gateway3. Um etwas flexibler zu bleiben habe ich mich für ein Ethernet Gateway4 entschieden.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/27/mysensors-ultrasonic/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-07-27-fhem_nrf24L01-3840.webp 3840w,/assets/img/2017-07-27-fhem_nrf24L01-2560.webp 2560w,/assets/img/2017-07-27-fhem_nrf24L01-1920.webp 1920w,/assets/img/2017-07-27-fhem_nrf24L01-1600.webp 1600w,/assets/img/2017-07-27-fhem_nrf24L01-1366.webp 1366w,/assets/img/2017-07-27-fhem_nrf24L01-1024.webp 1024w,/assets/img/2017-07-27-fhem_nrf24L01-768.webp 768w,/assets/img/2017-07-27-fhem_nrf24L01-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-07-27-fhem_nrf24L01-3840.jpg 3840w,/assets/img/2017-07-27-fhem_nrf24L01-2560.jpg 2560w,/assets/img/2017-07-27-fhem_nrf24L01-1920.jpg 1920w,/assets/img/2017-07-27-fhem_nrf24L01-1600.jpg 1600w,/assets/img/2017-07-27-fhem_nrf24L01-1366.jpg 1366w,/assets/img/2017-07-27-fhem_nrf24L01-1024.jpg 1024w,/assets/img/2017-07-27-fhem_nrf24L01-768.jpg 768w,/assets/img/2017-07-27-fhem_nrf24L01-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-07-27-fhem_nrf24L01-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-07-27-fhem_nrf24L01-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">27.07.2017</h5><h2 class="postlist__tile-content-headline">FHEM - MySensors Ultrasonic Sensor</h2><div>Mithilfe des im Blogpost zum Füllstandsensor Ultraschallsensor HC-SR04 können Entfernungen zwischen 2 Zentimetern und über 3 Meter gemessen werden. Aus der Laufzeit von kurzen Ultraschallimpulsen kann eine Entfernung gemessen werden, welche zwar je nach Temperatur etwas abweichen kann aber für unserer Zwecke völlig ausreichend ist. Der Ultraschallsensor verfügt über 4 Pins welche an den Arduino angeschlossen werden müssen1: Sensor Arduino VCC VCC (5V) TRIG D6 ECHO D5 GND GND Das nRF24L01 Funkmodul hat weitere 8 Pins von denen 7 benötigt werden2:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/27/balkonbewaesserung-fuellstand/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-07-27-fhem_board-3840.webp 3840w,/assets/img/2017-07-27-fhem_board-2560.webp 2560w,/assets/img/2017-07-27-fhem_board-1920.webp 1920w,/assets/img/2017-07-27-fhem_board-1600.webp 1600w,/assets/img/2017-07-27-fhem_board-1366.webp 1366w,/assets/img/2017-07-27-fhem_board-1024.webp 1024w,/assets/img/2017-07-27-fhem_board-768.webp 768w,/assets/img/2017-07-27-fhem_board-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-07-27-fhem_board-3840.jpg 3840w,/assets/img/2017-07-27-fhem_board-2560.jpg 2560w,/assets/img/2017-07-27-fhem_board-1920.jpg 1920w,/assets/img/2017-07-27-fhem_board-1600.jpg 1600w,/assets/img/2017-07-27-fhem_board-1366.jpg 1366w,/assets/img/2017-07-27-fhem_board-1024.jpg 1024w,/assets/img/2017-07-27-fhem_board-768.jpg 768w,/assets/img/2017-07-27-fhem_board-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-07-27-fhem_board-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-07-27-fhem_board-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">27.07.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - Füllstandsensor</h2><div>Nachdem nun sowohl der Temperatursensor als auch die Schaltsteckdose für die Pumpe in FHEM eingebunden sind, fehlt noch eine Möglichkeit, den Füllstand des Wasserbehälters in FHEM zu erfassen und entsprechend zu verhindern, dass die Pumpe trocken läuft. Von den möglichen Lösungen wird hier die Einbindung eines Ultraschall-Distanzsensors vorgestellt. Im Vergleich zu Lösungen wie dem ELV Homematic HM-Sen-Wa-Od1 welcher eine Mindesthöhe des Behälters von 1,1m voraussetzt oder anderen ‘fertigen’ Sensoren ist hier etwas Bastelaufwand erforderlich.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/22/balkonbewaesserung-sensoren/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-07-22-fhem_sensors_FS20-3840.webp 3840w,/assets/img/2017-07-22-fhem_sensors_FS20-2560.webp 2560w,/assets/img/2017-07-22-fhem_sensors_FS20-1920.webp 1920w,/assets/img/2017-07-22-fhem_sensors_FS20-1600.webp 1600w,/assets/img/2017-07-22-fhem_sensors_FS20-1366.webp 1366w,/assets/img/2017-07-22-fhem_sensors_FS20-1024.webp 1024w,/assets/img/2017-07-22-fhem_sensors_FS20-768.webp 768w,/assets/img/2017-07-22-fhem_sensors_FS20-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-07-22-fhem_sensors_FS20-3840.jpg 3840w,/assets/img/2017-07-22-fhem_sensors_FS20-2560.jpg 2560w,/assets/img/2017-07-22-fhem_sensors_FS20-1920.jpg 1920w,/assets/img/2017-07-22-fhem_sensors_FS20-1600.jpg 1600w,/assets/img/2017-07-22-fhem_sensors_FS20-1366.jpg 1366w,/assets/img/2017-07-22-fhem_sensors_FS20-1024.jpg 1024w,/assets/img/2017-07-22-fhem_sensors_FS20-768.jpg 768w,/assets/img/2017-07-22-fhem_sensors_FS20-640.jpg 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-07-22-fhem_sensors_FS20-640.jpg" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-07-22-fhem_sensors_FS20-640.jpg"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">22.07.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - Sensoren und Schalter</h2><div>Im nächsten Schritt sollen nun die angelegten Dummy Devices durch echte Sensoren und Schalter ersetzt werden. Benötigt werden ein Temperatursensor und eine schaltbare Steckdose. Prinzipiell gibt es hier eine recht große Auswahl, sowohl FHEM Forum und Wiki bieten hier einen guten Anlaufpunkt. Aufgrund meiner bisherigen Erfahrungen habe ich mich für eine Steckdose1 aus dem FS20 System von ELV2 und einen LaCrosse-kompatiblen Temperatursensor3 entschieden, alternativ könnte man aber beispielsweise auch eine Steckdose aus dem HomeMatic System4 nutzen.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/21/balkonbewaesserung-fhem/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">21.07.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - FHEM</h2><div>Nachdem ich im letzten Blog post die Gardena Balkonbewässerung1 inklusiver der möglichen Verbesserungen vorgestellt habe, soll hier nun die Schaltzentrale für die spätere Pumpensteuerung diskutiert werden. Natürlich kann man sich so eine Software auch komplett selbst schreiben, hier wird aber der in Perl geschriebene Heimautomatisierungsserver FHEM2 genutzt. Der wohl größte Vorteil von FHEM ist, dass man quasi beliebige Sensoren und Hardwarekomponenten anbinden kann und mit diesen dann in eigenen Skripen agieren kann.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/07/20/balkonbewaesserung-basics/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">20.07.2017</h5><h2 class="postlist__tile-content-headline">Automatische Balkonbewässerung - Basics</h2><div>Trotz das wir in der Stadt wohnen, haben wir das Glück, einen recht großen Balkon zur Verfügung zu haben. Neben diversen Blühpflanzen stehen dort auch mehrere Tomaten und Chili-Pflanzen die täglich gegossen werden möchten. Um dies etwas zu vereinfachen, habe ich vor einiger Zeit nach einem Bewässerungssystem gesucht, welches möglichst unauffällig auf dem Balkon untergebracht werden kann und leicht erweiterbar ist. Gardena bietet hier mehrere Systeme an, ich habe mich für die “Vollautomatische Blumenkastenbewässerung”1 entschieden.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/05/25/aem-pdf-forms/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">25.05.2017</h5><h2 class="postlist__tile-content-headline">Fill PDF forms in an AEM Service</h2><div>If you want to provide a download of customized PDF files, you can go the full-fledged way and buy into the Adobe world or build a slim custom solution which brings no additional cost. This post shows a simple usecase where a PDF form is uploaded to DAM and later filled inside an OSGi service and delivered to the user by a Servlet. Dependencies: Apache PDFBox There are multiple open source PDF libraries we could use, but in the end Apache PDFBox1 is the weapon of choice.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/03/02/solr-aem-sample-application/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">02.03.2017</h5><h2 class="postlist__tile-content-headline">Sample Application for the AEM-Solr Integration</h2><div>After two quite theoretic posts about the basics of Solr in AEM and the schema configuration it’s time for a practical one. If you have a local AEM instance running, you can use the application I pushed into the solr-aem Github repository1 to get a running website with Solr integration. The README.md2 gives a detailed view on the application therefor I constrain the blog post to the basics. The application includes a simple Search page where Paging3, Highlighting4 and Spell checking5 are used.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/03/02/solr-aem-schema/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">02.03.2017</h5><h2 class="postlist__tile-content-headline">Setup a Solr schema.xml for AEM</h2><div>Now that we have successfully convinced AEM to use Solr as Indexer, the next step is to create a Schema which is used by Solr for Index/Query Processing. Why do we need a schema? Solr does not know anything about your data structure but you want it to perform complex operation like fulltext searches, faceting etc. To allow Solr to create a fast index, you need to define which fields you want to index and which operations should be performed upon index or query1.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/02/27/solr-aem/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">27.02.2017</h5><h2 class="postlist__tile-content-headline">Create an AEM index utilizing Solr</h2><div>Last month I discussed the options to use Elasticsearch as search engine for AEM content. The presented approach required a custom implementation of a replication agent available on Github1. As an alternative I’ll demonstrate how the build in functionality of Jackrabbit Oak2 to index into Solr3 can be used. Just like Elasticsearch4 Solr is a search platform based on Lucene5. By default Jackrabbit uses the embedded Lucene index in AEM to create an index both for internal queries and custom, application-specific queries (using XPath and SQL-2).</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/02/18/wiki2aem/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">18.02.2017</h5><h2 class="postlist__tile-content-headline">Import Wikipedia Pages into AEM</h2><div>Testing a search-engine like [ElasticSearch in AEM]({{ site.baseurl }}{% post_url 2017-01-18-elasticsearch-aem %}) requires a certain amount of pages you can index and search into. There are multiple great sources for content available but (of course) none of them provides an export into AEM. For example you can download dumps from Stackoverflow1 or Wikipedia2. I think espacially Wikipedia dumps are a quite interesting source of content as they are available in nearly (?</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/02/07/sling_filesystem_provider/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-02-07-sling_fsprovider-3840.webp 3840w,/assets/img/2017-02-07-sling_fsprovider-2560.webp 2560w,/assets/img/2017-02-07-sling_fsprovider-1920.webp 1920w,/assets/img/2017-02-07-sling_fsprovider-1600.webp 1600w,/assets/img/2017-02-07-sling_fsprovider-1366.webp 1366w,/assets/img/2017-02-07-sling_fsprovider-1024.webp 1024w,/assets/img/2017-02-07-sling_fsprovider-768.webp 768w,/assets/img/2017-02-07-sling_fsprovider-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-02-07-sling_fsprovider-3840.png 3840w,/assets/img/2017-02-07-sling_fsprovider-2560.png 2560w,/assets/img/2017-02-07-sling_fsprovider-1920.png 1920w,/assets/img/2017-02-07-sling_fsprovider-1600.png 1600w,/assets/img/2017-02-07-sling_fsprovider-1366.png 1366w,/assets/img/2017-02-07-sling_fsprovider-1024.png 1024w,/assets/img/2017-02-07-sling_fsprovider-768.png 768w,/assets/img/2017-02-07-sling_fsprovider-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-02-07-sling_fsprovider-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-02-07-sling_fsprovider-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">07.02.2017</h5><h2 class="postlist__tile-content-headline">AEM: Map local filesystem into crx repository</h2><div>With the wide introduction of sightly into AEM development it became more and more useful to mount a Filesystem into a local AEM instance. Now you can edit sightly and other files in your favorite IDE and see the changes in AEM without the need of a deployment. On the sling website you can find and download1 the FileSystem Provider which brings this functionality. You can install it in the Felix console and need to configure the local path and the webapp root in crx.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/31/rebuild_aem_clientlibs/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-01-31-aem-rebuild_clientlibs-3840.webp 3840w,/assets/img/2017-01-31-aem-rebuild_clientlibs-2560.webp 2560w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1920.webp 1920w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1600.webp 1600w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1366.webp 1366w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1024.webp 1024w,/assets/img/2017-01-31-aem-rebuild_clientlibs-768.webp 768w,/assets/img/2017-01-31-aem-rebuild_clientlibs-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-01-31-aem-rebuild_clientlibs-3840.png 3840w,/assets/img/2017-01-31-aem-rebuild_clientlibs-2560.png 2560w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1920.png 1920w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1600.png 1600w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1366.png 1366w,/assets/img/2017-01-31-aem-rebuild_clientlibs-1024.png 1024w,/assets/img/2017-01-31-aem-rebuild_clientlibs-768.png 768w,/assets/img/2017-01-31-aem-rebuild_clientlibs-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-01-31-aem-rebuild_clientlibs-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-01-31-aem-rebuild_clientlibs-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">31.01.2017</h5><h2 class="postlist__tile-content-headline">AEM: Rebuild Client Libraries</h2><div>In some situations you might need to rebuild your client libraries manually.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/24/external-metrics-server-for-proxmox/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">24.01.2017</h5><h2 class="postlist__tile-content-headline">External Metrics Server for Proxmox</h2><div>If you are familiar with the Proxmox WebUI1, you’ll know, that it provides several metrics that are not available using telegraf plugins. Espacially LXC Guests are hard to monitor. Since Proxmox Release 4.0, it’s possible to use an external metrics server. Currently Graphite2 and InfluxDB3 are supported. The following example will demonstrate, how to send data from Proxmox into your InfluxDB and visualize it in Grafana4. Although the information you get from telegraf plugins is nice, they are not reliable for e.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/23/grafana_cisco_asa/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-01-19-grafana_cisco-asa-3840.webp 3840w,/assets/img/2017-01-19-grafana_cisco-asa-2560.webp 2560w,/assets/img/2017-01-19-grafana_cisco-asa-1920.webp 1920w,/assets/img/2017-01-19-grafana_cisco-asa-1600.webp 1600w,/assets/img/2017-01-19-grafana_cisco-asa-1366.webp 1366w,/assets/img/2017-01-19-grafana_cisco-asa-1024.webp 1024w,/assets/img/2017-01-19-grafana_cisco-asa-768.webp 768w,/assets/img/2017-01-19-grafana_cisco-asa-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-01-19-grafana_cisco-asa-3840.png 3840w,/assets/img/2017-01-19-grafana_cisco-asa-2560.png 2560w,/assets/img/2017-01-19-grafana_cisco-asa-1920.png 1920w,/assets/img/2017-01-19-grafana_cisco-asa-1600.png 1600w,/assets/img/2017-01-19-grafana_cisco-asa-1366.png 1366w,/assets/img/2017-01-19-grafana_cisco-asa-1024.png 1024w,/assets/img/2017-01-19-grafana_cisco-asa-768.png 768w,/assets/img/2017-01-19-grafana_cisco-asa-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-01-19-grafana_cisco-asa-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-01-19-grafana_cisco-asa-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">23.01.2017</h5><h2 class="postlist__tile-content-headline">Grafana: Monitor a Cisco ASA with Telegraf and InfluxDB</h2><div>Some weeks ago I added several SNMP devices to my monitoring using telegraf1, influxDB2 and Grafana3 and documented the approach in this blog post. Requirements This is a follow up post, so all requirements from the original post are still valid. Furthermore you have to activate SNMP in your Cisco ASA. Basic network monitoring Telegraf configuration The basic network metrics are stored in the ifXTable we already used. Our goal is to store the data in Influx using the following tags:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/18/elasticsearch-aem-search/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">18.01.2017</h5><h2 class="postlist__tile-content-headline">Search AEM Content index in Elasticsearch</h2><div>In the last blog post I gave a brief introduction into the integration of Elasticsearch1 into AEM. This followup will explain how the indexed data can be used in a search application in AEM. Although you can use every Elasticsearch client you want (e.g. the Java REST Client2), an easy way is the usage of one of the two Searches implemented in this package. Both Search classes (Search.java3 and PageSearch.java4) require an instance of the ElasticSearchService5.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/18/elasticsearch-aem/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-01-18-aem-elastic_searchprovider_config-3840.webp 3840w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-2560.webp 2560w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1920.webp 1920w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1600.webp 1600w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1366.webp 1366w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1024.webp 1024w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-768.webp 768w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-01-18-aem-elastic_searchprovider_config-3840.png 3840w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-2560.png 2560w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1920.png 1920w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1600.png 1600w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1366.png 1366w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-1024.png 1024w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-768.png 768w,/assets/img/2017-01-18-aem-elastic_searchprovider_config-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-01-18-aem-elastic_searchprovider_config-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-01-18-aem-elastic_searchprovider_config-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">18.01.2017</h5><h2 class="postlist__tile-content-headline">Index AEM Content with Elasticsearch</h2><div>With the build-in Lucene Index1 in AEM, most of the requirements for a flexible and fast search can be implemented with minimal effort and no need for additional dependencies. The functionality for queries is wrapped in the QueryBuilder API2 and the index configuration3 done in CRX. A query can search in multiple fields for values or full-text and provide scoring, excerpts etc. Depending on the supported languages, you can also configure Analyzers4 for Stemming, Stop Words etc.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/14/proxmox-nfs-backups/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">14.01.2017</h5><h2 class="postlist__tile-content-headline">Increase performance of Proxmox Backups to NFS Targets</h2><div>I’m using a Proxmox Server at home to virtualize different services. The daily backups are created on an NFS share of my NAS. While the NFS share usually performs with ~70MB/s, the proxmox backup speed was only around 2MB/s. Backups to the local SSD were finished with ~100MB/s without compression and ~15MB/s with gzip, so it should not be a CPU issue. There are some threads in the Proxmox Forum about the influence of NFS mount-options and other stuff but in the end the following change workes for me:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/08/aem_transport_handler/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2017-01-08-aem_replication_agent-3840.webp 3840w,/assets/img/2017-01-08-aem_replication_agent-2560.webp 2560w,/assets/img/2017-01-08-aem_replication_agent-1920.webp 1920w,/assets/img/2017-01-08-aem_replication_agent-1600.webp 1600w,/assets/img/2017-01-08-aem_replication_agent-1366.webp 1366w,/assets/img/2017-01-08-aem_replication_agent-1024.webp 1024w,/assets/img/2017-01-08-aem_replication_agent-768.webp 768w,/assets/img/2017-01-08-aem_replication_agent-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2017-01-08-aem_replication_agent-3840.png 3840w,/assets/img/2017-01-08-aem_replication_agent-2560.png 2560w,/assets/img/2017-01-08-aem_replication_agent-1920.png 1920w,/assets/img/2017-01-08-aem_replication_agent-1600.png 1600w,/assets/img/2017-01-08-aem_replication_agent-1366.png 1366w,/assets/img/2017-01-08-aem_replication_agent-1024.png 1024w,/assets/img/2017-01-08-aem_replication_agent-768.png 768w,/assets/img/2017-01-08-aem_replication_agent-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2017-01-08-aem_replication_agent-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2017-01-08-aem_replication_agent-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">08.01.2017</h5><h2 class="postlist__tile-content-headline">AEM: Handling Page-Replication events with a custom Transport Handler</h2><div>An usual approach to react to different events in AEM is the implementation of an Event Handler1. In your implementation you subscribe to one or more event topics which are then passed into the void handleEvent(Event event) method. The interface for an Event Handler is quite simple, so this is a very lean approach. You can find an example in Adobe’s Knowledge Base Although you can subscribe to the Replication Event2, there are some usecases where an EventHandler might not work for you.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2017/01/04/elasticsearch-rest-osgi/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">04.01.2017</h5><h2 class="postlist__tile-content-headline">Deploy Elasticsearch Rest Client into OSGi</h2><div>Up until Elasticsearch 5.0.0 alpha 4 the official Elasticsearch Java client required the complete Elasticsearch distributable included in your application. Although there are several alternative clients available, the new Java Rest Client brings most of the functionallity bundled in a small package. Since the artifact published by elastic does not contain the required OSGi bundle information I created a wrapper you can find on Github1. Dependencies All dependencies are inherited from the RestClient and available as OSGi Bundles:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2016/12/19/postfix_ldap/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">19.12.2016</h5><h2 class="postlist__tile-content-headline">Postfix with LDAP backend</h2><div>Although there is a lot of documentation regarding Postfix and OpenLDAP I could not find a complete example. A good starting point when looking for the integration is the LDAP_README of postfix which gives at least some basic information. In this post I’ll show how I managed to combine Postfix with OpenLDAP. I had the following requirements for my setups: Host multiple Domains Each user can have one or more addresses, not limited to a single Domain Each user does only have one Login and Mailbox.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2016/12/07/grafana_fhem_influxdb/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2016-12-07-munin-fhem-3840.webp 3840w,/assets/img/2016-12-07-munin-fhem-2560.webp 2560w,/assets/img/2016-12-07-munin-fhem-1920.webp 1920w,/assets/img/2016-12-07-munin-fhem-1600.webp 1600w,/assets/img/2016-12-07-munin-fhem-1366.webp 1366w,/assets/img/2016-12-07-munin-fhem-1024.webp 1024w,/assets/img/2016-12-07-munin-fhem-768.webp 768w,/assets/img/2016-12-07-munin-fhem-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2016-12-07-munin-fhem-3840.png 3840w,/assets/img/2016-12-07-munin-fhem-2560.png 2560w,/assets/img/2016-12-07-munin-fhem-1920.png 1920w,/assets/img/2016-12-07-munin-fhem-1600.png 1600w,/assets/img/2016-12-07-munin-fhem-1366.png 1366w,/assets/img/2016-12-07-munin-fhem-1024.png 1024w,/assets/img/2016-12-07-munin-fhem-768.png 768w,/assets/img/2016-12-07-munin-fhem-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2016-12-07-munin-fhem-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2016-12-07-munin-fhem-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">07.12.2016</h5><h2 class="postlist__tile-content-headline">Grafana: Monitor FHEM data with Telegraf and InfluxDB</h2><div>Some years ago I decided to use FHEM as my home automation server. The main reasons are that it is really lightweight and provides many plugins to add sensors and interactors. To visualize the data, I’m currently using some Munin plugins1. With this post, I’ll show how you can use InfluxDB, Telegraf and Grafana to display the graphs in a more fancy way. FHEM uses Logfiles to store all of it’s data.</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2016/12/06/grafana_snmp/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2016-12-06-grafana_snmp_config-3840.webp 3840w,/assets/img/2016-12-06-grafana_snmp_config-2560.webp 2560w,/assets/img/2016-12-06-grafana_snmp_config-1920.webp 1920w,/assets/img/2016-12-06-grafana_snmp_config-1600.webp 1600w,/assets/img/2016-12-06-grafana_snmp_config-1366.webp 1366w,/assets/img/2016-12-06-grafana_snmp_config-1024.webp 1024w,/assets/img/2016-12-06-grafana_snmp_config-768.webp 768w,/assets/img/2016-12-06-grafana_snmp_config-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2016-12-06-grafana_snmp_config-3840.png 3840w,/assets/img/2016-12-06-grafana_snmp_config-2560.png 2560w,/assets/img/2016-12-06-grafana_snmp_config-1920.png 1920w,/assets/img/2016-12-06-grafana_snmp_config-1600.png 1600w,/assets/img/2016-12-06-grafana_snmp_config-1366.png 1366w,/assets/img/2016-12-06-grafana_snmp_config-1024.png 1024w,/assets/img/2016-12-06-grafana_snmp_config-768.png 768w,/assets/img/2016-12-06-grafana_snmp_config-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2016-12-06-grafana_snmp_config-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2016-12-06-grafana_snmp_config-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">06.12.2016</h5><h2 class="postlist__tile-content-headline">Grafana: Monitor SNMP devices with Telegraf and InfluxDB</h2><div>My current setup is using Munin as monitoring solution. Although it is a very stable and useful tool, I sometimes miss a more dynamic view on graphs. In this post, I’ll show how to use a stack consisting of InfluxDB, Telegraf and Grafana to monitor SNMP devices like a Router. Requirements First of all you need to have a running InfluxDB1, Telegraf2 and Grafana3 installation. Furthermore you should install some tools we will use laster:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2016/11/15/aem_metrics/"><div class="postlist__tile-header lazy-media"><div class="spinner"><div class="spinner__rect1"></div><div class="spinner__rect2"></div><div class="spinner__rect3"></div><div class="spinner__rect4"></div><div class="spinner__rect5"></div></div><picture class="postlist__tile-header-picture"><source data-srcset="/assets/img/2016-11-15-aem_metrics-3840.webp 3840w,/assets/img/2016-11-15-aem_metrics-2560.webp 2560w,/assets/img/2016-11-15-aem_metrics-1920.webp 1920w,/assets/img/2016-11-15-aem_metrics-1600.webp 1600w,/assets/img/2016-11-15-aem_metrics-1366.webp 1366w,/assets/img/2016-11-15-aem_metrics-1024.webp 1024w,/assets/img/2016-11-15-aem_metrics-768.webp 768w,/assets/img/2016-11-15-aem_metrics-640.webp 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)" type="image/webp"><source data-srcset="/assets/img/2016-11-15-aem_metrics-3840.png 3840w,/assets/img/2016-11-15-aem_metrics-2560.png 2560w,/assets/img/2016-11-15-aem_metrics-1920.png 1920w,/assets/img/2016-11-15-aem_metrics-1600.png 1600w,/assets/img/2016-11-15-aem_metrics-1366.png 1366w,/assets/img/2016-11-15-aem_metrics-1024.png 1024w,/assets/img/2016-11-15-aem_metrics-768.png 768w,/assets/img/2016-11-15-aem_metrics-640.png 640w," sizes="(min-width: 120em) calc(((120em - 4em) * 1.25) /3), (min-width: 85.375em) calc((100vw - 8em) / 3), (min-width: 64em) calc((100vw - 4em) / 2), calc(100vw - 2em)"><img alt="/assets/img/2016-11-15-aem_metrics-640.png" class="postlist__tile-header-picture-item" data-src="/assets/img/2016-11-15-aem_metrics-640.png"></picture></div><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">15.11.2016</h5><h2 class="postlist__tile-content-headline">AEM: Integrate Graphite Metrics</h2><div></div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><template><div class="content__tile content__tile-clickable postlist__tile"><a class="content__tile-link" href="https://www.dev-eth0.de/2016/11/13/latex_miktex-makepk-pk-font-umvs-could-not-be-created/"><div class="postlist__tile-content"><h5 class="postlist__tile-content-meta">13.11.2016</h5><h2 class="postlist__tile-content-headline">miktex-makepk: PK font umvs could not be created</h2><div>If you try to use marvosym with MikTex, you might run in the following error: Trying to make PK font umvs at 657 DPI&hellip; Running miktex-makemf.exe&hellip; miktex-makemf: The umvs source file could not be found. Running ttf2pk.exe&hellip; miktex-makepk: PK font umvs could not be created. Process exited with error(s) But the solution is quite easy: just start a commandline and navigate to your MikTex installation. Then enter the bin folder and execute these commands:</div></div><div class="content__tile-footer"><svg class="content__tile-footer-chevron" viewBox="0 0 16 16"><use xlink:href="#chevron-right"></use></svg></div></a></div></template><div id="postlist__col1-js"></div><div id="postlist__col2-js"></div><div id="postlist__col3-js"></div></section></div></div><footer class="footer" role="contentinfo"><div class="footer__cols"><div class="footer__col footer__col-meta"><ul class="footer__col-entries footer__col-meta-entries"><li class="footer__col-entries-item"><a class="e-link footer__col-entries-link" href="/legal/imprint/">Impressum</a></li><li class="footer__col-entries-item"><a class="e-link footer__col-entries-link" href="/legal/privacy-policy/">Rechtliche Hinweise</a></li></ul></div><div class="footer__col footer__col-social"><ul class="footer__col-entries footer__col-social-entries"><li class="footer__col-social-entries-item"><a class="footer__col-entries-link footer__col-icon-link" href="https://github.com/deveth0"><svg class="footer__col-social-icon footer__col-icon" viewBox="0 0 16 16"><use xlink:href="#github"></use></svg></a></li><li class="footer__col-social-entries-item"><a class="footer__col-entries-link footer__col-icon-link" href="https://www.linkedin.com/in/alexander-muthmann/"><svg class="footer__col-social-icon footer__col-icon" viewBox="0 0 16 16"><use xlink:href="#linkedin"></use></svg></a></li><li class="footer__col-social-entries-item"><a class="footer__col-icon-link" href="https://www.dev-eth0.de/index.xml"><svg class="footer__col-social-icon footer__col-icon footer__col-social-icon-rss" viewBox="0 0 16 16"><use xlink:href="#rss"></use></svg></a></li></ul></div><div class="footer__col footer__col-license"><a class="footer__col-license-link footer__col-icon-link" href="http://creativecommons.org/licenses/by-sa/4.0/"><svg class="footer__col-license-icon footer__col-icon" viewBox="0 0 16 16"><use xlink:href="#cc-cc"></use></svg> <svg class="footer__col-license-icon footer__col-icon" viewBox="0 0 16 16"><use xlink:href="#cc-by"></use></svg> <svg class="footer__col-license-icon footer__col-icon" viewBox="0 0 16 16"><use xlink:href="#cc-sa"></use></svg></a></div></div><div class="footer__buildinfo">Page generated: 2024-06-08T16:04:55&#43;0000</div></footer><div class="cookie-consent" id="cookie-consent-js"><span class="cookie-consent__text">This website uses cookies to ensure you get the best experience. <a class="e-link" href="https://www.dev-eth0.de/legal/privacy-policy/">Learn more</a></span><div class="cookie-consent__btn-wrapper"><button class="e-button" id="cookie-consent__btn-js">Got it!</button></div></div><button class="backToTop backToTop--hidden" id="backToTop-js"><svg class="backToTop__icon" viewBox="0 0 16 16"><use xlink:href="#expand_less"></use></svg></button><script type="module" src="/assets/main.30c4c99817464660d57a.js" integrity=""></script><script nomodule src="/assets/mainLegacy.bd8bb04370fa8fbf3901.js" integrity=""></script></body></html>