Von Ismen halte ich gar nichts.
Im Mittel nehmen sich beide nichts. Nur bei Männern gibt es mehr Ausreißer, nach oben UND nach unten.
Ich bin Naturwissenschaftler und muss zwangsweise Wert auf eine präzise Ausdrucksweise legen.
Mit Gendern ist das schlicht nicht vereinbar. Man kann mathematische Probleme nicht so formulieren, dass sie gendergerecht sind und gleichzeitig nichts von ihrer Exaktheit einbüßen.
Ja, C++ lohnt sich. Das letzte "Update" der Sprache ist erst wenige Monate her, also hochaktuell.
Die neueste Auflage von "Der C++ Programmierer" ist zwar umfangreich, aber sehr Anfängerfreundlich.
Du kannst auch Defaultargumente definieren, wenn du keinen extra Standardkonstruktor implementieren willst.
Außerdem ist ein Kopieroperator sinnvoll ... Neben einigen weiteren Dingen. :)
Jeder Hersteller handhabt das anders und normalerweise steht dazu etwas im Handbuch ganz am Ende.
Wenn du realistisch hacken spielen wills, dann mach ein paar CTFs oder knacke Crackmes.
Alles andere sind wirklich nur Spiele.
Ich nutze TikTok nicht, aber das, was du in den Kommentaren beschreibst, also "alle Männer töten" oder "Geschlechtsteile verstümmeln bzw. abschneiden" gibt es auch hier auf GF häufiger!
Und zwar mehr oder weniger ausschließlich von einer kleinen Clique Hardcorefeministinnen, deren Nicknames ich nicht nennen kann, weil die dann meine Antwort löschen lassen. Komischerweise wird deren Hetze nicht gelöscht.
Deshalb am besten ignorieren! Es bringt nichts, auf die einzugehen.
Ein ca. 153 Kg schwerer Goldklumpen.
Aber da es um Synthesizer geht: Ein Roland JD-XA.
Und aus sentimentalen Gründen wertvoll: Zwei kleine Hinaningyou.
Ansonsten: Etwas sehr persönliches.
Vermutlich mit Python und Selenium, oder mindestens BeautifulSoup, einer Menge RegEx, oder so in der Richtung.
Ruby oder Perl dürfte auch noch hin und wieder zum Einsatz kommen.
Hab aber schon Bots in der Bash geschrieben, auch für GF, also im Grunde geht jede Sprache! Auch Java oder C++ gehen, sind aber weniger komfortabel, verglichen mit den gängigen Skriptsprachen.
Naja, im Grunde gehts mit fast jeder Sprache!
Ja, ist in Deutschland dank Hackerparagraph illegal.
Das ist ein ganz großes Problem v. a. an den Unis, weil es deshalb in Deutschland eine Grauzone ist, Security-Spezialisten auszubilden.
Als Dozent oder Student steht man dabei mit einem Bein im Knast.
Bescheuerte Gesetzgebung ...
Ähm, mit Verlaub, aber ich habe mich in TCPDF binnen weniger Stunden sehr leicht einarbeiten können.
Mittags angefangen, habe ich Nachmittags bereits eigene Klassen abgeleitet, und das versteckte Wasserzeichen bzw. unnötig eingebettete Fonts entfernt, und eigene Grafikroutinen geschrieben.
An TCPDF ist nichts, aber auch wirklich GAR NICHTS kompliziert, zeitraubend oder schwer zu verstehen!
Reiß dich einfach mal ein bisschen zusammen, lies die Doku, und hör auf, so eine Püppie zu sein! Dann bist du in 2 Stunden nämlich so weit, dass du problemlos mit TCPDF arbeiten kannst, und mindestens 95% der API kennst.
Bei modernem C++ nutzt man vorzugsweise gar keine Pointer mehr direkt, höchstens in Form von Smartpointern, Iteratoren, oder anderen Wrappern.
Und gerade weil man verhindern will, dass Variablen einen Nullzeiger haben, weil das eine der größten Fehlerquellen ist, wurden Referenzen eingeführt.
Früher bei C hat man das so gemacht, aber bei C++ gibt es dafür std::optional, usw.
Bei modernem C++ macht man viele Dinge anders, als noch vor 20 Jahren. Ich habe die letzten 10 Jahre sicher nicht ein einziges mal new bzw. delete direkt innerhalb einer Funktion aufgerufen, auch wenn man natürlich wissen sollte, wie diese Dinge funktionieren.
Außerdem sind die meisten C++ Tutorials veraltet, oberflächlich und falsch, sodass sich ein gutes und aktuelles Lehrbuch empfiehlt.
Fazit: Als C++ Entwickler versucht man "nackte" Zeiger zu verhindern, wo es nur geht ... Und es geht so gut wie immer!
Eingeschränkt mit z. B. AdobeDRM. Kostet etwas über 1000€ pro PDF, ist aber auch kein 100%iger Schutz!
Ich habe Bioinformatik studiert und mich auf Molekularbiologie spezialisiert.
Und meiner Meinung nach sind die Vorwürfe dieses Physikers absolut haltlos.
Er beruft sich ausschließlich auf Statistik und nennt Indizien. Mehr kommt da nicht.
Auf der anderen Seite stehen zich tausende Virologen, Biologen oder Mediziner, die sich das Erbgut und die Proteinstruktur genau angeschaut haben.
Bei bestimmten Modifikationen im Labor bleiben IMMER Hinweise darauf erhalten, und die fehlen beim neuen Corona-Virus gänzlich.
Fazit: Entweder hat China eine Art Alientechnologie, die dem Westen um Jahrzehnte voraus ist, aber anstatt diese Möglichkeit politisch auszuschlachten und sich im Rum zu sonnen (was bei neuen Techniken / Verfahren / Methoden auf dem Gebiet absolut üblich ist), wird sie aus unerfindlichen Gründen geheim halten und für Dinge genutzt, von denen wir nichts wissen.
Oder das Virus stammt einfach NICHT aus einem Labor.
Ich bin mir sicher, dass hier eine Ente durchs Dorf getrieben wird. Und Journalisten ohne Expertise freuen sich natürlich über so einen "Kracher".
Aus Molekularbiologischer Sicht kann ich dazu leider nur sagen: "Häääh? Da hätte man auch genauso gut Kaffeesatzlesen können, und wäre zum selben Ergebnis gekommen".
Das ist Schwachsinn!
Hätte vielleicht vor 10 Jahren funktioniert, aber wer das heutzutage versucht ist gelinde gesagt bescheuert!
Vielleicht so:
#include <iostream> // cout, endl
#include <sstream> // stringstream
#include <string> // string
#include <string_view> // string_view
template <char FROM='(', char TO=')'>
[[nodiscard]] inline auto strdel(const ::std::string_view sv) {
const auto from_pos { sv.find(FROM) };
const auto to_pos { sv.rfind(TO) };
constexpr auto not_found { ::std::string_view::npos };
if (from_pos == not_found && to_pos == not_found) {
return ::std::string { sv };
} else if (from_pos == not_found) {
return ::std::string { sv.begin() + to_pos + 1, sv.end() };
} else if (to_pos == not_found) {
return ::std::string { sv.begin(), sv.begin() + from_pos };
} else {
::std::stringstream ss;
ss << ::std::string_view { sv.begin(), from_pos };
ss << ::std::string_view { sv.begin() + to_pos + 1, sv.size() - to_pos };
return ss.str();
}
}
void test(const ::std::string_view sv) {
using namespace ::std;
cout << '"' << sv << "\": \"" << strdel(sv) << '"' << endl;
}
int main(void) {
test("");
test("foobar");
test("fo(ob)ar");
test("f(o(ob)a)r");
test("fo(obar");
test("foob)ar");
test("foo)b)ar");
test("fo(o(bar");
test("fo(o(b)ar");
test("fo(o)b)ar");
}
Die Ausgabe sieht wie folg aus:
"": ""
"foobar": "foobar"
"fo(ob)ar": "foar"
"f(o(ob)a)r": "fr"
"fo(obar": "fo"
"foob)ar": "ar"
"foo)b)ar": "ar"
"fo(o(bar": "fo"
"fo(o(b)ar": "foar"
"fo(o)b)ar": "foar"
Ich denke, das ist so ungefähr das, was du dir vorgestellt hast.
PS: Der GF-Dreckseditor bringt mich noch um. Wie kann man so eine verbuggte Scheiße auf die Allgemeinheit loslassen, und dann selbst Jahre danach nicht im Stande sein, das Ding wenigstens HALBWEGS zu fixen?!?!
Jein, es geht zwar, aber nur sehr oberflächlich.
Wirklich gut wirst du nur mit einer App nicht werden können.
Wenn du wirklich gut werden willst, kommst du um Lehrbücher nicht rum.
EXE-Dateien unter Windows haben die Eigenschaft, dass man jeden Mist an ihr Ende ran hängen kann, ohne dass es Probleme gibt.
Die meisten Installer unter Windows funktionieren übrigens auch so.
Du musst also einfach nur das Dateihandle deiner EXE-Datei holen, lesend öffnen, zu einem Marker springen, der den Anfang deiner angehängten Datei anzeigt springen, und einfach alles in einen Puffer lesen.
Oder du schreibst dir ein kleines Werkzeug, welches deine Datei in einen C-Quelltext umwandelt, den du dann einfach als Header inkludieren kannst.
Beides recht einfache und übliche Methoden!
Ich hatte deine Frage hier gestern Abend schon gelesen, aber dachte mir, dass dir bei so einem trivialen Problem schon jemand anderes helfen wird.
Und jetzt hat immer noch keiner geantwortet. Also mach ich das mal:
#include <iostream> // cout, endl
#include <variant> // get, variant
using namespace ::std;
class Data {
public:
Data() noexcept = default;
~Data() = default;
template <typename T>
[[nodiscard]] const auto * get_if() const noexcept {
return ::std::get_if<T>(&container_);
}
private:
::std::variant<bool, double, int> container_ { 123 };
};
template <typename T>
void test(const Data & data) {
if (const auto * ptr { data.get_if<T>() }; ptr) {
cout << *ptr << endl;
} else {
cout << "nullptr" << endl;
}
}
int main(void) {
Data data;
test<bool>(data);
test<double>(data);
test<int>(data);
}
Der Code sollte selbsterklärend sein.
Merke: std::get_if() erwartet einen Pointer als Argument, und liefert einen Pointer zurück!
Es ist zwar auch möglich, dass Data::get_if nur "auto", zurückliefert, aber es gilt als schlechter Stil, einen Pointer hinter "auto" zu verstecken.
Naja, viel Spaß! :)