Neues Windows Update und der alte PC wird nicht mehr unterstützt

Ab und dann kann es nach einem Microsoft Windows 10 Update vorkommen, dass der Rechner nicht mehr unterstützt wird. Bei Hardware und Peripherie kennen wir das seit bald 35 Jahren. Doch immer häufiger wäre der Computer von der Leistung noch fähig, die aktuelle Version zu bedienen.

Vor ein paar Tagen habe ich eine interessante Entdeckung gemacht, für Profis nichts neues.

Als Hostsystem ein Linux installieren und Windows in einer virtuellen Maschine laufen lassen. Wenn das System 6 GB Ram hat und zwei bis vier Kerne hat, kann das gut funktionieren.

So läuft das aktuelle Windows dann doch noch auf einem nicht mehr unterstützten PC.

Meine uralte QBasic Programme (1994-1996)

Ich habe als Teenager mal programmiert. Ab der vierten Klasse mit zehn Jahren zuerst Amiga Basic. Diese Programme gingen alle verloren. Als ich 14 Jahre alt war, nutzte ich einen 486er. Da gibt es ein paar wenige QBasic Programme noch. Ich könnte mal den 8088er von 1990 starten. Da sind eine Hand voll mehr Programme, falls ich die da wieder raus bekomme. Ich war jung, hatte noch weniger Ahnung als heute und hatte GNU noch nicht gekannt. Verzeiht mir diese schlechten Programme, die ich jetzt veröffentliche. 2003 sollte bei meiner Ausbildung zum Technischen Zeichner*in zu einer Projektarbeit eine Präsentation erstellt werden. Ich weigerte mich das mit Powerpoint zu mache (konnte das entscheiden) und bastelte eine CD mit Autostart (das ging damals), die den Browser für eine html Präsentation öffnete. Es war sogar Video mit drin. Für den Autostart hatte ich ein neun Zeilen Programm in Visual Basic 6 geschrieben und sechs Stunden im Netz gesucht. Es blendete auch einen Banner ein, dass das Team von dem Projekt zeigte.

Von weltweit Milliarden programmierenden Menschen bin ich der Schlechteste. Ich kann eigentlich nicht wirklich Programme schreiben.


Hier nun die Programme:


CODE.BAS – Die dümmste Variante etwas zu verschlüsseln:

s:
CLS
ca$ = CHR$(0)
PRINT “1 = codieren”
PRINT “2 = decodieren”
PRINT “3 = unbedingt lesen”
PRINT “4 = ENDE”
PRINT : PRINT : PRINT
INPUT “Die Wahl: “, VEgMS
IF VEgMS = 1 THEN GOTO co
IF VEgMS = 2 THEN GOTO deco
IF VEgMS = 3 THEN GOTO les
IF VEgMS = 4 THEN END
GOTO s
co:
CLS
PRINT “Geben Sie die zu codierende Nachricht ein!”
INPUT na$
FOR i = 1 TO LEN(na$)
xa$ = MID$(na$, i, 1)
ca = ASC(xa$)
IF ca = 97 THEN ca = 59
IF ca = 98 THEN ca = 45
IF ca = 99 THEN ca = 41
IF ca = 100 THEN ca = 92
IF ca = 101 THEN ca = 37
IF ca = 102 THEN ca = 33
IF ca = 103 THEN ca = 43
IF ca = 104 THEN ca = 90
IF ca = 105 THEN ca = 36
IF ca = 106 THEN ca = 65
IF ca = 107 THEN ca = 61
IF ca = 108 THEN ca = 47
IF ca = 109 THEN ca = 88
IF ca = 110 THEN ca = 60
IF ca = 111 THEN ca = 63
IF ca = 112 THEN ca = 58
IF ca = 113 THEN ca = 38
IF ca = 114 THEN ca = 42
IF ca = 115 THEN ca = 40
IF ca = 116 THEN ca = 62
IF ca = 117 THEN ca = 77
IF ca = 118 THEN ca = 89
IF ca = 119 THEN ca = 46
IF ca = 120 THEN ca = 75
IF ca = 121 THEN ca = 82
IF ca = 122 THEN ca = 44
ca$ = ca$ + CHR$(ca)
NEXT i
PRINT “Die codierte Nachricht lautet:”
PRINT ca$
PRINT : PRINT
PRINT “Wollen Sie die Nachricht drucken? 1=JA, alles andere=NEIN”
INPUT VEgMS
IF VEgMS = 1 THEN LPRINT ca$
GOTO s
deco:
CLS
PRINT “Geben Sie die zu decodierende Nachricht ein!”
INPUT na$
FOR i = 1 TO LEN(na$)
xa$ = MID$(na$, i, 1)
ca = ASC(xa$)
IF ca = 59 THEN ca = 97
IF ca = 45 THEN ca = 98
IF ca = 41 THEN ca = 99
IF ca = 92 THEN ca = 100
IF ca = 37 THEN ca = 101
IF ca = 33 THEN ca = 102
IF ca = 43 THEN ca = 103
IF ca = 90 THEN ca = 104
IF ca = 36 THEN ca = 105
IF ca = 65 THEN ca = 106
IF ca = 61 THEN ca = 107
IF ca = 47 THEN ca = 108
IF ca = 88 THEN ca = 109
IF ca = 60 THEN ca = 110
IF ca = 63 THEN ca = 111
IF ca = 58 THEN ca = 112
IF ca = 38 THEN ca = 113
IF ca = 42 THEN ca = 114
IF ca = 40 THEN ca = 115
IF ca = 62 THEN ca = 116
IF ca = 77 THEN ca = 117
IF ca = 89 THEN ca = 118
IF ca = 46 THEN ca = 119
IF ca = 75 THEN ca = 120
IF ca = 82 THEN ca = 121
IF ca = 44 THEN ca = 122
ca$ = ca$ + CHR$(ca)
NEXT i
PRINT “Die decodierte Nachricht lautet:”
PRINT ca$
PRINT : PRINT
PRINT “Wollen Sie die Nachricht drucken? 1=JA, alles andere=NEIN”
INPUT VEgMS
IF VEgMS = 1 THEN LPRINT ca$
GOTO s
les:
CLS
PRINT ” B I T T E L E S E N !”
PRINT
PRINT “Die eingegebene Nachricht darf nur aus kleinen Buchstaben bestehen.”
PRINT “Zahlen muessen auch in Buchstaben geschrieben werden. Es koennen”
PRINT “nicht mehr als 250 Zeichen benutzt werden.”
PRINT “Zum Decodieren bitte nur die angegebenen Zeichen benutzen.”
PRINT : PRINT
INPUT “Return “, VEgMS
GOTO s


MULTIPRO.BAS – Genau so dumme Verschlüsselung:

CLS
INPUT “Name: “, na$
INPUT “Alter: “, al
IF al < 5 THEN PRINT “Du bist zu jung!”: END
IF al > 120 THEN PRINT “Sie sind zu alt!”: END
IF na$ = “Matthias” THEN PRINT “Diesen Namen hat der Programmierer dieses Programmes auch.”: INPUT “Return “, j
q:
CLS
PRINT “1= Codier- und Decodiermaschiene”
PRINT “2= HF”
PRINT “10= Info”
PRINT “Alles andere = Ende”
INPUT “Die Eingabe: “, j
IF j = 1 THEN GOTO cod
IF j = 2 THEN GOTO hf
IF j = 10 THEN GOTO hel
END
cod:
INPUT “1=Codierung, 2=Decodierung,3=Hauptmenue “; j
IF j = 1 THEN GOTO co
IF j = 2 THEN GOTO deco
GOTO q
co:
CLS
PRINT na$; “, gebe die zu codierende Nachricht ein!”
INPUT n$
FOR i = 1 TO LEN(n$)
x$ = MID$(n$, i, 1)
c = ASC(x$) + al
IF c > 255 THEN c = c – 255
c$ = c$ + CHR$(c)
NEXT i
PRINT “Die codierte Nachricht lautet:”
PRINT c$
PRINT : PRINT
INPUT “1=Hauptmenue, 2=nochmal”, j
IF j = 1 THEN GOTO q
GOTO co
deco:
CLS
PRINT na$; “, gebe die codierte Nachricht ein! “
PRINT “ACHTUNG! Die Altersangabe am Anfang muss mit der Altersangabe”
PRINT “von der codierten Nachricht uebereinstimmen!!”
INPUT n$
FOR i = 1 TO LEN(n$)
x$ = MID$(n$, i, 1)
c = ASC(x$) – al
IF c < 0 THEN c = c + 255
d$ = d$ + CHR$(c)
NEXT i
PRINT “Die decodierte Nachricht lautet:”
PRINT d$
PRINT : PRINT
INPUT “1=Hauptmenue, 2=nochmal”, j
IF j = 1 THEN GOTO q
GOTO deco
hel:
CLS
PRINT ” I N F O”
PRINT
PRINT ” Die Codiermaschiene”: PRINT
PRINT “Es werden zwar alle wichtigen Sachen im Programmabschnitt”
PRINT “erwaehnt, aber es wurden noch Fehler entdeckt.”
PRINT “So ist es moeglich, noch einmal ein Nachricht einzugeben, doch”
PRINT “das Ergebnis wird einfach hinter das vorherige Ergebnis angehaengt.”
PRINT “Das Programm muss jedesmal neu gestartet werden. In der Original-“
PRINT “Version ist dieser Fehler schon behoben worden. Preis: 399,-DM”
PRINT “Fehler Nr.2, der nicht beseitigt werden kann: Die Nachricht kann nicht”
PRINT “laenger als 250 Zeichen sein. Je nach dem, welches Alter eingegeben”
PRINT “wurde (haengt von der Codierung ab), kann es vorkommen, dass bestimmte”
PRINT “Zeichen nicht lesbar sind. In der Originalversion auch behoben.”
PRINT : PRINT
PRINT ” H F”
PRINT “Teste Dein Gehoer! Wenn Du den Ton nicht mehr hoerst, druecke sofort”
PRINT “auf Pause, damit Du die Frequenz ablesen kannst. Druecke dann eine”
PRINT “beliebige Taste.”
INPUT “Return “, j
GOTO q
hf:
FOR i = 40 TO 25000
PRINT “Frequenz: “; i; ” Hz”
SOUND i, 3
i = i * 1.01
NEXT i
INPUT “Return “, j
GOTO q


MESSER.BAS – Ein sehr primitives Testprogramm zu Messen der CPU Geschwindigkeit für 8086 bis 586:

CLS
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 4, 27: PRINT “(c) 1996 by Matthias Schmidt”
LOCATE 6, 19: PRINT “G E S C H W I N D I G K E I T S M E S S E R”
LOCATE 8, 35: PRINT “fr Ihren PC”
LOCATE 16, 32: INPUT “Weiter mit RETURN”, VEgMS
start:
CLS
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 12, 17: PRINT “Ihr Computer wird nun eine Schleife ausrechnen.”
LOCATE 13, 17: PRINT “Dafr braucht er eine bestimmte Zeit. “
LOCATE 14, 17: PRINT “Die Zeit wird gez„hlt und nacher angegeben. “
LOCATE 15, 17: PRINT “Daran k”nnen sie erkennen, wie schnell ihr “
LOCATE 16, 17: PRINT “Rechner ist. “
LOCATE 18, 32: INPUT “Weiter mit RETURN”, VEgMS
CLS
a$ = TIME$
FOR i = 1 TO 10000
CLS
LOCATE 10, 25: PRINT i; ” von 10000. Bitte warten.”
NEXT i
b$ = TIME$
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 3, 28: PRINT “Zeit des Startes: “; a$
LOCATE 5, 28: PRINT “Zeit des Endes: “; b$
xa$ = MID$(a$, 1, 1)
v = ASC(xa$)
IF v = 48 THEN c = 0
IF v = 49 THEN c = 1
IF v = 50 THEN c = 2
IF v = 51 THEN c = 3
IF v = 52 THEN c = 4
IF v = 53 THEN c = 5
IF v = 54 THEN c = 6
IF v = 55 THEN c = 7
IF v = 56 THEN c = 8
IF v = 57 THEN c = 9
c = c * 10
xa$ = MID$(a$, 2, 1)
v = ASC(xa$)
IF v = 48 THEN c = c + 0
IF v = 49 THEN c = c + 1
IF v = 50 THEN c = c + 2
IF v = 51 THEN c = c + 3
IF v = 52 THEN c = c + 4
IF v = 53 THEN c = c + 5
IF v = 54 THEN c = c + 6
IF v = 55 THEN c = c + 7
IF v = 56 THEN c = c + 8
IF v = 57 THEN c = c + 9
xa$ = MID$(a$, 4, 1)
v = ASC(xa$)
IF v = 48 THEN d = 0
IF v = 49 THEN d = 1
IF v = 50 THEN d = 2
IF v = 51 THEN d = 3
IF v = 52 THEN d = 4
IF v = 53 THEN d = 5
IF v = 54 THEN d = 6
IF v = 55 THEN d = 7
IF v = 56 THEN d = 8
IF v = 57 THEN d = 9
d = d * 10
xa$ = MID$(a$, 5, 1)
v = ASC(xa$)
IF v = 48 THEN d = d + 0
IF v = 49 THEN d = d + 1
IF v = 50 THEN d = d + 2
IF v = 51 THEN d = d + 3
IF v = 52 THEN d = d + 4
IF v = 53 THEN d = d + 5
IF v = 54 THEN d = d + 6
IF v = 55 THEN d = d + 7
IF v = 56 THEN d = d + 8
IF v = 57 THEN d = d + 9
xa$ = MID$(a$, 7, 1)
v = ASC(xa$)
IF v = 48 THEN e = 0
IF v = 49 THEN e = 1
IF v = 50 THEN e = 2
IF v = 51 THEN e = 3
IF v = 52 THEN e = 4
IF v = 53 THEN e = 5
IF v = 54 THEN e = 6
IF v = 55 THEN e = 7
IF v = 56 THEN e = 8
IF v = 57 THEN e = 9
e = e * 10
xa$ = MID$(a$, 8, 1)
v = ASC(xa$)
IF v = 48 THEN e = e + 0
IF v = 49 THEN e = e + 1
IF v = 50 THEN e = e + 2
IF v = 51 THEN e = e + 3
IF v = 52 THEN e = e + 4
IF v = 53 THEN e = e + 5
IF v = 54 THEN e = e + 6
IF v = 55 THEN e = e + 7
IF v = 56 THEN e = e + 8
IF v = 57 THEN e = e + 9
xa$ = MID$(b$, 1, 1)
v = ASC(xa$)
IF v = 48 THEN cm = 0
IF v = 49 THEN cm = 1
IF v = 50 THEN cm = 2
IF v = 51 THEN cm = 3
IF v = 52 THEN cm = 4
IF v = 53 THEN cm = 5
IF v = 54 THEN cm = 6
IF v = 55 THEN cm = 7
IF v = 56 THEN cm = 8
IF v = 57 THEN cm = 9
cm = cm * 10
xa$ = MID$(b$, 2, 1)
v = ASC(xa$)
IF v = 48 THEN cm = cm + 0
IF v = 49 THEN cm = cm + 1
IF v = 50 THEN cm = cm + 2
IF v = 51 THEN cm = cm + 3
IF v = 52 THEN cm = cm + 4
IF v = 53 THEN cm = cm + 5
IF v = 54 THEN cm = cm + 6
IF v = 55 THEN cm = cm + 7
IF v = 56 THEN cm = cm + 8
IF v = 57 THEN cm = cm + 9
xa$ = MID$(b$, 4, 1)
v = ASC(xa$)
IF v = 48 THEN dm = 0
IF v = 49 THEN dm = 1
IF v = 50 THEN dm = 2
IF v = 51 THEN dm = 3
IF v = 52 THEN dm = 4
IF v = 53 THEN dm = 5
IF v = 54 THEN dm = 6
IF v = 55 THEN dm = 7
IF v = 56 THEN dm = 8
IF v = 57 THEN dm = 9
dm = dm * 10
xa$ = MID$(b$, 5, 1)
v = ASC(xa$)
IF v = 48 THEN dm = dm + 0
IF v = 49 THEN dm = dm + 1
IF v = 50 THEN dm = dm + 2
IF v = 51 THEN dm = dm + 3
IF v = 52 THEN dm = dm + 4
IF v = 53 THEN dm = dm + 5
IF v = 54 THEN dm = dm + 6
IF v = 55 THEN dm = dm + 7
IF v = 56 THEN dm = dm + 8
IF v = 57 THEN dm = dm + 9
xa$ = MID$(b$, 7, 1)
v = ASC(xa$)
IF v = 48 THEN em = 0
IF v = 49 THEN em = 1
IF v = 50 THEN em = 2
IF v = 51 THEN em = 3
IF v = 52 THEN em = 4
IF v = 53 THEN em = 5
IF v = 54 THEN em = 6
IF v = 55 THEN em = 7
IF v = 56 THEN em = 8
IF v = 57 THEN em = 9
em = em * 10
xa$ = MID$(b$, 8, 1)
v = ASC(xa$)
IF v = 48 THEN em = em + 0
IF v = 49 THEN em = em + 1
IF v = 50 THEN em = em + 2
IF v = 51 THEN em = em + 3
IF v = 52 THEN em = em + 4
IF v = 53 THEN em = em + 5
IF v = 54 THEN em = em + 6
IF v = 55 THEN em = em + 7
IF v = 56 THEN em = em + 8
IF v = 57 THEN em = em + 9
f = cm – c
g = dm – d
h = em – e
IF h < 0 THEN h = h + 60: g = g – 1
IF g < 0 THEN g = g + 60: f = f – 1
IF f < 0 THEN f = 0
LOCATE 8, 26: PRINT “Ihr System ben”tigte: “
LOCATE 10, 26: PRINT f; ” Stunden “
LOCATE 11, 26: PRINT g; ” Minuten “
LOCATE 12, 26: PRINT h; ” Sekunden, “
LOCATE 14, 26: PRINT “um die Schleife auszurechnen. “
LOCATE 17, 26: PRINT “ACHTUNG! Sekunden k”nnen sich “
LOCATE 18, 26: PRINT ” um 1 ver„ndern! “
LOCATE 20, 26: INPUT ” Weiter mit RETURN. “, VEgMS
fal:
CLS
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 10, 18: PRINT “1 = ENDE 2 = Information DRUCKEN 3 = nochmal”
LOCATE 12, 15: PRINT “Geben Sie die Zahl ein und dannach RETURN.”
LOCATE 14, 40: INPUT VEgMS
IF VEgMS = 1 THEN GOTO ende
IF VEgMS = 2 THEN GOTO druck
IF VEgMS = 3 THEN GOTO start
GOTO fal
ende:
CLS
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 10, 22: PRINT “DIESES PROGRAMM MUSS KOPIERT WERDEN!!!”
LOCATE 11, 22: PRINT “————————————–“
LOCATE 12, 22: PRINT ” “
LOCATE 13, 22: PRINT “Wenn Sie dieses Programm benutzt haben”
LOCATE 14, 22: PRINT “, máen Sie es weiter geben, damit es “
LOCATE 15, 22: PRINT “sich verbreiten kann. Durch die Ver- “
LOCATE 16, 22: PRINT “breitung mittels Kopie entf„llt die “
LOCATE 17, 22: PRINT “Zahlungspflicht. Ver. 1.1 4/96”
LOCATE 20, 26: INPUT ” Zurck zu DOS mit RETURN. “, VEgMS
PRINT
PRINT
END
druck:
CLS
FOR i = 1 TO 25
PRINT CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$( _
176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); _
CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176); CHR$(176)
NEXT i
LOCATE 10, 26: PRINT ” Text wird gedruckt an LPT1. “
LPRINT “GESCHWINDIGKEITSMESSER FšR IHREN PC VER. 1.1 4/96 VEgMS”
LPRINT
LPRINT “*********************************************************”
LPRINT “Am “; DATE$; ” wurde ein Testlauf auf Ihrem PC gemacht.”
LPRINT
LPRINT “ERGEBNIS:”
LPRINT
LPRINT “Ihr System ben”tigte: “
LPRINT
LPRINT f; ” Stunden “
LPRINT g; ” Minuten “
LPRINT h; ” Sekunden, “
LPRINT
LPRINT “um die Schleife auszurechnen. “
LPRINT “ACHTUNG! Sekunden k”nnen sich um 1 ver„ndern”
LPRINT
LPRINT “DIESES PROGRAMM MUSS KOPIERT WERDEN!!!”
LPRINT “Wenn Sie dieses Programm benutzt haben”
LPRINT “, máen Sie es weiter geben, damit es “
LPRINT “sich verbreiten kann. Durch die Ver- “
LPRINT “breitung mittels Kopie entf„llt die “
LPRINT “Zahlungspflicht. Ver. 1.1 4/96”
LOCATE 22, 32: INPUT “Weiter mit Return!”, VEgMS
GOTO fal


MATHE.BAS – Ein kleines Programm für geometrische Berechnung (etwas sinnvoller):

SCREEN 0
anfang:
CLS
WIDTH 80, 50

LOCATE 20, 25: PRINT “Volumenberechnung “
LOCATE 21, 25: PRINT “Dreieck 1”
LOCATE 22, 25: PRINT “Rechteck 2”
LOCATE 23, 25: PRINT “Quader 3”
LOCATE 24, 25: PRINT “Pyramide 4”
LOCATE 25, 25: PRINT “ENDE e”
LOCATE 30, 25: INPUT “Bitte Ausw„hlen”; n

IF n = 1 THEN GOTO Dreieck
IF n = 2 THEN GOTO rechteck
IF n = 3 THEN GOTO quader
IF n = 4 THEN GOTO pyramide
IF n = e THEN GOTO ende

IF NOT n = 1 THEN GOTO falsch
IF NOT n = 2 THEN GOTO falsch
IF NOT n = 3 THEN GOTO falsch
IF NOT n = 4 THEN GOTO falsch
IF NOT n = e THEN GOTO falsch

Dreieck:
CLS
INPUT “L„nge”; a
INPUT “Breite”; b
INPUT “H”he”; h

rechnung = (a * b) * h / 2
PRINT “Das Ergebniss ist”; rechnung
LOCATE 40, 1: INPUT “Drcke ENTER um Fortzufahren”; enter
GOTO anfang

rechteck:
CLS
INPUT “L„nge”; a
INPUT “Breite”; b
INPUT “H”he”; h

rechnung = a * b * h
PRINT “Das Ergebniss ist”; rechnung
LOCATE 40, 1: INPUT “Drcke ENTER um Fortzufahren”; enter
GOTO anfang

quader:
CLS
INPUT “L„nge”; a
rechnung = a * a * a
PRINT “Das Ergebniss ist”; rechnung
GOTO anfang

pyramide:
CLS
INPUT “L„nge”; a
INPUT “Breite”; b
INPUT “H”he”; h

rechnung = (a * b) * h / 3
PRINT “Das Ergebniss”; rechnung
LOCATE 40, 1: INPUT “Drcke ENTER um Fortzufahren”; enter
GOTO anfang

falsch:
CLS
PRINT “Falsche Eingabe”
GOTO anfang

ende:
END


 

Debian Software Raid 1 mit LVM auf HP Z600 mit 8 TB Festplatten

Ich zweifle oft an mir selbst und es kann sein, dass ich vieles falsch mache. Ich hatte die letzten Tage erhebliche Probleme, möchte jedoch nun mitteilen, wie ich das gelöst habe. Möglicherweise ist dieser Fall speziell und ich habe Fehler gemacht, oder ich habe etwas gelöst, was nicht vorgesehen war.

Das Vorhaben:

Auf einer HP Z600 Workstation mit zwei Intel Xeon E5640 Prozessoren und genug Ram sollen zwei 8TB Festplatten ein Raid 1 Array Verbund mit LVM unter GNU Debian Linux 9 haben.
Vorher war Debian auf einer 8 TB HDD.

Das Problem:

Ich hatte vor zwei Jahren schon einmal ein verschlüsseltes LVM mit Raid 1 unter Debian zum laufen gebracht und benötigte drei Abläufe wegen Unkenntnisse. Es war ein anderer Computer. Nun funktionierten so ziemlich alle Tutorials und Anleitung nicht, die unterschiedlich Partitionieren  beschrieben. Grub oder Lilo ließen sich nicht installieren, oder fanden den Raid Verbund nicht. Mal wurde Platte nicht gefunden, ein andres mal machte der Rechner eine Reboot Loop Schleife, bei etwas komischer abweichender Konfiguration.

Nach normaler Vorgehensweise konnte Grub 2 nicht installiert werden. Ich versuchte alle denkbaren Einträge:

/dev/sdX /dev/sdX1 2 usw. /dev/md0 1 usw.

Die Ursache:

Das Disk Label der beiden Platten machte Probleme, zumindest in diesem speziellen Fall auf dieser Workstation.  Damit die acht Terabyte voll genutzt werden können,  waren sie auf GPT. Komischerweise lief das System mit einer Platte als GPT. Als Raid 1 möchte Grub2 auf einer ms-dos gelabelten Platte, also den Mountpoint /boot .

Den Unterschied vom ms-dos und GPT Label ist im Menü an der Partitionen zu erkennen, z.B. pri/log bei ms-dos.
Die Label habe ich mit Gparted Live CD angepasst. Doch 8 TB in zwei Terabyte Stücken bis max. 4 TB macht kein Sinn. Doch so ist das Boot Flag setzbar. Wird normalerweise heute nicht mehr gebraucht, aber vielleicht ist diese Maschine anders.

Meine spezielle Lösung:

Eine kleine dritte Platte.

  • /dev/sda mit 250GB ms-dos
  • /dev/sdb mit 8 TB GPT
  • /dev/sdc mit 8 TB GPT

 

  • /boot und Swap Auslagerungsdatei auf /dev/sda
  • /dev/md0 mit /dev/sdb und /dev/sdc als Raid
  • LVM auf /dev/md0 mit Volumen Groupe vg0 und Logisches Volumen lv_root
  • Dateisystem ext4 auf lv_root mit Einhängepunkt /

So hat es nach zwei Tagen endlich geklappt.

kilo-byte.de wird schöner und ab nun als mein IT Blog genutzt

Viele Jahre war die Seite kilo-byte.de sehr bescheiden. Nun wurde sie auf ein WordPress umgezogen. Die Blogeinträge über Computer und IT auf meiner Hauptseite schmidt-matthias.de sind nun hier aufgeführt. In Zukunft werde ich diese Themen hier verblogen, aktuelles, sowie Anekdoten aus der Vergangenheit. Demnächst also mehr Inhalt hier.

Nachtrag zum Server Ausfall von Anfang September

Einen Monat später sollte die Eingebung zur Rettung der Daten auf der Ursprungsplatte kommen. Mittlerweile waren die noch vorhandenen VMs auf einer großen Platte mit Debian als Host System umgezogen. Nach der Datenrettung wird dort zusammen mit der Ursprungsplatte ein RAID gebaut. Es wurde nochmal kniffelig.

Der Plan: Auf einer kleinen alten Platte wurde ein frisches FreeBSD aufgesetzt. Die mit Geli verschlüsselte Ursprungsplatte mit ZFS als zweite Platte und die Zielplatte mit LVM als dritte angeschlossen. Und los als root:

kldload fuse.ko was dann eigentlich nicht gebraucht wurde, ich dachte ext4 und lvm2 gehören zusammen, ist es aber nicht. Oder doch? Ich weiß es nicht.

# kldload /boot/kernel/geom_linux_lvm.ko
# cd /usr/ports/sysutils/fusefs-ext4fuse/
# make install clean
# mkdir /mnt/linux
# ext4fuse /dev/linux_lvm/volumegroup-logicalvolume /mnt/linux

Wobei volumegroup-logicalvolume durch den entsprechenden Eintrag in /dev geändert wurde.

Toll, die Zielplatte war eingebunden. Leider kam ich mit der Ursprungsplatte genau so wenig weiter, wie einen Monat zuvor. Die Idee, im unverschlüsselten bootpool nochmal zu gucken, brachte mich weiter. So wie ich den Key rauskopiert hatte, konnte ich diese nochmal einbinden.

zfs import -N -f bootpool # forcefully import bootpool, but don’t mount it.
zfs set mountpoint=/tmp/bootpool bootpool
zfs mount bootpool

In /boot/loader.conf sollte alles benötigte stehen:

geom_eli_load=”YES”
geli_da0p4_keyfile0_load=”YES”
geli_da0p4_keyfile0_type=”da0p4:geli_keyfile0″
geli_da0p4_keyfile0_name=”/boot/encryption.key”

vfs.root.mountfrom=”zfs:zroot”
zfs_load=”YES”

Das sollte auf die Bootplatte, dachte ich, da0p4 auf da1p4 geändert natürlich. Im Eifer des Gefechts hatte ich vergessen, für LVM Einbindung der Zielplatte einzurichten. Aber das Hochfahren war exakt so, wie vor dem Upgrade Anfang September.

Ich war wieder auf dem ursprünglichen System!

Weil ich die LVM Einbindung vergessen hatte, war die Zielplatte zunächst nicht erreichbar. Ich kam nicht mehr in /boot. Das Kuriose nun war, die Ursprungsplatte konnte alleine wegen dem kaputten init nicht starten. Die frische FreeBSD Platte konnte nun auch nicht mehr alleine starten, wegen den loader.conf Einträgen. Beide Platten zusammen ermöglichten jetzt das Starten des ursprünglichen Systems.

Ich entschloss mich, das Debian normal zu starten, damit die VMs auch wieder online waren. Die beiden symbiotischen FreeBSD Platten kamen in einen Ersatz Rechner. Nun konnte, zwar langsam über Netzwerk, die Datenrettung beginnen. Und mit dem Vorteil, kopieren der Daten zeitgleich mit den laufenden VMs.

Gollum hatte wieder Glück gehabt.

Drei Tage totaler Server Ausfall

Am Freitag, den 1. September 2017, früh morgens ab drei Uhr, machte ich ein Upgrade des FreeBSD Host von Version 11.0 auf 11.1. Zunächst lief alles nach Plan. Doch eine Inkompatibilität versperrte den Netzwerkzugang der virtuellen Maschinen mit Virtualbox. Es begann eine Verkettung von Fehlern und meine Fähigkeiten schwanden. Auch der Mix aus neuen, alten und falschen Informationen im Netz, fast alles auf Englisch, hinderten mich an einer Lösung der Probleme. In den Foren war nicht klar zu entnehmen, ob es sich um einen Software Fehler oder um eine falsche Konfiguration handelt. Da bei der Release Version von FreeBSD Wochen vergehen können, bis Aktualisierungen verfügbar sind, plante ich, die VMs waren eh schon offline, ein Downgrade zurück auf 11.0. Das ging mächtig schief.

Vorwärts immer, rückwärts nimmer – Gilt wohl auch für BSD. Auf jeden Fall war das init sehr kaputt (Kernel panic: no init), das System nicht mehr startbar. Die Überlegung war, den FreeBSD Host auf einer anderen Platte nach zu bauen und die VMs und diverse Platten Images zu kopieren. Ich sollte hart scheitern. Das ZFS Dateisystem ist mit GELI verschlüsselt. Die Key Datei habe ich exportiert bekommen. Mir war es nach einen Tag nicht gelungen, das Dateisystem einzubinden. Es gibt irgendwelche ZFS allow/unallow Parameter und mit create und destroy war ich zurückhaltend, bevor etwas hätte überschrieben werde können. Fehler beim Denken verhinderten hier ein Weiterkommen. Der Plan war ursprünglich folgender:

mkdir /tmp/bootpool
zfs import # lists the available pools to import. bootpool should be listed there
zfs import -N -f bootpool # forcefully import bootpool, but don’t mount it.
zfs set mountpoint=/tmp/bootpool bootpool
zfs mount bootpool
geli attach -k /tmp/bootpool/boot/encryption.key /dev/ada1p4
Enter passphrase:

Das Passwort konnte eingegeben werden, jedoch der folgende Befehl wurde verweigert:

zfs import -N -f zroot

Weiter hätte ich dies eingegeben_

mkdir /mnt/hd
zfs create -o mountpoint=/mnt/hd zroot/zroot
mount /dev/ada1p4.eli /mnt/hd

An die Daten auf der Festplatte kam ich nun nicht mehr heran. Ich hatte sie beiseite gelegt. Weil die Key Datei gesichert werden konnte, wurde das Rauskopieren vertagt, bis eine Eingebung mich weiter bringen wird.

Von den wichtigen VMs gab es ein Backup vom 19. August 2017, also knapp zwei Wochen alt. Den zweiten Tag scheiterte ich daran, den Host wieder so nach zu bauen, wie ich den vor ein paar Jahren gebaut hatte. Aus ein paar Gründen benötige ich ein minimales grafisches System, X11. Doch die Grafikkarte und nicht mehr weiter entwickelten Treiber untermauerten mein Versagen. Ich bekam es nicht mehr hin. Es wuchs in mir der Entschluss, den Host für die VMs mit Debian zu bauen.

Es bahnten sich schon lange Gründe an, warum Debian sinnvoller sein mögen, ich hatte die Denkweise, ein schlanken Host mit FreeBSD, konservativ und stabil. Da aber noch Drucker, Scanner usw. irgendwann wieder genutzt werden könnten sollte, die FreeBSD entweder wegen der fehlenden Treiber oder des nicht durchschleusbaren USB 2.0 mit Virtualbox nicht unterstützt, sollte ein Wechsel zu Debian stattfinden.

Die aktuelle Version von Debian 9.1.0 hat einen kaputten Netzwerkmanager, es empfiehlt sich, von 9.0.0 zu installieren, alles einzurichten und erst dann das System upzugraden. Diese Erkenntnis hatte ich nach einem dreiviertel Tag später dann auch.

Endlich konnten neun VMs umziehen und wieder gestartet werden. Endlich auch wieder Freifunk verfügbar. Ein RAID System wäre auch für mein Server gut, jedoch in diesem Fall hätte genau das nicht gereicht. Die Backups haben mir sehr viel Arbeit erspart, auch wenn der Speichstand zwei Wochen alt war. Es sind ein Protokoll im Wiki und Eintragungen im Wekan abhanden gekommen, aber diese sind noch auf der Ursprungsplatte. Vielleicht ist da doch noch ein Herankommen.

Meine kognitive Dissonanz, da steht z.B.

zfs allow -u someuser send,snapshot mypool

in der Anleitung, aber someuser und mypool muss anders sein. Also ich habe starke Problem bei Anleitungen zu sehen, welche Teile eines Befehls an das eigene System angepasst werden muss. Ich kann mir Vokabeln schlecht merken, daher immer wieder Probleme mit Syntax, Variablen usw.

Die drei Tage waren mit sehr viel Müdigkeit verbunden, die Hälfte der Ausfallzeit habe ich geschlafen. In einer Bank oder in einem Konzern wäre das “Durchmachen” Pflicht des Admin gewesen. Daher habe ich wieder große Zweifel, jemals beruflich den Quereinstieg zu schaffen. Ich kann das nicht leisten.

Würde ich die Admin Tätigkeit beruflich machen, würde nicht alles auf einem Server laufen. Wäre etwas mehr Geld verfügbar, gäbe es zwei separate Internetanschlüsse, jeweils mit zwei Server mit RAID als Clusterverbund und ein Speichersystem für Backups mit kürzeren Speicherzyklen.

An dem Konzept dezentrales Internet möchte ich festhalten. Jedoch 72 Stunden Ausfall mit Datenverlust sind nicht verzeihbar, das darf nicht passieren. Die Fähigkeiten sollte ich sehr bescheiden sehen. Ich mache nach wie vor viel zu viele Fehler. Ich muss gebremst werden.

IPV6Day 2017 – Endlich sind auch meine Server dabei

Besser spät, als nie, nun gut. Morgen, am 6.6. ist wieder #IPV6Day. Als erstes dachte ich, dass an dem Tag IPV4 blockiert wird. Es ist aber wohl so, dass es darum geht, neben IPV4 IPV6 einzuschalten und DNS AAAA Records einzutragen. Endlich sind meine Server auch so angeschlossen, bzw. die wichtigen VMs. IPV4 kann meinetwegen begraben werden.

So sieht zur Zeit mein Netzwerk aus:

Server nun über IPV4 und IPV6 erreichbar

Seit einiger Zeit läuft der Homeserver über eine feste IPV4 Adresse mit einem bussiness Vertrag. Leider bietet der Provider keine IPV6 Adressen an. Ich habe mich nun dem Thema IPV6 gestellt. Ich hatte Vorurteile, die ich nun widerlegen konnte. IPV4 und IPV6 haben so einige Unterschiede, jedoch ist die Menge des zu Lernenden etwa gleich. Ich habe jetzt einen IPV6 Tunnel und der Server kann so erreicht werden. Seit über 20 Jahren soll das Internet nun umgestellt werden, IPV4 hält sich konservativ. Auch ich bin viel zu spät dran am Thema und werde mir die Frage stellen müssen, warum nicht eher. Ich hatte Sorge mit den langen Adressen. Nun habe ich einige Seiten über IPV6 gelesen und das praktische Umsetzen hat mir geholfen, keine Sorgen mehr zu haben. Nach einem halben Tag des Studiums und des Einrichtens des Netzwerkes habe ich das grundsätlich alles verstanden. Ich bin froh, dass die Konzentration besser geworden ist und ich noch ein wenig lernen kann. Meinetwegen kann IPV4 abgeschaltet werden.