Thomas Wölfers Baustatik-Blog

Thomas Wölfers Baustatik Blog

Windows, Timeserver und Work&Cash


Aus den Referrer-Logs meines Blogs kann ich ersehen das viele Personen dieses Blog besuchen weil sie offenbar ein Problem mit einem Timeserver unter Windows haben.

Der Timeserver um den es hier aber geht ist kein NTP Timeserver, sondern der Zeitserver den wir bei unseren Statikprogrammen im Work&Cash Verfahren zur Abrechnung verwenden.

Trotzdem ist das Thema NTP Zeitserver eigentlich ganz interessant: Hier darum ein kurzer Exkurs zum Thema NTP und synchronisierte Uhrzeiten bei Windows (XP und 2003).

Wenn man einen Rechner betreibt, dann ist es schön wenn dieser Rechner immer die richtige Uhrzeit kennt. Das wird dann besonders wichtig wenn man mehrere Rechner in einem LAN unterhält.

Genau dafür gibt es das Network Time Protocol (NTP). Dabei gibt es einen Zeitserver der (hoffentlich) die richtige Uhrzeit kennt und Clients die ihre Uhrzeit mit diesem Server synchronisieren.

Wenn die eigenen Rechner in einer Domäne untergebracht sind, dann synchronisieren diese Rechner ihre Zeit vermutlich mit dem Domänen-Server. Dazu hat der Windows 2003 Server beispielsweise eine Timeserver-Software. Der Domänen-Server seinerseits synchronisiert seine Zeit dann mit einem Rechner von dem bekannt ist, das er die richtige Uhrzeit kennt.

Hat man nur einen einzelnen Rechner oder keinen Domänen-Server kann man seine Uhrzeit aber natürlich auch synchronisieren. Damit die Sache bei einem Client aber überhaupt geht, muss man den Zeitgeber Dienst starten. Das kann man zum Beispiel über das Applet 'Dienste' aus der Systemsteuerung tun, oder man verwendet den folgenden Befehl auf der Kommandozeile: net start w32time

Dann kann man überprüfen mit welchem Rechner die eigene Uhrzeit synchronisiert wird. Das geht mit dem Kommando: net time /querysntp

Dabei wird dann bei Ihnen in den meisten Fällen rauskommen, das die eigenen Zeit mit einem Timeserver von Microsoft synchronisiert wird: time.microsoft.com

Man kann aber natürlich auch andere Zeitserver einstellen. Das mit dem Befehl net /setsntp:Server1,Server2

Stellt sich die Frage woher man nun die Zeitserver nimmt. Das ist aber eigentlich ganz einfach: Man verwendet die von der Physikalisch-Technischen Bundesanstalt zur Verfügung gestellt Atomzeit. Die sollte eigentlich genau genug sein. Die PTB stellt zwei Server zur Verfügung: ptbtime1.ptb.de und ptbtime2.ptb.de.

Die PTB hat dankbarerweise auch einige technischen Hinweise veröffentlicht. Die finden Sie hier.

Der Windows Zeitgeberdienst gibt übrigens auch ein paar Informationen aus - zum Beispiel wenn er die Uhrzeit synchronisiert hat. Diese Informationen finden Sie in Form von Einträgen im Bereich 'System' der Ereignisanzeige.


Lasten sind lästig


Ich beschäftige mich nun schon seit geraumer Zeit mit der Art und Weise wie Lasten 'funktionieren' sollen. Frustrierende Sache: Lasten sind wirklich deutlich schwieriger als man das meinen möchte.

Hier mal ein kurzer Abriss der Fälle die so eintreten können, wenn man mit Lasten arbeitet - und zwar nur anhand eines ganz einfachen Beispiels.

Angenommen, man hat einen Knoten der mit einer Last belastet ist.

Jetzt wird der Knoten ausgewählt und verschoben (ohne Kopien). In diesem Fall soll die Last wohl mit verschoben werden - obwohl sie selbst gar nicht ausgewählt wurde!

Im zweiten Fall wird die Last ausgewählt, der Knoten aber nicht. Dann wird verschoben: In diesem Fall verbleibt der Knoten an seiner Stelle - die Last landet als beim verschieben auf einem anderen Knoten. Außerdem: An der Zielstelle ist unter Umständen gar kein Knoten - im Zuge des Verschiebens der Last muss also ein neuer Knoten angelegt werden!

Im dritten Fall wird Knoten und Belastung ausgewählt und verschoben: Dabei soll natürlich die Last hinterher immer noch auf dem Knoten sein - nur ist der eben an einer anderen Stelle. Das funktioniert also im Prinzip genauso wie der erste Fall, obwohl die Auswahl der Objekte völlig anders ist.

Jetzt kommt dann der spaßige Teil: Was passiert, wenn an der Stelle an die verschoben wird bereits ein Knoten ist? Das ist wiederum abhängig von der Auswahl: War nur die Last ausgewählt, verschwindet der ursprüngliche Knoten und der vorhandene wird genommen.

War der Knoten auch ausgewählt - dann gibt es an der Zielstelle nach dem verschiebene einen doppelten Knoten. (Es ist zu überlegen ob sowas dann vor der Berechnung per Warnung angemeckert wird oder nicht. Vielleicht sollte man Knoten auch manuelle verschmelzen können...)

Und die Sache wird noch viel komplizierter - und zwar dann, wenn beim verschieben auch Kopien angelegt werden. Denn dann sind alle Fälle für jede Kopie zu prüfen.

Wenn ich Sie wäre, dann wäre ich froh, das man bei den Statikprogrammen einfach nur eine Last anklicken muss und dann den Befehl zum verschieben auswählen kann. Das ist wirklich deutlich einfacher als die Sache zu programmieren... :-)

 

 


Microsoft verschenkt C/C++ Compiler


Ab sofort kann man das Visual C++ Toolkit kostenlos von Microsoft runterladen. Das Toolkit enthält:

  • Den C/C++ Optimizing Linker und Compiler aus Visual C++ 2003
  • Die C Runtime Library, die C++ Standard Library und die STL aus VC++ 2003
  • Die .NET Framework CLR. (Der Compiler kann nicht nur nativen Win32 Code sondern auch Code für die CLR erzeugen, MC++ - Managed C++)
  • Beispiel-Programme

Wer bereits Visual Studio 2003 oder Visiual C++ 2003 besitzt braucht das Toolkit nicht; wer einen tollen kostenlosen C++ Compiler mit Support für .NET sucht ist dabei gut aufgehoben. Eine IDE gibts allerdings nicht - aber zur Not tut es sicherlich auch SharpDevelop.

Das .NET SDK ist ja schon immer kostenlos gewesen. Darin befindet sich unter anderem der VB.NET und der C#.NET Compiler - sowie auch ein Debugger, den man auch für C/C++ Projekte verwenden kann.


Wer schon immer mal einen Schreibtisch bei D.I.E. sehen wollte...


Hier mal etwas nachdem ich andauernd gefragt werde bisher tasächlich schon einmal gefragt wurde: Wie sieht wohl der Schreibtisch eines Programmieres bei D.I.E. aus?

So:

Mein Hauptrechner ist der Laptop, ein Acer TravelMate 800. Da hängt noch ein bisschen Peripherie dran, so die optische Maus, eine zusätzliche externe Festplatte, der DVD-Brenner ein paar Boxen und ein zweiter Monitor.

Der Laptop läuft mit 1400x1050 Pixeln Auflösung, der externe Monitor mit 1280x1024. Ich versuche mich aber schon seit geraumer Zeit dazu zu überreden einen größeren externen anzuschaffen... :-)

Wer nun selbst keine Software entwickelt dem ist vermutlich nicht klar wofür der ganze Bildschirmplatz benötigt wird. Das ist so:

Auf dem Laptop-Monitor läuft normalerweise die Entwicklungsumgebung - das ist das Programm mit dem der Quellcode für die Statik-Programme geschrieben wird, und mit dessen Hilfe auch die Fehlersuche in den Statikprogrammen stattfindet. Diese Umgebung hat so viele Fenster, Menüs und Toolbars das nicht viel Platz für den Editor bleiben würde wenn alle auf dem einen Monitor wären. Der Editor ist aber das wichtigste Werkzeug: Damit wird der Quelltext angezeigt.

Darum sind einige Fenster auf dem zweiten Monitor. Dazu gehört zum Beispiel die Projektverwaltung, die schon allein ein recht großes Fenster braucht: Im aktuellen Projekt befinden sich etwas über 6000 Dateien in rund 900 Ordnern - da kann man schon ein bisschen Übersicht gebrauchen :-).

Während der Fehlersuche muss das eigentlichen Programm natürlich auch noch irgendwo laufen - das passiert auch auf dem 2. Monitor. Auf dem Foto erkennt man (was man so erkennen nennt...) den Debugger auf dem Laptop und Xfalt auf dem zweiten Monitor.

Im Glas ist übrigens Apfelsaft...


Weblogs und Kommentare


Nachdem ich in letzter Zeit mehrfach Mails mit Fragen und Anregungen zum Blog erhalten habe würde ich ganz gern nochmal auf ein Feature des Blogs eingehen: Unter jedem Eintrag gibt es links einen Link mit der Beschriftung 'Kommentare'.

Wenn Sie da draufklicken können Sie direkt einen Kommentar oder eine Frage zum Eintrag hinterlassen. Dadurch ist dann Text und Kommentar beieinander... Ich kann von hier aus sehen wenn ein neuer Kommentar geschrieben wurde und beantworte die dann auch direkt: Die Antwort steht dann unter dem Kommentar. Auf diese Weise haben alle was davon, und ich muss die Antwort nicht mehrfach per Mail verteilen. :-)

 


DVD Brenner


Ich habe gerade einen externen DVD Brenner gekauft um einfacher Backups machen zu können: Die Gesamtmenge an zu sichernden Daten ist eben doch schon mehr als auf eine CD passt. Ich habe den Kauf eines DVD-Brenners aber schon seit Monaten vor mir hergeschoben weil ich dachte die Dinger kosten ein Arm und ein Bein. Stimmt aber gar nicht.

Interne DVD-Brenner gibts schon ab 80 (!) Euro, externe ab 150. Die Medien gibts für unter 1 Euro pro Stück. :-)

Erstaunlich.

Mein Backup-Problem ist damit auf lange Sicht geklärt.

[Update und Zusatz]

Die Art und Weise wie die Hersteller solcher Geräte mit Ihren Kunden umgehen ist aber ebenso erstaunlich. Das Gerät (ein Lite-On) kommt in einem Karton. Darin befindet sich der (unvermeidliche und nervige) Aku, der Brenner, eine Art Stütze für Leute die den Brenner auf der Seite stehend betreiben wollen, eine Betriebsanleitung und ein paar CDs.

Die Betriebsanleitung besteht aus einem Stück Papier auf dem in diversen Sprachen beschrieben ist wo man die einzelnen Kabel reinstecken muss. Das ist zugegebenermassen bei USB relativ einfach.

Damit ist die Betriebsanleitung aber auch beendet. Stellt sich die Frage: Wie brennt man denn nun? Naja - vermutlich ist da Software auf den CDs. Folgende CDs liegen drin - ohne jeden Kommentar oder irgend eine Erläuterung:

- Eine CD mit der Beschriftung: 'PowerDVD' sowie ein paar Erklärungen. Was ein Power-DVD Programm tut steht aber nicht drauf. Soll man wohl ausprobieren.

- Eine CD mit der Beschriftung 'MyDVD'. Ausser dieser Beschriftung steht noch drauf das man irgendwelche Intel-Treiber entfernen soll bevor man die CD installiert. Warum man die CD installieren sollte - bzw. was ein 'MyDVD' überhaupt ist - steht nicht drauf.

- Eine CD mit der Beschriftung 'LiteOn'. Sonst steht nichts drauf. (Weil es auch ein LiteOn Brenner war hielt ich das für die Treiber-CD. Irrtum: Es war nur ein leeres DVD Medium.) :-)

- Eine CD ohne jegliche Beschriftung.

Ich find das unglaublich. Hat dann auch eine Stunde gedauert bis ich herausgefunden hatte was man nun eigentlich installieren muss um DVDs zu brennen. (Auflösung: MyDVD).

Gebrannt habe ich übrigens ein Windows Longhorn Preview. Das werde ich dann am Abend ode übers Wochenende mal installieren...

 


Richtiges werfen von Exceptions


Vorweg: Beim nächsten mal wird es hier wieder etwas Bauingenieurs-lastiger werden; zumindest etwas weniger aus der Programmier-Ecke. Aber eben erst beim nächsten mal. :-)

Wenn Sie einen RSS-Reader verwenden, und sich für den Programmier-Kram nicht interessieren: Abonnieren Sie einfach nicht den kompletten Feed, sondern nur die Kategorien die Sie interessieren. (Die RSS-URLs der Kategorien dazu stehen rechts am Rand.)

Zu den Exceptions:

ICommand cmd = CommandManager.GetCommand( idCommand);

try
{
   UndoManager.BeginCollection("FooBarCommand");

   cmd.Execute( context);

}
catch( Exception ex)
{
   UndoManager.ForgetCollection();
   throw ex;
}
UndoManager.EndCollection();

Dieser Code - es geht im Wesentlichen um das 'throw ex' - ist eigentlich immer falsch.

Der Punkt dabei ist der: Durch das 'throw ex' landet der eigene Stack-Trace im Exception-Object, die Original-Information geht verloren. Eigentlich muss man statt dessen einen von zwei anderen Wegen gehen.

1. Es ist wichtig das man selbst im Stack-Trace der Exception auftaucht. M.a.w.: Man ist ein relevanter Teil der Exception-Chain.

In diesem Fall sollte man die Exception in eine eigene Exception verpacken und die Original-Exception in der InnerException der neuen Exception aufbewahren. Dadurch wird die Exception spezieller und gleichzeitig bleibt die Origial-Information (in der InnerException) erhalten:

catch( Exception ex)
{
   throw new MySpecialException( ex);
}

2. Man hat die Exception nur gefangen um aufräumen zu können, man ist aber kein wichtiger Teil der Exception-Chain. (So wie im Beispiel am Anfang.)

In diesem Fall sollte man eben aufräumen was es aufzuräumen gibt, und dann die unverönderte Exception - mit ihrem Original-Stacktrace - erneut werfen:

catch( Exception)
{
   UndoManager.ForgetCollection();
   throw;  // <- kein 'ex' !
}

Dank an Brad Wilson