Die richtige Methode um andere Algorithmen zu implementieren


  • Mod

    fauxcom schrieb:

    Oder - anders gefragt - wie kann ich denn heraus finden, wie allgemein Bibliotheken der Entwicklungsumgebung hinzugefügt werden? Und wie, wie ich sie in meinem Programm einsetzen kann?

    Das sind Dinge, die in der Anleitung deiner Entwicklungsumgebung beschrieben sind. Aber ich verrate dir ein Geheimnis: (Fast) niemand liest Anleitungen. Rate mal, was die Leute stattdessen tun.
    Wenn du nicht auf die Antwort kommst, dann bist du noch nicht so weit, selbstständig eine Fremdbibliothek nutzen zu können. Da hilft nur, weiter Erfahrungen zu sammeln.



  • Ich kann leider nichts hinter deinen gedanken vermuten ... Bitte sag es doch einfach direkt 🙂

    Dass ich Dokumentationen lesen muss, ist klar. Bin ich gerne bereit zu.

    Nur im Konkreten Fall, da komm ich nicht weiter.

    Z.B. zu Threefish:

    Auf https://www.schneier.com/threefish.html finde ich ganz unten den Link zum C-Code von Threefish und Skein. Eine Dokumentation ist nicht verlinkt. Muss man hier anhand des Quellcodes versuchen zu ermitteln, wie man Threefish nun implementiert?

    Das ist eben meine Schwierigkeit, dass ich nicht weiss, wo ich notwendige Informationen her kriege, um beispielsweise Threefish korrekt anwenden zu können.

    Kann ich davon ausgehen, dass man eine bestimmte Bibliothek gut lernen muss um es einsetzen zu können und auch die Erfahrenen Entwickler dies nicht schnell können?


  • Mod

    fauxcom schrieb:

    Ich kann leider nichts hinter deinen gedanken vermuten ... Bitte sag es doch einfach direkt 🙂

    Wenn du nicht weißt, wie etwas funktioniert, dann folgst du folgendem Handlungsmuster:
    http://xkcd.com/627/
    Damit findest du ganz leicht heraus, wie du oft benutzte Dinge erledigst, beispielsweise wie man eine Bibliothek in einer viel benutzten Entwicklungsumgebung einbindet.

    Dass ich Dokumentationen lesen muss, ist klar. Bin ich gerne bereit zu.

    Das brauchst du eigentlich nur für die Bibliothek selber, wenn überhaupt.

    Nur im Konkreten Fall, da komm ich nicht weiter.

    Z.B. zu Threefish:

    Auf https://www.schneier.com/threefish.html finde ich ganz unten den Link zum C-Code von Threefish und Skein. Eine Dokumentation ist nicht verlinkt. Muss man hier anhand des Quellcodes versuchen zu ermitteln, wie man Threefish nun implementiert?

    Was willst du nun wissen? Wie Threefish funktioniert? Ist dort verlinkt. Wie man Threefish implementiert (das heißt, Code schreibt, der Threefish umsetzt)? Wie man Code schreibt, musst du selber wissen. Was zu tun ist, ist dort beschrieben, wo beschrieben steht, wie Threefish funktioniert. Es sind sogar Beispielimplementierungen gegeben. Wie man diese Beispielimplementierungen benutzt? Ja, das ist hier in der Tat etwas hakelig, da du da eine Beispielimplementierung nutzt von einer Seite, die sich primär an absolute Experten richtet. Da muss man auch ein bisschen Eigeninitiative zeigen. Die Benutzung ist tatsächlich in der knappen Dokumentation erklärt, bloß etwas versteckt.

    Kann ich davon ausgehen, dass man eine bestimmte Bibliothek gut lernen muss um es einsetzen zu können und auch die Erfahrenen Entwickler dies nicht schnell können?

    Nein, das ist normalerweise nicht der Fall. Je mehr der Autor aber von seinem Publikum erwartet, desto weniger wird er es mit trivialen Details nerven. Das ist bei obigem Beispiel eindeutig der Fall. Wer nicht weiß, wie man Bibliotheken grundsätzlich benutzt, hat bei Kryptographieimplementierungen eher wenig zu suchen.

    Vielleicht solltest du anfangen, weniger allgemeine Fragen zu stellen, wenn du weniger allgemeine Antworten möchtest. Es geht dir ja anscheinend um irgendeine konkrete Fragestellung im Bereich Kryptographie, aber du redest um den heißen Brei herum.



  • SeppJ schrieb:

    Wenn du nicht weißt, wie etwas funktioniert, dann folgst du folgendem Handlungsmuster: http://xkcd.com/627/

    Nette Grafiken, aber so weit weiss ich dann auch schon wieder 🙂

    Was willst du nun wissen? Wie Threefish funktioniert? [...] Wie man Threefish implementiert (das heißt, Code schreibt, der Threefish umsetzt)?

    Genau, ja. Wie binde ich den dort vorhandenen Code in meinen Code ein und wie kann ich damit eine Datei dann verschlüsseln?

    Es sind sogar Beispielimplementierungen gegeben.

    Wo denn genau? Hast du einen Link?

    [quote]Wie man diese Beispielimplementierungen benutzt? Ja, das ist hier in der Tat etwas hakelig, da du da eine Beispielimplementierung nutzt von einer Seite, die sich primär an absolute Experten richtet.[Quote]
    also doch 🙂 Richtet sich an experten. OK, welcher Ansatz, wie ich eigen Initiative zeigen könnte, ist denn am Besten?

    Die Benutzung ist tatsächlich in der knappen Dokumentation erklärt, bloß etwas versteckt.

    Darf ich wissen, wo?

    Es geht dir ja anscheinend um irgendeine konkrete Fragestellung im Bereich Kryptographie, aber du redest um den heißen Brei herum.

    Nein, das sind nur Beispiele. Es geht mir wirklich um das Allgemeine.

    Naja, kurz zu mir: Ich hab letztes Jahr ein dickes Buch durchgewälzt und habe so einigermaßen C++ gelernt. Später habe ich mich mit Qt beschäftigt. Ich kann Dialoge Programmieren und die Widgets mit Funktionen belegen.

    Aber ich würde gerne viel mehr machen als nur das und für fast alles braucht man irgendwelche Bibliotheken. And i failed every single time, die zu implementieren. Vielleicht hab ich einfach noch nicht genug Wissen dafür.

    Unter Visual Basic 6 (sehr lange her, dass ich hier zuletzt was gemacht hatte) ging das alles sehr einfach. MD5 oder CRC konnte man ganz leicht einbinden in sein eigenes Projekt. Und ich versteh nicht, wieso das bei C++ scheitert. Drum auch diese dummen nachfragen.

    Naja, aber ich bin schon ein ganzes Stück weiter. Danke 🙂


  • Mod

    fauxcom schrieb:

    SeppJ schrieb:

    Wenn du nicht weißt, wie etwas funktioniert, dann folgst du folgendem Handlungsmuster: http://xkcd.com/627/

    Nette Grafiken, aber so weit weiss ich dann auch schon wieder 🙂

    Wie schon gesagt, solltest du spätestens von Google erfahren, wie man Bibliotheken in deiner IDE einbindet. Aber eigentlich würde ich erwarten, dass auch zufälliges Klicken auf alles, was irgendwie danach klingt, als könnte es damit zu tun hat, bereits zum Erfolg führt.

    Was willst du nun wissen? Wie Threefish funktioniert? [...] Wie man Threefish implementiert (das heißt, Code schreibt, der Threefish umsetzt)?

    Genau, ja. Wie binde ich den dort vorhandenen Code in meinen Code ein und wie kann ich damit eine Datei dann verschlüsseln?

    Also genau Nein. Du willst weder wissen, wie Threefish funktioniert, noch wie man selber Threefish programmiert.

    Es sind sogar Beispielimplementierungen gegeben.

    Wo denn genau? Hast du einen Link?

    Den hast du doch selber geliefert. Lies!

    Die von dir verlinkte Seite schrieb:

    C# implementation of Skein and Threefish by Alberto Fajardo
    .NET/Mono implementation of Threefish-256 by Marcus Griep
    AVR 8-bit implementation of Threefish and Skein by Jörg Walter
    Skein and Threefish functions for Java, C, and Go (Skein3Fish)

    Wie kannst du das nicht finden?

    (P.S.: Kann es sein, dass du etwas anderes unter "Implementierung" verstehst als gemeint ist? Eine Implementierung ist eine Umsetzung von Etwas. Du scheinst aber von der Benutzung von Etwas zu reden.)

    Wie man diese Beispielimplementierungen benutzt? Ja, das ist hier in der Tat etwas hakelig, da du da eine Beispielimplementierung nutzt von einer Seite, die sich primär an absolute Experten richtet.

    also doch 🙂 Richtet sich an experten. OK, welcher Ansatz, wie ich eigen Initiative zeigen könnte, ist denn am Besten?

    Lesen! Es steht alles da, was du wissen musst, es ist bloß nicht auf dem Silbertablett serviert.

    Die Benutzung ist tatsächlich in der knappen Dokumentation erklärt, bloß etwas versteckt.

    Darf ich wissen, wo?

    Hast du die Dokumentation gelesen? Von oben nach unten? Ohne etwas zu überspringen? (Du kannst diese Frage gar nicht mit Ja beantworten, falls du den Code gar nicht gefunden hast. Andererseits ist unklar, wovon du die ganze Zeit überhaupt geredet hast, wenn du den Code nicht gefunden hast)

    Es geht dir ja anscheinend um irgendeine konkrete Fragestellung im Bereich Kryptographie, aber du redest um den heißen Brei herum.

    Nein, das sind nur Beispiele. Es geht mir wirklich um das Allgemeine.

    Warum probierst du dich dann an irgendwelchen obskuren Kryptobibliotheken? Warum nicht etwas verbreiteteres, besser dokumentiertes?

    Um zum Comic zurück zu kommen: Das sieht zwar lustig (und ein bisschen gemein aus), ist aber ernst gemeint. Was dir am ehesten zu fehlen scheint ist eine der wichtigsten Fertigkeiten: Selbstständig Informationen besorgen und verstehen. Da hilft wirklich nur Erfahrung und bei den ersten Malen ist es schwierig, aber man sollte schnell lernen. Anscheinend hast du so etwas aber bisher nicht gelernt.
    Weiterhin scheinst du ein etwas unaufmerksamer Leser zu sein, das ist nicht gerade hilfreich (siehe zum Beispiel das "genau, ja", weiter oben).

    Was denkst du denn, wenn ich dir jetzt ein Beispiel gäbe, wie ich so schnell zu diesem käme? Bestimmt nicht durch meine langjährige Erfahrung mit einer kleinen Beispielimplementierung von einer Profikryptographieseite. Nein, weil ich die Dokumentation aufmerksam lesen würde, die Passage

    The C implementation provides a similar functionality as the Java implementation.

    finden würde; daraufhin die Passage

    Because I'm familiar with the Bouncy Castle crypto library I decided to design the Java interface along the lines of BouncyCastle's lightweight crypto API.

    lesen würde; daraufhin nach BouncyCastle's lightweight crypto API googeln würde; und daraufhin alles wüsste, was ich wissen müsste.



  • fauxcom schrieb:

    Wie arbeiten erfahrene C++ Programmierer eigentlich mit Bibliotheken, APIs und fremden Algorithmen, bzw. woher wissen sie oder lernen sie, wie sie bestimmte Funktionen in ihr Programm implementieren können?

    Normalerweise weiß ich den passenden Algo. Selten muss ich ein Sekündchen nachdenken. Das Eintippen ist lästig und deswegen schaue ich in std:: oder boost::. Die Algos, die dort nicht sind, sind eigentlich nicht genug verallgemeinbar, daß ich sie aus einer Lib holen könnte. Hat ja keinen Zweck, wenn man sich länger in die Doku einlesen muss als es dauern würde, es schnell selber zu machen. Zumal man selber aufgeräumte und nicht verspielte/verboostelte Schnittstellen bieten kann.
    Außer manchmal, wenns echt ans Eingemachte geht. Wenns so doof kommt, daß ich zum Beispiel echt "fühle", daß ich in O(n^3) durchkommen müßte, aber alles Fremde lahmer (weil generischer) ist. Dann schreibe ich es selber.
    Und meistens dabei hänge ich zwei Wochen lang dran. Unter der Dusche oder beim Rasenmähen oder so kommt der Gedankenblitz, der es löst. Oder auch nicht und nimmer, was bei unlösbaren Aufgaben meistens der Fall ist.

    "fühle" ist sauwichtig. Nicht RSA knacken, da fühle ich gar nix. Ich kann's nicht beschreiben. Wenn ich eine Programmierlösung sehe, dann paßt die halt in meinen Augen oder ich zweifle: Geht besser. Und ich habe fast immer recht.

    Dir Fragesteller würde ich empfehlen, Bücher mit Namen wie "Algorithmen und Datenstrukturen" zu lesen. Und meinen werten Vorpostern auch. Man kann Algos nicht zusammen-klicken/inkludieren ohne gute Gesamtübersicht im Hirne.

    99% der Libs kannste in der Pfeife rauchen. Verspielt bis ins Unbrauchbare oder fachlich inkompetent.


  • Mod

    volkard schrieb:

    Dir Fragesteller würde ich empfehlen, Bücher mit Namen wie "Algorithmen und Datenstrukturen" zu lesen. Und meinen werten Vorpostern auch. Man kann Algos nicht zusammen-klicken/inkludieren ohne gute Gesamtübersicht im Hirne.

    Wer behauptet denn auch so etwas?

    99% der Libs kannste in der Pfeife rauchen. Verspielt bis ins Unbrauchbare oder fachlich inkompetent.

    Da habe ich aber andere Erfahrungen. Vielleicht wenn du mit den 99% die Millionen von Bibliotheken meinst, die im Internet herumfliegen, die vielleicht bestenfalls der Autor selber nutzt. Aber so Probleme wie Datentransfer (libcurl), Numerik (GSL), 3D-Grafik (OpenGL/DirectX - ja sind APIs, keine konkreten Implementierungen), Betriebssystemzeugs (unter anderem Threads!) (WinAPI bzw. POSIX-API), Kompression (zlib) und vieles andere mehr. Das sind doch gute Bibliotheken! Das selber zu Programmieren wäre unsagbar aufwändig, in vielen Fällen (Implementierung der genannten APIs) sogar unmöglich. Das würde man niemals selber machen.

    Deshalb kritisiere ich ja auch den TE dafür, dass er seine ersten Erfahrungen an irgendeiner obskuren Beispielbibliothek machen will. Er sollte lieber mit boost::filesystem sich mal den Inhalt des Arbeitsverzeichnisses ausgeben lassen. Danach auch mal eine typische C-Bibliothek angucken (da sie so oft vorkommen). Vielleicht ein paar Zufallszahlen mit der GSL erzeugen, dann einen C++-Wrapper drumherum schreiben.



  • SeppJ schrieb:

    Aber so Probleme wie Datentransfer (libcurl),

    Ok, die spart wirklich viel Zeit.

    SeppJ schrieb:

    Numerik (GSL),

    Auch angenommen. Und andere, gerade in der Mathematik. Da scheinen die Schnittstellen zu stimmen.

    SeppJ schrieb:

    3D-Grafik (OpenGL/DirectX - ja sind APIs, keine konkreten Implementierungen),

    100% der Benutzer schreiben sich Wrapper-Klassen drum oder benutzen fremde Engines. Also sind OpenGL/DirextX keine idealen Beispiele für gelungene Libs.

    SeppJ schrieb:

    Betriebssystemzeugs (unter anderem Threads!) (WinAPI bzw. POSIX-API),

    Auch nur API, und um die WinAPI braucht man sicherlich Wrapper.

    HANDLE WINAPI CreateFile(
    _In_ LPCTSTR lpFileName,
    _In_ DWORD dwDesiredAccess,
    _In_ DWORD dwShareMode,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _In_ DWORD dwCreationDisposition,
    _In_ DWORD dwFlagsAndAttributes,
    _In_opt_ HANDLE hTemplateFile
    );

    Um Threads eigentlich auch.

    SeppJ schrieb:

    Kompression (zlib)

    Ja, auch. Wobei ich bei ernsthaften Sachen selber Hand anlegen würde, denn ein spezieller Packer, der die Datenlage genau kennt, haut viel mehr raus.

    SeppJ schrieb:

    und vieles andere mehr. Das sind doch gute Bibliotheken! Das selber zu Programmieren wäre unsagbar aufwändig, in vielen Fällen (Implementierung der genannten APIs) sogar unmöglich. Das würde man niemals selber machen.

    Hast recht, neben std/boost gibt es noch Libs, die man in Betracht sollte.

    SeppJ schrieb:

    Vielleicht ein paar Zufallszahlen mit der GSL erzeugen, dann einen C++-Wrapper drumherum schreiben.



  • volkard schrieb:

    SeppJ schrieb:

    3D-Grafik (OpenGL/DirectX - ja sind APIs, keine konkreten Implementierungen),

    100% der Benutzer schreiben sich Wrapper-Klassen drum oder benutzen fremde Engines. Also sind OpenGL/DirextX keine idealen Beispiele für gelungene Libs.

    SeppJ schrieb:

    Betriebssystemzeugs (unter anderem Threads!) (WinAPI bzw. POSIX-API),

    Auch nur API, und um die WinAPI braucht man sicherlich Wrapper.

    HANDLE WINAPI CreateFile(
    _In_ LPCTSTR lpFileName,
    _In_ DWORD dwDesiredAccess,
    _In_ DWORD dwShareMode,
    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _In_ DWORD dwCreationDisposition,
    _In_ DWORD dwFlagsAndAttributes,
    _In_opt_ HANDLE hTemplateFile
    );

    Das sind Low-Level-APIs, die einem viele Moeglichkeiten bieten, aber auch viel Arbeit aufzwingen. Ausserdem haben alle den Anspruch, auch in C zu funktionieren, was sie fuer C++ unpraktisch macht. Trotzdem lohnt sich die Verwendung, auch wenn man sie kapselt oder nur indirekt ueber andere Libraries darauf zugreift.



  • man open schrieb:

    int open(const char *pathname, int flags, mode_t mode);
    int creat(const char *pathname, mode_t mode);
    int openat(int dirfd, const char *pathname, int flags);
    int openat(int dirfd, const char *pathname, int flags, mode_t mode);

    Was fällt auf?
    Ok, da gehört auch ein Wrapper drum, aber man muss nicht sofort kotzen, wenn man die Linux-API sieht.

    Marthog schrieb:

    Trotzdem lohnt sich die Verwendung

    Scherzkeks! Die Betriebssystem-API (bzw Framework-API wie in jave/.net) wird man kaum vermeiden können.


Anmelden zum Antworten