Ich habe beim Makro scheiben mit dem Mac einen Fehler bekommen, den ich nicht beheben konnte, weil dieser nicht am Code lag:
Fehler beim Kompilieren: Ungültiges Zeichen
Die Lösung war, den „fehlerhaften“ Code nochmals abzutippen, dann ging es. Meine Erklärung ist, das ein im Editor nicht angezeites Zeichen mit in den Code gekommen ist.
VBA Regex Lite mit Like
Native in VBA sind Regex leider nicht möglich, sondern nur über eine ActiveX Bibliothek erhätlich. Wenn man auch für Mac programmieren will, kommt dies nicht in Frage. Statt dessen kann man den Regex Lite befehl „Like“ benutzen, mit dem ähnliche abegspeckte Operationen machen kann.
Bsp.
success = text Like "T-#########-#" 'matches: 'T-123456789-1 success = text Like "[0-9a-z][0-9a-z]" 'matches: '1a, 2b
Um Latenz Probleme bei Redis zu analysieren, kann man das eingebaute Latency Tool von redis-cli benutzen, mit dem um 100 Requests pro Sekunde auf den Redis gepingt werden und man die Antwortszeit analysieren kann.
Konsolen Bsp:
Im Intervall von i=10 Sekunden auf localhost getestet
redis-cli --latency-history -i 10 -h 127.0.0.1 -p 6379
Output:
min: 0, max: 10, avg: 0.89 (906 samples) -- 10.01 seconds range min: 0, max: 32, avg: 1.44 (862 samples) -- 10.00 seconds range min: 0, max: 6, avg: 0.50 (939 samples) -- 10.00 seconds range min: 0, max: 7, avg: 0.47 (941 samples) -- 10.01 seconds range min: 0, max: 12, avg: 0.47 (942 samples) -- 10.00 seconds range min: 0, max: 137, avg: 2.70 (779 samples) -- 10.01 seconds range min: 0, max: 119, avg: 5.92 (626 samples) -- 10.06 seconds range min: 0, max: 2389, avg: 7.31 (572 samples) -- 10.00 seconds range min: 0, max: 14, avg: 0.64 (926 samples) -- 10.00 seconds range min: 0, max: 9, avg: 0.50 (938 samples) -- 10.01 seconds range min: 0, max: 16, avg: 0.47 (941 samples) -- 10.01 seconds range min: 0, max: 21, avg: 0.56 (933 samples) -- 10.01 seconds range min: 0, max: 23, avg: 0.56 (933 samples) -- 10.01 seconds range min: 0, max: 150, avg: 1.95 (827 samples) -- 10.01 seconds range min: 0, max: 131, avg: 4.22 (696 samples) -- 10.01 seconds range min: 0, max: 131, avg: 7.06 (581 samples) -- 10.01 seconds range min: 0, max: 4136, avg: 10.33 (488 samples) -- 10.01 seconds range min: 0, max: 17, avg: 1.15 (886 samples) -- 10.02 seconds range min: 0, max: 18, avg: 0.88 (906 samples) -- 10.01 seconds range min: 0, max: 11, avg: 0.61 (928 samples) -- 10.00 seconds range min: 0, max: 12, avg: 0.55 (936 samples) -- 10.01 seconds range min: 0, max: 9, avg: 0.51 (937 samples) -- 10.01 seconds range
Hier kann man gut sehen, dass die Probleme mit einem Abstand von 60 Sekunden auftreten. Dies lag in dem Fall daran, dass Redis alle 60s sich selber auf die Festplatte persistiert hat. Die entsprechende Option in den redis.conf lautete:
save 60 1000
und mit der Option
save ""
kann das persistieren auf der Festplatte ausgeschaltet werden.
Aber auch die Option
appendonly yes
musste auf „no“ gesetzt werden, weil es dadurch auch auf zu viele Schreibzugriffe kam.
Um die Zahlung mit Bitcoins zu testen ohne zahlungspflichtige Transaktionen auszulösen, muss man sich einen Wallet besorgen, bei dem man auch Test-Bitcoins (TestNet Bitcoins) senden kan:
Dort kann man sich ein Wallet einrichten in der Testwährung und erhält dann eine Bitcoin-Adresse aus dem TestNet, die alle mit „m“, z.B. mqfc7CVvhSD2eGVwkHS8s8Wc1FyZz8Z8xD
Auf dieses Konto kann man sich dann Bitcoins aufladen lassen auf der Webseite:
Danach kann man testen Zhalungen zu empfangen und zu senden und das Ergebnis auf der TestNet Blockchain verfolgen:
Normalerweise soll man das Datenbank Connection Timeout in PHP auslesen können mittels:
$pdo = new PDO('mysql:host=localhost;port=80;dbname=xxx', 'xxx', 'xxxx'); $pdo->getAttribute(PDO::ATTR_TIMEOUT);
Allerdings gibt das bei meiner alten PDO Version die Fehlermeldung:
SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
Also habe ich ein Testscript geschrieben, mit dem man das Timeout provozieren kann (das Messen der Zeit ist nicht enthalten, wäre nett, wenn jemand das posten könnte):
$pdo = new PDO('mysql:host=localhost;port=80;dbname=xxx', 'xxx', 'xxxx');
Damit wird das Timeout ausgelöst.
Um das Timeout zu verlängern, kann man den Parameter PDO::ATTR_TIMEOUT setzen:
$pdo = new PDO('mysql:host=localhost;port=80;dbname=xxx', 'xxx', 'xxxx', array( PDO::ATTR_TIMEOUT => 5 ));
Wenn man einen Cluster von Severn administrieren muss, hilft es sehr, wenn man Befehler „in einem Rutsch“ auf allen Mitgliedern des Clusters ausführen kann mit Hilfe eines einzigen Konsolen Befehls.
Wenn man z.B. den Befehl: apt-get update ausführen will auf 3 Servern, kann man folgendes Script benutzen (Dateiname ist „each“ und auf dem Master abzulegen):
#!/bin/bash echo -e "\nServer1:" ssh serverName1$* echo -e "\nnServer2:" ssh serverName2$* echo -e "\nnServer3:" ssh serverName3$*
Der Aufruf erfolgt folgender Maßen auf der Konsole:
each "apt-get update"
Das Skript verbindet sich dann per SSH auf die Server und führt auf jedem den Befehl apt-get update aus und zeigt das Ergebnis der Operation auf der Konsole an. Vorrausetzung ist, dass die Server ohne Passwort Zugriff aufeinander haben, was in einem Cluster der Fall sein sollte. Der Befehl sollte vom Master des Clusters aus ausgeführt werden.
MySQL eigener Variablen in Query verwenden
Es ist sehr einfach möglich in MYSQL Variablen zu verwenden für MySQL Statements. Diese müssen definiert werden mit der SET Funktion und dem @-Prefix:
SET @a= 'a';
Und kann dann benutzt werden für die Dauer der DB-Session:
UPDATE my_table SET x = @a WHERE y = @a;
History für MySQL Tabelle anlegen
Wenn man loggen will, wer wann und welche Änderungen an einer Tabelle „tabelle1“ gemacht hat, sollte man sich eine Tabelle namens „tabelle1_history“ und automatisch per MySQL Trigger auf Update und Delete Ereignisse reagieren:
Hinweis: __XYZ__ Platzhalter sind zu ersetzen
Trigger auf Update Aktionen
CREATE DEFINER=`__USER__`@`%` TRIGGER `__DB__`.`__TRIGGER_NAME_DEL__` BEFORE DELETE ON `__DB__`.`__TABLE__` FOR EACH ROW BEGIN insert into __DB__.__TABLE_HISTORY__ ( dataset_id, my_data1 my_data2 created_on created_by ) VALUES ( OLD.id, OLD.my_data1 OLD.my_data2 OLD.created_on, OLD.created_by );
Trigger auf Delete Aktionen
CREATE DEFINER=`__USER__`@`%` TRIGGER `__DB__`.`__TRIGGER_NAME_UPDATE__` BEFORE UPDATE ON `__DB__`.`__TABLE__` FOR EACH ROW BEGIN insert into __DB__.__TABLE_HISTORY__ ( dataset_id, my_data1 my_data2 created_on created_by ) VALUES ( OLD.id, OLD.my_data1 OLD.my_data2 OLD.created_on, OLD.created_by );
Wenn man eine Seite lokal mit einem Werbserver wie Apache entwicklen will und die URL-Struktur Einfluss auf die Funktonsweise der Webseite hat, empfielt es sich Virtual Hosts einzurichten. Damit kann die Seite im Browser unter der späteren URL wie sebastianviereck.de erreichbar gemacht werden, obwohl Sie für andere noch nicht Online ist oder man die Domain noch nicht besitzt.
Normalerweise ruft man lokale Webseiten mit der URL wie:
http://localhost/sebastianviereck/
auf.
Wenn man stattdessen lieber die URL
http://sebastianviereck.local/
aurufen will, muss man einfach folgendes machen:
1. Die Datei
bei Windows xampp\apache\conf\extra\ httpd-vhosts.conf
bei MAC /Applications/XAMPP/xamppfiles/apache2/conf/httpd.conf
ändern:
<Directory /xampp/htdocs > Order Allow,Deny Allow from all </Directory> NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "/xampp/htdocs" ServerName localhost </VirtualHost> <VirtualHost *:80> DocumentRoot "/xampp/htdocs/sebastianviereck" ServerName sebastianviereck.local </VirtualHost>
2. Die Datei
bei Windows: C:\Windows\System32\drivers\etc\hosts
bei MAC /private/etc/hosts
ändern:
127.0.0.1 sebastianviereck.local 127.0.0.1 localhost #damit localhost noch funktioniert, am Ende einfügen
3. Apache neu starten.
4. Im Browser erscheint dann bei der Eingabe von sebastianviereck.local die eigene lokale Webseite.