Archive for the ‘Technisches’ Category

GKrellM

Da ich bei der Installation und Konfiguration von GKrellM unter Windows auf ein paar Probleme gestossen bin, will ich hier mal posten wie ich sie gelöst habe. Eventuell hilft es auch anderen.

Aber bevor ich loslege, müssen zuerst ein paar Worte zu meinen Anforderungen geschrieben werden:

  1. GKrellM soll auf meinem Fileserver (Windows) als Service ohne GUI laufen.
  2. GKrellM soll auf meiner Fritzbox als Daemon ohne GUI laufen.
  3. Meine Hauptmaschine soll vom Fileserver, von der Fritzbox und von sich selbst die Daten anzeigen können.

GKrellM auf dem Fileserver (Windows)

Man nehme das Installationspaket von GKrellM for Windows, vergesse nicht SpeedFan zu installieren vorher und installiere GKrellM als “Service only”.

Danach kommt der einzige Punkt den man sehr gerne vergißt und später lange sucht wieso der Service nicht antwortet… Denkt dran den Port 19150 in der Firewall freizugeben.

GKrellM auf der Fritzbox

Sofern man eine Fritzbox hat, welche das kann, auf ihr Telnet aktiviert hat und stupide dieses HowTo befolgt hat, ist man schon fertig.

Aber bitte dran denken nachher Telnet wieder abzuschalten auf der Fritzbox.

Ach ja… GKrellMd startet nicht automatisch auf der Fritzbox! Da müßt ihr schon noch ein wenig mehr für machen.

Die Jungs und Mädels auf wehavemorefun.de sind echt fit und das Wiki ist eine Augenweide.

GKrellM Client auf der Hauptmaschine

Auch hier wieder wie bei “GKrellM auf dem Fileserver (Windows)” verfahren, nur diesmal als “Client only” installieren.

So… die Software ist installiert, was fehlt sind zwei kleine Parameter.

Wichtige Parameter

Wie üblich… Anleitung lesen hilft, aber für die bequemen unter uns:

gkrellm.exe -s SERVERNAME -P Port

Beispiel: gkrellm.exe -s INetCute -P 19150

Fertig :)

Bei mir liegen insgesamt drei Verknüpfungen auf dem Desktop. Für jede Maschine eine.

Klar kann man hier per Autostart, weiterer Konfiguration, MRTG etc. noch viel mehr machen.

Da mir noch die Temperaturanzeige der Platten fehlt und z.B. in der Fritzbox der Autostart von GKrellMd, werde ich hier bald erneut tätig werden und es wird ein Update geben von mir zu dem Thema hier im Blog.

Basteltag! :)

Man nehme Windows Server 2008 und Windows SQL Server 2008 und installiere dies auf einer Maschine…

Windows Server 2008

Windows Server 2008 ist einfach nur Creme :) Die Jungs von Microsoft haben verdammt viel gelernt und Sicherheit steht hier an sehr vielen Stellen an erster Position.

Lieber eine Sache zu viel per Default verbieten, als eine zu übersehen.

Per Default sind auch nicht viele Ports offen:

C:\Users\Administrator>netstat -a

Aktive Verbindungen

  Proto  Lokale Adresse         Remoteadresse          Status
  TCP    0.0.0.0:135            WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:445            WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:1433           WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:49152          WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:49153          WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:49154          WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:49155          WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    0.0.0.0:49156          WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    127.0.0.1:1434         WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    169.254.33.190:139     WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:135               WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:445               WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:1433              WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:49152             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:49153             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:49154             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:49155             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::]:49156             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  TCP    [::1]:1434             WIN-OZI5BOZ5IEJ:0      ABHÖREN
  UDP    0.0.0.0:123            *:*
  UDP    0.0.0.0:500            *:*
  UDP    0.0.0.0:4500           *:*
  UDP    0.0.0.0:5355           *:*
  UDP    169.254.33.190:137     *:*
  UDP    169.254.33.190:138     *:*
  UDP    [::]:123               *:*
  UDP    [::]:500               *:*
  UDP    [::]:5355              *:*

Der eine oder andere Port dürfte eh aufgrund der VMWare Tools vorhanden sein, aber grundsätzlich gesehen schonmal ok.

Der IIS 7 selbst wird als eine Rolle installiert. Das absolut coole dabei ist, dass man nicht nur dann per Hand alle möglichen Optionen einstellen kann, sondern diese auch erklärt bekommt.

Dazu gehören Server Side Includes, ASP.NET, .NET Erweiterbarkeit, CGI, Authentifizierungsmodule… zu viel zum Aufzählen.

Nur die Warnmeldung nach der Installation irritiert ein wenig… ich konnte sie nicht finden…

Server 2008 Installationsdialog

Ich habe als Beispiel ein paar Optionale Module ausgewählt gehabt, welche man im Screenshot aufgelistet sehen kann. Insgesamt gesehen ist der IIS 7 auf den ersten Blick eine Runde Sache.

Der IIS 7 hinterläßt bei mir einen guten Eindruck und ich freue mich schon auf die ersten tiefergehenden Tests. :D

SQL Server 2008

Der SQL Server 2008 ist auf den ersten Blick auch leicht zu installieren. Schnell vergißt man aber das Database Engine Modul und wundert sich ein paar Minuten später, wieso kein SQL Server installiert ist.

Microsoft hat den SQL Server 2008 in viele kleine und oftmals getrennt installierbare Module zerlegt. Auf den ersten Blick seltsam, aber meiner Meinung nach sehr sinnvoll.

So kann man sich gezielt nur das Installieren, was man definitiv braucht.

Auch ansonsten ist die Installation sehr zügig, aufgeräumt und verständlich. Nur wieso er .NET 3.5 SP 1 braucht vor der Installation entzieht sich meiner Kenntnis.

Bisher bin ich erst auf zwei Warnmeldungen gestoßen, welche mir ein wenig seltsam anmuteten:

SQL Server 2008 Installationsdialog

SQL Server 2008 Warnmeldung

Ähm… ja… das als Warnmeldung zu deklarieren… naja… eine Information hätte es auch getan ;)

Ich bin ganz froh wenn .NET nicht so viel nach außen plaudern kann…

Scheinbar braucht der Reportingservice, welcher ein eigenständiges Modul ist, .NET 3.5 und setzt neuere Objekte/Methoden ein, welche erst mit SP1 dazugekommen sind.

Egal… es wird neben .NET 3.5 SP 1 noch ein weiterer Hotfix installiert, welcher aber auch auf der Installations-DVD enthalten ist.

SQL Server 2008 Warnmeldung

*Hust*

Auch hier eher eine Informationsmeldung. Klar muß man hier gezielt darauf achten wenn man Clustern will, Replikationen benötigt oder einen Reportingserver einsetzen will.

Insgesamt gesehen bin ich erstaunt wie dicht Windows 2008 Server ist und wir aufgeräumt der SQL Server 2008 erscheint.

In den nächsten Tagen werde ich mal schaun was so mit dem SQL Server 2008 geht.

Nachdem ich in den letzten Tagen angefangen habe meine Basisbibliotheken auch an andere weiter zu geben, mußte ich natürlich auch anfangen die Qualität weiter zu erhöhen. Was für mich persönlich reicht, muß für andere noch lange nicht genügen.

Sprich, ich kann mit einigen Nebeneffekten leben, andere aber nicht. Noch übler wird dies, wenn man Klassen/Methoden dann verwendet, dass Programm dann Fehler erzeugt und man nicht weiss, ob der Fehler am eigenen Programm liegt, oder an meiner Basisbibliohek.

Hierfür verwendet man üblicherweise Testtools wie z.B. NUnit. Aber es gibt es auch noch ein weiteres, sehr nützliches Tool.

Und zwar NCover.

Mittels NCover kann man unter anderem ermitteln, ob während der Laufzeit des eigenen Programms überhaupt alle Quellcodezeilen angesprungen worden sind. Nicht selten hat man bei Unittests nicht alle Möglichkeiten abgedeckt und später eventuell wichtige Quellcodebereiche werden erst gar nicht angesprungen.

Man sollte aber jetzt nicht davon ausgehen, dass Tools wie NUnit oder NCover alle Möglichkeiten abprüfen können. Jedes dieser Tools ist nur so gut, wie die zugrundeliegenden Unittests und das Ergebnis ist stark abhängig von den Rahmenbedingungen.

Bei mir wird NUnit ein fester Bestandteil meines Entwicklungsprozesses im Privaten Bereich werden. NCover kommt für finalisierende Tests hinzu, wird aber nur sporadisch eingesetzt werden.

Kleine Anmerkung am Rande: Ein Kollege meinte die Tage mal wieder zu mir, dass Unittests absolut unsinnig sind und den Entwicklungsprozess nur verlängern würden. Ja, sie verlängern ihn, dafür steigt die Qualität des Ergebnisses enorm und man hat später weniger Wartungsaufwände. Tja… es gibt halt immer wieder “Programmierer”, welche Quantität über Qualität stellen. Traurig, aber ich werde mir so eine Arbeitsweise nicht zu eigen machen. :D

Und wieder beginnt mein Leidensweg mit OpenSource Software.

Diesmal wollte ich mittels PDO, welche eine Datenbankschnittstelle unter PHP darstellt, auf einen SQL Server zugreifen.

Nach dem üblichen Hürdenlauf mit dem immer (!) noch verhunzten MSI-Installer von PHP, hatte ich zwar PDO am Laufen, aber es wollte nicht mit dem SQL Server reden.

Der SQL Server war korrekt konfiguriert, ich konnte mich mit einem extra für diesen Zweck angelegten Account auch einloggen und ihn verwenden. TCP/IP war auch aktiviert als Kommunikationsweg, der Port war definiert und in der Firewall freigegeben, es konnte also nichts mehr blockieren.

Trotzdem wollte PHP/PDO nicht mit dem SQL Server reden.

Hier nun meine Ergebnisse der Stundenlange Analyse, welche dann folgte:

In folgender PDO Doku steht das PDO_DBLIB für FreeTDS / Microsoft SQL Server / Sybase zuständig ist.

Folgt man dem Link der sich unter PDO_DBLIB verbirgt, dann kommt man zu einer Subseite der PHP-Doku, welche folgende Warnung beinhaltet:

Diese Erweiterung ist EXPERIMENTELL. Das Verhalten dieser Erweiterung, einschließlich der Funktionsnamen, und alles Andere was hier dokumentiert ist, kann sich in zukünftigen PHP-Versionen ohne Ankündigung ändern. Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko.

Im ersten Kommentar wird auf die PECL Page von PDO hingewiesen, welche dann unter anderem das Release 1.0 mit Datum 2005-11-26 enthält.

Vorhin war ich Neugierig und habe einfach mal auf den Link hinter dem zugehörigen Changelog Eintrag geklickt und da kam dann das:

Update code for API changes in PDO; no actual changes have been made to this driver.

Windows binaries can be found at:
http://pecl4win.php.net/ext.php/php_pdo_mssql.dll

however: you are *strongly* recommended to use PDO_ODBC instead of this driver on
Windows platforms.

** Changes **
- Fix Bug #34777; segfault when retrieving non-existent error info
- Fix Bug #35032; didn't find FreeTDS includes on some systems

PDO_ODBC werde ich auf gar keinen Fall verwenden, dafür ist die Gesamtperformance von ODBC zu schlecht. MySQL mit InnoDB will ich nicht einsetzen. Im Moment bewege ich mich dort wo es sofort geht, von OpenSource Software weg und setze immer mehr auf kommerzielle Kauflösungen.

Von daher fällt für mich der Zwischenschritt der Migration von MySQL nach MS-SQL weg und ich werde zusätzlich die Migration von PHP nach C# angehen müssen.

Das gefällt mir im Moment überhaupt nicht, aber ich werde wohl damit leben müssen.

Und was bleibt mir noch zu tun?

Genau! Die Benotung des Ganzen Konstrukts, wo da wäre, das…

Frickler Award

  • …die Doku von PHP alles andere als aktuell ist.
  • …bei PHP Sachen als Stable maskiert werden, welche noch nicht mal Ansatzweise als Stable gelten können.
  • …der Hinweis auf Probleme nur im Changelog auftaucht.
  • …man lieber auf den langsamen ODBC Treiber setzt, anstatt die vorhandenen Bugs zu fixen.
  • …man nur so zu aggieren scheint, weil es sich hier um eine Microsoft Datenbank handelt.

DING DING DING Und da war er der 5. Fricklerpunkt!

Und somit bekommt PHP/PDO den Frickler-Award der Woche!

Im Moment bemüht sich PHP redlich den Frickler-Award des Jahres zu bekommen.

So langsam stelle ich mir eine Frage… ist OpenSource Software immer so unreif?

Das letzte Beispiel zu dem Thema lieferte per Default immer NULL, abgesehen davon war die Implementation auch nicht vollständig korrekt.

TheUndeadable war so freundlich, mich auf den richtigen Weg zu bringen.

public IEnumerator<jobqueueentry> GetEnumerator()
{
  return _jobQueue.Values.GetEnumerator();
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
  return _jobQueue.Values.GetEnumerator();
}

FXCop ist ein feines Tool. Manche Warnungen die es anzeigt, kann man leicht lösen, bei einigen knallt man mit .NET Eigenarten zusammen.

Bestes Beispiel war IEnumerable.

FXCop meinte, es wäre sauberer, wenn ich IEnumerable; verwenden würde. OK, also machte ich mich an die Arbeit und stelle den Source um.

Und prompt lieferte der Compiler folgende Meldung:

does not implement interface member ‘System.Collections.IEnumerable.GetEnumerator()’

Tja… lange habe ich gesucht. 2 Bekannte haben sich das mit angesehen und erst nach langem Suchen sind wir auf folgenden Blogeintrag gestossen:
IEnumerable in .NET 2.0 Beta 2

public class JobListCollection : IEnumerable <JobQueueEntry>
{
  public IEnumerator<JobQueueEntry> GetEnumerator()
  {
    return null;
  }

  IEnumerator IEnumerable.GetEnumerator()
  {
    return GetEnumerator();
  }
}

Fazit:
Manche Fehlermeldungen sind so panne, da kann man echt nur noch mittels Google und viel Zeit hinter die Lösung kommen.

Es gibt Tage, da hätte ich große Lust den Fricklern mal so richtig die Meinung zu geigen.

Grund:

Fatal error: Call to undefined function mysql_connect()…

Eigentlich nicht tragisch, aber… Die Leute von PHP sagen, es ist ein Fehler in MySQL. Und die von MySQL sagen, es ist ein Fehler in PHP. Und keiner bringt brauchbare Lösungen.

Beim Versuch der Lösung dieses Problems, bin ich dann dahinter gekommen, dass die php.ini welche bei PHP 5.2.5 dabei ist, total Grütze ist und schon beim Start über 20 Fehler bringt. Da werden einfach mal Module eingebunden, welche es nicht gibt.

Nach vielen vielen Tutorials, HowTo und FAQs bin ich dann dahinter gekommen, dass…

Frickler Award

  • …PHP es MySQL in die Schuhe schiebt und umgekehrt.
  • …der MSI-Installer der Versionen 5.2.5 und 5.3.0 Dev nicht nur Bockmist baut, sondern auch noch eine unbrauchbare php.ini mitbringt.
  • …in der Windows Version von PHP C:\Windows als Pfad für die php.ini HARDCODED eingetragen wurde.
  • …in der aktuellen Version von PHP Unmengen von Sachen eincompiliert wurden, welche schon bei einem Aufruf mittels “php -m” mehr Fehlermeldungen ausspucken, als die Hilfe selbst groß ist.
  • …dieser Fehler NUR unter Windows vorhanden ist.

DING DING DING Und da war er der 5. Fricklerpunkt!

Und somit bekommt PHP den Frickler-Award der Woche!

Der LINQ Benchmark hat ein kleines Update erhalten.

Beim Benchmark 2 Run 2 fehlte die Zuweisung zum Objekt. Außerdem werden jetzt noch Zusatzinformationen ausgegeben um eine leichtere Zuordnung zum jeweiligen Abschnitt in der Dokumentation zu ermöglichen.

LINQ_Benchmark.zip (232 KB)

Die Werte haben sich nur geringfügig verändert, was wohl eher an der niedrigeren Grundlast auf der Testmaschine lag. Ansonsten ist die Verteilung gleich geblieben.

Jetzt wo .NET 3.5 mit LINQ raus ist, bin ich neugierig geworden ob LINQ mir Arbeit abnehmen kann.

Da ich z.B. beim Dynamic Data Cache keine Datenbank verwende und den Zugriff auf die gecachten Datenobjekte umständlich programmieren muß, baute ich mir ein Benchmarktool.

Das Tool selbst ist eigenständig zu sehen und war für mich ein Testballon zum Thema LINQ.

Wer mehr darüber lesen will, der kann sich unter dem folgenden Link die Dokumentation, Sourcen und benötigten Dateien herunter laden:

LINQ_Benchmark.zip (224 KB)

Und hier noch kurz das Ergebnis:

LINQ benchmark result

Danke übrigens nochmal an TheUndeadable, der mir mit Tips und Korrekturlesen geholfen hat!

Es ist geschafft! Version 0.1 vom DynamicDataCache ist fertig!

Dynamic Data Cache v0.1

Aber was ist das? Der DynamicDataCache (kurz DDC) ist nichts anderes als ein Ersatz für eine Datenbank.

Man “wirft” ein Objekt rein und holt es später wieder raus. Zusätzlich gibt es einen GarbageCollector, welcher regelmässig oder auf Anforderung diesen Cache scannt und wenig genutzte Objekte rauswirft. Das hört sich einfacher an, als es ist. Dadurch das die Daten alle im Hauptspeicher liegen, kann man extrem schnell drauf zugreifen.

Das ganze Konstrukt wird in den nächsten Wochen noch gewaltig erweitert. Sobald es einen bestimmten Punkt erreicht hat, werde ich es freigeben. Als Lizenz schwebt mir die BSD Lizenz vor. Sie ist nicht ganz so virulent wie z.B. die GPL.

So viel heute, die Tage gibt es mehr ;)