Zum Inhalt

Autor: André

Linkdump KW16/2016

Containers are not VMs | Docker Blog – Schöne Erklärung der Unterschiede zwischen VMs und Docker (Container)

NPM & left-pad: Have We Forgotten How To Program? | Haney Codes .NET – Vor knapp einem Monat gab es ja in der NodeJS Welt ein mittelschweres Desaster, weil ein Paket mit einer trivialen Funktion nicht mehr mittels npm zur Verfügung stand. Grundsätzlich sollte man für Ein-Zeiler oder absolut simpel zu implementierenden Dingen keine Abhängigkeit in ein Projekt holen.

The Codist: My Biggest Regret As A Programmer – Interessante Lebensbeschreibung(/-beichte) von vom Softwareentwickler, der nicht zum Manager wurde, sondern immer bei seinen Wurzeln geblieben ist.

How To Be A Great Developer — Medium – Auch wenn der Artikel auf Medium veröffenlicht wurde, kann ich inhaltlich nur voll und ganz zustimmen.

The Single Piece of JavaScript on Hacker NewsHacker News wird vielen ein Begriff sein. Interessant zu sehen, wie man mit sehr einfachem JavaScript Code, in Zeiten von gefühlt exponentiellem Wachstum der Anzahl von JS Frameworks, ein sehr gutes Ergebnis erzielen kann.

Linkdump KW14/2016

Docker Misconceptions – Docker wird aktuell immer noch wie die heiße Sau durch das Dorf getrieben, auch wenn es mittlerweile etwas abkühlt. Docker löst eben nicht einfach so alle Probleme in Luft auf, sondern wenn die zugrunde liegenden Dinge nicht verstanden hat, hat man eher man als weniger Probleme.

A day in the life of a slow page at Stack Overflow – Zugegeben etwas älter, aber im Kern immer noch top aktuell. ORM „kosten“ häufig einfach zu viel, gerade wenn es einem auf die Performance ankommt.

Und nachts ist es kälter als draußen | Übermedien – Viele Wettervorhersagen sind wirklich immer mehr auf Clickbait bzw. Sensationshascherei ausgelegt. Schöne Darstellung von Jörg Kachelmann.

TIL – Reihenfolge von ASP.NET MVC Exception Filtern

Als ich Gestern ein wenig mit Exception Filtern 1 experimentiert habe und ich hierbei zwei Filter für eine Methode gesetzt habe, ist mir aufgefallen, dass die Reihenfolge in der die Filter aktiviert wurden, nicht der entsprach, die ich erwartet habe. Als ich dann zusätzlich auch noch dem Filter Attribut die Order-Eigenschaft mitgegeben habe, war die Reihenfolge dann immer noch nicht wie erwartet.

Konkret sah das einfache Beispiel wie folgt aus.

[ExceptionLoggingFilter1(Order = 1)]
[ExceptionLoggingFilter2(Order = 2)]
public ActionResult Demo3()
{
    var value = int.Parse("test");
    return View("Index");
}

Erwartet habe ich, dass zunächst ExceptionLoggingFilter1 und dann ExceptionLoggingFilter2 abgearbeitet wird. Allerdings war es genau anders herum. Eine kurze Recherche brachte mich dann zu 2 und der Erkenntnis, dass OnActionExecuted, OnResultExecuting und OnException in umgekehrter Reihenfolge ausgeführt werden.

Will man also, wie ich es ursprünglich vor hatte, erst ExceptionLoggingFilter1 und dann ExceptionLoggingFilter2 abgearbeitet haben, muss der Code wie folgt aussehen.

[ExceptionLoggingFilter1(Order = 2)]
[ExceptionLoggingFilter2(Order = 1)]
public ActionResult Demo3()
{
    var value = int.Parse("test");
    return View("Index");
}

Einen wirklichen Sinn kann ich darin nicht erkennen, aber in diesem Fall ist die Hauptsache, dass man weiß, dass es so ist und entsprechend berücksichtigen kann.

Linkdump KW13/2016

Arbeitgebersiegel: Geschäfte mit dem schönen Schein – Arbeitswelt – FAZ – Schöner Artikel, der mal den ganzen Zinnober hinsichtlich der Zertifikate für „Beste“-Arbeitergeber näher betrachtet.

Terror in Brüssel: Mathias Döpfner über die Anschläge und die Freiheit – Man kann über die Bild-Zeitung und Herrn Döpfner im speziellen denken was man mag, aber in diesem Artikel bringt es wirklich gut auf den Punkt. Auch wenn es in diesen schwierigen Zeiten eine angemessene Reaktion zu scheint, so sollten wir mit allem was wir haben in diesen Zeiten unsere Freiheit verteidigen und nicht mal eben so unsere Bürgerrechte und den damit verbundenen Datenschutz aufgeben. Dann das würde nur die Angst schüren, die allgemeine Verunsicherung vergrößern und den Terroristen so in die Hände spielen.

Why we should fear a cashless world – Auch wenn ich persönlich bargeldloses Zahlen schätze, so schätze ich doch auch sehr die Möglichkeit von Zeit zu Zeit Dinge Bar bezahlen zu können.

A Great JavaScript Side Project is your Most Important Asset – Ein „Side Project“ zu haben schadet in keinem Fall. Auch wenn es ja nicht zwingend in JavaScript sein muss, so gibt es wirklich gute Gründe dafür, auch neben der eigentlich Arbeit noch ein wenig seinem Hobby nachzugehen.

Visual Studio Multilanguage bzw. Sprache wechseln

Als Entwickler will man in der Regel Visual Studio (VS) in englischer Sprache benutzen, zumindest geht es mir so. Wenn man aber aus Gründen, die man nicht beeinflussen kann, eine deutschsprachige Installation von VS vorfindet, so muss man es nicht neu installieren, um die Sprache zu wechseln, sondern kann einfach ein zusätzliches Sprachpaket herunterladen. Die entsprechenden Schritte hierzu findet man in der folgenden Anleitung.

Sprache von Visual Studio ohne Neuinstallation ändern

Linkdump KW12/2016

Why fruits and vegetables taste better in Europe – Vox – Eine interessante Betrachtung der Wertschätzung gegenüber Lebensmittel in verschiedenen Kulturkreisen unserer Welt und was daraus für die Qualität der Produkte resultiert.

Flow Requires Focus, Not Time – Fast jeder Entwickler weiß was gemeint ist, wenn bspw. von „Flow“ oder „im Tunnel sein“ gesprochen wird. Meine Erfahrung deckt sich teilweise mit diesem Artikel. Häufig erfordert es einfach nur Fokus, um ein Problem zu lösen. Allerdings hat meine persönliche Erfahrung gezeigt, dass manchmal doch die Zeit ein Faktor ist, gerade bei Debugging-Sessions bei denen man im Kopf die „Variablen sortieren muss“.

Tips for Writing Short Emails Without Being Rude – The Muse – Hier greift meiner Meinung nach das alte Sprichwort „Der Ton macht die Musik“.

The Future Of Collaboration Is Asynchronous – Man merkt es ja auch im privaten Umfeld, immer weniger Leute telefonieren mit Ihrem Smartphone, sondern benutzen ihr „Telefon“ immer mehr nur als Messaging-Endgerät. Auch beruflich bietet asynchrone Kommunikation viele Vorteile, die leider von vielen Leuten noch immer nicht verstanden haben. Der Klassiker für mich ist immer noch, dass jemand eine Email schickt und direkt danach anruft, um die Email zu erklären.

Ehemaliger Nixon-Berater: ‚War on Drugs‘ sollte Waffe gegen Schwarze und Hippies sein – Sollten sich diese Dinge wirklich so zugetragen haben, dann ist das wirklich ein starkes Stück. Viele historische Aspekte müssten meiner Meinung nach, dann ganz neu bewertet werden, vom diskriminierenden Faktor mal ganz abgesehen, welcher dann wirklich unerhört wäre.

TIL – IntelliTrace „bremst“ ADO.NET Aktionen

Das „bremst“ im Titel steht ganz bewusst in Anführungszeichen, aber ein besserer Begriff ist mir für dieses Verhalten nicht eingefallen. Ich wollte heute eigentlich eine ganze einfache Datenbankoperation im Rahmen eines Programms implementieren. Es sollte einfach eine bestimmte Menge Datensätze generiert (ca. 1500) und in einer SQL Server Tabelle persistiert werden. Je nach Performanz des SQL Server eigentlich eine Sache von unter 1 Sekunde.

Allerdings kam mir dann IntelliTrace in die Quere bzw. hat dafür gesagt, dass die Datenbankoperation scheinbar mehr Zeit in Anspruch genommen hat, als ich vorher gedacht habe. Fairerweise muss ich sagen, dass ich mich mit IntelliTrace bis zu diesem Zeitpunkt noch nicht detailliert bis gar nicht auseinander gesetzt habe. Eine gute Einleitung in IntelliTrace bietet 1. Auf jeden Fall ist IntelliTrace seit 2010 ein Bestandteil von Visual Studio. Allerdings werden die IntelliTrace Information seit VS2015 nicht mehr in einem eigenen Fenster dargestellt, sondern sind jetzt in einem Tab in den Diagnostic Tools integriert.

Grundsätzlich gibt es die Möglichkeit mittels IntelliTrace alle Informationen zu sammeln und später zu filtern oder nur die Information zu sammeln, die einen konkret interessieren, und später nicht mehr filtern zu müssen. Genau dieser Umstand bzw. die Tatsache das hierbei bestimmte Defaults gesetzt hatzu dieser „Bremse“ geführt.

Der gesamte Code für dieses einfache Beispiel sieht wie folgt aus, wobei das wirklich nur ein Beispiel ist, um das Verhalten zu demonstrieren und so mit Sicherheit nicht für einen produktiven Einsatz gedacht/geeignet ist.

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Demo"].ConnectionString);
conn.Open();
 
SqlTransaction trans = conn.BeginTransaction();
Console.WriteLine("Start: {0}", DateTime.Now);
for (int i = 0; i < 2000; i++)
{
    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.Transaction = trans;
    command.CommandText = "INSERT INTO dbo.OpenWeek (Id, CW, [User], Completed) VALUES ("+i+", 201611, 'Demo" + i +
                        "', 0);";
    command.ExecuteNonQuery();
}
trans.Commit();
Console.WriteLine("Start: {0}", DateTime.Now);
Console.WriteLine("Done");
Console.ReadKey();

Mit den Standardeinstellungen habe ich immer ungefähr die folgenden Zeiten erreicht.

In den Diagnostics Tools habe ich dann die folgenden Information gesehen:

Danach habe ich den Einstellungen von IntelliTrace sämtliche ADO.NET Events deaktiviert.

Danach sind die Zeiten entsprechend so, wie ich sie ursprünglich erwartet habe.

Da ich, wie Eingangs erwähnt, mich noch nicht im Detail mit IntelliTrace befasst hatte, hat mich erst 2 auf den richtigen Weg gebracht. Abschließend sei aber noch gesagt, dass einem IntelliTrace erst in die „Quere“ kommt, wenn man die Enterprise Edition einsetzt. In der Professional und Community Edition von Visual Studio ist dieses Feature nicht enthalten.

Falls jemand gerade kein VS2015 Enterprise Edition zur Hand hat und sich dieses Feature dennoch ansehen möchte, so gibt es unter 3 eine fertige virtuelle Maschine in der eine entsprechende Umgebung fertig eingerichtet ist. Weiterhin gibt es auch ein schönes Hands-On Lab 4, welches einem den Umgang mit IntelliTrace näher bringt.

Linkdump KW11/2016

Who Needs GitHub? Run GitLab on a USB Stick with Docker | Elton Stoneman – Docker, Docker, Docker! Man hört/liest es im Moment an jeder Ecke. Der Einsatz ist häufig nicht immer sinnvoll, für diesen speziellen Anwendungsfall finde ich den Ansatz aber gut. Leider ist die Docker-Nutzung noch immer *nix only.

Getting Six Hours of Sleep Can Be Just as Bad as Not Sleeping at All – Die genaue Zahl an „benötigten“ Stunden variiert von Person zu Person natürlich leicht aber ich kann aus eigener Erfahrung des Schlafmangel nicht gerade zur Produktivität beiträgt. Wenn man dann hierzu auch Meldungen wie „Wie gefährlich ist das ungesunde Schlafverhalten unserer Politiker?“ berücksichtigt, fragt man sich, ob es vielleicht nicht besser wäre, wenn unsere Politiker auch mehr schlafen würden?

Lasst mich in Ruhe mit den Kindern, die ich nicht haben will › ze.tt – Schöner Standpunkt für dieses Thema. Im Alltag erlebt man leider immer noch sehr oft, dass Menschen nicht objektiv über dieses Thema sprechen können.

Linkdump KW10/2016

Zeal – Praktisch um Dokumentationen verschiedener Sprachen/Frameworks offline verfügbar zu machen (Cross-Plattform)

Announcing SQL Server on Linux – Hell freezes over! Schon sehr interessant, welchen Wandel Microsoft in den letzten Jahren vollzogen hat. Es wird sich noch zeigen müssen, welche langfristige Strategie dahinter steckt.

What Happens To Older Programmers/Developers? – Im Kern eigentlich immer die gleiche Aussage und meiner Meinung nach auch relativ allgemeingültig für andere Berufe. Wer gedanklich stehen bleibt und sich nicht permanent weiter entwickelt, wird nicht nur körperlich alt.

Do Fewer Things, Better – Entscheidend ist, dass man sich auf wenige Dinge konzentriert und diese dann versucht zur Meisterschaft zu führen.

GitHub lock-in? – Solange man Dinge nicht selber betreibt, hat man immer eine gewisse Art von Vendor Lock-in. Allerdings hat man auch einen Vendor Lock-in, wenn man ein proprietäres Produkt, in diesem Fall passt Team Foundation Server ganz gut, auf eigener Hardware betreibt. Hiermit kann man auch nicht komplett ohne Aufwand auf eine andere Lösung wechseln.

9 Todsichere Wege, Mitarbeiter Zu Demotivieren – Wie wahr, wie wahr. Gerade die Punkte sechs und neun sind in meinen Augen wirkliche Motivationskiller.

TIL – Spaß mit Bitmasken

Häufiger hat man die Anforderung bestimmte Einstellungen zu speichern. In manchen Fällen kann man pro Einstellung bspw. ein Datenbankfeld verwenden und jeweils mit einem Tinyint den Zustand speichern. Allerdings gibt es auch Fälle in denen es Sinn ergeben kann hierfür eine Bitmaske zu verwenden.

Hilfreich ist, dass das .NET Framework alle Werkzeuge, auch für die Konvertierungen zwischen den verschiedenen Datentypen, von Haus aus schon mitbringt.

Hierzu kann man einfach eine simple Enumeration erzeugen und mittels des „Flags“ Attribut kennzeichnen, dass die Enumeration auch als Bitfeld genutzt werden kann.

Ein einfaches Beispiel hierfür kann wie folgt aussehen:

[Flags]
public enum EditDataMode
{
    Create = 1,
    Read = 2,
    Update = 4,
    Delete = 8
}

Eine Instanz kann nun wie folgt erzeugt werden.

EditDataMode dataMode = EditDataMode.Read | EditDataMode.Create | EditDataMode.Delete;

Mittels einer einfachen Hilfsmethode kann man nun prüfen, welches Flag gesetzt ist.

static bool IsFlagSet(EditDataMode bitmask, EditDataMode flag)
{
    return (bitmask & flag) != 0;
}

Nun kann man bspw. prüfen, ob das „Create“-Flag gesetzt ist.

if (IsFlagSet(dataMode, EditDataMode.Create))
{
    Console.WriteLine("Create flag is set.");
}

Praktisch ist, dass man diesen Wert, also die Repräsentierung der Instanz auch als int oder string ausgeben kann.

Console.WriteLine("From EditDataMode to int: {0}", (int)dataMode);
Console.WriteLine("From EditDataMode to string (bin): {0}", Convert.ToString((int)dataMode, 2));

Auch der umgekehrte Weg ist so einfach zu realisieren. Hat man die Bitmask in irgendeiner Form als string gespeichert, so kann man diesen auch einfach wieder in Klassen-Objekt verwandeln.

string input = "0011";
Console.WriteLine("Input: {0}", input);
int convertedInput2Bin = Convert.ToInt32(input, 2);
 
Console.WriteLine("Converted input from string to int: {0}", convertedInput2Bin);
EditDataMode inputDataMode = (EditDataMode) convertedInput2Bin;
Console.WriteLine("EditDataMode to string: {0}", inputDataMode.ToString());

Ein vollständiges Beispiel habe ich bei Github abgelegt.

ExploBitmask

Quellen: