{
    "componentChunkName": "component---src-templates-education-js",
    "path": "/education/htlwrn/",
    "result": {"pageContext":{"url":"/education/htlwrn/","relativePath":"education/htlwrn.md","relativeDir":"education","base":"htlwrn.md","name":"htlwrn","frontmatter":{"title":"","template":"education","institution":"HTBLuVA Wr.Neustadt","department":"EDV und Organisation / Informatik","degree":"Matura, Ingenieur","excerpt":"Abgeschlossen mit gutem Erfolg","start":"1998-08-31T22:00:00.000Z","end":"2003-05-31T22:00:00.000Z","highlight":false,"education_url":"https://www.htlwrn.ac.at","thumb_img_path":"/images/school-htlwrn.png","content_img_path":"/images/school-htlwrn.png","active":true,"date":"","enabled":true,"education":true},"html":"","pages":[{"url":"/404/","relativePath":"404.md","relativeDir":"","base":"404.md","name":"404","frontmatter":{"title":"404","template":"error","subtitle":"Page not found","img_path":"","alt_html":"For f***ing sake. I said it's not there. Your dumb url is wrong."},"html":"<p>We searched.<br />\nVery precisely.<br />\nTwice.<br />\nBut we couldn't find the resource you were looking for.<br />\nWe're sorry.<br />\nWe disappointed you.<br />\nWe let you down.<br />\nWe failed you.<br />\nBut!<br />\nWe promise to improve.<br />\nWe won't have to apologize again.<br />\nYou have our word.<br />\n<br /></p>"},{"url":"/about/","relativePath":"about.md","relativeDir":"","base":"about.md","name":"about","frontmatter":{"title":"Über den Author","subtitle":"","img_path":"/images/about.jpg","menus":{"main":{"title":"Über mich","weight":5}},"template":"page"},"html":"<p><strong>Andreas Pauschenwein</strong>, ist seit Mitte der 2000er Jahre als Software Entwickler im Web-Bereich tätig. Darauf spezialisiert komplizierteste Schnittstellen in brauchbare Webservices zusammenzuführen, hat er sich bereits in unterschiedlichste Technologien eingearbeitet. Von Delphi über PHP zu Python und NodeJs - von LAMP über VMs zu Containern, JAM und Cloud Services - alles stand schon am Programm. Eines ist ganz klar: Webtechnologien werden sich in Zukunft noch schneller weiterentwickeln.</p>\n<blockquote>\n<p>Es ist nicht die stärkste Spezies die überlebt auch nicht die intelligenteste sondern eher diejenige die am ehesten bereit ist sich zu verändern. <cite>Charles Darwin</cite></p>\n</blockquote>\n<p>Beruflich will er sich in Zukunft weiter für die Etablierung besserer CI/CD Abläufe einsetzen und die Aufgaben für devops möglichst automatisieren.</p>\n<p>Als Hobby wird Zuhause im Burgenland an den eigenen vier Wänden bzw. an deren Verkabelung gearbeitet. Home-Automation, IOT und allerlei Programmier-Spielerein füllen so manche Abende die er von seinen Kindern freibekommt.</p>\n<p><em>Danke fürs Lesen!</em></p>"},{"url":"/contact/","relativePath":"contact.md","relativeDir":"","base":"contact.md","name":"contact","frontmatter":{"title":"Kontakt","menus":{"main":{"title":"Kontakt","weight":6}},"template":"contact","subtitle":"","img_path":""},"html":"<p>Für Projektanfragen verwenden Sie bitte das untenstehende Formular.</p>"},{"url":"/cv/","relativePath":"cv/index.md","relativeDir":"cv","base":"index.md","name":"index","frontmatter":{"title":"Lebenslauf","menus":{"main":{"weight":4,"title":"Lebenslauf"}},"template":"cv","enabled":true,"level":3},"html":""},{"url":"/style-guide/","relativePath":"style-guide.md","relativeDir":"","base":"style-guide.md","name":"style-guide","frontmatter":{"title":"Style Guide","subtitle":"The style guide provides you with a blueprint of default post and page styles. The style guide is also a great reference for suggested typographic treatment and styles for your content.","menus":{"not-main":{"title":"Style Guide","weight":3}},"template":"page","enabled":false},"html":"<p><strong>This is a paragraph</strong>. Pellentesque habitant morbi <em>tristique senectus et netus et malesuada</em> fames ac turpis egestas. Vestibulum <a href=\"https://www.google.com\">tortor quam</a>, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit <mark>amet est et sapien ullamcorper</mark> pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi.</p>\n<h1>This is an H1</h1>\n<p>Quisque facilisis erat a dui. Nam malesuada ornare dolor. Cras gravida, this is marked text ornare, erat elit consectetuer erat, id egestas pede nibh eget odio. Proin tincidunt, velit vel porta elementum, magna diam molestie sapien, non aliquet massa pede eu diam. Aliquam iaculis. Fusce et ipsum et nulla tristique facilisis.</p>\n<h2>This is an H2</h2>\n<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero.</p>\n<h3>This is an H3</h3>\n<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero.</p>\n<h4>This is an H4</h4>\n<p>Quisque facilisis erat a dui. Nam malesuada ornare dolor. Cras gravida, diam sit amet rhoncus ornare, erat elit consectetuer erat, id egestas pede nibh eget odio. Proin tincidunt, velit vel porta elementum, magna diam molestie sapien, non aliquet massa pede eu diam. Aliquam iaculis.</p>\n<h2>Quoting</h2>\n<blockquote>\n<p>Creativity is allowing yourself to make mistakes. Design is knowing which ones to keep. <cite>Scott Adams</cite></p>\n</blockquote>\n<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi commodo, ipsum sed pharetra gravida, orci magna rhoncus neque, id pulvinar odio lorem non turpis. Nullam sit amet enim. Suspendisse id velit vitae ligula volutpat condimentum. Aliquam erat volutpat. Sed quis velit. Nulla facilisi. Nulla libero.</p>\n<hr />\n<h2>Unordered Lists</h2>\n<ul>\n<li>Donec non tortor in arcu mollis feugiat</li>\n<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</li>\n<li>Donec id eros eget quam aliquam gravida</li>\n<li>Vivamus convallis urna id felis</li>\n<li>Nulla porta tempus sapien</li>\n</ul>\n<h2>Ordered Lists</h2>\n<ol>\n<li>Donec non tortor in arcu mollis feugiat</li>\n<li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</li>\n<li>Donec id eros eget quam aliquam gravida</li>\n<li>Vivamus convallis urna id felis</li>\n<li>Nulla porta tempus sapien</li>\n</ol>\n<h2>Code Blocks</h2>\n<p>Blocks of code are either fenced by lines with three back-ticks, or are indented with four spaces.</p>\n<pre><code>&#x3C;!-- Some example CSS code -->\nbody {\n  color:red;\n}\n</code></pre>\n<h2>Tables</h2>\n<table>\n    <caption>Table with thead, tfoot, and tbody</caption>\n  <thead>\n    <tr>\n      <th>Header content 1</th>\n      <th>Header content 2</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>Body content 1</td>\n      <td>Body content 2</td>\n    </tr>\n  </tbody>\n  <tfoot>\n    <tr>\n      <td>Footer content 1</td>\n      <td>Footer content 2</td>\n    </tr>\n  </tfoot>\n</table>"},{"url":"/education/coursera-android-communication/","relativePath":"education/coursera-android-communication.md","relativeDir":"education","base":"coursera-android-communication.md","name":"coursera-android-communication","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Mobile Services for Android Handheld Systems: Communication","excerpt":"Online Angebot von www.coursera.org 4 weeks | 8-12 hours/week","start":"2015-03-07T23:00:00.000Z","end":"2015-04-07T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/9LT97TQTDY","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/","relativePath":"index.md","relativeDir":"","base":"index.md","name":"index","frontmatter":{"title":"Home","sections":[{"type":"heroblock","template":"heroblock","section_id":"hero","component":"HeroBlock","content":"gamer, vater, häuslbauer","title":"Andreas Pauschenwein","actions":[]},{"type":"contentblock","template":"contentblock","title":"","section_id":"about","actions":[{"label":"Kontakte hierher","url":"/contact"}],"component":"ContentBlock","content":"andreas@dev:\\~$ cat **aboutme**.yaml </p><pre>profession:\n    level: <b>senior</b>\n    field: <b>full-stack</b>\n    role:  <b>developer</b>\n    exp:   <b>18y+</b>\n    area:  <b>.at</b>\ninterests:\n    - home-automation\n    - GameJams\n    - AI and LLM\n    - photography\n    - them kids\n</pre><p>andreas@dev:\\~$ logout","image":""},{"type":"projectsblock","template":"projectsblock","title":"Projekte","section_id":"recent-projects","actions":[{"label":"Weitere Projekte","url":"showcase"}],"component":"ProjectsBlock","num_projects_displayed":6}],"menus":{"main":{"title":"Home","weight":1}},"template":"home"},"html":""},{"url":"/education/coursera-android-concurrency/","relativePath":"education/coursera-android-concurrency.md","relativeDir":"education","base":"coursera-android-concurrency.md","name":"coursera-android-concurrency","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Mobile Services for Android Handheld Systems: Concurrency","excerpt":"Online Angebot von www.coursera.org 4 weeks | 5-10 hours/week","start":"2015-03-07T23:00:00.000Z","end":"2015-04-07T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/AM7GRXLRXZ","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/blog/","relativePath":"blog/index.md","relativeDir":"blog","base":"index.md","name":"index","frontmatter":{"title":"Blog","menus":{"main":{"weight":7,"title":"Blog"}},"template":"blog","enabled":true},"html":""},{"url":"/education/coursera-android-security/","relativePath":"education/coursera-android-security.md","relativeDir":"education","base":"coursera-android-security.md","name":"coursera-android-security","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Cloud Services for Android Handheld Systems: Security","excerpt":"Online Angebot von www.coursera.org 5 weeks | 8-12 hours/week","start":"2015-03-07T23:00:00.000Z","end":"2015-04-07T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/U5M343FLK5","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-android-spring/","relativePath":"education/coursera-android-spring.md","relativeDir":"education","base":"coursera-android-spring.md","name":"coursera-android-spring","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Cloud Services for Android Handheld Systems: Spring","excerpt":"Online Angebot von www.coursera.org 4 weeks | 5-10 hours/week","start":"2015-03-07T23:00:00.000Z","end":"2015-04-07T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/W45KLFYUDN","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-android/","relativePath":"education/coursera-android.md","relativeDir":"education","base":"coursera-android.md","name":"coursera-android","frontmatter":{"title":"","enabled":true,"template":"education","institution":"University of Maryland (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Mobile Applications for Android Handheld Systems","excerpt":"Online Angebot von www.coursera.org 4 weeks | 5-10 hours/week Part 2: https://www.coursera.org/account/accomplishments/certificate/TZBV97YGVT","start":"2015-03-07T23:00:00.000Z","end":"2015-04-07T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/4NH8MR528M","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-cloud-services/","relativePath":"education/coursera-cloud-services.md","relativeDir":"education","base":"coursera-cloud-services.md","name":"coursera-cloud-services","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Cloud Services for Android Handheld Systems","excerpt":"Online Angebot von www.coursera.org 10 weeks","start":"2014-07-20T22:00:00.000Z","end":"2014-09-28T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/HJBWN9JU5T","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-meteor/","relativePath":"education/coursera-meteor.md","relativeDir":"education","base":"coursera-meteor.md","name":"coursera-meteor","frontmatter":{"title":"","enabled":true,"template":"education","institution":"University of London (coursera.org)","department":"Computer Science: Software Engineering","degree":"Introduction to Meteor.js Development","excerpt":"Online Angebot von www.coursera.org 4 weeks, 1-3 hours/week","start":"2016-01-02T23:00:00.000Z","end":"2016-02-06T23:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/YJBWB5NCXC7K","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-mobile-apps/","relativePath":"education/coursera-mobile-apps.md","relativeDir":"education","base":"coursera-mobile-apps.md","name":"coursera-mobile-apps","frontmatter":{"title":"","enabled":true,"template":"education","institution":"University of Maryland, College Park (coursera.org)","department":"Computer Science: Software Engineering","degree":"Programming Mobile Applications for Android Handheld Systems","excerpt":"Online Angebot von www.coursera.org 8 weeks","start":"2014-01-20T23:00:00.000Z","end":"2014-01-27T23:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/RDVPEM3CUT","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-mongodb/","relativePath":"education/coursera-mongodb.md","relativeDir":"education","base":"coursera-mongodb.md","name":"coursera-mongodb","frontmatter":{"title":"","enabled":true,"template":"education","institution":"University of London (coursera.org)","department":"Computer Science: Software Engineering","degree":"Web Application Development with JavaScript and MongoDB","excerpt":"Online Angebot von www.coursera.org 4 weeks of study, 1-2 hours/week","start":"2016-01-09T23:00:00.000Z","end":"2016-02-15T23:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/8FCNKLEVS8MX","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/coursera-patterns/","relativePath":"education/coursera-patterns.md","relativeDir":"education","base":"coursera-patterns.md","name":"coursera-patterns","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Vanderbilt University (coursera.org)","department":"Computer Science: Software Engineering","degree":"Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems","excerpt":"Online Angebot von www.coursera.org 8 weeks","start":"2014-05-11T22:00:00.000Z","end":"2014-07-05T22:00:00.000Z","highlight":false,"education_url":"https://www.coursera.org/account/accomplishments/certificate/94MLHGTX7U","thumb_img_path":"/images/school-coursera.png","content_img_path":"/images/school-coursera.png","date":""},"html":""},{"url":"/education/fhvie/","relativePath":"education/fhvie.md","relativeDir":"education","base":"fhvie.md","name":"fhvie","frontmatter":{"title":"","enabled":true,"template":"education","institution":"FH des bfi Wien","department":"Projektmanagement und Informationstechnik","degree":"Bachelor of Arts in Business","excerpt":"Spezialisierung: PM bei Softwareprojekten, Mobile Computing, Web-Engineering und E-Commerce, Leistungsstipendium 2010 - 2012. Abgeschlossen mit ausgezeichnetem Erfolg","start":"2010-08-31T22:00:00.000Z","end":"2013-05-31T22:00:00.000Z","highlight":true,"education_url":"https://www.fh-vie.ac.at","thumb_img_path":"/images/school-fhbfi.png","content_img_path":"/images/school-fhbfi.png","date":"","education":true},"html":""},{"url":"/education/htlwrn/","relativePath":"education/htlwrn.md","relativeDir":"education","base":"htlwrn.md","name":"htlwrn","frontmatter":{"title":"","template":"education","institution":"HTBLuVA Wr.Neustadt","department":"EDV und Organisation / Informatik","degree":"Matura, Ingenieur","excerpt":"Abgeschlossen mit gutem Erfolg","start":"1998-08-31T22:00:00.000Z","end":"2003-05-31T22:00:00.000Z","highlight":false,"education_url":"https://www.htlwrn.ac.at","thumb_img_path":"/images/school-htlwrn.png","content_img_path":"/images/school-htlwrn.png","active":true,"date":"","enabled":true,"education":true},"html":""},{"url":"/education/udemy-angular/","relativePath":"education/udemy-angular.md","relativeDir":"education","base":"udemy-angular.md","name":"udemy-angular","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Maximilian Schwarzmüller (Udemy.com)","department":"Programmierung > Webentwicklung","degree":"Angular (2+) verstehen und anwenden","excerpt":"Online Angebot von udemy.org 20 Abschnitte, +200 Lektionen","start":"2020-01-11T22:00:00.000Z","end":"2020-04-01T22:00:00.000Z","highlight":true,"education_url":"https://www.udemy.com/certificate/UC-e328c823-902f-429a-a155-2912aa8496e7/","thumb_img_path":"/images/school-udemy.png","content_img_path":"/images/school-udemy.png","date":""},"html":""},{"url":"/posts/auf-windows-netzlaufwerk-aus-der-wsl2-zugreifen/","relativePath":"posts/auf-windows-netzlaufwerk-aus-der-wsl2-zugreifen.md","relativeDir":"posts","base":"auf-windows-netzlaufwerk-aus-der-wsl2-zugreifen.md","name":"auf-windows-netzlaufwerk-aus-der-wsl2-zugreifen","frontmatter":{"title":"Auf Windows Netzlaufwerk aus der WSL2 zugreifen","date":"2021-02-02T15:08:09.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"5min","excerpt":"Dateien einfach auf dem Netzwerk holen","canonical_url":""},"html":"<p>Man kann aus Windows heraus auf die Harddisk der WSL2 einfach über den Explorer zugreifen. Mit</p>\n<pre><code>\\\\wsl$\\\n</code></pre>\n<p>kommt man zur Auswahl der installierten und gestarteten Machinen.</p>\n<p>Oft wär es aber einfacher, wenn man die Daten direkt aus dem Netzkwerk in die WSL2 laden könnte. Dazu hier eine <a href=\"https://superuser.com/a/1261563\" title=\"Mounting network locations\">sehr schöne Antwort</a></p>\n<pre><code>sudo mkdir /mnt/s\nsudo mount -t drvfs '\\\\netzwerkserver\\freigabe\\ordner' /mnt/s\nrsync --info=progress2 /mnt/s/2GBPatchFile.deb ~/downloads/.\n</code></pre>\n<p>An der stelle könnte man natüürlich auch einfach ein <code>cp</code> verwenden - das hat dann aber keine so schöne Geschwindigkeitsanzeige.</p>"},{"url":"/education/udemy-react-redux/","relativePath":"education/udemy-react-redux.md","relativeDir":"education","base":"udemy-react-redux.md","name":"udemy-react-redux","frontmatter":{"title":"","enabled":true,"template":"education","institution":"Stephen Grider (Udemy.com)","department":"Programmierung > Webentwicklung","degree":"Advanced React and Redux","excerpt":"Online Angebot von udemy.org 12 Abschnitte, +230 Lektionen","start":"2017-03-04T22:00:00.000Z","end":"2017-09-11T22:00:00.000Z","highlight":false,"education_url":"https://www.udemy.com/certificate/UC-dc2d6343-5419-444a-88b8-c3f76a4154ee/","thumb_img_path":"/images/school-udemy.png","content_img_path":"/images/school-udemy.png","date":""},"html":""},{"url":"/posts/basic-auth-fur-bash-und-powershell/","relativePath":"posts/basic-auth-fur-bash-und-powershell.md","relativeDir":"posts","base":"basic-auth-fur-bash-und-powershell.md","name":"basic-auth-fur-bash-und-powershell","frontmatter":{"title":"Basic Auth für bash und powershell","date":"2021-07-20T15:36:56.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"bash vs powershell","highlight":false,"project_url":"https://gist.github.com/h4de5/ef390dd5c0f41af8d14b1c013a9ceef7","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"20min","excerpt":"Ein super Beispiel warum es falsch ist, powershell zu sein.","canonical_url":""},"html":"<h3>Aufgabe</h3>\n<blockquote>\n<p>Username + Passwort per Basic Authentification an einen Web Service schicken, welcher allerdings kein gültiges Zertifkat besitzt und das Ergebnis samt einer Url an den Browser weiterleiten.</p>\n</blockquote>\n<h3>bash</h3>\n<pre><code>token=$(curl --insecure --request GET \\\n    --url \"https://localhost:1234/Token\" \\\n    --header \"$(echo Authorization: Basic $(echo -n 'username:password' | base64))\")\n# echo $token\n# open browser\n# xdg-open \"https://localhost:1234/?token=\" + $token\nsensible-browser \"https://localhost:1234/?token=\" + $token\n</code></pre>\n<h3>powershell</h3>\n<pre><code>$user = 'username'\n$pass = 'password'\n$url = 'https://localhost:1234/Token'\n\n$pair = \"$($user):$($pass)\"\n\n$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))\n\n$Headers = @{\n    ContentType = \"text/plain\"\n    Authorization = \"Basic $encodedCreds\"\n}\n\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\nif (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)\n{\n$certCallback = @\"\n    using System;\n    using System.Net;\n    using System.Net.Security;\n    using System.Security.Cryptography.X509Certificates;\n    public class ServerCertificateValidationCallback\n    {\n        public static void Ignore()\n        {\n            if(ServicePointManager.ServerCertificateValidationCallback ==null)\n            {\n                ServicePointManager.ServerCertificateValidationCallback += \n                    delegate\n                    (\n                        Object obj, \n                        X509Certificate certificate, \n                        X509Chain chain, \n                        SslPolicyErrors errors\n                    )\n                    {\n                        return true;\n                    };\n            }\n        }\n    }\n\"@\n    Add-Type $certCallback\n }\n[ServerCertificateValidationCallback]::Ignore()\n\n$result = Invoke-WebRequest -Uri $url -Headers $Headers -Method Get\n\n$result.Headers.'Content-Type text/plain; charset=utf-8'\n$token = [System.Text.Encoding]::UTF8.GetString($result.Content)\n\n# open browser\nStart-Process (\"https://localhost:1234/?token=\" + $token)\n</code></pre>\n<p>and the winner is...</p>\n<p>... sicherlich nicht powershell.</p>\n<p>Ab powershell v6 gibts anscheinend einen einfacheren Weg ungültige Zertifikate einfach zu ignorieren - leider wird mit Windows 10 nur v5.7 ausgeliefert.</p>"},{"url":"/posts/ein-minimaler-openwrt-access-point/","relativePath":"posts/ein-minimaler-openwrt-access-point.md","relativeDir":"posts","base":"ein-minimaler-openwrt-access-point.md","name":"ein-minimaler-openwrt-access-point","frontmatter":{"title":"ein minimaler OpenWRT Access Point","date":"2021-01-02T16:09:10.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"nur das nötigste aktivieren","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"15min","excerpt":"OpenWRT braucht zumindest 64mb RAM - leider ist die stabilität auf solchen Geräte in der aktuellen Version nicht mehr wirklich gewährleistet.","canonical_url":""},"html":"<p>Habe vor kurzem meine Access Points (<strong>TP-Link RE450</strong>) auf OpenWRT umgestellt. Nachdem ich dies bei einem reserve Gerät schon vor einigen Monaten getan hab und keine Probleme feststellen konnte - hab ich mir eigentlich wenig Widerstand erwartet.</p>\n<p>Tja - leider ist auch hier der Test- und Produktions-Betrieb ziemlich unterschiedlich. Nach wenigen Stunden im normalen Betrieb geht den Geräten nämlich der RAM aus. Das führt dazu, dass die OpenWRT Web Oberfläche zuerst nicht mehr erreichbar ist, danach erreicht man das Gerät auch nicht mehr per SSH und zu guter Letzt nimmt der Access Point keine  neuen WLAN Verbindungen mehr auf. Das heißt man merkt erst, dass das Problem existiert, wenn man nur noch lokal den Stecker ziehen kann.</p>\n<h2>Lösung</h2>\n<p>Da ich sie nur als \"dummen\" Access Point einsetze, kann einiges weg bzw. ausgeschaltet werden. Siehe auch: <a href=\"https://openwrt.org/docs/guide-user/network/wifi/dumbap\" title=\"Wireless Access Point\">https://openwrt.org/docs/guide-user/network/wifi/dumbap</a></p>\n<pre><code># unnötige dienste stoppen\n/etc/init.d/dnsmasq disable\n/etc/init.d/dnsmasq stop\n/etc/init.d/odhcpd disable\n/etc/init.d/odhcpd stop\n/etc/init.d/firewall disable\n/etc/init.d/firewall stop\n/etc/init.d/network reload\n\n# /tmp kleiner machen\nmount -t tmpfs -o remount,size=15M tmpfs /tmp\n</code></pre>\n<p>Als einziges zusätzlichen Paket habe ich mir das <code>luci-app-commands</code> geholt. Damit lassen sich einfach bestimmte commandos ausführen - auch über Web Requests. Was neustarts später mal einfacher macht.</p>"},{"url":"/posts/endlich-ein-python-formatter/","relativePath":"posts/endlich-ein-python-formatter.md","relativeDir":"posts","base":"endlich-ein-python-formatter.md","name":"endlich-ein-python-formatter","frontmatter":{"title":"Endlich ein python formatter","date":"2021-07-14T20:33:33.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"Format on save für python von vscode","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"20min","excerpt":"nach so langer Zeit funktioniert das \"Format on Save\" endlich auch in python","canonical_url":""},"html":"<p><a href=\"https://dev.to/adamlombard/how-to-use-the-black-python-code-formatter-in-vscode-3lo0\">Grundsätzliche Einstellungen</a> im vscode:</p>\n<pre><code>pip install black\n</code></pre>\n<p>Allerdings kann dann folgendes Problem auftreten:</p>\n<blockquote>\n<p>No module named 'regex._regex'; 'regex' is not a package</p>\n</blockquote>\n<p>Nach einer <a href=\"https://github.com/psf/black/issues/1207\">Google Suche</a> bekommen wir das:</p>\n<pre><code>pip install black --no-binary=regex\n</code></pre>\n<p>was zu folgendem Problem führt:</p>\n<blockquote>\n<p>ImportError: cannot import name '_ast3' from 'typed_ast'</p>\n</blockquote>\n<p>Was uns zu <a href=\"https://stackoverflow.com/questions/59343656/problem-with-using-black-code-formatter-cant-import-ast3\">dieser Beschreibung </a>bringt.</p>\n<p><strong>tl;dr</strong> Finaler install string für black damits auch im vscode funktioniert:</p>\n<pre><code>pip install --force-reinstall --upgrade typed-ast black --no-binary=regex\n</code></pre>"},{"url":"/posts/esphome-gerat-nicht-mehr-verfugbar/","relativePath":"posts/esphome-gerat-nicht-mehr-verfugbar.md","relativeDir":"posts","base":"esphome-gerat-nicht-mehr-verfugbar.md","name":"esphome-gerat-nicht-mehr-verfugbar","frontmatter":{"title":"esphome Gerät nicht mehr verfügbar","date":"2020-11-05T12:01:22.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"und weg war sie..","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"5min","excerpt":"Etwas gehacke im storage von Home-Assistant führt in dem Fall auch zum Ziel.","canonical_url":""},"html":"<p>Aus noch unbekannten Gründen hat sich eine mit ESPHome installierte Steckdose still und heimlich aus dem Home-Assistant entfernt.</p>\n<p>Während die einzelnen Entitäten noch vorhanden und als getrennt und nicht löschbar waren, fehlte das Device in der Integrationsliste (gosund-sp111-3 fehlt klarerweise.</p>\n<p><img src=\"https://lh3.googleusercontent.com/-8awQnJ3Xfig/X6PjgGw_NrI/AAAAAAAAYwY/Gob5mtEeaWgJIez-TgTF3NNCyRWBVCZywCK8BGAsYHg/s407/2020-11-05.png\" alt=\"\"></p>\n<p>Sowohl avahi-browse, mein Netzwerk Router als auch der Webserver direkt auf der Steckdose sind jedoch verfügbar.</p>\n<p><img src=\"https://lh3.googleusercontent.com/-NBPgvWVQR5E/X6PjOxJW40I/AAAAAAAAYwM/_5G3dZ_D2VwoLdIIAF9kSRax_39RGB4GwCK8BGAsYHg/s512/2020-11-05.png\" alt=\"\"></p>\n<p>Lösung:</p>\n<p>im Verzeichnis home-assistant/config/.storage</p>\n<p>liegen mehrere esphome.* Dateien. Einfach per grep die passenden nehmen, entfernen (oder wegschieben) und home-assistant neu starten. Danach kann das device wieder wie gewohnt hinzugefügt werden - und da die entites nicht gelöscht wurden, bleibt der zuvor vergebene Friendly Name im HA auch erhalten.</p>"},{"url":"/posts/leds-am-raspberry-abschalten/","relativePath":"posts/leds-am-raspberry-abschalten.md","relativeDir":"posts","base":"leds-am-raspberry-abschalten.md","name":"leds-am-raspberry-abschalten","frontmatter":{"title":"LEDs am Raspberry abschalten","date":"2020-12-09T21:48:13.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"rpi going dark.","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"10m","excerpt":"Leds abschalten, Strom sparen und die Lichtverschmutzung in den eigenen vier Wänden etwas senken.","canonical_url":""},"html":"<h2>Licht aus</h2>\n<p>Um dem Raspi das Licht auszumachen gibt es grob zwei (software-technische) Möglichkeiten:</p>\n<p>über die <strong>config.txt</strong> oder über die <strong>shell</strong>.</p>\n<h3>config.txt</h3>\n<p>funktioniert in den meisten fällen - bitte beachten, dass rpi4 und rpi0 etwas andere Werte verlangen.</p>\n<pre><code># Disable the PWR LED.\ndtparam=pwr_led_trigger=none\ndtparam=pwr_led_activelow=off\n\n# Disable the ACT LED.\ndtparam=act_led_trigger=none\ndtparam=act_led_activelow=off\n\ndtoverlay=act-led,activelow=off\n# deprecated\n# dtoverlay=pi3-act-led,activelow=off\n \n[pi0]\ndtparam=act_led_trigger=none\ndtparam=act_led_activelow=on\n\n[pi3]\n# Disable the LAN LED.\ndtparam=eth_led0=14\ndtparam=eth_led1=14\n\n[pi4]\n# Disable the LAN LED.\ndtparam=eth_led0=4\ndtparam=eth_led1=4\n</code></pre>\n<h3>shell</h3>\n<p>Einer meiner Raspberrys (berryboot+Volumio auf rpi3b) wollte das so nicht hinnehmen - daher musste ein anderer Weg gegangen werden:</p>\n<pre><code>[Unit]\nDescription=Disable leds\nAfter=network-online.target\n\n[Service]\nType=oneshot\nExecStart=/bin/sh -c '/bin/echo \"none\" > /sys/class/leds/led0/trigger'\nExecStart=/bin/sh -c '/bin/echo \"0\" > /sys/class/leds/led0/brightness'\nExecStart=/bin/sh -c '/bin/echo \"none\" > /sys/class/leds/led1/trigger'\nExecStart=/bin/sh -c '/bin/echo \"0\" > /sys/class/leds/led1/brightness'\nUser=root\nGroup=root\n\n[Install]\nWantedBy=multi-user.target\n</code></pre>\n<h4>installieren mit</h4>\n<pre><code>cp ledsoff.service /etc/systemd/system/\nsystemctl enable ledsoff\nsystemctl start ledsoff\n</code></pre>\n<p>weiterführende Links:</p>\n<p><a href=\"https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README#L94\" title=\"https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README#L94\">https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README#L94</a></p>\n<p><a href=\"https://gist.github.com/h4de5/6011243740ba7ab9ddf36a3f0f1b3aef\" title=\"https://gist.github.com/h4de5/6011243740ba7ab9ddf36a3f0f1b3aef\">https://gist.github.com/h4de5/6011243740ba7ab9ddf36a3f0f1b3aef</a></p>"},{"url":"/posts/miflora-clone-uber-esphome-in-den-homeassistant-bringen/","relativePath":"posts/miflora-clone-uber-esphome-in-den-homeassistant-bringen.md","relativeDir":"posts","base":"miflora-clone-uber-esphome-in-den-homeassistant-bringen.md","name":"miflora-clone-uber-esphome-in-den-homeassistant-bringen","frontmatter":{"title":"MiFlora Clone über esphome in den HomeAssistant bringen","date":"2021-11-01T00:37:42.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"Der grüne Daumen wächst schon langsam","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"2h","excerpt":"Über einige Umwege werden die Daten nun regelmäßig im HomeAssistant angezeigt.","canonical_url":""},"html":"<p>Da die Beregnungsstrategie (wenn: es gerade nicht regnet, dann: Beregnung einschalten) etwas zu wünschen überlässt, soll in der kommenden Saison das Hochbeet etwas besser überwacht werden. Dafür hab ich mir folgendes Ding gekauft:</p>\n<p><a href=\"https://smile.amazon.de/gp/product/B08KDW3ZL5\" title=\"VegTrug Grow Care Garden\">https://smile.amazon.de/gp/product/B08KDW3ZL5</a></p>\n<p>Vergleichbar ist die Hardware mit den bekannten Mi Flora Geräten von Xiaomi. Diese Ausführung ist nur etwas größer und hoffentlich besser für draußen geeignet.</p>\n<p>Um das ganze in den HomeAssistant zu integrieren gibts mehrere Möglichkeiten:</p>\n<h3>Version #1: python package in docker am raspi</h3>\n<p>Klingt weit hergeholt, aber hörte sich ganz ok an.</p>\n<p>Also mal den Deckel von dem Teil abgemacht und via USB versorgt. Das lädt dein eingebauten Akku und sorgt dafür, dass permanent Datenupdates geschickt werden.</p>\n<p>Dann schaun ob man das Gerät überhaupt per bluetooth findet:</p>\n<pre><code>sudo hcitool -i hci0 lescan\n</code></pre>\n<blockquote>\n<p>LE Scan ...</p>\n<p>6B:xxxx (unknown)</p>\n<p>C4:xxxx (unknown)</p>\n<p>C4:xxxx <strong>Grow care garden</strong></p>\n<p>6B:xxxx (unknown)</p>\n</blockquote>\n<p>Wir haben ein Bingo! Soweit sogut.</p>\n<p>Das python Package unterstützt sowohl mehrere Bluetooth backends zur Kommunikation mit den Trackern, als auch unterschiedliche Devices selbst darunter auch das von mir gekaufte Teil: <a href=\"https://github.com/basnijholt/miflora\" title=\"python package: miflora\">https://github.com/basnijholt/miflora</a></p>\n<p>Passend dazu gibts einen netten Docker build der alles installiert und die Daten praktischerweise per MQTT weiterleitet und das auch noch passend für unterschiedliche End-Systeme: <a href=\"https://github.com/ThomDietrich/miflora-mqtt-daemon\" title=\"Docker build + MQTT Bridge\">https://github.com/ThomDietrich/miflora-mqtt-daemon</a></p>\n<p>Hier ein kleines <em>docker-compose.yaml</em> um den Start zu vereinfachen:</p>\n<pre><code>version: \"3.3\"\n\nservices:\n  miflora:\n    image: miflora-mqtt-daemon\n    container_name: miflora\n    environment:\n      - TZ=Europe/Vienna\n    network_mode:\n      host\n    volumes:\n      - ./config:/config\n</code></pre>\n<p>eine passende Config (siehe config.ini.dist im github repo) mit der MAC Adresse aus dem lescan im ./config Verzeichnis vorrausgesetzt und der Container sollte schon Verbindung mit dem Tracker aufnehmen und mehrere Sensoren im HomeAssistant anlegen.</p>\n<p>Problem: natürlich funktionierts nicht. Die Entities im HA wurden zwar angelegt - aber Daten kommen keine durch. Schon macht sich Mistrauen breit .. und deshalb wird doch nochmal der offizielle Weg ausprobiert.</p>\n<p>D.h. App installieren, Konto anlegen, Koordinaten freigeben, Gerät koppeln etc.. Allerdings scheiterts hier bereits an Ersterem: die offizielle Flower Care App laut Anleitung und Amazon Beschreibung gibts nicht mehr. Man kann sie nur noch über gängige APK Mirror holen zbsp. <a href=\"https://flower-care.de.aptoide.com/app\" title=\"Flower Care App\">https://flower-care.de.aptoide.com/app</a></p>\n<p>Der Rest geht dafür ganz normal. D.h. auf dem Handy sehe ich alle Daten - sogar in Echtzeit und auf mehrere Meter entfernt.</p>\n<p>Nach einigen herum probieren und Gerät an und ausstecken bin ich auf folgendes gestoßen:</p>\n<p><strong>Der Container und das python package liefern richtige Daten nur dann, wenn das Gerät direkt mit USB Strom versorgt wird.</strong></p>\n<p>Ziemlicher Dämpfer da das Teil ja für draußen gedacht wäre.</p>\n<p>Und ja: ich hab einiges versucht. der lescan liefert durchgehende ein Signal (mit und ohne USB Strom) auch die App liefert ungeachtet weiter Daten. Nur das python package eben nicht.</p>\n<h3>Versuch #2: esphome mit bluetooth LE tracker</h3>\n<p>Der nächste Versuch wäre ohnehin als Endfassung geplant gewesen, dachte aber es wäre schwieriger Umzusetzen..</p>\n<p>ESPHOME unterstützt dieses Gerät ebenfalls unter folgender Platform: <a href=\"https://esphome.io/components/sensor/xiaomi_ble.html?highlight=miflora#gcls002\" title=\"ESPHOME GCLS002\">https://esphome.io/components/sensor/xiaomi_ble.html?highlight=miflora#gcls002</a></p>\n<p>Beispiel (Teil-)Config:</p>\n<pre><code>sensor:\n  - platform: xiaomi_gcls002\n    mac_address: \"94:xxxx\"\n    temperature:\n      name: \"GCLS02 Temperature\"\n    moisture:\n      name: \"GCLS02 Moisture\"\n    conductivity:\n      name: \"GCLS02 Soil Conductivity\"\n    illuminance:\n      name: \"GCLS02 Illuminance\"\n</code></pre>\n<p>Zum Glück hab ich noch einen hiervon übrig: <a href=\"https://smile.amazon.de/gp/product/B074RGW2VQ/\" title=\"ESP32 von AZDelivery\">https://smile.amazon.de/gp/product/B074RGW2VQ/</a></p>\n<p>Die Config des Boards hab ich nach einigen Versuchen auch rausgefunden:</p>\n<p><a href=\"https://docs.platformio.org/en/latest/boards/espressif32/az-delivery-devkit-v4.html#board-espressif32-az-delivery-devkit-v4\" title=\"az-delivery-devkit-v4\">https://docs.platformio.org/en/latest/boards/espressif32/az-delivery-devkit-v4.html#board-espressif32-az-delivery-devkit-v4</a></p>\n<pre><code>esphome:\n  name: $devicename\n  platform: esp32\n  board: az-delivery-devkit-v4\n</code></pre>\n<p>Vollständige ESPHome Config zur Verbindung mit dem Mi Flora Clone Gerät:</p>\n<p><a href=\"https://github.com/h4de5/esphome-configs/blob/master/config/esp32_1.yaml\" title=\"Beispiel ESPHome Config\">https://github.com/h4de5/esphome-configs/blob/master/config/esp32.yaml</a></p>\n<h3>Lösung</h3>\n<p>und nun? Eigentlich ganz einfach.</p>\n<ul>\n<li>\n<p>Docker am Raspberry (oder auf einem anderen Linux Gerät auf das man physischen Zugriff hat) einrichten.</p>\n</li>\n<li>\n<p>den ESP32 per USB Kabel mit dem Docker Host verbinden</p>\n</li>\n<li>\n<p>einen Container aus dem docker-compose file im github repo oben erzeugen</p>\n</li>\n<li>\n<p>die MAC Adresse aus Versucht 1 zusammen mit der ESPHome config aus Versuch 2 einfach mal in den esphome Container geben</p>\n</li>\n<li>\n<p>und:</p>\n<p>esphome esp32.yaml compile\nesphome esp32.yaml upload</p>\n</li>\n</ul>\n<p>Das baut die neue firmware für des ESP32 zusammen. Beim Upload solltet Ihr gefragt werden, ob Ihr das Gerät Over-the-Air (OTA) oder über USB flashen wollt. Beim ersten Mal USB auswählen. Später kann man sie einfach per WLAN aktualisieren.</p>\n<p>Ja und das wars - sobald der ESP neugestartet hat, sollte die einzelnen Sensoren schon im HomeAssistant aufscheinen:</p>\n<p><img src=\"https://user-images.githubusercontent.com/6115324/139609489-7be658fb-d6a7-44b0-876e-9827e950f2e8.png\" alt=\"\"></p>\n<p>jaja.. es ist schon wieder finster.</p>\n<p>TODO: und was man noch so mit ESPHome und dem Bluetooth LE Device anstellen kann:</p>\n<p><a href=\"https://esphome.io/components/binary_sensor/ble_presence.html\" title=\"https://esphome.io/components/binary_sensor/ble_presence.html\">https://esphome.io/components/binary_sensor/ble_presence.html</a></p>"},{"url":"/posts/sprach-assistent-mit-rhasspy-und-home-assistant/","relativePath":"posts/sprach-assistent-mit-rhasspy-und-home-assistant.md","relativeDir":"posts","base":"sprach-assistent-mit-rhasspy-und-home-assistant.md","name":"sprach-assistent-mit-rhasspy-und-home-assistant","frontmatter":{"title":"Sprach Assistent mit rhasspy und Home-Assistant","date":"2020-11-28T23:17:02.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"5d","excerpt":"Kodi, Volumio, ein NAS und einige Mikrophone zusammen ergeben, irgendwann mal, einen richtigen Sprachassistenten.","canonical_url":""},"html":"<h2>Ziel</h2>\n<p>Ich hätte gern so ein Alexa / Google Assistant Ding - aber eben ohne diesen ganzen \"Jeder-Hört-mit\" Mist. Es müsst doch auch möglich sein, das ganze irgendwie selber zu hosten und dadurch selber zu verarbeiten.</p>\n<p>Einen aufgeborten Home-Assistant der mir alle Lichter, Jalousinen, einige Steckdosen, die Heizung und noch ein paar andere Dinge steuert, hätt ich ja schon. Es stehen auch schon einige RaspberryPis an strategisch günstigen Plätzen herum, die man doch für die Audio-Aufnahme verwenden könnte.</p>\n<p>Also, einfach ein paar Mikrophone (ReSpeaker, 3.5mm Tischmikro und USB Soundkartenstecker) kaufen, ein bisschen herumspielen und naja - wird scho irgendwie gehn. So schwer kanns ja nicht sein.</p>\n<h2>Grundlagen</h2>\n<p>Wie funktioniert so ein Sprachassistent überhaupt? Mir persönlich war das natürlich von Anfang an ganz klar. Auch würd ich keinem Leser hier unterstellen, dieses Wissen nicht inne zu haben - dennoch, schadet es vielleicht nicht an der Stelle einige Begriffe zu klären.</p>\n<p>Ein Vorgriff auf später: Das Programm Rhasspy bietet einen sehr schönen Überblick über die einzelnen Bereiche eines Sprachassistenten. Aus Mangelung eines besseren Beispiels werde ich mich einfach an diese Aufteilung halten.</p>\n<p>Also:</p>\n<ol>\n<li>der Sprachassistent beginnt gewissermaßen mit einem <strong>Audio-Input</strong> - d.h. das Programm bekommt entweder über ein Mikro oder über einen Stream Audiodaten zugeschickt.</li>\n<li>Diese Daten werden (falls so eingestellt) nach einem <strong>Wake-Word</strong> durchsucht. Also ein Wort oder eine Phrase wie zbsp. \"OK Google\" oder \"Alexa\" die dem Programm anzeigen, dass man etwas von Ihm will.</li>\n<li>Wenn ein Wake-Word gefunden wurde, startet ein neuer <strong>Dialog</strong>. Dieser bildet quasi eine Session oder so zu sagen ein Gespräch ab und kann auch mehrere Sätze zusammen halten.</li>\n<li>Der Audio-Input wird auch nach dem Wake-Word aufgezeichnet - nun startet die <strong>ASR</strong> (die Automatische Sprach eRkennung - <a href=\"https://www.awesomeaariv.com/asr-nlu-and-tts/03/17/2019/\" title=\"https://www.awesomeaariv.com/asr-nlu-and-tts/03/17/2019/\">https://www.awesomeaariv.com/asr-nlu-and-tts/03/17/2019/</a>) und der Input wird an die nächste Stelle weitergegeben: An <strong>Speech-to-Text (STT)</strong>. Dieser Dienst macht aus gesprochener Sprach eben lesbaren Text.</li>\n<li>Dann geht alles sehr schnell - eigentlich geht das überhaupt alles sehr schnell, wenn man bedenkt, was da hier sonst noch passiert. Der Text wird nach bestimmten Mustern analysiert. Dies geschieht optional mit <strong>NLU</strong> (Natürlichem Sprach Verständnis.. LU) oder einfach durch einen Abgleich von vordefinierten Sätzen und Variablen. Im Beispiel hier wird dies auch <strong>Intent Recognition</strong> genannt. Es wird also versucht zu verstehen, was der Benutzer durch den Satz erreichen will.</li>\n<li>Mit dem so gewonnen <strong>Intent</strong> wird über den Dialog geprüft, ob alle notwendigen Teile dieser Intention vorhanden sind. Bspw. sagt ein Benutzer nur \"Licht im Wohnzimmer\" könnte noch der Ziel-Zustand \"an\" oder \"aus\" fehlen. Ein optionales <strong>Dialog-Management</strong> kann fehlende Teile erfragen.</li>\n<li>Ist der Intent vollständig, wird er ans <strong>Intent Handling</strong> weitergegeben. An der Stelle wird dann aus der Intention eine Handlung gemacht. Im Falle von Home-Assistant, wird das Licht im Wohnzimmer ein- oder ausgeschaltet.</li>\n<li>Das Ergebnis vom Intent Handling ist meist eine Antwort in Textform. Bspw. \"Das Licht im Wohnzimmer ist nun aus\". Damit das Gespräch nicht eintönig wird, wird der Text mit <strong>Text-to-Speech (TTS)</strong> wieder in Sprache also eine .wav Datei umgewandelt.</li>\n<li>Diese wird dann zbsp über einen Lautsprecher ausgegeben - mit dem <strong>Audio Output</strong> endet der ganz Prozess</li>\n</ol>\n<p>Jetzt wo ich mir das Bild genauer ansehe, merke ich, dass die Nummer überhaupt nicht zusammenpassen .. aber naja. Das Bild is schön und bleibt jetzt hier.</p>\n<p><img src=\"https://rhasspy.readthedocs.io/en/latest/img/master-satellite/http-flow.png\" alt=\"Flow of messages in HTTP base station/satellite set up\"></p>\n<p>Was im Bild bereits angedeutet wird, ist, dass man die einzelnen Aufgaben auf mehrere Geräte aufteilen kann. Also einen (in diesem Beispiel) so genannten Satellit der nur für die Audio Ein- und Ausgabe zuständig ist und eine Basis, die die Verarbeitung und Umwandlung übernimmt.</p>\n<h2>Der Weg</h2>\n<p>Für HA gibt es Almond - angeblich kann das alles. Habs aber irgendwie nicht zum Laufen gebracht. Updates gibts dort eher selten und ich denke die deutsche Sprachuntersützung wird auch noch etwas länger auf sich warten lassen.</p>\n<p>Snips war angeblich sehr cool und hat für viele sehr gut funktioniert. Allerdings hat Sonos das Unternehmen gekauft und danach einfach die Entwicklung und einen notwendigen Einsprungspunkt fürs Anlernen neuer Intents eingestellt.</p>\n<p>HA bietet noch einige Integrationen für TTS, STT und Dialog Management - die meisten nutzen aber wieder nur externe Dienste (dialogflow nutzt Google, Alexa schickt zu Amazon, Watson zu IBM, und von Microsoft gibts auch noch was).</p>\n<p>Ich hab mich nun mit <strong>Rhasspy</strong> etwas - länger als gedacht - auseinandergesetzt und glaube, damit alles notwendige abgedeckt zu haben.</p>\n<h2>Lösung</h2>\n<p>Ein einfaches Beispiel wäre die Installation von Rhasspy auf einem Raspberry mit raspbian -da würde alles schön einfach laufen. Man bräuchte keine umständliche Konfiguration zwischen mehreren Geräten oder unterschiedlichen Systemen, man müsste sich nicht mit MQTT auseinander setzen und schon alleine das Testen wäre einfacher - kurz gesagt, ziemlich langweilig und es gibt schon genügend Anleitungen davon im Netz.</p>\n<p>In diesem Setup wird die Arbeit aufgeteilt.</p>\n<p>Die <strong>Basis</strong> (Base) ist zuständig für:</p>\n<ul>\n<li>STT</li>\n<li>Intent Recognition</li>\n<li>TTS</li>\n<li>Intent Handling</li>\n<li>Dialog Management</li>\n</ul>\n<p>Die <strong>Satelliten</strong> sind zuständig für:</p>\n<ul>\n<li>Audio Input</li>\n<li>Wake-Word Erkennung</li>\n<li>Audio Output</li>\n</ul>\n<p>Das Intent-Handling wird in diesem Setup an eine Home-Assistant Installation weitergereicht. Notwendige Einstellungen dafür finden sich noch weiter unten. Möglich wären hier auch andere Installationen wie zbsp. Node-Red.</p>\n<h3>Aufnahme auf RPI vorbereiten</h3>\n<p>Unter Umständen kann diese Punkt ausgelassen werden. Sollten jedoch Probleme bei der Aufnahme vorkommen (zbsp.: rhasspy hört nix), können folgende Punkte helfen:</p>\n<h4>asound.conf einrichten</h4>\n<pre><code>$ aplay -l\n**** List of PLAYBACK Hardware Devices ****\ncard 0: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 [HiFiBerry DAC+ HiFi pcm512x-hifi-0]\n  Subdevices: 1/1\n  Subdevice #0: subdevice #0\n\n$ arecord -l\n**** List of CAPTURE Hardware Devices ****\ncard 5: MIC [USB MIC], device 0: USB Audio [USB Audio]\n  Subdevices: 0/1\n  Subdevice #0: subdevice #0\n</code></pre>\n<p>Werte können natürlich abweichen je nachdem welche Hardware verwendet wird. So können hier auch mehrere Geräte aufgelistet werden. Wichtig hier ist jedenfalls nur, dass die <strong>Wiedergabe auf 0,0</strong> und die <strong>Aufnahme auf 5,0</strong> laufen soll.</p>\n<p>in der <strong>/etc/asound.conf</strong> schaut das dann so aus:</p>\n<pre><code>pcm.softvolume {\n    type             plug\n    slave.pcm       \"softvol\"\n}\n\npcm.softvol {\n    type            softvol\n    slave {\n        pcm         \"plughw:5,0\"\n    }\n    control {\n        name        \"SoftMaster\"\n        card        5\n        device      0\n    }\nmax_dB 0.0\nmin_dB -50.0\nresolution 100\n}\n\npcm.!default {\n  type asym\n  capture.pcm \"mic\"\n  playback.pcm \"speaker\"\n}\n\n# ab hier kommen die Änderungen hinzu\npcm.mic {\n  type plug\n  slave {\n    pcm \"hw:5,0\"\n  }\n}\npcm.speaker {\n  type plug\n  slave {\n    pcm \"hw:0,0\"\n  }\n}\n</code></pre>\n<p>(Bei Änderung der Datei empfiehlt es sich den Docker Container neuzustarten)</p>\n<h4>Lautstärke des Mikrophons erhöhen</h4>\n<p>Eventuell ist auch einfach die Lautstärke des Mikros zu gering - das kann durch den alsamixer gefixt werden:</p>\n<pre><code>alsamixer\n# F6 - richtiges device auswählen\n# F4 - auf Aufnahme stelleen\n# den gain erhöhen - je nach Gerät\n\n# einstellungen in /var/lib/alsa/asound.state für den nächsten Neustart speichern\nsudo alsactl store\n\n# oder in eine andere datei\n# alsactl --file ~/.config/asound.state store\n</code></pre>\n<p>(Änderungen hiermit sollten direkt im laufenden Betrieb ersichtlicht sein.)</p>\n<h3>docker installieren</h3>\n<p>Rhasspy gibts als Docker image:</p>\n<p><a href=\"https://hub.docker.com/r/rhasspy/rhasspy\" title=\"https://hub.docker.com/r/rhasspy/rhasspy\">https://hub.docker.com/r/rhasspy/rhasspy</a></p>\n<p>Auf den meisten Satelliten läuft bei mir Volumio (<a href=\"https://volumio.org/\" title=\"Volumio\">https://volumio.org/</a>). Eine Art Jukebox mit Web Oberfläche. Die Distribution basiert hier auf einem Debian. Zusätzlich steht im Wohnzimmer noch ein Raspi mit Kodi zum Film abspielen. Dort läuft ein Libreelec, dass deutlich eingeschränkter mit der Installation neuer Software umgeht.</p>\n<p>Je nach Betriebssystem wird Docker unterschiedlich installiert. Am besten einfach im Internet suchen, falls hier jemand eine andere Distribution verwendet.</p>\n<p>Für Volumio (Standard Docker Installation):</p>\n<pre><code>curl -fsSL https://get.docker.com -o get-docker.sh\nsudo sh get-docker.sh\nsudo usermod -aG docker volumio\nsudo pip3 install docker-compose\n</code></pre>\n<p>Für Kodi (über Docker Addon):</p>\n<ul>\n<li>\n<p>Über ein eigenes Addon-Repository (<strong>TODO</strong>: Anleitung suchen)</p>\n</li>\n<li>\n<p>docker-compose installieren:</p>\n<pre><code>binary suchen\n</code></pre>\n</li>\n</ul>\n<p>Die <strong>Base</strong> läuft auf einem etwas stärkeren Synology NAS.</p>\n<ul>\n<li>Docker über Synology Pakage Manager installiern</li>\n<li>docker compose installieren</li>\n</ul>\n<p><img src=\"/images/synology-docker-pakage.JPG\" alt=\"Screenshot Synology\" title=\"Synology Docker Package\"></p>\n<h4>docker starten</h4>\n<p>Den Rhasspy Service startet man am besten über eine <strong>docker-compose.yml</strong> Datei:</p>\n<pre><code>version: \"3\"\nservices:\n  rhasspy:\n    image: \"rhasspy/rhasspy\"\n    container_name: rhasspy\n    restart: unless-stopped\n    volumes:\n      - \"./config:/profiles\"\n      - \"/etc/localtime:/etc/localtime:ro\"\n    ports:\n      - 12101:12101\n      # MQTT Broker - see: https://rhasspy.readthedocs.io/en/latest/installation/\n      - 12183:12183\n    # in meinem Fall gibts am server keinen sound\n    # devices:\n    #   - \"/dev/snd:/dev/snd\"\n    command: --user-profiles /profiles --profile de\n    sysctls:\n      - net.ipv6.conf.all.disable_ipv6=1\n  marytts:\n    image: synesthesiam/marytts:5.2\n    container_name: marytts\n    # dieses verzeichnis muss erst richtig vorbereitet werden\n    volumes:\n      - \"./marytts-config/lib:/marytts/lib\"\n    ports:\n      - 59125:59125\n    restart: unless-stopped\n    tty: true\n    sysctls:\n      - net.ipv6.conf.all.disable_ipv6=1\n</code></pre>\n<p>docker-compose.yml Datei für Satelliten.</p>\n<pre><code>version: \"3\"\n\nservices:\n  rhasspy:\n    image: \"rhasspy/rhasspy\"\n    container_name: rhasspy\n    restart: unless-stopped\n\tipc: host\n    volumes:\n      - \"./config:/profiles\"\n      - \"/etc/localtime:/etc/localtime:ro\"\n      - \"/etc/asound.conf:/etc/asound.conf:ro\"\n    ports:\n      - 12101:12101\n    devices:\n      - \"/dev/snd:/dev/snd\"\n    command: --user-profiles /profiles --profile de\n</code></pre>\n<p>die wichtigsten <strong>docker-compose</strong> Befehle:</p>\n<pre><code># starten\ndocker-compose up -d\n# stoppen\ndocker-compose down\n# updaten\ndocker-compose pull \ndocker-compose up -d\n</code></pre>\n<h4>RaspberryPi zero</h4>\n<p>Falls jemand das ganze erfolglos auf dem <strong>raspberry pi zero</strong> (rpi0) versucht - auch hier lohnt sich das lesen des verfluchten manuals (RTFM):</p>\n<p><a href=\"https://rhasspy.readthedocs.io/en/latest/installation/\" title=\"https://rhasspy.readthedocs.io/en/latest/installation/\">https://rhasspy.readthedocs.io/en/latest/installation/</a></p>\n<pre><code>sudo sh -c 'echo { \\\"experimental\\\": true } > /etc/docker/daemon.json'\nsudo systemctl restart docker\ndocker pull --platform linux/arm/v6 rhasspy/rhasspy\n</code></pre>\n<p>Für den rpi0 hab ich kein docker-compose binary gefunden - in dem Fall kann man den Container auch so starten:</p>\n<pre><code>docker run -d -p 12101:12101 \\\n  --name rhasspy \\\n  --restart unless-stopped \\\n  -v \"${PWD}/config:/profiles\" \\\n  -v \"/etc/localtime:/etc/localtime:ro\" \\\n  -v \"/etc/asound.conf:/etc/asound.conf:ro\" \\\n  --device /dev/snd:/dev/snd \\\n  --ipc host \\\n  rhasspy/rhasspy \\\n  --user-profiles /profiles \\\n  --profile de\n</code></pre>\n<p>ACHTUNG: Einfach starten ist nicht - geht nicht. Die verlinkten Verzeichnisse (<strong>config</strong> und <strong>marytts-config</strong> am Server) müssen erst erzeugt bzw. vorbereitet werden.</p>\n<p>Also sucht euch zuerst einen Ort an dem Ihr diese Verzeichnisse erstellt bzw. docker-compose.yml Dateien ablegt . Beachtet dabei, dass diese Verzeichnisse alle Einstellungen enthalten - wäre also gut, wenn diese leicht zu sichern sind. Außerdem beachtet, dass die rhasspy Konfiguration (je nach eingesetzten Systemen) schnell mehrere <strong>hundert Megabyte</strong> ausmacht. Die MaryTTS Sprach-Modelle schlagen unter Umständen auch gleich mit mehr als einem Gigabyte zu.</p>\n<pre><code>mkdir config\nmkdir marytts-config # am server\n</code></pre>\n<h4>marty-tts vorbereiten</h4>\n<p>Der marty-tts Container kommt bereits mit einigen Sprachen vorinstalliert. Für Deutsch gibt es noch ein etwas weniger nach Computer klingendes Sprachmodell.</p>\n<pre><code># TODO - gzunip befehl hinzufügen\nwget 'https://github.com/marytts/voice-dfki-pavoque-styles/releases/download/v5.2/voice-dfki-pavoque-styles-5.2.zip'\nwget 'https://github.com/marytts/voice-dfki-pavoque-neutral-hsmm/releases/download/v5.2/voice-dfki-pavoque-neutral-hsmm-5.2.zip'\nwget 'https://github.com/marytts/voice-dfki-pavoque-neutral/releases/download/v5.2/voice-dfki-pavoque-neutral-5.2.zip'\nwget 'https://github.com/marytts/marytts/releases/download/v5.2/marytts-5.2.zip'\n</code></pre>\n<p>Wer auf das vorerst verzichten will, kann das Volume beim marytts container einfach mal weglassen.</p>\n<p>Daran hängen einfach ein Paar Lautsprecher (teilweise über USB, USB Soundkarten+Klinke oder über HATs wbsp. hifiberry/phat dac). Für den Sprach Assistanten sind nun noch verschiedene Mikrophone im Einsatz (Klinke, USB oder ein ReSpeaker Array).</p>\n<p>Damit wärn die groben Sachen mal vorbereitet. Nun gehts weiter mit Rhasspy und Home-Assistant.</p>\n<h3>Rhasspy konfigurieren</h3>\n<p><img src=\"https://user-images.githubusercontent.com/6115324/106373041-040a3280-6376-11eb-9b90-f665e59450f2.png\" alt=\"\" title=\"Basis Konfiguration\"></p>\n<p>und an einem Satelliten:</p>\n<p><img src=\"https://user-images.githubusercontent.com/6115324/106373022-dde49280-6375-11eb-9f3f-cf227759a74f.png\" alt=\"\" title=\"Satellit Konfiguration\"></p>\n<p>(<strong>TODO</strong>: am Satellite sollte natürlich arecord bei der Mikrophon Einstellung stehen. Hermes macht dort keinen Sinn.(</p>\n<p>Inzwischen bin ich auf \"nicht mehr ganz offline\" umgestiegen - da die Sprachausgabe von Google's <strong>WaveNet</strong> doch deutlich besser ist, als die Alternativen.</p>\n<p>Wichtig bei de Einstellungen: ich verwende MQTT um Nachrichten zwischen den Systemen auszutauschen. Als <strong>MQTT Server</strong> dient die Basis selbst - daher wird der <strong>port 12183</strong> im Basis Docker Container freigegeben. Bei den Satelliten wird einfach die IP der Basis + dieser Port angegeben und schon kann bei den restlichen Systemen \"Hermes\" als Protokoll angegeben werden.</p>\n<p>In den Feldern mit dem Namen <strong>Satellite siteIds</strong> in der Basis gehören alle Namen der Rhasspy Satelliten und ein Eintrag für den homeassistant selbst, mit Beistrich getrennt. Warum wird später erklärt.</p>\n<p>in der sentences.ini werden die zu erkennenden Sätze hinterlegt und sogenannte slots ausgewertet:</p>\n<pre><code>; in eckiger Klammer stehen die intents\n; darunter alle sätze die diesen auslösen können\n; es gibt [optional] (alter|nativen) und [(optionale|alternativen)]\n; mit XX= kann man sich alternativen/listen in variablen schreiben\n; und später mit &#x3C;XX> darauf zugreifen\n; mit {parameter:fixer wert} können werte an den Intent übergeben werden\n; und mit ($slotname) greift man auf die optionen in den slots zu\n; \n\n[GetTime]\nwie spät ist es [(jetzt|momentan|gerade|aktuell|eigentlich)]\n\n[Entities]\n; slots für lichter, schalter\n; was geht hier ab?\n; in &#x3C;light_names> stehen danach alle lichter namen\n; findet das intent recognition dann einen passenden satz wo dieser licht name vorkommt\n; wird dieser name in die variable {entity_name} geschrieben, und zusammen mit den anderen parametern\n; an den intent handler weiter gegeben\nlight_names = ($light_names){entity_name} (:){domain:light} (:){domain_name:Licht} (:){domain_article:das}\nswitch_names = ($switch_names){entity_name} (:){domain:switch} (:){domain_name:Schalter} (:){domain_article:der}\n; slot für stock werke\nareas = ($areas) {area}\n; slot für schalter aktionen \nswitch_actions = ($switch_actions)\n\n[SwitchControl]\n; dreh das licht im büro unten um\n; dreh das büro licht unten um\n; dreh im büro unten das licht um\n(dreh|drah|schalte|schalt) [bitte] ((das|des) Licht (im|beim|vom|in der) &#x3C;Entities.light_names> [&#x3C;Entities.areas>]|(das|des) &#x3C;Entities.light_names> Licht [&#x3C;Entities.areas>]|(im|beim|vom|in der) &#x3C;Entities.light_names> [&#x3C;Entities.areas>] (das|des) Licht|den Schalter (im|beim|vom|in der) &#x3C;Entities.switch_names> [&#x3C;Entities.areas>]|den &#x3C;Entities.switch_names> Schalter [&#x3C;Entities.areas>]|(im|beim|vom|in der) &#x3C;Entities.switch_names> [&#x3C;Entities.areas>] den Schalter) &#x3C;Entities.switch_actions>\n</code></pre>\n<p>Die Slots werden in eigenen Dateien im slots abgelegt:</p>\n<pre><code>; Datei: slots/areas\n\n(Draußen:im Aussenbereich):Aussenbereich\n(ganz unten|im Keller|im Untergeschoss):Untergeschoss\n(ganz oben|am Dach):Dach\n(oben|im Ersten Stock|im Obergeschoß):(Erster Stock)\n(unten|im Erdgeschoß):Erdgeschoss\n\n\n; Datei: slots/switch_actions\n\n(ein|auf|an):(ein) (:){action:turn_on} (:){action_name:ein}\n(aus|ab|ob):(aus) (:){action:turn_off} (:){action_name:aus}\num (:){action:toggle} (:){action_name:um}\n\n\n; Datei: slots/light_names\n\nWohnzimmer\nTerrasse\n(Bad|Badezimmer):(Bad)\n(Wc|Klo):WC\nBüro\nGarage\n(Bad Dusche|Dusche|Bad hinten):(Bad Dusche)\nDachboden\nGarderobe\nSchlafzimmer\nKüche\nEsstisch\n(Flur|Vorraum|Gang):(Flur)\n\n\n; Datei: slots/switch_names\n\nSteckdose Drucker\nSteckdose Media Player\nSteckdose Fernseher\nBad Heizkörper\n(Christbaum|Christbaum Steckdose|Weihnachtsbaum):(Christbaum Schalter)\n</code></pre>\n<p>Mit diesen Dateien und Einstellungen kann man schon das mal versuchen den Intent-Recognizer zu trainieren - dazu rechts oben einfach auf \"train\" klicken und warten.</p>\n<p>Abhängig von der CPU und der Anzahl der Sätze kann dies zwischen 10 Sekunden und 5 Minuten dauern.</p>\n<p>Jetzt fragt man sich: Muss das wirklich so kompliziert sein? Nein - es ginge auch viel einfacher - dann wärs aber nicht so genial - und niemand würde was dabei lernen..</p>\n<p>und ja - ich habs schon vereinfacht..</p>\n<h3>Home-Assistant konfigurieren</h3>\n<p>Ich setze jetzt einfach mal voraus, dass schon ein <a href=\"https://www.home-assistant.io\" title=\"home-assistant\">home-assistant</a> ohne Probleme läuft und wir nur noch die Sprach-Erkennung einrichten müssen.</p>\n<p>Durch einen Klick auf euer Bild im links unten - kommt ihr zu den Einstellungen um ein \"Langlebiges Zugangs-Token\" zu erstellen - dieses tragt ihr noch bei der Basis zusammen mit der Option \"<strong>send intents</strong>\" unter Intent Handling ein.</p>\n<p>In der <em>configuration.yaml</em> passieren nun einige wirklich geniale Sachen - wenn ich mal Zeit hab, erklär ichs vielleicht...</p>\n<pre><code># wir verbinden uns zum MQTT server der Rhasspy Basis\nmqtt:\n  broker: base\n  port: 12183\n  \n# generelles intent handling aktivieren\nintent:\n\n# ich lege hier mal zwei intents also zwei \"absichten\" an\nintent_script:\n\n  # hier einen ganz einfachen - der die Zeit zurück gibt\n  GetTime:\n    speech:\n      text: Es ist jetzt {{ as_timestamp (now()) | timestamp_custom('%H') }} Uhr {{ as_timestamp (now()) | timestamp_custom('%M') | regex_replace('^0+', '') }}\n\n  # und dann den \"Alles schalter\"\n  # abhängig von den übergebenen Werten kann der\n  # alles ein/aus/um schalten\n  SwitchControl:\n    speech:\n      text: '{{ domain_article }} {{ entity_name }} {{ domain_name }} {{ area }} wird nun {{ action_name }}geschaltet.'\n    async_action: true\n    action:\n      - service: 'script.assistant_find_entity'\n        data:\n          domain: '{{ domain }}'\n          domain_name: '{{ domain_name }}'\n          action: '{{ domain }}.{{ action }}'\n          action_name: '{{ action_name }}'\n          entity_name: '{{ entity_name }}'\n          area: '{{ area }}'\n          \n  # der hier wird nur als durchschleifer benutzt\n  # er nimmt den übergebenen satz, publiziert ihn über MQTT\n  # und lässt rhasspy die auswertung machen.\n  # Als Absender (siteId) wird der Name \"assistant\" gewählt\n  # dadurch agiert der home-assistant als eigener Satellit. \n  # dies soll verhindern, dass andere Satelliten die Antwort bekommen.\n    AskRhasspy:\n    speech:\n      text: >-\n        {%- if state_attr('sensor.assistent_nachricht_ok', 'text') and states.sensor.assistent_nachricht_ok.last_updated > states.sensor.assistent_nachricht_nicht_verstanden.last_updated -%}\n          OK {{ state_attr('sensor.assistent_nachricht_ok', 'text') }}\n        {%- elif state_attr('sensor.assistent_nachricht_nicht_verstanden', 'input') and states.sensor.assistent_nachricht_ok.last_updated &#x3C; states.sensor.assistent_nachricht_nicht_verstanden.last_updated -%}\n          NOK Das habe ich nicht verstanden\n        {%- endif %}\n    async_action: false\n    action:\n      - service: 'mqtt.publish'\n        data:\n          topic: hermes/nlu/query\n          payload_template: '{\"input\": \"{{ question }}\", \"siteId\": \"assistant\"}'\n      - wait_template: ''\n        timeout: '0:00:03'\n\n# das conversations wird benutzt um direkt mit dem HA chatten zu können\n# siehe Mikrophon Knopf oben rechts\nconversation:\n  # normalerweise müssten wir hier alle erlaubten Sätze nochmal eingeben\n  # aber wir sind faul und schicken einfach alles zum Rhasspy durchschleifer\n  AskRhasspy:\n    - '{question}'\n \n # hangouts bzw. auch andere chatbots erlauben das entgegennehmen von intents\nhangouts:\n  intents:\n    # auch hier nur unser durchschleifer..\n    AskRhasspy:\n      sentences:\n        - '{question}'\n      conversations:\n        - id: !secret hangout_andreas\n    \n# da meine lichter/schalter namen, oft unterschiedlich zu den entity-Ids der lichter sind,\n# benötigt es hier ein etwas umständliches matching.\n# im grunde wird nach entites mit dem entsprechenden namen gesucht\n# und die entity-ids werden ans nächste script weiter gegeben.\nscript:\n  assistant_find_entity:\n    alias: Assistent - Entity finden\n    icon: mdi:auto-fix\n    sequence:\n      - service: script.assistant_execute_service\n        data_template:\n          service_name: \"\n            {%- if action != '' -%}\n            {{ action }}\n            {%- else -%}\n            {%- set entity_name = script_name | trim -%}\n            {%- for entity in states['script'] -%}\n            {%- set entity_id_parts = entity.entity_id.split('.') -%}\n            {%- set friendlyname = entity.attributes.friendly_name -%}\n            {%- set friendlyname = friendlyname | regex_replace(find='- |: ', replace='', ignorecase=True) | trim -%}\n            {%- if friendlyname | regex_search(find=entity_name, ignorecase=True) != 0 -%}\n            {{ entity.entity_id }}\n            {%- endif -%}\n            {%- endfor -%}\n            {%- endif -%}\"\n          entity_id: \"\n            {%- set entity_name = entity_name | trim -%}\n            {%- for entity in states[domain] -%}\n            {%- set entity_id_parts = entity.entity_id.split('.') -%}\n            {%- set friendlyname = entity.attributes.friendly_name -%}\n            {%- set friendlyname = friendlyname | regex_replace(find='Licht|Dimmer', replace='', ignorecase=True) | trim -%}\n            {%- set friendlyname = friendlyname | regex_replace(find='- |: ', replace='', ignorecase=True) | trim -%}\n            {%- set friendlyname = friendlyname | regex_replace(find='[0-9]+$', replace='', ignorecase=True) | trim -%}\n            {%- if area == '' -%}\n            {%- set friendlyname = friendlyname | regex_replace(find='Aussenbereich|Erdgeschoss|Erster Stock|Untergeschoss|Dach', replace='', ignorecase=True) | trim -%}\n            {%- else -%}\n            {%- set area = area + ' ' -%}\n            {%- endif -%}\n            {%- if friendlyname | regex_search(find='^'+area+entity_name+'$', ignorecase=True) != 0 -%}\n            {{- entity.entity_id -}},\n            {%- endif -%}\n            {%- endfor -%}\"\n    mode: single\n  assistant_execute_service:\n    alias: Assistent - Dienst Ausführen\n    icon: mdi:auto-fix\n    sequence:\n      - service: \"{{ service_name | regex_replace(find=',$', replace='', ignorecase=True) | trim }}\"\n        data_template:\n          entity_id: \"{{ entity_id | regex_replace(find=',$', replace='', ignorecase=True) }}\"\n    mode: parallel\n    max: 10\n    \n\n# jetzt fehlt nur noch eines, damit die ganze sache rund läuft.\n# denn wir können über den hangouts bot mit dem Home-Assistant kommunizieren\n# in dem wir die nachricht direkt weiter an rhasspy schicken.\n# Die Antwort bleibt allerdings einfach am MQTT broker hängen.\n# daher greifen wir uns diese nachrichten erstmal in einem sensor ab\n# ausgelesen wird diese dann im intent > speech - daher dort die verzögerung um 3 sekundn.\nsensor:\n  # wenn alles gut geht\n  - platform: mqtt\n    # sensor.assistent_nachricht_ok\n    name: 'Assistent Nachricht ok'\n    state_topic: 'hermes/tts/say'\n    value_template: >\n      {% if value_json is defined and value_json.siteId == 'assistant' %}\n        {{ value_json.text }}\n      {% else %}\n        {{ '' }}\n      {% endif %}\n    json_attributes_topic: 'hermes/tts/say'\n    expire_after: 60\n    icon: mdi:clippy\n  # aber auch wenn der text nicht erkannt wurde.\n  - platform: mqtt\n    # sensor.assistent_nachricht_nicht_verstanden\n    name: 'Assistent Nachricht nicht verstanden'\n    state_topic: 'hermes/nlu/intentNotRecognized'\n    value_template: >\n      {% if value_json is defined and value_json.siteId == 'assistant' %}\n        {{ 'Das habe ich nicht verstanden' }}\n      {% else %}\n        {{ '' }}\n      {% endif %}\n    json_attributes_topic: 'hermes/nlu/intentNotRecognized'\n    expire_after: 60\n    icon: mdi:clippy\n</code></pre>\n<p>Nun sollte es möglich sein, sowohl über</p>\n<ul>\n<li>den rhasspy Sprach Assistenten</li>\n<li>den Hangouts Chatbot und</li>\n<li>dem Conversations Plugin im HA mit dem Satz:</li>\n</ul>\n<blockquote>\n<p><em>Schalte das Licht in der Küche um</em></p>\n</blockquote>\n<p>Das Licht in der Küche umzuschalten.</p>\n<p>(also - zumindest falls es einen Küchen-Licht-Schalter im HA dafür gibt..)</p>\n<p><em>!!!woop woop!!!</em></p>\n<h3>SO - how is it going?</h3>\n<p>hahahah</p>\n<p>(starting and ending with green)</p>\n<p><img src=\"/images/rhasspy-diagram.png\" alt=\"\"></p>\n<p><strong>WIP</strong></p>\n<p>test-script mit arecord und a play</p>\n<p>lautstärke mit alsamixer</p>\n<p>home-assistant script und intents herrichten</p>\n<p>ein wort zur hardware</p>\n<h3>Plan für später</h3>\n<p>Derzeit ist noch alles auf statischen Methoden aufgebaut. Für TTS, STT und Intent Handling gebe aus auch dynamische Alternativen die verschiedene Möglichkeiten der künstlicher Intelligenz verwenden. Für TTS wäre das <strong>Mozilla-TTS</strong> oder <strong>Larynx</strong>. Für STT gibts das <strong>mycroft</strong> und für Intent Handling existiert <strong>RasaNLU</strong>. Angeblich alles super toll - setzt aber in den meisten Fällen auf TensorFlow oder pytorch und diese wiederum benötigen gewisse CPU Features (AVX), GPUs oder dezidierte TPUs. Da dies mein kleiner Home-Server jedoch nicht hat, mach ich fürs erste einen großen Bogen um dieses Teilgebiet.</p>"},{"url":"/posts/nvm-node-npm-install-in-wsl2/","relativePath":"posts/nvm-node-npm-install-in-wsl2.md","relativeDir":"posts","base":"nvm-node-npm-install-in-wsl2.md","name":"nvm-node-npm-install-in-wsl2","frontmatter":{"title":"nvm, node, npm install in WSL2","date":"2021-01-19T17:12:31.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"run node, run ...","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"10min","excerpt":"Komplette node Entwicklungsumgebung in WSL2 installieren und mit vscode verbinden","canonical_url":""},"html":"<h3>Node Version Manager</h3>\n<p><a href=\"https://docs.microsoft.com/en-us/windows/nodejs/setup-on-wsl2\" title=\"https://docs.microsoft.com/en-us/windows/nodejs/setup-on-wsl2\">https://docs.microsoft.com/en-us/windows/nodejs/setup-on-wsl2</a></p>\n<pre><code>sudo apt update &#x26;&#x26; sudo apt upgrade\nsudo apt-get install curl\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash\n\n# bash schließen und erneut öffnen\n</code></pre>\n<p><strong>Achtung</strong>: Wenn bereits <code>nvm</code> unter Windows installiert wurde, findet die WSL diesen <code>npm</code> Befehl und überspringt die weitere Installation. Allerdings funktioniert der <code>npm</code> Befehl von Windows nicht in der WSL (Fehlermeldung: <code>node-cli irgendwas</code>)</p>\n<p>Die Lösung ist hier mit <code>which npm</code> das gefundene Installations-Verzeichnis zu suchen (wahrscheinlich unter <code>/mnt/c/../nodejs</code>) - dieses Verzeichnis im Windows zu öffnen unter den <code>npm</code> Befehl temporär zbsp auf <code>npm2</code> umzubennen und dann das curl script oben ausführen. Anschließend kann man den Befehl wieder richtigstellen.</p>\n<p>Installation der benötigten node version</p>\n<pre><code>nvm install 14.15.4\nnvm use 14.15.4\n\n# kurzer test - die installation sollte jeweils unter /home/username zu finden sein\n# nicht unter /mnt/c/...\nwhich node\nnode --version\nwhich npm\nnpm -version\n</code></pre>\n<h3>App installieren</h3>\n<p>Danach ins Projekt Verzeichnis wechseln und die Applikation installieren und starten:</p>\n<pre><code>cd app\n# entsprechenden branch auswählen\ngit checkout develop\nnpm install\nnpm run start\n</code></pre>\n<p><strong>Achtung</strong>: Performance-technisch und funktional ist ein <strong>riesengroßer Unterschied</strong> ob das git Repository und damit die <code>node</code> Applikation unter <code>/mnt/c/users/.../</code> oder unter <code>/home/../</code> liegt. Deutlich schneller geht das ganze, wenn alles in der <code>wsl</code> vorhanden ist. Mit dem Nachteil, dass man dann nicht mehr so leicht über Windows darauf zugreifen kann.</p>\n<h3>Ein Performancevergleich</h3>\n<p>ein kompleter Test einer mittelgroßen Applikation mit ca. 20 Libraries:</p>\n<ul>\n<li>Windows: <em>3min 2sek</em></li>\n<li>WSL im Windows Verzeichnis: <em>>10min</em></li>\n<li>WSL im wsl Verzeichnis: <em>1min 6sek <strong>!!</strong></em></li>\n</ul>\n<p>frischer Produktions-Build:</p>\n<ul>\n<li>Windows: <em>1min 18sek</em></li>\n<li>WSL im wsl Verzeichnis: <em>43sek</em></li>\n</ul>\n<h3>vscode</h3>\n<p>beim start vscode wird die extension zur Verbindung der WSL2 gleich vorgeschlagen:</p>\n<p><a href=\"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl\" title=\"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl\">https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl</a></p>\n<p>see more about working remote: <a href=\"https://code.visualstudio.com/docs/remote/wsl-tutorial\" title=\"https://code.visualstudio.com/docs/remote/wsl-tutorial\">https://code.visualstudio.com/docs/remote/wsl-tutorial</a></p>\n<h3>git</h3>\n<p>Ablauf siehe: <a href=\"https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-git\" title=\"https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-git\">https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-git</a></p>\n<ul>\n<li>git in windows installieren: <a href=\"https://gitforwindows.org/\" title=\"https://gitforwindows.org/\">https://gitforwindows.org/</a></li>\n<li>git in der WSL installieren<br>\n<code>sudo apt-get install git</code></li>\n<li>Benutzer + Email in WSL und der PowerShell setzen:<br>\n<code>git config --global user.name \"Your Name\"</code><br>\n<code>git config --global user.email \"youremail@domain.com\"</code></li>\n<li>Befehl zum Setzen des Password Managers in der WSL:<br>\n<code>git config --global credential.helper \"/mnt/c/Program\\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe\"</code></li>\n<li><code>git pull</code> + einmalige Eingabe des Benutzers + Passworts</li>\n<li>Spätere Änderung des Passworts über <em>Anmeldeinformationsverwaltung</em><br>\nsiehe: <a href=\"https://stackoverflow.com/questions/15381198/remove-credentials-from-git\" title=\"https://stackoverflow.com/questions/15381198/remove-credentials-from-git\">https://stackoverflow.com/questions/15381198/remove-credentials-from-git</a></li>\n</ul>"},{"url":"/posts/ssh-keys-agents-password-manager-und-wsl/","relativePath":"posts/ssh-keys-agents-password-manager-und-wsl.md","relativeDir":"posts","base":"ssh-keys-agents-password-manager-und-wsl.md","name":"ssh-keys-agents-password-manager-und-wsl","frontmatter":{"title":"SSH-Keys, Agents, Password Manager und WSL","date":"2020-10-19T19:10:39.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"1h","excerpt":"","canonical_url":""},"html":"<p>Warum ist das so schwer?</p>\n<p>Aufgabe: Die Keys im Password Manager (<a href=\"https://github.com/keepassxreboot/keepassxc\" title=\"in meinem Fall keepassxc\">https://github.com/keepassxreboot/keepassxc</a>) sollen im <code>cmd</code> Fenster, der PowerShell, der WSL und in Programmen wie vscode, WinSCP, git oder PDF Readern (zum Signieren) automatisch erkannt und verwendet werden.</p>\n<p>Aus irgendeinem Grund legt jeder, jedem irgendwo einen Stein in den Weg.</p>\n<ul>\n<li>WinSCP erkennt nur putty's pageant an.</li>\n<li>Zum PDF signieren braucht man PGP Keys.</li>\n<li>KeepassXC und pageant unterstützen nur OpenSSH Keys.</li>\n<li>WSL2 untersützt keinen Austausch über Socket-Verbindungen mehr.</li>\n</ul>\n<p>einige tools die da hierfür Abhilfe Schaffen:</p>\n<p><strong>WSL1</strong></p>\n<p><a href=\"https://github.com/benpye/wsl-ssh-pageant/\" title=\"https://github.com/benpye/wsl-ssh-pageant/\">https://github.com/benpye/wsl-ssh-pageant/</a></p>\n<p><a href=\"https://github.com/rupor-github/wsl-ssh-agent/\" title=\"https://github.com/rupor-github/wsl-ssh-agent/issues/18\">https://github.com/rupor-github/wsl-ssh-agent/</a></p>\n<p><strong>WSL2</strong></p>\n<p><a href=\"https://github.com/BlackReloaded/wsl2-ssh-pageant\" title=\"https://github.com/BlackReloaded/wsl2-ssh-pageant\">https://github.com/BlackReloaded/wsl2-ssh-pageant</a></p>\n<p>und noch einige Dinge die man auf dem Weg zum vorläufigen Ziel aufschnappt:</p>\n<p><a href=\"https://polansky.co/blog/a-better-windows-wsl-openssh-experience/\" title=\"https://polansky.co/blog/a-better-windows-wsl-openssh-experience/\">https://polansky.co/blog/a-better-windows-wsl-openssh-experience/</a></p>\n<p><a href=\"https://github.com/PowerShell/Win32-OpenSSH/releases\" title=\"https://github.com/PowerShell/Win32-OpenSSH/releases\">https://github.com/PowerShell/Win32-OpenSSH/releases</a></p>\n<pre><code># powershell lines\n# find named pipes\n[System.IO.Directory]::GetFiles(\"\\\\.\\\\pipe\\\\\") | Select-String -Pattern ssh\n\n# find services with ssh\nGet-Service | select -property name,starttype | ? name -like *SSH*\n</code></pre>\n<p>Stand der Dinge Oktober 2020:</p>\n<p>Bei WSL1 hat mit dem tool von benpye cmd, powershell, vscode, pageant, wsl funktioniert.</p>\n<p>Bei WSL2 funktioniert mit dem tool von BlackReloaded noch pageant und wsl.</p>"},{"url":"/posts/ssh-verbindungen-unter-wsl2-kaputt/","relativePath":"posts/ssh-verbindungen-unter-wsl2-kaputt.md","relativeDir":"posts","base":"ssh-verbindungen-unter-wsl2-kaputt.md","name":"ssh-verbindungen-unter-wsl2-kaputt","frontmatter":{"title":"SSH Verbindungen unter WSL2 kaputt","date":"2020-11-27T12:14:00.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"https://github.com/microsoft/WSL","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"infinity","excerpt":"Windows Update at its best.","canonical_url":""},"html":"<p>Na toll - Freitag Vormittag und SSH geht nicht mehr.</p>\n<p>Google anwerfen und siehe da - das Problem gibts seit September 2019. Danke.</p>\n<p><a href=\"https://github.com/microsoft/WSL/issues/4690\" title=\"SSH connections hanging from WSL2 #4690\">https://github.com/microsoft/WSL/issues/4690</a></p>\n<pre><code># PS\nNew-NetFirewallRule -DisplayName \"WSL\" -Direction Outbound -InterfaceAlias \"vEthernet (WSL)\" -Action Allow\n</code></pre>\n<p><a href=\"https://github.com/microsoft/WSL/issues/3434#\" title=\"SSH hangs after machine powered on sometimes. #3434\">https://github.com/microsoft/WSL/issues/3434</a></p>\n<pre><code># PS\nnet stop LxssManager\nnet start LxssManager\n\n# or: \nRestart-Service \"LxssManager\"\n\n# and\nRestart-Service \"Hostnetzwerkdienst\"\n</code></pre>\n<p><a href=\"https://github.com/microsoft/WSL/issues/4585\" title=\"Add &#x22;allow&#x22; rule to Windows firewall for WSL2 network #4585\">https://github.com/microsoft/WSL/issues/4585</a></p>\n<pre><code># PS\n$myIp = (ubuntu run \"cat /etc/resolv.conf | grep nameserver | cut -d' ' -f2\")\nNew-NetFirewallRule -DisplayName \"WSL\" -Direction Inbound  -LocalAddress $myIp -Action Allow\n\n# or better:\n\nNew-NetFirewallRule -DisplayName \"WSL\" -Direction Inbound  -InterfaceAlias \"vEthernet (WSL)\"  -Action Allow\n</code></pre>\n<p><a href=\"https://github.com/microsoft/WSL/issues/4139\" title=\"Windows Defender Firewall blocks access from WSL2 #4139\">https://github.com/microsoft/WSL/issues/4139</a></p>\n<pre><code># PS\nSet-NetConnectionProfile -InterfaceAlias \"vEthernet (WSL)\" -NetworkCategory Private\n\nNew-NetFirewallRule -DisplayName \"WSL\" -Direction Inbound  -InterfaceAlias \"vEthernet (WSL)\"  -Action Allow\n\nSet-NetFirewallProfile -Name $(Get-NetConnectionProfile).NetworkCategory -DisabledInterfaceAliases $(Get-NetAdapter | Where-Object Name -like 'WSL').Name\n</code></pre>\n<p><a href=\"https://github.com/microsoft/WSL/issues/5256\" title=\"WSL2 DNS issues #5256\">https://github.com/microsoft/WSL/issues/5256</a></p>\n<pre><code>sudo echo \"nameserver 192.168.0.1\" >> /etc/resolv.conf\n</code></pre>\n<p><a href=\"https://github.com/microsoft/WSL/issues/1908\" title=\"https://github.com/microsoft/WSL/issues/1908\">https://github.com/microsoft/WSL/issues/1908</a></p>\n<pre><code># sudo chattr +i /etc/resolv.conf\n\necho \"[network]\ngenerateResolvConf=false\" >> /etc/wsl.conf\n</code></pre>\n<p>zwischendurch noch etliche Meldungen wegen DNS, MTU und VPN Problemen im Zusammenhang mit WSL2 ..</p>\n<p>Lösung:</p>\n<p>Muss leider sagen, dass keine der oben genannten Befehle funktioniert hat. Daher:</p>\n<p><strong>Windows Restart!</strong></p>\n<p>eine sh*t-show...</p>"},{"url":"/posts/test/","relativePath":"posts/test.md","relativeDir":"posts","base":"test.md","name":"test","frontmatter":{"title":"test","template":"education","institution":"HTBLuVA Wr.Neustadt","department":"EDV und Organisation / Informatik","degree":"ING","excerpt":"Abgeschlossen mit gutem Erfolg","start":"1998-09-01T00:00:00.000+02:00","end":"2003-05-31T22:00:00.000Z","highlight":false,"education_url":"https://www.htlwrn.ac.at","thumb_img_path":"/images/school-htlwrn.png","content_img_path":"/images/school-htlwrn.png","active":false,"date":"2020-08-31T22:00:00.000Z","enabled":false},"html":""},{"url":"/posts/vim-syntax-highlighting/","relativePath":"posts/vim-syntax-highlighting.md","relativeDir":"posts","base":"vim-syntax-highlighting.md","name":"vim-syntax-highlighting","frontmatter":{"title":"Vim syntax highlighting","date":"2020-09-17T08:05:35.000Z","active":false,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"5m","excerpt":"Syntax highlighting im vi/vim auf Synology DSM 6.2","canonical_url":""},"html":"<p>Auf der Synology Box (DSM 6.2.3) ist standardmäßig vi/vim v7.4 installiert. Das Syntax Highlighting dort funktioniert allerdings nur bei den aller wenigsten Dateien. Lokal am Rechner ist zumindest vi/vim 8.0 vorhanden - hier mit deutlich mehr unterstützten Dateitypen.</p>\n<h4>Was hat nicht funktioniert</h4>\n<p>vim / vim-full (v8.2) über ipkg installieren und die lokalen Syntax Dateien wie unten nach <code>/opt/share/vim/syntax</code> verlinken. Gibt folgenden Fehler, sobald man <code>:syntax on</code> aktiviert:</p>\n<pre><code>Error detected while processing syntax.vim:\nNo such group or event: filetypedetect BufRead\n</code></pre>\n<h4>Was hat funktioniert</h4>\n<p>Das Verzeichnis mit den lokalen Syntax highlight Dateien auf das Nas spielen und dort in einfach im vim Verzeichnis einen Symlink darauf machen:</p>\n<pre><code># am lokalen Rechner:\nscp -r /usr/share/vim/vim80/syntax nas:/volume1/homes/admin/vim8-syntax\n# am Nas:\nsudo mv /usr/share/vim/vim74/syntax /usr/share/vim/vim74/syntax.bac\nsudo ln -s /volume1/homes/admin/vim8-syntax /usr/share/vim/vim74/syntax\n</code></pre>"},{"url":"/posts/wsl2-per-command-line-installieren/","relativePath":"posts/wsl2-per-command-line-installieren.md","relativeDir":"posts","base":"wsl2-per-command-line-installieren.md","name":"wsl2-per-command-line-installieren","frontmatter":{"title":"WSL2 ohne Microsoft Store installieren","date":"2021-01-19T15:38:55.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"Falls der MS Store mal nicht verfügbar ist..","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"20m","excerpt":"Frische und saubere WSL2 installation größtenteils per CommandLine.","canonical_url":""},"html":"<p>Anforderungen: <strong>Windows 10 Version 1903 Build 18362.1049+</strong></p>\n<p>Einfach prüfen mit:</p>\n<pre><code>winver\n</code></pre>\n<h3>WSL2 und HyperVisor aktivieren</h3>\n<p>Anleitung zum Aktivieren der WSL2:</p>\n<p><a href=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\" title=\"https://docs.microsoft.com/en-us/windows/wsl/install-win10\">https://docs.microsoft.com/en-us/windows/wsl/install-win10</a></p>\n<p>PowerShell als Administrator starten:</p>\n<pre><code>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart\ndism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart\n\nRestart-Computer\n</code></pre>\n<p>Download und Install: <a href=\"https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi\" title=\"https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi\">https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi</a></p>\n<pre><code>wsl --set-default-version 2\n</code></pre>\n<p>Bei Punkt 6 in der Anleitung kann aufgehört werden.</p>\n<h3>Distribution installieren</h3>\n<p>Installation der gewünschten Distribution (hier Ubuntu2004):</p>\n<p><a href=\"https://docs.microsoft.com/en-us/windows/wsl/install-manual\" title=\"https://docs.microsoft.com/en-us/windows/wsl/install-manual\">https://docs.microsoft.com/en-us/windows/wsl/install-manual</a></p>\n<p>PowerShell als normaler Benutzer starten:</p>\n<pre><code>Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu-2004.appx -UseBasicParsing\n\n# die App per command hinzuzufügen funktioniert\n# jedoch muss man sie danach immer noch manuell starten\n# Add-AppPackage .\\Ubuntu-2004.appx\n\n# leichter man startet sie direkt:\n.\\Ubuntu-2004.appx\n\n# Benutzer zbsp: admin\n\n# optional falls keine distributionen gefunden werden:\nnet stop LxssManager\nnet start LxssManager\n\n# auflisten verfügbarer distributionen\nwsl --list  --all -v\nwslconfig /list /all\n</code></pre>\n<p>Mehr Infos zu user Account und Passwort vergessen: <a href=\"https://docs.microsoft.com/en-us/windows/wsl/user-support\" title=\"https://docs.microsoft.com/en-us/windows/wsl/user-support\">https://docs.microsoft.com/en-us/windows/wsl/user-support</a></p>\n<h3>besseres Terminal</h3>\n<p>Nun das Terminal installieren: <a href=\"https://docs.microsoft.com/en-us/windows/terminal/get-started\" title=\"https://docs.microsoft.com/en-us/windows/terminal/get-started\">https://docs.microsoft.com/en-us/windows/terminal/get-started</a></p>\n<p>Microsoft Store: <a href=\"https://www.microsoft.com/de-de/p/windows-terminal/9n0dx20hk701\" title=\"https://www.microsoft.com/de-de/p/windows-terminal/9n0dx20hk701\">https://www.microsoft.com/de-de/p/windows-terminal/9n0dx20hk701</a></p>\n<p>Zum extrahieren der Download Url: <a href=\"https://store.rg-adguard.net/\" title=\"https://store.rg-adguard.net/\">https://store.rg-adguard.net/</a><br>\n(selektierter Ring im Dropdown ist egal, Download Url gilt allerdings nur 20 Minuten)</p>\n<pre><code>Invoke-WebRequest -OutFile Terminal.appx -UseBasicParsing -Uri \"http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/b98f7dc2-9f52-4579-a4e4-eb2c59f5332f?P1=1611074965&#x26;P2=402&#x26;P3=2&#x26;P4=VmpHBXMzxT4oD8uVd1Rfb48gVbO7K4e%2fDCUHHrthdFoXJa91G0w%2fFz9p6GPZJiyOZQO4%2blxHKa8zkzNKCSEkNA%3d%3d\"\n.\\Terminal.appx\n</code></pre>\n<p>Danach nur noch die Einstellungen im Terminal ändern, sodass die <strong>Terminal.wsl</strong> als default aufgeht.</p>\n<h3>Problem: WSL hat keine Netzwerk Verbindung</h3>\n<p>Der standard DNS Eintrag in der WSL, der dummerweise nach jedem Neustart erneut generiert wird, ist nur selten sinnvoll - daher hier eine mögliche Alternative.</p>\n<p>siehe: <a href=\"https://github.com/microsoft/WSL/issues/5336#issuecomment-657825486\" title=\"https://github.com/microsoft/WSL/issues/5336#issuecomment-657825486\">https://github.com/microsoft/WSL/issues/5336#issuecomment-657825486</a><br>\nund: <a href=\"https://github.com/microsoft/WSL/issues/5420#issuecomment-646479747\" title=\"https://github.com/microsoft/WSL/issues/5420#issuecomment-646479747\">https://github.com/microsoft/WSL/issues/5420#issuecomment-646479747</a></p>\n<pre><code># neue nameserver einfügen - 8.8.8.8 oder eigene\nsudo rm /etc/resolv.conf\nsudo bash -c 'echo \"nameserver 8.8.8.8\" > /etc/resolv.conf'\n# sicherstellen, dass diese Datei nicht mehr neu generiert wird\nsudo chattr +i /etc/resolv.conf\n\nsudo rm /etc/wsl.conf\nsudo bash -c 'echo \"[network]\" > /etc/wsl.conf'\nsudo bash -c 'echo \"generateResolvConf = false\" >> /etc/wsl.conf'\n</code></pre>\n<h3>Problem: Netzwerk Zugriff von und auf die WSL</h3>\n<p>Diesen Bereich bitte als spekulativ betrachten - nichts davon lässt sich irgendwie vernünftigt nachvollziehen oder erklären.</p>\n<p>Mit der Installation der WSL2 wird ein zusätzlicher Netzwerk-Adapter hinzugefügt: <strong>vEthernet (WSL)</strong>. Ähnlich wie bei einer virtuellen Maschine dient diese Schnittstelle zur Verbindung auf das Netzwerk der WSL. Dadurch hat der Host nun mehrere IP-Addressen:</p>\n<ol>\n<li>localhost / 127.0.0.1</li>\n<li>die bisherigen lokalen IPs - zbsp. 192.168.*</li>\n<li>die neue lokale IP der WSL - zbsp. 172.*</li>\n</ol>\n<p>Zugriff von der WSL auf diese IPs sind nun unterschiedlich:</p>\n<ol>\n<li>der localhost in der WSL und auf dem Host ist unterschiedlich - Dienste die in der WSL laufen, können aber einfach vom Host aus über <code>localhost:port</code> erreicht werden. Dienste die am Host unter localhost laufen, kann die WSL allerdings nicht erreichen. Hier hilft ein <code>socat</code> den man auf der WSL startet. Ein paar Beispiele:<br>\n<a href=\"https://unix.stackexchange.com/a/187038\" title=\"https://unix.stackexchange.com/a/187038\">https://unix.stackexchange.com/a/187038</a><br>\n<a href=\"https://unix.stackexchange.com/a/326446\" title=\"https://unix.stackexchange.com/a/326446\">https://unix.stackexchange.com/a/326446</a><br>\num also einen Port aus der WSL auf den Host zu forwarden kann dies ausgeführt werden:<br>\n<code>socat tcp4-listen:12345,bind=localhost,reuseaddr,fork tcp4:$(hostname -I):12345</code></li>\n<li>Zugriff von der WSL auf die bisherigen lokalen IPs werden standardmäßig von der Windows Firewall geblockt - hier benötigt man eine zusätzliche Firewall Regel: <a href=\"https://stackoverflow.com/a/51998308\" title=\"https://stackoverflow.com/a/51998308\">https://stackoverflow.com/a/51998308</a></li>\n<li>Zugriff vom lokalen Netzwerk auf die WSL funktioniert auch nicht - hier muss erst ein Port forwarding eingerichtet werden. Hier ein PowerShell Skript für alle mit Admin-Rechten: <a href=\"https://dev.to/vishnumohanrk/wsl-port-forwarding-2e22\" title=\"https://dev.to/vishnumohanrk/wsl-port-forwarding-2e22\">https://dev.to/vishnumohanrk/wsl-port-forwarding-2e22</a></li>\n<li>Zugriff von der WSL auf die neue lokale Host IP ist möglich, allerdings ändert sich diese IP mit jedem Neustart .. die IP <em>stünde</em> in der <code>/etc/resolve.conf</code> allerdings haben wir diese zugunsten von allgemeinem Internet Zugriff überschrieben. Mit folgenden Befehlen lässt sich zumindest die IP der WSL einfach ermitteln:\n<ol>\n<li>in der WSL: <code>hostname -I</code></li>\n<li>in der PowerShell: <code>wsl hostname -I</code></li>\n</ol>\n</li>\n</ol>"},{"url":"/posts/xdebug-in-vscode/","relativePath":"posts/xdebug-in-vscode.md","relativeDir":"posts","base":"xdebug-in-vscode.md","name":"xdebug-in-vscode","frontmatter":{"title":"xdebug in vscode","date":"2020-09-18T08:50:38.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"1h","excerpt":"xDebuggen auch auf nicht-lokalem Webserver","canonical_url":""},"html":"<p>xDebug wird zum debbugen von PHP verwendet - recht praktisch wenn man live zur Laufzeit sehen will was das Skript da eigentlich macht. Hier wird beschrieben wie man den Webserver und das Modul konfiguriert, die Browser Extension installiert, vscode einstellt und die Portweiterleitung aktiviert. Debuggen müsst ihr allerdings noch selber.</p>\n<h4>am Webserver</h4>\n<p>php56:</p>\n<pre><code>pecl install xdebug-2.5.5\n</code></pre>\n<p>php7+:</p>\n<pre><code>pecl install xdebug\n</code></pre>\n<p>alles weiter ist für php56 beschrieben - in aktuellen PHP Umgebungen wird die Anleitung vermutlich leicht anders aussehen:</p>\n<pre><code>locate php.ini\n\n# put within [PHP] section:\necho \"\n[xDebug]\nzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so\nxdebug.remote_connect_back = true\nxdebug.remote_enable = 1\n\" >> /usr/local/lib/php.ini\n\n\n# apache / php neu starten\n/etc/init.d/httpd restart ; /etc/init.d/php-fpm restart\n\n# phpinfo checken\nphp -i | grep -i xdebug.remote_connect\n</code></pre>\n<h4>im Visual Studio Code</h4>\n<p>im Visual Studio Code im Side Menü unter Run eine neue Config zum Workspace hinzufügen:</p>\n<pre><code>  \"launch\": {\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n      {\n        \"name\": \"Listen for XDebug\",\n        \"type\": \"php\",\n        \"request\": \"launch\",\n        \"port\": 9000,\n        // server -> local, only on remote web servers\n        \"pathMappings\": {\n          \"/var/www/html/folder1\": \"${workspaceRoot:folder1}/\",\n          \"/var/www/html/folder2\": \"${workspaceRoot:folder2}/\"\n      }\n    ]\n  }\n</code></pre>\n<p>Die Eigenschaft <code>pathMapping</code> in der launch config oben wird benötigt um vscode zu erklären, welche Pfade zusammengehören. <strong>workspaceRoot</strong> ist dabei das Verzeichnis in dem die vscode-workspace Datei liegt - mit <code>:folder1</code> kann man in einem multi-root workspace die einzelnen Verzeichnisse ansprechen. Mit <code>:folder1</code> wird dabei die Eigenschaft <code>name</code> im <code>folders</code> array der workspace Datei referenziert.</p>\n<p>Danach kann der Debug Modus (F5) schon gestartet werden - und bspw. ein Breakpoint testweise irgendwo im Code (in einem Teil der später auch verwendet wird) gesetzt werden.</p>\n<h4>am lokalen Rechner</h4>\n<p><strong>Wichtig:</strong> Da in unserem Fall der eigentliche PHP Prozess <em>nicht am lokalen Rechner läuft, sondern auf einem Webserver remote</em>, müssen die xdebug-Requests entsprechend weitergeleitet werden. Dies kann mit mittels SSH Tunnel oder putty machen. Für die einfachere <code>ssh</code> Variante sieht die Konfiguration unter <code>~/.ssh/config</code> so aus:</p>\n<pre><code>Host ip-oder-name-des-webservers \n  User root\n  Port 22\n  ForwardAgent yes\n  RemoteForward 9000 127.0.0.1:9000\n</code></pre>\n<p>Sobald man zu diesem Webserver verbunden ist, werden alle Requests die auf Port 9000 am remote Webserver eingehen (dort schickt der Webserver die Xdebug Informationen hin) auf den lokalen Rechner weitergeleitet und vscode kann es abgreifen.</p>\n<h4>im Web Browser</h4>\n<p>Nun nur noch im Web Browser die <strong>Erweiterung xDebug Helper</strong> installieren (siehe unten) und bevor der eigentliche Request abgeschickt wird, den Helper auf <strong>Debug</strong> stellen. Wenn alles passt, sollte der Request stehen bleiben und vscode entsprechend reagieren und den aktuellen Kontext am Breakpoint anzeigen. Standardmäßig ist eingestellt, dass vscode bei Notices, Warnings, Errors und Exceptions (Everything) stehen bleibt - das kann bei \"unqualitativem\" Code recht schnell mühsam werden - im Reiter Breakpoints kann dies deaktiviert werden.</p>\n<p>siehe auch:</p>\n<ul>\n<li>Chrome Erweiterung <a href=\"https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc/related\" title=\"xDebug Helper für Chrome\">https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc/related</a></li>\n<li>Anleitung <a href=\"https://www.codewall.co.uk/debug-php-in-vscode-with-xdebug/\" title=\"Anleitung für vscode\">https://www.codewall.co.uk/debug-php-in-vscode-with-xdebug/</a></li>\n<li>Xdebug Config <a href=\"https://xdebug.org/docs/all_settings#remote_enable\" title=\"https://xdebug.org/docs/all_settings#remote_enable\">https://xdebug.org/docs/all_settings#remote_enable</a></li>\n<li>multi-root workspace im vscode: <a href=\"https://code.visualstudio.com/docs/editor/variables-reference#_variables-scoped-per-workspace-folder\" title=\"vcode multi-root workspaces\">https://code.visualstudio.com/docs/editor/variables-reference#_variables-scoped-per-workspace-folder</a></li>\n</ul>"},{"url":"/projects/a1-webmail/","relativePath":"projects/a1-webmail.md","relativeDir":"projects","base":"a1-webmail.md","name":"a1-webmail","frontmatter":{"title":"A1 Webmail","subtitle":"Migration Mailsystem, Projektteam aus HP/M-otion/SuperFi/Qnipp","project_url":"https://webmail.a1.net","start":"09/01/2013","end":"06/01/2015","highlight":true,"workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-a1.png","content_img_path":"images/project-a1.png","excerpt":"Projektmanagement, Projektcontrolling und Changemanagement bei der Konsolidierung der Business- und Residentialmailsysteme.","tools":"mtranet, JS, CSS, Jira","template":"project","enabled":true},"html":""},{"url":"/projects/civis/","relativePath":"projects/civis.md","relativeDir":"projects","base":"civis.md","name":"civis","frontmatter":{"title":"Civis 4.0 Patria","workplace":"src/pages/work/freelancer.md","template":"project","subtitle":"Angular Projekt samt portierter Android App","highlight":false,"project_url":"https://play.google.com/store/apps/details?id=io.epb.civis","start":"2020-11-30T23:00:00.000Z","end":"2021-01-31T23:00:00.000Z","thumb_img_path":"/images/company-covert.png","excerpt":"Umsetzung einer Handy App um Gemeinden in der Kommunikation mit deren Einwohner zu unterstützen.","tools":"Angular 12, Apollo, GraphQL, Postman, Ionic, Capacitor, Geolocation, Android APIs, Android Studio, Notifications, Firebase","content_img_path":"","date":null,"enabled":true},"html":""},{"url":"/projects/easybooking/","relativePath":"projects/easybooking.md","relativeDir":"projects","base":"easybooking.md","name":"easybooking","frontmatter":{"title":"Easybooking","workplace":"src/pages/work/zadego.md","enabled":true,"template":"project","subtitle":"Backend, verschiedene Frontends und Widgets","project_url":"https://www.easybooking.eu","start":"2020-02-29T23:00:00.000Z","end":"2020-12-31T21:36:30.000Z","thumb_img_path":"/images/project-easybooking.png","excerpt":"Weiterentwicklung der Hotelbuchungssoftware, Betreueung verschiedener Schnittstellen zu externen Dienstleistern","tools":"PHP, yii, Angular, grunt, SQL, gitlab, trello, Google Cloud Platform (GCP), Unit Tests, Remote Work","content_img_path":"/images/project-easybooking.png","date":null},"html":""},{"url":"/projects/eingutertag/","relativePath":"projects/eingutertag.md","relativeDir":"projects","base":"eingutertag.md","name":"eingutertag","frontmatter":{"title":"Ein Guter Tag","subtitle":"Android App, Projekt der Fa. Qnipp","project_url":null,"start":"01/01/2014","end":"04/01/2014","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-gutertag.png","content_img_path":"images/project-gutertag.png","excerpt":"Konzeptionierung und Umsetzung einer Android App auf Basis der Webseite eingutertag.org, Erweiterungen zur Auswertung der erhobenen Daten.","tools":"Java, ADK, PHP","template":"project","enabled":true},"html":""},{"url":"/projects/eventszene/","relativePath":"projects/eventszene.md","relativeDir":"projects","base":"eventszene.md","name":"eventszene","frontmatter":{"title":"eventszene.at","subtitle":"Community und Event Portal, firmeneigenes Projekt","project_url":null,"start":"11/01/2004","end":"10/01/2005","workplace":"src/pages/work/nospoon.md","thumb_img_path":"images/project-eventszene.png","content_img_path":"images/project-eventszene.png","excerpt":"Entwicklung von Web Anwendungen, Einbindung des Ticketshops, Backend Anwendungen, Import- und Export-Skripte, Statistiken. Entwickler im 10-köpfigen Team","tools":"Delphi, Interbase, IIS","template":"project","enabled":true},"html":""},{"url":"/projects/everleafgaming/","relativePath":"projects/everleafgaming.md","relativeDir":"projects","base":"everleafgaming.md","name":"everleafgaming","frontmatter":{"title":"EverleafGaming","subtitle":"Online Gaming Netzwerk, Projekt der Firma Everleaf Gaming Ltd.","project_url":null,"start":"02/01/2006","end":"07/01/2012","workplace":"src/pages/work/cyrom.md","thumb_img_path":"images/project-everleafgaming.png","content_img_path":"images/project-everleafgaming.png","excerpt":"Weiterentwicklung des Content Management Systems, Administratives Backend, Webservices, Durchführung von Schulungen, Datenbank Konzeption, Verantwortlicher für Zahlungsschnittstellen, Second- und Third-Level-Support, Vorbeugung von XSS und SQL Injections im legacy Code. Entwickler und Teamlead im Projektteam von rund 15 Personen","tools":"PHP, MySQL, JQuery, SOAP, XMLRPC, SVN, Rest, JSON","template":"project","enabled":true},"html":""},{"url":"/projects/full-project/","relativePath":"projects/full-project.md","relativeDir":"projects","base":"full-project.md","name":"full-project","frontmatter":{"title":"Full Project","workplace":"src/pages/work/qnipp.md","template":"project","subtitle":"Subtitle of the project","highlight":true,"project_url":"https://www.example.com","start":"2019-11-30T23:00:00.000Z","end":"2020-01-31T23:00:00.000Z","thumb_img_path":"/images/company-covert.png","excerpt":"A short description of the project","tools":"Some tools and methods used during the project","content_img_path":"","date":null,"enabled":false},"html":""},{"url":"/projects/geotracking/","relativePath":"projects/geotracking.md","relativeDir":"projects","base":"geotracking.md","name":"geotracking","frontmatter":{"title":"GEO Tracking","subtitle":"Response Webseite, Projekt der Fa. Qnipp","project_url":null,"start":"11/01/2014","end":"12/01/2014","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-geotracking.png","content_img_path":"images/project-geotracking.png","excerpt":"Umsetzung einer möglichst einfachen, schnellen und responsiven Webseite um die aktuelle Position als Trail im Browser darzustellen und im Hintergrund die Daten aufzuarbeiten.","tools":"PHP, JS, Google Maps API","template":"project","enabled":true},"html":""},{"url":"/projects/ing/","relativePath":"projects/ing.md","relativeDir":"projects","base":"ing.md","name":"ing","frontmatter":{"title":"ING.at","subtitle":"CMS und Webseite, Projektteam aus SuperFi/Vice/Virtue/Qnipp","project_url":"https://www.ing.at","start":"9/1/2013","end":"2020-02-29T23:00:00.000Z","highlight":true,"workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-ingdiba.png","content_img_path":"images/project-ingdiba.png","excerpt":"Betreuung und Weiterentwicklung des Typo3 CMS, Einbau verschiedener Schnittstellen (CDN, Fonds, Bewertungen, Jobs, Rechner, Formulare), Consulting und Schulungen im Bereich SEO und DevOps. Implementierung automatisierter Tests. Teamlead in Bereich Backend.","tools":"Typo3, typoscript, PHP, MySQL, Fluid, JS, SOAP, REST, Akamai, Solr","template":"project","enabled":true},"html":""},{"url":"/projects/heiszenberger/","relativePath":"projects/heiszenberger.md","relativeDir":"projects","base":"heiszenberger.md","name":"heiszenberger","frontmatter":{"title":"Aufzug Heiszenberger","subtitle":"CRM/DMS/EDI Modernisierung, Projekt der Fa. Heiszenberger GmbH","project_url":"https://www.ing.at","start":"12/01/2018","end":"2020-02-29T23:00:00.000Z","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-heiszenberger.png","content_img_path":"images/project-heiszenberger.png","excerpt":"Betreuung, Weiterentwicklung und Modernisierung des Kunden- und Dokumenten Management- und Datenaustauschsystems.","tools":"PHP, Cake, MariaDB, JS, CSS, tcpdf, qemu, composer","template":"project","enabled":true},"html":""},{"url":"/projects/mercurypuzzle/","relativePath":"projects/mercurypuzzle.md","relativeDir":"projects","base":"mercurypuzzle.md","name":"mercurypuzzle","frontmatter":{"title":"MercuryPuzzle","subtitle":"Plattform zur Talentevaluierung, Projekt der Firma MercuryPuzzle UG","project_url":null,"start":"07/01/2012","end":"11/01/2012","workplace":"src/pages/work/mercurypuzzle.md","thumb_img_path":"images/project-mercurypuzzle.png","content_img_path":"images/project-mercurypuzzle.png","excerpt":"Eines der Top 10 Start-Ups am Pioneers Festival 2012 Unterstützung zur barrierefreien Nutzung der Plattform, Integration in gängige Soziale Netzwerke, Konzeption und Aufbau eines Newsletter Systems.","tools":"Symfony2, Eclipse, OAuth, SVN, AJAX, jQuery, CSS3","template":"project","enabled":true},"html":""},{"url":"/projects/meteor-train/","relativePath":"projects/meteor-train.md","relativeDir":"projects","base":"meteor-train.md","name":"meteor-train","frontmatter":{"title":"Meteor Train","subtitle":"Hackaton Zugsteuerung über Web App","project_url":"https://devpost.com/software/the-meteor-train","start":"10/14/2016","end":"10/14/2016","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-meteortrain.png","content_img_path":"images/project-meteortrain.png","excerpt":"Umsetzung einer Meteor Web App zur Steuerung eines Zuges über die GPIO Schnittstelle eines RaspberryPIs im Zuge einer Teilnahme an einem 24h Hackaton.","tools":"Meteor, blaze, GPIO","template":"project","enabled":true},"html":""},{"url":"/projects/oeticket/","relativePath":"projects/oeticket.md","relativeDir":"projects","base":"oeticket.md","name":"oeticket","frontmatter":{"title":"oeticket.com","subtitle":"bekannter Online Ticketshop der Firma EVENTIM","project_url":"https://www.oeticket.com","start":"04/01/2004","end":"10/01/2005","highlight":true,"workplace":"src/pages/work/nospoon.md","thumb_img_path":"images/project-oeticket.png","content_img_path":"images/project-oeticket.png","excerpt":"Weiterentwicklung und Betrieb des Ticket Shops, Einbindung neuer Funktionen, SMS Dienste, Auswertungen, Backup System. Entwickler im 10 köpfigen Team","tools":"Delphi, Interbase, IIS, SMS, wap, wml","template":"project","enabled":true},"html":""},{"url":"/projects/oracle/","relativePath":"projects/oracle.md","relativeDir":"projects","base":"oracle.md","name":"oracle","frontmatter":{"title":"Oracle Business Intelligence","subtitle":"Organisationsprojekt, Internationales Projekt der Firma JTI","project_url":null,"start":"01/01/2013","end":"06/01/2013","workplace":"src/pages/work/jti.md","thumb_img_path":"images/project-oracle.png","content_img_path":"images/project-oracle.png","excerpt":"Marktübergreifende Migration des TME Systems von OBIEE 10g auf 11g. Erstellung und Optimierung von Berichten im Datawarehouse, Konzeption und Entwicklung eines Javascript Überbaus mit Berechtigungssystem.","tools":"Oracle SQL, jQuery, Ajax, RSS, SOAP, CSS","template":"project","enabled":true},"html":""},{"url":"/projects/origimahl/","relativePath":"projects/origimahl.md","relativeDir":"projects","base":"origimahl.md","name":"origimahl","frontmatter":{"title":"origimahl.at","subtitle":"kulinarischer Reiseführer der Wirtschaftskammer Burgenland","project_url":null,"start":"04/01/2005","end":"08/01/2005","workplace":"src/pages/work/nospoon.md","thumb_img_path":"images/project-origimahl.png","content_img_path":"images/project-origimahl.png","excerpt":"vom Lastenheft bis zur Webapplikation, Frontend und SMS Service. Architekt und Entwickler im Team aus 3 Personen","tools":null,"template":"project","enabled":true},"html":""},{"url":"/projects/prefa/","relativePath":"projects/prefa.md","relativeDir":"projects","base":"prefa.md","name":"prefa","frontmatter":{"title":"PREFA.at","subtitle":"CMS und Webseite, Projekt der Fa. PREFA Aluminiumprodukte GmbH","project_url":"https://www.prefa.at","start":"06/01/2017","end":"01/01/2019","highlight":true,"workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-prefa.png","content_img_path":"images/project-prefa.png","excerpt":"Betreuung und Weiterentwicklung der internationalen, multi-domain Webseite, Umsetzung einer Auftragsplattform für Endkunden und externe Vertragspartner. Entwickler Schulung. Weiterentwicklung der Formular- und Übersetzungsverwaltung.","tools":"PHP, Typo3, MariaDB, git, vagrant, composer","template":"project"},"html":""},{"url":"/projects/pssst/","relativePath":"projects/pssst.md","relativeDir":"projects","base":"pssst.md","name":"pssst","frontmatter":{"title":"Pssst! Das Christkind kommt!","subtitle":"Android App, Projekt der Fa. Qnipp","project_url":null,"start":"11/01/2014","end":"12/31/2014","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-pssstchristkind.png","content_img_path":"images/project-pssstchristkind.png","excerpt":"Implementierung einer Wecker App für Android auf Basis einer bestehenden iOS App.","tools":"Java, ADK","template":"project","enabled":true},"html":""},{"url":"/projects/raisingcards/","relativePath":"projects/raisingcards.md","relativeDir":"projects","base":"raisingcards.md","name":"raisingcards","frontmatter":{"title":"RaisingCards","subtitle":"Online Plattform, privates Projekt","project_url":null,"start":"05/27/2009","end":"07/01/2012","workplace":"/job/cyrom/","thumb_img_path":"images/project-raisingcards.png","content_img_path":"images/project-raisingcards.png","excerpt":"Erstellung und Umsetzung des Business- und Finanzplans, Aufbau eines Marketingkonzepts, Mit- und Weiterentwicklung der Web Dienste, Betreuung. Gründer und Partner","tools":"PHP, JS, SOAP, XMLRPC, SEO, SMO, RSS, iCal","template":"project","enabled":true},"html":""},{"url":"/projects/timeapp/","relativePath":"projects/timeapp.md","relativeDir":"projects","base":"timeapp.md","name":"timeapp","frontmatter":{"title":"TimeApp","subtitle":"Tool zur Zeiterfassung, firmeneigenes Projekt","project_url":"https://github.com/qnipp/timeapp","start":"03/10/2016","end":"06/16/2017","workplace":"src/pages/work/qnipp.md","thumb_img_path":"images/project-timeapp.png","content_img_path":"images/project-timeapp.png","excerpt":"Erstellung einer Meteor Web App zur Erfassung auftrags- und projektphasenbezogener Arbeitszeiten.","tools":"Meteor, blaze, moment, JS, MongoDB, Jira","template":"project","enabled":true},"html":""},{"url":"/projects/wieplant/","relativePath":"projects/wieplant.md","relativeDir":"projects","base":"wieplant.md","name":"wieplant","frontmatter":{"title":"Wie plant Österreich?","subtitle":"österreichweite Umfrage, Projekt an der Fachhochschule des bfi Wien","project_url":null,"start":"04/01/2012","end":"01/01/2013","workplace":"src/pages/education/fhvie.md","thumb_img_path":"images/project-pmsurvey.png","content_img_path":"images/project-pmsurvey.png","excerpt":"Online Umfrage an über 250 österreichischen Top Unternehmen zur Klärung der Frage „Welche PM Software wird an österreichischen Unternehmen verwendet?“.","tools":"LimeSurvey, SPSS, IPMA Standards, Microsoft Projects","template":"project","enabled":true},"html":""},{"url":"/projects/wincc-open-architecture-dashboard/","relativePath":"projects/wincc-open-architecture-dashboard.md","relativeDir":"projects","base":"wincc-open-architecture-dashboard.md","name":"wincc-open-architecture-dashboard","frontmatter":{"title":"WinCC Open Architecture Web Dashboard","workplace":"src/pages/work/etm.md","enabled":true,"template":"project","subtitle":"Zur Laufzeit erweiterbare Angular App","highlight":false,"project_url":"https://www.winccoa.com","start":"2020-12-31T23:00:00.000Z","end":null,"thumb_img_path":"/images/project-winccoa.png","excerpt":"Web-App zur Visualisierung, Gestaltung und Konfiguration von Simatic WinCC Open Architecture Projekten.","tools":"Angular, Module Federation, webpack, jest, cypress, websockets, azure pipelines, docker, SVG, OA, git, Scrum","content_img_path":"/images/project-winccoa.png","date":null},"html":""},{"url":"/projects/wincc-open-architecture-webui/","relativePath":"projects/wincc-open-architecture-webui.md","relativeDir":"projects","base":"wincc-open-architecture-webui.md","name":"wincc-open-architecture-webui","frontmatter":{"title":"WinCC Open Architecture WebUI","workplace":"src/pages/work/etm.md","enabled":true,"template":"project","subtitle":"Erweiterbares Web Framework auf Basis von WebComponents","highlight":true,"project_url":"https://www.winccoa.com","start":"2023-03-31T23:00:00.000Z","end":null,"thumb_img_path":"/images/project-winccoa.png","excerpt":"Web-App mit Fokus auf Skalierbarkeit, Sicherheit und Erweiterbarkeit im SCADA Bereich.","tools":"Lit Elements, MicroFrontends, webpack, rollup, wtr, storybook, websockets, azure pipelines, docker, .devcontainer, cloud, SVG, OA, git, Scrum","content_img_path":"/images/project-winccoa.png","date":null},"html":""},{"url":"/showcase/","relativePath":"showcase/index.md","relativeDir":"showcase","base":"index.md","name":"index","frontmatter":{"title":"Projekte","menus":{"main":{"title":"Projekte","weight":2}},"template":"showcase"},"html":""},{"url":"/work/cyrom/","relativePath":"work/cyrom.md","relativeDir":"work","base":"cyrom.md","name":"cyrom","frontmatter":{"title":"","template":"work","company":"Cyrom International Technologies","jobtitle":"Software Entwickler","company_url":"https://www.cyrom.com","branch":"Internet und Informationstechnologie","location":"Wien","start":"2006-01-31T23:00:00.000Z","end":"2012-06-30T22:00:00.000Z","thumb_img_path":"/images/company-cyrom.png","excerpt":"Direkter Kontakt mit internationalen Kunden und Projektpartnern, Miteinführung und Aufbau des agilen Projektmanagements, Konzeption und Weiterentwicklung der Programmumgebung, autonome Lösungserarbeitung für Front- und Backend Funktionen, Einschulen von Mitarbeitern in verschiedene Tools.","tools":"PHP, Apache, MySQL","content_img_path":"/images/company-cyrom.png"},"html":""},{"url":"/qualification/","relativePath":"qualification/index.md","relativeDir":"qualification","base":"index.md","name":"index","frontmatter":{"title":"Ausbildung","menus":{"main":{"title":"Ausbildung","weight":3}},"template":"qualification"},"html":""},{"url":"/work/etm/","relativePath":"work/etm.md","relativeDir":"work","base":"etm.md","name":"etm","frontmatter":{"title":"","enabled":true,"template":"work","company":"ETM professional control GmbH - A Siemens Company","jobtitle":"Senior Web Developer","company_url":"https://www.winccoa.com/company","branch":"Fabrikautomationen","location":"Eisenstadt","start":"2020-12-31T23:00:00.000Z","end":null,"thumb_img_path":"/images/company-etm.png","excerpt":"Umsetzung einer sicheren, modernen, performanten, dokumentierten und erweiterbaren Web-Oberfläche für SCADA/IOT Steuersysteme.","tools":"Angular und WebComponents in Typescript, RxJS, NgRx, nx monorepo, Module Federation, MicroFrontends, WebPack, Storybook, nodeJS, websockets, Tests mit jest und cypress, Pipelines mit Azure Devops und Docker, Infrastructure as code onPremise und in der Cloud, Agile im Scrum Team","content_img_path":"/images/company-etm.png"},"html":""},{"url":"/work/freelancer/","relativePath":"work/freelancer.md","relativeDir":"work","base":"freelancer.md","name":"freelancer","frontmatter":{"title":"","template":"work","company":"Selbständig","jobtitle":"Web Developer und PM","company_url":"https://andreas.pauschenwein.net","branch":"Internet und Informationstechnologie","location":"Burgenland","start":"2012-12-31T23:00:00.000Z","end":null,"thumb_img_path":"/images/about.jpg","excerpt":"Beratung, Planung und Umsetzung verschiedener Projekte im Bereich der Web-IT, mit speziellen Augenmerk auf Sicherheit, Performance und Usability.","tools":"","content_img_path":"/images/about.jpg","enabled":true},"html":""},{"url":"/work/jti/","relativePath":"work/jti.md","relativeDir":"work","base":"jti.md","name":"jti","frontmatter":{"title":"","template":"work","company":"JTI Austria Marketing","jobtitle":"Freier Entwickler","company_url":"https://www.jti.com/de/europe/austria","start":"2012-12-31T23:00:00.000Z","end":"2013-05-31T22:00:00.000Z","thumb_img_path":"/images/company-JTI.png","excerpt":"Erweiterung der bereichs- und markenübergreifenden Datawarehouse-Applikation.","tools":"Oracle, Siebel CRM, jQuery","content_img_path":"/images/company-JTI.png","branch":"Konsumgüter und Handel","location":"Wien"},"html":""},{"url":"/work/mercurypuzzle/","relativePath":"work/mercurypuzzle.md","relativeDir":"work","base":"mercurypuzzle.md","name":"mercurypuzzle","frontmatter":{"title":"","template":"work","company":"MercuryPuzzle UG","jobtitle":"Web Entwickler","company_url":"https://www.mercurypuzzle.com","start":"2012-06-30T22:00:00.000Z","end":"2012-10-31T23:00:00.000Z","thumb_img_path":"/images/company-mercurypuzzle.png","excerpt":"Einbindung von Mail- und Datenschnittstellen, IT Beratung","tools":"PHP, Symfony Framework, SQL via Doctrine, Twig Templates, jQuery","content_img_path":"/images/company-mercurypuzzle.png","branch":"Personaldienstleistungen und -beratung","location":"Wien"},"html":""},{"url":"/work/nospoon/","relativePath":"work/nospoon.md","relativeDir":"work","base":"nospoon.md","name":"nospoon","frontmatter":{"title":"","template":"work","company":"NoSpooN communications","jobtitle":"Software Entwickler","company_url":"http://www.nospoon.at","branch":"Internet und Informationstechnologie","location":"Eisenstadt","start":"2004-03-31T22:00:00.000Z","end":"2005-09-30T22:00:00.000Z","thumb_img_path":"/images/company-nospoon.png","excerpt":"Eigenverantwortliche und selbstständige Tätigkeit, Weiterentwicklung der WEB Oberfläche, Entwurf und Implementierung von Backenddiensten, Zahlungsschnittstellen, SMS Anbindung, Import, Export, Backup Skripte","tools":"Delphi, IIS, Interbase","content_img_path":"/images/company-nospoon.png"},"html":""},{"url":"/work/qnipp/","relativePath":"work/qnipp.md","relativeDir":"work","base":"qnipp.md","name":"qnipp","frontmatter":{"title":"","company":"Qnipp GmbH","jobtitle":"Senior Web Entwickler und PM","company_url":"https://www.qnipp.com","start":"2013-08-31T22:00:00.000Z","end":"2020-02-29T23:00:00.000Z","thumb_img_path":"/images/company-qnipp.png","content_img_path":"/images/company-qnipp.png","excerpt":"Betreuung und Weiterentwicklung unterschiedlicher CMS und CRM Systeme, integration externer Schnittstellen, Kunden- und Mitarbeiterschulungen, Monitoring.","tools":"PHP, MariaDB, git, svn, Selenium, TestNG, Java, ADK, NodeJS, React, CSS, Docker, SOAP, JIRA, kanban, redmine, zabbix","template":"work","branch":"IT Dienstleister","location":"Burgenland","enabled":true},"html":""},{"url":"/work/zadego/","relativePath":"work/zadego.md","relativeDir":"work","base":"zadego.md","name":"zadego","frontmatter":{"title":"","enabled":true,"template":"work","company":"zadego GmbH","jobtitle":"Senior Software Engineer","company_url":"https://www.easybooking.eu/ueber-uns","branch":"Tourismus","location":"Innsbruck, Eisenstadt","start":"2020-02-29T23:00:00.000Z","end":"2020-12-30T23:00:00.000Z","thumb_img_path":"/images/company-zadego.png","excerpt":"Weiterentwicklung an mehreren Frontend- und Backendsystemen rund um das Hauptprojekt: Easybooking.","tools":"PHP, yii, Angular, NodeJs, grunt, SQL, gitlab, trello, Google Cloud Platform (GCP), Unit Tests, Remote Work","content_img_path":"/images/company-zadego.png"},"html":""},{"url":"/posts/docker-ubers-netzwerk/","relativePath":"posts/docker-ubers-netzwerk.md","relativeDir":"posts","base":"docker-ubers-netzwerk.md","name":"docker-ubers-netzwerk","frontmatter":{"title":"Docker übers Netzwerk","date":"2022-01-02T20:04:43.000Z","active":true,"enabled":true,"template":"post","end":null,"subtitle":"Zentrale Versorgung mehrere Docker nodes","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"5min","excerpt":"","canonical_url":""},"html":"<p>Da ich diesen Teil schon öfter an verschiedenen Stellen gebraucht hab, will ichs hier mal festhalten:</p>\n<p>Man kann den docker daemon (die Docker Instanz auf der jeweiligen Maschine) übers Netzwerk freigeben. Das bringt den Vorteil, dass man die Verwaltung mehrerer solcher \"Nodes\" an einer Stelle vornehmen kann.</p>\n<p>unter Raspbian folgende Datei als root bearbeiten:</p>\n<p><code>sudo nano /etc/systemd/system/multi-user.target.wants/docker.service</code></p>\n<p>oder:</p>\n<p><code>sudo nano /lib/systemd/system/docker.service</code></p>\n<p>dann nach ExecStart suchen und am ende <code>-H tcp..</code> einfügen:</p>\n<pre><code>ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock\n</code></pre>\n<p>Danach noch neustarten:</p>\n<pre><code>sudo systemctl daemon-reload\nsudo service docker restart\n</code></pre>\n<p>Dadurch kann man einfach übers Netzwerk auf diesen Docker daemon zugreifen und die vorhandenen Container administrieren.</p>\n<p><strong>Vorsicht:</strong> Mit einfach ist wirklich einfach gemeint - man braucht hier keine weitere Authentifizierung oder einen Benutzer. Der Port ist dann im Gesamten Netzwerk verfügbar und die API kann von jedem bedient werden.</p>\n<p>Wann brauch ich das?</p>\n<ol>\n<li>Docker Extension im VSCODE<br>\nlegt man sich die lokale Umgebungsvariable <strong>DOCKER_HOST</strong> an und befüllt sie mit <strong>tcp://server:2376</strong> kann man sich direkt zu Containern auf dem entsprechenden Server verbinden.</li>\n<li>Mehrere Umgebungen in Portainer<br>\n<a href=\"https://portainer.io\" title=\"Portainer.io\">Portainer</a> ist eine sehr nützliche Web Oberfläche für docker. Eine Umgebung/Environment entspricht dabei einer Node - durch die Freigabe übers Netzwerk kann man alle laufenden bzw. vorfügbaren Container und Images auf unterschiedlichen Rechnern verwalten.</li>\n</ol>\n<p>danke an: <a href=\"https://github.com/portainer/portainer/issues/5151\" title=\"https://github.com/portainer/portainer/issues/5151\">https://github.com/portainer/portainer/issues/5151</a></p>"},{"url":"/posts/coral-edge-tpu-on-synlogy/","relativePath":"posts/coral-edge-tpu-on-synlogy.md","relativeDir":"posts","base":"coral-edge-tpu-on-synlogy.md","name":"coral-edge-tpu-on-synlogy","frontmatter":{"title":"Coral Edge TPU on Synlogy","date":"2021-08-05T22:37:55.000Z","active":false,"enabled":false,"template":"post","end":null,"subtitle":"Tensor Co-Prozessor fürs NAS","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"1w","excerpt":"Coral TPU als Ersatz für die fehlende AVX CPU Unterstützung","canonical_url":""},"html":"<h1>KI am NAS</h1>\n<p>Also..</p>\n<p>mein wackeres NAS hat leider ein Problem: die verbaute, nicht wechselbare CPU unterstützt den AVX Befehlssatz nicht. Dadurch entgehen mir so manche Anwendungsfälle im KI Bereich:</p>\n<ul>\n<li>RASA NLU für die Textauswertung</li>\n<li>mycroft precise für die WakeWord Erkunung</li>\n<li>mozilla deepspeach für die Spracherkennnug</li>\n</ul>\n<p>(wie man sieht, es ist nach wie vor alles sehr Sprach-Assistenten lastig) Es geht hier aber auch generell um alle TensorFlow und PyTorch Anwendungen die zwar auf einem Raspberry laufen, aber eben nicht am NAS.</p>\n<p>Die Lösungsidee wäre einen eigenen CoProzessor ans NAS zu hängen, der diese fehlende Unterstützung nachreicht. zbsp. die <a href=\"https://coral.ai/products/accelerator\">Edge TPU von Coral.ai</a></p>\n<h2>installation Edge TPU:</h2>\n<p><a href=\"https://github.com/google-coral/edgetpu\" title=\"https://github.com/google-coral/edgetpu\">https://github.com/google-coral/edgetpu</a></p>\n<p><a href=\"https://github.com/google-coral/libedgetpu\" title=\"https://github.com/google-coral/libedgetpu\">https://github.com/google-coral/libedgetpu</a></p>\n<pre><code>DOCKER_CPUS=\"k8\" DOCKER_IMAGE=\"ubuntu:18.04\" DOCKER_TARGETS=libedgetpu make docker-build\nDOCKER_CPUS=\"aarch64\" DOCKER_IMAGE=\"debian:stretch\" DOCKER_TARGETS=libedgetpu make docker-build\n</code></pre>\n<p><a href=\"https://coral.ai/docs/notes/build-coral/#build-the-tf-lite-runtime-tflite_runtime\" title=\"https://coral.ai/docs/notes/build-coral/#build-the-tf-lite-runtime-tflite_runtime\">https://coral.ai/docs/notes/build-coral/#build-the-tf-lite-runtime-tflite_runtime</a></p>\n<pre><code>sudo mkdir /usr/lib/x86_64-linux-gnu/\nsudo cp out/direct/k8/* /usr/lib/x86_64-linux-gnu/\n\nsudo ldconfig &#x3C;- gibts nicht\nsudo lsusb -cUi\n</code></pre>\n<p><a href=\"https://coral.ai/docs/notes/build-coral/#no-module-named-tflite_runtime\" title=\"https://coral.ai/docs/notes/build-coral/#no-module-named-tflite_runtime\">https://coral.ai/docs/notes/build-coral/#no-module-named-tflite_runtime</a></p>\n<p>see troubleshooting</p>\n<p><a href=\"https://github.com/tensorflow/tensorflow/issues/32743#issuecomment-543806766\" title=\"https://github.com/tensorflow/tensorflow/issues/32743#issuecomment-543806766\">https://github.com/tensorflow/tensorflow/issues/32743#issuecomment-543806766</a></p>\n<pre><code>sudo usermod -aG plugdev [your username]  &#x3C;- gibts nicht\n</code></pre>"},{"url":"/posts/cypress-e2e-testing-in-der-wsl2/","relativePath":"posts/cypress-e2e-testing-in-der-wsl2.md","relativeDir":"posts","base":"cypress-e2e-testing-in-der-wsl2.md","name":"cypress-e2e-testing-in-der-wsl2","frontmatter":{"title":"cypress e2e testing in der WSL2","date":"2021-02-09T15:02:48.000Z","active":false,"enabled":false,"template":"post","end":null,"subtitle":"","highlight":false,"project_url":"","thumb_img_path":"","content_img_path":"","gallery":[],"estimated_time":"","excerpt":"","canonical_url":""},"html":"<p>sudo apt-get update</p>\n<p><a href=\"https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#chrome-headless-doesnt-launch-on-unix\" title=\"https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#chrome-headless-doesnt-launch-on-unix\">https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#chrome-headless-doesnt-launch-on-unix</a></p>\n<p>sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils</p>\n<p><a href=\"https://docs.cypress.io/guides/guides/continuous-integration.html#Dependencies\" title=\"https://docs.cypress.io/guides/guides/continuous-integration.html#Dependencies\">https://docs.cypress.io/guides/guides/continuous-integration.html#Dependencies</a></p>\n<p>sudo apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb</p>"}],"site":{"siteMetadata":{"title":"Andreas Pauschenwein","layout_style":"overflow","palette":"orange","siteUrl":"https://andreas.pauschenwein.net","header":{"title":"Andreas Pauschenwein","tagline":"full-stack dev","profile_img":"/images/avatar.png","bg":"dark","has_nav":true,"has_social":true},"footer":{"content":"&copy; All rights reserved.","links":[{"text":"Made with ❤","url":"https://www.stackbit.com","new_window":true}]}},"pathPrefix":"","data":{"author":{"name":"Andreas Pauschenwein","email":"andreas@pauschenwein.net","avatar":"/images/avatar.png","hobbies":["Haus Automatisierung","GameJams","KI und LLM","Photographie","und die Kids"],"languages":["Deutsch: Muttersprache","Englisch: C1 - Advanced","Italienisch: Anfänger"]},"menus":{},"social":{"links":[{"type":"github","title":"GitHub","icon":"fa-github","url":"https://github.com/h4de5"},{"type":"linkedin","title":"LinkedIn","icon":"fa-linkedin","url":"https://www.linkedin.com/in/pauschi/"},{"type":"xing","title":"Xing","icon":"fa-xing","url":"https://www.xing.com/profile/Andreas_Pauschenwein"}]}}},"menus":{"main":[{"page___NODE":"329f6eb8-ca30-5c02-8921-19623541f94e","id":"menu-main-index","identifier":"main-index","title":"Home","weight":1,"url":"/","items":[]},{"page___NODE":"335918ae-1679-5f62-9b83-46546a5c71ab","id":"menu-main-showcase-index","identifier":"main-showcase-index","title":"Projekte","weight":2,"url":"/showcase/","items":[]},{"page___NODE":"80c38b1e-34ea-59a6-a2af-aec8c2f000ef","id":"menu-main-qualification-index","identifier":"main-qualification-index","title":"Ausbildung","weight":3,"url":"/qualification/","items":[]},{"page___NODE":"d1277c41-b54d-5c3c-a113-17e493c5a721","id":"menu-main-cv-index","identifier":"main-cv-index","title":"Lebenslauf","weight":4,"url":"/cv/","items":[]},{"page___NODE":"fa117f50-bfef-5bac-b5fe-1188e35b8e3f","id":"menu-main-about","identifier":"main-about","title":"Über mich","weight":5,"url":"/about/","items":[]},{"page___NODE":"6a1592c9-45bc-5f0c-ad40-e8815734f2b6","id":"menu-main-contact","identifier":"main-contact","title":"Kontakt","weight":6,"url":"/contact/","items":[]},{"page___NODE":"e6b00388-52c1-5a6d-9420-a03c6ae38219","id":"menu-main-blog-index","identifier":"main-blog-index","title":"Blog","weight":7,"url":"/blog/","items":[]}],"not-main":[{"page___NODE":"4ddba99b-0c83-52b3-978f-26b6c0d548fb","id":"menu-not-main-style-guide","identifier":"not-main-style-guide","title":"Style Guide","weight":3,"url":"/style-guide/","items":[]}]}}},
    "staticQueryHashes": []}