Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

7. August 2006 um 23:25

Inhalte und Suchmaschienen

Erst vor ein paar Tagen fand ich bei WWWorker – Sascha A. Carlin den Link auf einen wirklich ausgezeichnete Story über einen Suchmaschinen-Robot:
"Webdesigner und Suchmaschinen-Robot"

Auf diese Weise kann man sich die Arbeitsweise von Robots vermutlich viel besser aneignen als mit einem schlichten Artikel. Oder?

7. August 2006 um 12:30

Vorgehen bei Datenbank-Reparaturen (Teil 2b)

Im vorherigen Teil der Serie zum Vorgehen bei Datenbank-Reparaturen am SQL Server 2000 wurde erklärt, wie man vorgeht, wenn das Tranlog defekt ist und die Datenbank ordentlich geschlossen wurde, d.h. das Transaktionslog im Prinzip leer ist. Trotz Urlaub will ich daran anknüpfen:
Was macht man aber, wenn die Datenbank nicht geschlossen wurde, sondern der Server abstürzte, weil die Festplatte langsam schrottet und just da auch noch das Tranlog rüber rudert? Das ist ein häufiges Szenario, weil das Tranlog sehr oft zugegriffen wird. Und deswegen besonders oft von Festplattenproblemen betroffen ist.

In diesem Fall muss wird die "Reparatur" etwas fummelig. Wenn man Glück hat, dann ist die Datenbank noch am SQL Server angehängt, aber als suspekt markiert. Wenn man den vorherigen Tipp ausprobiert hat ohne vorher die Master-Datenbank zu sichern oder einem die DB-Dateien zur Untersuchung zugeschickt wurden, dann muss man der SQL-Server erst mal austricksen, um die defekte Datenbank an den Server angehängt zu bekommen. Wenn man dann soweit ist, dass die Datenbank angehängt, aber suspekt ist, dann ist es nicht mehr so schwierig. Mit beiliegendem Statement bekommt man übrigens eine Liste aller Datenbanken mit deren Status:

select name, databasepropertyex(name, 'status')
from master.dbo.sysdatabases

Im Folgenden wird erklärt, wie man das Tranlog löscht und vom SQL Srever ein Neues anlegen lässt. Da im Tranlog aber eventuell wichtige Daten standen, erzeugt man dadurch möglicherweise einen inkonsistenten Datenbestand.

(1) Datenbank in den "Emergency-Mode" schalten. Beim nächsten Start wird für die Datenbank kein Recovery versucht:

-- Änderungen in den Systemtabellen erlauben
exec sp_configure 'allow update', 1
reconfigure with override
go
– Datenbank in den Emergency mode setzen
update master..sysdatabases
set status = status | 32768
where name = 'MyCrashDB'
go
– Änderungen in den Systemtabellen verbieten
exec sp_configure 'allow update', 0
reconfigure with override

(2) SQL-Server-Dienst stoppen und neu starten. Erst danach ist die Datenbank im Emergency-Mode.

(3) Jetzt kann ein neues Transaktionslog angelegt werden. Vorher muss man die alte Tranlog-Datei noch schnell umbenennen (oder löschen, denn man hat ja vorher eine Kopie gemacht, oder?)

-- Log neu erzeugen lassen:
DBCC rebuild_log ('MyCrashDB')

Das Ergebnis sieht etwa so aus:

Warning: The log for database 'MyCrashDB' has been rebuilt. Transactional consistency has been lost. DBCC CHECKDB should be run to validate physical consistency. Database options will have to be reset, and extra log files may need to be deleted.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

(4) Jetzt muss man die DB nur wieder auf "normal" schalten:

alter database MyCrashDB
set online

Und schon hat man es geschafft.
Die gute Nachricht ist, dass man beim SQL Server 2005 nicht mehr in den Systemtabellen rumpfuschen muss. Die schlechte ist, dass immer noch viel Handarbeit notwendig ist. Naja, aber so arme Hunde wie ich müssen ja auch leben… 😉

Im dritten Teil geht es dann um Reparaturen rund um DBCC CHECKDB.

7. August 2006 um 11:42

nosoftwarepatents-award: Besetztzeichen als Patent

Bei den Kandidaten für das "Software-Patent des Monats – August" ist wieder ein besonderer Knaller dabei:

Patentierte Idee: Den Verbindungsaufbau für zeitkritische Verbindungen, speziell Telefongespräche, nur dann zulassen, wenn dafür genügend Bandbreite zur Verfügung steht.

In der herkömmlichen Welt nennt man sowas "Besetztzeichen" und ist auch schon bei VoIP gängig. Wenn das Patent in Europa gültig würde, dann müssten wohl alle VoIP-Anbieter das Besetztzeichen lizensieren. Echt prima, eine Lizenz zum Gelddrucken! Das Patent wurde übrigens als besonders innovativ ausgezeichnet. Die Patent-Freunde leben einfach in einer anderen Welt. Ich habe nicht den Hauch Verständnis dafür Software zu patentieren. 🙁

Auf der Seite werden jeden Monat 5 Software-Patente ausgewählt, die bereits angemeldet und gültig sind. Obwohl es in Europa noch gar keine Software-Patente geben darf, werden jedes Jahr sehr viele Patente zugelassen, sie sind halt noch nicht gütig. Das wird sich erst ändern, wenn die EU auch Software-Patente zulässt. Was die Veranstalter des "nosoftwarepatents-award" erreichen wollen, beschreiben sie so:

In diesem Monat gehen wir den umgekehrten Weg und präsentieren fünf Patente, die mit verschiedenen Preisen für „hervorragende Innovation“ ausgezeichnet wurden. Auf diese Weise möchten wir unseren Lesern einen objektiven Blick auf die Schädlichkeit oder Nicht-Schädlichkeit von Software-Patenten ermöglichen.

6. August 2006 um 15:16

Marke "Gelbe Seiten" der Telekom gelöscht

Gerade las ich bei Heise, dass das Deutsche Patent- und Markenamt die Marke "Gelbe Seiten" der Telekom gelöscht hat. Hurra, ein kleiner Lichtblick in dem Dschungel der Trivial-Software-Patente und Markenreservierungen für Alltagsnamen. Leider wird dem wohl auch langfristig kein Riegel vorgeschoben, sodass irgendjemand immer erst ein Verfahren anstrengen muss. Das Verfahren hat tatsächlich 2 Jahre gedauert!
Kann nicht mal jemand die Löschung der Farbe Magenta beantragen? Wie kann eine Firma eine der 16 Grundfarben der Computer beantragen!

6. August 2006 um 14:57

Buch von Myron Rush: Brennen ohne Auszubrennen

Brennen ohne Auszubrennen Gerade habe ich das Buch "Brennen ohne Auszubrennen" von Myron Rush beendet. Für mich war es das richtige Buch zum richtigen Zeitpunkt. Seine klare Analyse und die angebotenen Hilfsmittel waren für mich genau richtig.

Es richtet sich an alle Menschen, die gerne und viel arbeiten: an leistungsorientierte/erfolgreiche Menschen. Und an ausgebrannte Menschen, die einmal erfolgreich/leistungsorientiert waren. Da er selber überzeugter Chist ist, ist es besonders gut auf Christen zugeschnitten. Es eignet sich meiner Ansicht nach aber auch für Nicht- oder Nichtmehrchristen, weil er nichts voraussetzt oder niemandem seine Überzeugung aufdrücken will. Man kann die Hinweise und Tipps für Christen auch überspringe (oder lesen, um zu verstehen, wie Christen ticken).

Myron Rush hatten einen sehr ausgeprägten Burn-Out und berichtet sehr ausführlich und offen von seinen Erfahrungen. Nur mit der Hilfe Anderer konnte er sich aus seiner Kriese lösen. Seine Erfahrungen sind sehr hilfreich. Seitdem hilft er gefährdeten Menschen dabei Ausbrennen zu vermeiden oder Ausgebrannten ihr Problem zu erkennen und Hilfe von Außen in Anspruch zu nehmen. Ich würde gerne ein paar Tios weitergeben, aber das würde seinem Buch nicht gerecht. Es ist ziemlich unamerikanisch, weil es keine allgemeingültigen x-Schritte-Pläne aufstellt. Der Autor stellt heraus, wie unterschiedlich der Verlauf bei Jedem ist, nennt aber gängige Gemeinsamkeiten. Er beschreibt auch wie es Menschen gelingen kann aus dem Ausbrennen herauszukommen, wie man Ausbrennen vermeiden kann und auf was sich Angehörige einstellen müssen.

Ich würde das Buch jedem empfehlen, der langfristig erfolgreich und zufrieden sein will… 😉
Als ich den Link zu der Seite beim Verlag rausuchen wollte sah ich, dass es beim Verlag Gerth-Medien schon vergriffen ist. Bei Amazon ist es aber noch erhältlich. Ich würde raten zuzugreifen.

6. August 2006 um 14:47

Glörtalsperre und andere Sehenswürdigkeiten

Ich erwähnte ja schon, dass ich derzeit Urlaub im Sauerland mache… Grund genug ein wenig nach meinen Wurzel zu suchen.

Die Bemerkung über die Heimat hat mich dazu veranlasst mal den Link auf die Glörtalsperre rauszusuchen. Hier hat mir mein Vater das Schwimmen beigebracht. Das war einfach klasse.

Gespeist wird die Glörtalsperre durch den Bach Glör. Etwas südlich der Talsperre, zwischen den Feldern, die die Glör umgeben, liegt das Dörfchen Glörfeld. Hier nahm meine Familie ihren Ursprung… Das klingt wie eine typische Kapitän-Blaubär-Geschichte, ist aber wahr. 😉

4. August 2006 um 16:51

Ignorieren bis das Problem verschwindet

Ich staune immer wieder über das Urvertrauen, dass Menschen ihrer EDV-Anlage entgegen bringen…

Kürzlich passiert: Ein Kunde hat keine Probleme, aber lässt ganz brav mal eine Datenbank-Prüfung durchlaufen. Dabei werden Fehler gefunden und angezeigt. Aber der Kunde ignoriert das zwar, aber mit sowas rechnet unsere Software… 😉
Von diesem Zeitpunkt an weisst unsere Software den Anwender nun ganz tapfer bei jedem Programmstart darauf hin, dass beim letzten Prüflauf Fehler gefunden wurden und dass er dringend etwas unternehmen soll… Z.B. mal eine Reparatur anstoßen oder unseren Service anrufen.
Im konkreten Fall haben die Anwender (sie kommt bei JEDEM: Chef und Mitarbeiter) die Meldung ebenso tapfer weggeklickt und einfach weitergearbeitet.

"Aufgeflogen" ist das Ganze nur, weil unser Datentrafo (im Rahmen eines Programm-Updates) sich weigerte auf einer defekten Datenbank loszulegen. Bei der Reparatur im Haus konnte nur eine Reparatur mit Datenverlusten durchgeführt werden. Einige "ältere" Daten sind einfach weg. Und weil der Defekt schon so lange besteht, kann der Kunde auch nicht einfach auf den letzten sauberen Stand zurücksetzen… Ich befürchte, dass der Kunde nicht nach der Ursache suchte, sondern jetzt wieder zufrieden ist.

Meine Erfahrung ist, dass PCs hier zu menschlich behandelt werden: "Jeder macht mal einen Fehler, Schwamm drüber." Meiner Ansicht nach ist Checkdisk schon recht einfach. Es wird nicht gemacht, weil das Bewusstsein für das Risiko nicht da ist.

Ich will nicht zu sehr mit Steinen werfen, denn ich bin in den meisten Dinge auch nicht besonders konsequent. Wenn allerdings meine berufliche Existenz davon abhängen würde… 😉

4. August 2006 um 16:37

Jetzt weiss ich was Heimat ist

Heimat ist da wo sie meinen Namen sofort vestehen und ich ihn nicht buchstabieren muss…

In meiner Wahlheimat Franken ist es schon ein Ritual, dass ich meinen Namen zweimal buchstabieren muss: einmal normal "G – l – ö – r -f – e – l – d" und dann noch mal gaaanz langsam, weil die Leute bei "ÖR" hängen bleiben – warum eigentlich?
Derzeit bin ich bei meinen Eltern im Sauerland zu Besuch (Die Bergstädter bieten kostenlos einen prima Bildschirmschoner von Lüdenscheid an).
Heute habe ich beim örtlichen Werkzeugladen (netter kleiner Laden, gibst auch nicht mehr viele) eine Handkreissäge bestellt. Auf die Frage nach meinem Namen, wollte ich – der 20-jährigen Gewohnheit folgend – nach der Nennung "Glörfeld" direkt mit dem Buchstabieren anfangen, da sehe ich, dass der gute Mann meinen Namen schon längst geschrieben hat (und richtig geschrieben)! Das war ein interessantes Gefühl.

3. August 2006 um 22:29

bekannte Entwickler antworten

Durch Smi (da muss ich immer an Kpt. Hook denken, sorry) fand ich einen den Link auf den interessanten Artikel im Sztywny Blog "Stiff asks, great programmers answer". Hier beantworten bekannte Entwickler ein paar nette Fragen:

  • How did you learn programming?
  • What do you think is the most important skill every programmer should posses?
  • Do you think mathematics and/or physics are an important skill for a programmer?
  • What do you think will be the next big thing in computer programming?
  • What do you think makes some programmers 10 or 100 times more productive than others?
  • What are your favourite tools?

Die Antworten zu den einzelnen Fragen würde ich am liebsten tagelang kommentieren. Ich will mich aber auf einen Aspekt beschränken, den Linus Torwald in der Antwort auf Frage 4 aufgebracht hat:

For example, I personally believe that „Visual Basic” did more for programming than „Object-Oriented Languages” did. Yet people laugh at VB and say it’s a bad language, and they’ve been talking about OO languages for decades.

And no, Visual Basic wasn’t a great language, but I think the easy DB interfaces in VB were fundmantally more important than object orientation is, for example.

Das ist es auch, was wir in der Firma immer wieder erleben. Es gibt zwei Arten ein erfolgreiches Produkt auf den Markt zu bringen: Entweder man erfüllt zeitnah die Wünsche der Kunden oder man trifft den Nerv der Zeit und schafft es im Idealfall mit einem völlig neuen Ding Maßstäbe zu setzen.

Im ersteren Fall hängt es davon ab, wie gut das Team eingespielt ist, wie einfach die Dinge umzusetzen sind und wie gut es der Projektleiter versteht die vielen tollen/dringenden/wichtigen Ideen, die im letzten Drittel des Projektes von allen Seiten noch mit umgesetzt werden sollen, zu machbare Ideen zu destilieren oder auf die zweite Stufe zu verschieben. Um schnell zu sein, war ein VB-Team bis .Net noch immer im Vorteil.
Im zweiten Fall ist eine tolle Anwendungsarchitektur schon von Vorteil… Alerdings erlebe ich es immer wieder, dass in die ganz tolen Architekturen so viele Anforderungen reindefiniert werden, dass sie zu ahren Molochen werden und dann viel zu lange bis zur Markteinführung brauchen. Aber vielleicht ist das ja bei anderen Firmen anders? 😉

3. August 2006 um 21:37

SqlCmd – Batchautomatisierung mit Variablen

Erst vor ein paar Tagen entdeckte ich, dass mir Microsoft einen ganz lange gehegten Wunsch erfüllt hat. Man kann mit SqlCmd Batches mit Variablen ausführen. Hier ein ganz primitives Beispiel:

use $(db);
select * from $(tab) where $(col)=$(val);

Bei der Ausführung mit SqlCmd kann man nun die konkrete Variablenwerte angeben:

sqlcmd.exe -S (local)\MYYUKON -E -i c:\mssqlclass2005\sql-batch_01.sql -v db=northwind tab=dbo.orders col=OrderID val=10250

Weil das bisher nicht ging, haben wir für unsere Anwendungen 1993 ein eigenes Batch-Program geschrieben, dass wir immer wieder auf die verschiedenen Versionen migriert haben. Als wir dann auf den SQL Server 2000 umgestiegen sind, wurde es völlig runderneuert. Mal schauen, ob wir es noch nach der geplanten Migration auf SQL Server 2005 brauchen…

Unser wichtigster Anwendungsfall: In Views und/oder Procedures unserer Anwendungen sind datenbankübergreifende Abfragen enthalten. Da aber erst bei der Installation (beim Kunden, wir schreiben Standardsoftware, also Massenware) der Name der Datenbanken festgelegt wird, können die Skripte erst um Schluss eingespielt werden. Da müssen die Skripte anstelle der Datenbanknamen variable Werte enthalten.

2. August 2006 um 22:00

SAP investiert weiter in Indien

Bei Heise steht es genauer: SAP investiert eine Milliarde Dollar in Indien. Wenn ich es richtig verstehe, dann wollen sie den indischne Markt weiter erschließen. Unter diesem Aspekt ist es meiner Ansicht nach sinnvoll in Indien zu investieren. Inder können die indische Spezialitäten viel besser in die Produkte einfließen lassen. Immerhin haben sie schon jetzt tausend Kunden, da ist sicher noch mehr drin.

Dank der komplizierten deutschen Gesetze ist es für ausländische Produktionen ernorm schwer hier Fuß zu fassen. Wenn man dann noch bedenkt, dass in den letzten Jahren regelmäßig im November noch darüber beraten wurden, wie die Gesetze lauten, die im Januar in Kraft treten, sehe ich in diesem Bereich keinen Anreiz die Produktion ins Ausland zu verlagern.

Im Bereich der Produktions-, Planungs- und Steuerungssoftware sieht es vermultich etwas anders aus. Als ich früher mal Kundenanpassungen für Baan-Systeme schrieb, hatte ich allerdings stark den Eindruck, dass sich Standard-Software in diesem Bereich generell schwer tut…
Welche Firma möchte schon von den eigenen, auf die individuellen Bedürfnisse abgestimmten Abläufen auf standardisierte Workflows umsteigen, die auch die Konkurrenz verwendet?

2. August 2006 um 20:55

Globale Sitzungsvariable am SQL Server

Am Sybase SQL Anywhere, der zwischendrin mal auf den schönen Namen "Sybase Adaptive Server Anywhere" hörte, gibt es ein Feature, was ich am "Microsoft SQL Server" besonders vermisse: globale Variable, die während einer gesamten Session erreichbar sind.
Sie haben einen ähnlichen Gültigkeitsbereich, wie "normale" temporäre Tabellen beim SQL Server. Man deklariert sie einmal, kann der Wert dann beliebig setzen und in allen Batches in dieser Session darauf zugreifen.

Eigenartigerweise bietet der SQl Srever ein Featrue an, das etwas in diese Richtig geht:
mit CONTEXT_INFO kann man genau einen 128 Bytes langen Wert speichern.

Beispiel

Angenommen eine Anwendung muss in Ausnahmenfällen mal eine Verbindung zu einer Datenbank aufbauen, um eine Tabelle zu erweitern oder ein Backup durchzuführen. Normale Benutzer haben dazu nicht die entsprechenden Rechte. Die Anwendung meldet sich mit dem Datenbank-Besitzer "MyDBO" an, um bspw. ein neues benutzerdefiniertes Feld anzulegen. Selbstverständlich werden alle ändernden Operationen in einer Tabelle protokolliert, dazu kann der Benutzername mittels "user_name()" ermittelt werden, z.B. "Thomas".
Die Dinge aus der Admin-Verbindung sollen auch protokolliert werden. Hier soll jetzt aber nicht der Name "MyDBO" notiert werden, sondern der Verursacher: "Thomas".

Zu diesem Zweck kann man gleich nach dem Aufbauen der Vrebindung den Namen des Benutzers in die CONTEXT_INFO schreiben, falls es sich um so eine Sonderverbindung handelt:

declare @context_info varbinary(128);
set @context_info = cast('thomas' as varbinary(128))
set context_info @context_info

Um den Wert abzufragen, muss man beim SQL Server 2000 tief in die Trickkiste greifen und eine Systemtabelle abfragen:

select cast(context_info as varchar(128))
from sysprocesses
where spid=@@spid

Wenn man nun wissen will, wer die zu protokollierende Aktion veranlasst hat, kannman das so erfragen:

declare @user_info varchar(128);
set @user_info = (select cast(context_info as varchar(128)) from sysprocesses where spid=@@spid)
select case
when @user_info = ''
then user_name()
else @user_info
end as "User_name"

Am SQL Server 2005 hat sich daran nicht viel verändert. Immerhin muss man jetzt nicht mehr die Systemtabelle abfragen:

SELECT cast(CONTEXT_INFO() as varchar(128))

Im konkreten Beispiel würde sich das vereinfachend auswirken:

select case
when cast(CONTEXT_INFO() as varchar(128)) = ''
then user_name()
else cast(CONTEXT_INFO() as varchar(128))
end as "User_name"

Das ist für den Obige Fall schon eine akzeptable Lösung. Leider gibt es damit nur eine einzige "globale" Variable. Wenn man mehr benötigt, dann muss man sich das in temporären Tabellen speichern. Schade, der Overhead wäre zu vermeiden…