tag:blogger.com,1999:blog-87893679580176468132024-02-21T09:55:29.850-08:00Running Increments......as small & simple as possible. And as complicated as necessary.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.comBlogger135125tag:blogger.com,1999:blog-8789367958017646813.post-22877571763655117542019-04-28T11:25:00.001-07:002019-04-28T11:25:43.950-07:00Dockerizing nginx using jwilder/dockerizeToday, most technology stacks are really well suited to be <a href="https://docs.docker.com/engine/examples/">dockerized</a> (e.g. <a href="https://spring.io/projects/spring-boot">spring boot</a>, <a href="http://cypress.io/">cypress.io</a>, <a href="https://docs.docker.com/engine/examples/dotnetcore/">.NET core</a> to name a few).<br />
<br />
However, still some lack good support for the usual <a href="https://12factor.net/">12x factor app guidelines</a> like<br />
<br />
<ul>
<li><a href="https://12factor.net/config">configuration via environment variables</a></li>
<li><a href="https://12factor.net/processes">started as a single process in foreground</a></li>
<li><a href="https://12factor.net/logs">logging to stdout</a></li>
</ul>
<div>
One such example is <a href="https://nginx.org/">nginx</a>. It is configured using conf.d-dropins, by default starts in background and does not log to stdout. </div>
<div>
<br /></div>
<div>
But using Jason Wilder's <a href="https://github.com/jwilder/dockerize">dockerize</a> tool written in <a href="https://golang.org/">golang</a> it's been a quick breeze to make nginx into a docker-friendly reverse proxy dynamically configured to proxy to this very blog.</div>
<div>
<br /></div>
<div>
Jason's example became a bit dated since nginx is still moving fast. So i updated it for nginx 1.16. You can find the code at <a href="https://github.com/mkoertgen/hello.dockerize">mkoertgen/hello.dockerize</a>. Enjoy!</div>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-85510226065025740902019-04-17T00:27:00.002-07:002019-04-26T02:16:32.925-07:00Fixing the #Teams Addin Installation in #OutlookTL;DR <a href="https://gist.github.com/mkoertgen/4d4932f57fe52565365eea3544e10ac6">gist: Microsoft Teams Outlook AddIn Hacks</a><br />
<br />
In projects inclined to the Microsoft ecosystem, Teams is probably the best collaboration option, especially if your team members are dislocated.<br />
<br />
Probably because using different Office 365 accounts i had a hard time getting the Teams-Addin to work with Outlook. This is a know problem as you can find numerous articles on the web from people asking for help about this issue. Microsoft is working to enhance the Teams / Outlook experience.<br />
<br />
One especially helpful article was <a href="https://realtimeuc.com/2017/08/missing-teams-outlook-add-in/">https://realtimeuc.com/2017/08/missing-teams-outlook-add-in/</a> by Michael LaMontagne (<a href="https://twitter.com/realtimeuc" target="_blank">@RealTimeUC</a>). Michael was the only one trying to dig deeper into the nitty-gritty details of COM-registration between Outlook and the Teams .NET application, deployed using <a href="https://github.com/Squirrel/Squirrel.Windows">Squirrel.Windows</a> (as most Electron-based desktop-apps on Windows, e.g. Slack etc.).<br />
<br />
He finally got the Teams-AddIn working by duplicating registry keys from a working machine.<br />
<br />
However, after reviewing the Teams & Teams Meeting AddIn startup behavior, it's even simpler.<br />
<br />
On installation, the Microsoft Teams application always COM-registers the Team-Addin for Outlook. However, if not enabled for your Outlook/Office365 subscription, it deletes a few registry keys on startup, so Outlook simply won't load it on startup.<br />
<br />
So here is how to hack the Teams Meeting Button into Outlook:<br />
<br />
1. Start Teams (deletes registry keys!)<br />
2. Add registry keys (see below)<br />
3. Start Outlook<br />
<br />
Unfortunately, you will have repeat this everytime you restart Teams.<br />
<br />
Hopefully this helps someone going down the same road!<br />
<br />
<div style="background-color: #193549; color: white; font-family: "Fira Code"; font-size: 14px; line-height: 19px; white-space: pre;">
<div>
<span style="color: #ff9d00;">Windows Registry Editor Version 5.00</span></div>
<br />
<div>
<span style="color: #e1efff;">[</span><span style="color: #ffc600;">HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Resiliency\DoNotDisableAddinList</span><span style="color: #e1efff;">]</span></div>
<div>
<span style="color: #e1efff;">"</span><span style="color: #ff9d00;">TeamsAddin.Connect</span><span style="color: #e1efff;">"=</span><span style="color: #80ffbb;">dword</span><span style="color: #ff9d00;">:</span><span style="color: #ff628c;">00000001</span></div>
<br />
<div>
<span style="color: #e1efff;">[</span><span style="color: #ffc600;">HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Resiliency\DoNotDisableAddinList</span><span style="color: #e1efff;">]</span></div>
<div>
<span style="color: #e1efff;">"</span><span style="color: #ff9d00;">TeamsAddin.Connect</span><span style="color: #e1efff;">"=</span><span style="color: #80ffbb;">dword</span><span style="color: #ff9d00;">:</span><span style="color: #ff628c;">00000001</span></div>
<br />
<div>
<span style="color: #e1efff;">[</span><span style="color: #ffc600;">HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins\TeamsAddin.Connect</span><span style="color: #e1efff;">]</span></div>
<div>
<span style="color: #e1efff;">"</span><span style="color: #ff9d00;">Description</span><span style="color: #e1efff;">"="</span><span style="color: #a5ff90;">Microsoft Teams Meeting Add-in for Microsoft Office</span><span style="color: #e1efff;">"</span></div>
<div>
<span style="color: #e1efff;">"</span><span style="color: #ff9d00;">FriendlyName</span><span style="color: #e1efff;">"="</span><span style="color: #a5ff90;">Microsoft Teams Meeting Add-in for Microsoft Office</span><span style="color: #e1efff;">"</span></div>
<div>
<span style="color: #e1efff;">"</span><span style="color: #ff9d00;">LoadBehavior</span><span style="color: #e1efff;">"=</span><span style="color: #80ffbb;">dword</span><span style="color: #ff9d00;">:</span><span style="color: #ff628c;">00000003</span></div>
</div>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-86193422289572120552016-04-08T14:28:00.001-07:002022-01-06T08:00:26.315-08:00What have these in common<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/GB4s5b9NL3I/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/GB4s5b9NL3I?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/t__NoFstCmQ/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/t__NoFstCmQ?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/0MD4Ymjyc2I/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/0MD4Ymjyc2I?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Labor Unions are obsolete:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ul>
<li style="text-align: left;"><a href="http://www.dennystrigl.com/blog/2012/02/11/labor-unions-are-osolete/">http://www.dennystrigl.com/blog/2012/02/11/labor-unions-are-osolete/</a></li>
<li style="text-align: left;"><a href="http://kolindkuren.dk/2014/04/10/my-personal-hall-of-fame/">http://kolindkuren.dk/2014/04/10/my-personal-hall-of-fame/</a></li>
</ul>
<div style="text-align: left;">
Reinventing Orgnaizations: Amber+Orange Organizations (process driven)</div>
<div style="text-align: left;">
<ul>
<li><a href="http://www.kevanlee.com/reinventing-organizations/">http://www.kevanlee.com/reinventing-organizations/</a></li>
</ul>
<div>
<br /></div>
<div>
--> All of them speak of how hierarchical organizations try to manage codependent environments, i.e. by introducing another process bridging the silos.</div>
<div>
<br /></div>
<div>
And all of them make clear that this cannot work.</div>
</div>
<br />
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-3378926495049669542015-07-06T23:12:00.002-07:002016-01-27T13:42:27.480-08:00Get involved in Stack Exchange
<a href="http://stackexchange.com/">StackExchange</a> has become one of the most popular Q&A platforms. Having started with <a href="http://stackoverflow.com/">StackOverflow</a> there are now many <a href="http://stackexchange.com/sites">sites</a> to explore and participate in.
<br />
In <a href="https://blog.stackexchange.com/2010/06/area-51-we-come-in-peace/">summer 2010</a>, a staging area called <a href="http://area51.stackexchange.com/">Area 51</a> was launched where you can suggest new sites. Once there is enough appreciation by the community a beta is launched. A few examples <a href="http://area51.stackexchange.com/?tab=beta">currently in beta</a> i especially like are e.g. <a href="http://area51.stackexchange.com/proposals/82234/open-source">Open Source</a>, <a href="http://buddhism.stackexchange.com/">Buddhism</a> and <a href="http://codereview.stackexchange.com/">CodeReview</a>.
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-81634834380885279052015-05-03T23:19:00.000-07:002015-05-03T23:19:01.348-07:00Practicing Oracle12c migration made simpleMy professional experience with Oracle is that there is no "5 minute introduction tutorial". That means you need to be serious about getting started with Oracle (or just try out a new feature) because things won't get smooth until you pass the entry barrier of installing and configuring Oracle.<br />
<ol>
</ol>
<div>
Sadly, this experience results in<br />
<ol>
<li>Developers that are used to more lightweight persistence layers just...don't get started with Oracle ("Meh, let´s try MongoDb or Elasticsearch instead")</li>
<li>Database Administrators that would benefit from keeping up with the latest features...just skip it because it's too cumbersome to get an isolated playground Oracle DB up and running</li>
</ol>
</div>
<div>
What can we do to lower this entry barrier? <a href="https://www.vagrantup.com/">Vagrant</a> to the rescue! Over the past weeks i contributed to the GitHub repository <a href="https://github.com/wkoertgen/train.oracle12.migration">wkoertgen/train.oracle12.migration</a> whichs aims to alleviate most of the nastyness of setting up Oracle. It is also a great resource on installation and configuration.<br />
<br /></div>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com2tag:blogger.com,1999:blog-8789367958017646813.post-82854997100846348602015-05-03T12:54:00.001-07:002016-01-28T02:06:28.216-08:00hello.nVLC: A minimal WPF Media Player<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/mkoertgen/hello.nVLC/raw/master/hello.nVLC.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://github.com/mkoertgen/hello.nVLC/raw/master/hello.nVLC.png" width="320" /></a></div>
<br />
A few days ago, i put <a href="https://github.com/mkoertgen/hello.nVLC">hello.nVLC</a> on GitHub. This is a minimal WPF media player application comparing an MVVM media player implementation for Windows Media Player and VLC using<br />
<br />
<ul>
<li><a href="https://www.nuget.org/packages/nVLC/">nVLC</a>, a great managed wrapper for VLC by Roman Ginzburg, </li>
<li><a href="https://www.nuget.org/packages/VLC.Native/">VLC.Native</a>, a NuGet package containing the native VLC dependencies and</li>
<li><a href="https://github.com/awesome-inc/FontAwesome.Sharp">FontAwesome.Sharp</a>, our WPF wrapper for using awesome icons.</li>
</ul>
<br />
<br />
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-32175068042153038932015-04-29T23:54:00.004-07:002015-04-30T00:28:45.067-07:00Vagrant: Optimizing virtual Ubuntu/Debian boxesA while ago, we used <a href="https://github.com/hilverd/vagrant-ubuntu-oracle-xe">hilverd/vagrant-ubuntu-oracle-xe</a> to alleviate the testing bottleneck, i.e. too many developers on too few dedicated testing environments. Since then, i am a big <a href="https://www.vagrantup.com/">Vagrant</a> fan as this really boosted up our testing feedback cycle time.<br />
<br />
However, even oracle-xe is anything but a lightweight installation, so minimizing your base box is a good thing to do.<br />
<br />
There are quite a few resources on how to optimize virtual boxes for vagrant. I picked up some of these and documented what worked well in this gist <a href="https://gist.github.com/mkoertgen/74f270297514f826593e">mkoertgen/vagrant_export_vbox_vm_basebox.md</a>. Enjoy!<br />
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-6282064644116550202015-04-26T13:56:00.003-07:002015-12-11T02:42:39.127-08:00Squirrel.Windows - StarterkitYou probably know <a href="https://slack.com/">Slack</a>, the team communication tool. If not, go see. It's awesome. The Slack windows app is one of the most prominent users of <a href="https://github.com/Squirrel/Squirrel.Windows">Squirrell</a> for installation & update. Squirrel itself is an ingeniously simple library for installing and updating desktop windows applications. It uses NuGet packaging to build app releases and supports delta compression for updates. You don't need a NuGet feed to host your releases, just a static web server. If you want to try out Squirrel, you may have a look at the starter sample <a href="https://github.com/mkoertgen/hello.squirrel">mkoertgen/hello.squirrel</a> i comitted today. It's a minimal WPF application with an update button.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/mkoertgen/hello.squirrel/raw/master/HelloSquirrel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://github.com/mkoertgen/hello.squirrel/raw/master/HelloSquirrel.png" /></a></div>
<br />
<br />
As extra candy i automated "releasifying" updates with msbuild, i.e. you can build updates by typing<br />
<br />
<code> build.bat HelloSquirrel\HelloSquirrel.csproj /t:Deploy /p:DropLocation=c:\temp\Releases</code>
<br />
<br />
Enjoy!Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com2tag:blogger.com,1999:blog-8789367958017646813.post-6159085542337816092015-04-23T03:11:00.002-07:002015-04-23T03:13:39.903-07:00Faceted Search using Elasticsearch and WPFToday i uploaded a quick sample on <a href="https://github.com/mkoertgen/hello.elastic.facetedSearch.wpf">how to build faceted navigation for Elasticsearch in WPF</a> which includes highlighting of search results. Below is a screenshot of the sample app. Enjoy!
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/mkoertgen/hello.elastic.facetedSearch.wpf/raw/master/HelloFacets.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="316" src="https://github.com/mkoertgen/hello.elastic.facetedSearch.wpf/raw/master/HelloFacets.png" width="400" /></a></div>
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-62439337672763497362015-04-19T23:24:00.000-07:002015-04-19T23:24:16.846-07:00Work tip: Disable Chrome historyIf you are using Google Chrome at work you should probably disable storing history to avoid your intranet urls being synced out into the Google cloud. Here is how: <a href="http://www.tekrevue.com/tip/prevent-google-chrome-storing-browser-history/">How to Prevent Google Chrome From Storing Browser History</a>. Chrome basically stores history and other data in a local SQLite database. The tip is a little bit of a hack: You first empty the database (clear history) and then prevent Chrome to modify it (by making it read-only).Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-65611965593413727542015-02-17T07:09:00.000-08:002015-06-09T14:52:21.419-07:00When to use git-flow and GitHub FlowSome people ask how good git-flow matches with the practice of continuous integration. In 2011, Scott Chacon from GitHub Inc. wrote a post on exactly that: <a href="http://scottchacon.com/2011/08/31/github-flow.html">GitHub Flow</a>.<br />
<br />
For the last few weeks we switched from git-flow to GitHub Flow - on GitHub as well as on our gitblit-Server (needs gitblit tickets, v1.4+).<br />
<br />
Working both with GitHub Flow vs. git-flow taught us a lot. Well, the direct ticket integration alone is a big win compared to manually keeping commits and tickets consistent, i.e. basically pasting a lot of links in each of them. Apart of that, without surprise we came to the same conclusions as Scott Chacon, i.e.:<br />
<ul>
<li>For continuous deployment projects, github flow is way more effective because you can have dozens of commits each day going directly into production. The many branch transitions required in git-flow quickly become a bottleneck and lose their worth as quality gates. The similar holds for small projects or simple software components where git-flow is just too big a framework.</li>
<br />
<li>For products with greater release cycles (weeks or months) git-flow makes sense. Example scenarios are concurring milestones (hotfix from production vs. feature for next version) or just bigger quality gates, i.e. a commit should not or can not be directly deployed to production.</li>
</ul>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-6443806363883484382015-01-30T05:25:00.000-08:002015-04-21T13:19:37.729-07:00Microsoft "Trill" (Predictive Analytics)From the dotnetpro-Newsticker on 29.01.2015: <a href="http://www.dotnetpro.de/dotnetpronews5722.aspx">Trill – eine Billion Events pro Tag</a>:<br />
<br />
<em>"Microsoft Research entwickelt mit Trill eine .NET-Bibliothek, die es in sich hat: Sie verarbeitet große Datenmengen zwei- bis viermal schneller als gewöhnliche Streaming Engines..."</em><br />
<br />
The paper: <a href="http://research.microsoft.com/pubs/231690/trill-vldb2015.pdf">Trill: A High-Performance Incremental Query Processor for<br />Diverse Analytics</a><br />
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-39745951557467509642015-01-21T01:33:00.000-08:002018-10-25T14:32:24.236-07:00Fazit dev.talk - DockerYesterday, i gave an introductory talk about Docker. The bottom line: Unmittelbare Vorteile liegen weniger darin, eigene Produkte per Docker zu integrieren/installieren. Der unmittelbare Vorteil von Docker liegt oft eher darin, dass damit andere Lösungen viel leichter zugänglich sind.<br />
<br />
Für Dependencies in Form von Bibliotheken haben ist das ja mit Dependency Managern wie Maven und NuGet schon gelöst. Das Einbinden von Fremd-Code ist damit keine Hürde mehr.<br />
Die Integration und der Betrieb von externen Komponenten der Produkten (z.B. ElasticSearch, RabbitMQ, MongoDb, PostgreSQL, etc.) wird oft jedoch noch manuell durchgeführt, genauso wie früher das Einbinden anderer Bibliotheken. <br />
<br />
Dass man das bisher manuell tut, macht sich auch zunächst im Einzelfall nicht wirklich bemerkbar. Beispiel ElasticSearch, nur Entwicklung: herunterladen, starten, fertig. Ist doch kein Aufwand. Wozu also Docker?<br />
<br />
Vergrößert sich die Anzahl der Komponenten sieht das schon anders aus. Beispiel: RabbitMQ (river) + ElasticSearch + ... <br />
Jede Komponente wird ein wenig anders bezogen, installiert und betrieben.<br />
<br />
Berücksichtigt man jetzt nicht nur die Entwicklungsphase, sondern auch Integration/QS und Produktion wird schnell klar, dass der Aufwand über-linear, vielleicht sogar quadratisch von der Anzahl der verschalteten Komponenten/Produkte abhängt. Von der Zahl der verschiedenen Zielumgebungen ganz zu schweigen.<br />
<br />
Das ist genau die wesentliche Aussage und Motivation der <a href="https://www.blogger.com/null" ref="http://de.slideshare.net/dotCloud/docker-intro-november/6" rel="nofollow">Matrix from hell</a>. Durch die Vereinheitlichung mittels Container kann jede Komponente automatisiert bezogen, installiert, betrieben und deinstalliert werden. Und das immer gleich, egal ob Entwicklungsrechner, Integrationsanlage, Produktion oder vor Ort beim Kunden.<br />
<br />
Damit reduziert Docker den o.a. Aufwand nahezu wieder auf O(1), zumindest was die teure menschliche Arbeit betrifft. In dieser Hinsicht bietet Docker also einen Mehrwert in Form einer Infrastruktur zum Betrieb von Komponenten/Produkten, vergleichbar mit der Infrastruktur durch Paketmanager zur Handhabung von Fremdbibliotheken.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-82731546470288325252015-01-09T00:41:00.000-08:002015-04-21T13:39:35.508-07:00Application Server sind tot!Eberhard Wolff talks about <a href="http://jaxenter.de/videos/application-server-sind-tot-177593">The death of the application server</a>. Recommended.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-40755768999673034182015-01-08T06:50:00.000-08:002015-04-18T23:49:12.496-07:00twitter/AnomalyDetectionYesterday, Twitter published their R-Package for anomaly detection in big, time-related data on GitHub: <a href="https://blog.twitter.com/2015/introducing-practical-and-robust-anomaly-detection-in-a-time-series"> Arun Kejariwal: Introducing practical and robust anomaly detection in a time series</a><br />
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-92025431934493700452014-12-17T06:34:00.000-08:002018-10-25T14:33:16.780-07:00Technische Dokumentation in einem agilen Umfeld (Erfahrungsbericht)In ihrem Blogpost <a href="http://www.qudosoft.de/technische-dokumentation-in-einem-agilen-umfeld/">Technische Dokumentation in einem agilen Umfeld</a> hat Melanie Diop die Erfahrungen ihres ersten Jahres als Technische Redakteurin bei Qudosoft zusammengefasst.<br />
<br />
Sie stellt zunächst fest, dass die Abgrenzung von Redaktion und Entwicklung in einem agilen nicht funktioniert. Ihre Schlussfolgerungen, Ideen und Ansätze sind eigenen Erfahungen nicht unähnlich, vgl.<br />
<ul>
<li><a href="http://blog/?p=3204" title="doc2pdf.ps1 [Gist] – Continuous Integration für Handbücher">Dokumentation im Build</a></li>
<li><a href="http://blog/?p=3007" title="Dokumentation mit TiddlyWiki">Dokumentation mit TiddlyWiki</a></li>
</ul>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-55972001859021183512014-12-12T00:51:00.000-08:002018-10-25T14:34:01.841-07:00Code Review Tools: Gerrit/Hub, Crucible, UpSource, ...In einer Mittagspause letzte Woche haben Thomas und ich mal kurz den Code Review-Service <a href="http://gerrithub.io/">GerritHub</a> angeschaut. <a href="http://blog/?p=1564" title="Pre-Tested Commit mit Git, Gerrit und Jenkins">Gerrit</a> selbst war ja hier im Blog auch schon einmal Thema. Bisher haben wir allerdings die Mühen für eine Testinstallation gescheut. Gerrit war da nicht soweit wie andere Projekte (download & start) sondern benötigte etwas mehr Arbeit.<br />
<br />
Der erste Eindruck von GerritHub war jedenfalls noch nicht so doll. <a href="http://de.wikipedia.org/wiki/Gerrit_%28Software%29">Gerrit</a> selbst ist cool. Was gibt es sonst noch?<br />
<a name='more'></a><br />
<ul><br />
<li>Ganz frish von JetBrains: <a href="http://www.heise.de/developer/meldung/JetBrains-stellt-Code-Review-Werkzeug-vor-2487515.html">UpSource 1.0</a>. IDE-Support kommt bald. Soll für Teams bis 10 Entwickler frei bleiben.</li>
<li><a href="https://de.atlassian.com/software/crucible/overview">Atlassian Crucible</a> - web based, 10$ für Einsteiger (<=5 Entwickler)</li>
<li><a href="http://getbarkeep.org/">Barkeep</a> - Standalone client. <a href="https://github.com/ooyala/barkeep/wiki/Comparing-Barkeep-to-other-code-review-tools">Comparing barkeep to other code review tools</a></li>
<li><a href="http://www.visualstudio.com/en-us/get-started/get-code-reviewed-vs.aspx">TFS TeamReview</a> - Wenn ich richtig verstehe, gibt es da zunächst nur für Visual Studio Online. Aber bestimmt gibt es da auch für TFS hosted.</li>
</ul>
Meine Einschätzung: JetBrains und Atlassian machen in dem Bereich wirklich gute Software und sind daher zu favorisieren. Eine endgültige Empfehlung fällt mir schwer, weil beide Hersteller auch selbst unterschiedliche CI-Server (TeamCity, Bamboo) und Ticket-Systeme bewerben (Jira, YouTrack). Nach Festlegung auf ein Produkt wäre man in der Wahl der umliegenden Komponenten daher eingeschränkt. Insgesamt hat Atlassian mit Confluence, HipChat u.a. insgesamt mehr im Portfolio zu bieten als JetBrains und ist damit glaube ich auch etwas etablierter, insbesondere Jira und Confluence scheinen sehr bekannt und bei vielen Firmen gesetzt zu sein.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-81392522158286506812014-12-11T06:58:00.000-08:002015-04-21T13:12:49.739-07:00Mocking in Java: JMockit, Mockito, ...In .NET i cannot imagine working without mocking frameworks like <a href="http://nsubstitute.github.io/">NSubstitute</a>. But<br />
every once in a while i do some Java. This autumn vacation i had a look at some mocking frameworks for Java. Starting with <a href="http://stackoverflow.com/questions/4105592/comparison-between-mockito-vs-jmockit-why-is-mockito-voted-better-than-jmockit">Stack Overflow: Comparison between Mockito vs JMockit - why is Mockito voted better than JMockit?</a> i did some quick tests with <a href="http://jmockit.github.io/">JMockit</a>. First impression: JMockit has all what you need and getting started is really easy.<br />
<br />
After asking around i got responses that the arrange-syntax might be a little lighter in <a href="https://code.google.com/p/mockito/">Mockito</a>.<br />
<br />
What mocking frameworks do you use?<br />
<br />
References:<br />
<ul>
<li><a href="http://stackoverflow.com/questions/4105592/comparison-between-mockito-vs-jmockit-why-is-mockito-voted-better-than-jmockit">Stack Overflow: Comparison between Mockito vs JMockit - why is Mockito voted better than JMockit?</a></li>
<li><a href="http://jmockit.github.io/about.html">About the JMockit Testing Toolkit</a></li>
<li><a href="http://jmockit.github.io/MockingToolkitComparisonMatrix.html">JMockit - Mocking Comparison Matrix</a></li>
</ul>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-14193289114057332332014-12-11T05:57:00.000-08:002015-04-21T13:19:46.496-07:00Atlas by HashiCorp: Vagrant, Packer & Co.Mitchell Hashimoto, founder of HashiCorp (think: Vagrant), <a href="http://www.heise.de/developer/meldung/HashiCorp-buendelt-Vagrant-Packer-Co-2487100.html">announced</a> the commercial cloud solution <a href="https://atlas.hashicorp.com/">Atlas</a> that bundles HashiCorp's Open-Source-Tools: Vagrant, Packer, Serf, Consul and Terraform.<br />
<br />
I had just a quick look at <a href="https://packer.io/">packer.io</a> which looks very promising. Anyway, i love the name and the logo of <a href="https://www.terraform.io/">terraform</a>.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-30805471023076235342014-12-01T01:42:00.000-08:002015-04-21T13:19:29.388-07:00Forrester Research: The Seven Habits Of Highly Effective DevOpsJust a quick link:<br />
<br />
<a href="http://www.serena.com/files/2114/1512/2921/Serena-Software-Forrester_The_Seven_Habits_Of_Highly_Successful_DevOps.pdf">The Seven Habits Of Highly Effective<br />DevOps</a><br />
<br />
Website: <a href="https://www.forrester.com/The+Seven+Habits+Of+Highly+Effective+DevOps/fulltext/-/E-RES93781">The Seven Habits Of Highly Effective<br />DevOps</a>Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-47278187539480576282014-11-21T02:38:00.000-08:002015-04-30T00:29:09.358-07:00Scrum-Butt-TestA quick and simpleTest: <a href="http://scrumbutt.me/">http://scrumbutt.me/</a>. I just gave a random shot. Result:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0TGqaqqiwp_OBlHO3e5KomCvsu05aiTHSQrCnhht2TP0meAUxAqB1k7h3hXddtfv4yPUcmUBEl4EbPTLAtE_iyglc1NN9P_t68-_DCmWYxseSD6D-9nOe3iPVXqRTVfdCYXhMT1Yh0v1q/s1600/scrum_butt_test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0TGqaqqiwp_OBlHO3e5KomCvsu05aiTHSQrCnhht2TP0meAUxAqB1k7h3hXddtfv4yPUcmUBEl4EbPTLAtE_iyglc1NN9P_t68-_DCmWYxseSD6D-9nOe3iPVXqRTVfdCYXhMT1Yh0v1q/s1600/scrum_butt_test.png" height="227" width="400" /></a></div>
<br />Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-76265584839277565152014-11-20T00:53:00.000-08:002015-04-30T00:29:23.869-07:00About Definition of Done (DoD)<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="margin-left: 1em; margin-right: 1em;">
</div>
<a href="https://blogger.googleusercontent.com/img/proxy/AVvXsEiO4CEu92vQIhcjolImzOSXRFKsOTCv8210z8v9k8L2_rjyr41cLkAv_XlDkJCgT5goo9IdJpgrcXS0uXNS9r_QUPeQ9gOhgYXBT-LAY5D1TQlWVMS_QkTXqqdQ1j3coqjgMpyZpNP1DtBNcZZj9bxs5fymLk2KQaq-lGjllnYwiSWwvSeASlvwnrVAr4d4ubDzIo1u39JrgOXojStCp-HP=" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://scrumshortcuts.com/wp-content/uploads/2013/07/Scrum-Shortcuts-Without-Cutting-Corners.jpg" height="200" width="151" /></a>Currently, i am reading <a href="http://www.scrumshortcuts.com/blog/">Ilan Goldsteins</a> fantastic book <a href="http://www.axisagile.com.au/about-the-book-scrum-shortcuts-without-cutting-corners/">Scrum Shortcuts Without Cutting Corners</a> which is full of practical suggestion that can directly be applied to your daily work. On today's morning walk i thought about <a href="http://scrumshortcuts.com/full-table-of-contents/chapter-4-requirement-refinement/">Shortcut 11: Developing the Definition of Done</a>.<br />
<br />
Ilan Goldstein points out that there cannot be any one standard definition of done (DoD) because it inevitably evolves. However, for beginners he suggests some typical DoDs. As a general rule, you should develop DoDs on different levels, e.g. one for <i>Release</i>, <i>User Story</i> and <i>Task</i>. An example DoD for level <i>Task</i> might be:<br />
<ul>
<li>Code has been unit-tested.</li>
<li>Code has been peer reviewed (if continual pair programming isn't being conducted) to ensure coding standards are met.</li>
<li>Code has been checked into source control with clear check-in comments for traceability</li>
<li>Checked-in code doesn't break the build (see <a href="http://scrumshortcuts.com/full-table-of-contents/chapter-6-questioning-quality/">Shortcut 18</a>).</li>
<li>The task board has been updated and remaining time for the task = 0 (see <a href="http://scrumshortcuts.com/full-table-of-contents/chapter-7-monitoring-and-metrics/">Shortcut 21</a>)</li>
</ul>
<div>
You can find the book website including TOC and sample chapters at <a href="http://scrumshortcuts.com/full-table-of-contents/">Scrum Shortcuts Without Cutting Corners</a></div>
<!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Fscrumshortcuts.com%2Fwp-content%2Fuploads%2F2013%2F07%2FScrum-Shortcuts-Without-Cutting-Corners.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/proxy/AVvXsEiO4CEu92vQIhcjolImzOSXRFKsOTCv8210z8v9k8L2_rjyr41cLkAv_XlDkJCgT5goo9IdJpgrcXS0uXNS9r_QUPeQ9gOhgYXBT-LAY5D1TQlWVMS_QkTXqqdQ1j3coqjgMpyZpNP1DtBNcZZj9bxs5fymLk2KQaq-lGjllnYwiSWwvSeASlvwnrVAr4d4ubDzIo1u39JrgOXojStCp-HP=" -->Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-31566919977680876112014-11-18T02:13:00.000-08:002018-10-25T14:41:17.621-07:00Anregung: Flake IdsImmer mal wieder stellen wir fest, dass das vielen DB-Implementierungen zugrundeliegende Identifier-Konzept ziemlich 90er ist und aktuelle Anforderungen nicht gut erfüllt. Kurz gesagt wird dabei der zur Verfügung stehende 64-Bit Wertebereich anhand des zu erwartenden Datenaufkommens und der vorab bekannten Anzahl der Standorte aufgeteilt.<br />
<a name='more'></a><br />
Da der Wertebereich einmal und für immer aufgeteilt wird, ist es problematisch wenn sich die zu Beginn getroffenen Annahmen später ändern (Datenaufkommen und/oder Anzahl Standorte). Bisher versuchten wir dem durch sehr großzügige Abschätzungen gerecht zu werden, jedoch leuchtet ein, dass dies auf Dauer kein tragfähiges Konzept ist, wenn wir aktuelle Kundenforderungen mit rasant wachsendem Datenaufkommen und dynamische Umgebungen bedienen wollen.<br />
<br />
In den letzten 10 Jahren haben sich GUIDs als Identifier zu einer charmanten Alternative entwickelt. Diese verwenden wir seit Kurzem. GUIDs haben zwar viele Vorteile, nachteilig ist allerdings der erhöhte Speicherplatz und dass sie im Allgemeinen nicht sortiert sind. Eine Ordnung auf dem Primärschlüssel einer Datenbank zu haben hat sich in den letzten Dekaden so etabliert, dass man es einfach gerne hat.<br />
<br />
Eine weitere immer populäre werdende Alternative sind sog. <a href="http://flakeidgenerators.codeplex.com/">Flake Ids</a> die erstmals mit <a href="https://github.com/twitter/snowflake">Twitters SnowFlake</a> Verwendung fanden. Dabei handelt es sich kurz gesagt um geordnete 64bit-Ids die auch von einem Client relativ einfach und eindeutig generiert werden können. Zusätzlich sind dort auch Bereiche für sog. Instance Ids vorgesehen, die man mit unseren Standort-Ids vergleichen könnte.<br />
<br />
Das hört sich doch gut an, oder? Gekommen bin ich darauf als wir die neueste <a href="http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/">ElasticSearch Distribution 1.4.0</a> integriert haben.<br />
<br />
Links:<br />
<ul>
<li><a href="http://blog.codinghorror.com/primary-keys-ids-versus-guids/">Coding Horror: Primary Keys: IDs versus GUIDs (2007)</a></li>
<li><a href="https://github.com/twitter/snowflake">twitter/snowflake (GitHub)</a></li>
<li><a href="http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/">ElasticSearch 1.4.0 Release Notes (Flake Ids)</a></li>
</ul>
<a href="https://www.blogger.com/null" name="nachtrag">Nachtrag</a><br />
<br />
Möglicherweise habe ich mit meiner Darstellung den Fokus zu stark eingeschränkt. Zwei Kollegen Wolfgang haben sich bisher zu Wort gemeldet und auf den ersten Blick festgestellt, dass Flake Ids konzeptionell nicht so sehr verschieden sind und anschließend die Vor- und Nachteile bezüglich der Bit-Verteilung aufgezeigt. Die Ähnlichkeiten sollten eine kurzfristige Portierung einfacher machen.<br />
<br />
Einer der wesentlichen Schmerzpunkte ist aus meiner Sicht, dass die Identifier in Oracle erzeugt werden während Flake Ids client-seitig generiert werden können. Das hat nicht nur aus architekturieller Sicht viele Vorteile und betrifft u.a. die folgenden Aspekte:<br />
<ul>
<li><strong>Testbarkeit/Wartbarkeit:</strong> Tests können erst sinnvoll stattfinden, wenn eine Oracle-Instanz da ist, d.h. erst ab der Integrationsphase. Unit-Tests scheiden da aus oder können nur mit unnötigem Extra-Aufwand gefahren werden. Das bedeutet, dass Fehler mit höherer Wahrscheinlichkeit erst später gefunden werden, deren Behebung dann unverhältnismäßig teurer ist (vgl. z.B. <a href="http://stackoverflow.com/questions/4130051/software-development-costs-pyramid">Software Development Costs Pyramid</a>). Mit Flake-Ids sind Unit-Tests auf Identifier-Logik trivial.</li>
<br />
<li><strong>Interoperabilität/Evolvierbarkeit:</strong> DBs die nicht auf Oracle basieren, z.B. NoDB-Varianten oder ElasticSearch, haben zur Zeit ggf. eine Abhängigkeit zu der Identifier-Sequence in Oracle. Für alternative DB-Implementierungen die auch eigenständig und unabhängig funktionieren wollen und sollen, ist das schon ein Show-Stopper. Auch wenn die Prozesskette des Imports mehr als ein Modul umfasst werden die Identifier erst ganz am Ende erzeugt. Mit Flake-Ids gibt es den Ausblick dass die Identifier konsistent schon weiter vorne direkt von den Importern erzeugt werden. Das kann u.a. die Nachvollziehbarkeit bei Prüfungen auf Vollständigkeit verbessern. Auch die Realisierung neuer Komponenten sowie die Wartung bestehender Komponenten, kann von der DB besser entkoppelt werden, sodass die Wahrscheinlichkeit von Wartezeiten aufgrund von Ressourcen-Flaschenhälsen durch Wissensinseln reduziert wird. Für mich ist das ein sehr starkes Argument.</li>
<br />
<li><strong>Vermittelbarkeit/Transparenz:</strong> Fragen wie <em>"Wie habt ihr in Projekt XY den Wertebereich gewählt"</em> oder <em>"Wie ist das mit den Identifiern wenn wir den Datenbestand von Kunde/Projekt XY anbinden wollen?"</em> sind bestimmt leichter zu beantworten. Fachliche Abstimmungen mit Kollegen, internen Teams oder Drittfirmen laufen wahrscheinlich reibungsfreier und einfacher ab wenn wir sagen können "Identifier-Konzept? Ja, wir verwenden Flake Ids.". Alles andere gibt es bei Google und GitHub.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://i.stack.imgur.com/8TcYd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Relative Cost of a Bugfix" border="0" class="" height="286" src="https://i.stack.imgur.com/8TcYd.png" width="320" /></a></div>
<div>
</div>
Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-8759010680000484782014-11-12T08:29:00.000-08:002015-04-21T13:44:45.308-07:00crashrpt (Google)Some time ago, i was looking for a crash dump library for C/C++ on Windows and found <a href="https://code.google.com/p/crashrpt/">crashrpt</a> which is a Google Library which supports collecting Mini-Dumps, Screenshots, Logs etc. as well as handling some typical pitfalls like thread hooking. The first impression was very good. Finally, it is available as NuGet-Package <a href="https://www.nuget.org/packages/CrashRpt.CPP/">CrashRpt.CPP</a>.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0tag:blogger.com,1999:blog-8789367958017646813.post-66036572132636720682014-11-07T01:53:00.000-08:002015-04-30T00:29:33.895-07:00Hanselman about JSONx: Inception-Style Nested Data FormatsIn <a href="http://www.hanselman.com/blog/CommentView.aspx?guid=4AAFA09F-2E66-4D40-A8B7-EBD19DAD5558">Inception-Style Nested Data Formats</a> Scott Hanselman comments on IBMs JSONx-Standard that supports representig JSON in XML. For good reason, he asks: "Why would one inflict this upon the world?". The comments section refer to a lot of projects you definitely do not want to be part of.Marcel Körtgenhttp://www.blogger.com/profile/14923717275875440456noreply@blogger.com0