Seltsame Beobachtungen bei dem Handling der InstaLOC 2.0 Datenbanken (Speicher)

Die Zusammenführungen der Rohdaten via Location-IDs (Facebookcodierung/Instagram) mit den Geodaten aus Openstreetmap entdeckte ich folgendes Problem:

Die Abarbeitungen der Queries müllt mir meine C-Partition zu und verbraucht unlogischen Speicher, obwohl die Arbeiten bspw. auf den Partitionen D, E und F laufen.

Diese Baustelle wurde über den Befehl:

PRAGMA temp_store_directory = ‚f:\‘

gelöst. Interessant ist auch, dass diese Anweisung (via SQLitestudio) die Schreib- und Lesegeschwindigkeiten extrem beschleunigt, sofern der Hauptteil der Arbeiten auf der internen SSD-Platte läuft (ca. 3000MB/Sek.).

Wieder einmal bin ich darüber erstaunt, wieviel man im BIGDATA-Bereich lernen kann. :-)

SQLite: schnell die Datenbankeinträge zusammen zählen

Diverse Datenbankmonitoringprobleme erforderten das Aufzählen der Einträge. Hierfür nehme ich unter der SDK „Delphi“ folgenden Befehl:

select MAX(_ROWID_) from tags;

Unter Windows 10 und mit einem relativ modernen Computer verlangt diese Anweisung ca. 25 Sekunden bei Abfrage(n) aus der ca. 32GB großen Hashtagdatenbankdatei.

SQLite, Performance steigern

Die Ausgangslage ist hier eine 10GB große SQLitedatenbankdatei, welche aus dem Interaktionen-Analyse-Projekt stammt.
Testquery ist:
select count (*) from interaktionen.interakt;
Abfragedauer: 30 Sekunden

Anpassung der Datei auf
PRAGMA synchronous=off

Abfragedauer nach Anpassung: 3 Sekunden.

Weitere Infos und Links:
http://blog.devart.com/increasing-sqlite-performance.html
https://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning
https://sqlite.org/optoverview.htmlhttp://codificar.com.br/blog/sqlite-optimization-faq/
https://dba.stackexchange.com/questions/153876/necessary-tuning-settings-for-sqlite-databases
https://stackoverflow.com/questions/784173/what-are-the-performance-characteristics-of-sqlite-with-very-large-database-file

[Delphi] Zeichenkettenrückumwandlung der Htmlentities

Folgende Funktion erledigt das.

function tform1.Unescape(const StrEscaped:String):WideString;
function UnescapeUncodeChar(const s:String):WideChar;
var
r:Array [0..1] of Byte;
begin
HexToBin(PChar(LowerCase(s)),@r,SizeOf(r));
Result:=WideChar((r[0] shl 8) or r[1]);
end;
function UnescapeAnsiChar(const s:String):Char;
begin
HexToBin(PChar(LowerCase(s)),@Result,SizeOf(Result));
end;
var
i:Integer;
c:Integer;
begin
c:=1;
SetLength(Result,Length(StrEscaped));
i:=1;
while i<=Length(StrEscaped) do
begin
if StrEscaped[i]='%' then
begin
if (i<Length(StrEscaped)) and (StrEscaped[i+1]='u') then
begin
Result[c]:=UnescapeUncodeChar(Copy(StrEscaped,i+2,4));
Inc(i,6);
end
else
begin
Result[c]:=WideChar(UnescapeAnsiChar(Copy(StrEscaped,i+1,2)));
Inc(i,3);
end;
end
else
begin
Result[c]:=WideChar(StrEscaped[i]);
Inc(i);
end;
Inc(c);
end;
SetLength(Result,c-1);
end;

Der Aufruf erfolgt via
unescape(zeichenkette_htmlentities);

Weitere Quellen zu „Html-Endtities“.
http://unicode.e-workers.de/entities.php
https://mothereff.in/html-entities (Encoder, Decoder für den Quercheck)

[Delphi] Zeichenkettenumwandlung (Umlaute, Sonderzeichen) in Htmlentities

Folgende Funktion erledigt das.

function tform1.Escape(const StrToEscape:WideString):String;
var
i:Integer;
w:Word;
begin
Result:='';
for i:=1 to Length(StrToEscape) do
begin
w:=Word(StrToEscape[i]);
if w in [Ord('0')..Ord('9'),Ord('A')..Ord('Z'),Ord('a')..Ord('z')] then
Result:=Result+Char(w)
else if w<=255 then
Result:=Result+'%'+IntToHex(w,2)
else
Result:=Result+'%u'+IntToHex(w,4);
end;
end;

Der Aufruf erfolgt via
escape(zeichenkette_mit_umlaute_oder_sonderzeichen);

[Delphi] komplexe Tastendruckabfolgen simulieren o. automatisieren

Gewisse Änderungen an einem Social Medium zwangen mich zu einer Umarbeitung eines unserer Bots. Ein spezielles Problem war hier das Management komplexerer Login- und Logoutprozeduren, da besagtes Medium genau an dieser Stelle die Aktivierung der Keyboardtasten überwacht.
Nunja: die Lösung hierfür fand ich in der „Tech Ecke“ (Prozedur „EnterText“). Vor der Verwendung dieser Prozedur MUSS selbstverständlich das zu befüllende Formularfeld aktiviert werden.
Dies erledigt man mit „WebBrowser1.OleObject.document.forms.item(0).elements.item(‚[name]‘).focus;“.

[Delphi] Texte im Unicode speichern.

Bei einer speziellen Exportfunktion des Hashtagprojektes entdeckte ich, dass die „savetofile“-Prozedure leider keine Unicode-Zeichenketten (Pictogramme, etc.) in die gewünschte Text-Datei oder CSV übertragen kann. Die Problemlösung sieht so aus:

procedure tform1.savetounicode(mytext: tmemo; filename: string);
begin
Writer := TStreamWriter.Create(filename,
false, TEncoding.UTF8);
Writer.WriteLine(mytext.Text);
Writer.Write(mytext.Text);
Writer.Free();
end;

Aufruf der Prozedure:
savetounicode(memo,dateipfad+dateiname);

Inspiriert von:
Saving string or stringlist to unicode textfile

Delphi: Versenden von EMails via Indy (SSL, TSL)

Folgender Code hilft beim Versenden von EMails aus Delphi / Indy mit Anbindung und Unterstützung von SSL und TSL. Inspiriert wurde das Ganze von „Envio de e-mail com componentes Indy„.

procedure TForm1.Button3Click(Sender: TObject);
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
IdText: TIdText;
sAnexo: string;
begin
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
IdSMTP := TIdSMTP.Create(Self);
IdMessage := TIdMessage.Create(Self);
try
IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.UseTLS := utUseImplicitTLS;
IdSMTP.AuthType := satDefault;
IdSMTP.Port := xxx;
IdSMTP.Host := '';
IdSMTP.Username := '';
IdSMTP.Password := '';
IdMessage.From.Address := '';
IdMessage.From.Name := '';
IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
IdMessage.Recipients.Add.Text := edit5.text;
IdMessage.Subject := '';
IdMessage.Encoding := meMIME;
IdText := TIdText.Create(IdMessage.MessageParts);
IdText.Body.Add('The body of the e-mail goes here');
IdText.ContentType := 'text/plain; charset=iso-8859-1';
try
IdSMTP.Connect;
IdSMTP.Authenticate;
except
on E:Exception do
begin
MessageDlg('Cannot authenticate: ' +
E.Message, mtWarning, [mbOK], 0);
Exit;
end;
end;
try
IdSMTP.Send(IdMessage);
MessageDlg('Message sent successfully!', mtInformation, [mbOK], 0);
except
On E:Exception do
begin
MessageDlg('Error while sending a message: ' +
E.Message, mtWarning, [mbOK], 0);
end;
end;
finally
FreeAndNil(IdMessage);
FreeAndNil(IdSSLIOHandlerSocket);
FreeAndNil(IdSMTP);
end;
end;

Delphi: Abrufen von EMails via Indy inkl. SSL

Der folgende Code ist hilft hier vor allem bei TLS und SSL geschützten Accounts. Es eine erste Version und soweit sind keine Fehler aufgefallen.

procedure TForm1.Button9Click(Sender: TObject);
var
i, j,MsgAnz: Integer;
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
bodytext: string;
begin
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
idpop31.IOHandler := IdSSLIOHandlerSocket;
idpop31.UseTLS := utUseImplicitTLS;
IdPOP31.Host := '';
IdPOP31.Port := xxx;
IdPOP31.UseTLS := utUseImplicitTLS;
IdPOP31.Username := '';
IdPOP31.Password := '';
IdPOP31.Connect;
if IdMessage1.ContentType='text/plain' then
memo1.text:=IdMessage1.Body.Text;
MsgAnz := IdPOP31.CheckMessages;
mailzeug.Lines.Add('Anzahl E-Mails:' + IntToStr(MsgAnz));
for i:= 1 to MsgAnz do
begin
idpop31.Retrieve(i, IdMessage1);
mailzeug.Lines.Add('E-Mail Nr:' + IntToStr(i)+ sLineBreak +
' Von:' + IdMessage1.From.Text + sLineBreak +
' Betreff:' + IdMessage1.Subject);
bodytext:=idmessage1.Body.Text;
mailzeug.Lines.Add(bodytext);
IdMessage1.Clear;
idpop31.Delete(i);
end;
IdPOP31.Disconnect;
FreeAndNil(IdSSLIOHandlerSocket);
end;