Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

30. Januar 2007 um 22:35

PowerShell-Spickzettel

Es gibt jetzt einen netten Powershell-Spickzettel auf dem PowerShell-Team-Blog. Natürlich ist das keine vollständige Referenz. Statt dessen enthält er die wichtigsten Handgriffe, um sich zurecht zu finden. Echt prima.

Zuerst gab es in den Kommentaren etwas Aufregung, weil er nur im WinWord2007-Format bereitgestellt wurde, aber nach kurzer Zeit wimmelte es in den Kommentaren nur so von anderen Versionen, z.B. für alte Winwords oder als PDF

30. Januar 2007 um 22:32

SQL: Strings zerhacken

Gestern kam mein Kollege Alexander mit einer ganz spannenden SQL-Fragestellung zu mir. weil die Anwendung auch noch den SQL-Server-2000 unterstützt, mussten wir etwas in die Trickkiste greifen. Ich habe die Fragestellung jetzt daheim noch mal unter dem SQL-Server-2005 nachvollzogen und konnte dabei ein paar der schicken, neuen Features nutzen…

Die Frage ist, wie man Strings, die über eine Legacy-Schnittstelle kommen und so in die Datenbank geschrieben wurden, aufteilen kann. Beispielsweise soll die Zeichenfolge "1234#12#bla#blub#132" mit SQL anhand des Trenners "#" in die Einzelbestandteile aufgeteilt und dann weiterverarbeitet werden.

So könnte die Tabelle aussehen:

LfdNr Zeichenkette
1 13242#22#blabla#233242#blubblub#12321#1312#1131##13123
2 13332#12#blibla#233242#blubblub#12321#1312#1131##13123
3 13353#21#blabli#233242#blubblub#12321#1312#1131##13123
4 13242#12#blibli#233242#blubblub#12321#1312#1131##13123

Eine Lösung, die mir persönlich besonders gut gefällt, hat sich der große Itzik Ben Gan ausgedacht: Dabei wird eine Hilfstabelle benötigt, die nur eine Spalte hat, und für jede Zahl einen Datensatz enthält.

n
1
2
3
4

Dann kann man mit einem Cross-Join zwischen den Tabellen in der Where-Klausel diejenigen Sätze rausfischen, die an der n-ten Position ein "#" haben:

...
from LegacyInput
cross join hilfstabelle
where substring('#'+Zeichenkette+'#', n, 1)='#'
and n <= len(Zeichenkette)+2

Damit das erste Teilstück bei 1 anfängt, wird noch ein "#" vor den Anfang angefügt. Außerdem müssen nur die Datensätze untersucht werden, die kleiner/gleich der Länge der Zeichenkette sind. Das ist eigentlich doppelt gemoppelt und kann daher auch entfallen.

Im SELECT werden dann die Einzelbestandteile rausgelöst: von n bis zum nächsten "#", wobei "n" eine Position ist, an der der ein "#" gefunden wurde.

substring('#'+Zeichenkette, n+1, charindex('#',Zeichenkette+'#',n)-n)

Das gesamte Statement sieht dann so aus:

select lfdNr,
n-len(replace(substring('#'+Zeichenkette, 1, n), '#', '')) as "TeilNr",
substring('#'+Zeichenkette, n+1, charindex('#',Zeichenkette+'#',n)-n) as "Teilstück",
Zeichenkette
from LegacyInput
cross join hilfstabelle
where substring('#'+Zeichenkette, n, 1)='#'
and n <= len(Zeichenkette)+1

Und so das Ergebnis:

LfdNr TeilNr Teilstück
1 1 13242
1 2 12
1 3 blabli
1 4 233242

Das ist aus Datenbanksicht, aber nicht optimal. Wünschenswert wäre ein pivotiertes Ergebnis:

LfdNr attr1 attr2 attr3 attr4 attr5 attr6 attr7 attr8 attr9 attr10
1 13242 22 blabla 233242 blubblub 12321 1312 1131 13123
2 13332 12 blibla 233242 blubblub 12321 1312 1131 13123
3 13353 21 blabli 233242 blubblub 12321 1312 1131 13123
4 13242 12 blibli 233242 blubblub 12321 1312 1131 13123

Das kann man dann ganz einfach mit dem PIVOT-Konstrukt erreichen:

SELECT *
FROM (select
LfdNr,
'attr'+convert(varchar,n-len(replace(substring('#'+Zeichenkette, 1, n), '#', ''))) as "Attribute",
substring('#'+Zeichenkette, n+1, charindex('#',Zeichenkette+'#',n)-n) as "Teilstück"
from LegacyInput
cross join hilfstabelle
where substring('#'+Zeichenkette, n, 1)='#'
and n <= len(Zeichenkette)+1 ) AS ATR PIVOT ( MAX("Teilstück") FOR attribute IN([attr1], [attr2], [attr3], [attr4], [attr5], [attr6], [attr7], [attr8], [attr9], [attr10]) ) AS PVT

Das komplette Beispiel steht auch zum Download bereit.

26. Januar 2007 um 23:24

hübsches Banner der Olympia-Petition

Olympia gehört allen!
Für die Petition für Olympia gibt es jetzt sogar ein eigenes Logo, dass ich persönlich ganz gut finde. So wie es aussieht scheint der Urheber des Kunstwerkes auch schon lange genug tot zu sein, damit sein Werk nicht mehr geschützt ist.
😉

Ein Unterstützen beim Petitionsausschuss des Deutschen Bundestages ist übrigens immer noch möglich.

gefunden bei Word2Go
26. Januar 2007 um 23:06

Corporate Identity

Bei uns wird gerade alles auf die totale "Corporate Identity" umgeschaltet. Das galt bisher eigentlich auch schon, aber nur für die Dinge, die irgendeine Außenwirkungen haben. Seit kurzem müssen wir auch in internen Mails alle die gleiche Schriftart verwenden. Eigentlich fand ich Arial ganz nett. Aber OK, die neue ist auch schön. Außerdem würde ich sogar eine Firmenkrawatte tragen, wenn ich auf der letzten Messe noch eine bekommen hätte.

Und das wir jetzt bei externen Mails eine einheitliche Signatur verwenden, finde ich völlig normal. Nachdem was ich bei Heise.de gelesen habe, hatte ich erwartet, dass der ganze Sermon drauf muss, der auch auf den Briefbögen ist, aber weit gefehlt. Es sind nicht mehr Infos drauf als vorher, aber jetzt sehen sie einheitlich aus…
😉

Bei der nächsten Maßnahme musste ich dann doch etwas schlucken: auch alle Signaturen in internen Mails, die wir per Definition nicht nach "Außen" weiter reichen dürfen, müssen genau der einheitlichen Vorgabe entsprechen. Es gibt sogar ein Tool, dass jedem anhand der in Outlook hinterlegten Daten eine Standard-Signatur erstellt (daran sieht man, was bei uns wirklich wichtig ist). Aber auch das habe ich fraglos gemacht. Ich war übrigens bei der Bundeswehr: ich weiß seitdem, dass man auch bei Uniformen noch individuelle Akzente setzen kann, z.B. waren Anstecknadeln unter dem Kragen erlaubt.
Deswegen bin ich sicher, dass die neue Vorgabe die Kreativität des Einzelnen viel stärker herausfordert, um sich doch noch von anderen abzusetzen, obwohl man sich – weitgehend – an die Vorgaben hält. Heute habe ich sogar schon mit einem Kollegen darüber "gefachsimpelt", welche Tuningmaßnahmen völlig erlaubt und welche vermutlich noch so gerade geduldet sind.
🙂

Heute morgen kam dann der nächste Schuss, der meinen kleinen Kutter beinahe mittschiffs erwischt hätte: Die Schulungsunterlagen zum SQL-Server, die ich tagelang unter Hochdruck aktualisierte und vorgestern fristgerecht abgab, damit sie gestern zum Druck konnten, wurden heute von der Hausdruckerei abgelehnt
Obwohl es sich um einen rein internen Kurs handelt (von Entwickler für Entwickler), gelten dafür jetzt auch die Regeln für die externen Kurse zur Weiterbildung unserer Kunden. Meine Schulungsunterlagen, die in der gleichen Optik schon seit 1998 immer wieder gedruckt werden, mussten mal eben angepasst werden. Aber sie mussten glücklicherweise auch heute noch zum Druck. Somit rauschte der Schuss voll durch die Segel, aber richtete vorerst keinen wirklichen Schaden an.
Es reichte, dass ich unser buntes, schickes Firmenlogo gegen ein s/w-Model austauschte, dass ich immer für unser Vorkriegsmodell gehalten habe. Das muss man nämlich immer für S/W-Druckgüter verwenden. Nach einigen Wirrungen bekam ich von dem Chef unserer Corporate-Identity-Truppe sogar höchstpersönlich ein TIF von dem Logo, dass offenbar nur für Profischreiber gedacht ist, die FrameMaker, Adobe oder eine andere High-End-Lösung verwenden, und daher im Intranet nur im Profiformat zu haben ist. Normalsterbliche wie ich, verwenden natürlich ein normales Office-Paket dazu.

Jetzt kommt die spannende Frage: Was soll ich machen, wenn ich bei der nächsten Aktualisierung Pech habe und das komplette Layout an die Kundenschriften anpassen soll? Soll ich wirklich das Layout der 180 Seiten mal eben umstellen? Winword ist ja bekannt dafür wie einfach das geht…
😮

24. Januar 2007 um 22:49

List – der Kommandozeilen-Editor

Im "Windows Server 2003 Resource Kit" gibts es neben den schicken Tools DVDBurn und CDBurn von neulich auch ein paar, die mittlerweile schon sehr antiquiert wirken, aber eine treue Fan-Gemeinde haben…

Aus Nostalgie habe ich heute mal den Kommandozeilen-Editor List.exe von Microsoft ausprobiert. Damit kann man immer noch schicke Dinge tun, aber die Bedienung würde man heute nicht mehr so machen…
Mit folgenden Aufruf werden beispielsweise alle Dateien, die der Angabe entsprechen nach dem String durchsucht:

list -s:HKEY_CURRENT_USER *.txt

Dann öffnet sich in der DOS-Box ein Editor. Den ersten Funde in der ersten Datei sieht man gleich hervorgehoben. Wenn kein Fund drin ist, dann sieht man nur die Datei.

  • Mit den vier Pfeiltasten kann man den Bildschirmausschnitt verschieben, mit "w" kann man "word wrap" (den Zeilenumbruch) ein und ausschalten.
  • Mit "F4" schaltet man erst mal den Multi-File-Modus ein. Dann kann man mit einem Druck auf "n" (klein N) zur nächsten Fundstelle springen, in der dateiübergreifenden Suche wird automatisch in die nächste Datei gesprungen. Mit "N" (Shift + N) wird zurück zum vorherigen Treffer gesprungen.
  • Mit "h" schaltet man in den Hex-Modus um. Schick…
  • Mit Esc wird das Programm verlassen.
  • Mit "?" öffnet sich die Befehlsübersicht, die man ebenfalls mit "Esc" wieder verlassen kann.

Immerhin ist die Bedienung schon etwas komfortabler als mein damals heißgeliebter "vi".
Have fun…

24. Januar 2007 um 22:12

Kommunikation in Projekten

In der Ausgabe 7-8/2006 der Zeitschrift "IT-Mittelstand" habe ich kürzlich den Artikel "Projektmanagent ist eine Kunst" gelesen.
Darin wird eine Untersuchung des OFFIS eV von IT-Projekten hierzulande beschrieben. Offenbar sind die IT-Projekte bei uns erfolgreicher als die gängigen Untersuchungen aus den USA vermuten lassen. Weltweit werden nur 29% aller IT-Projekte erfolgreich abgeschlossen, hierzulande erreichten 50% alle Projektziele, lediglich 3% wurden komplett abgebrochen. Mit 70% Erfolgsquote sind Projekte mit einer kurzen Laufzeit von 3 bis 6 Monaten besonders häufig erfolgreich.

typische Stolpersteine in IT-Projekten:
A.) mangelhafte Abgrenzung der Zuständigkeiten
B.) Kompetenzgerangel
C.) fehlende Zeit oder fehlende Fachkompetenz
D.) Akzeptanzprobleme
E.) fehlende Motivation der Anwender
F.) fehlende oder veraltete Geschäftsprozessdokumentation
G.) nicht vorhandene oder halbherzige Unterstützung durch die Geschäftsleitung

Als besonders wichtig stellte sich die Kommunikation heraus."Projekte, in denen zwischen zehn bis 24 Prozent des tatsächlichen Gesamtaufwandes für Kunden Kommunikation aufgewendet wurden, lagen mit einer Erfolgsquote von 66,7 Prozent über dem Durchschnitt. Wurden weniger als fünf Prozent aufgewendet bewegte sich die Erfolgsquote unter 30%."

Das deckt sich durchaus mit meinen Erfahrungen: Wenn innerhalb der Projekt bzw. mit den Schnittstellen des Projektes, sprich den Betroffenen, nicht intensiv "kommuniziert" wird, dann gibt es starke Reibungsverluste. Allerdings habe ich auch schon ein Projekt erlebt, dass sich buchstäblich zu Tode kommuniziert hat… Ein gesundes Mittelmaß ist also Trumpf. Aber ich glaube, dass Projekte mit zu vielen Besprechungen und Diskussionen eher die Ausnahme sind.

23. Januar 2007 um 23:25

SQL-Server: Infos ins Eventlog schreiben

Gestern fragte mich ein Kollege, wie man bestimmte Informationen in das Ereignisprotokoll des Windows-Server auf dem der SQL-Server läuft protokollieren kann. Dazu gibt es zwei Möglichkeiten, die beide sowohl mit Version 2000 und Version 2005 funktionieren.

Fehler werfen

Man kann einen Fehler "with log" werfen. Der Fehler wird an den Client geschickt und in der Ereignisanzeige protokolliert. Je nach Severity wird ein Fehler, Warnung oder Information geworfen. Das dürfen übrigens nur SysAdmins.

raiserror ('Dieser Text soll im Eventlog stehen (als Information)', 1,1) with log
raiserror ('Dieser Text soll im Eventlog stehen (als Warning)', 15,1) with log
raiserror ('Dieser Text soll im Eventlog stehen (als Fehler)', 16,1) with log

Meldung nur in Ereignisanzeige schreiben

Man kann die Meldung mit xp_logevent aber auch einfach nur wegloggen, ohne einen Fehler an den Client zu schicken. Das dürfen auch nur SysAdmins.

EXEC master.dbo.xp_logevent 60000, 'Dieser Text soll im Eventlog stehen (als Info)', informational
EXEC master.dbo.xp_logevent 60000, 'Dieser Text soll im Eventlog stehen (als Warning)', warning
EXEC master.dbo.xp_logevent 60000, 'Dieser Text soll im Eventlog stehen (als Fehler)', error

Zur Kontrolle muss man jetzt ins Eventlog schauen. Die XP xp_eventlog zum Lesen aus der Ereignisanzeige gibt es ja leider nicht mehr… schnüff

22. Januar 2007 um 23:07

Arbeitnehmerträume

Entweder da werden Arbeitnehmerträume wahr oder es ist ein verfrühter Aprilscherz…

Unbelievable! Da fällt mir nichts mehr dazu ein!

gefunden bei Prometeo
22. Januar 2007 um 22:49

schmutzige Tricks

Laut Heise.de macht Sophos darauf aufmerksam, dass die USA mit 34% der schädlichen Webseite die Spitze des "dreckigen Dutzend" bildet. Es werden aber leider eine Vergleichswerte angegeben. Bei sowas kribbelt es mir immer im Nacken: Könnte es etwa sein, das weltweit auch etwa 30% aller Webseiten in den USA gehostet werden? Wenn ja, dann frage ich mich, wer hier mit Steinen wirft… Was wäre dann an der Zahl besonders? Geht das dann in die Richtung: "In Deutschland sprechen die meisten Kriminellen deutsch"?

Herzlichen Glückwunsch! Für derart scharfsinnige Äußerungen sollte man mit Linsensuppe, nicht unter drei Portionen, bestraft werden.

Leider habe ich keine Statistik gefunden, die nach Ländern aufschlüsselt, wo wie viele Domains gehostet werden. Bei Wikipedia steht immerhin, dass COM-Domains die überwältigende Mehrheit bilden (etwa 60%?). Platz drei und fünf bilden NET und ORG.

22. Januar 2007 um 22:35

ISO-Images mit MS-Werkzeugen

Heute erinnerten mich mein Chef und mein ChefChef daran, dass es im neben den von mir neulich beschriebenen Werkzeugen ISO Recorder und Deamon Tools auch welche von Microsoft gibt:

ISO-Images brennen

Wenn man den Bedarf hat, dann kann man mit dem Kommandozeilen-Werkzeug DVDBURN.EXE aus dem "Windows Server 2003 Resource Kit" ISO-Images brennen. Ohne jede weitere Brennsoftware zu benötigen.

Die Bedienung ist denkbar einfach:
dvdburn <drive> <image> [/Erase]
Die Option "/Erase" löscht RW-Medien vor dem schreiben.
Den Brenner gibt man anstelle von "<drive>" an, das zu brennende ISO-Image als kompletten Pfad statt "<image>".

Beispiel:

dvdburn g: c:\temp\sample.iso /Erase

Angeblich kann man auch nur die DVD-RW löschen ohne zu brennen. Mächtig nützlich sein das, wenn Command-Line-Jedi Du werden willst.
Muss ich bei Gelegenheit mal ausprobieren…

ISO-Images als virtuelles Laufwerk

Ebenfalls in den "Frequently Asked Questions" von Microsoft im Abschnitt "What are ISO image files and how do I use them?" wird der Download-Link für das "Virtual CD-ROM Control Panel for Windows XP" angegeben und vor dem Nicht-Support gewarnt:

Mounting ISO files virtually
The following tool for Windows XP allows image files to be mounted virtually as CD-ROM/DVD-ROM devices. This tool is provided here for your convenience and is unsupported by Microsoft Product Support Services.

* Virtual CD-ROM Control Panel for Windows XP

Ich habe das Programm ehrlich gesagt nicht ausprobiert, aber vermute, dass es eine gute Alternative ist, wenn man Windows-XP einsetzt.

Danke für den Link, Günther!

Update: Neben DVDBurn.exe gibt's im Resource-Kit natürlich auch noch CDBurn.exe. Die Bedienung ist identisch…

22. Januar 2007 um 21:58

SQL-Server: einzelne Seiten aus Sicherung holen

Im Artikel "Fixing damaged pages using page restore or manual inserts" beschreibt Paul Randal ganz trickreich, wie man den Inhalt einzelner Seiten aus der Sicherung holt. Das ist in der Praxis durchaus relevant, wenn nur wenige Datenbank-Seiten korrupt wurden. Das war mit den bisherigen SQL-Server-Versionen nicht möglich, bzw. es war viel Handarbeit gefragt.

Am SQL-Server-2005 geht es etwa so:

RESTORE DATABASE dbccpagetest PAGE = '1:158' FROM DISK = 'C:\dbccpagetest.bak';

Dazu fragt Paul:

Isn't that cool? You can restore up to 1000 single pages from a backup at a time.

Und meine Antwort lautet: JAAAAAAA!!!

Es gibt auch eine Schattenseite: es geht nicht immer. Es geht nur, wenn entweder die Seite seit dem Backup nicht "verschoben" wurde, die Daten nicht geändert wurden oder die Datenbank im Recovery-Modus "Full" bzw. "Bulk" war:

You can use single-page restore if you're on SQL Server 2005 and the database is in Full or Bulk-Logged recovery mode, otherwise you need to use the manual method, and that will only work as long as you know the data being salvaged hasn't changed since the last backup.

Ok, die manuelle Methode ist auch nicht von schlechten Eltern. Darauf bin ich leider nicht selber gekommen, obwohl sie auf der Hand liegt. Das liegt aber vermutlich daran, dass bis zu mir meist nur die Fälle vordringen, die keine funktionstüchtige Datensicherung haben.

Hier steht es komplett, vom großen Paul Randal Himself.

22. Januar 2007 um 21:44

SQL-Server: eigene System-Prozeduren

Im Artikel "Running a master db residing stored procedure in current database context" beschreibt Mladen Prajdicand, wie man aus einer normalen Prozedur in der Master-Datenbank eine System-Prozedur machen kann. Das hat den Vorteil, dass sie aus jedem Datenbank-Kontext aus aufgerufen werden kann. Sie liest dabei immer die Informationen aus den Verwaltungstabellen der jeweiligen Datenbank. Er beschreibt dazu zwei Voraussetzungen, die am SQL Server 2005 notwendig sind:

  • Die Prozedur beginnt mit "sp_" und
  • sie wurde als Systemprozedur gekennzeichnet.

Letzteres geht am SQL-Server-2005 mit "EXEC sp_MS_marksystemobject ", ist aber nicht immer unbedingt notwendig, dazu später mehr. Ich gebe zunächst mal ein Beispiel, damit klar wird, was gemeint ist:

Wenn man zwei Tabellen gleichnamige anlegt, eine in der einen Datenbank, die andere in einer anderen, z.B. eine in der Master und die andere in der Nordwind, dann kann man beide Tabellen mit der gleichen Prozedur abfragen.

-- Tabelle YouAreIn in Master anlegen und mit "Master" füllen
create table master.dbo.YouAreIn (dbname sysname not null);
insert into master.dbo.YouAreIn (dbname) values ('Master');

– Tabelle YouAreIn in Nordwind anlegen und mit "Northwind" füllen
create table Northwind.dbo.YouAreIn (dbname sysname not null);
insert into Northwind.dbo.YouAreIn (dbname) values ('Northwind');
go
use master
go
create procedure dbo.sp_where_am_i
as
select dbname
from YouAreIn – hier keine Datenbank angeben
go
– Als Systemprozedur markieren
EXEC sp_MS_marksystemobject 'sp_where_am_i'

Jetzt kann man in unterschiedlichen Datenbank-Kontexten die Prozedure aufrufen und es wird automatisch die "richtige" Tabelle gelesen:

use master
exec sp_where_am_i

Das liefert als Ergebnis "Master". Während das untige Statement "Northwind" meldet:

use Northwind
exec sp_where_am_i

Spaßigerweise haben die Systemprozeduren noch einen Insider-Hack: Wenn man den Datenbanknamen vor die Systemprozedur stellt, dann wird sie in dem Kontext ausgeführt:

use master
exec Northwind..sp_where_am_i

Das liefert "Northwind"!

Keine Regel ohne Ausnahme…

Um abwärtskompatibel zu sein, gibt es auch hier eine Ausnahme… Auch ohne das Markieren als systemprozedur wird die Prozedur im Kontext der Datenbank ausgeführt. Die Bindung zu den Tabellen bleibt aber zu den Tabellen in der Master bestehen.

Beispielsweise liefert die folgende Prozedur (in der Master angelegt, nicht als Systemprozedur gekennzeichnet) immer den "richtigen" Datenbank-Kontext und immer den Inhalt der Tabelle aus der Master.

create procedure sp_where_am_i_zwei
as
select db_name() as [DB-Kontext],
dbname as [Tabelle-Aus]
from YouAreIn

Aber es gibt noch eine weitere Ausnahme: Wenn man lediglich vor hat aus den "alten" Systemtabelle, wie sysobjects, zu lesen, dann verhält sich die Prozedur, wie ganz oben beschrieben. Wenn man aber aus den "Neuen" liest, wie bspw. "sys.objects", dann muss sie "markiert" werden, um das Ziel zu erreichen….