<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dennis Ploeger</title>
    <description>The latest articles on DEV Community by Dennis Ploeger (@dploeger).</description>
    <link>https://dev.to/dploeger</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F80631%2F28cc809c-a845-460e-8ab9-9fa5e64d9990.jpeg</url>
      <title>DEV Community: Dennis Ploeger</title>
      <link>https://dev.to/dploeger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dploeger"/>
    <language>en</language>
    <item>
      <title>Github Action for the Godot Asset library</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sun, 04 Apr 2021 10:42:28 +0000</pubDate>
      <link>https://dev.to/dploeger/github-action-for-the-godot-asset-library-ch1</link>
      <guid>https://dev.to/dploeger/github-action-for-the-godot-asset-library-ch1</guid>
      <description>&lt;p&gt;Just a quick announcement: If somebody uses Github to store their assets for the Godot asset library, I created a Github actions to push new release to there. It depends on the Asset library REST API.&lt;/p&gt;

&lt;p&gt;Check it out:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/deep-entertainment"&gt;
        deep-entertainment
      &lt;/a&gt; / &lt;a href="https://github.com/deep-entertainment/godot-asset-lib-action"&gt;
        godot-asset-lib-action
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A github action to manage assets on the Godot asset lib
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Godot asset lib action&lt;/h1&gt;
&lt;p&gt;This github action manages assets in the
&lt;a href="https://godotengine.org/asset-library/asset" rel="nofollow"&gt;Godot asset library&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Inputs&lt;/h2&gt;
&lt;h3&gt;
&lt;code&gt;action&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; The action to carry out. Currently, these actions
are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;addEdit: Add an asset edit. Requires the assetId input. Expects that you
have created the asset previously with all the basic information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Default&lt;/em&gt;: addEdit&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;username&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; The username for the asset library&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;password&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; The password for the asset library. It's recommeded
to use a secret.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;assetId&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; The id of the asset in the asset store&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;assetTemplate&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; A &lt;a href="https://handlebarsjs.com/" rel="nofollow"&gt;handlebars&lt;/a&gt; template
file that will provided with the webhook context of the
action. See the &lt;a href="https://octokit.github.io/webhooks/index.json" rel="nofollow"&gt;webhook&lt;/a&gt;
reference file for details.&lt;/p&gt;
&lt;p&gt;The resulting file should fit the Asset model. See
&lt;a href="https://github.com/godotengine/godot-asset-library/blob/master/API.md"&gt;the asset library rest api documentation&lt;/a&gt;
for details.&lt;/p&gt;
&lt;p&gt;The token will be injected by the action.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Default&lt;/em&gt;: .asset-template.json.hb&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;baseUrl&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt; Base URL for the godot asset lib.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Default&lt;/em&gt;: &lt;a href="https://godotengine.org/asset-library/api" rel="nofollow"&gt;https://godotengine.org/asset-library/api&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Outputs&lt;/h2&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/deep-entertainment/godot-asset-lib-action"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>github</category>
      <category>godot</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Announcing EgoVenture</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sat, 27 Mar 2021 18:13:10 +0000</pubDate>
      <link>https://dev.to/dploeger/announcing-egoventure-12nd</link>
      <guid>https://dev.to/dploeger/announcing-egoventure-12nd</guid>
      <description>&lt;h1&gt;
  
  
  The past
&lt;/h1&gt;

&lt;p&gt;I've always been a big fan of the Carol Reed series of adventure games by &lt;a href="https://mdna-games.com" rel="noopener noreferrer"&gt;MDNA games&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In case you don't know them: Carol's a private detective solving cases in and around the Swedish town of Norrköping. The game mainly consists of a lot of professional-grade photographs that you wander through in perfect point and click manner while collecting items and solving puzzles. The stories are compelling, gripping and fun and walking around in run-down factories is just the right amount of creepiness I need.&lt;/p&gt;

&lt;p&gt;The games are made using the &lt;a href="http://dead-code.org/home/" rel="noopener noreferrer"&gt;Wintermute engine&lt;/a&gt;, which saw its last release over ten years ago at the time of this writing. Wintermute can only create games for the windows operating system.&lt;/p&gt;

&lt;p&gt;Being a macOS aficionado I contacted developer Mikael Nyqvist some years ago because I could run his games using Wine on macOS. This was the beginning of a nice partnership where I would recompile his games for macOS and also take some voice parts in the games.&lt;/p&gt;

&lt;p&gt;With Apple dropping support for 32 bit software and Wine only slowly catching up with Catalina two years ago and now dropping the i386 platform, this became a burden.&lt;/p&gt;

&lt;p&gt;Meanwhile in Sweden, Mikael also was looking for better scalability and broader platform support.&lt;/p&gt;

&lt;p&gt;When I sparked a discussion about moving his games to a new engine after getting more intimate with the &lt;a href="https://godotengine.org" rel="noopener noreferrer"&gt;Godot game engine&lt;/a&gt;, things just clicked.&lt;/p&gt;

&lt;p&gt;Together we worked down a list of features he needed for his games - which honestly was much more than I expected. However, one feature at a time, we could cross out all things on his list and create a framework for Godot, that would allow easy creation of things just like the Carol Reed series.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Present
&lt;/h1&gt;

&lt;p&gt;Thankfully, Mikael was always aboard to release the source code and even the sample game with his art under open licenses (MIT and CC-BY-SA).&lt;/p&gt;

&lt;p&gt;So today, Deep Entertainment together with MDNA Games would like to announce:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ii5o5cdcqby62x6uf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ii5o5cdcqby62x6uf6.png" alt="EgoVenture Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/deep-entertainment/egoventure" rel="noopener noreferrer"&gt;&lt;strong&gt;EgoVenture&lt;/strong&gt; - First person point and click adventure framework for Godot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;EgoVenture&lt;/em&gt; is a base framework, that takes care of the most basic tasks each game needs, namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main menu&lt;/li&gt;
&lt;li&gt;Game options&lt;/li&gt;
&lt;li&gt;State and savegame handling&lt;/li&gt;
&lt;li&gt;Scene management&lt;/li&gt;
&lt;li&gt;Inventory handling&lt;/li&gt;
&lt;li&gt;Mouse and touch screen support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and more.&lt;/p&gt;

&lt;p&gt;Additionally, its accompanying Godot addons &lt;a href="https://github.com/deep-entertainment/parrot" rel="noopener noreferrer"&gt;Parrot&lt;/a&gt; and &lt;a href="https://github.com/deep-entertainment/speedy_gonzales" rel="noopener noreferrer"&gt;Speedy Gonzales&lt;/a&gt; complete the games with dialog handling and custom mouse cursors.&lt;/p&gt;

&lt;p&gt;Starting a game with &lt;em&gt;EgoVenture&lt;/em&gt; is easy using the &lt;a href="https://github.com/deep-entertainment/egoventure-game-template" rel="noopener noreferrer"&gt;&lt;em&gt;EgoVenture&lt;/em&gt; game template&lt;/a&gt;. Check out the &lt;a href="https://github.com/deep-entertainment/egoventure/blob/master/docs/getting_started.md" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to see all the features that are possible using &lt;em&gt;EgoVenture&lt;/em&gt;, please check out the &lt;a href="https://github.com/deep-entertainment/egoventure-example-game" rel="noopener noreferrer"&gt;&lt;em&gt;EgoVenture&lt;/em&gt; Example Game&lt;/a&gt; made by MDNA games. Up to date releases for Windows, macOS and Linux are available on its own &lt;a href="https://deepgames.itch.io/carol-refurbished" rel="noopener noreferrer"&gt;itch.io page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, all addons, the example game and the game template, are available in the Godot asset library.&lt;/p&gt;

&lt;h1&gt;
  
  
  The future
&lt;/h1&gt;

&lt;p&gt;Mikael has already started creating the new game for 2021 and will be using the &lt;em&gt;EgoVenture&lt;/em&gt; engine, so we can expect something awesome in the near future.&lt;/p&gt;

&lt;p&gt;Additionally, with &lt;em&gt;EgoVenture&lt;/em&gt; and all accompanying addons being released under an open source license, we encourage other game developers to use the framework and if anything happens or questions arise, please don't hesitate open an issue in the respective issue tracker.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
    </item>
    <item>
      <title>Feather &gt; Sword</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Fri, 29 Jan 2021 10:24:58 +0000</pubDate>
      <link>https://dev.to/dploeger/feather-sword-48a5</link>
      <guid>https://dev.to/dploeger/feather-sword-48a5</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@hudsoncrafted?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Debby Hudson&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're living in a world of information overload. Do you know how they say, that the feather is mightier than the sword? Well, I'd like to add, that a gazillion of feathers lying around, some broken in two, some burned beyond recognition and some nails in a feather costume makes the feather loose all its power again.&lt;/p&gt;

&lt;p&gt;In these times, you're able to know just about everything, but it's getting harder and harder to &lt;em&gt;find&lt;/em&gt; the &lt;em&gt;right&lt;/em&gt; and &lt;em&gt;up to date&lt;/em&gt; information.&lt;/p&gt;

&lt;p&gt;I think, this is true for the world in general, but also in the micro cosmos of most teams or departments nowadays.&lt;/p&gt;

&lt;p&gt;There's no problem in &lt;em&gt;having&lt;/em&gt; information and documentation, but in having &lt;em&gt;good&lt;/em&gt; and &lt;em&gt;usable&lt;/em&gt; documentation.&lt;/p&gt;

&lt;p&gt;This was (and in some parts still is) a problem we had with the IT-Department at KPS.&lt;/p&gt;

&lt;p&gt;And this is how we tackled that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who we are
&lt;/h2&gt;

&lt;p&gt;We're the IT department of KPS. KPS is a consultancy company who helps its customers on their digital transformation journey. We support the complete infrastructure ranging from network access, datacenter management, routing, Linux and Windows server management, platform management to user support and DevOps project consultancy.&lt;/p&gt;

&lt;p&gt;We're divided into four teams to evenly balance the different aspects of our work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we were
&lt;/h2&gt;

&lt;p&gt;Originally coming from a merger of two companies team members were used to different documentation tools and ways of documenting. Thus, we had various places to look up information and various levels of quality throughout the different documents.&lt;/p&gt;

&lt;p&gt;After we finally agreed to a central documentation space and tool, we migrated most of these documents. This made all information accessible at one place, but the lack of a standardized document quality still made it hard to find the right documentation.&lt;/p&gt;

&lt;p&gt;And we struggled with it. So finally, we gathered together to form a documentation taskforce who should suggest a common standard for documentation for the IT department.&lt;/p&gt;

&lt;p&gt;In this documentation taskforce we put members of all teams who knew something about their team's own previous documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting is hard
&lt;/h2&gt;

&lt;p&gt;So there we were. Left with a heap of documentation and trying to figure out how we should deal with it.&lt;/p&gt;

&lt;p&gt;The first thing we did is to take a step back and look at &lt;em&gt;what&lt;/em&gt; we want documented. What different types of documentation do we need for &lt;em&gt;our&lt;/em&gt; daily work and for our &lt;em&gt;customers&lt;/em&gt; daily work?&lt;/p&gt;

&lt;p&gt;So we defined those different documentation types. For example, because we are supporting our customers and their workplace infrastructure we had some documents for self service. These documents showed our customers step-by-step explanation to common problems or how to install a new system or app on their computers.&lt;/p&gt;

&lt;p&gt;Then, we have a team that builds up networking infrastructure needing infrastructure diagrams to better grasp what different parts they're managing and how to solve problems in that.&lt;/p&gt;

&lt;p&gt;Of course we're doing meetings from time to time so there were meeting notes.&lt;/p&gt;

&lt;p&gt;Et cetera, et cetera, et cetera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking down document types
&lt;/h2&gt;

&lt;p&gt;So for each of these document types (in the end, we defined 13 different types) we asked ourselves what &lt;em&gt;elements&lt;/em&gt; each type usually has.&lt;/p&gt;

&lt;p&gt;Is there a page header in a guideline document? Absolutely. Does an infrastructure documentation have a schematic layout? You betcha. Does meeting notes have screenshots? Mostly not.&lt;/p&gt;

&lt;p&gt;Mind you, these elements are &lt;em&gt;common&lt;/em&gt;. It &lt;em&gt;can&lt;/em&gt; happen, that a meeting note &lt;em&gt;has&lt;/em&gt; some kind of screenshot, but it's probably unusual.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Suggesting" instead of "Defining"
&lt;/h2&gt;

&lt;p&gt;Remember that I said "(the taskforce) should &lt;em&gt;suggest&lt;/em&gt; a common standard" and not &lt;em&gt;define&lt;/em&gt;? That was on purpose.&lt;/p&gt;

&lt;p&gt;Throughout the whole process we were absolutely sure about one fact:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody wants to do documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So we had in mind, that we had to make the barrier for documentation as low as possible. We wanted to make it &lt;em&gt;easy&lt;/em&gt; for people do document &lt;em&gt;correctly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's why we made suggestions on how to make good documentation, and didn't define it. It should be a team process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The styleguide
&lt;/h2&gt;

&lt;p&gt;After we had gathered all elements available in the different document types we needed to write down how these elements should look and what they should contain.&lt;/p&gt;

&lt;p&gt;And in most cases, this is a matter of taste. However, there are certain aspects, that one should keep in mind when writing technical documentation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be aware of your audience&lt;/strong&gt;. Who will be reading your documentation? What set of skills do they have? Are they common to technical terms? Are they common to &lt;em&gt;specific&lt;/em&gt; technical terms? What language is their native tongue?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't be fancy&lt;/strong&gt;. You're writing technical documentation, not a children's book. You don't need fancy colors, thirteen different fonts or sparkle effects (Though they're pretty cool) Keep it nice and short&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You're not the reader&lt;/strong&gt;! In most of the time and most of the documents you will write, you won't be the actual one reading them. Those are your colleagues, your users or managers. Write for &lt;em&gt;them&lt;/em&gt;, not for you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep your style&lt;/strong&gt;. Changing document formats, layouts or styles with every document is very hard on the eye. Your readers need to feel home with every new document. They need to know what is coming up.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://docs.godotengine.org/en/stable/community/contributing/docs_writing_guidelines.html#doc-docs-writing-guidelines"&gt;Godot game engine documentation&lt;/a&gt; has a good reference for writing and styling technical documentation. As it is a multipurpose game engine with a very diverse and international audience, they really put some thoughts in that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Language!
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://en.wikipedia.org/wiki/Language"&gt;Wikipedia&lt;/a&gt;, the world has an estimated amount of 5,000 to 7,000 spoken languages. But language goes further than just wether you're speaking French, English, Latvian or &lt;a href="https://en.wikipedia.org/wiki/Shona_language"&gt;Shona&lt;/a&gt;. Different people in different tongues not only have a different vocabulary but also different ways of describing and reacting to topics.&lt;/p&gt;

&lt;p&gt;Thanks to English being the &lt;a href="https://en.wikipedia.org/wiki/World_language"&gt;language with about 1.2 billion speakers worldwide&lt;/a&gt;, most documentation nowadays ist written in english and then usually translated from that.&lt;/p&gt;

&lt;p&gt;However, simply writing in english usually doesn't do the trick. Especially when you're writing for people who are not fluent in it. I like to cite the aforementioned Godot docs writing guidelines here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A technical writer's job is to pack as much information as possible into the smallest and clearest sentences possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Smallest&lt;/em&gt; and &lt;em&gt;clearest&lt;/em&gt;. This is a technical doc, it shouldn't transport emotions of the author (like a novel) or entertain (like a children's book). It should simply contain all required information in the most &lt;em&gt;clear&lt;/em&gt; and &lt;em&gt;understandable&lt;/em&gt; way.&lt;/p&gt;

&lt;p&gt;But still, languages as spoken languages need to be taken into account as well.&lt;/p&gt;

&lt;p&gt;If you're aware that your readers are not fluent enough to read a full-fletched english documentation (even if you write short and clear), you need to translate the documents.&lt;/p&gt;

&lt;p&gt;As said before, we wanted to keep the barriers of documenting low so we can motivate and engage colleagues to actually write documentation.&lt;/p&gt;

&lt;p&gt;Because most of our colleagues have german as their native tongue, we agreed to use german for internal documents that don't span outside our department.&lt;/p&gt;

&lt;p&gt;However, we also write documentation for our users and we're an international company so for those documents we agreed on writing the docs &lt;em&gt;in english only&lt;/em&gt; (just so that we don't have to write docs twice).&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem with structure. The.
&lt;/h2&gt;

&lt;p&gt;When a tree falls but nobody's around, does it make a sound? When a document is written but nobody finds it, was it written in the first place?&lt;/p&gt;

&lt;p&gt;The task of properly structuring things is a life long task of humanity. There are literally thousands of apps in the "productivity" category that basically just try to structure things.&lt;/p&gt;

&lt;p&gt;It's like the holy grail.&lt;/p&gt;

&lt;p&gt;And, honestly, we didn't find it.&lt;/p&gt;

&lt;p&gt;Instead we agreed on two things, which may look like it, but could as well just be a gold-colored plastic cup.&lt;/p&gt;

&lt;p&gt;The first thing was using &lt;em&gt;tags&lt;/em&gt;. Tags are not a thing of the #internet, by the way. Tags have a long tradition in bibliography (where they're called index terms). They condense the content of a document into one or more words. Multiple documents share common tags and thus aid in navigation to related documentation.&lt;/p&gt;

&lt;p&gt;Also, tags are a great way of suggesting search words for the internal search of your documentation tool.&lt;/p&gt;

&lt;p&gt;So we recommended setting &lt;em&gt;meaningful&lt;/em&gt;, &lt;em&gt;short&lt;/em&gt; and &lt;em&gt;few&lt;/em&gt; tags for each document. And to reuse existing ones (Our documentation tool suggests existing tags when typing the name of a tag).&lt;/p&gt;

&lt;p&gt;The second thing was &lt;em&gt;suggesting&lt;/em&gt; a documentation structure. I emphasized &lt;em&gt;suggesting&lt;/em&gt;, because we really couldn't dictate any kind of structure for our department as a whole. We recommended a common top level structure, which was basically a department-wide section followed by team-wide sections. The team sections were free to be filled by the individual teams, while the common section was a bit more restricted.&lt;/p&gt;

&lt;p&gt;We came up with the following suggestion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Common&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Team A&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topic&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subtopic (optional)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document type&lt;/li&gt;
&lt;li&gt;Document&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Team B&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each level we recommended using a macro (a programmed function in our documentation tool) that lists all child documents of the level. That way you have a nice overview of all your topics, or all document types or all documents of a certain document type for a topic.&lt;/p&gt;

&lt;p&gt;We know, that this might not be optimal for each and everyone, but &lt;em&gt;at least it is a start&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping up with the community
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A wiki is a hypertext publication collaboratively edited and managed by its own audience directly using a web browser&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Wiki"&gt;Wiki - Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 1994 Ward Cunningham developed the first Wiki system (WikiWikiWeb) and it introduced a whole new way of collaboration when writing documentation. It allowed to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;comment and discuss on documents&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;make editing available to everybody&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;introduced proper versioning for digital documents&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well, looking at how often I put links to the english Wikipedia into this document, I guess the system was successful.&lt;/p&gt;

&lt;p&gt;We embraced the basics of Wiki-documentation for our documentation as well: We saw that we're one team so we didn't need any restrictions to documents. Everybody could see, edit and comment any document in our internal space.&lt;/p&gt;

&lt;p&gt;I'm absolutely sure, that allowing edits from as many people as possible helps creating up-to-date and vibrant documents.&lt;/p&gt;

&lt;p&gt;Additionally, with documents for users we allowed comments on them as well so they could suggest better documentation from their point of view.&lt;/p&gt;

&lt;p&gt;Speaking of point of view: &lt;strong&gt;Always&lt;/strong&gt; let somebody else read your document before it reaches a "published" state. Writing a document is dumping your brain into text. But it is &lt;em&gt;your&lt;/em&gt; brain and that can very much differ from another person's brain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we are
&lt;/h2&gt;

&lt;p&gt;Finally, we put this all together into a new document that obeyed the style we suggested and presented that to our colleagues for comments.&lt;/p&gt;

&lt;p&gt;Most of our suggestions and recommendations were directly approved and some required some more discussion.&lt;/p&gt;

&lt;p&gt;In the end we created a "documentation guideline" from this document that needs to be followed by the complete department when writing documentation. As this was a team effort and we kept the barriers low, the complete department was "in the boat" for making this documentation happen.&lt;/p&gt;

&lt;p&gt;Now, changing a massive load of already existing documents isn't a thing that comes overnight, but we layed the ground for new documents and reworks of existing documents so gradually our documentation will shine more and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parting suggestions
&lt;/h2&gt;

&lt;p&gt;Let me give you some nifty (or not so nifty, you decide) tidbits from our guideline. Again, this is our documentation, suited to our needs, so effectively: YMMV.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document states
&lt;/h3&gt;

&lt;p&gt;It is essential, that documentation is &lt;em&gt;up to date&lt;/em&gt;. However, we live in a world where being &lt;em&gt;up to date&lt;/em&gt; is fairly impossible because everything changes everywhere at any time - especially in the IT business.&lt;/p&gt;

&lt;p&gt;So documentation will be out of date at some point. The important thing here is to &lt;em&gt;let the reader know&lt;/em&gt;, that it is.&lt;/p&gt;

&lt;p&gt;For this, we're using document states.&lt;/p&gt;

&lt;p&gt;Every new document starts in the &lt;em&gt;draft&lt;/em&gt; state. Things are highly uncertain, incorrect, incomplete and sometimes incoherent. &lt;strong&gt;Don't trust this document&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After a possible review process (which we kept as small as possible. Remember, barriers?) a document moves into the &lt;em&gt;published&lt;/em&gt; state. This document is complete, correct and trustable.&lt;/p&gt;

&lt;p&gt;Then, time happens and things get out of control.&lt;/p&gt;

&lt;p&gt;At some time, a document might move into one of the &lt;em&gt;obsolete&lt;/em&gt; or &lt;em&gt;rework&lt;/em&gt; states.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Obsolete&lt;/em&gt; documents are basically trash. They're not applicable, not correct or not usable anymore. They just outgrew their purpose. And that's okay. Nothing bad about that. The reader just has to know that.&lt;/p&gt;

&lt;p&gt;Usually, obsolete documents are - after a short discussion with the responsible team - removed. We decided &lt;strong&gt;against&lt;/strong&gt; archiving on purpose, because in real life, archived documents are never read or touched again. So why keep them?&lt;/p&gt;

&lt;p&gt;Documents in the &lt;em&gt;rework&lt;/em&gt; state are still applicable, just not completely correct or usable anymore. They should be updated later (gamified documentation days ftw!) and the reader can still use them, but should probably be on the lookout for problems or errors that might arise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of contents
&lt;/h3&gt;

&lt;p&gt;Having a table of contents (&lt;em&gt;toc&lt;/em&gt;) is &lt;strong&gt;so&lt;/strong&gt; important. Not only for quickly referencing parts of a documentation, but also for a new reader starting to read the document.&lt;/p&gt;

&lt;p&gt;A toc helps the reader to plan ahead how much time reading a document will take and how much information they can gather from a document.&lt;/p&gt;

&lt;p&gt;Also, &lt;em&gt;meaningful&lt;/em&gt; section headers are pretty important as well. A toc with bogus headers just could be left out at all (don't take this post as an example. This is a post and no technical document)&lt;/p&gt;

&lt;h3&gt;
  
  
  Templates
&lt;/h3&gt;

&lt;p&gt;Whenever possible in your documentation tool of choice, use templates. We created a template for every document type we had and included examples (using comment blocks which are not visible on the rendered page) for each section.&lt;/p&gt;

&lt;p&gt;This way, authors knew what they had to do and could just drain their brain into the preformatted sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't reinvent the wheel
&lt;/h3&gt;

&lt;p&gt;Good documentation has been around for ages. You know these strange things made out of processed wood? With these letters on them? BOOKS! Yes, that's what they call them.&lt;/p&gt;

&lt;p&gt;When you create your style guide, check out how authors did things years and years ago. For example, the proper use of typography is the same in every technical book you find around. There are guidelines for when to use &lt;em&gt;emphasis&lt;/em&gt;, &lt;code&gt;code styles&lt;/code&gt;and so on.&lt;/p&gt;

&lt;p&gt;Check out your favorite search engine and look those up. Or just, you know, open some of those... books.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility
&lt;/h3&gt;

&lt;p&gt;I like to point out that you should be thinking of making your document accessible to everybody.&lt;/p&gt;

&lt;p&gt;That not only includes absolutely important things like proper color choices for visually impaired folks and alternative texts for images, so that your documents can be understood by screen readers but also making sure, that all aspects of a document are accessible to readers and authors.&lt;/p&gt;

&lt;p&gt;Take a graphic illustration for example. If you use an external software for creating that: Does every author have access to that software and to the base document you used to create it?&lt;/p&gt;

&lt;p&gt;Use existing plugins for documentation tools that allow direct editing graphics inside a document instead.&lt;/p&gt;

&lt;p&gt;And don't forget about links! You can use them for reference or to break things with various aspects into different documents and link to them. For example, you might have documented the installation guide to a system and now you create a user documentation for it. You don't need the installation guide there, but for a colleague who maintains the system, it might be interesting nevertheless. So: link it!&lt;/p&gt;

&lt;h2&gt;
  
  
  The future is yet to come
&lt;/h2&gt;

&lt;p&gt;Documentation is never &lt;em&gt;over&lt;/em&gt;, it merely keeps evolving.&lt;/p&gt;

&lt;p&gt;To keep up to date and not loose tracks we didn't break up the documentation taskforce. We made a recurring appointment that can be canceled, if nobody has anything to say, but it's there to remind us to keep our documentation suggestions up to date just like our documentation itself.&lt;/p&gt;

&lt;p&gt;Another thing we added was &lt;a href="https://github.com/dodevops/confluence-outdated"&gt;a tool, that could regularly tell us about outdated documents&lt;/a&gt;. Some (defineable) time after the document has been created, it will notify us so that we can validate it and set document states accordingly.&lt;/p&gt;

&lt;p&gt;This is something we introduced, but not really tested well.&lt;/p&gt;

&lt;p&gt;But in the end, this was a fun journey and a very productive one as well.&lt;/p&gt;

&lt;p&gt;Yes, documentation is not &lt;em&gt;sexy&lt;/em&gt;, but having the right, good, well readable and up to date document at hand when you're deep in horse dung on a production system already comes pretty close.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>So I released an Adventure Game</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sun, 06 Dec 2020 19:58:23 +0000</pubDate>
      <link>https://dev.to/dploeger/so-i-released-an-adventure-game-4do5</link>
      <guid>https://dev.to/dploeger/so-i-released-an-adventure-game-4do5</guid>
      <description>&lt;h1&gt;
  
  
  Today
&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://adventurexpo.org/"&gt;AdventureX&lt;/a&gt; is a yearly conference for narrative games. This year (for obvious reasons) there was no conference. Instead, the organizers had the idea of a &lt;a href="https://itch.io/jam/advxjam"&gt;game jam&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In case you don't know, a game jam is something like a sprint in the developer world. It's a defined time slot (of usually two weeks) in which you have to complete a playable game.&lt;/p&gt;

&lt;p&gt;The AdvXJam obviously requires games to be in the narrative genre (like visual novel, point and click adventure, etc.) and featured a topic: "Good Times".&lt;/p&gt;

&lt;p&gt;But let's turn the clocks back to start of Covid-19.&lt;/p&gt;

&lt;h1&gt;
  
  
  April
&lt;/h1&gt;

&lt;p&gt;There are a lot of game jams actually - usually organized over the game platforms &lt;a href="https://itch.io/jams"&gt;itch.io&lt;/a&gt; or &lt;a href="https://jams.gamejolt.com/"&gt;gamejolt&lt;/a&gt; and &lt;a href="https://discordapp.com/"&gt;Discord&lt;/a&gt;. One specific, quite known jam in the narrative game genre is the AdventureJam.&lt;/p&gt;

&lt;p&gt;I've always had an eye on the indie adventure developer scene and always wanted to release a narrative game myself, but could never really follow it through.&lt;/p&gt;

&lt;p&gt;So I thought, maybe I needed a team of fellow artists and together we could actually make a game.&lt;/p&gt;

&lt;p&gt;That's why this year I dipped my toes in the jam scene and joined the AdventureJam - as a voice actor (I'm a &lt;a href="https://dennis.dieploegers.de/artist"&gt;hobbyist voice actor&lt;/a&gt; since I joined the cast of &lt;a href="https://mdna-games.com"&gt;the Carol Reed series&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;And it was so much fun and I learned a lot.&lt;/p&gt;

&lt;p&gt;After it was done I thought, that I really like to make my own game for the jam with a team. I remembered an old &lt;a href="https://github.com/dploeger/theletter/blob/master/design/shortstory/The%20Letter.pdf"&gt;short story&lt;/a&gt; I wrote around twenty five years ago back in school and thought that this story might have potential for a game.&lt;/p&gt;

&lt;p&gt;I started to write a game design document, but again lost the interest in it...&lt;/p&gt;

&lt;h1&gt;
  
  
  November
&lt;/h1&gt;

&lt;p&gt;So AdvXJam came and, again, I offered voice acting services.&lt;/p&gt;

&lt;p&gt;And then I saw &lt;a href="https://sallybeaumont.com/"&gt;Sally Beaumonts post&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Si2GvxQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ja18x68rc7kbfen0vkdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Si2GvxQz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ja18x68rc7kbfen0vkdg.png" alt="Ahoy hoy- I’m available as a voice actor AND writer! I’m also here if you need advice about adding voice acting to your jam game (jams are a great place to try it out)- I’ll start with plugging my own AdvX talk about working with voices for the first time: "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I thought, that I could ask Sally if she'd be up to turn my old short story into a game.&lt;/p&gt;

&lt;p&gt;Well, she was.&lt;/p&gt;

&lt;h1&gt;
  
  
  The team
&lt;/h1&gt;

&lt;p&gt;So I had Sally on board who also took over voice casting, because she's a professional voice artist.&lt;/p&gt;

&lt;p&gt;Then I saw, that &lt;a href="https://www.youtube.com/channel/UC5TfSQAcC5UEOf7s5lqX2eA"&gt;Rikard Peterson&lt;/a&gt; was offering his services as a musician and found his music to match perfectly a specific scene in the story and asked him if he'd like to join the team and produce the music for the game and we instantly clicked.&lt;/p&gt;

&lt;p&gt;And then I had another member for the team: My son wanted to join as well and draw the characters for the game!&lt;/p&gt;

&lt;p&gt;The last one joining the team was &lt;a href="http://www.cade-conkle.com/"&gt;Cade Conkle&lt;/a&gt; who supported us with awesome sound effects.&lt;/p&gt;

&lt;h1&gt;
  
  
  The rest
&lt;/h1&gt;

&lt;p&gt;Well, if you know narrative games, you know, that writing, music and sound aren't the only disciplines required for such a game.&lt;/p&gt;

&lt;p&gt;So the rest would be: background art, animations and programming.&lt;/p&gt;

&lt;p&gt;And as I couldn't find an artist, I was the last one who had this on his shoulders.&lt;/p&gt;

&lt;h1&gt;
  
  
  Art
&lt;/h1&gt;

&lt;p&gt;I thankfully have some of the genes of my father, who can really draw awesome pictures, so I could draw the background images with some exercise.&lt;/p&gt;

&lt;p&gt;Animation was a completely different thing. I &lt;em&gt;hate&lt;/em&gt; doing hand drawn animations. I'm simply not patient enough to draw sixteen similar images that form an animation.&lt;/p&gt;

&lt;p&gt;However, I had some prior background in &lt;a href="https://blender.org"&gt;Blender&lt;/a&gt; (which basically means, that I got to know how to navigate and handle it) and together with &lt;a href="https://github.com/ndee85/coa_tools"&gt;the cutout animation tools plugin&lt;/a&gt; my son could draw static images of my characters, that I could explode into cut out parts and animate them with Blender's awesome skeletal animation features.&lt;/p&gt;

&lt;p&gt;Yay! Easy Walkcycles!&lt;/p&gt;

&lt;h1&gt;
  
  
  Programming
&lt;/h1&gt;

&lt;p&gt;Four days before the deadline we had nearly all assets ready and I thought that I just needed to wrap it all together in a game engine. And after that we'd had plenty of time to beta test and optimize.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Narrator: Boy, was he wrong!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have some prior experience in the wonderful game engine &lt;a href="https://godotengine.org"&gt;Godot&lt;/a&gt; so I had no real problems creating a framework that can run the type of game we made. But actually bringing all assets in, implementing the works of the awesome voice actors we had and making the game interactive was &lt;em&gt;A. Lot. Of. Work&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Long story short: I didn't made it to the deadline.&lt;/p&gt;

&lt;p&gt;Thankfully, the guys over at the AdvXJam allowed entries past the deadline so after four more hours, I got everything working (well, kinda) and added the game to the jam.&lt;/p&gt;

&lt;h1&gt;
  
  
  Wrapping it up
&lt;/h1&gt;

&lt;p&gt;Today I can announce that after final touches and bugfixes I can finally release my first, official game:&lt;/p&gt;

&lt;p&gt;"The Letter"&lt;/p&gt;

&lt;p&gt;An atmospheric narrative game about a pensioner's existential crisis in a dystopian future.&lt;/p&gt;

&lt;p&gt;Check it out on &lt;a href="https://deepgames.itch.io/the-letter"&gt;itch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm so happy to have achieved that. I learned so much and got to know so many awesome people on the way and am forever grateful for their help and support.&lt;/p&gt;

&lt;p&gt;That's definitely not the end. I will try to get other games done. The next Adventure Jam is just around the corner and maybe, mayyybe Corona might be over soon so that Adventure X will actually take place next year or 2022 and I can finally meet all this wonderful people.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>adventure</category>
      <category>godot</category>
      <category>blender</category>
    </item>
    <item>
      <title>The third installment of my learning project</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sun, 15 Nov 2020 16:18:04 +0000</pubDate>
      <link>https://dev.to/dploeger/the-third-installment-of-my-learning-project-15e</link>
      <guid>https://dev.to/dploeger/the-third-installment-of-my-learning-project-15e</guid>
      <description>&lt;h1&gt;
  
  
  Prologue
&lt;/h1&gt;

&lt;p&gt;I have established some kind of "learning project" some time ago. A fixed set of features of an application that I reapply to things I want to learn from time to time.&lt;/p&gt;

&lt;p&gt;The background of that application is that I'm using e-mail aliases for each service I subscribe to. So I have a different e-mail for Amazon and Github for example.&lt;/p&gt;

&lt;p&gt;I'm using an OpenLDAP server for this configured into a Postfix mta to achieve this.&lt;/p&gt;

&lt;p&gt;This learning project consists of a frontend for managing these aliases. Thus, it is always called &lt;em&gt;Aliasmanager&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Like the title suggests, this is the third time around I'm starting on a green field with Aliasmanager.&lt;/p&gt;

&lt;p&gt;The first one used &lt;a href="https://qooxdoo.org/"&gt;Qooxdoo&lt;/a&gt; for the API-Server and the frontend, but it was kinda monolithic. The second one had an &lt;a href="https://angularjs.org/"&gt;AngularJS&lt;/a&gt; frontend and a &lt;a href="https://flask.palletsprojects.com/en/1.1.x/"&gt;Flask&lt;/a&gt; API-server, but still both parts somehow were merged together.&lt;/p&gt;

&lt;p&gt;For the third version I wanted to go microservices. At &lt;em&gt;least&lt;/em&gt; develop the API-Server completely separated from the frontend.&lt;/p&gt;

&lt;p&gt;What I really like about Flask is that it is a progressive framework. It starts really small and you can add all the things you need and simply plug it in.&lt;/p&gt;

&lt;p&gt;Another framework that does the same thing is &lt;a href="https://nestjs.com/"&gt;Nest&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  The API-Server
&lt;/h1&gt;

&lt;p&gt;So this time, the API-Server was made using Nest. Nest has a really nice way to structure your application into multiple modules and separates services from controllers. At one point I thought about using a MongoDB backend and that was also very easy to incorporate into Nest, but I skipped that idea and got back to using only the LDAP-Server.&lt;/p&gt;

&lt;p&gt;Nest has some pretty nice integrations. For example, authentication and authorization is pretty easy as it integrates into &lt;a href="http://www.passportjs.org/"&gt;Passport&lt;/a&gt; and I really only needed to do some lines of code to be able to have an LDAP authentication for the login endpoint and a secure JWT-based authentication on the other endpoints.&lt;/p&gt;

&lt;p&gt;Also, documenting the API was very ease due to Nest's integration of the OpenAPI specification.&lt;/p&gt;

&lt;p&gt;The only thing I found hard was that Nest's documentation is somewhat blank in some parts and I really would've liked some kind of API documentation.&lt;/p&gt;

&lt;p&gt;But in the end everything went fine and I also really enjoyed the &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt; testing integration.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="https://github.com/apocas/dockerode"&gt;Dockerode&lt;/a&gt; I was able to remotely manage my docker daemon to ramp up an OpenLDAP server (based on &lt;a href="https://hub.docker.com/r/osixia/openldap"&gt;Osixia/OpenLDAP&lt;/a&gt;) for the test suites.&lt;/p&gt;

&lt;p&gt;However, that resulted in some challenges later.&lt;/p&gt;

&lt;p&gt;But read on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Frontend
&lt;/h2&gt;

&lt;p&gt;This time I switched to &lt;a href="https://vuejs.org/"&gt;Vue&lt;/a&gt; and while Vue itself was a breeze (I know Vue for some time now and really enjoy developing in it), I've actually tried three (!) component frameworks until I got it right.&lt;/p&gt;

&lt;p&gt;The first one was &lt;a href="https://vuetifyjs.com/"&gt;Vuetify&lt;/a&gt; and while I really enjoyed the Material Design Vuetify uses, the documentation and certain small aspects is a mess. Various parts did not work as described in the documentation or worked differently. For example, I was expecting to have an event triggered when a modal was shown so I could set the focus on one of the input fields. But that was not the case.&lt;/p&gt;

&lt;p&gt;The second one I tried was &lt;a href="https://bootstrap-vue.org/"&gt;Bootstrap-Vue&lt;/a&gt; and here, mostly everything worked as expected and the documentation was okay. However, I didn't like the design that much and the a11n support was somewhat problematic.&lt;/p&gt;

&lt;p&gt;The last thing I tried and stuck with was &lt;a href="https://buefy.org/"&gt;Buefy&lt;/a&gt;, an integration of the Bulma CSS framework for Vue. There still were some smaller things (like the mobile view acts a bit weird around the edges), but so far everything was fine and I liked the design much better.&lt;/p&gt;

&lt;h2&gt;
  
  
  A11n
&lt;/h2&gt;

&lt;p&gt;Also, as I mentioned before, I spared some thoughts about accessibility (or a11n) as I think &lt;em&gt;every&lt;/em&gt; frontend developer should do these days. I didn't go as far as I should have, but I used &lt;a href="https://www.ssa.gov/accessibility/andi/help/install.html"&gt;Andi&lt;/a&gt; to check for possible a11n flaws. For some part, this was a bit egoistic, because I wanted a good keyboard navigation. And when you have that and good labels for your elements, you're half the way to a good a11n. Please correct me, if I'm wrong about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend testing
&lt;/h2&gt;

&lt;p&gt;Another important thing was testing the frontend and Vue incorporates &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt; for proper end-to-end testing and I absolutely like how easy Cypress makes frontend testing having a background in Selenium.&lt;/p&gt;

&lt;p&gt;One thing, I still didn't get right was code coverage reporting combined with Vue and Cypress. I know about &lt;a href="https://www.npmjs.com/package/babel-plugin-istanbul"&gt;babel-plugin-istanbul&lt;/a&gt; and after babel's cache drove me mad a couple of times I kinda had some code coverage statistics, but they still don't look quite right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting it all together
&lt;/h2&gt;

&lt;p&gt;I'm running the Aliasmanager on my single machine, so I needed a way to bring all parts together and obviously, this is done using Docker and docker-compose for my single machine or even Kubernetes for clusters.&lt;/p&gt;

&lt;p&gt;So I made Dockerfiles for each component and just right before finishing it all I saw that little note "Autotests disabled" in Docker hub's autobuild-feature and I checked that out.&lt;/p&gt;

&lt;p&gt;And it is actually pretty nifty.&lt;/p&gt;

&lt;p&gt;Docker uses &lt;a href="https://docs.docker.com/docker-hub/builds/automated-testing/"&gt;containers for running tests on pushes and pull requests&lt;/a&gt;. You simply add a new docker-compose file called docker-compose.test.yaml and place a "sut" service into that and docker will run it.&lt;/p&gt;

&lt;p&gt;Pretty easy, huh?&lt;/p&gt;

&lt;p&gt;Well, yes. It is.&lt;/p&gt;

&lt;p&gt;Until your test suite relies on Docker for an LDAP sidecar container.&lt;/p&gt;

&lt;p&gt;So I needed to turn to a "Docker-in-Docker"-like infrastructure and control that from Dockerode in my test suite.&lt;/p&gt;

&lt;p&gt;For example, I needed the ldap container to be reachable from my test container. As docker-compose creates its own docker network, I had to find out which network it had created and connect the ldap container to that same network.&lt;/p&gt;

&lt;p&gt;The second thing was a seed file I needed to fill my ldap server with sample data for the tests. It had to be a file as the image does not support doing this using environment variables and this file was on my machine and in the test container but how to get it into the ldap container from &lt;em&gt;within&lt;/em&gt; the test container?&lt;/p&gt;

&lt;p&gt;The solution was to use a separated volume and also bind that volume to the ldap container.&lt;/p&gt;

&lt;p&gt;So that whole docker testing part was actually the hardest part of all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I learned a lot this time. From using Nest, to component frameworks for Vue to good testing using Jest and Cypress and advanced autobuild and -test features of Docker hub.&lt;/p&gt;

&lt;p&gt;You can check out all the parts here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dploeger/aliasmanager"&gt;Api-Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dploeger/aliasmanager-client"&gt;Frontend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dploeger/aliasmanager-docker"&gt;Docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@chadpeltola?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Chad Peltola&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nestjs</category>
      <category>vue</category>
      <category>learning</category>
    </item>
    <item>
      <title>CloudControl 2.0.0-alpha1 (and how I learned Go)</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sun, 13 Sep 2020 16:03:56 +0000</pubDate>
      <link>https://dev.to/dploeger/cloudcontrol-2-0-0-alpha1-and-how-i-learned-go-5ha3</link>
      <guid>https://dev.to/dploeger/cloudcontrol-2-0-0-alpha1-and-how-i-learned-go-5ha3</guid>
      <description>&lt;p&gt;As you &lt;a href="https://dev.to/dodevops/announcing-cloudcontrol-the-cloud-engineer-s-toolbox-41j2"&gt;might know&lt;/a&gt;, &lt;em&gt;CloudControl&lt;/em&gt; is DoDevOps' cloud engineer toolbox, which supplies cloud engineers working in different clouds with common tools in an easy-to-deploy container environment suitable for multiple projects.&lt;/p&gt;

&lt;p&gt;I always wasn't quite happy with CloudControl's initialization process. It was very cluttered, didn't point out the relevant information and... well, ugly.&lt;/p&gt;

&lt;p&gt;At first, I came up with an idea to use &lt;a href="https://linux.die.net/man/1/dialog"&gt;Dialog&lt;/a&gt; scripts to display some appealing user interface during the process, but that didn't work out mostly because of the Azure flavour's sign up process.&lt;/p&gt;

&lt;p&gt;Then I thought, why not give a web client a go? I'm already used to  &lt;a href="https://vuejs.org"&gt;Vue&lt;/a&gt;, so it wouldn't be that hard. One thing was a problem, though: I'd need a web/api-server that hooks up into the &lt;em&gt;running&lt;/em&gt; initialization process. I didn't want to move away from shell scripts for the initialization of the flavour and features, because 1) they work quite well and 2) they're not really an effort to write for other people who want to add features.&lt;/p&gt;

&lt;p&gt;Well. Two process running alongside tapping into each other &lt;em&gt;plus&lt;/em&gt; a need for a single binary with a low footprint? That really cried out for &lt;a href="https://golang.org"&gt;Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As I've commented in another post, I tried starting with Go several times and never succeeded. But those requirements really were a perfect fit. So I tried again.&lt;/p&gt;

&lt;p&gt;I downloaded the most current version of Go, checked out the tutorials again and got going.&lt;/p&gt;

&lt;p&gt;Then, I needed the first external dependency and I remembered, that Go really was a PITA with this the last time I checked.&lt;/p&gt;

&lt;p&gt;But, no. Nevermore. The Go folks finally seemed to agree on a good way to document and implement external dependencies with a go.mod file and dumped the nasty GOPATH. And everything was nicely supported by my IDE-of-choice &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ Idea&lt;/a&gt;. Just add the required import, let Idea sync the dependencies and you're good to go. Yay!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/10hO3rDNqqg2Xe/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/10hO3rDNqqg2Xe/giphy.gif" alt="Party!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest was classic trial-and-error until I came up with a nice looking Vue frontend (thanks to &lt;a href="https://vuetifyjs.com/"&gt;vuetify&lt;/a&gt;) and a stable API server (using &lt;a href="https://github.com/gin-gonic/gin"&gt;gin&lt;/a&gt;) that delivers information from then goroutine, which handles the initialization.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/"&gt;Docker multi-stage-builds&lt;/a&gt; it was also possible to build the vue client, the go server and the CloudControl flavour without any dependencies on the client. Oh, and I switched to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; (because Docker automated builds didn't support build scripts)&lt;/p&gt;

&lt;p&gt;So, that was my journey and I'm pretty happy with the end result. If you haven't already, please &lt;a href="https://github.com/dodevops/cloudcontrol"&gt;check it out&lt;/a&gt; and let me know what you think.&lt;/p&gt;

</description>
      <category>cloudcontrol</category>
      <category>devops</category>
      <category>container</category>
      <category>tools</category>
    </item>
    <item>
      <title>Announcing CloudControl - the cloud engineer's toolbox ☁️ 🧰</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Wed, 18 Dec 2019 08:17:54 +0000</pubDate>
      <link>https://dev.to/dodevops/announcing-cloudcontrol-the-cloud-engineer-s-toolbox-41j2</link>
      <guid>https://dev.to/dodevops/announcing-cloudcontrol-the-cloud-engineer-s-toolbox-41j2</guid>
      <description>&lt;p&gt;We happen to be in a multitude of different projects at the same time. Switching from project to project is sometimes hard as the tooling and the configuration changes from project to project.&lt;/p&gt;

&lt;p&gt;Now in the days of cloud deployments, this can be narrowed down to just a bunch of tools like &lt;a href="https://terraform.io"&gt;Terraform&lt;/a&gt;, &lt;a href="https://kubernetes.io"&gt;Kubernetes&lt;/a&gt; or &lt;a href="https://helm.sh"&gt;Helm&lt;/a&gt;, but we still felt that some standardization would make our lives much easier.&lt;/p&gt;

&lt;p&gt;That's why we made &lt;a href="https://github.com/dodevops/cloudcontrol"&gt;CloudControl - the cloud engineer's toolbox&lt;/a&gt; (our first repository with emojis btw!).&lt;/p&gt;

&lt;p&gt;CloudControl comes (or will eventually come) in various flavours fitting the specific cloud provider you're using. We started with &lt;a href="https://azure.microsoft.com"&gt;Azure&lt;/a&gt; as we're currently mostly using that, but are of course open for other flavours.&lt;/p&gt;

&lt;p&gt;Also for each flavour, we install a variety of features to support you in your daily work. Currently we support the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐟 &lt;a href="https://fishshell.com/"&gt;Fish Shell&lt;/a&gt; with &lt;a href="https://spacefish.matchai.me/"&gt;Spacefish theme&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🚢 &lt;a href="https://helm.sh"&gt;Helm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dodevops/cloudcontrol/blob/master/feature/kc/kc.sh"&gt;kc Quick Kubernetes Context switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🐳 &lt;a href="https://kubernetes.io/docs/reference/kubectl/overview/"&gt;kubernetes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌏 &lt;a href="https://terraform.io"&gt;Terraform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐗 &lt;a href="https://github.com/gruntwork-io/terragrunt"&gt;Terragrunt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To use CloudControl, you can check out our &lt;a href="https://github.com/dodevops/cloudcontrol/tree/master/flavour/azure/sample"&gt;sample azure compose file&lt;/a&gt; as a starting point.&lt;/p&gt;

&lt;p&gt;We have build CloudControl in a modular way, allowing for extending the supported features and flavours at any time. So if you're missing something, please get in touch and/or provide a PR.&lt;/p&gt;

&lt;p&gt;Header image: &lt;a href="https://flic.kr/p/c4QJzC"&gt;Florian Richter - Toolbox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>azure</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Managing integration systems using clone playbooks</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Sun, 24 Nov 2019 17:25:45 +0000</pubDate>
      <link>https://dev.to/dploeger/managing-integration-systems-using-clone-playbooks-33fn</link>
      <guid>https://dev.to/dploeger/managing-integration-systems-using-clone-playbooks-33fn</guid>
      <description>&lt;p&gt;You totally can test stuff, fix bugs and check out how to implement new features on production!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're a masochist, that is.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Usually a production system is a no-no for anything development related. Even if bugs happen on production, the best practice is to reproduce those bug on systems &lt;em&gt;other&lt;/em&gt; than production.&lt;/p&gt;

&lt;p&gt;These systems are usually called integration, development, acceptance or QA with various understandings from project to project.&lt;/p&gt;

&lt;p&gt;But how can you reproduce a bug on a system that is different from production?&lt;br&gt;
How can you bring the database, data and application files from production to a different system.&lt;/p&gt;

&lt;p&gt;At my employer, &lt;a href="https://kps.com"&gt;kps&lt;/a&gt; we started doing that using Bash scripts. That worked quite well until we had more demands concerning speed, flexibility, complexity and - &lt;em&gt;let's be honest&lt;/em&gt; - readability.&lt;/p&gt;

&lt;p&gt;To conquer those we moved away from Bash scripts and to &lt;em&gt;Ansible playbooks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In case you lived among a flock of sheeps for the last ten years, &lt;a href="https://ansible.com"&gt;Ansible&lt;/a&gt; is a software belonging to the "Configuration Management System" category. It is used to describe how a bunch of servers should be installed and configured. It's written in Python and describes itself as "agentless" (although it actually needs an SSH access to your system and an installed Python environment).&lt;/p&gt;

&lt;p&gt;Ansible works using so called &lt;em&gt;playbooks&lt;/em&gt; consisting of multiple &lt;em&gt;plays&lt;/em&gt; against target systems. Plays have a bunch of &lt;em&gt;tasks&lt;/em&gt; that are run on these systems.&lt;br&gt;
There's a vast list of &lt;em&gt;modules&lt;/em&gt; available providing tasks for every flavor. There are file system tasks, database tasks (for all sorts of databases) and so forth. Check out &lt;a href="https://docs.ansible.com/"&gt;their documentation&lt;/a&gt; for details.&lt;/p&gt;

&lt;h1&gt;
  
  
  The premise
&lt;/h1&gt;

&lt;p&gt;But I'm not talking about my professional life today. Instead, let me tell you that I'm active in an open air theater association called the &lt;a href="https://waldbuehne-heessen.de"&gt;"Waldbühne Heessen"&lt;/a&gt; (sorry, german only website). I started as an actor there, but you know the common way for people working in the IT business. So I'm now managing their IT stuff together with two fellow actors.&lt;/p&gt;

&lt;p&gt;One of the systems I'm responsible for is a site the association uses for organizing auditions, shows and the other stuff that happens throughout the year. Additionally, it contains a bulletin board for discussing things.&lt;/p&gt;

&lt;p&gt;The site is based on the &lt;a href="https://elgg.org"&gt;Elgg framework&lt;/a&gt;, a platform for social networking sites. Elgg is a modern &lt;a href="https://php.net"&gt;php&lt;/a&gt; framework, utilizes caching, a data directory and a database.&lt;/p&gt;

&lt;p&gt;Now we needed to migrate from Elgg 2.3 to Elgg 3.2, which was a major jump with several breaking changes and breaking a lot of plugins. As a good SRE I knew, I had to build a proper integration system to prepare that move and to use it as a showcase for my fellow members.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building a clone playbook
&lt;/h1&gt;

&lt;p&gt;It's actually quite easy to build a clone playbook, because it simply mimics what you would do manually. So to build my playbook, I checked out what I had to do to clone my production data to an integration system.&lt;/p&gt;

&lt;p&gt;From my experience with the clones from my employer I knew the basic steps usually required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dump the database&lt;/li&gt;
&lt;li&gt;Augment the database dump file to match the integration system (This usually includes changing URLs or paths)&lt;/li&gt;
&lt;li&gt;Restore the database onto the target database host&lt;/li&gt;
&lt;li&gt;Copy the application files&lt;/li&gt;
&lt;li&gt;Copy the data files&lt;/li&gt;
&lt;li&gt;Augment the application configuration file to match the integration system (This obviously includes the database settings, paths and some minor stuff)&lt;/li&gt;
&lt;li&gt;Additional works (i.e. Setting an announcement banner to warn the user, that they're on the integration system)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an additional topping, I wanted to include all stuff required to update the system to the new version as well. But I wanted to do that dynamically, so I could just switch it off when I had migrated the production system.&lt;/p&gt;

&lt;p&gt;Transforming the manual steps into a clone playbook was mostly just checking for fitting modules in the Ansible docs and figuring out how they needed to be configured (which was taking the most time frankly).&lt;/p&gt;

&lt;p&gt;For the database tasks, the mysql_db task was used. It supports dumping and restoring databases and also running SQL scripts. The file tasks mostly compress folders using the archive task and copies them around. Augmenting the database dump or application settings, I used the replace and lineinfile tasks.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building the inventory
&lt;/h1&gt;

&lt;p&gt;The playbook itself is rather static. It's basically just a list of tasks in a Yaml file, that Ansible runs from top to bottom.&lt;/p&gt;

&lt;p&gt;Parametrizing the playbook is done using inventory files. They hold the connections to the target hosts, but also parameters like database username and paths.&lt;/p&gt;

&lt;p&gt;The inventory files can be written in an ini and yaml flavor. After I initially started using the ini flavor because we used the same at my employer's I finally switched to yaml format because I needed to configure lists and object values for parameters.&lt;/p&gt;

&lt;p&gt;That way I could add an external task file with the update tasks into the inventory, which is included into the main playbook using &lt;em&gt;include_tasks&lt;/em&gt; Ansible task and could then clone the integration server and migrate in one step.&lt;/p&gt;

&lt;p&gt;For sensitive data like passwords, Ansible brings a vault solution, that encrypts the values in the files using AES (or other cryptos you configure). You encrypt the values using a passphrase and simply use the same passphrase when running the playbook.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bringing it all together
&lt;/h1&gt;

&lt;p&gt;Of course, this all wasn't a one shot. I had to use several tests to finally finalize the playbook and have it working correctly. Depending of the size of the system, this can take some time. So prepare yourself with enough coffee for the task.&lt;/p&gt;

&lt;p&gt;As a reference, if you're interested, I open sourced the whole stuff on &lt;a href="https://github.com/wabuehamm/clone.members"&gt;the association's github organization&lt;/a&gt;. If you have questions, don't hesitate to ask.&lt;/p&gt;

&lt;h1&gt;
  
  
  🎁 Bonus! Building a local development environment
&lt;/h1&gt;

&lt;p&gt;I don't know about you but I don't like to do stuff twice. To develop the site and plugins we're using a local containerized development environment based on &lt;a href="https://docker.com"&gt;Docker&lt;/a&gt; with mounted database and application paths. So why not use the clone playbook to clone production for the local environment?&lt;/p&gt;

&lt;p&gt;Ansible supports us there quite well by accepting docker connections to target systems using the local docker daemon.&lt;/p&gt;

&lt;p&gt;So I wrapped up a &lt;a href="https://github.com/wabuehamm/clone.members/blob/master/localdev/docker-compose.yaml"&gt;compose file&lt;/a&gt; that starts a database and an application server (we created our own &lt;a href="https://github.com/wabuehamm/web.members"&gt;Elgg-compatible application server image&lt;/a&gt;). This servers are then filled using Ansible and I can simply &lt;em&gt;tar&lt;/em&gt; the mounted volumes, bring them to my server and start my development environment, also &lt;a href="https://github.com/wabuehamm/elgg-localdev"&gt;using a compose file&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Voilà.&lt;/p&gt;

&lt;p&gt;(Cover Image: &lt;a href="https://flickr.com/photos/128433691@N03/20332584138/in/photolist-wYHNTu-4nJA8m-5vbnHV-58o432-wYEBV5-5Ak61g-CtS1h-5WKK5b-anC9dv-Kp2qA-2ERTfZ-phkhMY-MJQFUS-zAJFSD-5MPtVs-8sxNjf-5aKwDN-dWuauX-7sHECz-wkBYKo-FL8QS-Kp6X4-AArBX-vVau4-kamyj-7iNEYU-Khcpx5-5PTHMm-oa6Ut-FL8QE-83C5oP-it9ro-79kkm1-47CUgJ-iXQeur-8eb6Qe-DMLmm-4uTRpR-FL8QU-it9rm-9NNkH4-Eqsh7-5qZxar-8grhTi-adDB9-rSrs2L-6pHuhp-it9rn-4v9jZE-it9rk"&gt;Night. Clone by AdNorrel&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>ansible</category>
      <category>php</category>
      <category>elgg</category>
      <category>devops</category>
    </item>
    <item>
      <title>DevOps/SRE Fulltime Dortmund, Germany</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Fri, 11 Oct 2019 14:09:36 +0000</pubDate>
      <link>https://dev.to/dploeger/devops-sre-fulltime-dortmund-germany-2okc</link>
      <guid>https://dev.to/dploeger/devops-sre-fulltime-dortmund-germany-2okc</guid>
      <description>&lt;h2&gt;
  
  
  About Us
&lt;/h2&gt;

&lt;p&gt;Hey! We're a nice little team devoted to consult and support our mostly e-commerce-focused developer teams with DevOps-related hot stuff like automation, containerization, orchestration and cloud technologies.&lt;/p&gt;

&lt;h2&gt;
  
  
  About The Opportunity
&lt;/h2&gt;

&lt;p&gt;We're searching for a new team member, that has either an ops background and dev interest or vice versa. It's a permanent, full time job offer located in Dortmund, Germany with partial home office possibilities.&lt;/p&gt;

&lt;p&gt;We know that we probably can't find someone, who has all skills denoted below, but if you're open and interested in learning new things, you might as well fit in. &lt;/p&gt;

&lt;h2&gt;
  
  
  Skill &amp;amp; Qualifications
&lt;/h2&gt;

&lt;p&gt;German and English language skills are required.&lt;/p&gt;

&lt;p&gt;For the rest, please check out the official job offer &lt;a href="https://kps.com/de/jobs/support-services/system-administrator-focus-automation-devops.html"&gt;on our website&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Apply
&lt;/h2&gt;

&lt;p&gt;First, check out the official job offer &lt;a href="https://kps.com/de/jobs/support-services/system-administrator-focus-automation-devops.html"&gt;on our website&lt;/a&gt; and then apply online right there.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please feel free to leave questions in the comments section.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
    </item>
    <item>
      <title>tflookup - Developer diary Epilogue</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Tue, 09 Jul 2019 07:14:42 +0000</pubDate>
      <link>https://dev.to/dploeger/tflookup-developer-diary-epilogue-de7</link>
      <guid>https://dev.to/dploeger/tflookup-developer-diary-epilogue-de7</guid>
      <description>&lt;p&gt;Dear diary,&lt;/p&gt;

&lt;p&gt;it's been some days since I wrote to you about my experience with &lt;a href="https://dev.to/t/tflookup"&gt;creating a Terraform documentation lookup app&lt;/a&gt; and while I'm using tflookup on a daily, I noticed something.&lt;/p&gt;

&lt;p&gt;When I start my work in the morning and have the first interest in looking up some provider resource of Terraform, I naturally check out tflookup. And that is no fun experience, because I have to wait and waiiiiit until tflookup finally comes up.&lt;/p&gt;

&lt;p&gt;That's because, Heroku has something they call &lt;a href="https://devcenter.heroku.com/articles/free-dyno-hours#dyno-sleeping"&gt;dyno sleeping&lt;/a&gt; for the free subscription and as not many other people tend to use tflookup currently, the app gets all sleepy and falls into a deep slumber until I wake it up in the morning.&lt;/p&gt;

&lt;p&gt;I don't want to pay Heroku for this little side project of mine and being a simple Node.js app, that is easily deployable, I simply deployed it on my server, that I manage for years (and that is already active rebuilding the tflookup index each night)&lt;/p&gt;

&lt;p&gt;So from now on, I will be checking out &lt;a href="https://tflookup.blueocean-net.de"&gt;tflookup on a new address&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yours&lt;br&gt;
Dennis&lt;/p&gt;

</description>
      <category>tflookup</category>
      <category>heroku</category>
    </item>
    <item>
      <title>tflookup - Developer Diary Part 5</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Wed, 05 Jun 2019 14:17:56 +0000</pubDate>
      <link>https://dev.to/dploeger/tflookup-developer-diary-part-5-4e95</link>
      <guid>https://dev.to/dploeger/tflookup-developer-diary-part-5-4e95</guid>
      <description>&lt;p&gt;Dear Diary!&lt;/p&gt;

&lt;p&gt;MY LOOKUP APP WORKS! Yayy!&lt;/p&gt;

&lt;p&gt;Locally at least.&lt;/p&gt;

&lt;p&gt;But what good is a web app, if you can only enjoy it yourself?&lt;/p&gt;

&lt;p&gt;So I needed a way to deploy my app automatically (and for free).&lt;/p&gt;

&lt;p&gt;Luckily, &lt;a href="https://heroku.com/"&gt;Heroku&lt;/a&gt; is around. Heroku is a simple app hosting provider, which hosts very simple apps for free. They connect to your &lt;a href="https://github.com/dploeger/tflookup"&gt;github repository&lt;/a&gt; and deploy the app that's there.&lt;/p&gt;

&lt;p&gt;Very simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I guess, that's true for most apps, but I had some difficulties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had a frontend and a backend to compile before starting the app&lt;/li&gt;
&lt;li&gt;I had to download the prerendered index before starting the app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://devcenter.heroku.com/"&gt;Heroku's documentation&lt;/a&gt; is also quite extensive. However, I couldn't get my head around their release stage. All my tries to configure the releases right didn't work.&lt;/p&gt;

&lt;p&gt;So finally, I simply wrapped my complete application into a &lt;a href="https://github.com/dploeger/tflookup/blob/master/Dockerfile"&gt;docker container&lt;/a&gt; (which was good nonetheless) and used that to deploy the final app to Heroku using Herokus &lt;a href="https://devcenter.heroku.com/categories/deploying-with-docker"&gt;container deployment feature&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now, my dear diary, I have to end my writings. I have finally made my lookup app. It's still not shiny or stable, but it works and I'm quite happy with it.&lt;/p&gt;

&lt;p&gt;If anybody reading this might find it interesting and want to use it, they can all find it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tflookup.herokuapp.com/"&gt;https://tflookup.herokuapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yours&lt;br&gt;
Dennis&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The End&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is one of five posts from the &lt;a href="https://dev.to/t/tflookup"&gt;tflookup developer diary series&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover Image: &lt;a href="https://flic.kr/p/ffFhz5"&gt;"diary writing" by Fredrik Rubensson&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>heroku</category>
      <category>docker</category>
      <category>tflookup</category>
      <category>deployment</category>
    </item>
    <item>
      <title>tflookup - Developer Diary Part 4</title>
      <dc:creator>Dennis Ploeger</dc:creator>
      <pubDate>Wed, 05 Jun 2019 14:09:08 +0000</pubDate>
      <link>https://dev.to/dploeger/tflookup-developer-diary-part-4-3pb9</link>
      <guid>https://dev.to/dploeger/tflookup-developer-diary-part-4-3pb9</guid>
      <description>&lt;p&gt;Dear Diary!&lt;/p&gt;

&lt;p&gt;So I finished my REST service which will deliver my search results. But what good is that without an appealing frontend.&lt;/p&gt;

&lt;p&gt;After I was nearly blown away by the overwhelming good critics about &lt;a href="https://vuejs.org"&gt;Vue.js&lt;/a&gt; at last year's &lt;a href="https://www.enterjs.de/"&gt;enterjs&lt;/a&gt; I took the Vue-way immediately.&lt;/p&gt;

&lt;p&gt;I think, Vue is &lt;em&gt;very&lt;/em&gt; easy compared to other frameworks out there and also very well structured.&lt;/p&gt;

&lt;p&gt;Also, it has proper Typescript support and good documentation.&lt;/p&gt;

&lt;p&gt;So I &lt;a href="https://github.com/dploeger/tflookup/tree/master/static"&gt;started a Vue project&lt;/a&gt; using &lt;a href="https://cli.vuejs.org/"&gt;Vue CLI&lt;/a&gt; (which has an amazing new UI btw).&lt;/p&gt;

&lt;p&gt;A simple test of the REST calls worked fine, but I wanted something more appealing.&lt;/p&gt;

&lt;p&gt;Luckily, &lt;a href="https://vuetifyjs.com"&gt;Vuetify&lt;/a&gt; has some nice Material Design components ready for Vue and also a nice autocomplete component. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dploeger/tflookup/blob/master/static/src/components/Lookup.vue#L70"&gt;This method&lt;/a&gt; watches the query input field and uses the REST backend to fill the results. I used a delayed promise there to allow the user to input the complete search text before I use the text to search the backend.&lt;/p&gt;

&lt;p&gt;The autocomplete than renders &lt;a href="https://github.com/dploeger/tflookup/blob/master/static/src/components/Lookup.vue#L25"&gt;a so-called "slot"&lt;/a&gt; with the item results.&lt;/p&gt;

&lt;p&gt;Selecting a result would trigger a location change to the actual terraform documentation page.&lt;/p&gt;

&lt;p&gt;The hard thing here was to get my head around how Vue plugins work, how they work in &lt;em&gt;Typescript&lt;/em&gt; and how Vuetify components and their specialities (like slots) work. But the good examples and documentation for Vuetify and Vue helped a great deal.&lt;/p&gt;

&lt;p&gt;Yours&lt;br&gt;
Dennis&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is one of five posts from the &lt;a href="https://dev.to/t/tflookup"&gt;tflookup developer diary series&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover Image: &lt;a href="https://flic.kr/p/ffFhz5"&gt;"diary writing" by Fredrik Rubensson&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>frontend</category>
      <category>tflookup</category>
    </item>
  </channel>
</rss>
