C++Guns – RoboBlog blogging the bot

24.07.2023

C++ Guns: DOS codepage 437 to UTF8

Filed under: Allgemein — Tags: , — Thomas @ 09:07

Wenn die üblichen Encodings wie UTF8, Latin1, ISO-8859-15 nicht funktionieren kann man CP437 versuchen. Das ist der Original-Zeichensatz des IBM-PC ab 1981. Dieser enthält Umlaute die in den üblicherweise eingestellten Encodings nicht angezeigt werden.

Hier mein erster Versuch CP437 nach UTF8 zu konvertieren. Die Sourcecode Datei und der Compiler und das ganze Betriebssystem ist selbstverständlich auf UTF8 eingestellt, sonst funktioniert es nicht.

std::string cp437toUTF8(std::string_view str) {
    std::string result;
    result.reserve(str.size());
    for(unsigned char c : str) {
        switch(c) {
        case 129: result.append("ü"); break;
        case 132: result.append("ä"); break;
        case 142: result.append("Ä"); break;
        case 148: result.append("ö"); break;
        case 153: result.append("Ö"); break;
        case 154: result.append("Ü"); break;
        case 225: result.append("ß"); break;
        default: result.push_back(c);
        }
    }

    return result;
}

[1] https://de.wikipedia.org/wiki/Codepage_437
[2] https://www.ascii-code.com/CP437

28.06.2023

Ganglia SSD Metrics

Filed under: Allgemein — Tags: — Thomas @ 14:06

GMETRIC="/usr/bin/gmetric -c /etc/ganglia/gmond.conf"
DEV=/dev/sda

temperature=$(sudo smartctl -A $DEV | grep Temperature_Celsius |  awk '{print $10}')
Reallocated_Sector_Ct=$(sudo smartctl -A $DEV | grep Reallocated_Sector_Ct |  awk '{print $10}')
Current_Pending_Sector=$(sudo smartctl -A $DEV | grep Current_Pending_Sector |  awk '{print $10}')
Offline_Uncorrectable=$(sudo smartctl -A $DEV | grep Offline_Uncorrectable |  awk '{print $10}')
UDMA_CRC_Error_Count=$(sudo smartctl -A $DEV | grep UDMA_CRC_Error_Count |  awk '{print $10}')
Program_Fail_Count_Chip=$(sudo smartctl -A $DEV | grep Program_Fail_Count_Chip |  awk '{print $10}')
Erase_Fail_Count_Chip=$(sudo smartctl -A $DEV | grep Erase_Fail_Count_Chip |  awk '{print $10}')
Wear_Leveling_Count=$(sudo smartctl -A $DEV | grep Wear_Leveling_Count  |  awk '{print $10}')
Used_Rsvd_Blk_Cnt_Chip=$(sudo smartctl -A $DEV | grep Used_Rsvd_Blk_Cnt_Chip  |  awk '{print $10}')
Program_Fail_Cnt_Total=$(sudo smartctl -A $DEV | grep Program_Fail_Cnt_Total  |  awk '{print $10}')
Erase_Fail_Count_Total=$(sudo smartctl -A $DEV | grep Erase_Fail_Count_Total  |  awk '{print $10}')

echo "temperature" $temperature
echo "Reallocated_Sector_Ct" $Reallocated_Sector_Ct
echo "Current_Pending_Sector" $Current_Pending_Sector
echo "Offline_Uncorrectable" $Offline_Uncorrectable
echo "UDMA_CRC_Error_Count" $UDMA_CRC_Error_Count
echo "Program_Fail_Count_Chip" $Program_Fail_Count_Chip
echo "Erase_Fail_Count_Chip" $Erase_Fail_Count_Chip
echo "Wear_Leveling_Count " $Wear_Leveling_Count 
echo "Used_Rsvd_Blk_Cnt_Chip" $Used_Rsvd_Blk_Cnt_Chip
echo "Program_Fail_Cnt_Total" $Program_Fail_Cnt_Total
echo "Erase_Fail_Count_Total" $Erase_Fail_Count_Total


$GMETRIC  -t float -n "Temperature" -u "Celcius" -g "SSD" -v $temperature
$GMETRIC  -t float -n "Reallocated_Sector_Ct" -g "SSD" -v $Reallocated_Sector_Ct
$GMETRIC  -t float -n "Current_Pending_Sector" -g "SSD" -v $Current_Pending_Sector
$GMETRIC  -t float -n "Offline_Uncorrectable" -g "SSD" -v $Offline_Uncorrectable
$GMETRIC  -t float -n "UDMA_CRC_Error_Count" -g "SSD" -v $UDMA_CRC_Error_Count
$GMETRIC  -t float -n "Program_Fail_Count_Chip" -g "SSD" -v $Program_Fail_Count_Chip
$GMETRIC  -t float -n "Erase_Fail_Count_Chip" -g "SSD" -v $Erase_Fail_Count_Chip
$GMETRIC  -t float -n "Wear_Leveling_Count" -g "SSD" -v $Wear_Leveling_Count
$GMETRIC  -t float -n "Used_Rsvd_Blk_Cnt_Chip" -g "SSD" -v $Used_Rsvd_Blk_Cnt_Chip
$GMETRIC  -t float -n "Program_Fail_Cnt_Total" -g "SSD" -v $Program_Fail_Cnt_Total
$GMETRIC  -t float -n "Erase_Fail_Count_Total" -g "SSD" -v $Erase_Fail_Count_Total

24.01.2019

Installing gcc, g++ and gfortran 8 from source

Filed under: Allgemein — Tags: , , , — Thomas @ 22:01

The procedure is quite the same as for gcc 4.8 as you can see in my older post Installing gcc, g++ and gfortran 4.8 from source

Read the manual.
Download, unpack, switch dir, download, unpack, link.

$ wget ftp://ftp.gwdg.de/pub/misc/gcc/snapshots/LATEST-8/gcc-8-20190118.tar.xz
$ xz -d gcc-8-20190118.tar.xz
$ tar xf gcc-8-20190118.tar
$ gcc-8-20190118/
$ wget ftp://ftp.gmplib.org/pub/gmp-6.1.2/gmp-6.1.2.tar.bz2
$ tar xjf gmp-6.1.2.tar.bz2
$ ln -s gmp-6.1.2 gmp
$ wget https://www.mpfr.org/mpfr-current/mpfr-4.0.1.tar.bz2
$ tar xjf mpfr-4.0.1.tar.bz2
$ ln -s mpfr-4.0.1 mpfr
$ wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
$ tar xzf mpc-1.1.0.tar.gz
$ ln -s mpc-1.1.0 mpc

Make a build directory, start configure, start make, wait
$ cd ..
$ mkdir build-gcc-8-20190118
$ cd build-gcc-8-20190118/
$ ../gcc-8-20190118/configure --prefix=/opt/gcc-8 --enable-threads --enable-languages=c,c++,fortran
$ make -j 32
# make install

17.01.2019

(QGIS) Debian dummy / fake packet

Filed under: Allgemein — Tags: — Thomas @ 15:01

I want to install QGIS today and run into following issue:

qgis : Depends: gdal-abi-2-3-0 but it is not installable

It is not installable because it does not exist in buster, only in sid. It is a virtual package for libgdal20.
So I installed libgdal20 and crate a fake packed.

$ cat gdal_abi.txt 
Section: misc
Priority: optional
Standards-Version: 3.9.2

Package: gdal-abi-2-3-0
Version: 2.3.0
Depends: libgdal20
Description: fake package for qgis which needs a gdal-abi-2-3-0

# apt-get install equivs

$ equivs-build gdal_abi.txt

# dkpg -i gdal-abi-2-3-0_2.3.0_all.deb

All fine :)

13.01.2019

Linux: Zwei Monitore / Bildschirme anschliessen

Filed under: Allgemein — Tags: — Thomas @ 10:01

Ein paar nützliche Befehle:

# xrandr
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
LVDS2 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
1920x1080 60.00*+ 59.93 50.00
...
VGA-1-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
1920x1080 60.00*+
...

Mein Laptop Bildschirm ist LBDS2, es ist der Hauptschirm. Und anhand den Abmessungen sieht man auch, dass es der kleinere ist.
Der externe Bildschirm ist über VGA anschlossen, kein DVI.

Der Befehlt xrandr stellt viele nützliche Befehle bereit. Z.B.:

# xrandr --listmonitors
0: +*LVDS2 1920/344x1080/193+0+0 LVDS2
1: +VGA-1-1 1920/527x1080/296+0+0 VGA-1-1

Um den externen Bildschirm auf die linke Seite zu verschieben, genügt einfach der Befehl
# xrandr --output VGA-1-1 --left-of LVDS2

Sehr angenehm das.

12.01.2019

Installation von FreeBSD

Filed under: Allgemein — Tags: — Thomas @ 21:01

Mir geht die Linux Gemeinschaft in letzter Zeit richtig auf die Nerven. Vor allem der Hype um systemd. Wenn ihr schon etwas besser machen wollt, dann baut es doch nicht noch schrottiger. Es wird wieder Zeit für ein unix! FreeBSD war damals vor >15 Jahren ganz toll. Also warum nicht.

Problem: Die Hardware will nicht. Der Computer ging aus, aber nicht mehr an. Und an was es liegt, da ist die Glaskugel gefragt :/ Auf gut Glück mal das Netzteil wechseln. War doch gar nicht alt. 2010 oder so gekauft.

Lustigerweise steht im Keller noch so ein komischer ALDI PC. Voll gepackt mit haste nicht gesehn. Neben 2 CD Laufwerken auch ein Multi Kartenleser, eine TV Karte, WLAN, VIELE USB Anschlüsse, seltsame Video Buchse, ein Infrarot Empfänger? Optische Leitungen, noch mehr Video/Audio Buchsen und ein SCART Anschluss!
Das Teile würde heute 4000Eur kosten!

Medion PC MT 6 Intel Pentium 4 3.0GHz ist die Bezeichnung.

Und das beste: Er geht an und zeigt ein Bild! Das BIOS ist zwar Passwort geschätzt, aber ein kurzer CMOS clear beseitigt auch das. Im BIOS stimmt sogar die System Uhr! Ich hab keine Ahnung wie die Batterie die Dezijahre überlebt hat.
Leider bootet das Teil nicht sofort vom USB Stick. Aber die Festplatte nimmt er sofort. Selbst wenn man sie im BIOS ausschaltet?!

Das FreeBSD Image ist auch schon runter geladen und auf die Festplatte kopiert

# dd if=FreeBSD-12.0-RELEASE-i386-memstick.img of=/dev/sdb bs=1M conv=sync

Noch eine zweite Festplatte für das System selbst bereit stellen, und schon geht es los. Mit dem kleinen Teufelchen.
Also die Dokumentation von FreeBSD muss ich wirklich mal loben. Die ist heute noch genauso gut und verständlich wie damals. Kein Brain gefummel.
Nur leider dauert das Backup nun schon 12 Stunden! Und erst die Hälfte ist kopiert. Ja es sind jede Menge kleine Dateien und er kopiert auch nur mit ein paar 100kB/s. Aber etwas schneller hätte ich schon erwartet. Vllt. geht auch diese Festplatte kaputt. Alt genug ist sie ja.

So, das Backup hat ganze 24 Stunden gedauert! Aber nun läuft die Installation von FreeBSD.
Nach der ersten Installation meldet grub unknown filesystem... Ja wieso grub? Klar kennt grub das BSD FS nicht. Hab ich wohl irgend etwas übersehen. Nochmal.

Diesmal wählte ich "guides" Festplatten Partitionierung und habe mehr Optionen als vorher?! Nagut. Die Anleitung hilft.

Tataa. Login. Welcome. What now?

pkg install xorg xdm xfce vim firefox gcc
Was man so eben braucht.

Bei folgender Fehlermeldunf in den Ports:

size mismatch: expected 20137, actual 20118

Hilft folgendes Kommando

pkg update -f

Oder wenn es ganz schlimm ist

make makesum

08.02.2018

line 1: #!/bin/bash: No such file or directory

Filed under: Allgemein — Tags: — Thomas @ 12:02

$ ./test.sh 
./test.sh: line 1: #!/bin/bash: No such file or directory
$ cat test.sh
#!/bin/bash
$ ll /bin/bash 
-rwxr-xr-x 1 root root 1.1M May 15  2017 /bin/bash

WTF?! Wo ist der Fehler? Ein Blick mit dem hexeditor zeigt seltsame Zeichen am Dateianfang, die im Texteditor nicht sichtbar sind.


$ head -n 1 test.sh | hexdump -C
00000000  ef bb bf 23 21 2f 62 69  6e 2f 62 61 73 68 0a     |...#!/bin/bash.|

Die Hex Zeichenfolge ef bb bf ist ein BOM (Byte order mark) und steht in diesem Fall für die Codierung einer UTF8 Datei. Diese wurde wohl automatisch in die Datei eingefügt. Nur ist Unix älter als Unicode und damals hat sich wirklich keiner dafür interessiert, so dass BOM beim interpretieren der Shellskripte nicht mit interpretiert wird. Braucht man dort auch wirklich nicht.

Leider haben die Unicode Leute nichts seit 1960 gelernt und packen wieder Kontrollzeichen in Plaintext Dateien rein. Mit dem Ergebnis, dass alles inkompatibel bleibt. Plaintext - Klartext, nimm es wörtlich. Für alle die es vergessen haben: Mit plain text (engl. für einfacher, schlichter Text) werden Daten bezeichnet, die direkt unter Verwendung einer Zeichenkodierung in Text umgesetzt werden können. Dies ist mit BOM nicht der Fall. Fail.

Mit vim bekommt man die BOM Bombe leicht wieder weg:


:set nobomb
:wq

$ head -n 1 test.sh | hexdump -C
00000000  23 21 2f 62 69 6e 2f 62  61 73 68 0a              |#!/bin/bash.|
$ ./test.sh 
$

19.01.2018

GIT specify private ssh key

Filed under: Allgemein — Tags: — Thomas @ 19:01

Das dumme an private keys ist, man kann sie nicht so einfach wie Passwörter überall mit hin nehmen. Schon garnicht zu anderen Rechner wo man selbst kein eigenen Useraccount hat. Und der vorhandene trusted user sein eigenen ssh key hat.
Bei ssh kann man leicht sein eigenes keyfile mit angeben. Bei GIT geht das auch, nur anders:

$ GIT_SSH_COMMAND='ssh -i key' git pull

Nur solle man tunlichts nicht vergessen sein keyfile wieder zu löschen. Sonst hat das ganze kein Sinn ;)

14.08.2017

sshd_config AllowUsers AllowGroups

Filed under: Allgemein — Tags: — Thomas @ 11:08

Multiuser System. Nicht alle dürfen auf alle Verzeichnisse zugreifen. Nicht alle drüfen sich vom WAN einloggen, nur vom LAN.

Geschütze Verzeichnisse nur durch eine besondere Gruppe 'intern' les- und schreibbar machen. Alle anderen haben kein Zugriff.

chmod -R 770 chgrp -R intern

Diesen Usern Gruppe 'intern' als Standardgruppe zuordnen

usermod -g intern user1

Und dafür sorgen, dass das Gruppenschreibrecht default aktiviert ist

umask 0002

In sshd_config nun User dieser Gruppe beschränkten Zugriff einstellen

Match Group intern
AllowUsers *@192.168.0.0/24 specialuser1

Dabei 'specialuser1' in der Gruppe 'intern' erlauben vom WAN zu connecten.

Alternative:
Alle user die kein ssh login haben sollen in eine spezielle Gruppe packen und allow list separat anbegen:
#The allow/deny directives are processed in the following order: DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups.
AllowUsers kater
DenyGroups nossh

30.06.2017

systemd: KillUserProcesses=no

Filed under: Allgemein — Tags: — Thomas @ 15:06

DEVUAN!

Older Posts »

Powered by WordPress