Archiv

Autor Archiv

CLIQZ, der bessere Browser

Kürzlich wurde ich auf einen jungen alternativen Browser hingewiesen. Die Versprechen der Präsentation des Programms und Berichte über CLIQZ klingen gut: „der bessere Firefox“, „der sichere Browser“, „ein Browser, welcher nicht schnüffelt“. Eine kurze Recherche zeigt, dass sich ein Blick lohnen kann!
Normalerweise nutze ich schon sehr lange Google Chrome. Darin habe ich als zusätzliche Erweiterungen lediglich Ghostery und Vimium installiert und habe so ein für mich gutes Maß an Sicherheit, Komfort, Effizienz und Geschwindigkeit erreicht. Das erste Plugin reduziert Werbung und Tracking auf ein Minimum. Das zweite Plugin ermöglicht mir die Navigation mittels Tastatur, da ich damit durch den Verzicht vom Einsatz der Maus effektiver arbeiten kann.

CLIQZ basiert auf Mozilla Firefox. Der Vorsprung, den Google Chrome vor Jahren innen hatte, ist mit der Zeit stark geschmolzen. So gilt dies auch für den darauf basierenden CLIQZ. Alles Wichtige ist vorhanden und die Seiten werden schnell und gut dargestellt.

Sehr positiv finde ich die Integration von Ghostery, da ich selbst ein fleißiger Nutzer des Plugins im Google Chrome Browser bin. Damit kann Werbung reduziert werden und gleichzeitig die überall durchgeführte Übermittlung persönlicher Daten auf ein Minimum beschränkt werden. Negativ finde ich die fehlende Option, andere PlugIns von Firefox ebenfalls zu installieren, dass schränkt mich persönlich sehr stark ein. Die vom Hersteller ins Feld geführten Sicherheitsgründe sind aber aus diesem Blickwinkel nicht widerlegbar. Die Übersetzung der Oberfläche ins Deutsche ist ebenfalls gelungen und wird viele deutschsprachige Nutzer ansprechen.

Die Mehrheit der Anwender wird damit einen Browser erhalten, der sinnvoll eingestellt ist bzw. mit wenigen verständlichen Klicks konfiguriert werden kann. Anwender, die ohne tiefere Computer-Kenntnisse einen sichereren Browser nutzen möchten, werden also gut bedient! Anwender, welche Ihren Arbeitsplatz sehr individuell konfigurieren möchten, sollten unter Windows bei Firefox oder Chrome bleiben.

Ob das Geschäftsmodell über die Jahre tragfähig bleibt, wird sicher spannend. Der Start ist vielversprechend!

KategorienAllgemein Tags:

NDepend 2017, ein Update

25. April 2017 Keine Kommentare

Vor gut 3 Jahren habe ich hier eine Bewertung von NDepend veröffentlicht. Nun ist vor kurzem der Hinweis auf eine größere Aktualisierung eingetroffen. Diese neue Version habe ich wieder unter die Lupe genommen und in aktuellen Projekten mit Visual Studio 2015 getestet. Für alle Programmierer, welche dieses Tool nicht kennen:

NDepend ist eine Software, mit der die Softwarequalität eines .NET-Programms überprüft werden kann. Für die Überprüfung und Auswertung stehen sehr viele Möglichkeiten zur Verfügung. Durch historische Betrachtungsmöglichkeiten kann ebenfalls eine zeitliche Entwicklung der Qualität geprüft und sichergestellt werden.

Die Installation war vertraut, es ist ein wenig Handarbeit angesagt, die einen Software-Entwickler in keinster Weise vor Fragen stellt. Danach ist das PlugIn in Visual Studio einsatzbereit oder mal kann eine lokale Version nutzen. Jetbrains Resharper beispielsweise nimmt einem bei der Installation etwas mehr Arbeit ab, wirklich schneller ist man aber damit aber nicht fertig. NDepend legt eigene Projektdateien zu einem Visual Studio Projekt an. Damit ändert sich am eigentlich Projekt nichts und Entwickler ohne NDepend und auch die Versionsverwaltung werden nicht beeinflusst. Das gibt einen großen Pluspunkt von mir!

Im den letzten 3 Jahren haben die Entwickler gute Arbeit geleistet. Es wird nun automatisch per Default eine Historie aufgebaut, für Vergleiche herangezogen und auch bei den Auswertungen entsprechend dargestellt. So hat man quasi immer gleichzeitig die Übersicht über alle gefundenen Probleme, kann aber auch erst mal nur die aktuell hinzugekommenen Probleme ansehen. Hier sind viele Einstellmöglichkeiten vorhanden. Ein großer Pluspunkt ist die unglaubliche Anzahl von sinnvollen Optionen, aber zeitweise auch ein Minuspunkt -> man muss erst einmal den Überblick gewinnen und behalten. Auf einem Rechner mit einem normalen Monitor macht das keinen Spaß. Eine Dualscreen-Konfiguration in 4k war hierfür wesentlich effizienter nutzbar.

Ich habe NDepend mit Projekte im WinForm, Asp.Net Webform und Asp.Net MVC Bereich ausprobiert. Hier gab es viele sinnvolle Warnungen und Fehler, die im geprüften Quellcode korrigiert werden sollten. Bei Asp.Net mit WebForms wurden aber auch die Zusammenhänge zwischen Aspx-Formular und Code nicht erkannt, was in sehr vielen Fehlern resultierte, die nicht korrigiert werden können. Hier wird der Hersteller sein Regelwerk noch prüfen.

Apropos Regeln: Es ist eine klare Ausrichtung auf den professionellen Entwickler mit einem Sinn für guten wartbaren Code erkennbar. Alle vordefinierten Regeln sind gut erklärt und über eine interne Linq-ähnliche Sprache anpassbar.

Wie viele Softwarefirmen haben auch die Macher von NDepend ihr Lizenzmodell auf eine Jahresgebühr gestellt. Das ist nachvollziehbar, da ein Produkt wie NDepend eigentlich permanent weiterentwickelt und aktualisiert werden muss, um mit Visual Studio und neuen Funktionalitäten eingesetzt zu werden. Ob der Preise zu hoch oder tief ist, sollte jeder für sich entscheiden. Wer die Softwarequalität seines Teams im Auge behalten will, wir aber sicher nicht an den Kosten scheitern.

KategorienCCD, Microsoft .NET Tags: ,

Sprung in der Identity Spalte beim SQL Server 2012

23. August 2016 Keine Kommentare

Kurz nach der Migration einiger Datenbank von einem SQL Server 2008 auf einen SQL Server 2016 ist aufgefallen, dass es große Sprünge in den Identity-Spalten gab, die nicht durch verworfene Datensätze erklärt werden konnten. Dabei ging es jeweils um Sprünge von ca. 1000 oder sogar 10.000. Die Ursache ist in der MSDN zu finden:

The identity property on a column does not guarantee the following: … Consecutive values after server restart or other failures – SQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. This can result in gaps in the identity value upon insert.

Dieser Sprung beträgt bei Spalten mit bigint aber bis zu 10.000, bei Spalten mit int immerhin noch 1.000. Da ist sehr viel und bringt einen in einen Erklärungsbedarf. Basierend auf diesem Beitrag lässt sich das Problem leicht nachstellen:

CREATE TABLE MyTestTable(Id INT IDENTITY(1,1), Name VARCHAR(255));
 
DECLARE @i INT = 100000
 
While @i > 0
BEGIN
    INSERT INTO MytestTable (Name) VALUES ('Test2')
    SET @i = @i-1
END

Während diese Schleife läuft (das Problem tritt nur bei Tabellen in Verwendung auf!), den SQL Server neu starten. Dann

INSERT INTO MyTestTable(Name) VALUES ('Mr.Jackson'); 
 
SELECT Id, Name FROM MyTestTable ORDER BY Id DESC;

SQL Start Option T272
Damit sollte das Problem sichtbar sein. Eine Option ist die Nutzung von Sequenzen mit der NOCACHE Option, anstatt auf IDENTITY Spalten zu setzen. Wenn diese Option zu aufwendig ist, kann auch die Option -T272 für die komplette Instanz genutzt werden. Damit ist das alte Verhalten (bis SQL 2008) wiederhergestellt.

Es bleibt noch anzumerken, dass das TRACE Flag T272 das Caching-Verhalten für die Generierung von Identity-Werten deaktiviert. Negative Auswirkungen auf die Performance beim Erzeugen neuer Datensätze sind somit möglich.

KategorienDatenbank Tags:

Daten per SQL INSERT ohne Schlüsselspalte kopieren

5. August 2015 Keine Kommentare

Immer wieder steht man vor der Aufgabe, Datenmengen innerhalb einer Tabelle zu kopieren. Typisierte Datenzugriffsschichten, wie das Entity Framework, bieten zwar viel Komfort, lassen aber zukünftige DDL Updates außen vor. Ein Update des Datenmodells, speziell mit ergänzten oder gelöschten Spalten erzwingt dann automatisch ein Update der Anwendung, wenn die Kopierfunktion vollständige Kopien anlegen soll. Bei oft geänderten Tabellen wir das zu einem Problem. Zudem sind komplexere Kopieroperationen direkt auf dem Server mittels einer StoredProcedure meist wesentlich schneller.

Hier bietet sich natürlich die Lösung mit einem INSERT SQL an:

INSERT INTO MyTable SELECT mt.* FROM MyTable mt;

Das Problem mit diesem Befehl sind aber IDENTITY Spalten, die nicht übergeben werden dürfen. Dies kann man natürlich durch Angabe der Spaltennamen umgehen. Damit landet man aber wieder am Anfang des Problems. Die Spaltennamen müssen fest definiert oder zuvor aufwändig ermittelt werden.

Eine andere Lösung lässt sich jedoch über temporäre Tabellen entwickeln. Man erstellt mit SELECT INTO eine temporäre Tabelle mit den benötigten Daten. Deren Identity-Spalte kann man problemlos verwerfen und danach funktioniert ein INSERT INTO ohne Problem:

CREATE PROCEDURE dbo.CopyTable @SourceId BIGINT
AS 
  SET NOCOUNT ON;
 
  IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP TABLE #MyTable;
 
  SELECT mt.* INTO #MyTable FROM MyTable mt WHERE mt.Id = @SourceId;
 
  ALTER TABLE #MyTable DROP COLUMN Id;
 
  INSERT INTO MyTable SELECT mt.* FROM #MyTable mt;
 
  IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP TABLE #MyTable;
 
  SET NOCOUNT OFF;
GO

Ein weiterer Vorteil ist das einfach Aktualisieren der neuen Datenmenge in der temporären Tabelle.

KategorienDatenbank Tags:

Dynamische LINQ-Expressions

3. September 2014 Keine Kommentare

Wenn man LINQ-Abfragen etwas dynamischer zusammen bauen möchte, sehnt man sich schnell nach den alten SQL Strings zurück. Das war völlig flexibel, aber auch fehleranfällig. Ein von mir abonnierter Blog hat das Thema aufgegriffen und eine kleine Lösung dafür vorgestellt: Klick hier.

Allerdings fand ich das Vorgehen mit Expressions sehr kompliziert, zumindest für diesen Sachverhalt. Ich habe darum das Beispiel einmal auf meine Herangehensweise umgebaut:

private static void Main(string[] args)
{
    var people = new List<Person>()
    {
        new Person()
        {
            Firstname = "Carl",
            Lastname = "Sample"
        },
        new Person()
        {
            Firstname = "Mark",
            Lastname = "Schulz"
        }
    };
 
    var filtered = people.AsQueryable();
 
    var queryFirstnames = true;
    var queryLastnames = true;
    var searchValue = "l";
 
    if (queryFirstnames)
    {
        filtered = filtered.Where(p => p.Firstname.Contains(searchValue));
    }
    if (queryLastnames)
    {
        filtered = filtered.Where(p => p.Lastname.Contains(searchValue));
    }
 
    Console.WriteLine(filtered.Count());
    Console.ReadKey();
}

Da die Abfrage von LINQ erst so spät als möglich ausgeführt wird, können auch mehrere Bedingungen hintereinander gehängt werden, oder eben auch nicht. Dadurch entsteht automatisch eine AND Verknüpfung. Möchte man eine OR Verknüpfung, so leidet die Lesbarkeit etwas, da man dann mit LINQ Union arbeiten muss.

Nachteil meiner Lösung ist aber, dass man den Zugriff auf die Daten und den Zusammenbau der Abfrage zusammen codieren muss. Sofern das kein Problem darstellt, finde ich diesen Weg etwas übersichtlicher.

KategorienDatenbank, Microsoft .NET Tags:

Große Aufzählungen im .NET Framework

Neulich wurde ich mit der Definition einer besonders umfangreichen Aufzählung konfrontiert. Da hierfür die magische 32Bit Grenze überschritten wurde, war ich skeptisch. Ein Test ergab, das diese Skepsis in der Tat berechtigt war. Folgende Deklaration:

public enum Big
{
    Small = 1 << 1,
    Medium = 1 << 8,
    Large = 1 << 40
}

erzeugt dann das Problem. Bis hier:

var enumTest = Big.Small;
Debug.Assert(enumTest == Big.Small);
enumTest = Big.Medium;
Debug.Assert(enumTest == Big.Medium);
enumTest = Big.Large;
Debug.Assert(enumTest == Big.Large);

erscheint alles in Orndung, ein Ausgabetest:

var enumTest = Big.Small;
Console.WriteLine(enumTest);
enumTest = Big.Medium;
Console.WriteLine(enumTest);
enumTest = Big.Large;
Console.WriteLine(enumTest);

zeigt aber dann das Problem. Die Definition Medium und Large sind intern identisch:

Small
Medium
Medium

Zur Lösung des Problems muss man zwei Änderungen durchführen. Einmal ist der Aufzählungstyp von long abzuleiten und die Basiszahl für die Bitverschiebung muss ebenfalls eine long-Zahl sein:

public enum Big: long
{
    Small = 1L << 1,
    Medium = 1L << 8,
    Large = 1L << 40
}

Das Ergebnis bestätigt die korrekte Ausführung. Bei der Nutzung von 64 Bit ist aber dann vorerst wirklich Schluss!

KategorienMicrosoft .NET Tags: ,

NDepend, ein Einblick

27. April 2014 Keine Kommentare

Als ich vor kurzem gebeten wurde, mir NDepend anzuschauen, sagte ich sofort zu. Diese Software versprach mir Unterstützung in der Entwicklung und Überwachung von sauberem Code, ganz im Sinne von CCD. Nach dieser Sichtung habe ich verstanden, dass die Autoren der Software eine großartige Arbeit geleistet haben. Man erhält ein ungeheuer ausgefeiltes Stück Software, das den Entwickler zu Anfang mit der Fülle und dem Umfang von Dialogen und Optionen schlicht überfährt. Man lernt aber schnell, dass es scheinbar unvermeidbar war, damit die Software in unterschiedlichen Bedingungen eingesetzt werden kann. Ich rate jedem, der seinen NET-Sourcecode verbessern möchte oder im Team Fehlentwicklungen im Auge behalten will, sich die Zeit der Einarbeitung zu nehmen. Es lohnt sich!

Überprüfung des eigenen Codes

Als Einstieg sollte man sich diese Seite anschauen: GettingStarted. Dort wird als Video und alternativ in einer reich bebilderte Anleitung dargestellt, wie leicht NDepend mit dem eigenen Projektmappen verbunden werden kann. Dieser Vorgang funktioniert sehr gut und schnell. Die Original-VS-Projekte werden nicht angefasst, die NDepend-Verknüpfung kann auch leicht wieder gelöst werden. Eine SVN-Integration wird dadurch nicht beeinträchtigt.

NDepend DashBoardDann kann man sich bereits mittels des über das NDepend-Menü erreichbaren DashBoards einen Überblick verschaffen. Diese Beispielgrafik von NDepend stellt natürlich einen späteren Stand dar, zeigt aber die Fülle Informationen: Für mich war besonders wichtig, dass man sogar einen Überblick erhält, ob im Lauf der Zeit immer mehr Regeln verletzt wurden. Das hilft in der Team-Kontrolle! Weiterhin kann aus diesem DashBoard heraus leicht geprüft werden, welche Regeln verletzt wurden und vor allen Dingen: an welcher Stelle im Source! Regeln, welche man nicht für wichtig erachtet, kann man leicht deaktivieren. Alle Regeln liegen auch in einer gut kommentierten LINQ-ähnlichen Sprache vor, was die Anpassung leicht macht. Hier steht zusätzlich zu jeder NDepend eigenen Funktion eine gute Hilfe im Maus-Tooltip zur Verfügung.

Vergleichen der Entwicklungsgeschichte

NDepend Historic Analysis ResultMan stellt schnell fest, dass es nicht immer sinnvoll und praktikabel ist, gleich den kompletten Code Regelkonform zu gestalten, sprich alle Regel-Verletzungen zu entfernen. NDepend bietet hier die Möglichkeit, Basisstände als Vergleich heranzuziehen. Somit werden nur noch neuere Regelverletzungen angezeigt, was natürlich gerade für den Start sinnvoll ist. Als Start kann man dazu, wie in der nebenstehenden Grafik dargestellt, die historische Speicherung der Werte auf Always stellen. Damit hat man bereits nach der ersten NDepend-Überprüfung einen Vergleichsstand zur Verfügung, was den Start stark erleichtert.

Bewertung
NDepend eignet sich nicht für den Programmiereinsteiger. Man muss ein Interesse an Clean Code haben und auch schon diverse Regeln kennen und anwenden, LINQ darf kein Fremdwort mehr sein. Dann bietet NDepend eine sehr gute Untersützung. Wenn man für diesen Schritt bereit ist, bietet das Tool einen hervorragenden Start in die permanenten Prüfung und Überwachung von Code-Regeln, zumal sogar für die Integration in Buildserver gesorgt wurde. NDepend liefert ein umfangreiches Set an Regeln, sauber gruppiert, bereits mit. Eigene Regeln können aus dem Code extrahiert werden. Als absolutes Power-Feature bewerte ich die Definition einer Baseline für vergleichende Berichte. Damit können alte Probleme leichter ausgeblendet werden.

Eine Bewertung zum Preis fällt schwer: Die Dialog von NDepend wurden mit sehr viel Liebe erstellt. Praktisch überall stehen sinnvolle Optionen, Verknüpfungen zu Hilfethemen und Tooltips zur Verfügung. Der Preis erscheint hierfür eigentlich zu gering. Aus der Sicht der Programmierer, die bei Clean-Code oft nicht gerade offene Türen einrennen, ist der Preis dann wieder wirklich sinnvoll und mit Blick auf den Funktionsumfang mehr als fair.

KategorienCCD, Microsoft .NET Tags: ,

Windows Server 2012 Logins verbergen

27. Februar 2014 Keine Kommentare

Ein neuer Windows 2012 R2 Webserver zeigte per Default fleißig alle angelegten User an. Um das Problem in den Griff zu bekommen, genügt ein Aufruf der

secpol.msc

Dort kann man dieser Anleitung folgen, entnommen von http://social.technet.microsoft.com/

Open Computer Configuration, Security Options and on the right hand side, scroll down to Interactive logon: Do not display last user name. Double click on this entry and you will be presented with a dialog box that has two options – Enabled and Disabled (default). Change this setting to Enabled, and then click on the OK button.
Open Interactive logon: Do not require CTRL+ALT+DEL and select the Disable option and click OK.

KategorienAllgemein Tags:

SQL User mit Login verbinden

12. Februar 2014 Keine Kommentare

Regelmäßig nach einer Wiederherstellung einer bestehenden Datenbank auf einem neuen Server müssen die Logins, die serverseitig gespeichert und angelegt werden, mit dem User der Datenbank verbunden werden. Ansonsten erhält der Login auf die Datenbanken einfach keinen Zugriff.

Dafür gibt es drei Möglichkeiten:

  • Man kann den User in der Datenbank entfernen und den User einfach auf Serverebene neu anlegen. Das SQL Managmentstudio bietet hierbei die Möglichkeit, die Rechte auf einer Datenbank zu erteilen. Aber dabei verliert man ALLE bereits konfigurierten Rechte, die der User in der Datenbank hatte. Diese Lösung ist somit nicht empfehlenswert.
  • Der Microsoft SQL Server bietet die Procedure sp_change_users_login, mit der ein neu angelegter Login im Server mit dem User der Datenbank verbunden werden kann. Ich nehme dafür eigentlich immer einen identischen Namen, um Verwechslungen zu vermeiden:
    EXEC sp_change_users_login 'Update_One', 'User1', 'User1';

    Dieser Befehl muss für jeden User in jeder Datenbank ausgeführt werden, kann aber leicht in einem Skript vorbereitet werden.

  • Abgelöst wird diese vorstehende Procedure durch folgenden SQL Befehl: ALTER USER. In der Anwendung kann man dann schreiben:
    ALTER USER User1 WITH LOGIN = User1;

    Auch dieser Befehl muss für jeden User in jeder Datenbank ausgeführt werden und kann leicht in einem Skript vorbereitet werden.

KategorienDatenbank Tags:

SignTool benötigt CAPICOM

11. Januar 2014 Keine Kommentare

Auf einem frisch installierten Windows 8.1 Rechner kam es bei der Nutzung des signtool’s zur Fehlermeldung

Signtool requires CAPICOM version 2.1.0.1

Die CAPICOM kann man bei Microsoft herunterladen, allerding bleibt der Fehler dann bestehen.

Die Lösung ist die manuelle Registrierung der CapiCom.dll:

regsvr32 "C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86\CapiCom.dll"
KategorienEntwicklung Tags: