<?xml version="1.0" encoding="UTF-8"?><!-- buildBlog(Normal_0)-->
<!-- CmsBlog::Modul[Blog.5.0] // Feed XML // --><?xml-stylesheet type="text/xsl" href="/api/xsl/atom/"?>
<!--
Copyright Information 
__________________________

All rights reserved, especially the right to reproduction, the right to distribution and right to translation. No part of this website may be reproduced, and/or processed and distributed by using electronic systems and other means in any form without the written consent of Mr. Stastka. This explicitly applies also for all pictures and videos on this website. True Link for more Information: http://www.stastka.ch/impressum/ 
(c)2000 D. Stastka/Zürich  email: webmaster 'at' stastka.ch 
 
-->
<feed xmlns="http://www.w3.org/2005/Atom">
<author>
<name>Copyright 2011, Zurich Dany Stastka</name>
<email>blog@stastka.ch</email>
<uri>https://stastka.ch</uri>
</author>
<generator  version="2.0">komorebiCMS v5.0.1</generator>
<title>Projekte und Tutorials</title>
<logo>https://stastka.ch/_cdn/v10/img/icon/80x80/icon_logo.png</logo>
<subtitle>Verschiedenes von mir</subtitle>
<id>urn:uuid:6d92fe04-5e54-0648-e086-374ed5447d6c</id>
<rights>Copyright 2011, Zurich Dany Stastka</rights>
<updated>2026-04-22T17:00:00Z</updated>
<link rel="self" href="https://stastka.ch/knowledge-base/feed/atom" type="application/rss+xml"/>
<entry>
<title>Wadoku: Neu mit Eingabehilfe von Radikalen, Handschrifterkennung oder Kanaliste</title>
<link href="https://stastka.ch/knowledge-base/Wadoku-Deutsch-Japanisch-mit-Eingabehilfe/story/f097393f"/>
<id>urn:uuid:3cb06cea-6162-26b0-b627-f66d168105a8</id>
<updated>2025-02-20T23:10:21Z</updated>
<summary type="html"><p><img class="blog" title="Wadoku 0.99" src="https://stastka.ch/_media/cms/library/csharp/wadoku-0-9-9-helper.png"></p>
<p>Ich habe mein eigenes Wadoku-Wörterbuch-Interface mit dem Januar-2025-Update aktualisiert. Die Datenbank enthält nun 433.218 Einträge. Neu hinzugekommen ist die Möglichkeit, Kanji entweder über Radikale oder durch Zeichnen zu suchen. Kana können entweder direkt über das WanaKana Script konvertiert werden oder über die Kanaliste eingefügt werden.</p></summary>
<content type="html">Full:<p>Ich habe mein eigenes Wadoku-Wörterbuch-Interface mit dem Januar-2025-Update aktualisiert. Die Datenbank enthält nun 433.218 Einträge. Neu hinzugekommen ist die Möglichkeit, Kanji entweder über Radikale oder durch Zeichnen zu suchen. Kana können entweder direkt über das WanaKana Script konvertiert werden oder über die Kanaliste eingefügt werden.</p>
<h2>Eingabeunterstützung</h2>
<p>Die Grundformen können jeweils über den Schalter Hiragana oder Katakana direkt in der Eingabe umgewandelt werden oder man nimmer das Kana-Menü.</p>
<h3>Suche nach Radikalen</h3>
<div class="te700"><img title="Wadoku: Suche nach Radikalen" src="/_media/cms/library/csharp/wadoku-0-9-9-radi.png" /></div>
<p class="te700">Kanji haben wiederkehrende Elemente.So kann mann ein Kanji in kleine Bestandteile zerlegen und diese wiederum in Gruoppen zusammenfassen. Um es übersichtlicher zu gestalten wurden die nach Anzahl Linien Sortiert.Die <strong>roten Linien</strong> beziehen sich auf die <strong>Position inerhalb des Kanji</strong>. Radikale mit einem <strong>roten Hintergrundfarbe</strong> sind <strong>wichtig Elemente</strong>. Nach der Auswahl werden die Radiakle schwarz die keine Kombination ermöglichen und somit nicht mehr wählbar sind. Die Basis wurde das <a href="http://www.edrdg.org/krad/kradinf.html" target="_blank" rel="noopener">Kradkfile</a> genommen und in einer Datenbank hinterlegt. </p>
<h3 class="te700">Kanji zeichnen (Erkennung von Handschriften)</h3>
<div class="te700"><img title="Wadoku: Kanji Zeichnen" src="/_media/cms/library/csharp/wadoku-0-9-9-cava.png" /></div>
<div class="te700">Die Opensource Bibliothek <a href="https://github.com/asdfjkl/kanjicanvas" target="_blank" rel="noopener">Kanji Canvas</a> kann Strichfolge und Strichzahl mittels Handschrifterkennung suchen. </div>
<h3>Kana (Hiragana und Katakana)</h3>
<div class="te700"><img title="Wadoku: WanaKana" src="/_media/cms/library/csharp/wadoku-0-9-9-wanakana.png" /></div>
<div class="te700">Eine Liste aller Kana die in kleinen Gruppen unterteilt sind. Eine andere Möglichkeit besteht darin die <a href="https://github.com/WaniKani/WanaKana" target="_blank" rel="noopener">WanaKana</a> Bibliothek zu aktivieren damit die westlichen Buchstaben in Kana konvertiert werden. Leider gibt es dort noch einen Bug wenn man ein Kanji um Kana mischt.</div>
<h2 class="te700">Bugfix</h2>
<div class="te700">Es wurden wiederum einige Fehler behoben und die Mobileansicht optimiert. </div>
<div class="te700"> </div>
<div class="te700">Ich hoffe es hilft euch beim Lernen und wünsche euch viel Spass beim suchen von Japanischen Ausdrücke: <a href="https://stastka.ch/app/dictionary/ger-jpn-wadoku/">Link: Wadoku 0.99</a></div>
<h2>XML-Update</h2>
<p>Die Datenbank wurde mit dem XML-Dump vom 05. Januar 2025 aktualisiert; daraus resultiert neu:</p>
<ul>
<li>Einträge:  433'218  (+3'615 )</li>
<li>Grammatikangaben (gramgrp):  300'247  (+4'712)</li>
<li>Schreibungen (orth): 730'289 (+ 8'106)</li>
<li>Querreferenz (Ref): 281'947 (+ 2'322 )</li>
<li>Weiterführende Einträge (Ruigos):  141'003 (+8'174 )</li>
<li>Herkunft eines Wortes (Etyn):  83'354 (+ 2'612)</li>
</ul></content>
</entry>
<entry>
<title>Lyrion Music Server / Logitech Media Server STOP Playing</title>
<link href="https://stastka.ch/knowledge-base/Lyrion-Music-Server-Logitech-Media-Server-STOP-Playing/story/19f49c0a"/>
<id>urn:uuid:9eb8de11-b0b2-55dc-8b82-bfc4e5c03ffd</id>
<updated>2024-06-03T01:07:06Z</updated>
<summary type="html"><p>Ich habe seit ein paar Jahren den Logitech Media Server (LMS), auch bekannt als Lyrion Music Server, bei mir in Betrieb. Diese Applikation wurde in Perl geschrieben und funktioniert über Docker sehr stabil. Der LMS bietet neben einem Web-Interface auch Remote-Apps für Android an, sodass man von verschiedenen Geräten auf die Musikbibliothek zugreifen kann. Darüber hinaus bietet der Server eine direkte Schnittstelle per Telnet/CLI (Port 9090) sowie eine Schnittstelle über eine JSON-RPC 1.0 API over HTTP.</p>
<p>Diese Schnittstellen sind äusserst nützlich für verschiedene Automatisierungsaufgaben. Beispielsweise kann man die JSON-RPC API über Powershell oder Bash-Skripte nutzen, um bestimmte Aktionen auszuführen oder Statusinformationen abzufragen. Dies eröffnet vielfältige Möglichkeiten, den LMS nahtlos in bestehende Heimautomatisierungssysteme zu integrieren oder benutzerdefinierte Steuerungsmechanismen zu entwickeln.</p>
<p>Um diese Automatisierungen erfolgreich durchzuführen, ist es wichtig, die MAC-Adresse oder die ID des Gerätes zu kennen, mit dem man interagieren möchte. Diese Informationen werden benötigt, um spezifische Geräte innerhalb des Netzwerks eindeutig zu identifizieren und entsprechende Befehle an sie zu senden.</p></summary>
<content type="html">Full:<div class="te700">
<p>Ich habe seit ein paar Jahren den Logitech Media Server (LMS), auch bekannt als Lyrion Music Server, bei mir in Betrieb. Diese Applikation wurde in Perl geschrieben und funktioniert über Docker sehr stabil. Der LMS bietet neben einem Web-Interface auch Remote-Apps für Android an, sodass man von verschiedenen Geräten auf die Musikbibliothek zugreifen kann. Darüber hinaus bietet der Server eine direkte Schnittstelle per Telnet/CLI (Port 9090) sowie eine Schnittstelle über eine JSON-RPC 1.0 API over HTTP.</p>
<p>Diese Schnittstellen sind äusserst nützlich für verschiedene Automatisierungsaufgaben. Beispielsweise kann man die JSON-RPC API über Powershell oder Bash-Skripte nutzen, um bestimmte Aktionen auszuführen oder Statusinformationen abzufragen. Dies eröffnet vielfältige Möglichkeiten, den LMS nahtlos in bestehende Heimautomatisierungssysteme zu integrieren oder benutzerdefinierte Steuerungsmechanismen zu entwickeln.</p>
<p>Um diese Automatisierungen erfolgreich durchzuführen, ist es wichtig, die MAC-Adresse oder die ID des Gerätes zu kennen, mit dem man interagieren möchte. Diese Informationen werden benötigt, um spezifische Geräte innerhalb des Netzwerks eindeutig zu identifizieren und entsprechende Befehle an sie zu senden.</p>
</div>
<div class="te700">Ich habe für mich nun die Anfoderung aufgestellt das ich für einen bestimmten Zeitraum einen Client automatisch abschalte der aktuelle am abspielen von Musik oder Hörspiel ist. Das Script benötigt neben curl noch das JSON Hilfsprogramm jq. Das Letztere musst ich über opkg auf meinem Synology NAS nachinstallieren.</div>
<div class="te700"> </div>
<div class="te700">
<pre class="language-bash"><code>/bin/bash
LMSSERVER="192.168.0.100"
LMSPORT="9000"
DT=$(date '+%Y-%m-%d %H:%M:%S')

check_player ()
{
PLAYERMACADDR_X=$1

status=$(curl -g -X POST -d '{"method":"slim.request","params":["'$PLAYERMACADDR_X'",["'status'","-",1]]}' http://$LMSSERVER:$LMSPORT/jsonrpc.js 2#&gt;/dev/null |jq -r ".result.mode")
player_name=$(curl -g -X POST -d '{"method":"slim.request","params":["'$PLAYERMACADDR_X'",["'status'","-",1]]}' http://$LMSSERVER:$LMSPORT/jsonrpc.js 2#&gt;/dev/null |jq -r ".result.player_name")

if [[ "$status" == "stop" ]]; then
   echo "$DT $player_name - OK, nothing to do"
elif [[ "$status" == "play" ]]; then
   echo "$DT $player_name - NOW stopping"

LMSACTION=$(curl -g -X POST -d '{"method":"slim.request","params":["'$PLAYERMACADDR_X'",["'power'","0"]]}' http://$LMSSERVER:$LMSPORT/jsonrpc.js 2#&gt;/dev/null)

fi

echo "$DT $player_name - status: $status"
}

check_player "00:04:20:2b:ff:41"
check_player "00:04:20:2a:42:24"
check_player "00:04:20:2d:43:11"</code></pre>
</div>
<p>[#f]prism|null[/#f]</p>
<p>Eine Referenz der API ist auf jedem LMS Server zu finden: </p>
<pre class="language-bash"><code>https://[IP]/html/docs/cli-api.html</code></pre>
<p>Quelle LMS: </p>
<ul>
<li><a href="https://github.com/elParaguayo/LMS-CLI-Documentation/blob/master/LMS-CLI.md">https://github.com/elParaguayo/LMS-CLI-Documentation/blob/master/LMS-CLI.md</a></li>
<li><a href="https://lyrion.org">https://lyrion.org</a></li>
</ul></content>
</entry>
<entry>
<title>FontForge: Firefox Konsole Error: downloadable font: maxp: Bad maxZones: 0 beheben</title>
<link href="https://stastka.ch/knowledge-base/FontForge-downloadable-font--maxp--Bad-maxZones--0/story/e03a4455"/>
<id>urn:uuid:9d40a704-0f30-a611-9aac-82bca6aa9a54</id>
<updated>2024-05-20T03:50:02Z</updated>
<summary type="html"><p><img class="blog" title="FontForge" src="https://stastka.ch/_media/cms/library/tools/font-forge.jpg" alt="Opensource Schrift bearbeiten"></p>
<p>Vor 4 Jahren habe ich mir Schriften im Web, songenannten Webfonts genauer angeschaut und mir eine eigene Schrift erstellt. Mit dem OpenSource Tools FontForge ist das relative einfach. Es unterstützt eine Vielzahl von Schriftformaten, darunter TrueType (TTF), OpenType (OTF), PostScript (PS), und Web Open Font Format (WOFF). Es bietet umfangreiche Funktionen zur Gestaltung und Bearbeitung von Glyphen, zur Erzeugung und Bearbeitung von Kerning-Paaren sowie zur Anpassung von Schriftmetrik und anderen Schrifteigenschaften.</p>
<p>Was mich wundere das ich jeweils in der Konsole eine Fehlermeldung des Browser vorfand: </p>
<p><span style="color: #f1c40f;">downloadable font: maxp: Bad maxZones: 0 (font-family: "myfont" style:normal weight:300 stretch:100 src index:1) source: https://....</span></p>
<p> </p></summary>
<content type="html">Full:<div class="te700">
<p>Vor 4 Jahren habe ich mir Schriften im Web, songenannten Webfonts genauer angeschaut und mir eine eigene Schrift erstellt. Mit dem OpenSource Tools FontForge ist das relative einfach. Es unterstützt eine Vielzahl von Schriftformaten, darunter TrueType (TTF), OpenType (OTF), PostScript (PS), und Web Open Font Format (WOFF). Es bietet umfangreiche Funktionen zur Gestaltung und Bearbeitung von Glyphen, zur Erzeugung und Bearbeitung von Kerning-Paaren sowie zur Anpassung von Schriftmetrik und anderen Schrifteigenschaften.</p>
<p>Was mich wundere das ich jeweils in der Konsole eine Fehlermeldung des Browser vorfand: </p>
</div>
<div class="te700 warning msg">downloadable font: maxp: Bad maxZones: 0 (font-family: "myfont" style:normal weight:300 stretch:100 src index:1) source: https://....</div>
<h3 class="te700"> </h3>
<h3 class="te700">Fehlerbehebung im Fontforge</h3>
<div class="te700">Unter Fontforge hat es ein Menü <strong>Hints</strong>, darunten kann man "<strong>maxp</strong>" die Werte eingeben:</div>
<div class="te700"> </div>
<div class="te700"><img src="/_media/cms/library/tools/Fontforge_maxp.png" /></div>
<div class="te700"> </div>
<div class="te700">Danach war die Fehlermeldung weg.</div>
<h2 class="te700">Fontforge</h2>
<p class="te700">Folgende Merkmale bietet das Tool:</p>
<ul>
<li class="te700">Multi-Plattform: FontForge ist auf verschiedenen Betriebssystemen wie Windows, macOS und Linux verfügbar.</li>
<li class="te700">Unterstützung vieler Formate: Neben TTF, OTF und WOFF unterstützt es auch ältere Formate wie Bitmap Fonts und Type 1.</li>
<li class="te700">Erweiterbare Funktionen: FontForge unterstützt Skripting mit Python, was die Automatisierung von Aufgaben und die Erweiterung der Funktionalität ermöglicht.</li>
<li class="te700">Visuelle Bearbeitung: Es bietet eine grafische Benutzeroberfläche, die es Benutzern ermöglicht, Glyphen visuell zu bearbeiten und zu erstellen.</li>
<li class="te700">Tools für professionelle Typografie: Enthält Werkzeuge zur präzisen Anpassung der Schriftmetrik, des Kerning und zur Hinting-Bearbeitung.</li>
</ul>
<div class="te700">FontForge ist besonders nützlich für Designer, Typografen und Entwickler, die massgeschneiderte Schriftarten erstellen oder bestehende Schriftarten modifizieren möchten. Da es Open Source ist, kann es kostenlos heruntergeladen und verwendet werden, und es gibt eine aktive Community, die Unterstützung und Erweiterungen bietet.</div>
<h3 class="te700">Download unter:</h3>
<ul>
<li><a href="https://fontforge.org/">https://fontforge.org/</a></li>
</ul></content>
</entry>
<entry>
<title>KomorebiCms (v5)</title>
<link href="https://stastka.ch/knowledge-base/KomorebiCms-v5/story/f7fafd26"/>
<id>urn:uuid:e48dd505-5a00-6d63-2ea5-7d6535aa9d14</id>
<updated>2024-04-23T03:51:21Z</updated>
<summary type="html"><p><img title="CMS die 5te Dimension" src="https://stastka.ch/_media/cms/library/csharp/cms-v5_s.jpg" alt="Version 5"></p>
<p>Ein Jahr ist vergangen seit der letzten Überarbeitung meiner Webseite. Es war an der Zeit, meinen Code aufzuräumen und die neuesten Technologien zu integrieren, um eine noch bessere Benutzererfahrung zu bieten. Eine der wichtigsten Aktualisierungen betrifft die Integration der neuesten Version des TinyMCE Editors (7.x), der es mir ermöglicht, meine Inhalte noch einfacher zu erstellen und zu bearbeiten.</p>
<p>Ein weiterer Schwerpunkt liegt auf dem Responsiveness-Aspekt meiner Seite. Auch wenn die Desktop-Variante mehr zugriff auf meine Seite generiert habe ich den Fokus auf mobile Geräte gesetzt und diese durch verschiedene Tools geprüft.</p></summary>
<content type="html">Full:<div class="te700"><img title="KomorebiCms" src="/_media/cms/library/csharp/cms-v5.jpg" alt="Version 5" /></div>
<div class="te700">
<p>Ein Jahr ist vergangen seit der letzten Überarbeitung meiner Webseite. Es war an der Zeit, meinen Code aufzuräumen und die neuesten Technologien zu integrieren, um eine noch bessere Benutzererfahrung zu bieten. Eine der wichtigsten Aktualisierungen betrifft die Integration der neuesten Version des TinyMCE Editors (7.x), der es mir ermöglicht, meine Inhalte noch einfacher zu erstellen und zu bearbeiten.</p>
<h3>Validity, Pagespeed and WAVE</h3>
<p>Ein weiterer Schwerpunkt liegt auf dem Responsiveness-Aspekt meiner Seite. Auch wenn die Desktop-Variante mehr Zugriff auf meine Seite generiert habe ich den Fokus auf mobile Geräte gesetzt und diese durch verschiedene Tools geprüft. So erreicht das aktuelle Layout bei Google Pagespeed einen Score von 99-100% erreicht. Ein Knackpunkt ist noch das separieren von Javascript und CSS auf das aller nötigste. Diese wird noch in den nächsten Versionen verbessert. Sehr wichtig war mir der HTML5 und CSS Code vom W3C Validator gültig war. </p>
<p>Um sicherzustellen, dass die Webseite barrierefrei ist und allen Nutzern zugänglich ist, habe ich das Wave Tool verwendet. Mit diesem Tool können potentielle Barrieren identifiziert und behoben werden, um sicherzustellen, dass die Webseite für alle Besucher zugänglich ist, unabhängig von ihren individuellen Bedürfnissen oder Einschränkungen.</p>
<p>Vom Ergebnis bin ich mehr als begeistert und zeigt das mit ein paar kniffen einen tolle Seite erstellt werden kann.</p>
<p>Mehr lesen kann man unter <a class="bt" title="KomorebiCms v5.0" href="/impressum/cms/KomorebiCms/">KomorebiCms - das etwas andere CMS</a></p>
</div></content>
</entry>
<entry>
<title>Ubuntu Server 22.04 LTS: root Passwort ändern - root reset</title>
<link href="https://stastka.ch/knowledge-base/Ubuntu-Server-2204-LTS-root-Passwort-%c3%a4ndern-root-reset/story/973d74c3"/>
<id>urn:uuid:dc48aa1a-4554-17e7-0584-63cfd84097b6</id>
<updated>2024-04-11T03:00:20Z</updated>
<summary type="html"><p><img class="blog" title="Lost root Password" src="https://stastka.ch/_media/cms/library/linux/ubuntu-root-lost.png" alt="Root Password reset" width="434" height="263"></p>
<p>Kennt man das root Passwort nicht muss man das Passwort zurücksetzen. Dabei startet man den Linux Server, in diesem Fall einen Ubuntu 22.04 LTS in einem abgesicherten Modus.</p></summary>
<content type="html">Full:<p><img class="blog" title="Lost root Password" src="/_media/cms/library/linux/ubuntu-root-lost.png" /></p>
<p>Kennt man das root Passwort nicht muss man das Passwort zurücksetzen. Dabei startet man den Linux Server, in diesem Fall einen Ubuntu 22.04 LTS in einem abgesicherten Modus.</p>
<h2>Die Konsole</h2>
<p>Das root Passwort kann man nur direkt in der Konsole ändern, d.h. man muss vor dem Server stehen, oder über die vKVM Konsole oder der VMware Konsole.</p>
<p>Mit der Einhabe der ESC Taste stopt der Bootvorgang im <strong>Grand Unified Bootloader</strong> (GRUB) Menü.</p>
<p>Im <strong>GRUB </strong>Menü muss man auf der Tastatur <strong>[e]</strong> drücken damit man den aktuellen Menüeintrag editieren kann und ensprechend den Bootvorgang ändern.</p>
<pre class="line-numbers language-bash"><code>rw init=/bin/bash</code></pre>
<p><img src="/_media/cms/library/linux/ubuntu-root-password.png" width="1000" height="745" /></p>
<p>Mit [Ctr]+x oder [F10] startet man den single-user-mode, d.h. man startet das Linux in einem abgesicherten Modus.</p>
<div class="te700">
<pre class="line-numbers language-bash"><code>mount | grep -w /</code></pre>
</div>
<p>Danach das Passwort setzten</p>
<pre class="line-numbers language-bash"><code>passwd</code></pre>
<p>Danach kann man den start des Linuc</p>
<pre class="line-numbers language-bash"><code>exec /sbin/init</code></pre>
<p class="te700">[#f]prism|null[/#f]</p></content>
</entry>
<entry>
<title>there is a problem with windows installer package. A DLL required for this install to complete could not be run</title>
<link href="https://stastka.ch/knowledge-base/there-is-a-problem-with-windows-installer-package-A-DLL-required-for-this-install-to-compl/story/708559c4"/>
<id>urn:uuid:4d782a6f-f5d8-9ffb-71cf-70a38aa9d088</id>
<updated>2024-02-29T18:19:09Z</updated>
<summary type="html"><p><img class="blog" title="OpenVPN Installer" src="https://stastka.ch/_media/cms/library/windows/tools/msi-openvpn.png" alt="Installer Error OpenVPN msi"></p>
<p>I start a Shell with Administrator Rights an Execute Installer with following Command:</p></summary>
<content type="html">Full:<p><img title="OpenVPN Installer" src="/_media/cms/library/windows/tools/msi-openvpn.png" /></p>
<p>I start a Shell with Administrator Rights an Execute Installer with following Command:</p>
<pre class="language-csharp"><code>msiexec.exe /I c:\Logs\OpenVPN-2.6.9-I001-amd64.msi  /L*V C:\Logs\open.log</code></pre>
<p>After then: OpenVPN 2.6.9-I001 amd64 -- Installation completed successfully.</p>
<p>[#f]prism|null[/#f]</p></content>
</entry>
<entry>
<title>MySQL: Japanisch konvertieren zwischen HEX, Decimal code point, UNICODE characters bytes</title>
<link href="https://stastka.ch/knowledge-base/MySQL-Japanisch-konvertieren-zwischen-HEX%2c-Decimal-code-point%2c-UNICODE-characters-bytes/story/323e77e4"/>
<id>urn:uuid:d154a71c-e775-9cbd-9681-355284e7664b</id>
<updated>2024-02-09T20:09:10Z</updated>
<summary type="html"><p>Bei der Entwicklung meiner japanischen Tools musste ich mich mit den Encoding bei MySQL auseinandersetzen.</p>
<p>Der empfohlene Zeichensatz für die Speicherung von japanischen Zeichen in MySQL ist UTF-8. UTF-8 ist ein Unicode-Zeichensatz, der eine breite Palette von Zeichen, einschliesslich japanischer Kanji, Hiragana und Katakana, unterstützt. Japanische Kanji-Zeichen sind neben 2-Byte-Zeichen auch mit 4-Byte-Zeichen vorhanden.</p>
<p>Damit man die richtige Unicode-Nummer für ein Kanji habe, musste ich das Zeichen jeweils konvertieren müssen damit die Fremdschlüssel zueinander passen.</p>
<p>Ich habe mir anhand des Zeichen "立" (tachi) <em>aufstehen, aufrichten, aufstellen</em> ein paar Beispiele erstellt.</p>
<ul>
<li>Hex UTF-8 bytes</li>
<li>Hex code point oder Hexadecimal</li>
<li>Decimal code point</li>
<li>Binary code point</li>
<li>UNICODE characters bytes</li>
</ul></summary>
<content type="html">Full:<p>Bei der Entwicklung meiner japanischen Tools musste ich mich mit den Encoding bei MySQL auseinandersetzen.</p>
<p>Der empfohlene Zeichensatz für die Speicherung von japanischen Zeichen in MySQL ist UTF-8. UTF-8 ist ein Unicode-Zeichensatz, der eine breite Palette von Zeichen, einschliesslich japanischer Kanji, Hiragana und Katakana, unterstützt. Japanische Kanji-Zeichen sind neben 2-Byte-Zeichen auch mit 4-Byte-Zeichen vorhanden.</p>
<p>Damit man die richtige Unicode-Nummer für ein Kanji habe, musste ich das Zeichen jeweils konvertieren müssen damit die Fremdschlüssel zueinander passen.</p>
<p>Ich habe mir anhand des Zeichen "立" (tachi) aufstehen, aufrichten, aufstellen ein paar Beispiele erstellt.</p>
<p></p>
<h3>Ausgabe: Hex UTF-8 bytes</h3>
<pre class="language-sql"><code>SELECT HEX('立');
SELECT HEX(CON_VERT(CH_AR(0x7ACB USING ucs2) USING utf8));</code></pre>
<p>E7AB8B</p>
<h3>Ausgabe: Hex code point oder Hexadecimal</h3>
<p>von x<sup>10</sup> Dezimal zu x<sup>16</sup> Hexadecimal</p>
<pre class="language-sql"><code>SELECT UNHEX(CONV(31435,10,16));</code></pre>
<p>Zahl in Hex und zurück</p>
<pre class="language-sql"><code>SELECT UNHEX(HEX(31435));</code></pre>
<p>0x7ACB</p>
<pre class="language-sql"><code>SELECT HEX(CON_VERT('立' USING ucs2));</code></pre>
<p>7ACB</p>
<pre class="language-sql"><code>SELECT HEX(31435);
</code></pre>
<p>7ACB</p>
<pre class="language-sql"><code>SELECT CONV(31435,10,16);</code></pre>
<p>7ACB</p>
<h3>Ausgabe: Decimal code point</h3>
<pre class="language-sql"><code>SELECT CONV(HEX(CON_VERT('立' USING ucs2)), 16, 10); </code></pre>
<p>31435</p>
<h3>Ausgabe: Binary code point</h3>
<pre class="language-sql"><code>SELECT RIGHT(CONV(HEX('立'),16,2),20); </code></pre>
<p>01111010101110001011</p>
<h3>Ausgabe: UNICODE characters bytes</h3>
<pre class="language-sql"><code>SELECT UNHEX("E7AB8B");SELECT CH_AR(0x7ACB using ucs2);
SELECT CON_VERT(UNHEX('7ACB') USING ucs2);
SELECT CON_VERT(UNHEX(HEX(31435)) USING ucs2);
</code></pre>
<p>立</p>
<p>[#f]prism|null[/#f]</p></content>
</entry>
<entry>
<title>Primzahlen mit MS SQL oder MySQL berechnen</title>
<link href="https://stastka.ch/knowledge-base/Primzahlen-mit-MS-SQL-oder-MySQL-berechnen/story/9e8b38e8"/>
<id>urn:uuid:db12f46c-27cd-4355-0698-b662dd5380a5</id>
<updated>2024-02-05T18:30:00Z</updated>
<summary type="html"><p><img class="blog" title="Dice: Primzahlen" src="https://stastka.ch/_media/cms/library/csharp/dice.jpg" alt="Prime Number" width="400" height="141"></p>
<p>Primzahlen sind alle natürlichen Zahlen, die nur durch 1 und sich selbst teilbar sind. Die 2 ist Primzahl, sie ist die kleinste und die einzige gerade Primzahl. </p>
<p>In der Regel wie oben beschrieben ist eine Primzahl nur durch 1 teilbar und sich selbst teilbar. Da es zwei verschiedene Teiler handeln muss scheidet 1 als Primzahl aus.</p>
<p>Das Wort "prim" wurde abgeleitete von Wort "primus" und heisst "Erster, Vorderster". Schon die alten Griechen hatten eine gewisse faszination zu den Primzahlen und entdeckte einige ihrer Eigenschaften.</p>
<p>Heutzutage sind Primzahlen vor allem in der Kryptografie wichtig da der Wert im Zusammenhang mit Primzahlen nicht schnell berechnet werden kann..</p>
<p>Ich habe schon einige Funktionen zum prüfen von Primzahlen in verschiedenen Sprachen gesehen. Was für mich neu war, wie man eine Primzahl auf einem MS-SQL Server berechnet, d.h. mit T-SQL Language. Mit etwas ausprobieren habe ich eine performante Variante für mich gefunden. Die Aufgabe bestand darin Primzahlen von  300300 bis 300900 innerhalb von 30 Sekunden zu berechnen. Meine gefunden Variante schaffte es bei 8 vCPU (3Gz) und 8GB RAM in 15 Sekunden.</p></summary>
<content type="html">Full:<p><img title="Dice: Primzahlen" src="/_media/cms/library/csharp/dice.jpg" alt="Prime Number" width="1000" height="353" /></p>
<p>Primzahlen sind alle natürlichen Zahlen, die nur durch 1 und sich selbst teilbar sind. Die 2 ist Primzahl, sie ist die kleinste und die einzige gerade Primzahl. </p>
<p>In der Regel wie oben beschrieben ist eine Primzahl nur durch 1 teilbar und sich selbst teilbar. Da es zwei verschiedene Teiler handeln muss scheidet 1 als Primzahl aus.</p>
<p>Das Wort "prim" wurde abgeleitete von Wort "primus" und heisst "Erster, Vorderster". Schon die alten Griechen hatten eine gewisse faszination zu den Primzahlen und entdeckte einige ihrer Eigenschaften.</p>
<p>Heutzutage sind Primzahlen vor allem in der Kryptografie wichtig da der Wert im Zusammenhang mit Primzahlen nicht schnell berechnet werden kann..</p>
<p>Ich habe schon einige Funktionen zum prüfen von Primzahlen in verschiedenen Sprachen gesehen. Was für mich neu war, wie man eine Primzahl auf einem MS-SQL Server berechnet, d.h. mit T-SQL Language. Mit etwas ausprobieren habe ich eine performante Variante für mich gefunden. Die Aufgabe bestand darin Primzahlen von  300300 bis 300900 innerhalb von 30 Sekunden zu berechnen. Meine gefunden Variante schaffte es bei 8 vCPU und 8GB RAM in 15 Sekunden.</p>
<h3>MS SQL Transact-SQL FUNCTION</h3>
<p>Die Basisfunktion ermittelt von jeweils einer einzelnen Zahl ob sie eine Primzahl ist und gibt jeweils den Rückgabewert (1=WAHR) oder (0=FALSCH). Dabei iterieren man von der Zahl 2 bis zur entsprechenden Wurzel der Zahl.</p>
<p>Die Wurzel basiert auf der Defintion, dass SQRT(n) * SQRT(n) = n ist, und dass mindestens ein Faktor kleiner als gleich SQRT(n) sein muss. Wenn wir keinen Faktor im Bereich 2te, sqrt(n) finden können, bedeutet dies, dass die Zahl n eine Primzahl ist.</p>
<p>Dazu können wir vorher Prüfen ob eine Zahl Gerade oder Ungerade ist. Einzig die 2 ist eine Gerade Primzahl. (Siehe MySQL Version)</p>
<div>
<p>Die Berechnung von 1 bis 300900 dauert ~16 Sekunden.</p>
</div>
<pre class="language-sql"><code>IF object_id(N'isPrimeNumber', N'FN') IS NOT NULL
    DROP FUNCTION isPrimeNumber
GO

Create function isPrimeNumber (@number int) 
returns int  as 
Begin
	Declare @result bit = 1,@i int = 2
	
    While (@i&lt;#=SQRT(@number))
	Begin
		if(@number % @i = 0)
		Begin
			Set @result = 0
			break
		End
		Set @i += 1
	End
	return @result
End
</code></pre>
<p>Der einzelne Aufruf ergibt 0 (NEIN) oder 1 (JA, es ist eine Primzahl) als Resultat.</p>
<pre class="language-sql"><code>SELECT dbo.isPrimeNumber(3) AS result</code></pre>
<h3>Der Loop</h3>
<p>Mittels einer Schleife wird nun die geprüft ob die Zahl eine Primzahl ist. Dabei gibt es nur einen Output wenn die Rückgabe eine 1 ist, d.h. ja, es ist eine Primzahl.</p>
<pre class="language-sql"><code>DECLARE @counter INT 
DECLARE @result  INT

SET @counter=300300
WHILE ( @counter &lt;#= 300900)
BEGIN
	SET @result = (SELECT dbo.isPrimeNumber(@counter))
	if(@result = 1)
	Begin
		PRINT 'The Number [' + CON_VERT(VARCHAR,@counter)+ '] is Prime Number---#&gt;'+CON_VERT(VARCHAR,@result)
    END
	SET @counter  = @counter  + 1
END</code></pre>
<p>Das Resultat</p>
<pre class="language-excel"><code>...
The Number [300857] is Prime Number---#&gt;1
The Number [300869] is Prime Number---#&gt;1
The Number [300877] is Prime Number---#&gt;1
The Number [300889] is Prime Number---#&gt;1
The Number [300893] is Prime Number---#&gt;1

Completion time: 2024-02-03T23:00:12.5367311+01:00</code></pre>
<h3>Die MySQL Variante</h3>
<p>Für MySQL oder MariaDB kann man keinen WHILE Schleife direkt durchführen. So muss man wiederum eine Funktion erstellen und diese via einer Prozedur ausführen:</p>
<pre class="language-sql"><code>DELIMITER //

CREATE FUNCTION isPrimeNumber ( number INT )
RETURNS INT

BEGIN
   DECLARE result INT;
   DECLARE i INT;
   SET result = 1;
   SET i = 2;
   IF number = 2 THEN
   		Set result = 1;
   ELSEIF number % 2 &lt;##&gt; 0 THEN
  
   loop1: WHILE i &lt;#= SQRT(number) DO
     IF number % i = 0 THEN
			Set result = 0;
			LEAVE loop1;
	 END IF;
     SET i = i + 1;
   END WHILE loop1;

ELSE
	Set result = 0;
END IF;

   RETURN result;
END; //
DELIMITER ;</code></pre>
<p>Die Prozedur gibt jeweils die Primzahlen aus:</p>
<pre class="language-sql"><code>Delimiter //
CREATE PROCEDURE PrimeLoop( start INT, stop INT)
   BEGIN
   DECLARE counter INT default 1;
   DECLARE res VARC_HAR(50) default '';
   DECLARE r1 VARC_HAR(50) default '';
   WHILE counter &lt;#=stop DO
   SET p0=counter; 
   SET r1 = (SELECT `isPrimeNumber`(p0) AS `isPrimeNumber`); 
   IF r1=1 AND counter #&gt; 1 THEN
		SELECT CON_CAT('N:',counter,' ---#&gt;',r1,' --#&gt;', NO_W()) as result;
   END IF;
   
   SET counter = counter + 1;
   
   END WHILE;
   
END //
</code></pre>
<p>[#f]prism|null[/#f]</p></content>
</entry>
<entry>
<title>Wadoku mit verbessertem Responsive Design und Copy Paste</title>
<link href="https://stastka.ch/knowledge-base/Wadoku-mit-verbessertem-Responsive-Design-und-Copy-Paste/story/e98c087e"/>
<id>urn:uuid:375a01d7-2578-4b82-6f13-13d4527ad25a</id>
<updated>2024-01-22T23:15:10Z</updated>
<summary type="html"><p><img class="blog" title="Wadoku 0.98" src="https://stastka.ch/_media/cms/library/csharp/wadoku-0-9-8-start.png" alt="Screen Wadoku " width="400" height="330"></p>
<p>Meine neuste Version des Wadoku ist Online. Neben einigen Verbesserungen und Fehlerbehebungen wurde vor allem das Responsive Design verbessert. Neu kann man auch Japanische Wörter durch simplen Mausklick in die Zwischenablage speichern.</p></summary>
<content type="html">Full:<h3>Bugfix und Codeoptimierung</h3>
<p>Bei der Suche trat in einigen Fällen ein Datenbankfehler auf. Dieser Fehler wurde behoben und sollte nicht mehr auftreten. Dazu wurden an den Schleifen die Logik plus Reduzierung der Datenbankabfrage geändert. Die ganze Optimierung lässt den Code jetzt um 20% schneller laufen.</p>
<p>Beim XML Transformationsscript wurden einige Fehler behoben. Mittels SQL-Abfrage konnten die nicht validen HTML-Tags identifiziert werden und das HTML ist nun fehlerfrei.</p>
<h3>Neue Funktionen</h3>
<h4>Farben zu Eigenschaften</h4>
<p>Neu sind die Farben durchgängig in allen Ansichten. Neben Hiragana und Katakana werden nun auch Lateinische Buchstaben/Zahlen A-Za-z0-9 und griechische Buchstaben erkannt.</p>
<p>Die Lesbarkeit für abweichende japanische Lesung oder übliche Kanjischreibung wurde verbessert. Dazu sind nun Kanji als Irregulär Lesung oder sind nicht Bestandteil des Jōyō-Kanji einfach ersichtlich.</p>
<p><a href="https://stastka.ch/app/dictionary/ger-jpn-wadoku/word/236979/"><img title="Beispiel Irregulär" src="/_media/cms/library/csharp/wadoku-0-9-8-irregulaer.png" /></a></p>
<h4>Responsive Design der Suche</h4>
<p>Die Suche wurde für Telefone nochmals optimiert. So werden die Ergebnisse besser Dargestellt. Dazu wurde die Lesbarkeit optimiert.</p>
<h4>Copy &amp; Paste</h4>
<p>Neu kann man auf jedes japanische Wort klicken (1) und das ganze Wort wird in die Zwischenablage gespeichert und kann somit schnell auf ähnliche Wörter suchen (2)</p>
<p><img title="Copy &amp; Paste Wadoku" src="/_media/cms/library/csharp/wadoku-0-9-8-copy.png" alt="Copy" /></p>
<p>Die neue Version ist unter folgendem Link erreichbar: <a href="https://stastka.ch/app/dictionary/ger-jpn-wadoku/">https://stastka.ch/app/dictionary/ger-jpn-wadoku/</a></p>
<h3>XML-Update</h3>
<p>Die Datenbank wurde mit dem XML-Dump vom 7. Januar 2024 aktualisiert; daraus resultiert:</p>
<ul>
<li><strong>Einträge: 425'910 (+6'387)</strong></li>
<li>Grammatikangaben (gramgrp): 291'290 (+6'962)</li>
<li>Schreibungen (orth): 71'5081 (+11'039)</li>
<li>Querreferenz (ref):277'103 (+5'251)</li>
<li>Weiterführende Einträge (ruigos): 127'698 (+6'161)</li>
<li>Herkunft eines Wortes (etyn): 7'9069 (+2'204)</li>
</ul></content>
</entry>
<entry>
<title>Step CA HEALTHCHECK healthy und unhealthy</title>
<link href="https://stastka.ch/knowledge-base/Synology-Container-Manager-HEALTHCHECK-healthy-unhealthy/story/00efad4b"/>
<id>urn:uuid:cce0810e-6971-acbb-9a63-a71ba9cd25d2</id>
<updated>2023-09-21T19:49:28Z</updated>
<summary type="html"><p><img class="blog" title="Container Health" src="https://stastka.ch/_media/cms/library/synology/container-manager-health.png" alt="Show Container on Synology"></p>
<p>Die <strong>HEALTHCHECK</strong>-Anweisung teilt Docker mit, wie ein Container getestet werden soll, um zu prüfen, ob er noch funktioniert. Dadurch können Fälle wie ein Webserver erkannt werden, der in einer Endlosschleife feststeckt und keine neuen Verbindungen verarbeiten kann, obwohl der Serverprozess noch läuft.</p>
<p>Wenn für einen Container ein Healthcheck angegeben ist, hat er zusätzlich zu seinem normalen Status einen Health-Status. Dieser Status ist zunächst der Startstatus. Sobald eine Gesundheitsprüfung bestanden wird, wird er gesund (unabhängig davon, in welchem Zustand er sich vorher befand). Nach einer bestimmten Anzahl aufeinanderfolgender Fehlschläge wird er ungesund (unhealthy).</p>
<p>Mit der neuen Version der Synology Docker Service (Container Manager) wird nun der Status des Healthchecks berücksichtigt.</p></summary>
<content type="html">Full:<p>Die HEALTHCHECK-Anweisung teilt Docker mit, wie ein Container getestet werden soll, um zu prüfen, ob er noch funktioniert. Dadurch können Fälle wie ein Webserver erkannt werden, der in einer Endlosschleife feststeckt und keine neuen Verbindungen verarbeiten kann, obwohl der Serverprozess noch läuft.</p>
<p>Wenn für einen Container ein Healthcheck angegeben ist, hat er zusätzlich zu seinem normalen Status einen Health-Status. Dieser Status ist zunächst der Startstatus. Sobald eine Gesundheitsprüfung bestanden wird, wird er gesund (unabhängig davon, in welchem Zustand er sich vorher befand). Nach einer bestimmten Anzahl aufeinanderfolgender Fehlschläge wird er ungesund (unhealthy).</p>
<p>Mit der neuen Version der Synology Docker Service (Container Manager) wird nun der Status des Healthchecks berücksichtigt.</p>
<p>Das Dockerfile der Zertifizierungsstelle hat in ihrem Dockerfile den Healthcheck aktiviert:</p>
<pre class="language-bash"><code>HEALTHCHECK CMD step ca health 2#&gt;/dev/null | grep "^ok" #&gt;/dev/null</code></pre>
<p>Nach wenigen Minuten wurde der Service als unhealthy markiert:</p>
<pre class="language-bash"><code>CONTAINER ID   IMAGE                     COMMAND                  CREATED        STATUS                   PORTS                                                                                                                                                                        NAMES
7feaa16d18ec   stsk/step-ca:0.24.2       "/bin/bash /entrypoi…"   8 days ago     Up 4 hours (unhealthy)   0.0.0.0:31900-#&gt;9000/tcp, :::31900-#&gt;9000/tcp                                                                                                                                  stepca
</code></pre>
<p>Der Grund liegt daran das der Healthcheck ein Standalone aufruf ist und sich nicht an den Deamon verbinden kann. In einem Github Post wurde dies sehr schön erklärt.</p>
<p>Die Lösung war mit dem add-host Flag:</p>
<pre class="line-numbers language-bash"><code>docker run -d --name stepca -it   \
--hostname ca.lan \
--publish 31900:9000 \
--add-host ca.lan:127.0.0.1 \
--env 'DOCKER_STEPCA_INIT_PORT=9000' \
--env 'DOCKER_STEPCA_INIT_NAME=CA' \
--env 'DOCKER_STEPCA_INIT_DNS_NAMES=ca.lan' \
</code></pre>
<p>oder im Docker Compose</p>
<pre class="language-bash"><code>extra_hosts:
      - "ca.lan:127.0.0.1"</code></pre>
<p>[#f]prism|null[/#f]</p>
<p>Quelle</p>
<ul>
<li><a title="healthcheck" href="https://docs.docker.com/engine/reference/builder/#healthcheck">https://docs.docker.com</a></li>
<li><a href="https://github.com/smallstep/certificates/discussions/1020" aria-invalid="true">https://github.com/smallstep/certificates/discussions/1020</a></li>
</ul></content>
</entry>
</feed>