Fehlermeldung

  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).
  • Notice: Only variables should be passed by reference in anzeige() (Zeile 22 von /WWWROOT/91127/htdocs/modules/php/php.module(80) : eval()'d code).

Test der PHP-Starseite Drupal 7


Das war los in Niederfrohna

FirebirdSql Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255.

Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
SQL error state =54001
Dynamic SQL Error.
Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255.

Dieser Fehler tritt auf, obwohl der EXECUTE BLOCK definitiv nur 250 Update Anweisungen enthält.

Was ich nicht bedacht hatte, war dass durch die Update-Anweisungen Trigger ausgelöst wurden …

Deshalb habe ich die Anzahl der Anweisungen im Execute-Block auf 60 begrenzt und der Fehler wird nicht mehr ausgelöst.

Delphi - Komponente - TNetHTTPClient und Sonderzeichen

Beim Zugriff auf die Keycloak-API zum Abruf eines Tokens kommt die Fehlermeldung 401 Not Authorized wenn das Passwort ein Sonderzeichen enthält.

In einer Python-Testumgebung kann der Token ohne Probleme abgerufen werden.

Mit Wireshark kann man sich die erzeugten Abfragen anzeigen (damit man in Wireshark die unverschlüsselten Daten angezeigt bekommt muss man zum Debuggen die URL von https:// auf http:// umstellen):

Python erzeugt:

POST /keycloak/rest/v1/token/generate HTTP/1.1
Host: demo.wlsoft.de
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Authorization: Basic xxxx:yyyyyyyyyyyyyyyy
Content-Length: 70

grant_type=password&username=xxxxx@xxxxxx.xx&password=123456789%C3%840

Delphi erzeugt

POST /keycloak/rest/v1/token/generate HTTP/1.1
Host: demo.wlsoft.de
User-Agent: Embarcadero URI Client/1.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Basic xxxx:yyyyyyyyyyyyyyyy
Content-Length: 70

grant_type=password&username=xxxxx@xxxxxx.xx&password=123456789%C3%840

Der Unterschied steckt im Content-Type

Python: Content-Type: application/x-www-form-urlencoded;
Delphi: Content-Type: application/x-www-form-urlencoded; charset=utf-8

Der falsche Eintrag in Delphi wird durch die Funktion THTTPClient.Cre­ateFormFromStrin­gs() erzeugt:

Deshalb darf bei Abruf eines Token nur eine Post-Anweisung aufgerufen werden, die CreateFormFrom­Strings() nicht aufruft.

Das wäre zum Beispiel ein solcher Aufruf:

function TNetHTTPClient.Post(
  const AURL: string;
  const ASource, AResponseContent: TStream;
  const AHeaders: TNetHeaders): IHTTPResponse;
type
  THCloudZugangsdaten = record
    User: string;
    Pass: string;
    Token:string;
    TokenResponseCode: integer;
    TokenResponseText: string;
  end;

function getToken(var aZugangsdaten: TZugangsdaten): boolean;
var
  s, aURL: string;
  j: TJSONObject;
  aSource: TStringStream;
  m: TMemoryStream;
  sl: TStringlist;
  Response: IHTTPResponse;
  HTTP: TNetHTTPClient;
  aHeaders: TNetHeaders;
begin
  Result := False;
  sl := TStringlist.Create;
  aSource := TStringStream.Create(
    'grant_type=password' +
    '&username=' + EncodeURIComponent(aZugangsdaten.User) +
    '&password=' + EncodeURIComponent(aZugangsdaten.Pass));
  m := TMemoryStream.Create;
  HTTP := TNetHTTPClient.Create(nil);
  try
    try
      HTTP.ContentType := cContentType_x_www_form_urlencoded;
      HTTP.AcceptEncoding := 'gzip, deflate';
      HTTP.CustomHeaders['Accept'] := '*/*';
      HTTP.CustomHeaders['Authorization'] := 'Basic xxxx:yyyyyyyyyyyyyyyy';
      aURL := 'https://demo.wlsoft.de/keycloak/rest/v1/token/generate';
      Response := HTTP.Post(aURL, aSource, m, aHeaders);
      if Response.StatusCode = 200 then begin
        m.Position := 0;
        sl.LoadFromStream(m);
        s := sl.Text;
        j := TJSONObject.ParseJSONValue(s) as TJSONObject;
        try
          if Assigned(j) then begin
            if j.TryGetValue('access_token', aZugangsdaten.Token) then begin
            end;
          end;
        finally
          FreeAndNil(j);
        end;
      end;
      aZugangsdaten.TokenResponseCode := Response.StatusCode;
      aZugangsdaten.TokenResponseText := Response.StatusText;
      Result := not aZugangsdaten.Token.IsEmpty;
    except
      on E: Exception do begin
        aZugangsdaten.TokenResponseCode := Response.StatusCode;
        aZugangsdaten.TokenResponseText := E.Message;
        // kein raise;
      end;
    end;
  finally
    m.Free;
    aSource.Free;
    FreeAndNil(sl);
    FreeNetHttp(HTTP);
  end;
end;

CLT 2021 - Chemnitzer Linuxtage 2021

Delphi 10.4.2 Sydney und der Edgebrowser

Aus Delphi heraus wird nicht der Edgebrowser angesprochen sonder das Tool WebView2.

Das hat den Vorteil, dass eventuelle Restriktionen die der Win-Admin für den Edgebrowser festgelegt hat, nicht für die Delphi-Anwendung gelten.

Installation beim Delphi – Programmierer

Installation beim Anwender

hplip - Auf Rechner X läuft wieder

Auf dem Rechner X lief ein Ubuntu 18.04 und das Multifunktionsgerät HP 8014 funktionierte sowohl als Drucker als auch als Scanner Nach einem do-release-upgrade auf Version Ubuntu 20.04 war der Drucker zwar noch benutzbar jedoch der Scanner nicht mehr.

  1. hplip-Paket von der Downloadseite manuell installiert
  2. hplip-Paket von der Downloadseite manuell destalliert
  3. hplip-Paket und hplip-gui-Paket aus den Paketquellen installiert.

Beim Start der hp-gui kam dann folgende Fehlermeldung:

HP Linux Imaging and Printing System (ver. 3.20.3)
HP Device Manager ver. 15.0

Copyright (c) 2001-15 HP Development Company, LP
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to distribute it
under certain conditions. See COPYING file for more details.

Traceback (most recent call last):
  File "/usr/bin/hp-toolbox", line 269, in <module>
    QApplication, ui_package = utils.import_dialog(ui_toolkit)
TypeError: 'NoneType' object is not iterable

Die Lösung brachte ein reinstall von libsane-hpaio

sudo apt-get install --reinstall -o Dpkg::Options::="--force-confmiss" libsane-hpaio

Thunderbird-Lightning-Kalender und der T-Online-Kalender

Literatur

Die Synchronisation vom Thunderbird-Kalender mit dem T-Online-Kalender lässt sich folgendermaßen einrichten:

default alt. text
  • Kontoname: ein beliebiger Name
  • Username: Die T-Online E-Mailadresse
  • Passwort: Das Passwort zum Einloggen bei T-Online (also nicht das E-Mail-Passwort)
  • Cal-DAV Serveradresse: die folgende Adresse (%deine@t-onlinede-E-mail-Adresse% natürlich ersetzt durch die richtige E-Mail-Adresse)
https://spica.t-online.de/spica-calendar/caldav/principals/%deine@t-onlinede-E-mail-Adresse%/calendars/USER_CALENDAR-MAIN/
  • Card-DAV Serveradresse: habe ich leer gelassen
default alt. text default alt. text
  • Die Kalender auswählen, die synchronisiert werden sollen, dann synchronisieren
default alt. text

ACHTUNG Wenn man im Thunderbird-Kalender einen Termin im T-Online-Kalender einträgt, ist dieser nach dem Speichern im Thunderbird-Kalender nicht sofort sichtbar, sondern erst wenn man den Kalender synchronisiert hat.

Vaio VGN-CR11Z/R WLAN

$ lspci | grep -i net
02:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)

Wireless WiFi Link 4965AGN Für die Wireless WiFi Link 4965AGN wir das Modul iwl4965 (im Standard-Kernel enthalten).benutzt.

$ sudo modprobe iwl4965
$ rfkill
ID TYPE DEVICE      SOFT    HARD
 0 wlan phy0   unblocked blocked

Lösung

  • Den WLAN-Schalter einschalten (Linke Seite vorn)
default alt. text

Literatur

TheBat! Makro für Anrede

Ich möchte in TheBat! in den E-Mails entweder die Anrede aus dem Adressbuch-Feld NamePrefix (zu finden unter Privat Anrede) oder abhängig vom Geschlecht festlegen: Das funktioniert mit folgendem Makro

%IF:"%ABToNamePrefix"<>"":"%ABToNamePrefix":""%-
%IF:"%ABToNamePrefix%ABToGender"="0":"Sehr geehrte Damen und Herren,":""%-
%IF:"%ABToNamePrefix%ABToGender"="1":"Sehr geehrter Herr %ABToLastName,":""%-
%IF:"%ABToNamePrefix%ABToGender"="2":"Sehr geehrte Frau %ABToLastName,":""%-
Tags: 

Neuen Sensor am MQTT einrichten

Anzeige aller Sensoren, die am Mosquitto angeschlossen sind: (IP-Adresse des BBB 192.168.80.106)

$ mosquitto_sub -h 192.168.80.106 -v -t /#
/Sensor/3B1B3A {"ID": "3B1B3A", "TI": 25.48, "L": 98875.38, "F": 43.48, "T": 21.75}

Im Python Programm für paho den Sensor eintragen

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe('/Sensor/3B1B3A')