n-Develop

Thoughts and opinions about .NET, C# and other things.

cat und grep auf der PowerShell

Jeder, der im Enterprise-Umfeld hin und wieder Logs durchforsten darf, kennt das. Bei bestimmten Kunden ist log4net (oder log4j oder was auch immer) so konfiguriert, dass am Ende des Tages riesige Log-Files auf der Platte liegen. 100MB und mehr sind da keine Seltenheit. Spätestens, wenn man wegen eines Bugs oder wegen etwas anderem das Log-File nach bestimmten Begriffen durchsuchen will, kommt man schnell an bestimmte Grenzen. Viele Editoren öffenen keine Text-Dateien über einer bestimmten Grenze. Und selbst wenn sie die Datei öffnen, dauert jede Aktion darin mehrere Sekunden.

cat und grep

Auf Linux würde ich für solche Fälle die Befehle cat und grep verwenden. Mal angenommen ich suche nach der Zeichenkette "Meldung vom Bug". In dem Fall sähe der Aufruf vermutlich so aus:

cat riesigesLogFile.log | grep "Meldung vom Bug"

Aber wie erreicht man diese Funktionalität auf Windows?...


Ein eigener Telegram-Bot als Notification-Service

Ich nutze bereits seit einiger Zeit Telegram als meinen primären Messenger. WhatsApp benutze ich tatsächlich nur noch für eine handvoll Freunde. Der Großteil meiner Freundeskreises und meine komplette Familie ist inzwischen über Telegram zu erreichen.

Telegram bietet bereits seit einiger Zeit Bots an und in diesem Rahmen natürlich auch die Möglichkeit eigene Bots zu erstellen. Bis vor ein paar Tagen hatte ich allerdings keinen konkreten Anwendungsfall um für mich persönlich einen Bot einzurichten. Nachdem ich mich aber etwas mit der Thematik befasst habe, wurde mir schnell klar, dass ich den Bot für eigene Benachrichtigungen nutzen könnte.

Welche Schritte nötig sind um einen solchen Bot zu erstellen und wie ich meine Benachrichtigungen umgesetzt habe, möchte ich im Folgenden zeigen...


Ein einfacher Bot mit dem Microsoft Bot-Framework

Ich habe mich in den letzten Tagen etwas mit dem Microsoft BotFramework befasst. Mit dem BotFramework stellt Microsoft eine wirklich einfach Möglichkeit zur Verfügung, eigene Bots zu entwickeln. Wenn wir in diesem Kontext von einem Bot sprechen, sprechen wir von einem Conversational User Interface, kurz CUI. Bei den diesen Bots geht es um die Steuerung über Sprache. Dabei spielt es keine Rolle ob die Befehle gesprochen oder geschrieben werden. Der Bot nimmt den Satz auf und versucht daraus seinen Befehl abzuleiten.

Wir wollen heute einen Bot erstellen, der nichts weiter macht als ein paar einfache Reaktionen auf einfache Fragen zu geben. Um diesen Bot zu schreiben, den man in eine Website, Skype, Telegram, Slack und andere Plattformen integrieren kann, bedarf es erstaunlich wenig Schritte...


Code Kata: Bowling Game

Der regelmäßige Leser dieses Blogs weiß, dass ich ein großer Fan des Test-Driven Developments bin. Aber wie alles im Leben muss man auch TDD und andere Techniken üben. Aber wie übt man TDD am besten? Meiner Erfahrung nach ist es schwierig ein Buch zum Thema zu lesen und die beschriebenen Techniken sofort produktiv einzusetzen. Üben sollte man also an kleinen, einfachen "Versuchsobjekten". Für diesen Zweck gibt es sogenannte Code Katas.

Was genau ist eine Kata?

Der Begriff "Kata" kommt ursprünglich aus den japanischen Kampfkünsten. Dort beschreibt er meist einen einstudierten Kampf gegen einen imaginären Gegner. Die häufige Wiederholung dieser Kata dient also dazu die Bewegungsabläufe zu verinnerlichen.

Eine Code Kata funktioniert ähnlich. Das Ziel dabei ist eben nicht die Aufgabe mit dem perfekten Ergebnis zu lösen. Es geht viel mehr darum, die eingesetzten Techniken zu verinnerlichen. Ein gutes Beispiel ist...


Entfernen von Gutscheincodes aus einer uCommerce-Order

uCommerce bietet für viele Tätigkeiten eine passende API. Möchte man zum Beispiel einen Gutscheincode zum aktuellen Warenkorb hinzufügen, nutzt man einfach MarketingLibrary.AddVoucher(code);. Der Rückgabewert der Funktion ist ein bool, der verrät, ob der Gutscheincode erfolgreich hinzugefügt werden konnte.

Lücken in der API

Hin und wieder gibt es auch den Wunsch, einen bereits eingegebenen Gutscheincode wieder zu entfernen. Zum Beispiel, wenn nur ein Gutscheincode pro Bestellung zugelassen ist und man nach der Eingabe des ersten Codes noch einen besseren Code gefunden hat. Vermuten würde man, analog zum obigen Funktionsaufruf, die Funktion MarketingLibrary.RemouveVoucher(code);. Klingt doch logisch. Nur leider existiert diese Funktion nicht....


von Absolventen und JS-Frameworks

Vor einigen Monaten habe ich ein Gespräch mit einem anderen Entwickler geführt, dass mich ziemlich schockiert hat.

Sinngemäß fiel dabei die folgende Aussage:

Ich möchte mich mittelfristig beruflich neu ausrichten. Denn, machen wir uns nichts vor, wenn mein Chef einen Absolventen von der FH einstellt und man uns beiden ein neues JavaScript-Framework vor die Füße wirft, hat der das sicher doppelt so schnell verinnerlicht wie ich. Was habe ich denn im Vergleich zu so einem Pfiffikus zu bieten? Nur meine Erfahrung.

Unverständnis

Da war ich wirklich platt. "Nur" meine Erfahrung? Erst war ich mir nicht sicher, ob ich mich vielleicht verhört habe. Aber im Laufe des Gesprächs wurde mir klar: Das ist sein Ernst.

Um das kurz zu klären: Der Kollege...


von zerbrochenen Fenstern und Quellcode

Fast jeder kennt ein Haus in seinem Ort oder in der direkten Nachbarschaft, das schon eine ganze Weile nicht mehr bewohnt ist. Was haben diese Häuser in den unterschiedlichsten Städten gemeinsam? Zerbrochene Fenster. Aber warum sind all die Fenster zerbrochen. Klare Antwort: Weil sie von Vandalen eingeworfen wurden. Ihr habt sie alle vor Augen. Diese halbstarken Jugendlichen, die keinen Respekt vorm Besitz anderer Leute haben.

Die These

Heute verrate ich euch ein Geheimnis. Die gerade beschriebenen Halbstarken haben in der Regel nur das erste Fenster zerbrochen. Alle anderen können genauso gut vom freundlichen Nachbarn, dem netten Betreiber des kleinen Kiosks oder vom ständig gestressten Geschäftsmann eingeworfen worden sein. Glaubt ihr nicht? Philip Zimbardo hat das Experiment gewagt. ...


Biergarten-Beobachtungen

Es ist Sonntag. Und ein besonders schöner Sonntag noch dazu. Bei 27 Grad und Sonnenschein sitze ich im besten Biergarten, den ich mit dem Fahrrad in kurzer Zeit erreichen konnte. Das ist ein toller Start in die Elternzeit. Die nächsten 3 Monate darf ich mich voll und ganz um den Nachwuchs kümmern. Das wird super. Allerdings haben meine Schwiegereltern darauf bestanden den Sohnemann heute abend bei sich zu behalten. Ich "feiere" den Start in die Elternzeit also ohne Kind. Seltsam.

Ich habe schon den ein oder anderen Blog-Artikel an öffentlichen Orten geschrieben. In der Bahn, im Café oder auf einer Bank an der Alster. Überall dort fiel ich nicht weiter auf. Es war nichts Ungewöhnliches daran, dass dort jemand sitzt und auf die Tastatur seines Laptops oder Tablets einhackt. Das ist heute allerdings anders. Ich bin nicht in Hamburg. Nicht mal in Hamburgs "Speckgürtel". Ich bin auf'm Dorf. Hier sind andere Sachen normal. ...


Kurznotiz: Fehlende Views nach Deployment auf Azure WebApp

Vor ein paar Tagen hatte ich das Problem, dass manche Views nicht auf meiner Azure-WebApp deployed wurden. Egal ob es über meinen Continuous Deployment-Prozess lief oder ich direkt über Visual Studio gepublished habe. Die Views kamen einfach nicht auf dem Server an.

Die Lösung war einfach. Aber die Suche nach dieser hat deutlich länger gedauert, als man denken sollte. Ich hoffe, dass ich mit diesem Blog-Post für den ein oder anderen die Suche etwas verkürzen kann. ...


Eigene Sitecore-Pipelines entwickeln

Wer sich mit Sitecore-Entwicklung befasst, kommt nicht drum herum, sich auch mit den Sitecore-Pipelines zu beschäftigen. Die Pipelines bieten oft einen guten Einstiegspunkt, wenn man eigene Funktionalität irgendwo einklinken will. Doch hin und wieder reichen die vorhandenen Pipelines nicht aus. Denn dann möchte man vielleicht selbst Funktionalität hinzufügen, die von anderen erweiterbar ist.

Aber wie erstellt man eigentlich eine eigene Pipeline? Das ist insgesamt sogar recht einfach.

Das Kind braucht einen Namen

Wir beginnen damit die Pipeline selbst zu definieren. Dazu erstellt man eine neue .config-Datei unter App_Config/Include. In unserem Beispiel soll diese Datei Custom.SamplePipeline.config heißen. Die Pipeline selbst soll entsprechend samplePipeline heißen. ...