Lösung für git: fatal: Kein Ziel für „push“ konfiguriert.

Problem:

Du hast ein git-Repository in einem Ordner mithilfe von

git init

initialisiert.

Nun hast du ein oder mehrere Commits gespeichert und möchtest diese nun auf den Server hochladen (z.B. Github):

git push

aber du siehst diese Fehlermeldung:

fatal: Kein Ziel für "push" konfiguriert.
Entweder spezifizieren Sie die URL von der Befehlszeile oder konfigurieren ein Remote-Repository unter Benutzung von

    git remote add <Name> <URL>

und führen "push" dann unter Benutzung dieses Namens aus

    git push <Name>

Lösung:

Da du dein Repository mit git init initialisiert hast, weiß git nicht, auf welchen Server es die Daten hochladen soll, wenn du git push ausführst..

Daher müssen wir erst einen Server hinzufügen. Ein Server heißt bei git remote.

git remote add origin https://github.com/benutzer/repository.git

Denk daran, https://github.com/benutzer/repository.git durch die entsprechende URL zu ersetzen, die du beim Anbieter deines Repositories findest (z.B. auf Github).

Die Folgenden URLs sind beispielsweise korrekt:

  • https://github.com/ulikoehler/UliEngineering.git
  • git@github.com:ulikoehler/UliEngineering.git

Das obige Kommando fügt einen Server in die Serverliste des Repositories hinzu (remote add), der mit origin  bezeichnet wird (dies ist der Standardname für remotes in git) und die URL https://github.com/benutzer/repository.git hat.

Auf GitHub (und in GitLab) kannst du die korrekte URL herausfinden, indem du auf den grünen Clone or Download-Button klickst.

Nun kannst du deine existierenden Commits auf den Server pushen. Das erste mal reicht git push allerdings nicht aus, denn git weiß nicht, auf welchem Server der Upload landen soll.

Daher musst du das erste mal nach dem Ausführen von git remote add ... das Folgende Kommando ausführen, um den master-Branch auf den origin-Server hochzuladen:

git push --set-upstream origin master

Wenn dieses Kommando eine Fehlermeldung erzeugt, dann hast du vermutlich die falsche URL für den Server verwendet. In diesem Fall lösche den Server mit

git remote rm origin

und versuche es erneut mit der richtigen URL. Sollte die URL stimmen, hast du vermutlich nicht die richtigen Zugangsdaten für den Server eingegeben (z.B. bei SSH).

Ab jetzt kannst du ganz einfach

git push

verwenden, um neue Commits auf den Server hochzuladen

Posted by Uli Köhler in git

Wie behebt man „Couldn’t run /usr/bin/dumpcap in child process: Permission denied“ auf Linux

Wenn du eine Fehlermeldung wie diese in Wireshark siehst:

liegt das daran, dass der aktuelle Systemnutzer keine Berechtigung hat, Pakete von der Netzwerkkarte abzufangen.

Das kann sogar dann passieren, wenn du während der Installation ausgewählt hast, dass normale Nutzer Pakete abfangen dürfen – denn diese Einstellung wird erst aktiv, wenn du dich aus- und wieder eingeloggt hast (oder den Computer neugestartet hast).

Um das Problem temporär zu beheben, ohne dich aus- und wieder einzuloggen, führe Wireshark als Root aus: sudo wireshark

Um das Problem permanent zu beheben, führe dieses Kommando aus:

sudo usermod -a -G wireshark $USER

und dann logge dich komplett aus und wieder ein (oder starte deinen Computer neu).

Posted by Uli Köhler in Linux

Was tun bei CMake: ‚make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden. Schluss.‘

Problem:

Du versuchst, eine Software zu builden, die das CMake-Buildsystem verwendet.

Dazu führst du make aus, was in der Folgenden Fehlermeldung resultiert:

make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden.  Schluss.

Lösung:

Bevor du make ausführst, musst du den Build mit CMake konfigurieren.

Die einfachste Möglichkeit ist:

cmake .

Normalerweise musst du das nur einmal für jedes Projekt tun ; CMake wird automatisch Änderungen an CMakeLists.txt detektieren, wenn du make ausführst.

Danach kannst du make nochmal ausführen. Wenn der Build erfolgreich ist, siehst du eine Meldung ähnlich zu dieser:

[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main
Posted by Uli Köhler in Buildsysteme

Was ist die Formel für 2/3/4 parallele Widerstände?

Formel für 2 parallele Widerstände R1 und R2:

R_{insgesamt} = \frac{1}{\frac{1}{R_1} + \frac{1}{R_2}}

Python-Ccode:

rinsgesamt = 1. / (1./r1 + 1./r2)

Formel für 3 parallele Widerstände R1 undR2:

R_{insgesamt} = \frac{1}{\frac{1}{R_1} + \frac{1}{R_2} + \frac{1}{R_3}}

Python-Code:

rinsgesamt = 1. / (1./r1 + 1./r2 + 1./r3)

Formel für 4 parallele Widerstände R1 und R2:

R_{insgesamt} = \frac{1}{\frac{1}{R_1} + \frac{1}{R_2} + \frac{1}{R_3} + \frac{1}{R_4}}

Python-Code:

rinsgesamt = 1. / (1./r1 + 1./r2 + 1./r3 + 1./r4)

 

Posted by Uli Köhler in Elektronik, Python

Dateigröße in NodeJS bestimmen

Um in NodeJS die Größe einer Datei zu bestimmen (z.B. die Größe von test.txt) benutze fs.stat() oder fs.statSync(). Beispiel:

const fs = require("fs"); //Dateisystem-Modul laden
const stats = fs.statSync("myfile.txt");
const fileSizeInBytes = stats.size;
// Optional: Dateigröße in Megabytes konvertieren
const fileSizeInMegabytes = fileSizeInBytes / 1000000.0;

Oder benutze die Folgende Funktion:

function getFilesizeInBytes(filename) {
    const stats = fs.statSync(filename);
    const fileSizeInBytes = stats.size;
    return fileSizeInBytes;
}

Beispiel:

getFilesizeInBytes("test.txt");
Posted by Uli Köhler in NodeJS

Welche Windows 10-Version läuft bei mir? Finde es in 15 Sekunden heraus!

Um herauszufinden, welche Windows 10-Version und welcher Build auf deinem Computer läuft, drücke zuerst die Windows-Taste + R.
Dies öffnet dieses Eingabefenster:

Gib in diesem Dialog winver ein:

Jetzt drücke Enter (auch bekannt als Return). Dies öffnet das Windows 10-Versionsfenster:

In diesem Fenster kannst du sofort die Versionsnummer und Buildnummer sehen, hier markiert in rot:

In meinem Beispiel ist das Version 1809 und Build 17763.475

Posted by Uli Köhler in Windows

iotop ‚Netlink error: Vorgang nicht zulässig (1)‘ beheben

Problem:

Du versuchst, iotop zu starten, aber siehst nur diese Fehlermeldung:

Netlink error: Vorgang nicht zulässig (1)

The Linux kernel interfaces that iotop relies on now require root priviliges
or the NET_ADMIN capability. This change occured because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.

Lösung:

Starte iotop als root:

sudo iotop

Der Grund dafür ist, dass iotop auf Kernel-Interfaces Zugriff benötigt, die nur root oder Prozessen/Nutzern mit der CAP_NET_ADMIN-capability zugänglich sind. Theoretisch könnte man dem iotop-binary diese capability mit sudo setcap cap_net_admin+ep /usr/sbin/iotop geben, unter Ubuntu 18.04 hat dies für mich allerdings nicht funktioniert.

Posted by Uli Köhler in Linux

String in die Zwischenablage kopieren mit Javascript (ohne Bibliotheken)

Um in Javascript einen String in die Zwischenablage zu kopieren ohne eine externe Bibliothek wie clipboard.js zu verwenden, verwende diese Funktion:

function copyStringToClipboard (str) {
   // Temporäres Element erzeugen
   var el = document.createElement('textarea');
   // Den zu kopierenden String dem Element zuweisen
   el.value = str;
   // Element nicht editierbar setzen und aus dem Fenster schieben
   el.setAttribute('readonly', '');
   el.style = {position: 'absolute', left: '-9999px'};
   document.body.appendChild(el);
   // Text innerhalb des Elements auswählen
   el.select();
   // Ausgewählten Text in die Zwischenablage kopieren
   document.execCommand('copy');
   // Temporäres Element löschen
   document.body.removeChild(el);
}

Warnung: Sollte der Benutzer beim Aufruf der Funktion Text auf der Seite ausgewählt haben, wird diese Auswahl gelöscht. Dieser Hackernoon-Artikel stellt hierfür eine Lösung vor (englisch), wir konzentrieren uns hier jedoch auf die einfachstmögliche Lösung.

Du kannst die Funktion zum Beispiel so benutzen:

copyStringToClipboard("abc123");

Browser-Kompatibilität

Unsere Lösung benutzt nur Standard-Javascript (ES6 ist nicht notwendig), das DOM-API (das bereits mehrere Jahrzehnte alt ist) und document.exec('copy'); , welches laut dem Mozilla Developer’s network kompatibel mit allen großen Browsern, einschließlich Internet Explorer ab IE9, ist.

Wie funktioniert das genau?

Wir erzeugen eine neue, temporäre <textarea> und setzen deren Wert auf den zu kopierenden String (zum Beispiel "abc123" in unserem o.g. Beispiel).

Um den Nutzer und insbesondere Screenreader nicht zu verwirren, setzen wir die <textarea> auf readonly (d.h. nicht editierbar) und schieben sie -9999px nach links aus dem Viewport hinaus. In allen praktischen Szenarien liegt die <textarea> dann weit außerhalb des sichtbaren Bildschirms.

Erst nachdem wir die <textarea> aus dem sichtbaren Viewport herausgeschoben haben, fügen wir sie zum DOM hinzu, sodass sie nichteinmal für den Bruchteil einer Sekunde angezeigt werden könnte.

Nun können wir den Text innerhalb der <textarea> mit el.select() auswählen und dann mit document.execCommand('copy'); in die systemweite Zwischenablage kopieren.

Schlussendlich können wir die <textarea> wieder aus dem DOM entfernen.

Danke an  Angelos Charalis auf Hackernoon für die Idee, die Textarea aus dem Viewport zu verschieben.

 

Posted by Uli Köhler in Javascript

ElasticSearch: Cluster-Zustand (cluster health) mit curl anzeigen

Um den aktuellen Zustand (cluster health) eines ElasticSearch-Clusters anzuzeigen, benutze

curl -X GET "http://localhost:9200/_cluster/health?pretty=true"

Falls der ElasticSearch-Cluster nicht auf localhost läuft, ersetzt localhost mit dem Hostnamen oder der IP-Adresse eines der ElasticSearch-Konten.

Beispielausgabe:
{
  "cluster_name" : "docker-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

Die wichtigsten Informationen sind:

  • "cluster_name" : "docker-cluster" Der Name, den du deinem Cluster zugewiesen hast. Alle ElasticSearch-Knoten im Cluster müssen denselben Cluster-Namen haben, sonst verbinden sie sich nicht zu einem Cluster.
  • "number_of_nodes" : 1 Die Anzahl der Cluster-Knoten, die aktuell im Cluster aktiv sind. Manchmal benötigen einige Knoten etwas länger, um hochzufahren, wenn sie gerade erst gestartet worden sind. Daher: Sollten nicht genug Knoten aufgelistet werden, warte eine Minute und versuche es nochmal.
  • "status" : "green" Der Cluster-Zustand (engl. cluster health) deines Clusters

Der Cluster-Zustand kann drei Werte annehmen:

  • green: Mit deinem Cluster ist alles OK (wie in unserem Beispiel)
  • yellow: Dein Cluster ist grundsätzlich OK, aber einige Shards konnten nicht repliziert werden. Dies ist oft der Fall, wenn du einen Cluster mit nur einem Knoten betreibst (dann gibt es keinen zweiten Knoten, auf den die Shards repliziert werden können – fällt der eine Knoten aus, können die Daten nicht wiederhergestellt werden)
  • red: Etwas stimmt nicht mit dem Cluster. Du musst im Log nachsehen

Du möchtest möglichst einfach einen ElasticSearch-Cluster mit Docker aufsetzen? TechOverflow bietet für diesen Zweck einen einfachen Konfigurations-Generator an: ElasticSearch docker-compose.yml and systemd service generator (engl).

Siehe auch die offizielle Reference zu Cluster Health (engl.)

Posted by Uli Köhler in Datenbanken, ElasticSearch

Dateien löschen mit der C++17-filesystem-Bibliothek

Um eine Datei (zum Beispiel test.txt) in C++ zu löschen benutze remove aus der C++17-filesystem-Bibliothek:

remove("test.txt");

Vollständiges Beispiel:

#include <experimental/filesystem>
using namespace std::experimental::filesystem;

int main() {
    remove("test.txt");
}

Mit GCC musst du die Datei wie Folgt kompilieren:

g++ -o delete-cpp17 delete-cpp17.cpp -lstdc++fs

Die stdc++fs-Bibliothek muss gelinkt werden, um die Funktionen aus der C++17-Filesystem-Bibliothek einzubinden.

remove löscht Verzeichnisse nicht rekursiv, also können nur leere Verzeichnisse gelöscht werden! Benutze für das Löschen eines Verzeichnisses inklusive aller Unterverzeichnisse und darin enthaltenen Dateienremove_all oder lies unseren Post dazu: Dateien und Ordner rekursiv löschen mit der C++17-filesystem-Bibliothek

Posted by Uli Köhler in C++

Dateien und Ordner rekursiv löschen mit der C++17-filesystem-Bibliothek

Um mit der C++17-filesystem-Bibliothek ein Verzeichnis rekursiv zu löschen (zum Beispiel mein-verzeichnis), benutze remove_all:

remove_all("mein-verzeichnis");

Diese Zeile löscht mein-verzeichnis und alle darin enthaltenen Unterverzeichnisse und Dateien (= rekursiv).

Vollständiges Beispiel:

#include <experimental/filesystem>
using namespace std::experimental::filesystem;

int main() {
    remove_all("mein-verzeichnis");
}

Mit GCC musst du die Datei wie Folgt kompilieren:

g++ -o delete-cpp17 delete-cpp17.cpp -lstdc++fs

Die stdc++fs-Bibliothek muss gelinkt werden, um die Funktionen aus der C++17-Filesystem-Bibliothek einzubinden.

Falls du stattdessen nur ein leeres Verzeichnis oder eine einzelne Datei löschen möchtest (ohne Unterverzeichnisse), benutze remove anstatt remove_all oder lies unseren Post dazu: Dateien löschen mit der C++17-filesystem-Bibliothek

Posted by Uli Köhler in C++

Absoluten Pfad auf einem Webserver mit PHP bestimmen

Bei vielen Webhostern kann man den absoluten Pfad auf dem Webserver nicht einfach mit FTP bestimmen.

Für diese Fälle kann mithilfe dieses Skripts:

<?php /* path.php */
list($scriptPath) = get_included_files();
echo $scriptPath;
?>

der absolute Pfad mit PHP ausgegeben werden.

Dazu muss dieses Skript per FTP in ein per HTTP(S) zugängliches Verzeichnis kopiert werden und kann dann per Browser aufgerufen werden.

Der Pfad des Skripts wird dann im Browser angezeigt, z.B.:

/var/www/httpdocs/webmail.techoverflow.net/path.php
Posted by Uli Köhler in PHP

PDF-Dateien mit pdftk auf der Kommandozeile zusammenführen

Mit dem freien Werkzeug pdftk können auf der Kommandozeile ganz einfach mehrere PDF-Dateien zusammengefügt werden:

pdftk 1.pdf 2.pdf 3.pdf cat output Zusammengeführt.pdf

Dieses Kommando hängt den Inhalt der PDF-Dateien 1.pdf, 2.pdf und 3.pdf (in dieser Reihenfolge) hintereinander und speichert das Resultat in Zusammengeführt.pdf.

cat und output müssen bei diesem Kommando immer gleich bleiben und müssen zwischen Eingabe- und Ausgabedateien stehen.

Posted by Uli Köhler in Linux

NodeJS 10.x auf Ubuntu in einer Minute installieren

Mit den Folgenden Shell-Kommandos kannst du NodeJS 10.x auf Ubuntu installieren:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

Statt setup_10.x können auch andere Versionen ausgewählt werden, z.B. setup_8.x. Mit dieser Methode können allerdings nicht verschiedene Versionen parallel installiert werden.

Quelle: Offizielle NodeSource-Dokumentation

Posted by Uli Köhler in Linux, NodeJS

Was ist ein Aluminium Fall auf AliExpress?

Auf vielen asiatischen Seiten finden sich Angebote für ominöse Aluminium Fall, z.B. auch auf AliExpress. Was hat es damit auf sich?

Einen Aluminium Fall gibt es nicht! Fall ist eine falsche maschinelle Übersetzung von engl. Case, d.h. Gehäuse. Da Case auch einen (Kriminal-)Fall bezeichnen kann, hat die maschinelle Übersetzung sich hier im Wort geirrt.

Aluminium Fall heißt daher Aluminium Case, als Aluminium-Gehäuse.

Posted by Uli Köhler in Maschinenbau

Was sind Flöten-Fräser?

Auf vielen asiatischen Seiten findet man Angebot für so genannte Flöten-Fräser, z.B. 2-Flöten-Fräser und 4-Flöten-Fräser. Was verbirgt sich hinter diesem musikalischen Fräser?

Einen Flötenfräser gibt es nicht! Flöte ist eine falsche maschinelle Übersetzung von engl. Flute, d.h. Schneide.

Ein 2-Flöten-Fräser entspricht demnach einem Fräser (typischerweise ein Schaftfräser) mit 2 Schneiden. Ein 4-Flöten-Fräser ist demnach ein 4-Schneidiger Fräser.

Siehe auch Querflötenfräser

Posted by Uli Köhler in Unkategorisiert

Was ist ein Wärmewaschbecken?

Auf vielen asiatischen Seiten findet man zeitweise , z.B. auch auf AliExpress. Aber was genau ist ein Wärmewaschbecken?

Ein Wärmewaschbecken gibt es nicht! Wärmewaschbecken ist eine falsche maschinelle Übersetzung von engl. Heat Sink, d.h. Kühlkörper.

Posted by Uli Köhler in Maschinenbau