Thursday, 9. April 2009Umsteig auf Wordpress
Mit der Übersiedelung des Servers bin ich auf Wordpress umgestiegen, alle neueren Blogeinträge befinden sich daher auf der Hauptsesite
Monday, 16. February 2009Debian Server ueber NEtzwerk auf neuen RAID1-Server migrieren
Am Wochenende hatte ich die Aufgabe, einen bestehenden Server auf einen neuen Rechner migrieren. Der neue Rechner
hat 2 Festplatten drin, die man als Software-RAID1 gespiegelt im Verbund betreiben kann. Im Internet habe ich einige Anleitungen gefunden, wie man ein laufendes System zu einem RAID-1 Verbund konvertiert, aber der Aufwand ist in diesem Fall ja nicht nötig, da man ja übers Netzwerk auf ein komplett neues System migrieren kann. Ich habe micht daher etwas herumgespielt und diese Anleitung entwickelt. Vielleicht kann ja mal jemand was damit anfangen. Wednesday, 11. February 2009Erzeugung von core dump erzwingen trotz eigenem SIGSEGV handler
Ein Problem mit Programmen ist, dass diese immer mal wieder abstürzen. Der Kunde mault, der Entwickler ist ratlos wie es dazu gekommen ist. Um post-mortem noch etwas über den Crash der Applikation feststellen zu können, gibt es unter *nix coredump-files.
Nun kann man mit ulimit -c unlimited die Erstellung dieser coredump zwar einschalten, aber das nützt nix, wenn man einen eigenen Signal handler für SIGSEGV hat, in dem man z.B. einen Stacktrace generieren und in ein Logfile zur Schnellanalyse schreiben kann.Zufällig bin ich auf einen Mailinglisteneintrag gestoßen, wo erklärt wird, wie man den Signalhandler so setzt, dass trotzdem noch ein Stacktrace generiert wird. Prinzipiell muss man mit sigaction mithilfe des Flags SA_RESETHAND einstellen, dass der Signal-handler selbst auch wieder ein signal absetzen darf und im Signal-handler dann mit raise das Signal nochmals senden, sodass der Kernel den Coredump produziert.Ich habe den Code noch etwas erweitert, um z.B. die Erstellung eines Coredumps trotz ulimit -c 0 zu ermöglichen und in meinem Signal handler gibt's einen Stracktrace auf stderr. Den Beispielcode findet man hier Das weitere Debuggen des coredumps sollte dann ohnehin bekannt sein: gdb [executable] [coredump] Wednesday, 28. January 2009Defekte Windows XP Registry wiederherstellen
Nachdem ich heute mal wieder einen Fall hatte, bei dem die Windows XP Registry-Datei (konkret der SYSTEM hive) im Eimer war, bin ich auf diesen Link gestoßen, wo erklärt wird, wie man mithilfe von Systemweiderherstellungspunkten die Registry-Datei wiederherstellen kann.
Konkret geht's relativ einfach: Mit Bart PE booten, im "System Volume Information" Ordner den neuesten Systemwiederherstellungspunkt (RP* Verzeichnis mit der höchsten Nummer) suchen und die jeweilige Registry-Datei in %systemroot%\system32\repair\ zurückkopieren. Das Mapping der Files steht ebenfalls beschrieben:
c:\windows\tmp natürlich durch den jeweiligen RP-Ordner ersetzen. Wednesday, 7. January 2009SIL3112 SATA-Controller des P4G8X Mainboards für Platten >750GB (z.B. 1TB) einrichten
Habe gestern ein P4G8X Mainboard geschenkt bekommen und wollte den neuen Rechner auch gleich entsprechend "würdigen", indem ich ihm eine 1TB SATA-Platte verpasse.
Also schnell mal eine 1TB Platte gekauft, reingesteckt und.... ...ernüchterung. Der SATA Controller bleibt beim Erkennen der Platte hängen. Na Prima! Also mal auf der Mainboard-Herstellerseite nach einem BIOS-Update suchen.. Fehlanzeige, das neueste BIOS ist von 2003. Was also tun? Glücklicherweise bin ich dann auf folgenden Thread gestoßen: http://forums.seagate.com/stx/board/message?board.id=ata_drives&thread.id=970&view=by_date_ascending&page=1. Dort wird erklärt, dass man mit MMTOOL das neue Controllerbios in das BIOS-Image hineinpatchen kann. Mit dem dort vorgeschlagenen MMTOOL geht's aber nur für AMI-BIOS wies scheint, also nichts für mein Board mit AWARD-BIOS. Jedoch habe ich bei meiner Recherche dann folgendes nützliche Tool entdeckt: AWDBEDIT. Folgende Schritte habe ich durchgeführt, um mir ein BIOS mit aktuellem SATA-Controllerbios zu erzeugen: 1) Aktuelle BIOS-Version vom Hersteller laden. 2) Wie im Thread oben angegeben Aktuelles SATA-ControllerBIOS laden. 3) AWDBEDIT laden 4) Alles In ein Verzeichnis auf der Platte laden. 5) AWDBEDIT hatte bei mir einen Bug und hat die Plugins nicht im Unterordner gefunden, habe daher die Files aus dem Plugins-Ordner ins Programmverzeichnis (also eine Verzeichnisebene höher) kopiert. 6) In AWDBEDIT die 1006G.awd geöffnet 7) Die Fehlermeldung, dass das kein gültiges BIOS-Image ist ignoriert und mit "JA" trotzdem das Laden bestätigt. In der Kategorie Font ROMs den FONT0 ROM ausgewählt. Dort müsste die rom\storage\4224.bin drin sein. 9) Actions / Replace File.. 10) 4284.bin aus dem zuvor entpackten Controllerbios eingefügt und dann unter Filename rom\storage\4284.bin genannt. 11) File / Save 12) Neues gepatches File geflasht. Viell. kann den Tip ja auch mal wer brauchen. Thursday, 11. December 2008Prompt in Midnight commander unter SuSe
Was mir unter SuSe hier in der Firma immer schon am Nerv ging:
Das Prompt in der Kommandozeile veränderte sich nie je nach Verzeichnis, in welchem man gerade war. Folglich muss man dann immer pwd eingeben, um sicherzugehen, in welchem Pfad man ist. Die Ursache ist das PROMPT_COMMAND in /etc/profile, welches nicht sehr mc-Kompatibel ist. Lösung: einfach durch folgendes austauschen:
Wednesday, 26. November 2008strace für DOS
Auf der Suche nach einer Art
strace für DOS, also einem Tool, welches die DOS-Funktionsaufrufe trackt und in einer Protokolldatei mitschreibt, bin ich auf folgendes sehr Nützliches Tool gestoßen, welches ich meinen Blog-Lesern nicht vorenthalten möchte:Trace: A tool for logging operating system call transactions Thursday, 20. November 2008Messagebox mit Timeout
Nachdem Zeit Geld ist und jemand nicht unbedingt immer die Nerven hat eine Messagebox wegzuklicken habe ich heute mal schnell eine MessageBox mit Timeout programmiert.
Das Prinzip ist denkbar simpel: Messagebox Hooken, Windowhandle bei Initialisierung holen, Timer Setzen und bei Timeout default-Button drücken. Dabei bin ich jedoch durch einen Programmierfehler (vergessen die Timerprozedur in SetTimer anzugeben) auf ein interessantes Verhalten gestoßen: Scheinbar reicht es, einen Timer mit der ID 1 mit SetTimer in der MessageBox anzulegen, der dann nach Ablauf der Zeit ein WM_TIMER an die Messagebox sendet. Vermutlich hat die Dialogprozedur des Systems schon von sich aus eine Logik dahinter, die die Box dann schließt.Code siehe hier: MessageBox mit Timeout Eine noch interessantere Lösung habe ich dann schließlich in der MSDN gefunden: KB181934 Friday, 31. October 2008Empfangendes Interface bei UDP-Kommunikation finden
Ich schreibe zur Zeit privat an einer kleinen RIS (Remote-Installation)-Lösung, mit der man übe rPXE ein Betriebssystem bequem und einfach übers Netzwerk installieren kann.
Dafür wollte ich auch ein kleines Feature einbauen, mit welchem man Tokens (derzeit nur einen Token) im Textfile, welches die Menüstruktur des PXE-Menüs beschreibt, hinterlegen kann, welche dann entsprechend ersetzt werden. Konkret handelte es sich um einen Token, welcher die IP-Adresse des TFTP-Servers angeben soll. Um Knoppix über PXE zu booten, habe ich das gepatchte Koppix verwendet, welches statt über NFS auch über SMB booten kann. Hier der entsprechend gepatchte Knoppix-Kern. Leider benötigt dieser bei der Pfadangabe des zu bootenden Servers unbedingt die IP und kann den Namen scheinbar nicht auflösen. Da ich den Server aber möglichst flexibel halten will, dachte ich mir, ich lasse meinen TFTPD einfach die IP des Interfaces einsetzen, über den der TFTP-Server den Client bedient. Doch das herauszufinden gestaltet sich leider alles Andere als einfach. Ich binde den TFTPD auf alle Interfaces (INADDR_ANY). Danach verwende ich recvfrom und sendto , um Requests zu erhalten bzw. zu beantworten. Damit funktioniert das Ganze ja recht einfach, beim recvfrom erhalte ich die CLIENT-Adresse, die ich bei sendto wieder angeben muss. Doch wie bekomme ich die IP des Interfaces?Die erste Idee war, getsockname nach dem ersten recvfrom zu verwenden. Unter BSD-Artigen Systemen ist in der resultierenden Strutur dann die jeweils verwendete Adresse zu finden (sockaddr_in ). Groß war die Ernüchterung, als unter Windows jedoch 0.0.0.0 drinnen stand. Warum das so ist erklärt der Artikel Q129065 der Microsoft Knowledge Base.Na prima, dort steht eindeutig: Applications should not assume that they can get the IP address of the interface.. Damit wollte ich mich aber nicht zufrieden geben. Irgendwie muss es doch möglich sein, trotzdem das zuständige interface herauszufinden. Schließlich kam ich auf folgende Idee, die als Workaround ganz gut funktioniert: Von recvfrom ist ja die IP des Clients bekannt. Also müssen wir Winsock einfach fragen, welches Interface die beste Route dorthin hat. Mein Workaround:
Gewinnt zwar keinen Schönheitspreis, aber mir ist auch keine bessere Lösung dafür bekannt. Wednesday, 1. October 20086bit auf 8bit Farbpalette konvertieren
Der Maskenhandler für die Terminalausgabe von unserem Softwarepaket unterstützt auch ANSI-Color Farbterminals mit einer 6bit breiten Palette (sprich 64 Farben).
Hat man jedoch gerade kein Terminal bei der Hand, kann man auch einen Terminalemulator wie z.B. PuTTY verwenden. Dieses unterstützt bereits 256 Farben nach der xterm-Emulation. Nun wollte ich also auch auf meinen xterm Farben haben und nicht immer nur mit vt100 herumzugrundeln. Aus diesem Grund musste also die 6bit - Palette auf eine 8bit Palette gemappt werden. In unserem termcap-File konnte man auch die einzelnen Farbwerte definieren, bloß welche Werte nehmen, wenn man eine größere Palette hat als die verwendete EGA-Palette? Ich habe im Internet nach einer Mapping-Tabelle oder einem kleinen Konvertierungsscript gesucht. Nach langem, vergeblichen Suchen habe ich dann schließlich beschlossen, selbst ein kleines Programm zu schreiben, welches die Konvertierung vornimmt: Zuerst werden beide Paletten im Speicher angelegt, dann wird die 6bit-Palette durchgegangen und jeder Eintrag wird an den nähesten RGB-Wert der 8bit Palette angeglichen. Dieser Index wird dann genommen und siehe da: Die Palette ist konvertiert. Das Programm schreibt einfach die einzelnen Farbstufen und den zugehörgen Palettenwert in unserem Termcap-Format auf stdout. Viell. kann es ja auch einer meiner Leser brauchen? Quellcode gibt's jedenfalls hier. Compilieren einfach mit gcc -o palette palette.c oder mit jedem beliebigen anderen C-Compiler.
Tuesday, 30. September 2008Die Portnummern-Kopfnuss
Alles begann damit, dass Genosse Chefprogrammierer zu mir kam furchtbar schimpfend über unsere RPC-Library.
Als ich ihn fragte, was denn los sei, meinte er, dass bei einem unserer Kunden immer wieder die Portverbindung abreißt und der dortige Techniker von uns als Beweis, dass es nicht an unserer Software liegt, tcpdumps der Sessions wollte. Faktisch kann es nicht an unserer SW liegen, weil wenn alle User gleichzeitig disconnectet werden, jedem User aber eine eigene Logon-Session mit eigener Socketverbindung zugeordnet ist, dann wäre das schon ein sehr merkwürdiger Zufall. Aber nachdem das Problem angeblich seit Versionseinspielung auftritt, sollten wir also den Beweis antreten. Der Genosse hatte versucht, mithilfe von tethereal die Datenströme je nach Ports zu filtern. Da kam aber nix. Gar nix. Nicht mal wenn man eine Verbindugn machte auf den Port. Kein SYN-Paket, einfach nix.Also habe ich gemeint, man könnte es ja mal mit tcpdump probieren. Selbes Resultat: Kein Mucks.Das kam mir jetzt schon etwas spanisch vor. Unsere Applikation startet über xinetd einen Hostextender (der rennt über stdio und wird über xinetd mittels tream eben durchgepiped). Der Hostextender läuft auf einem in /etc/services eingetragenen Port, der Port wird daher zu einem Namen aufgelöst. Nun lag die Vermutung nahe, dass es sich viell. um ein xinetd-Problem handeln könnte (wenngleich tcpdump ja im promicious mode eigentlich alles mitkriegen sollte, was da so abläuft). Andere xinetd-Dienste belauscht, da funktionierte es problemlos. Die nächste Strategie war, einmal mit iptraf nachzusehen, wo denn nun der Traffic läuft, wenn man etwas im Terminalemulator tut. Da sah man, dass die Verbindung auf Port 3464 lief.Suchte man im netstat nach dem Port, so fand man keine Verbindung gelistet. Gespenstisch. Und immer wenn man auf Port 3464 verband, erhielt man auch die freundliche Login-Hilfe des Hostextenders. Wir habe ndann mal verifiziert, ob auf anderen Rechner auch auf diesem Port der Hostextender läuft. War überall dort anzutreffen. Mit tcpdump auf 3464 konnte man auchdie Datenströme dumpen.Nun war das Problem zwar eigenltihc gelöst, aber etwas mulmig war uns doch bei der Sache. woher kommt diese wundersame Portnummer, die wir noch nie gesehen haben. Laut /etc/services irgendein edm-mgr-sync. Merkwürdig. Nach längerem Suchen und grübeln sah ich mir nochmals die Portnummer an: 69000. Da fiel es mir wie Schuppen von den Augen, was neulich der neue Kollege aus der Technik bereits bei meiner Erklärung unseres Terminalemulator-Systems eingewandt hatte: Gibt's net nur 65535 Ports? Daran hatte bis jetzt niemand gedacht, weil wenn man das auf einen short castet kommt immer der richtige Wert raus. tcpdump und Konsorten haben aber scheinbar keine Bereichsüberprüfung und fressen alles 1:1, sie arbeiten ja im promicious mode und sich nicht gezwungen, das socket-Struct zu befüllen, welches als Datentyp short vorgibt.
funktioniert also genauso. Autsch! Monday, 16. June 2008Zwischen PuTTY Fenstern mittels Hotkey wie unter Unix wechseln
Wie ja schon in meinem Dualhead-Beitrag erwähnt, arbeite ich mit 2 Schirmen im Büro.. Links das Windows-Zeugs, rechts das Terminal auf Vollbild.
Das klappt soweit ganz gut, allerdings habe ich natürlich immer mind. 5 Terminals gleichzeitig offen, zwischen denen ich immer wieder hin- und herschalten muss. Das ist mühsam mit ALT+TAB, um immer das richtige Terminal zu suchen. Es wäre daher wünschenswert, dass man - wie unter Unix üblich - mittels ALT-F1 bis ALT-F10 zwischen den einzelnene offenen Konsolen herumwechseln kann. Genau das habe ich mit einem kleinen Programm nun realisiert: Es legt sich auf die Tastenkombinationen STRG + ALT + F[1..12] und öffnet das jeweilige PuttY-Fenster in der Reihenfolge, wie die Fenster geöffnet wurden. Ich öffne also alle benötigten PuTTY-Fenster, gib sie am rechten Schirm auf Vollbild (in den Optionen unter Window/Behaviour auf [x] Full screen on ALT+Enter und dann am rechten Schirm ALT+ENTER). Sobald mein Utility im Hintergrund läuft, kann ich nun mit den oben genannten Tastenkombinationen auf den Terminals hin- und herschalten. Sourcecode gibts hier Das fertige Kompilat als Mini-EXE (3k) gibts hier Tuesday, 20. May 2008Combobox mit Autocomplete
Um einer comobox Autocomplete-Funktionalität zu verleihen, muss man diese wie gewohnt Subclassen.
Allerdings ist zu beachten, dass man nicht in jedem Fall Autocomplete darf. Drückt der User z.B. Backspace oder ENTF, so darf die Routine dafür nicht anspringen, sonst könnte er ja nichts mehr löschen. Um dies zu erreichen, muss auch das zur Combobox zugehörige Edit-Control gesubclassed werden. Möchte man die Combobox während der Eingabe aufgeklappt lassen, so ist zu beachten, dass das Auf- und zuklappen mittels PostMessage() gesteuert werdenm uss, andernfalls befindet sich das Control in einem inkonsistenten Status, welcher glaubt, dass die linke Maustsate gedrückt ist und somit den Eingabefokus der Maus "stiehlt". Ein kleines Beispiel C-Modul gibts hier Friday, 28. March 2008Dualhead: Fenster nur auf erstem Schirm (Desktop) minimieren
Im Büro habe ich ja wie erwähnt einen neuen Rechner bekommen. Das Schöne ist: Er kann dualhead, das beduetet, ich kann 2 Monitore anschließen und habe daher einen erweiterten Desktop.
Sehr nett zum Entwickeln: Rechts auf Vollbild das Terminal, links die Windowsprogramme und unseren Terminalemulator. Dh: Testen links, entwickeln rechts. Sehr praktisch ansich. Nur habe ich leider dummerweise die Angewohnheit, die Programme zum Testen immer über die Desktop-Icons aufzurufen und alte schlechte Gewohnheiten wird man schwer los wie es scheint. Daher hat mich folgendes Windows-Verhalten sehr genervt: Wenn man auf "Desktop anzeigen" klickt oder WIN+M oder WIN+D drückt, werden die Fenster auf allen Schirmen minimiert. Um hier Abhilfe zu schaffen habe ich mir daher ein kleines C-Programm geschrieben welches nur die Fenster am primary display (Desktop) minimiert: Sourcecode gibts hier. Das fertige Kompilat als Mini-Exe (3k) gibts hier. Viell. kanns ja noch wer brauchen. Die .exe einfach irgendwo hinkopieren und dann in der Taskbar verknüpfen. Bei Ausführung werden alle Fenster am primary Display minimiert. Tuesday, 25. March 2008ALTGR - Tastenkombinationen (z.B. Backslash) mit Remotedesktopverbindung
Ich habe dieser Tage einen neuen Bürorechner bekommen und habe mir diesem mit Windows XP eingerichtet. Ich benutze den Rechner auch, um via Remotedesktopverbindung (RDP) auf meinen Rechner zuhause zuzugreifen. Mit dem alten Rechner hat dies wunderbar geklappt, mit dem neuen jedoch hatte ich Probleme bei Tastenkombinationen, welche mit ALT GR arbeiteten (z.B. Backspace eingeben). Das Ganze funktionierte mit Glück manchmal, meistens jedoch nicht. Im Internet wurde dazu geraten, statt ALT GR die Tastenkombination CRTL+ALT zu benutzen, damit funktioniert es. Das ist für mich aber keine befriedigende Lösung, da man beim Eintippen immer "umdenken" muss, was den Arbeitsfluss ziemlich stört.
Nach einiger Rercherche im Internet bin ich schließlich auf folgenden Newsgroup-Eintrag gestoßen, welcher eine befriedigende Lösung für das Problem aufzeigt: Remote-Desktop und Systemtasten (Alt, Alt-Gr, Shift) + Lösungen Um es kurz zusammenzufassen: Man muss am lokalen Rechner (der,w elcher die RDP aufbaut) folgende einstellungen unter Systemsteuerung -> Regions- und Sprachoptionen -> Registerkarte Sprachen -> Button Details tätigen:
Wen so wie mich das Weechseln des Layouts bei mehreren installierten Layouts mittels iener Tastenkombination stört (weil sich das Ganze ständig umschaltet), der kann noch unter dem Buton "Tastatur.." die Tastenkombination zum Wechsel des Eingabegebitssschemas abstellen. Seitdem funktioniert mein Backspace wieder mit RDP.
(Seite 1 von 16, insgesamt 235 Einträge)
» nächste Seite
|
SucheBlog abonnierenTop ReferrerVerwaltung des Blog |