Bitkorn Blog https://blog.bitkorn.de Developer Zeugz Tue, 27 Jun 2023 09:16:55 +0000 de-DE hourly 1 https://wordpress.org/?v=6.3.1 TypeScript Zeug https://blog.bitkorn.de/typescript-zeug/ Tue, 27 Jun 2023 09:16:55 +0000 https://blog.bitkorn.de/?p=1234 Sie heißen Indexsignatur und ich verwende sie für Assoc Arrays aus PHP.

export class Assoc {
  [index: string]: string;
}

www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures

]]>
error NG8001: ‚ion-xyz‘ is not a known element https://blog.bitkorn.de/error-ng8001-ion-xyz-is-not-a-known-element/ Fri, 12 May 2023 10:42:44 +0000 https://blog.bitkorn.de/?p=1229 Mark Directory as => Cancel Exclusion Jetzt funktioniert die […]]]> Mit der IntelliJ (WebStorm, PhpStorm) kann man Ordner als „excluded“ markieren. Das hat auch Einfluss auf die Kompilierung der Ionic/angular/TypeScript App.

Wenn der Ordner „node_modules“ als „excluded“ gekennzeichnet ist, wird bei der Kompilierung nichts aus diesem Ordner gefunden.

Also, rechte Maus auf den Ordner und => Mark Directory as => Cancel Exclusion
Jetzt funktioniert die Kompilierung und auch im Code wird nicht gemeckert, dass was fehlt.

]]>
Tastenkombinationen https://blog.bitkorn.de/tastenkombinationen/ Wed, 08 Mar 2023 09:56:25 +0000 https://blog.bitkorn.de/?p=1220 Durchmesser AltGr + Shift + O

]]>
PHP Kompatibilität Check https://blog.bitkorn.de/php-kompatibilitaet-check/ Fri, 13 Jan 2023 06:46:39 +0000 https://blog.bitkorn.de/?p=1198 PHPCompatibility

PHPCSStandards/composer-installer

…mit composer global installieren.

Damit das globale Composer Zeug komfortabel in der Bash funktioniert, Folgendes in die ~/.profile

# composer global packages
if [ -d "$HOME/.config/composer/vendor/bin" ] ; then
    export PATH="$HOME/.config/composer/vendor/bin:$PATH"
fi

Konfiguration

PHP_CodeSniffer/wiki/Configuration-Options
…im Terminal z.B. (severity=5 macht ne riesige Ausgabe – mit lauter „nice to have“ Zeug):

phpcs --config-set severity 6

…steht dann in ~/.config/composer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf
…wo man die Werte auch manuell ändern kann.

run

Dann kann man beliebige Projekte auf Kompatibilität prüfen:

phpcs -p /var/www/html/myPhpProject/

…oder, die Ausgabe in eine Datei schreiben, falls sie zu lang ist:

phpcs -p /var/www/html/myPhpProject/ > ~/Downloads/myPhpProjectSniffer8-1
]]>
ESP8266 ESP32 Zeug https://blog.bitkorn.de/esp8266-esp32-zeug/ Mon, 26 Dec 2022 09:15:36 +0000 https://blog.bitkorn.de/?p=1179 NMCUV3 (ESP8266)

mit lsusb findet man das Ding als QinHeng Electronics CH340 serial converter

Ganze Zeile von lsusb:

Bus 001 Device 013: ID 1a86:7523 QinHeng Electronics CH340 serial converter

Folgendes sollte u.a. etwas wie „ttyUSB0“ bringen (bei meinem ESP32 zeigt es das; beim ESP8266 nicht und auch keine andere Bezeichnung ist zusätzlich da):

ls /dev/tty*

dmesg: Print or control the kernel ring buffer

sudo dmesg | grep ttyS
    [0.549119] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

…das Ergebnis wirft nur das eine (ttyS0).

ESPTool

Das esptool findet man im ESP8266_RTOS_SDK und muss es vor der Benutzung installieren.
Oder man installiert es mit pip, wie es in der README.md steht.

python -m pip install esptool

Damit checkt man z.B. die USB Geräte:

esptool.py read_flash_status
    esptool.py v4.4
    Found 1 serial ports
    Serial port /dev/ttyS0
    /dev/ttyS0 failed to connect: Could not open /dev/ttyS0, the port doesn't exist
    A fatal error occurred: Could not connect to an Espressif device on any of the 1 available serial ports.

Espressif Dokumentation zum esptool

]]>
Python zeug https://blog.bitkorn.de/python-zeug/ Sun, 25 Dec 2022 16:18:58 +0000 https://blog.bitkorn.de/?p=1175 Der Befehl python ist nicht nach der Installation vorhanden.

Folgendes reicht nicht in jedem Fall aus. In die ~/.bashrc einen Alias setzen.

alias python=python3
sudo apt install python-is-python3
]]>
IntelliJ Zeug https://blog.bitkorn.de/intellij-zeug/ Sun, 18 Dec 2022 15:29:01 +0000 https://blog.bitkorn.de/?p=1170 Editor => Code Style => Hard wrap at: 150 columns ‚usage‘ code hint Settings => Editor => Inlay Hints => Code Vision => Usages]]> Hard Wrap

Den Hard Wrap (rechter senkrechter Strich im Code Fenster) einstellen oder aus machen: Settings => Editor => Code Style => Hard wrap at: 150 columns

‚usage‘ code hint

Settings => Editor => Inlay Hints => Code Vision => Usages

]]>
Hardware Infos https://blog.bitkorn.de/linux-hardware-infos-terminal/ Fri, 22 Apr 2022 05:56:17 +0000 https://blog.bitkorn.de/?p=1144 # CPU lscpu # Hardware Liste (als root mehr Infos) lshw sudo lshw -short # Hardware Informationen ausführlich hwinfo hwinfo --short # PCI lspci # USB lsusb ]]> hierarchical list recursively with level https://blog.bitkorn.de/postgresql-hierarchical-list-recursively-with-level/ Fri, 08 Apr 2022 04:28:47 +0000 https://blog.bitkorn.de/?p=1140 Z.B. eine hierarchisch verschachtelte Produkt Stückliste kann man prima mit PostgreSQL abfragen.

WITH RECURSIVE product_hierarchy AS (
    SELECT product_list_uuid,
        product_uuid_parent,
        product_uuid,
        product_list_order_priority,
        0 AS level,
        product_uuid AS breadcrumb
    FROM product_list
    WHERE product_uuid_parent = p_product_uuid
    UNION
    SELECT pl.product_list_uuid,
        pl.product_uuid_parent,
        pl.product_uuid,
        pl.product_list_order_priority,
        ph.level + 1,
        ph.breadcrumb || ' => ' || pl.product_uuid
    FROM product_list pl
          INNER JOIN product_hierarchy ph ON ph.product_uuid = pl.product_uuid_parent
    )
SELECT * FROM product_hierarchy ORDER BY product_list_order_priority DESC;
]]>
eine Stückliste rekursiv anzeigen https://blog.bitkorn.de/eine-stueckliste-rekursiv-anzeigen/ Sun, 13 Mar 2022 06:56:03 +0000 https://blog.bitkorn.de/?p=1127 Ein sehr schönes Anti Pattern 😉
Hier wird alles vermischt: HTML, CSS und PHP Ausgabe und Business Logik. Von diesem Code kann man Nichts wiederverwenden. Soll es in der Software einheitliche Farben geben und eine Farbe ändert sich, möchte kein Auftraggeber das bezahlen.
Am lustigsten finde ich, dass hier so etwas wie eine Artikel-Kalkulation mittendrin eingebaut ist. OK, wenn man sie sonst nirgends verwenden möchte ;).
Die Funktion $Kalkulation->loadELEMENT() macht nämlich genau Eins …eine Reihe aus der Datenbank holen. Das muss man mal sacken lassen: den Einzeiler „SELECT * FROM …“ lagert man aus und die komplizierte Logik klebt man in den bunten Haufen Code rein :).

    public function listELEMENT($arid, $prefix = "")
    {
        $DB = new DB_MySQLi();
        $DBi = new DB_MySQLi();
        $Artikel = new Artikel();
        $now = time();
        $DB->query("SELECT al.*, func_get_artikel_ag_zeit_sum(al.von_arid) as manpower FROM artikel_liste al WHERE al.zu_arid= $arid and al.gueltig_bis > $now order by al.position");
        $i = 1;
        if (!empty($prefix)) {
            echo '<div id="toggle' . $arid . '" class="toggle_me" style="display:none;">'; // auf zu klapp DIV
        }
        $summeSk = 0;
        while ($Feld = $DB->fetchRow()) {
            $Artikel->loadELEMENT($Feld['von_arid']);
            $arid = $Artikel->artikeldaten['arid'];
            if (!empty($Artikel->artikelextradaten["zeichnung_datei"])) {
                $Zeichnung = '<a target="_blank" href="../Zeichnungen/' . $Feld["von_arid"] . '_EXTRAS_' . $Artikel->artikelextradaten["zeichnung_datei"] . '">' . $Artikel->artikelextradaten["zeichnung"] . '</a>';
            } else {
                $Zeichnung = $Artikel->artikelextradaten["zeichnung"];
            }
            if ($Artikel->artikeldaten["status"] == "Freigegeben") {
                $Farbe = "#FFFFFF";
            } else {
                $Farbe = "#FF0000";
            }
            if ($Artikel->existSTL()) {
                $BauGruppen_Farbe = "#99CCFF";
                $toggleHtml01 = '<div id="' . $Artikel->artikeldaten["arid"] . '" data-nr="' . $arid . '" class="toggle" style="cursor: pointer; padding:4px;">'; // auf zu klapp Button
                $toggleHtml02 = '<div>'; // auf zu klapp Button
                $kurze_benennung = '<a target="_top" href="../Stueckliste.php?arid=' . $arid . '">' . $Artikel->artikeldaten["kurze_benennung"] . '</a>';
            } else {
                $BauGruppen_Farbe = "#99FF99";
                $toggleHtml01 = '';
                $toggleHtml02 = '';
                $kurze_benennung = '<font color="#FFFFFF">' . $Artikel->artikeldaten["kurze_benennung"] . '</font>';
            }

            echo '<table border="0" width="98%" cellspacing="1">';

            echo '<tr>';
            echo '<td rowspan="2" align="center" width="30" style="background-color: #143455" title="' . $Feld['stkid'] . ';' . $Feld['stckl_depth'] . '">'
                . '<b><font color="#FFFFFF">' . $prefix . $i . '</font></b>'
                . '</td>';
            echo '<td rowspan="2" align="center" width="30" style="background-color: ' . $BauGruppen_Farbe . '" title="' . $arid . '">' . $toggleHtml01;
            echo '<strong>' . $Feld['anzahl'] . '</strong>' . $toggleHtml02 . '</td>';
            echo '<td colspan="6" style="background-color: #808080">';

            echo '<table border="0" width="100%" cellspacing="0" cellpadding="0">';
            echo '<tr>';
            echo '<td width="148" style="background-color: #808080" align="right"><b><font color="' . $Farbe . '">'
                . '<a href="' . APP_ROOT_URL . '/Artikel/Artikel_edit.php?arid=' . $Artikel->artikeldaten['arid'] . '" target="_blank" style="color: ' . $Farbe . '">'
                . $Artikel->artikeldaten["a_nummer"]
                . '</a>'
                . '</font></b></td>';
            echo '<td style="background-color: #808080">&nbsp;<b>' . $kurze_benennung . '</b></td>';

            $Kalkulation = new Kalkulation();
            $Arbeitsplan = new Arbeitsplan();
            setlocale(LC_MONETARY, 'de_DE');
            $Kalkulation->loadELEMENT($Artikel->artikeldaten["arid"]);
            $calc = $calcDate = '';
            if (!empty($Kalkulation->daten)) { // Kalkulation ausschalten
                $MKn = $Kalkulation->daten["summe_materialkosten_stkl"];
                $MKb = $MKn + (($MKn / 100) * $Kalkulation->daten["zuschlag_mgk"]);
                $AKen = $Kalkulation->daten["summe_arbeitskosten_extern_stkl"];
                $AKn = $Kalkulation->daten["summe_arbeitskosten_stkl"];
                $AKb = $AKn + (($AKn / 100) * $Kalkulation->daten['zuschlag_fgk']) + (($AKen / 100) * $Kalkulation->daten['zuschlag_ext']);

                $HKb = $AKb + $MKb;
                $VVGKzuschlag = ($HKb / 100) * $Kalkulation->daten['zuschlag_vvgk'];
                $SKb = ($HKb + $VVGKzuschlag) * (float)$Feld['anzahl'];
                $calc = 'MatK:<strong>' . number_format($MKn, 2, ',', '.')
                    . '</strong>; ArbK:<strong>' . number_format($AKn, 2, ',', '.')
                    . '</strong>; SK:<strong>' . number_format($SKb, 2, ',', '.') . '</strong>';
                $calcDate = date('d.m.Y', $Kalkulation->daten['datum']);
            }
            $summeSk += $SKb * $Feld["anzahl"];
            echo '<td style="background-color: #808080; text-align: left; color: #fff; width: 300px;" title="Datum der Kalkulation: ' . $calcDate . '">' . $calc . " - $calcDate" . '</td>';
            echo '<td width="130" align="center" style="background-color: #808080" colspan="1"><b><font color="#FFFFFF">' . $Artikel->artikeldaten["a_art"] . '</font></b></td>';
            echo '</tr>';
            echo '</table>';
            echo '</td>';
            echo '<td rowspan="2" align="center" width="40" class="stl_c">'
                . '<a href="edit.php?stkid=' . $Feld["stkid"] . '" target="unten">Edit</a>'
                . '</td>';
            echo '</tr>';
            echo '<tr>';

            echo '<td width="150">Ma&szlig;: ' . $Artikel->artikeldaten['lange_benennung'] . '</td>';
            echo '<td width="150" title="Summe aller Minuten der Arbeitsgänge">AG Minuten: ' . floor($Feld['manpower']) . '</td>';
            echo '<td width="130">Gew. ME ' . $Artikel->artikeldaten['gewicht_netto'] . '</td>';
            echo '<td>Zg.:' . $Zeichnung . '</td>';
            echo '</tr>';
            echo '</table>';

            if ($Artikel->existSTL()) {
                echo '<table border="0" width="100%" cellspacing="0" cellpadding="0"><tr><td width="2%"></td><td>';
                $this->listELEMENT($Artikel->artikeldaten["arid"], $prefix . $i . ".");
                echo '</td></tr></table>';
            }
            echo "\n";
            $i++;
        }
        if (!empty($prefix)) {
            echo "</div>"; // auf zu klapp DIV
        }
        return $summeSk;
    }

In diesem Stückchen Code sieht man noch lauter weiteren Müll, auf den ich nicht weiter eingehen möchte.
Wenn wir aber von Code Wiederverwendung sprechen, sind wir schnell bei Modularität. Habe ich eine Software, die es mir erlaubt Dinge modular einzubauen, muss diese Software diverse Dinge erfüllen.
Die Trennung von Datenbank Abfragen, Business Logik, Ansicht Struktur, Ansicht Design und Schnittstelle nach Außen, etc. müssen getrennt sein. So etwas nennt man eine mehrschichtige Architektur. So kann man bei einer mehrschichtigen Architektur z.B. eine Business Logik unterschiedlich darstellen (als HTML Webseite oder PDF Dokument oder, oder, oder).
Hat man eine Software die so gebaut ist wie der obige Code, bleibt einem nichts Anderes übrig als alles komplett umzubauen. Das wäre höchst wahrscheinlich aufwändiger als alles neu zu entwerfen und neu zu implementieren. Oder man klebt immer mehr in diesen bunten Haufen Code rein, womit man sich einer Katastrophe Stück für Stück annähert.

]]>