Ich kenne meine Programmiersprachen (Syntax, Konzepte, Paradigmen, Muster, etc.) in und auswendig und für die APIs der Standardbibliotheken bzw. externer Drittbibliotheken gibt es immer die offizielle Dokumentation.

Google hingegen nutze ich NIE und Seiten wei StackOverflow haben inzwischen so ein unfassbar niedriges Niveau, dass dort im Grunde nur noch Kacke steht.

Viele unerfahrende Programmierer oder Anfänger schwören zwar auf SO, aber die können leider nicht einschätzen, wie schlecht / falsch / buggy die Codesnippets dort sind.

Wer wirklich Erfahrung hat und gut ist, der lacht müde über SO. Noch schlimmer / falscher / primitiver ist eigentlich nur noch TutorialsPoint oder wie die alle heißen.

Naja egal ...

Fazit: Ich google nicht. :)

...zur Antwort

Grundsätzlich gilt bei allem (nicht nur bei Sprachen): Du lernst ziemlich genau fünf mal so viel bzw. so schnell, wenn du es schriftlich tust.

Und gerade Kanji prägen sich unvergleichbar leichter ein, wenn man sie mitschreibt, je öfter, desto besser.

Also ja! Warum solltest du 10 Stunden mit lesendem Kanjilernen verschwenden, wenn du den selben Lernerfolg binnen 2 Stunden, dank Mitschreiben, haben kannst?

Ich verstehe Leute immer nicht, die schnell und effektiv etwas lernen wollen, sich das Leben dann aber unnötig schwer machen.

Merk dir einfach: Durch Mitschreiben lernst du 5 mal so viel. Egal ob Sprachen, Naturwissenschaften, oder was auch immer!

...zur Antwort

Ein paar ältere Kernel würde ich immer als Fallback-Lösung bereit halten, falls bei einem Update etwas schief geht. (Ist mir zwar noch nie passiert, aber egal.)

Allerdings fressen dazugehörige Packages wie "kernel-headers" oder so ähnlich viele GB an Speicherplatz, was sich auf Dauer richtig aufsummiert.

Diese Pakete sind aber i. d. R. standardmäßig nicht installiert, falls du nichts mit Systementwicklung am Hut hast und so etwas nicht explizit per Hand installiert hast.

Fazit: Ein paar zusätzliche Kernel fressen jetzt nicht soooo viel Speicherplatz, sind aber praktisch zur Systemrettung nach einem zerschossenen Update.

Falls du aber zusätzliche Entwicklerpakete installiert hast, würde ich die alten immer entfernen. Da kommen schnell mal 10GB oder mehr zusammen. Bei Otto-Normal-Nutzer wird dieses Problem aber sowieso nicht auftreten. :)

...zur Antwort

Vielleicht so:

#include <stdio.h> /* printf, scanf */
#include <stdlib.h> /* EXIT_SUCCESS, size_t */

#define WORD_MAX 40

#define TO_STR_(thing) #thing
#define TO_STR(thing) TO_STR_(thing)

int main(void) {
    char word[WORD_MAX + 1] = { '\0' };

    size_t count['z' - 'a' + 1] = { 0u };
    const size_t count_len = sizeof(count) / sizeof(* count);

    size_t i = 0u;
    char c = '\0';

    printf("Wort eingeben: ");
    fflush(stdout);

    while (1 != scanf(" %" TO_STR(WORD_MAX) "s", word)) {
        printf("Nochmal: ");
        fflush(stdout);
    }

    for (i = 0u; (c = word[i]); ++i) {
        if (c >= 'a' && c <= 'z') {
            ++count[c - 'a'];
        }
    }

    printf("Wort '%s':", word);
    for (i = 0; i < count_len; ++i) {
        if (count[i]) {
            printf(" %c:%lu", (char)('a' + i), count[i]);
        }
    }
    printf("\n");

    return EXIT_SUCCESS;
}
...zur Antwort

Zu den anderen Antworten noch eine Bemerkung: Es gibt noch die sog. 国字.

Das sind Kanji, die nicht aus China stammen, sondern in Japan "erfunden" wurden. (In Korea gibt es die auch, aber dort werden Hanja ja verhältnismäßig kaum genutzt.)

Beispiel : 鰯

Das bedeutet "Sardine" und existiert nur in Japan. Von diesen Kanji gibt es sehr viele.

Aber das alles - wie gesagt - nur als Ergänzung, zu den bisherigen Antworten. :)

...zur Antwort

Steht die Datei nicht unter ...

Datei -> Zuletzt geöffnet

... oder so ähnlich?

...zur Antwort

Wenn du eine qualitativ hochwertige App haben willst, musst du mit MINDESTENS 30000€ rechnen, eher noch doppelt so viel.

Und einen billigen Freelancer willst du nicht wirklich, denn der ist nicht ohne Grund so günstig.

Er wird Sicherheitslücken einbauen, Kundendaten werden abhanden kommen, und am Ende bekommst du nämlich als Verantwortlicher die Probleme mit dem Datenschutzbeauftragten.

Und falls dir die Geldstrafe nicht das Genick bricht, dann der entstandene Imageschaden.

So ziemlich alle Freelancer glauben, sichere Apps bauen zu können, aber bei nahezu keinem trifft das auch wirklich zu.

Ich studiere IT-Sicherheit und immer wenn ich mir Apps "genauer angcke", möchte ich schreien.

Glaub mir, wenn du nicht mehrere Zehntausend Euro auf den Tisch legst, kannst du die Sache vergessen.

Wenn du es von einem Freelancer für einige hundert Euro machen lässt, WIRD dein Service gehackt werden. Und zwar schneller, als du "piep" sagen kannst.

Bitte sei dir darüber im Klaren!

PS: Es gibt natürlich auch fähige Freelancer, aber die verlangen dann a) mindestens 200€ pro Stunde und b) findest du diese garantiert nicht auf Plattformen wie Fivverr (oder wie dieser Sklavenmarkt heißt ...).

...zur Antwort

Du kannst davon ausgehen, dass alles, was mit den Begriffen "entgiften", "antioxidanzien" oder "ganzheitlich" beworben wird, esoterisch angehauchter Bullshit ist.

...zur Antwort

Der Grafikspeicher frisst so viel, wie du zugewiesen hast. Ca. 16 bis 128 MB.

Der Windowmanager zusätzlich noch mal ca. 500 MB.

Und jede GUI-Anwendung inkl. Cache ... Open end. :)

Ein Serverbasissystem kommt mit allem drum und dran erst mal auf 80 MB, also deutlich weniger. Damit ist also viel mehr Platz für Serverprozesse vorhanden.

...zur Antwort

Das mit dem WLAN abschallten ist Quatsch.

Falls du in deinem Leben schon mal 5 Minuten bei Sonnenschein draußen warst, warst du in dieser kurzen Zeit auf natürliche Weise MEHR elektromagnetischer Strahlung ausgesetzt, als du in deinem ganzen restlichen Leben per WLAN abbekommen wirst.

Mach dir das bitte mal klar!

...zur Antwort

In Python ist alles idiotensicher, sodass es (fast) zu keinen katastrophalen Fehlern kommen kann.

Selbst die Addition zweier Integervariablen macht implizit eine ganze Orgie von Prüfungen, Sprüngen, Speicherreservierungen, Syscalls, Bibliotheksaufrufen, usw.

Dass das VIEL langsamer als C sein MUSS, dürfte klar sein.

...zur Antwort

In meiner Ehe haben wir beide ein wunderbares Verhältnis zu unseren jeweiligen Schwiegereltern.

Aber nach dem, was ich so aus dem Bekanntenkreis höre, ist das wohl alles andere als die Regel.

Immer wenn ich irgendwelche Horrorstories von anderen zu dem Thema mitbekomme, bin ich echt froh, dass bei uns alles so harmonisch ist. :)

...zur Antwort
from itertools import combinations as comb

numbers = [1, 2, 3]
summed = 6

result = [(a, b) for a, b in comb(numbers) if a * b == summed]

print(result) # (2, 6)

Das liefert dir alle Zweier-Zahlenkombinationen aus der Liste "numbers", die in der Summe "6" ergeben.

In deinem Falle musst du also einfach nur die Variablen "numbers" und "summed" anpassen. In "result" stehen dann alle entspr. Kombinationen, und zwar ohne Doubletten! :)

...zur Antwort

Termux aus dem Google Playstore wird zeitnah eingestellt werden, weil Google Richtlinien zum Nachladen von Software verschärft hat. (Also quasi ein bisschen so schlimm wie Apple!)

Deshalb empfiehlt das Termux-Projekt auf der offiziellen Website, seine Daten (Termux-Home-Verzeichnis & Co) zu backuppen, Termux zu deinstallieren, den F-Droid-Store parallel zum Google-Play-Store zu installieren, und DARAUS dann die aktuelle Termux-Version zu installieren.

Das geht genauso einfach, aber bevor man Termux von F-Droid installiert, UNBEDINGT alle Termux-Apps aus dem Google-Store VORHER deinstallieren, sonst bricht die Installation ab!

Aber wie gesagt: Als erstes ein Backup deiner Daten machen!

Nebenbei bemerkt: Die Termux-Version aus dem Google-Play-Store und die Reopsitories darin sind total veraltet, instabil und werden zum großen Teil gar nicht mehr supported!

Nur Termux von F-Droid ist aktuell, hat supportete Reops und wird mit aktuellen Patches versorgt.

Also falls du noch nicht von der Google-Playstore-Version zur F-Droid-Version umgezogen bist, solltest du das als erstes tun. Ist wirklich keine große Sache und in wenigen Minuten erledigt!

Viel Erfolg! :)

...zur Antwort

Gibt keinen.

Schadsoftware wie Trojaner sind übrigens auch das gleiche wie Anwendungssoftware.

Das ist auch der Grund dafür, warum Antivirensoftware nicht funktioniert. Es wird versucht, Eigenheiten zu finden, wo keine sind.

Fazit: Aus technischer Sicht alles das Selbe.

...zur Antwort

Der Elvisoperator ist nicht hässlich, sondern macht den Code deutlich lesbarer. Und zwar massiv!

Für kurze Anweisungen würde ich den logischerweise immer vorziehen.

Hässlich wird es dann, wenn man ellenlange Ausdrücke in den Elvisoperator quetscht, oder noch schlimmer schachtelt.

Genauso hässlich und unleserlich bzw. platzraubend sind unnütze if-else-Konstrukte, die derselben Variablen nur andere Werte zuweisen.

...zur Antwort

In C ist ...

int zahlen[]

... kein Array, sndern ein Zeiger!

Das ist für Einsteiger oft etwas missverständlich.

Zu einem Arraytypen in C gehört IMMER auch die Größe dazu.

Wenn du also ...

int zahlen[5]

... schreibst, dann gehört die "5" zum Typen dazu, und es ist ein komplett anderer und inkompatibler Typ, als würdest du ...

int zahlen[42]

... schreiben.

Ein Zeiger hingegen wird ...

int * zahlen

... oder ...

int zahlen[]

... geschrieben, im letzten Falle also OHNE Größenangabe.

Implizit werden Arrays bei der Übergabe an Funktionen in Zeiger umgewandelt.

Innerhalb deiner Funktion ...

int getNumber(int zahlen[]);

... ist also nur ein int-Zeiger OHNE Größe sichtbar.

Randbemerkung: Deshalb können "Tricks" wie ...

size_t count = sizeof(zahlen) / sizeof(* zahlen);

... innerhalb der Funktion auch gar nicht funktionieren! Aber egal.

Der herkömmliche C-Weg wäre es jetzt, neben dem Arrayzeiger zusätzlich auch die Größe explizit an die Funktion zu übergeben:

int getNumber(int * numbers, size_t size) {
  int sum = 0;

  for (size_t i = 0; i < size; ++i) {
    sum += numbers[i];
  }

  return summe;
}

Aufgerufen wird so eine Funktion wie folgt:

int nums[] = {2, 4, 8}; // int nums[3]

int x = getNumber(nums, sizeof(nums) / sizeof(* nums));

Bei der Initialisierung des Arrays kann die Größenangabe entfallen, wie sie sich (wie oben) automatisch aus dem Kontext ergibt.

Und die Größe kannst du natürlich auch direkt als Wert an deine Funktion übergeben:

int nums[7];

// ... initialisiere nums

int x = getNumber(nums, 7);

Mit dem Unterschied zwischen Arrays und Zeigern haben oft sogar langjährige Programmierer Probleme, einfach weil sie es nie richtig gelernt haben.

So, und nun zu C++, da du in deiner Frage ja von C++ sprichst. Dort gibt es nämlich noch sehr viele weitere Möglichkeiten!

Das einfachste wäre, einfach ein auto-Template zu nutzen (ab C++17):

auto getNumbers(auto & nums) {
  int sum = 0;

  for (auto i : nums) {
    sum += i;
  }

  return sum;
}

Disclaimer am Rande: Der Einfachheit halber verzichte ich konsequent auf "const-Correctness" und vielen anderen Dingen, die C und vor allem C++ so bieten.

Die obige Funktion wäre normalerweise ein Einzeiler, wenn man es "richtig" machen wollte! Aber das ist jetzt nicht weiter wichtig.

Die Zweite Möglichkeit in C++ wäre ein explizites Array. Das funktioniert auch mit uralten C++-Versionen:

template <typename T, size_t N>
T getNumber(T (& nums)[N]) {
  // ... Rest wie im auto-Template ...
}

Dann gibt es noch die Möglichkeit mit Typetraits ...

#include <type_traits>

template <typename T>
T getNumber(T & nums) {
  int sum {};

  for (size_t i {}; i < ::std::extent<T>(); ++i) {
    sum += nums[i];
  }

  return sum;
}

Oder man nutzt von vornherein C++-Arrays, die ihre eigene Größe kennen, und nicht "vergessen" wie die C-Arraxs:

#include <algorithm>
#include <array>

int getNumber(auto & nums) {
  return ::std::accumulate(nums.begin(), nums.end(), 0);
}

// ...

::std::array<int, 7> numbers { 2, 3, 5, 7, 11, 13 };

int x = getNumber(numbers);

All das kann man auch nahezu beliebig kombinieren und es gibt noch eine ganze Reihe weiterer Möglichkeiten, die hier allerdings den Rahmen sprengen würden.

Wie gesagt, die obigen Beispiele haben alle einige Mängel, weil ich den Code absichtlich kurz und einfach halten wollte. In Produktivcode würde man "const", "noexcept", "[[nodiscard]]", uvm. Schlüsselwörter und Techniken zusätzlich nutzen.

Naja, lass dich von der Informationsflut nicht erschlagen! Soooo schlimm wie es aussieht ist das alles gar nicht. :)

Viel Erfolg noch! :)

...zur Antwort