Freitag, 30. Januar 2015

Was mich ärgert - Rundfunkbeitrag

Rundfunkbeitrag. Schon das Wort ist gelogen. Unter Beitrag versteht doch jeder, dass man etwas freiwillig gibt. Den Rundfunkbeitrag muss aber jeder Haushalt zahlen, egal ob er die Öffentlich-Rechtlichen nutzt oder nicht. Sogar Blinde, Taube und Demente. Die korrekte Bezeichnung wäre also Rundfunkabgabe, oder am besten gleich Rundfunksteuer. 210 Euro pro Jahr muss jeder Haushalt berappen, damit ARD, ZDF & Co uns rund um die Uhr mit einem Programm versorgen, das kaum jemanden interessiert. Da kommen satte 7 ½ Milliarden Euro zusammen, das entspricht ungefähr dem Bruttoinlandsprodukt von Malta. Ein Haufen Geld. Die Malteser wären sicher ganz aus dem Häuschen, wenn sie alles, was sie im Jahr erwirtschaftet haben, gegen so etwas Schönes wie ‚die Küchenschlacht' oder ‚Das Quizduell' tauschen dürften.

Die Rundfunksteuer wurde eingerichtet, damit das System gerechter wird, sagen die Politiker. Tatsächlich ging es wohl eher darum, die wachsenden Probleme mit der Rundfunkgebühr und den Methoden der GEZ durch eine staatliche Lösung zu beseitigen. Klagen dagegen wurden bisher konsequent abgeschmettert, vor allem mit der Begründung, dass ein unabhängiger Journalismus für eine Demokratie unverzichtbar sei. Unabhängig? Wie unabhängig können Sender wohl sein, deren Existenz komplett vom Goodwill der Politiker abhängt? Jeder Festangestellte der Öffentlich-Rechtlichen hat quasi Beamtenstatus und kann sorgenfrei seine Zukunft planen, ganz im Gegensatz zu denen, die diesen Status finanzieren müssen, nämlich wir! Und mal ehrlich, wer würde schon diesen wunderbaren Zustand aufs Spiel setzen, indem er sich kritisch mit der Regierung und unserem politischen System auseinandersetzt?

Es gibt einen Rundfunkstaatsvertrag, indem festgelegt wurde, was genau die Aufgaben von ARD & Co sind, aber es gibt auch findige Juristen, die die Paragrafen solange dehnen, bis die ‚Helene Fischer Show' ein kulturelles Ereignis von nationalem Rang ist. Nichts gegen Helene Fischer oder ihre Fans; aber nach meiner Erfahrung kommen auf jeden, der die Künstlerin sehen will, mindestens neun andere, die gut darauf verzichten können. Nun, mittlerweile heiligt die Einschaltquote jede noch so dümmliche Show zur Hauptsendezeit. Dabei steht kein Wort von irgendwelchen Quoten im Staatsvertrag, allerdings eine Menge über den Informations-, Bildungs-, Kulturauftrag. Um aber ein hochwertiges Programm in diesen Bereichen zu machen, braucht man Zeit und Geld und Leute, die ihr Handwerk gelernt haben.

Gründliche Recherche bei mindestens zwei unabhängige Quellen – wozu? Man kann doch viel bequemer ungeprüft senden, was der News-Markt so hergibt. Schönes Beispiel dafür war der angebliche Marsch von 50 Staatsoberhäuptern in vorderster Front bei der ‚Je suis Charlie'- Demo in Paris. Tatsächlich hatten sich Merkel & Co nur für ein paar Minuten untergehakt und sind 100 Meter unter strengster Bewachung weit entfernt von den Bürgern gegangen um anschließend in ihre Staatskarossen zu steigen und abzuhauen. Auf allen Kanälen waren danach hübsche Schnittbilder zu sehen, Hunderttausend Demonstranten, angeführt von den mutigen Politikern und dazu gab es jubelnde Kommentare. So etwas nennt man Manipulation und devote Hofberichterstattung. Auch dafür zahlen wir 210 Euro im Jahr.

Man mag es bei 7 ½ Milliarden Euro kaum glauben, aber das Geld für hochwertige, akribisch überprüfte politische Beiträge fehlt, weil es vor allem für Sportlizenzen, Fernsehshows und externe Produktionsfirmen gebraucht wird, die uns etwa mit diesen wunderbaren Talkshows versorgen, in denen die immer gleichen Köpfe sattsam Bekanntes von sich geben dürfen. Wie im Karussell tauchen diese Sprechautomaten nacheinander bei Illner, Jauch, Will, Maischberger auf und versorgen uns mit Platituden und BlaBla, Hauptsache, es kommt nicht zu einer ernsthaften Diskussion über echte gesellschaftliche Probleme oder gar das politische Personal. Auch dafür zahlen wir den Rundfunkbeitrag, ob wir wollen oder nicht. Wo bleiben die kritischen Beiträge zu TTIP, Billionenankäufe der EZB, zum Wachstumswahn, zur Verarmung in Deutschland, über die Macht der Lobbyisten und die Ohnmacht der Bürger; warum überträgt man wieder live die Tour de France, obwohl man doch weiß, dass die Mehrheit der Fahrer nach wie vor gedopt ist, wo bleiben die investigativen Berichte über Korruption bei Banken, Industrie und Politik. Stattdessen bekommen wir nur eine weitere seichte Trivialserie mit Frau Berben, Hörbiger oder Neubauer in der Hauptrolle. Das alles zum Preis eines Mittelklassewagens – pro Minute, versteht sich.

Sicher, Fernsehen ist nicht das Wichtigste auf der Welt und im Grunde könnte es mir egal sein, welchen Müll ZDF & Co Tag für Tag in den Äther blasen, genauso, wie es mir bei RTL & Co tatsächlich wurscht ist. Aber für die Privaten müssen wir keine Zwangsabgaben leisten und sie machen auch kein Hehl daraus, dass sie am Gängelband der Industrie hängen. Jeder weiß, dass er durch das Anschauen der üppigen Werbeblöcke ihre Existenz sichert. Wenn keiner mehr guckt sind sie weg. Die öffentlich-rechtlichen aber eben nicht. Selbst wenn niemand mehr einschalten würde, wäre ihnen immer noch unser ‚Beitrag' sicher, 7 ½ Milliarden pro Jahr.

Apropos, was ist eigentlich mit Malta passiert, nachdem die Banken dort nach der ersten Hilfe der EU nach weiteren Milliarden riefen? Wurde gezahlt? Dazu hätte ich gern etwas in ARD, ZDF & Co gesehen.

Mittwoch, 11. Juli 2012

Win7 Domäne zurück zur Arbeitsgruppe

 

Wir haben einen neuen SMS Server im Keller eingerichtet und natürlich wollte ich die PCs nun auch in der Domäne anmelden und die Vorteile von ActiveDirectory nutzen.

Also habe ich den Computer von der Arbeitsgruppe XYZ auf die Domäne XYZ umgestellt und neu gestartet. Nun musste ich mich mit Strg+Alt+Entf anmelden, was mich etwas stutzig machte, aber okay, also Usernamen und PW angegeben und los ging’s. Alles okay, vertrauter Desktop und nun konnte ich im Netzwerk auch den Server sehen. Perfekt.

Aber die Anmeldung. Ich hatte vorher Autologin konfiguriert (z.B. so) und das wollte ich auch hier so haben. Also bin ich dieser Anleitung gefolgt:

REGISTRY
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon]
"AutoAdminLogon" = "1"
"ForceAutoLogon" = "1" – GEFÄHRLICH"!
"DefaultUserName" = "XXXX"
"DefaultPassword" = "xxxxx"
"DefaultDomainName" = "xxx"

Das habe ich gemacht, und es hat auch funktioniert. Doch nach dem Neustart hatte ich plötzlich einen fast jungfräulichen Windows-Desktop vor mir. Grund: der Server hat mein Desktop lokal gespeichert und liefert ihn auf Anmeldung an meinen Rechner aus.

Das war nicht, was ich wollte, schließlich müsste ich jetzt alle Programme wieder komplett neu konfigurieren. Also erst mal alles zurück. Ab in die Registry und Autologin zurücksetzen. Denkste Trauriges Smiley! Seit der Ummeldung bin ich nämlich kein Administrator mehr und darf solche Änderungen gar nicht vornehmen!

Gut, dann eben abmelden und als lokaler User wieder anmelden. – Das klappt nicht, denn "ForceAutoLogon" ist gesetzt und sorgt dafür, dass sofort wieder angemeldet wird. Und nun?

Nachdem ich zig Einstellungen am Server vorgenommen und etliche Foren ohne Erfolg durchstöbert habe, war mir klar, dass ich es schaffen müsste, mich wieder als lokaler User anzumelden, ansonsten würde nichts funktionieren.

Früher konnte man das Autologin durch Drücken der SHIFT-Taste unterbrechen, aber das funktionierte bei Win7 einfach nicht. Dann, nach längerer Suche fand ich den Tipp, BEIDE Shift-Tasten abwechselnd zu drücken, nachdem man 'Abmelden’ beim Computer gewählt hat. Und, siehe da, es funzt. Man kann nun wieder Strg-Alt-Entf drücken und bekommt den gewohnten Anmelde-Bildschirm. Einmal den Domäne-User und dann die Möglichkeit sich als anderer Benutzer anzumelden. Darauf klicken, den Namen des Computers und den lokalen User (“COMPUTER\USER”) und Passwort angeben, und – man ist wieder dort wo alles begann, und kann nun notfalls alles wieder zurücksetzen. Was für eine Erleichterung! 

Ich poste das hier, weil ich mal vermute, dass es einen Haufen Leute gibt, die genau vor demselben Problem stehen und schon kurz davor stehen, Windows neu zu installieren.

Samstag, 27. August 2011

IP(s) auf Server 2003 gezielt sperren

Hier gibt es ein sehr hilfreiches Step-By-Step Tutorial, wie man mithilfe des IP Security Policy Management einzelne IP-Adressen sperren kann. Z.B. bei anhaltenden brute force Attaken.

Dienstag, 2. August 2011

Liebe geht anders.: Bald geht's los

Liebe geht anders.: Bald geht's los: "Hallo liebe Besucher! Und willkommen in meinem Blog. Ich würde mich sehr freuen, wenn ihr mir ein bisschen Gesellschaft leistet, während ic..."

Endlich hat sich meine Tochter durchgerungen, das öffentlich und regelmäßig zu tun, was sie am besten kann - schreiben. Ihre Art, die Welt und das darauf agierende Ensemble zu beschreiben ist höchst amüsant und manchmal auch sehr berührend. Alle, die bisher etwas von ihr gelesen haben, wollten danach nur noch eins: mehr!

Donnerstag, 30. Juni 2011

Banken vs. Mafia

Bank

Mafia

Lebt ausschließlich von der Arbeit anderer

Zinsen, Provisionen, Beteiligungen

Schutzgeld, Raub

Vernichtet Karriere und Leben von vielen Menschen

Schrottpapiere, faule Kredite,  Staatsanleihen, Rohstoff- Nahrungsmittel-Spekulation

Erpressung, Mord

Betreibt Glückspiel in großem Stil

Hedgefonds,  Investmentbanking, Immobilienfinanzierung, Versicherung

Wettportale, Casinos

Agiert International

Bankenkonzerne, Börsen

Cosa Nostra etc.

Verschleiert die Tätigkeiten

Hochkomplexe Produkte,  interne Deals

Geldwäsche, beteiligt sich damit an regulären Geschäften

Erkauft sich Wohlwollen der Mächtigen

Spenden, kulturelle Förderung, Einladungen, Lobbyismus

Bestechung, Manipulation

Trägt keinerlei gesellschaftliche Verantwortung

Euro-Rettungsschirm (Steuerzahler tragen das Risiko der Banken)

In Teilen doch, da sie ihre Mitglieder und Angehörige fördert und schützt

Entzieht sich der Justiz

Verhindert wirkungsvolle Gesetze durch Drohung, Fehlinformation und Manipulation

Setzt Justiz und Exekutive durch Drohung, Bestechung und Korruption außer Kraft

Ignoriert ethische Werte

Jeder Deal, der Geld bringt, wird gemacht, egal, ob dabei ganze Länder ins Elend rutschen

Nicht ganz. Es wird zwar fast alles gemacht, es gibt aber einen Ehrenkodex.

Bert Brecht: “Was ist ein Einbruch in eine Bank gegen die Gründung einer Bank?” [Dreigroschenroman, 1934]

Sonntag, 1. Mai 2011

UpSert als StoredProcedure oder in interner Tabelle VB .Net

Beim Eintragen von Daten in eine SQL-Tabelle ergibt sich immer wieder die Situation, dass in einer Spalte keine doppelten Werte auftauchen dürfen. Versucht man es trotzdem, reagiert die Datenbank mit einem Fehler. Versucht man umgekehrt anhand dieses Wertes einen Datensatz zu aktualisieren, der nicht vorhanden ist, passiert gar nichts. In beiden Fällen muss man also mindestens zweimal die Datenbank aufrufen um entweder einen neuen Datensatz einzutragen, oder einen bereits vorhandenen zu aktualisieren. Im ersten Fall den Fehler abfangen und danach aktualisieren (UPDATE) im zweiten Fall, auf 0-Ergebnis prüfen und gegebenenfalls einen neuen Datensatz anlegen (INSERT).

Es wäre also hilfreich und würde den Aufwand halbieren, wenn man beides in eine Abfrage bündeln könnte, eine UPSERT-Funktion also, die man als Datenbankskript (StoredProcedure). in der Datenbank speichert. So ein Skript könnte etwa so aussehen:

-- =============================================
-- Author: Peter-W. Fischer
-- Create date: 29.4.2011
-- Description:
-- =============================================
--CREATE TABLE [dbo].[Test](
-- [TestID] [uniqueidentifier] NOT NULL,
-- [TestWert] [nvarchar](200) NOT NULL,
-- [Inserted] [datetime] NOT NULL,
-- [Updated] [datetime] NULL,
-- CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
--(
-- [TestID] ASC
--)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
--) ON [PRIMARY]


CREATE PROCEDURE [dbo].[TestUpSert]
@TestWert nvarchar(200)
,@Check uniqueidentifier OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET @Check =null
BEGIN TRANSACTION
UPDATE dbo.Test WITH(SERIALIZABLE)
set
@Check = TestID
,Updated=GETDATE()

where TestWert = @TestWert

IF @Check is null
BEGIN
set @Check=NEWID();
INSERT dbo.Test (TestID, TestWert, Inserted)
values (@Check, @TestWert, GETDATE())
END
COMMIT TRANSACTION
-- select * from dbo.Test
END

GO


Die Tabelle hat vier Spalten.
  1. TestID (Uniqueidentifier/Primary Key),
  2. TestWert, die keine doppelten Einträge zulässt.(Indiziert!)
  3. Inserted (wird nur beim ersten Eintragen gesetzt) und
  4. Updated (wird bei jeder Aktualisierung gesetzt)
Die Procedure TestUpSert hat zwei Parameter:
  1. TestWert, der neue oder zu aktualisierende Eintrag
  2. Check, ein Rückgabeparameter, der die TestID zur späteren Verwendung enthält
Das Verfahren ist denkbar simpel: zunächst wird der Check-Parameter auf NULL gesetzt. Er dient später als Flag, ob das nachfolgende UPDATE funktioniert hat. Das ist nur der Fall, wenn ein Datensatz mit dem TestWert bereits existiert. In dem Fall wird dort der Updated-Wert aktualisiert und Check bekommt den Wert von TestID.

Falls aber Check nach dem Update immer noch NULL ist, gab es TestWert noch nicht in der Tabelle und wird nun per INSERT eingefügt; dabei wird die Spalte Inserted ebenfalls aktualisiert.

Das ganze wird threadsafe durch die Durchführung in einer Transaction und dem SERIALIZE-Attribut beim UPDATE.

Soweit, so gut.

Zum Testen kann man folgendes Skript verwenden:

DECLARE @Check uniqueidentifier
,@Counter int=0
,@Wert nvarchar(100)
Print 'Start: ' + CONVERT(nvarchar(30), GETDATE(), 126)
WHILE @Counter<100000
BEGIN
SET @Wert='Wert' + CONVERT(nvarchar(10),FLOOR(RAND()*50000))
EXEC dbo.TestUpSert @Wert, @Check OUTPUT

SET @Counter=@Counter+1
END
Print 'Ende: ' + CONVERT(nvarchar(30), GETDATE(), 126)

SELECT * FROM dbo.Test ORDER BY TestWert


Es werden 100.000 Einträge in die Tabelle vorgenommen, wobei der TestWert aus dem Wort 'Wert' und einer Zufallszahl zwischen 0 und 49999 besteht, damit es mit einer 50% Chance zu Updates kommen kann.

Server intern: ~ 50 Sekunden
Die Anfangs - und Endzeit des Skripts wird ausgegeben. Bei mir, auf einem mittelmäßigen Dualcore-PC, braucht das Skipt ca. 50 Sekunden, also im Schnitt etwa eine halbe Millisekunde pro Eintrag, was recht schnell ist.

Leider lässt sich diese Zeit nicht erreichen, wenn man TestUpSert aus einem VB .NET Programm aufruft. Ich habe dort in den Datadesigner die StoredProcedure übernommen, sie ist dort anschließend unter QueriesTableAdapter verfügbar und kann mit einer einfachen Funktion aufgerufen werden:

Dim start As Date = Now
Console.WriteLine("{0:G}: StoredProcedure-Test gestartet.", start)
Using qadap As New dsMMDBTableAdapters.QueriesTableAdapter
Dim i As Integer, id As Guid = Guid.Empty
For i = 1 To 100000
qadap.TestUpSert("Testwert" & Int(Rnd() * 50000), id)
Next
End Using
Console.WriteLine("{0:G}: StoredProcedure-Test beendet. Dauer: {1:0.000} Sekunden", Now, Now.Subtract(start).TotalSeconds)

Aufruf per .NET: ~ 8 Minuten
Im Prinzip passiert hier exakt das selbe wie im obigen Skript; allerdings dauert nun die ganze Aktion über 7 (!) Minuten, also mehr als 8x so lang. Tatsächlich braucht jeder neue Eintrag ein paar Millisekunden länger, der letzte fast 20 Sekunden, obwohl FeldWert in der Tabelle indiziert ist?!

Eine weitere Möglichkeit besteht darin, die Eintragungen zunächst innerhalb des Programms , also direkt im Speicher vorzunehmen und anschließend die gesamte Tabelle in einem einzigen Update in die Datenbank zu schreiben. Dazu könnte man zunächst mit einer [Tabelle].Select-Abfrage testen ob der Wert bereits vorhanden ist und danach entweder updaten oder inserten. Tatsächlich kostet dieses Verfahren ebenfalls sehr viel Zeit, wenn die Zahl der Einträge in die Hunderttausend geht. Erheblich verbessern kann man das, indem man einen virtuelle Index auf die Testwert-Spalte setzt. Das geht, indem man ein Dataview über die Tabelle stülpt, das mit einem Sortierfilter arbeitet:

dvTab = New DataView(Tab)
dvTab.Sort = Tab.TestWertColumn.ColumnName

Dann sieht die eigentliche interne UpSert-Funktion so aus:

Public Function Upsert(ByVal Testwert As String) As dsMMDB.TestRow
Upsert = Nothing
Try
Dim rws() As DataRowView = dvTab.FindRows(Testwert)
Dim rw As dsMMDB.TestRow = Nothing
If rws Is Nothing Or rws.Length = 0 Then
rw = Tab.NewTestRow
rw.TestID = Guid.NewGuid
rw.TestWert = Testwert
rw.Inserted = Now
Tab.AddTestRow(rw)
Else
rw = rws(0).Row
rw.Updated = Now
End If

Return rw
Catch ex As Exception

End Try
End Function

.Net intern, dann DB-Update: ~ 4 Minuten
Die braucht, was kaum überrascht, für das interne Eintragen von 100.000 Werten nur knapp 5 Sekunden, allerdings braucht das Updaten der Datenbank dann zusätzliche 4 Minuten. Das sind aber immerhin nur noch etwas mehr als die Hälfte der Zeit, die der Aufruf der StoredProcedure braucht.

Aufgrund dieser Ergebnisse, würde ich also immer die letzte Methode bevorzugen, wenn es darum geht, eine große Menge von Daten in kurzer Zeit entweder zu aktualisieren oder zu insertieren. Der Nachteil der internen Methode ist allerdings, dass Daten solange verloren gehen können, solange sie nicht komplett in die Datenbank geschrieben wurden. Wenn es also vor allem um Datensicherheit geht, ist der Aufruf der StoredProcedure wohl unumgänglich.

Warum dieses Verfahren allerdings so 'teuer', also zeitintensiv ist, konnte ich bisher auch nicht erklären.

Falls jemand was weiß - bitte posten!


Samstag, 23. April 2011

Unsignierte Treiber in Server 2008 - unsigned driver server 2008

Man kann auf dem Server 2008 keine Treiber mehr installieren, die nicht signiert sind. Einerseits aus Sicherheitsgründen verständlich, andererseits in der einen oder anderen Situation schlicht ärgerlich. Z.B. wenn man streamen und dafür eine virtuelle Audiokarte installieren will, weil die meisten Server überhaupt keine Audiohardware haben. Noch sind die meisten dieser virtuellen Treiber aber unsigniert. Was also tun?

Hier die Lösung (hat zumindest bei mir funktioniert):

Command-Fenster öffnen:

dann erst dies:
bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
dann das hier:
bcdedit /set Testsigning on
eingeben und jeweils mit RETURN bestätigen.
In beiden Fällen sollte es eine Erfolgsmeldung geben.

Danach unbedingt den Server neu starten. Danach sollte rechts unten auf dem Desktop die Server Version und "Testmodus" stehen. Nun kann man auch unsignierte Treiber installieren (dazu im Warn-Dialog einfach 'trotzdem installieren' anwählen!)