Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

20. Mai 2008 um 20:06

Kundenbewegungen aufzeichnen

Damals als man sich noch kannte, da wusste der Krämer ganz genau welcher Kunde welche Vorlieben hatte. Er konnte ganz gezielt den Kunden neue Waren anbieten und welche neuen Produkte sein Sortiment gut erweitern würden. Das ist heute anders. In den Zeiten der Supermärkte, weiß man nur was die Kunden kaufen. Aber nicht was sie besonders lange angesehen haben und was sie gerne gekauft hätten, aber nicht auf Lager war.

Im Artikel "Handys machen Kunden sichtbar" auf Heise-Online wird beschrieben, wie eine Supermarktkette versucht an diese Daten ranzukommen: Man zeichnet die Handy-Daten der Kunden auf.

Dabei werten die Betreiber offenbar grundlegende Informationen wie die IMSI-Kennung und damit etwa auch die Provider-Anbindungen der Telefonbesitzer aus, um zu erkennen, welche Peilungen sich auf dasselbe Gerät beziehen. Erklärter Zweck der Übung ist die Ermittlung von Bewegungsprofilen, einerseits um festzustellen, wie oft ein Kunde im Laufe von Wochen und Monaten in bestimmten Läden auftaucht, andererseits anscheinend auch, um seine Bewegungen innerhalb eines Ladens auf wenige Meter genau nachzuvollziehen.

Offenbar hat niemand etwas dagegen, dass er auf diese Weise durchgeleuchtet wird. Warum auch – man hat ja nichts zu verbergen. Eigentlich muss der Supermarkt nur noch durch einen Trick die Handynummern einen Namen zuordnen und dann können die Bewegungsprofile mit den tatsächlich gekauften Waren (die Daten werden an der Kasse erfasst – mit Karte bezahlen ist ja die Regel) abgeglichen werden.

Ich bin mal gespannt wie lange es dauert bis hier die erste Datenpanne auftritt und die Daten geklaut werden. Oder von der Polizei angefordert werden, um uns vor Terroristen zu schützen. 😉

19. Mai 2008 um 19:20

Countdown leicht gemacht

Beim Bund hatten wir so Meterbänder, die wir täglich abreißen konnten, um "das Ende" ™ vor Augen haben zu können. Sowas geht heute viel eleganter mit einem Online-Countdown. Auf countdown2zero.com kann man ganz schnell einen eigenen Countdown anlegen.

Hier ein Beispiel.

Mit Java-Script kann man das auch in die eigene Homepage einbinden:

Eigentlich sollte es auch einfach nur als Bild einzubinden sein, aber das klappt bei mir nicht:

Was ich schade finde: Offenbar kann man die eingegebenen Daten nicht ändern…

17. Mai 2008 um 14:34

HP: XP SP3 nicht auf AMD-Rechner installieren

Meine natürliche Vorsicht hat mir offenbar eine Menge Ärger erspart. Wie ich bei TecChannel.de lese, ruft HP dazu auf, das SP3 für Windows-XP nicht auf AMD-Rechnern zu installieren. Ich habe einen AMD-Rechner mit Windows-XP von HP! Das beschriebene Problem hätte mich ganz sicher getroffen. Neulich schrieb ich noch: "Ich werde wohl noch ein paar Tage abwarten und es dann daheim erst installieren, wenn sich die gemeldeten Probleme in Grenzen halten."

Ich werde jetzt wohl noch etwas länger warten müssen bis der Fix dafür erhältlich ist und dann vor dem Update mal wieder eine Komplettsicherung durchführen. Das hatte ich zwar sowieso schon erwägt, aber jetzt mache ich es sicher… 😉

Update: Offenbar gibt es inzwischen ein Update von HP – warum von HP? Man kann es hier beziehen… Es muss vor dem SP3-Update installiert werden.

17. Mai 2008 um 14:26

schlampige Software

Es passiert ja selten, dass in den regulären Nachrichten mal von Software die Rede ist. Wenn dann aber so ein Urteil gefällt wird, dann dürfte das für den verantwortlichen Projektleiter der Mega-Gau sein (Hervorhebung von mir):

eBay soll sicherer werden, versprach das Unternehmen im April und führte ein neues Sicherheitssystem ein. Ein Programmierfehler bewirkt nun das Gegenteil: Internetbetrüger haben wegen schlampig produzierter Software bei eBay leichtes Spiel.

Quelle: heute.de. Programmierfehler lockt eBay-Betrüger

So ein Fehler ist leicht durch ein Review auszuschließen. Mir ist völlig schleierhaft, wie dort Software entworfen wird. Kann es sein, dass hier am Budget gespart wurde? Oder wurde die Verantwortung in die Hände eines einsamen Entwicklers gelegt, der in völliger Selbstüberschätzung keine zweite Meinung einholen wollte. OK, mir passieren auch Fehler. Aber wenn man sich die strategische Bedeutung der Software für das Unternehmen ansieht, dann wirft das ein ganz schlechtes Licht auf die Firma.

16. Mai 2008 um 16:31

seltsame Einträge in Internetverzeichnissen

Mittels Google-Alerts lasse ich mich immer benachrichtigen, wenn es relevante Änderungen gibt in denen mein Name vorkommt. So brachte mich Google jetzt auf die Spur eines ziemlich dubiosen Internetverzeichnisses. Dort werde ich als "Garten- und Landschaftsarchitekt" geführt. Meine Adresse stimmt, aber ich habe keine Ahnung, wie sie dazu kommen mich dort aufzuführen. Offenbar fanden sie meine Adresse im Impressum von zwei Webseiten (schlampige Recherche, sonst hätten sie mehr gefunden). Warum sie mich dann allerdings nach Schweinfurth packen? Oder denkt der zuständige Mitarbeiter Erlangen wäre ein Stadtteil von Schweinfurth? 😉

Interessanterweise heißt die Seite sogar so: "Thomas Glörfeld – Garten- und Landschaftsarchitekten in und um Schweinfurt"

Ich bin ja kein Jurist, gehe aber davon aus, dass mein Name und meine Daten hier missbräuchlich verwendet werden. Immerhin hätten die mich ja wohl fragen müssen, oder? Sie selber schreiben in ihren Datenschutzbestimmungen:

Ihre Privatsphäre ist uns wichtig! Wir werden Ihre persönlichen Daten daher ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergeben.

Zum Schutz Ihrer bei uns vorgehaltenen personenbezogenen Daten vor unberechtigtem Zugriff und Missbrauch haben wir umfangreiche technische und betriebliche Sicherheitsvorkehrungen getroffen. Unsere Sicherheitsverfahren werden regelmäßig überprüft und dem technologischen Fortschritt angepasst.

Als Verantwortlich wird die t-info GmbH in München angegeben. Die Mail-Adresse des Datenschutzbeauftragten gehört zur Domäne "suchen.de". Seltsam.
Aber egal, ich frage mal nach, woher die meine Daten haben. Ich bin gespannt wie sie mit dieser Art von Nachfrage umgehen…

16. Mai 2008 um 11:44

Erstaunliche Druck-Zweitverwertung

Ob das etwas dran ist? Mit Verdünnungsmittel soll man den Toner von Papier auf beliebige andere Stoffe übertragen können:


Print on Anything!Click here for more free videos

Falls das jemand ausprobirt, wäre ich über Feedback dankbar.

16. Mai 2008 um 11:41

SQL Server Is Not Aware of Nondeterministic Functions

Normally I write in German, but I hope that maybe some Microsoft Engineer might read it and put the problem on their schedule. So, I apologise to my German readers for writing in poor English… 😉

When the SQL Server optimizer internally transforms a SQL Statement to an other, it normally results in a better execution plan. When You write for example a subquery the optimizer tries to make a join instead. This is fine as long a the result set is the same. But now we discovered a situation when this is not true: If you use a non-deterministic function in a query, the optimizer use the same query plan as if the function were deterministic. Let us examine this simple example:

We have a table with 5 rows: the key consists of the tupel (ID1,ID2). We add a new column to add a GUID later.

ID1 ID2 GUID
1 1 NULL
1 2 NULL
2 1 NULL
2 2 NULL
3 1 NULL

For each different value of ID1 we want to add a GUID with the non-deterministic function NewID():

SELECT
ID1
, NEWID() as [NewId]
FROM Table1
GROUP BY ID1

This results in something like:

ID1 NewId
1 B30AD595-926B-40F6-A815-D8871C81CE89
2 6842624D-DC40-4A3F-A2EB-A8178814D12E
3 12E9F691-7F8B-41F8-829B-8CED5E26C127

Now, we want to use the above query to assign the new values to the column GUID. To make the execution plan easier to understand, I used a SELECT, not an UPDATE. But the result is the same:

SELECT
t.ID1
, sub.NewId
FROM (SELECT
ID1
, NEWID() as [NewId]
FROM Table1
GROUP BY ID1) as sub
JOIN Table1 as t
ON t.ID1=sub.ID1

It should result in something like this:

ID1 NewId
1 B30AD595-926B-40F6-A815-D8871C81CE89
1 B30AD595-926B-40F6-A815-D8871C81CE89
2 6842624D-DC40-4A3F-A2EB-A8178814D12E
2 6842624D-DC40-4A3F-A2EB-A8178814D12E
3 12E9F691-7F8B-41F8-829B-8CED5E26C127

But this is not the case. The result is:

ID1 NewId
1 B30AD595-926B-40F6-A815-D8871C81CE89
1 4EC62D6E-8ABC-4563-8A81-2DB8E655D3CA
2 6842624D-DC40-4A3F-A2EB-A8178814D12E
2 73B7386E-688D-48D2-A585-C66C6911EFC3
3 12E9F691-7F8B-41F8-829B-8CED5E26C127

Do you see the difference? The reason for this is the wrong execution plan:

|--Compute Scalar(DEFINE:([Expr1004]=newid()))
|–Merge Join(Inner Join, MERGE:([tempdb].[dbo].[Table1].[ID1])=([t].[ID1]), RESIDUAL:([tempdb].[dbo].[Table1].[ID1]=[tempdb].[dbo].[Table1].[ID1] as [t].[ID1]))
|–Sort(DISTINCT ORDER BY:([tempdb].[dbo].[Table1].[ID1] ASC))
| |–Table Scan(OBJECT:([tempdb].[dbo].[Table1]))
|–Sort(ORDER BY:([t].[ID1] ASC))
|–Table Scan(OBJECT:([tempdb].[dbo].[Table1] AS [t]))

The optimizer choose to do the join first and to execute the function for each row. This is not correct.

So the general rule I recommend: Do not use non-deterministic functions in complex SQL queries. The result depends on the chosen query plan. Today the result may be correct, but if the row numbers change or you add an index the result may get incorrect! This is not as it should be.

Unfortunately I was not able to convince the German support that this is a bug. They send me a workaround like this:

DECLARE @Rows AS BigInt;
SELECT @Rows = Count(*) FROM Table1;

SELECT
t.ID1
, sub.NewId
FROM (SELECT TOP(@Rows)
ID1
, NEWID() as [NewId]
FROM Table1
GROUP BY ID1
ORDER BY NewId) as sub
JOIN Table1 as t
ON t.ID1=sub.ID1

The performance is very poor and I would recommend using a temporary table to store the new GUIDs instead, if you have a big row number. This seems to perform a little better.


Update (21.5.2008): Encouraged by Christoph I send the problem to Craig Freedman. He answered the very next day, that he presented the problem to the developer responsible for this code for his comments on that question. Here is the response of the developer Craig forwarded to me:

In general, SQL Server does not guarantee the timing of execution of scalar operators. For non-deterministic scalars (built-in and user-defined), that means the timing semantics (number of times executed and when) is not defined. In addition, it may change from one plan to another, or from one release to the next.

Craig added:

Unfortunately, I am not aware of (and was unable to identify) a better workaround than simply storing the GUIDs in a temp table before joining with the original table.

(My Thanks to Craig! I am very impressed that he ask the responsible developer. And thanks to the unknown developer.)


Update (11.6.2008): Itzik Ben-Gan did it! Microsoft confirmed to him this is a bug.

Currently I read the very good book "T-SQL Querying" written by Itzik. In the very first chapter he described that the optimizer can make shurtcuts in the physical execution plan if the result set is the same like using the logical execution plan. I asked him about his opinion about this problem and he made Microsoft to accept that this is a bug. He wrote:

I got back a response from Microsoft saying it is a bug, and apparently a regression from SQL Server 2000.

If you think Microsoft should fix this bug, then "vote" for this bug, please. The more people vote, the more likely MS will fix it.


Update (19.6.2008): Thanks for your support. The MS Developer Jim answered to this bug:

Thankyou for this bug report. One of the most interesting discussions around.

This hits to the very heart of the issue – is optimization allowed to change a program's semantics? Ie: if a program yields certain answers, but runs slowly, is it legitimate for a Query Optimizer make that program run faster, yet also change the results given?

Before shouting "NO!" (my own personal inclination too :-), consider: the good news is that, in 99% of cases, the answers ARE the same. So Query Optimization is a clear win. The bad news is that, if the query contains side-effecting code, then different plans CAN indeed yield different results. And NEWID() is one such side-effecting (non-deterministic) 'function' that exposes the difference. [Actually, if you experiment, you can devise others – for example, short-circuit evaluation of AND clauses: make the second clause throw an arithmetic divide-by-zero – different optimizations may execute that second clause BEFORE the first clause] This reflects Craig's explanation, elsewhere in this thread, that SqlServer does not guarantee when scalar operators are executed.

So, we have a choice: if we want to guarantee a certain behavior in the presence of non-deterministic (side-effecting) code – so that results of JOINs, for example, follow the semantics of a nested-loop execution – then we can use appropriate OPTIONs to force that behavior – as UC points out. But the resulting code will run slow – that's the cost of, in effect, hobbling the Query Optimizer.

All that said, we are moving the Query Optimizer in the direction of "as expected" behavior for NEWID() – trading off performance for "results as expected".
[…]
Anyhow, this bug is now assigned to the QO Dev team for a deeper look.

I presume "QO Dev team" is the "Query Optimizer Development team". 😉


Update (27.7.2008): In the last issue of the SQL Server Magazine Newsletter Itzik Ben-Gan wrote some bad news about this bug:

I posted the bug on Microsoft Connect (FeedbackID=350485), and after consideration, Microsoft decided to close the item and mark it as “Won’t Fix”. The reasoning behind the decision not to fix the bug is that in the vast majority of the cases, the optimization aspects that lead to the bug yield better performance without sacrificing the correctness of the query, and if you fall into one of the unusual cases where the correctness of the query is compromised, you can consider alternatives (e.g., physically materialize the data along with the NEWID values in a table).

This was quite unexpected for me. But I think there is nothing we can do about it. Thats a pity…

15. Mai 2008 um 22:57

Falsches Spiel mit Shanghai Pension

Unter dem Titel "Falsches Spiel mit Shanghai Pension" wird für Kinder bei Internauten.de die Mission "Abo" angeboten. Die Comic-Figuren treffen dabei auf eine Bande von Klingelton-Abzocker. Damit sollen Kinder für Fallen beim Abschluss von Abonnements im Internet sensibilisiert werden. Die Geschichte ist zwar etwas bemüht, aber durchaus empfehlenswert für Kiddies bis zur Pubertät (Tipp: immer nur auf "weiter" klicken und die Zahlen nicht anwählen). Etwas versteckt finden die Kids auch konkrete Hilfestellung. Aber selbst wenn sie das nicht lesen, werden sie wenigstens für das Thema sensibilisiert. Und das ist ja auch schon mal etwas wert.
Im Spiel können die Kids dann gleich prüfen, ob sie auf eine Abo-Seite reinfallen würden.

PS: Eigentlich hat mich lediglich der abgefahrene Titel neugierig gemacht. Immerhin haben meine Kids gestern in den Kindernachrichten bei Logo etwas über denn USA-Erfolg von Tokio-Hotel gesehen.

15. Mai 2008 um 22:40

Lieber Chef, ich will mehr Lohn …

Alle, die Vorurteile gegen den Studiengang BWL haben, sollten sich diesen Werbespot unbedingt ansehen. Das lernt man, was im Leben wirklich zählt!


Awesome video clips here

15. Mai 2008 um 12:29

dynamische WHERE-Klausel bei statischem SQL?

Im Artikel "Implementing Dynamic WHERE-Clause in Static SQL" wird beschrieben wie man mittels COALESCE, ISNULL oder CASE eine dynamische WHERE-Klausel implementieren kann. Wenn ich mir die Beispiele ansehe, dann habe ich aber meine Zweifel, ob der Optimizer da noch eine Chance hat den Zugriff performant (über den richtigen Index) hinzubekommen.

Spätestens bei großen Datenmengen dürfte der Einsatz von echt dynamischem SQL mittels EXEC() schneller sein. Das wird ganz gut im Artikel "Introduction to Dynamic SQL (Part 2)" erklärt.

14. Mai 2008 um 19:20

Eldorado für Hobby-Astronomen

Als ich mir heute erstmalig das Beta von "World Wide Telescope" ansah, war ich ganz schön beeindruckt. Der Coup von Microsoft ist in etwa zu vergleichen mit der Idee von Google-Earth. Nur dass man sich eben den Weltraum ansehen kann. Ich bin völlig begeistert.

Man hat vier verschiedene Ansichten:

  • Man kann sich den Himmel ansehen, wie er von einem beliebigen Punkt der Erde aussieht, natürlich auch die anderen Planeten unseres Sonnensystems. Nebenstehend ein Bild von der Venus. Das ist wirklich cool.
  • Man kann sich aber auch beliebige Planeten unseres Sonnensystems (und ein paar der Monde) so ansehen, wie bei Google-Earth die Erde. Das ist einfach irre.
  • Außerdem kann man sich die Erde ansehen. Google-Earth lässt grüßen.
  • Die Panorama-Ansicht klappt bei mir nicht!

Eine Sache am Rande hat mich echt bewegt: Sie haben Jim Gray nicht vergessen. Aus der FAQ:

Microsoft Research is dedicating WorldWide Telescope to the memory of Jim Gray and is releasing WWT as a free resource to the astronomy and education communities with the hope that it will inspire and empower people to explore and understand the universe as never before.

Sogar meine Töchter waren einfach begeistert. Zu meinem großen Erstaunen kannte meine Große etliche der Sternenbilder. Hm, einen Haken sollte ich erwähnen: die Software gibt es derzeit nur auf englisch.

14. Mai 2008 um 09:59

Tool-Tipp: dbConstructor

Auf dem letzten SQLPASS-Treffen der Regionalgruppe Franken in Nürnberg stellte der Referent Peter Döring (MVP) ein nettes Tool vor:

Mit dbConstructor kann man sehr gut Datenbanken von einem System zu anderen migrieren (z.B. von Oracle nach DB/2 und umgekehrt). Man kann es auch einfach zum Entwerfen von Datenbanken verwenden und sogar den Zugriffscode template-gesteuert generieren lassen. Das hat mich schon beeindruckt. Der Preis von 150 USD ist (besonders beim aktuellen Umrechnungskurs) wirklich günstig.