VirtManager und KVM unter Ubuntu 20.10
30.01.21 (Allgemein)
Als erstes die benötigten Pakete:
sudo apt install -y qemu qemu-kvm qemu-utils libvirt-daemon libvirt-daemon-system libvirt-clients bridge-utils virt-manager gir1.2-spice-client-gtk-3.0
30.01.21 (Allgemein)
Als erstes die benötigten Pakete:
sudo apt install -y qemu qemu-kvm qemu-utils libvirt-daemon libvirt-daemon-system libvirt-clients bridge-utils virt-manager gir1.2-spice-client-gtk-3.0
03.06.18 (Allgemein)
Hier eine Lösung sollte samba nach einen update von Debian streiken.
Hat mir bei meinen Raspbian weitergeholfen (Backup der Konfiguration nicht vergessen):
sudo apt-get clean && sudo apt update sudo apt-get remove samba sudo shutdown -r now dpkg -l | egrep '^ii' | awk '{print $2}' | grep samba | xargs sudo apt install --reinstall -o Dpkg::Options::=--force-confnew -y
https://forum-raspberrypi.de/forum/thread/37420-keine-freigabe-vom-pi-mehr/?postID=314136#post314136
15.04.16 (Allgemein)
Folgendes Kurzes Tutorial geht davon aus das ihr screen unter Linux benutzt und zwei offene Fenster habt.
beendet euren MySQL Service z.B. mit test
service stop mysql
oder
systemctl mysqld stop
Danach starten wir MySQL mittels mysqld_safe und schalten die grand Tabellen ab um ohne Passwort auf die Datenbank zuzugreifen
mysqld_safe --skip-grant-tables
und melden uns als root ohne Passwort auf unserer MySQL Console an.
mysql --user=root mysql
Im MySQL Terminalprogramm selber updaten wir nun das Passwort mittels dieses Befehls. Tauscht hier NEUESPASSWORT gegen euer neues Passwort aus.
update user set Password=PASSWORD('NEUESPASSWORT') where user='root'; flush privileges; exit;
danach nur noch im zweiten screen Fenster MySQL wieder beenden mittels
mysqladmin -u root -p shutdown
Hier könnt ihr bereits euer neues Passwort eingeben (NEUESPASSWORT).
Jetzt nur noch die Dienste wieder normal starten
service start mysql
oder
systemctl mysqld start
Und schon könnt ihr euch wieder einloggen.
13.03.16 (Allgemein)
Dieser Artikel dient erstmal hauptsächlich meinen Persönlichen Frustabbau aber auch als Warnung um nicht in den Kreis der leid genossenen zu Kommen.
Alles fing an einen schönen Mittwoch an als ich tatsächlich mal meinen Flyer von Unitymedia Beachtung schenkte: 1,99€ mehr im Monat dafür doppelte Bandbreite. Alleine die 6 Mbits Upload klangen verführerisch momentan gurke ich mit 2,5 Mbits rum. Der Rest mit 120 Mbits surfen klang auch nach einen „nice to have“. Da ich ein verwöhnter Altkunde bin der sich zum Glück nicht mit Gängelung wie DS-Lite oder schlechter Hardware (habe eine fritzbox 6340) rumärgern musste und sich über echten Dualstack mit ipv4 und ipv6 freut, mussten natürlich vorher Details geklärt:
werden.
Vorher natürlich schon gegoogelt… Ok die 6360 gibt es zu 120er Businesstarif und meine ist auch noch in der liste bis 200 Mbits sollte doch klappen.
Also der griff zum Telefon,
„behalte ich den auch meinen ipv4 (dualstack)“
Antwort: „JA Altkunden eigentlich immer“
„kann ich auch meine Fritz!box weiter benutzen“
Antwort: „JA, wahrscheinlich können sie ihren neuen Tarif sogar schon heute nutzen“
Von dieser Auskunft sehr erfreut, natürlich gleich abgeschlossen.
Am nächsten tag Tarif hat sich nicht geändert, dafür im Kundenmenü eine Paketankündigung. Ok mal eine Mail dorthin was das ist, mit vermerk auf die Zusicherung „meiner“* Fritzbox
Was kommt am Freitag? Eine „Connect Box“ misstrauisch das ding mal begutachtet und ohne an das Kabelnetz zu hängen mal die Oberfläche begutachtet. Ok könnte was werden ich sehe hier einen Modemodus und wenn ich meine Dualstack behalte, kann ich die wohl doch gebrauchen (Modem ist mir eh lieber). Ok mutiger schritt es ist Freitag Nachmittag ich hänge sie trotzdem ans Netz. Box blinkt und scheint irgendwann damit auch fertig zu sein.
Laptop test weise dran und die Ernüchterung: Vorher vorgenommen Einstellung natürlich weg unten auch die tolle Nachricht das sie auf DSlite läuft.
Also mal wieder Support angerufen dort hin und her nein das sollte nicht pasieren beim router könnten sie nichts machen mich aber wenigstens auf Duralsack wieder umstellen.
Nach dem ich also endlich bei einen Techniker in der Leitung war erklärte der mir das die Firmware der Conectbox das garnicht könnte die läuft softwareseitig nur mit DSlite. Und stellte mich zu einer Dame weiter die sich mit meinen Belangen beschäftigen sollte. Der erklärte ich mein Anliegen, natürlich war ich nach so einen Martyrium auch nicht mehr der Höflichste, Und verwies auch mehrfach auf mein Telefonat mit den Vertragsabschluss (die mal nebenbei gesagt eigentlich bindend sind ansonsten kommt gar kein gültiger Vertrag zu stande naja zumindestens nach Fristverstreich der Nachbesserung…) Das passte der Dame wohl überhaut nicht und erklärte mir das ich als Privatperson überhaupt keine ipv4 bräuchte ich einen Buissnesvertragabschließen müsste und wenn ich eine Fritzbox möchte ich für 5€ mehr im Monat eine Telefon Connfort Option bräuchte. das härteste sie legte nach einer knappen Rückfrage ob ich das verstanden hätte einfach auf.
Also nochmal anrufen irgendjemand wird einen ja helfen können. Diesmal tatsächlich an jemanden kompetenteren geraten der mir wenigstens anbot meine alten Vertragsbedingungen wiederherzustellen, ich solle einfach meine Fritz box wieder anschließen und er leite alles weitere ein.
Nun sehr genervt dafür aber mit einen vermeintlich wieder funktionierenden*(dazu später mehr) Dual stack Anschluss wen auch wieder mit nur 50/2.5mbit also mal das gemacht was alle foren so empfehlen seinen Frust auf Facebook gepostet:
Warum könnt ihr eure Verkaufspersonal nicht besser schulen?
Upgrade Angebot auf 120Mbits ist bei mir reingeflattert, hmm ist interessant, also mal die Hotline Anrufen.
Frage:
„behalte ich den auch meinen ipv4“
Antwort: „JA“
„kann ich auch meine Fritz!box weiter benutzen“
Antwort: „JA“
Was kommt heute? Eine „Connect Box“
was kann die? NICHTS!
Nichtmal Portweiterleitung und natürlich ausschließlich DS-Lite.
Und Dafür jetzt 1 Stunde Am Telefon verbracht um meine Änderung rückgängig zu machen und um mir erzählen zu lassen „das was sie wollen geht nicht bezahlen sie gefälligst mehr“. Eine Fritz!box die die benötigten Funktionen incl. ipv4 könnte, gibt es ja sogar, aber natürlich nur gegen 5 € Aufpreis.
Gratulation ihr habt mir gerade mein Wochenende versaut „frown“-Emoticon
https://m.facebook.com/Unitymedia/posts/1137595382925523
*zwischenzeitlich stellte sich heraus das mein Internet zwar wieder geht und ich keine zwangsdrossel mehr über mein Handymodem brauche aber das Telefon nicht. den das wurde vergessen zu provisionieren.
wie es weitergeht und ging packe ich in einen zweiten Post….
06.01.16 (Allgemein)
Das Suchen und ersetzen Feld in Netbeans (STRG+H) ist sehr praktisch vorallem mit regex
ein par regex meiner täglichen arbeit sollen hier nun veröffentlicht werden für alle die sie gebrauchen können oder damit ich sie selber nicht vergesse:
Alte array() schreibweise in php > 5.4 „[]“ Arrays
Find What:array\(([^\(\)]*)\)
Replace With:[$1]
leider muss dieser mehrmals angewendet werden bei Verschachtelungen trotzdem bekommt man damit in nu eine Konfigurationsdatei die deutlich kleiner und aufgeräumter ist.
01.10.15 (Allgemein)
Nun komm der in diesen Beitrag bereits versprochene zweite Teil…
Ganz so arg müssen wir uns nicht ärgern. Doch leider wird es auch nicht mit einen einfachen on/off funktionieren. Damit ihr nicht noch ZWEIHUNDERT PULS bekommt mache ich mal weiter.
nach einen ausführen der install.sh sollte das Protokoll zwar schon auswählbar und kompilierbar sein doch ein:
liefert leider noch nicht den gewünschten erfolg, wie wir unter „The supported protocols are“ sehen.
Fangen wir also mal an, uns den Quelltext anzuschauen. Also Zurück zu bhc9938d.c und dort die Init Funktion. Den dort müssen wir noch eigne dinge bekanntgeben.
//... void bhc9938dInit(void) { protocol_register(&bhc9938d); protocol_set_id(bhc9938d, "bhc9938d"); protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol"); bhc9938d -> devtype = RAW; bhc9938d -> printHelp = &bhc9938dPrintHelp; } //...
beschäftigen wir uns zunächst mit printHelp hier setzen wir einen Funktionszeiger in diesen Fall auf eine Funktion die bhc9938dPrintHelp heißt. Ich würde hier ein ähnliches Namensschema vorschlagen also protokollnameFunktion um Namenskonflikte zu vermeiden.
mit einer pasenden Methode sind wir also schon so weit Hilfetexte auszugeben:
static void bhc9938dPrintHelp(void) { printf("\t Ich bin ein Hilfreicher Text\n"); }
was noch fehlt sind die Parameter zum steuern und natürlich das Senden dafür ergänzen wir wieder die Initfunktion
void bhc9938dInit(void) { protocol_register(&bhc9938d); protocol_set_id(bhc9938d, "bhc9938d"); protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol"); options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$"); options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL); options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL); bhc9938d -> devtype = RAW; bhc9938d -> printHelp = &bhc9938dPrintHelp; bhc9938d -> createCode = &bhc9938dCreateCode; }
/* * File: bhc9938d.c * Author: Michael Hegenbarth (carschrotter) <mnh@mn-hegenbarth.de> * * Created on 23. Januar 2015, 13:19 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <math.h> #include "../../pilight.h" #include "common.h" #include "protocol.h" #include "log.h" #include "json.h" #include "bhc9938d.h" #ifndef MODULE __attribute__((weak)) #endif const char * indent = "\t\t\t\t\t"; typedef enum { OFF, ON, UNKNOWN=-1 } switchState; /* * code all codes for on and off state from piligt debug */ const char * codes[2][3] = { { "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 480 160 480 160 480 160 480 160 160 480 160 480 160 5440", "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 640 480 160 160 640 480 160 160 480 480 160 480 160 480 160 160 640 160 480 480 160 480 160 160 480 160 480 160 5440", "160 640 480 160 160 640 480 160 160 480 480 160 160 640 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 640 160 480 480 160 480 160 160 480 160 480 160 5440" }, //off codes (index 0) { "161 483 483 161 161 483 483 161 1683 483 161 161 483 483 161 161 644 161 483 161 483 483 161 161 483 483 161 161 483 483 161 161 483 161 644 483 161 483 161 161 483 161 483 483 161 483 161 161 5474", "160 480 480 160 160 480 480 160 160 480 480 160 160 640 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 320 480 160 480 160 160 480 160 480 160 480 160 640 480 160 480 160 160 5440", "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 480 160 480 160 480 160 480 480 160 480 160 160 5440" } //On codes (index 1) }; bool strIsInt(const char * str, int * result){ char * rest = NULL; int tmp = (int) strtol(str, &rest, 10); result = &tmp; return (bool) !(rest != NULL); } static void bhc9938dPrintHelp(void) { printf("\t -u --unit=unitnumber\t\tcontrol a device with this unitcode\t (1|2|3)\n"); printf("\t -t --on\t\t\tsend an on signal\n"); printf("\t -f --off\t\t\tsend an off signal\n"); /* printf("\t -d --device=\"raw\"\t\traw code to tur on device \n"); printf("\t -f -rawOff=\"raw\"\t\traw code to tur off device \n"); printf("%sraw code is devided by spaces\n", indent); printf("%s(just like the output of debug)\n", indent); */ } static int bhc9938dCreateCode(JsonNode * code) { int unit = -1; switchState sState = UNKNOWN; double itmp = 0; int codeIndex = 0; char * rcode = NULL; char * pch = NULL; int i = 0; if(json_find_number(code, "unit", &itmp) == 0){ unit = (int)round(itmp); } if(json_find_number(code, "off", &itmp) == 0){ sState=OFF; } else if(json_find_number(code, "on", &itmp) == 0){ sState=ON; } if(unit == -1 || sState == -1) { logprintf(LOG_ERR, "bhc9938d: insufficient number of arguments"); return EXIT_FAILURE; } else if(unit > 4 || unit < 0) { logprintf(LOG_ERR, "bhc9938d: invalid unit range"); return EXIT_FAILURE; } else { codeIndex = unit -1; rcode = strdup(codes[sState][codeIndex]); printf("\nindex:\t%d\nsState:\t%d\ncode:%s\n", codeIndex, sState, rcode); pch = strtok(rcode, " "); while (pch != NULL) { bhc9938d -> raw[i] = atoi(pch); pch = strtok(NULL, " "); i++; } sfree((void *) &rcode); bhc9938d -> rawlen = i; } return EXIT_SUCCESS; } /* // BHC9938D bhc9938d */ void bhc9938dInit(void) { protocol_register(&bhc9938d); protocol_set_id(bhc9938d, "bhc9938d"); protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol"); options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$"); options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL); options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL); bhc9938d -> devtype = RAW; bhc9938d -> printHelp = &bhc9938dPrintHelp; bhc9938d -> createCode = &bhc9938dCreateCode; } #ifdef MODULE void compatibility(struct module_t *module) { module -> name = "bhc9938d"; module -> version = "0.1"; module -> reqversion = "5.0"; module -> reqcommit = NULL; } void init(void) { bhc9938dInit(); } #endif
options_add rufe ich hier gleich dreimal auf, einmal für unit eine einfache numerische ID in meinen Fall von 1-3, und jeweils einmal für on und off.
Desweiteren noch ein Pointer auf die bhc9938dCreateCode funktion die dem Protokoll das eigentliche leben Einhaucht.
Der Komplette Kode schaut bei mir dann so aus:
23.01.15 (Allgemein)
Pilight sieht es offensichtlich nicht vor Rawcode von unbekannten Protokollen in der GUI zuzulassen, jedenfalls gibt es laut Docu keine config dafür.
Dafür aber eine Anleitung wie man seine eigenen Protokolle implementieren kann.
Ich arbeite in diesen Beispiel mit Raspbian unter den Benutzer pi. Als Entwiklungsmaschine dient mir mein Windows 8.1 PC mit Netbeans 8.0.2.
Nachtrag: Ich gehe hier im Tutorial von der manuellen Installation aus sprich über das Git Repository dies ist auch notwendig um an den Sourcecode zu kommen. Je nach dem unter welchen Beutzer ihr arbeitet oder wohin ihr die Dateien clont können die Pfade anderst sein
Ich benutze bereits für meine Webprojekte Netbeans dort habe ich einfach die C++ Plugins installiert und schon kann es losgehen.
Ihr könnt natürlich eure favorisierte IDE oder Editor (z.B. Notepad++) verwenden.
Um schnell kompelieren zu können belasse ich die Dateien auf dem rasperry pi und Kompeliere gleich dort, so muss man sich nicht mit Einstellungen für die passende Plattform rumärgern. Dazu mounte ich per sftp mein home Verzeichnis auf meine Entwicklungsmaschine. Das geht in Linux mit „Bordmitteln“ für Windos nutze ich momentan „SFTP Net Mount Free“. Natürlich könnt ihr das git repositorry aber auch auf die entwicklungs Maschine clonen.
So jetzt haben wir also was zum Editieren und Zugriff auf die Dateien dann kann es ja jetzt losgehen.
Als erstes navigieren wir zum Verzeichnis libs\protocols und erstellen dort zwei Dateien mit unseren Protokollnamen einmal „Protokollnamen.h“ und „Protokollnamen.c“.
Bei mir sieht es folgender masen aus:
~/pilight/libs/protocols/bhc9938d.h ~/pilight/libs/protocols/bhc9938d.c Pfad Datein. Endung
Diese sollten auch noch gefüllt werden das geschieht jetzt streng nach Beispiel:
#ifndef _PROTOCOL_BHC9938D_H_ #define _PROTOCOL_BHC9938D_H_ struct protocol_t *bhc9938d; void bhc9938dInit(void); #endif
#include "../../pilight.h" #include "common.h" #include "protocol.h" #include "bhc9938d.h" #ifndef MODULE __attribute__((weak)) #endif //BHC9938D bhc9938d void bhc9938dInit(void) { protocol_register(&bhc9938d); protocol_set_id(bhc9938d, "bhc9938d"); protocol_device_add(bhc9938d, "bhc9938d", "bhc9938d protocol"); bhc9938d->devtype = RAW; } #ifdef MODULE void compatibility(struct module_t *module) { module->name = "bhc9938d"; module->version = "0.1"; module->reqversion = "5.0"; module->reqcommit = NULL; } void init(void) { bhc9938dInit(); } #endif
Dabei habe ich den Quellcode einfach aus den Beispiel übernommen und das Dummy Protokoll einfach gegen meinen eigenen Protokoll Namen sprich BHC9938D getauscht. Dabei immer schön auf Groß,- und Kleinschreibung achten und am besten den Formatierungsstiel beibehalten.
Damit das ganze mitcompeliert wird müssen wir noch zwei einträge machen:
Protokoll „definieren“ in CMakeConfig.txt:
set(PROTOCOL_BHC9938D ON CACHE BOOL "support for my own BHC9938D protocol")
Nun suchen wir in der Datei „CMakeLists.txt“ nach if(${PROTOCOL bei mir ab Zeile 159 und fügen kurz davor unseren eigen Absatz ein um die Source Files bekannt zu machen:
if(${PROTOCOL_BHC9938D} MATCHES "OFF")
list(REMOVE_ITEM pilight_headers "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.h")
list(REMOVE_ITEM pilight "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.c")
endif()
Nach diesen beiden schritten kann das Protokoll zur Instillation ausgewählt werden
Nun sind wir bereit das ganze zu testen.
Im folgenden gehe ich aus das ihr piligt schon mal erfolgreich installiert/compiliert habt wenn nicht könnt ihr gleich zum Punkt Erstellen wechseln.
Als erstes fertigen wir ein Backup von /etc/piligh
insbesondere unsere config.json wenn dort schon Geräte für die Weboberfläche eingetragen sind.
Zuerst mal mit sudo service pilight stop
den Service beenden. Danach sauber deinstallieren.
Ein ./setup.sh help
bringt uns folgende Hilfe zu tage:
Usage: ./setup.sh [options] clean remove all cmake and make generated files install install pilight uninstall uninstall pilight
also erstmal mit sudo ./setup.sh uninstall
deinstallieren und danach mit sudo ./setup.sh clean
saubermachen
nun einfach sudo ./setup.sh ausführen
un ihr soltet folgende bild erhalten
Weiter geht es dann im Zeiten teil….
18.09.13 (Allgemein)
Manchmal kommt man auf die seltsamsten Ideen z.B. das es möglich sein müsste zu einer Spalte die Tabelle zu finden.
So brauchte ich z.b. Den Namen zu einer Spalte einer unbekannten Tabelle beim Debuggen eines fremden Projekt.
Nach etwas googlen ist folgender Code dabei raus gekommen:
SELECT c.TABLE_SCHEMA AS Datenbank, c.TABLE_NAME AS Tabellenname, c.COLUMN_NAME AS Spalte FROM INFORMATION_SCHEMA.TABLES t JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_CATALOG = c.TABLE_CATALOG AND t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME WHERE COLUMN_NAME = "YOURSEARCHCOLUMN" LIMIT 0 , 30
Dabei ist bei COLUMN_NAME der Wert „YOURSEARCHCOLUMN“ durch den Gewünschten Spaltennamen zu ersetzen.
03.06.13 (Allgemein)
Heute widme ich mich mal den Einsteigern unter euch häufig werde ich gefragt wie man seine eigen Homepage erstellt was ist des beste Hoster, muss ich wirklich sooo viel zahlen?
Als erstes die Letzte Frage der Rest Kommt in einen Anderen Teil:
….muss ich wirklich sooo viel zahlen?
Nein!
Natürlich sind „die Größen nicht die Günstigsten“ jahrelange Erfahrung und eine gefestigte Marktposition erlauben 1&1, Strato und Co dieses Preisniveau. Adlerdings gibt es auch kleine Hoster bei denen der Service weniger kostet oder gar Kostenlos ist.
Eine Kleine Auswahl liste ich nun hier auf:
– Keine Sockets (braucht man um Verbindung zu anderen Seiten aufzubauen z.B. für Updates).
+ Deutsche Seite deutscher Support.
+ Software immer aktuell.
# Wenig Werbung nur im Login und auf den Fehlerseiten.
21.01.13 (Allgemein)
Fangen wir also an:
Man öffne eine Datei mit dem Störenden Inhalt in Notepad++ …
und markiere nun den Absatz der der uns stört:
Danach verwendet man das suchen und ersetzen Tool am einfachsten durch die Tastenkombination [STRG] + [H].
Nun sehen wir unseren selektierten Text in der “Suche nach” Textbox.
Jetzt wählen wir noch den Tab “In Dateien Suchen” und klicken als
erstes auf “Ordner der akt. Datei” und da wir ja das gesamte Projekt
durchsuchen möchten auf “Unterverzeichnisse”.
Selbstverständlich könnt ihr den passenden Pfad auch manuell heraussuchen.
Den Suchmodus stellt man am besten auf “Normal” damit keine ungewollten Ersetzungen stattfinden.
Und am ende habt ihr erfolgreich euer Projekt von den ungewollten
Einträgen befreit und das trotz Leerzeichen Tabs und Zeilenumbrüche.
Beachtet aber bitte das immer genau dieser String gesucht
wird, sprich es klappt nicht wenn ein Leerzeichen mehr oder weniger oder
sonst eine Kleinigkeit anders ist!