Meine kleinen Aufzeichnungen

29 Mai 2006

Bücher aus der Fernsehserie "Lost"

Die Sommerpause für alle Lost-Fans in den USA und überall sonst auf der Welt warten Zuschauer gespannt auf die dritte Staffel. Ich möchte selbst wieder mal viel lesen. Hier eine kleine Sammlung von Literatur, die uns die Autoren der US-amerikanischen Fernsehserie "Lost" in die Handlung geschmuggelt haben:

Fjodor M. Dostojewski: Die Brüder Karamasow (Folge 2x15 Maternity Leave)
John gibt das Buch dem Mann, der sich als Henry Gale ausgibt. Die Brüder Karamasow - in manchen Ausgaben auch: Karamasoff - ist der letzte Roman des russischen Schriftstellers Fjodor Dostojewski, geschrieben in den Jahren 1878-1880. Sigmund Freud soll gesagt haben, dass die Brüder Karamasow der beste Roman ist, der jemals geschrieben wurde.

Lewis Carroll: Lewis Caroll: Alice im Wunderland (Alice's Adventures in Wonderland) - In der ersten Staffel gibt es einen Dialog zwischen John und Jack. John erzählt vom weißen Hasen.

Und das nach all den Jahren (After All These Years)

Ambrose Bierce: Der Vorfall an der Eulenfluss-Brücke - John hält dieses Buch im "Hatch" und scheint darin nach losen Blättern zu suchen.

Ein Kinderbuch: Judy Blume: Are You There, God? It's Me, Margaret - Sawyers Lektüre in der FOlge "The Whole Truth" in der zweiten Staffel.

Charles Dickens: Our Mutual Friend (Unser gemeinsamer Freund) - Im Finale der zweiten Staffel erklärt Desmond, dass er dieses Buch als letztes in seinem Leben lesen wolle, nachdem er bereits alle andere Büch von Charles Dickens gelesen hat.


25 Mai 2006

Visual Studio: Steuerelemente in der Entwurfsansicht ausschneiden und wieder einfügen

Neulich ab ich kurz gestutzt, als meine WindowsForms-Applikation (VB.NET), die ich gerade entwickle, nicht mehr so reagiert wie kurz vorher. Was ich gemacht hatte: Ich habe einige Controls von der Form in ein Panel verschoben - mit Aussschneiden/Einfügen.

Was ich nicht bedacht hatte. Die Methoden für die Events jener Steuerelemente bleiben zwar erhalten, aber sie sind nicht mehr als Eventhandler gekennzeichnet. Sprich: der Teil mit dem "Handles"-Schlüsselwort fehlt.

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.Close()
End Sub


Also, Notiz an mich selbst: "Achtung beim Ausschneiden von Steuerelementen!"


24 Mai 2006

Microsoft Exchange Server Best Practices Analyzer

Heute habe ich - während einer kleinen Auseinandersetzung mit einem Exchange Server - entdeckt, dass Microsoft einen Best Practices Analyzer für Exchange zur Verfügung stellt.

Damit kann man sich Schwachpunkte und Konfigurationsfehler aber auch Performancetipps der Exchange-Installation aufzeigen lassen. Das Schöne daran: Die einzelnen Punkte werden nicht nur aufgelistet, sondern werden auch ausführlich erklärt. Es gibt auch jeweils die Lösung, wie das Problem gelöst oder die Einstellung verändert werden kann. Prädikat: besonders nützlich!


21 Mai 2006

Microsoft Visual Studio Version Selector

Ein Doppelklick auf eine Projektmappendatei (Solution File) *.sln öffnet automatisch die richtige Version von Visual Studio (mit der die Projektmappe erzeugt wurde) - vorausgesetzt man hat Visual Studio 2005 und die Vorgängerversion VS 2003 installiert.

Wie kann das funktionieren?

Visual Studio 2005 verknüpft in der Windows Registry die Dateierweiterung .sln mit dem "Microsoft Visual Studio Version Selector":

%ProgramFiles%\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe


20 Mai 2006

Eigenen WSUS Server für alle Benutzer in der Domäne

Wer erfolgreich einen WSUS (Windows Software Update Service)-Server in der Domäne aufgesetzt hat, möchte sicherlich nicht auf jedem PC und für jeden Benutzer einstellen, dass anstelle des Microsoft-Server die eigene verwendet wird.

Unter Windows 2000 Server kann man mit dem Group Policy Object Editor (gpedit.msc mittels "Start>Ausführen..." aufrufen) die entsprechende Einstellung am Domänenserver vornehmen.

Zuerst sollte man sich die Installation die aktuelle Version der Datei "wuau.adm" (Administrationsvorlage / Template) für das jeweilige Betriebssystem runterladen unter dieser Adresse.

Nachdem der Gruppenrichtlinien-Objekt-Editor gestartet ist, muss man die Richtlinienvorlage hinzufügen, indem man mit der rechten Maustaste auf "Computerkonfiguration > Administrative Vorlagen" klickt und die Vorlage wuau.adm auswählt (sollte im Verzeichnis inf-Unterverzeichbnis des Windowsverzeichnisses liegen).

Anschließend ist unter Windowskomponenten die Windows-Update-Richtlinie zu finden. Dort kann man nun einstellen, woher die Benutzer die Updates empfangen sollen. Doppelklicken Sie im Detailfenster auf Internen Pfad für den Microsoft Updatedienst angeben. Klicken Sie auf Aktiviert, und geben Sie den HTTP-URL des WSUS-Servers sowohl im Feld Interner Updatedienst zum Ermitteln von Updates als auch im Feld Intranetserver für die Statistiken ein. Geben Sie z. B. http://Servername in beiden Feldern ein.


RAS einwählen in Windows 2000: statische IP-Adresse verwenden

Gestern musste ich notgedrungen einen Windows-2000-Domänenserver neu einrichten. Als ich einigen Benutzern die Einwahlberechtigung (RAS) ermöglichen wollte, stellte ich fest, dass es nicht möglich war, den Benutzern statische IP-Adressen zuzuweisen.

Grund dafür: Die Domäne war im gemischten Modus (Windows 2000 / Windows NT 3.5/4.0). Als ich die Domäne auf reinen Windows 2000-Modus gestellt hatte, konnte ich nach kurzem Warten (15 Minuten, bis Active Directory synchron war), die Einstellung vornehmen.

Übrigens: Die Umstellung vom gemischten in den reinen Betriebsmodus der Domäne kann man vornehmen, in dem man in "Active Directory - Benutzer und Computer" mit der rechten Maustaste "Eigenschaften" der Domäne auswählt und dort die entsprechende Checkbox ankreuzt. Achtung: Rückgägngig kann man die Operation nicht - aber wer hat noch Windows NT im Einsatz...


15 Mai 2006

Die Arbeiterklasse in .NET 2.0: BackgroundWorker

Wie im richtigen Leben, sind manchmal die Dinge, die im Hintergrund passieren, die entscheidenden. Eine neue Klasse (ab .NET-Framework 2.0) ist die BackgroundWorker-Klasse. Damit kann man auf einfache Weise Threads asynchron ablaufen lassen.

Prinzipiell sollten Datenbankaufrufe und Webservice-Calls nicht im selben Thread laufen wie das User Interface. Eine Regel, die dabei zu beachten ist, sagt, dass man Objekte, die in einem anderen Thread vorhanden sind, nicht „anfassen“ darf. Zum Beispiel darf das Windowssteuerelement ein Datagrid-Objekt nicht direkt im Thread angesprochen werden.


14 Mai 2006

ASP.NET-Applikationen: warum debug="false"?

Warum ist folgende Aussage ernst zu nehmen?

Stellen Sie sicher, dass debug="false" im compile-Element der web.config-Datei für jede ASP.NET-Applikation auf dem Produktionsserver gesetzt ist. Während der Entwicklungsphase ist der Standardwert "true", was häufig dazu führt, dass diese Einstellung auch im Echtbetrieb beibehalten wird. Dieser Umstand kann führt zu ineffizientem Speicherverhalten.

Welche Probleme verursacht debug="true"?

Es gibt drei Unterschiede zwischen debug="true"/"false":
  • ASP.NET-Timeouts
  • Batch-Kompilierung
  • Code-Optimierung

1. ASP.NET Timeouts

Wenn debug auf "true" gesetzt wird, erhalten ASP.NET-Request keinen Timeout. Damit soll gewährleistet werden, dass Entwickler in Visual Studio in Ruhe ihre Applikation testen und debuggen könnnen, ohne ständig mit Timeouts konfrontiert zu werden. Natürlich sind Timeouts im Echtbetrieb ein unerlässliches Mittel, damit Anfragen nicht ewig hängenbleiben und Systemressourcen blockieren.

2. Batch-Kompilierung

Kurz gesagt, wenn debug="true" kann eine Batch-Kompilierung erfolgen, sonst nicht. Was bedeutet das?

Wenn eine aspx-, asax- oder ascx-Datei zum ersten Mail aufgerufen und in eine Assembly kompiliert wird, erhält sie einen in acht Zeichen kodierten Namen (z.B. 2nt0rgwd.dll or ähnlich). Diese temporäre Assembly wird für jede Datei der genannten Typen im Verzeichnis "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files" + Applikationsname. Die Klasse, die aus dem "Code-Behind" resultiert, wird mit allen anderen DLLs aus dem bin-Verzeichnis als Schattenkopie in diesem temporären Verzeichnis abgelegt.
Zurück zur 2nt0rgwd.dll. Wenn debug="true", dann wird pro aspx, asax und ascx eine einzelne Datei erzeugt. Das heißt zum Beispiel, für 100 Dateien werden 100 DLLs erzeugt, und das zum Zeitpunkt, wenn die Seite oder das Control das erste Mal aufgerufen wird.
Wenn hingegen debug="false" gesetzt ist, erfolgt die Kompilierung als Batch, das heißt, das beim ersten Aufruf irgendeiner Seite in der Applikation die Gesamtheit aller Seiten und Controls in eine große DLL kompiliert wird. Diese Aussage ist noch ein wenig zu relativieren, denn ascx werden in eine getrennte Datei kompiliert und die aspx werden in Gruppen mit den Usercontrols, die sie inkludieren, kompiliert. Auch die global.asax-Datei wird in eine eigene Datei kompiliert. Außerdem geschieht die Kompilierung noch auf Verzeichnisebene, d.h. Unterverzeichnisse erhalten auch eigene Dateien. Aber im Großen und Ganzen ist die Anzahl anstatt 100 doch nur vielleicht 3 oder 4.
Was ist nun der Nachteil, wenn es viele DLLs sprich Assemblies gibt? Der Adressraum im Speicher wird wesentlich ungünstiger verwendet, sprich fragmentiert. Dieser Umstand bewirkt, dass es für die Laufzeitverwaltung von .NET schwieriger wird, geeignet große Blöcke auf dem Heap zu finden. Somit wird der Overhead und Speicherbedarf unnötig erhöht.
Etwas ist noch zu beachten. Wenn eine einzige aspx-Datei geändert wird, wird diese Datei extra kompiliert, damit nicht die gesamte App-Domain neu geladen werden muss. In der machine.config gibt es diesbezüglich eine Einstellung, in der festgehalten ist, wie viele derartige Änderungen maximal gemacht werden können, bis die App-Domain neu geladen wird, gerade so, als ob die web.config oder das bin-Verzeichnis geändert wurden.

3. Code-Optimierung

Damit man in der Entwicklungsphase fähig ist, Schritt für Schritt durch den Code zu gehen, ist in dieser Phase der JIT-Compilter (Just in Time) ausgeschalten. Die Code-Optimierung erfolgt also nur, wenn der Debug-Schalter auf "false" gesetzt ist.
Insgesamt also genügend Gründe, um diese wichtige Einstellung auf den Produktionssystemen richtig zu stellen.

Übrigens: In einem Speicherabbild (Memory Dump) kann identifiziert werden, ob die Applikation im Debug-Modus lief oder nicht. Das Kommando !finddebugtrue in der sos.dll listet alle Applikationen mit debug="true" in the web.config auf. Einfach, nicht?

In ASP.NET 2.0 gibt es einen Schalter in der machine.config, der alle debug="true" deaktiviert, so dass auf einem Produktionsserver alle Applikationen automatisch mit debug="false" laufen:


<configuration>
   <system.web>
      <deployment retail="true"/>
   </system.web>
</configuration>


Weitere Goodies zum Thema im Blogeintrag von Scott Guthrie.


13 Mai 2006

DVB-T-Set-Top-Box

Ich bin ein Verfechter des Standpunkts "Weniger ist mehr". Zumindest dann, wenn es ums Thema Fernsehen geht. Deshalb möchte ich auch auf meinem Dach keine Satellitenschüssel für den Empfang von all den Fernsehstationen, die uns mit Programmen verschiedener Qualitätsstufen versorgen.
Da nun aber in dem Gebiet, in dem ich wohne, einer von vorher insgesamt vier deutschsprachigen Sendern, auf "digital terrestrisch" umgestellt wurde, habe ich kurzerhand beschlossen, einen DVB-T-Tuner zu besorgen.
Die Wahl fiel auf den Nokia Mediamaster 210T für stolze 89 Euro. Allerdings muss ich dazu sagen, dass der lokale Händler nur zwei Geräte zur Auswahl hatte. Ich selbst hatte aber keine Lust, länger nach einer Alternative zu suchen. Das Gerät sieht ziemlich klobig aus. Mit der Benutzerführung habe ich mich jedoch sehr schnell angefreundet, weil sie einfach - und was noch wichtiger ist - logisch durchdacht und intuitiv erlernbar ist. Die drei Programme "Das Erste", SF1 und SF2 wurden automatisch erkannt und ohne meine Intervention programmiert.
Der erste visuelle Eindruck: ja! Die Bildqualität ist dem analogen Signal eindeutig überlegen, die zusätzlichen Programminformationen gut. Schade nur, dass bis zum Augenblick im Gebiet, in dem ich wohne, nur drei Sender zu empfangen ist. Aber das wird sich in den kommenden Monaten ändern, wenn ZDF, die beiden österreichischen Sender ORF1 und ORF2 sowie die italienischen Sender eingespeist werden.


07 Mai 2006

.NET System.IO.Compression und ZIP-Dateien

Es existiert ein neuer Namespace in den .NET-2.0-Framework-Basisklassen. Er heißt System.IO.Compression und enthält die Klassen DeflateStream und GZipStream.

Diese Klassen sind Streams und sehr nützlich, um einen Stream von Bytes für die Übertragung zu komprimieren. Zum Beispiel, um in einem Netzwerk einen Client oder Peer damit zu bedienen.

DeflateStream implementiert den Deflate-Algorithmus (IETF's RFC 1951. "DEFLATE Compressed Data Format Specification version 1.3). GZipStream ist eine Weiterentwicklung des Deflate-Algorithmus. Die Klassen fügt einen CRC-Check (cyclic-redundancy-check) hinzu.

Hier eine nützlicher Blog-Eintrag, um die Klassen dazu verwenden, ZIP-Dateien zu erzeugen