Dj Mallah – Warrrruummmnääh?

Advertisements
Patheos: Apostasie ist Fake oder für Geld

Patheos: Apostasie ist Fake oder für Geld

http://www.patheos.com/blogs/friendlyatheist/2017/07/03/muslim-woman-claims-ex-muslims-just-want-to-cash-in-on-apostasy/

Braucht man keine Worte zu verlieren, angesichts der aktuellen Situation, ausser

https://www.indy100.com/article/the-countries-where-apostasy-is-punishable-by-death–Z110j2Uwxb

 

Kannst du dir nicht ausdenken…

Buchhaltung from Heaven

Es geschehen noch Zeichen und Wunder, jedenfalls will uns das Reinhold Scharnowski weiß machen. Religiöse Menschen tun sich seit tausenden von Jahren schwer mit Personalwechseln. Die großen Anführer werden ob ihrer Untaten weiter verehrt und gepriesen. Dementsprechend wurde im vorliegenden Fall auch nicht ein neuer Buchhalter eingestellt, sondern ein Gebet gesprochen.

Aber langsam mit den jungen Pferden. Was ist denn passiert? Laut dem vorliegenden Bericht hat ein Gebet die Bilanz ausgeglichen. Erst durch ein Gebet konnte Klarheit in die Unternehmensbilanzen gebracht werden. Gottes Wege sind also wirklich unergründlich! Wo früher Meere geteilt oder die komplette Erde mit Wasser bedeckt wurde oder wenigstens Krankheiten geheilt wurden, besteht ein beachtenswertes Wunder heut zu tage im Ausgleich einer Bilanz.

Ganz böse Unkenrufe aus der schlimmsten Ecke könnten nun behaupten, dass die kurze Schaffenspause dem Buchhalter dabei geholfen hat seine Arbeit zufriedenstellend zu erledigen. Wahrscheinlich hätten ein Kaffee und fünf Minuten frische Luft (ich möchte Niemanden zum Rauchen verführen) den selben Effekt gehabt.

Ein paar Textstellen haben mir dann doch stark aufgestoßen:

  • Über Monate hinweg zeigten die Kasse und die Buchhaltung große Differenzen, und trotz allem Suchen war der Fehler nicht zu finden. ⇒ Wenn im Unternehmen über Monate die Bilanz nicht stimmt, habe ich viele Fehler gemacht und bin eventuell nicht mehr wirtschaftsfähig.
  • Die beiden Beträge unterschieden sich derart unwesentlich, dass man von einer fast hundertprozentigen Übereinstimmung reden konnte! ⇒ Was ist das für eine Bilanz? Wieviel ist „fast“? Ist hier wirklich von einem Buchhalter die Rede?
  • Hier war etwas geschehen, das sie nicht auf ihre eigenen Bemühungen zurückführen konnten. ⇒ Doch. Genau das ist passiert. Ihre eigenen Bemühungen brachten den Bilanzausgleich.
  • Entweder gibt es einen Gott, der reagiert, handelt und der eingreifen kann – oder unsere Welt ist ein geschlossenes System, das nach seinen eigenen Gesetzen funktioniert, und der «Liebe Gott» ist ausserhalb und hält seine Finger raus aus diesem System. ⇒ Ich glaube nicht, dass wir es hier mit „entweder/oder“ zu tun haben…
  • Und hier bietet Gott seine Hilfe an. «Ruf mich in der Not doch an», sagt er (Psalm 50,15 – Gottes Telefonnummer). ⇒ Opfere Gott Dank und erfülle dem Höchsten deine Gelübde, und rufe mich an in der Not, so will ich dich erretten, und du sollst mich preisen.“ steht insgesamt geschrieben. Ich reiße hier eventuell etwas aus dem Kontext, aber so richtig freigiebig klingt das für mich nicht. Es wird schon ein Maß an Gegenleistungen erwartet. Die Telefonseelsorge  ist kostenlos und stellt mir keine Bedingungen. Aber das sind auch nur Menschen. Da kann man nicht mit zweierlei Maß messen.
  • Jeder, der schon einmal solch ein Wunder im Alltag erlebt hat, weiss: Man muss sich demütigen und zugeben, dass man am Ende seines Lateins ist. ⇒ Da haben wir wieder einmal die bedingungslose Liebe des Zerstörers der Welten barmherzigen Herren im Himmel. Der Demutsbegriff stößt mich hierbei stark ab, denn es ist die Demut des Bettlers. Vergleichend dazu die „Demut des Kriegers„.
  • Wer sich auf Jesus einlässt, wird das dramatischste Wunder erleben, das möglich ist: eine Lebensveränderung, die kein Mensch selbst schafft. ⇒ Unmündige, unfähiges Gesindel. Ohne Jesus nichts wert. Zu hart ausgedrückt?

Mir stellt sich eigentlich nur die Frage ob diese Geschichte wirklich so geschehen ist. Ich habe einige Zweifel. Mein Ratschlag an die Protagonisten wäre auch, den Buchhalter zu feuern und den Kassierer zu befördern. Er scheint gute Arbeit zu leisten, wenn er seine Pausen bekommt…

Reinhold Scharnowski hat als scharfer Beobachter alle Fakten auf den Tisch gelegt und ist fast bis zur Conclusio gekommen. Es fehlt nur noch ein kleiner Schubs und die Umstellung von ein paar wenigen Punkten am Anfang des Textes:

„hatte man den Fehler [gefunden:] Alle drei Männer waren Christen“ 

Das erklärt den vorliegenden Fall. Bevor man sich selbst eingesteht Fehler zu machen, erklärt man ALLES mit Gottes Plan, der sich dann erfüllt, wenn man lieb BITTE BITTE gen Himmel ruft…

LocalDB: MSSQL-Datenbankanwendungen ohne MSSQL-Server

LocalDB: MSSQL-Datenbankanwendungen ohne MSSQL-Server

Seit Visual Studio 2012 lieferte Microsoft eine leichtgewichtige Version des MSSQL-Servers aus.

Übersicht

LocalDB ist ein Datenbankserver, welcher ohne Service ab Windows Vista bzw. Server 2008 läuft. LocalDB unterstützt den vollen Sprachumfang von MSSQL und den Anbindungs- bzw. Nutzungsmöglichkeiten wie ADO, LINQ und natürlich ODBC.

Unterschiede zum MSSQL-Server

LocalDB-Datenbanken sind auf auf die Collation „SQL_Latin1_General_CP1_CI_AS“ festgesetzt. Dies kann je nach Anwendung bzw. vorhandenen Scripten eine starke Einschränkung sein.

Die LocalDB-Instanz läuft nicht als Service. Beim ersten Zugriff auf die Instanz oder eine Datenbank in der Instanz wird diese gestartet. Weiterhin wird er eine gewisse Zeit nach dem letzten Zugriff beendet. Diese ist über „sp_configure ‚user instance timeout‘, 5;“ einstellbar. Für das Laufzeitverhalten einer Anwendung ist dies also nur beim Start oder bei sehr seltenen Abfragen von Belang. Bei Anwendungen welche durch dieses Startverhalten starke Laufzeiteinbußen haben, sollte ein MSSQL-Server als Service benutzt werden.

Die LocalDB-Instanz läuft im Userspace des anggemeldeten Windows-Benutzers. Dadurch erhält er die Möglichkeit ohne Einschränkungen Änderungen an der Instanz sowie den Datenbanken durchzuführen. Dies kann man zur einfachen Realisierung eines Testsystems benutzen, ohne dass der Benutzer ausführliche Rechte auf einem produktiv genutzten vollwertigen SQL-Server benötigt.

Durch die Ausführung im Userspace werden auch die Datenbankdateien (.mdf und .log) in Ordnern gespeichert die vom Benutzer verändert werden können. Dies kann durch die Veränderbarkeit ein Risiko darstellen, ermöglicht aber auch Datensicherung im Benutzerkontext und Ähnliches.

Verbindung

Die Verbindung zur LocalDB wird mir einem angepaßten ConnectionString hergestellt. Hierbei wird die „Versionsnummer“ der LocalDB angegeben.


// SQLServer 2012 --> V11.0

Data Source=(localdb)\V11.0;Integrated Security=true;Initial Catalog=DatabaseName;

// SQLServer 2014 --> MSSQLLocalDB

Data Source=(localdb)\MSSQLLocalDB;Integrated Security=true;Initial Catalog=DatabaseName;

Fazit

Vor allem für Testanwendungen oder kleine Installationen bietet sich LocalDB anstatt eines vollen MSSQL-Servers an. Auch auf einem Entwicklungssystem kann LocalDB von großem Nutzen sein. Einen weiteren Anwendungsfall sehe ich in automatisierten Tests, welche im Benutzerkontext ausgeführt werden und für jeden Testlauf eine frische Datenbank benötigen.

MFC: Shortcuts Teil 1

Einleitung

Shortcuts sind aus modernen GUI-Anwendungen nicht weg zu denken. In der Windows Entwicklung mit den „Microsoft Foundation Classes“ (MFC) gibt es dafür die sogenannten Accelerator-Strukturen, welche die Tastenkombination und das zu sendende Signal zusammenfassen.

In diesem mehrteiligen Beitrag werde ich die Entwicklung eines Shortcutmanagers für eine MFC-Applikation erläutern.

Theorie

Die Klasse CFrameWnd besitzt die protected Membervariable m_hAccelTable. In dieser sind die angelegten Shortcuts gespeichert.

Diese bestehen aus 3 Werten:

  • COMMAND_ID als WINDOW_MESSAGE oder USER_WM
  • Modifizierer
  • Taste

Modifizierer sind hierbei die Sondertasten CTRL, ALT, ALT-Gruppe und Shift. Die Modifizierer sind binär kombinierbar per Pipe.

Tasten sind laut MSDN alle darstellbaren KeyCodes.

Zusammengefaßt werden diese drei Werte pro Shortcut in einer Struktur des Typs ACCEL.

Realisierung

Das Anlegen eines neuen Shortcuts im Lauf der Anwendung basiert auf dem Kopieren der alten Zuordnungen, dem Hinzufügen der zusätzlichen Zuordnung und dem Update der Zuordnungen über den CKeyboardManager. Eine erste Implementierung könnte so aussehen:

void CStdMainFrame::AddShortCut( DWORD cmd, DWORD modifier, WORD key )
{
	CStdDynTemplate* pT = GetStdDynTemplate();
	if (!pT)
		return;
 
	// Größe des aktuellen AcceleratorTables holen
	int nAccelSize = ::CopyAcceleratorTable (m_hAccelTable, NULL, 0);
 
	// Array mit der Größe anlegen, in das der aktuelle AcceleratorTable hineinkopiert werden kann
	LPACCEL pAccel = new ACCEL[nAccelSize];
	ASSERT (pAccel != NULL);
 
	// aktuellen AcceleratorTable in unser Array kopieren
	::CopyAcceleratorTable (m_hAccelTable, pAccel, nAccelSize);
 
	// ein Element soll hinzugefügt werden, daher wird ein neues Array mit einem Element mehr angelegt
	LPACCEL lpAccelNew = new ACCEL[nAccelSize + 1];
 
	// das alte in das neue Array kopieren
	memcpy(lpAccelNew, pAccel, sizeof(ACCEL) * nAccelSize);
 
	// das alte Array löschen, da nicht mehr genutzt
	delete [] pAccel;
	
	// letztes Element holen (das ist das neue, welches intial gefüllt wird)
	ACCEL *pAcc = &lpAccelNew[nAccelSize];
 
	// Größe um unser neues Element erhöhen
	nAccelSize++;
 
	// Command, Modifiziertaste (STRG, ALT usw.) und Taste setzen
	pAcc->cmd = cmd;
	pAcc->fVirt = modifier;
	pAcc->key = key;
 
	// alten AcceleratorTable löschen, da ein neuer erstellt werden soll
	DestroyAcceleratorTable(m_hAccelTable);
 
	// neuen AcceleratorTable erstellen mit der neuen Größe
	m_hAccelTable = CreateAcceleratorTable(lpAccelNew, nAccelSize);
 
	// dem Keyboardmanager mitteilen, dass der DefaultAcceleratorTable aktualisiert werden soll
	theApp.GetKeyboardManager()->UpdateAccelTable(NULL, lpAccelNew, nAccelSize);
 
	// unsere neues Array kann jetzt wieder gelöscht werden, da alles abgeschlossen
	delete [] lpAccelNew;
}

Diese Funktion fügt den bestehenden Shortcuts einen weiteren hinzu. Nachteil dieses Ablaufs ist natürlich, dass die bestehenden Shortcuts nicht auf Doppelbelegung geprüft werden. Weder wird geprüft ob zweimal das selbe Signal

cmd

oder zweimal die selbe Kombination aus

modifier + key

verwendet wird.
Dieser Nachteil wird im nächsten Teil durch die Implementierung eines ShortcutManagers ausgeräumt.

Nachtrag

Besonders ungeduldige können sich gern die Übersichtsseite der MSDN durchlesen: Using Keyboard Accelerators

Inno Setup: Automatisierung durch Kommandozeilenparameter

Dieser Beitrag handelt nicht über die Automatisierung des Inno Setup Compilers per Kommandozeile. Diese ist in der Inno Hilfe ausreichend beschrieben.

Inno Setup bietet die Möglichkeit in der Code-Sektion Kommandozeilenparameter auszulesen. Diese können dem kompilierten Installer übergeben werden. Zum Installerstart können diese dann in einer Funktion ausgelesen werden.

//Initialisierung des Wizards
procedure InitializeWizard();
begin
 try
  ParseCommandLineParams;
 except
  begin
   MsgBox('Error Parsing CommandLine', mbError, MB_OK);
  end
 end;
end;

Hierfür greift man per Index auf das Array ParamStr zu.
Eine einfache Funktion zur Log-Ausgabe aller übergebener Kommandozeilenparameter sieht dann so aus:

function ParseCommandLineParams (): boolean;
var
  LoopVar : Integer;
  ParamName : String;
begin
  LoopVar :=0;
  ParamName := '';

  while (LoopVar < ParamCount) do
  begin
    ParamName := ParamStr(LoopVar);
    Log(ParamName);
    LoopVar := LoopVar + 1;
  end;
  Result := true;
end;

Beim testen dieser Funktion, sieht man dass InnoSetup selbst ebenfalls Kommandozeilenparameter übergibt. Die Eigenen werden hinten an gehangen.

Die Benutzung des ParamName eröffnet nun die Möglichkeit komplexere Konfigurationen zu übertragen, indem man definiert wieviele Werte nach einem Parameter folgen müssen.

Über diese Anzahl wird initial geprüft ob genügend Parameter übergeben wurden. Wenn dies nicht der Fall ist, wird das Parsing beendet.


if (not (LoopVar+6 < ParamCount)) then
begin
  MsgBox('Invalid ParamCount at /rollout', mbError, MB_OK);
  bDoRollout := false;
  Exit;
end;

Bei ausreichender Anzahl an Parametern werden die Werte zugewiesen.

Damit kann dann ein Parsing ungefähr so aussehen (das ist ein Beispiel aus dem letzten Installer, den ich geschrieben habe):

if (ParamName = '/database') then
begin
 // /database database databasename sqlserver windowsauthentication user password
 if (not (LoopVar+6 < ParamCount)) then
 begin
  MsgBox('Invalid ParamCount at /rollout', mbError, MB_OK);
  bDoRollout := false;
  Exit;
 end;
 dInstallerAction := 2;
 gpDBEdit.Text := ParamStr(LoopVar+2);
 strAutoIncludeDB := ParamStr(LoopVar+2);
 gpSRVEdit.Text := ParamStr(LoopVar+3);
 if (ParamStr(LoopVar+4) = 'true') then
 begin
   gpTCCheckBox.checked := true;
   gpUIDEdit.Text := 'sa';
   gpPWDEdit.Text := 'pwd';
 end
 else
 begin
   gpTCCheckBox.checked := false;
   gpUIDEdit.Text := ParamStr(LoopVar+5);
   gpPWDEdit.Text := ParamStr(LoopVar+6);
 end 

 Database := StrToInt(ParamStr(LoopVar+1));
 begin
 //rbLeer, rbAbfuell, rbElektro, rbFahrwerk, rbGetriebe
   case Database of
     1: rbLeer.Checked := true;
     2: rbAbfuell.Checked := true;
     3: rbElektro.Checked := true;
     4: rbFahrwerk.Checked := true;
     5: rbGetriebe.Checked := true;
 else
   begin
     rbLeer.Checked := false;
     rbAbfuell.Checked := false;
     rbElektro.Checked := false;
     rbFahrwerk.Checked := false;
     rbGetriebe.Checked := false;
   end
 end;
 end;

 exit;
end

Der Schalter /database ist hierbei wichtig wir nur so wissen, wann unsere Eigenen Parameter beginnen.