Archiv

Autor Archiv

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:

Probleme mit Visual Studio Formular Designer

11. Januar 2014 Keine Kommentare

Beim Öffnen großer Formulare in Visual Studio Formular Designer (WinForms) tritt teilweise das Problem auf, dass Visual Studio 2012/2013 wegen eines Problems beendet wird. In der Ereignisanzeige wird dabei ein Problem in der KERNELBASE.dll vermerkt.

Die Lösung ist dann eigentlich trivial: Es muss der Dienst Performance Logs & Alerts (pla) gestartet werden.

Es besteht nun die Vermutung, dass der Formulardesigner einfach eine Performance-Warnung melden wollte und das nicht konnte, weil der Dienst nicht aktiv war.

SQL Deadlock durch Autoclose

9. Januar 2014 Keine Kommentare

Seit einigen Monaten nervte in einer Microsoft SQL 2008 Datenbank ein Problem, welches gelegentlich auftrat. Auf die betreffende Datenbank waren ab einem scheinbar zufälligen Zeitpunkt keine schreibenden Zugriffe mehr möglich, lesende Zugriffe aber schon. Ein einfacher Blick nach der Verfügbarkeit reichte also nicht, um die Lauffähigkeit der Datenbank zu testen.

Ein Blick in die Log-Dateien brachte die Erkenntnis, dass diese Datenbank ziemlich oft gestartet wurde (im Gegensatz zu den anderen Datenbanken) und plötzlich ein Fehler 1205 auftrat:

Transaction (Process ID …) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Danach war die Datenbank schreibend nicht mehr verfügbar, der Fehler 9001 trat auf:

The log for database ‘…’ is not available. Check the event log for related error messages. Resolve any errors and restart the database.

Select – Abfragen waren davon aber nicht betroffen, da diese ja keine Log-Einträge erzeugen.

Die Lösung wurde in SQL ServerCentral.com beschrieben: Abschalten der Option AutoClose in den Eigenschaften der Datenbank! Da diese Eigenschaft weder bewußt gesetzt worden war, noch benötigt wurde, konnte das Problem so einfach gelöst werden.

KategorienDatenbank Tags: ,

ASP.NET MVC und Login Cookie

26. Dezember 2013 Keine Kommentare

Vor kurzem wurde ich von einer Anfrage eines Kunden überrascht. Eingaben auf meiner MVC Seite nach einer längeren Wartepause, die durchaus im Bereich von Stunden liegen kann, führten wieder zum Login. Da wir keine Daten in Sessions gespeichert haben, konnte ich mir das Verhalten erst nicht erklären. Ich bin immer davon ausgegangen, dass ein POST alle notwendigen Daten überträgt. Bei den Login-Informationen passte hier wohl etwas nicht wie erwartet. Also habe ich das ganze analysiert:

Bei einer MVC 3 oder 4 Webseite mit Formular-Authentifizierung wird folgender Code zum Setzen der Authentifizierungsinformationen aufgerufen:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

Wählt der Anwender nun die Option Speichern nicht aus, so wird beim Authentifizierungscookie automatisch die Verfallsinformation auf Session gesetzt. Da Sessions in der Standardeinstellung nach 20 Minuten Inaktivität verfallen, erklärt es auch, warum nach längerer Pause die Anmeldung ungültig wurde:

FormsAuthentication.SetAuthCookie(model.UserName, false);

Cookie ohne Speichern

Besser sieht es jedoch auch, wenn die Anmeldeinformationen gespeichert werden dürfen:

FormsAuthentication.SetAuthCookie(model.UserName, true);

Dann wird das Authentifizierungscookie automatisch mit dem Verfallsdatum des Timeouts der Web.config gesetzt, hier 2880 Minuten => 2 Tage.

  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
  </system.web>

Cookie mit Speichern

Mir persönlich fehlt jetzt noch die Option, dass Authentifizierungscookie bis zum Ende der Browsersitzung behalten zu können, aber man kann scheinbar nicht alles haben.

KategorienMicrosoft .NET Tags: ,

Fehler bei Windows Software RAID Wiederherstellung

16. Oktober 2013 Keine Kommentare

Gestern stand ich vor dem Problem, dass nach einem Festplattenfehler an einem Windows Server 2012 mit dem Tausch einer Festplatte, Windows keinen Spiegel mehr aufbauen konnte. Es kam zu einer klaren Fehlermeldung:

Error – All disks holding extents for a given volume must have the same sector size, and the sector size must be valid.

zu der es auch viele interessante Frage und Antwort Threads gab. Leider brachte mich anfangs kein Tipp wirklich weiter, also hieß es: Ursache suchen und verstehen.

Dabei hat mir das Tool smartctl geholfen. Damit kann man die technischen Daten der Festplatten anzeigen lassen.

Hier die alte Festplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sda
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda LP
Device Model: ST31000520AS
Serial Number: 5VX0WWJD
LU WWN Device Id: 5 000c50 02511506c
Firmware Version: CC32
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 5900 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s

und hier die neue Ersatzfestplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sdb
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST1000DM003-1CH162
Serial Number: Z1D4RCQ0
LU WWN Device Id: 5 000c50 063a48af4
Firmware Version: CC47
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)

Hier wurde sofort klar, dass die Fehlermeldung das Problem sehr genau beschrieb, die physikalischen Sektorgrößen waren unterschiedlich, genauer gesagt kann ich keine Partition, die auf einer 512′er Sektor-Größe liegt, auf eine 4096′er Sektor-Größe spiegeln, weil das Raster passen kann, aber nicht muss. Ein Anruf beim Support mit der Bitte um Ersatz gegen eine neue Austaschplatte mit 512er Sektoren war dann einfach und löste das Problem.

Und hier noch eine Übersicht über die gefundenen Ratschläge, die auf zu finden waren:

Man kann nur identische Festplatten spiegeln, also beide Platten tauschen

Absoluter Quatsch ohne jede Basis. Identische Platten reduzieren nur die Stolperfallen, machen aber eine Clonen oder Neuaufsetzen vom System erforderlich! Man muss nur darauf achten, dass die Kapazität bis auf das Byte genau ausreichend ist, da die normalen Dialoge meist nur MB anzeigen.

Alles Partitionen löschen und gleich neu als Mirror anlegen

Das funktioniert natürlich, aber löst das Problem sehr aufwendig. In dem Falle geht es dann nur, weil das RAID über den kleinsten Nenner geht (Basis auf 4096′er Sektor) und der 512′er Sektor alle Bedingungen erfüllt. Ein Vermeiden der Mischung 4096er/512er Sektoren ist natürlich sinnvoller.

Administratorzugriff auf SQL Server wiederherstellen

18. September 2013 Keine Kommentare

Manchmal ist man in der Situation, dass man keinen Zugriff mehr auf einen SQL Server mehr hat, obwohl man selbst Administrator der darunter liegenden Windows-Version ist. In diesem Fall hat Microsoft dafür gesorgt, dass man recht einfach die Administrationsrechte für den SQL Server erlangen kann. Der meiner Meinung nach einfachste Weg geht so:

SQL-Server-KonfigurationsmanagerMan startet den SQL-Server-Konfigurationsmanager und öffnet die Eigenschaften des gewünschten SQL-Dienstes. Bei aktuellen Version hat man nun die Möglichkeit, direkt den Parameter -m hinzuzufügen. Dieser Parameter startet den SQL-Server Einzelbenutzermodus und gibt allen lokalen Administratoren Zugriff. Alternativ muss man bei älteren Versionen auf der Seite erweitert den Parameter direkt in der Auflistung angeben. Aber Achtung, dort werden die Parameter mit ; getrennt. Es muss dann also lauten:

-m;--dC:\Program Files\Microsoft S...

Anschließend muss der Dienst neu gestartet werden. Nun kann man sich mit dem SQL Server Managementstudio direkt verbinden. Aber auch hier Achtung: Das Programm muss dazu unbedingt als Administrator gestartet werden, selbst wenn unter Windows als Admin angemeldet ist! Nun kann man seinen Admin-Login hinzufügen und mit den notwendigen Rechten versehen. Zum Abschluss nicht vergessen, den Parameter -m wieder zu entfernen, damit der Server normal zur Verfügung steht.

KategorienDatenbank Tags: ,