[![](https://git.sr.ht/~alip/jja/blob/main/misc/jja-logo.png)](https://git.sr.ht/~alip/jja) Schweizer Taschenmesser für Schachdateiformate ============================================== [![Jin, Jîyan, Azadî](https://img.shields.io/badge/Jin,%20J%C3%AEyan,%20Azad%C3%AE!-8A2BE2)](https://en.wikipedia.org/wiki/Woman,_Life,_Freedom) [![crates.io](https://img.shields.io/crates/v/jja.svg)](https://crates.io/crates/jja) [![repology](https://repology.org/badge/latest-versions/jja.svg)](https://repology.org/project/jja/versions) [![msrv](https://img.shields.io/badge/rustc-1.70%2B-green?style=plastic)](https://blog.rust-lang.org/2022/09/22/Rust-1.70.0.html) [![documentation](https://docs.rs/jja/badge.svg)](https://docs.rs/jja) [![build status](https://builds.sr.ht/~alip/jja.svg)](https://builds.sr.ht/~alip/jja?) [![downloads](https://img.shields.io/crates/d/jja.svg)](https://crates.io/crates/jja) [![Crowdin](https://badges.crowdin.net/jja/localized.svg)](https://crowdin.com/project/jja) [![stability-beta](https://img.shields.io/badge/stability-beta-33bbff.svg)](https://github.com/mkenney/software-guides/blob/master/STABILITY-BADGES.md#beta) [![license](https://img.shields.io/crates/l/jja.svg)](https://git.sr.ht/~alip/jja/tree/main/item/COPYING) [![dependency status](https://deps.rs/repo/sourcehut/~alip/jja/status.svg)](https://deps.rs/repo/sourcehut/~alip/jja) [![maintenance-status](https://img.shields.io/badge/maintenance-actively--developed-brightgreen.svg)](https://git.sr.ht/~alip/jja) Dies ist ___jja___, ein Befehlszeilen-Utility, um mit verschiedenen Schach-Dateiformaten zu interagieren. Es befindet sich noch in den frühen Entwicklungsstadien. Die ursprüngliche Absicht des Autors bestand darin, ihre Eröffnungsbücher, die im proprietären [CTG](https://www.chessprogramming.org/CTG)-Format von ChessBase gespeichert wurden, in das freie und offene [PolyGlot](http://hgm.nubati.net/book_format.html)-Format zu konvertieren. Mit der Zeit beabsichtigt der Author, Unterstützung für andere Schach-Dateiformate hinzuzufügen ( [cbh](https://www.chessprogramming.org%2FChessBase_%28Database%29%23Formats), [epd](https://www.chessprogramming.org/Extended_Position_Description), [pgn](https://www.chessprogramming.org/Portable_Game_Notation), [si4](https://www.chessprogramming.org/SCID#Database_Format), [si5](https://www.chessprogramming.org/SCID#Database_Format) und so weiter). # Demo jja intro # Jin, Jîyan, Azadî Ich habe damit begonnen, an diesem Projekt am Internationalen Frauentag 2023 zu arbeiten, einem Tag, an dem die Errungenschaften von Frauen geehrt und für ihre Rechte weltweit eingetreten wird. Als Person mit kurdischem Hintergrund bin ich besonders bewegt von dem Slogan "Jin, Jîyan, Azadî" - "Frau, Leben, Freiheit" - der zu einem Symbol des Widerstands gegen Unterdrückung und einem Ruf nach Gleichberechtigung geworden ist. Im Geiste freier Software und freier Meinungsäußerung bemühe ich mich, zur Schaffung einer gerechteren und inklusiveren Gesellschaft beizutragen, in der jedem Menschen die Freiheit gewährt wird, sich auszudrücken und seinen Träumen nachzugehen. Ich ehre auch das Andenken an Mahsa Amini, deren tragischer Tod uns an die dringende Notwendigkeit erinnert, für die Freiheit und Sicherheit von Frauen zu kämpfen. Mehr auf Wikipedia, [WikiPedia::Frau, Leben, Freiheit](https://de.wikipedia.org/wiki/Frau,_Leben,_Freiheit) # Formate In der Version 0.7.0 unterstützt jja das Lesen/Abfragen von: - [PolyGlot](http://hgm.nubati.net/book_format.html), auch bekannt als `bin` - [Arena](https://www.chessprogramming.org/ABK), auch bekannt als `abk` - [ChessBase](https://www.chessprogramming.org/CTG), auch bekannt als `ctg` - [ChessMaster](https://www.chessprogramming.org/Chessmaster), auch bekannt als `obk` (Version 1 und 2, ohne/mit Textnotizen) - [BrainLearn](https://github.com/amchess/BrainLearn), auch bekannt als `exp` Eröffnungsbuchdateien, während des Schreibens/Konvertierens unterstützt in: - [PolyGlot](http://hgm.nubati.net/book_format.html), auch bekannt als `bin` - [Arena](https://www.chessprogramming.org/ABK), auch bekannt als `abk` - [BrainLearn](https://github.com/amchess/BrainLearn), auch bekannt als `exp` Eröffnungsbuchdateien. Ab Version 0.5.0 unterstützt ___jja___ den Export aller unterstützten Eröffnungsbuchformate nach [PGN](http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm). Um diese Funktion zu nutzen, geben Sie eine Ausgabedatei mit `pgn` Erweiterung als Argument für `jja edit` an. Bei der Konvertierung von Eröffnungsbüchern verwendet ___jja___ die Informationen aus verschiedenen Eingabeformaten dieser, um ein **Zuggewicht** zu ermitteln, das dem Zug in der [PolyGlot](http://hgm.nubati.net/book_format.html)-Eröffnungsdatei beiliegt. ___jja___ schreibt auch einige benutzerdefinierte Zahlen in das **Lernfeld**, wie zum Beispiel [NAGs](https://en.wikipedia.org/wiki/Numeric_Annotation_Glyphs) während der `ctg`-Konvertierung oder **Priorität** während der `abk`-Konvertierung. Sie können diese benutzerdefinierte Verwendung mit `--no-learn` deaktivieren, da sie andere Software, die dieses Feld verwendet, verwirren könnte. Beachten Sie, dass das Schreiben von [Arena](https://www.chessprogramming.org/ABK)-Eröffnungsbuchdateien, auch bekannt als `abk`, nur von [ChessBase](https://www.chessprogramming.org/CTG)-Eröffnungsbüchern, auch bekannt als `ctg`, unterstützt wird. Verwenden Sie die Befehlszeilenoptionen `--author`, `--comment`, `--probability-priority`, `--probability-games`, `--probability-win-percent`, um die [ABK](https://www.chessprogramming.org/ABK)-Header-Metadaten zu konfigurieren. Spielstatistiken (Mindestanzahl von Spielen/Siegen, Siegprozentzahlen für beide Seiten) werden automatisch von ___jja___ verwaltet. Eine In-Place-Bearbeitung für [Arena](https://www.chessprogramming.org/ABK)-Eröffnungsbücher ist ebenfalls möglich - mit der Befehlszeilenoption `-i, --in-place=SUFFIX`. Die Konvertierung von [PolyGlot](http://hgm.nubati.net/book_format.html)-, auch bekannt als `bin`- und [ChessMaster](https://www.chessprogramming.org/Chessmaster)-, auch bekannt als `obk`-Eröffnungsbüchern, in [Arena](https://www.chessprogramming.org/ABK)-, auch bekannt als `abk`-Eröffnungsbuchdateien, ist für eine zukünftige Veröffentlichung geplant. # Verwendung - Verwenden Sie `jja info`, um kurze Informationen über die Schachdatei zu erhalten. - Verwenden Sie `jja find`, um nach einer Position in einer Schachdatei zu suchen. - Verwenden Sie `jja edit`, um Eröffnungsbuchdateien zu bearbeiten und in [PolyGlot](http://hgm.nubati.net/book_format.html)-Dateien umzuwandeln. - Verwenden Sie `jja make`, um [PGN](https://en.wikipedia.org/wiki/Portable_Game_Notation)-Dateien in [PolyGlot](http://hgm.nubati.net/book_format.html)-Eröffnungsbücher zu kompilieren. ___jja___ bestimmt den Dateityp anhand der Dateierweiterung. Dateien mit der Erweiterung `.bin` gelten als [PolyGlot](http://hgm.nubati.net/book_format.html)-Bücher. Dateien mit der Erweiterung `.ctg` gelten als [ChessBase](https://www.chessprogramming.org/CTG)-Bücher. Dateien mit der Erweiterung `.abk` gelten als [Arena](https://www.chessprogramming.org/ABK)-Bücher. Dateien mit der Erweiterung `.obk` gelten als [ChessMaster](https://www.chessprogramming.org/Chessmaster)-Bücher. Standardmäßig zeigt ___jja___, wenn die Standardausgabe ein [TTY](https://en.wikipedia.org/wiki/Computer_terminal) ist, Informationen in ansprechenden Tabellen an. Verwenden Sie die Befehlszeilenoption `--porcelain`, um die Ausgabe stattdessen im [CSV](https://en.wikipedia.org/wiki/Comma-separated_values)-Format (Comma-separated values) zu erhalten. # Installation Um aus dem Quellcode zu kompilieren, verwenden Sie `cargo install jja`. Dies erfordert, dass die [Rust-Toolchain](https://rustup.rs/) installiert ist. Zusätzlich benötigen Sie [OpenSSL](https://www.openssl.org/)-Bibliotheken auf [UNIX](https://en.wikipedia.org/wiki/Unix)-Systemen. Außerdem benötigen Sie [liburing](https://github.com/axboe/liburing) auf [Linux](https://kernel.org). Wenn Sie sich auf einem [Linux](https://kernel.org)-System älter als [5.1](https://en.wikipedia.org/wiki/Io_uring#History) befinden oder aus einem anderen Grund [liburing](https://github.com/axboe/liburing) nicht installieren können, können Sie die Funktion deaktivieren, indem Sie jja mit `cargo install jja --no-default-features` erstellen. Alternativ werden Release-Builds von ___jja___ auf [chesswob.org](https://chesswob.org/jja) für [64-Bit](https://en.wikipedia.org/wiki/64-bit_computing)-[Linux](https://en.wikipedia.org/wiki/Linux) und [Windows](https://en.wikipedia.org/wiki/Microsoft_Windows) gehostet. Diese Versionen sind mit [GnuPG](https://gnupg.org/) signiert, unter Verwendung des Schlüssels [D076A377FB27DE70](https://keybase.io/alip/pgp_keys.asc). Um zu installieren, besorgen Sie sich die neueste Version von chesswob.org, überprüfen Sie die Prüfsumme und die [GnuPG](https://gnupg.org/)-Signatur: ``` $> export JJA_VERSION=0.6.1 $> export JJA_FLAVOUR=glibc $> curl https://keybase.io/alip/pgp_keys.asc | gpg --import % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 13292 100 13292 0 0 13535 0 --:--:-- --:--:-- --:--:-- 26584 gpg: key D076A377FB27DE70: public key "Ali Polatel (Caissa AI) " imported gpg: Total number processed: 1 gpg: imported: 1 $> for f in jja-${JJA_VERSION}-${JJA_FLAVOUR}.bin{,.sha512sum,.sha512sum.asc}; do wget -q https://chesswob.org/jja/${f}; done $> gpg --verify jja-${JJA_VERSION}.bin.sha512sum.asc jja-${JJA_VERSION}.bin.sha512sum gpg: Signature made Sun Mar 19 20:52:41 2023 CET gpg: using RSA key 5DF763560390A149AC6C14C7D076A377FB27DE70 gpg: Good signature from "Ali Polatel (Caissa AI) ... $> sha512sum -c jja-${JJA_VERSION}.bin.sha512sum jja: OK $> sudo install -m755 jja-${JJA_VERSION}-${JJA_FLAVOUR}.bin /usr/local/bin ``` Schließlich können Sie die Builds der neuesten Git-Version über den [SourceHut-Build-Server](https://builds.sr.ht/~alip/jja?) herunterladen. Es gibt drei Varianten: `Windows`, `Linux-Glibc` und `Linux-Musl`. Navigieren Sie einfach zur neuesten Build und laden Sie das auf der linken Seite aufgelistete Artefakt herunter. Hinweis: Diese Artefakte werden 90 Tage lang aufbewahrt. # Lizenz ___jja___ ist freie Software. Sie können es unter den Bedingungen der ___GNU General Public License___, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß ___Version 3___ der Lizenz oder (nach Ihrer Option) jeder späteren Version. Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber ___OHNE IRGENDEINE GARANTIE___, sogar ohne die implizite Garantie der ___MARKTREIFE___ oder der ___VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK___. Details finden Sie in der GNU General Public License. Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, siehe . # Fehler ``` Hey you, out there beyond the wall, Breaking bottles in the hall, Can you help me? ``` Melden Sie Fehler im Fehlerverfolgungssystem von ___jja___ unter : 1. Seien Sie immer **höflich**, respektvoll und freundlich: 2. Halten Sie Ihre letzte Änderung so **klein und ordentlich** wie möglich: 3. Das Anhängen von Gedichten an den Fehlerbericht fördert die Berücksichtigung enorm. # PGN-Buchherstellung Seit Version 0.4.0 kann ___jja___ [PolyGlot](http://hgm.nubati.net/book_format.html)-Bücher aus [PGN](http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm)-Dateien erstellen. Diese Funktion ähnelt `polyglot make-book` mit den folgenden Unterschieden: 1. ___jja___ kann direkt komprimierte [PGN](http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm)-Dateien .pgn.{bz2,gz,lz4,xz,zst} lesen. 2. ___jja___ kann [PGN](http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm)-Dateien verarbeiten, die größer sind als der verfügbare Speicher Ihres Systems, indem Statistiken in einer temporären [RocksDB](https://rocksdb.org/)-Datenbank gespeichert werden. 3. ___jja___ skaliert Zuggewichte standardmäßig, um mögliche Überläufe bei riesigen [PGN](http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm)-Dateien zu verhindern. Verwenden Sie `--no-scale`, um dies zu deaktivieren. 4. ___jja___ kann Züge mit *Filterausdrücken* filtern, sodass der Benutzer unerwünschte Partien ausblenden und spezialisierte Eröffnungsbücher erstellen kann. ## Filterausdrücke Der Filterausdrucks-String sollte Filterbedingungen enthalten, die aus einem Tag-Namen, einem Vergleichsoperator und einem Wert bestehen. Die folgenden Operatoren werden unterstützt: - `>` (größer als) - `>=` (größer oder gleich) - `<` (kleiner als) - `<=` (kleiner oder gleich) - `=` (gleich) - `!=` (ungleich) - `=~` (Regex-Übereinstimmung, nicht beachtung der Groß-/Kleinschreibung) - `!~` (negierte Regex-Übereinstimmung, nicht beachtung der Groß-/Kleinschreibung) Filterbedingungen können mit den folgenden logischen Operatoren kombiniert werden: - `AND` (logisches UND) - `OR` (logisches ODER) Beispiel: `--filter="Event =~ World AND White =~ Carlsen AND ( Result = 1-0 OR ECO = B33 )"` Unterstützte Tags sind Event, Site, Date, UTCDate, Round, Black, White, Result, BlackElo, WhiteElo, BlackRatingDiff, WhiteRatingDiff, BlackTitle, WhiteTitle, ECO, Opening, TimeControl, Termination, TotalPlyCount und ScidFlags. Zusätzlich gibt es vier spezielle Variablen, nämlich Player, Elo, Title und RatingDiff. Diese Variablen können verwendet werden, um den entsprechenden Header von einer der Seiten abzugleichen. Zum Beispiel ist der Filter: `--filter="Player =~ Carlsen"` funktional äquivalent zu `--filter="( White =~ Carlsen OR Black =~ Carlsen )"` Hinweis: Das Filtern ist darauf ausgelegt, einfach und schnell zu sein. Die Tokens, einschließlich Klammern, werden durch Leerzeichen getrennt. Das Setzen von Anführungszeichen um Werte herum ist nicht erlaubt. Für anspruchsvollere Filterbedürfnisse können Sie pgn-extract verwenden. ## Scid-Flags Scid verwendet für jedes Feld ein Zeichenflag, `DWBMENPTKQ!?U123456`, bei dem: - `D` - Gelöscht - `W` - Weiße Eröffnung - `B` - Schwarze Eröffnung - `M` - Mittelspiel - `E` - Endspiel - `N` - Neuerung - `P` - Bauernstruktur - `T` - Taktik - `K` - Königsflügelspiel - `Q` - Damenflügelspiel - `!` - Brillianz - `?` - Patzer - `U` - Benutzerdefiniert - `1..6` - Benutzerdefinierte Flags Es wird davon abgeraten, sich auf die Reihenfolge der Zeichenflags zu verlassen. Verwenden Sie eine Regex-Übereinstimmung, wenn/wann immer möglich. ## Tipps und Tricks zur PGN-Buch-Erstellung 0. Die Standardeinstellungen funktionieren am besten auf meinem Laptop und bei meinen persönlichen Benchmarks auf dem [SourceHut-Build-Server](https://builds.sr.ht/~alip/jja/commits/main/benchmark.yml), sie sind jedoch keine universelle Wahrheit. 1. ___jja___ verarbeitet Eingabe-PGN-Dateien parallel. Nutzen Sie dies zu Ihrem Vorteil, indem Sie viele aufgeteilte PGNs als Eingabe angeben, um Parallelität und Leistung zu erhöhen. 2. Eine Erhöhung der Batch-Größe ist gut, solange Sie eine konstante Speichernutzung haben. Wenn die Threads nicht mithalten können, erhalten Sie eine erhöhte Speichernutzung, und das ist der Punkt, an dem Sie wirklich Ihre Grenze kennen. 3. Versuchen Sie, das Limit für maximale offene Dateien zu erhöhen, aber nur bis zu dem Punkt, an dem Sie keine Systemfehler wegen zu vieler offenen Dateien mehr erhalten. Sie können `--max-open-files=-1` spezifizieren, um Dateien ständig offen zu halten. 4. Testen Sie verschiedene Kompressionsalgorithmen für die temporäre [RocksDB](https://rocksdb.org)-Datenbank oder deaktivieren Sie die Kompression vollständig, wenn Sie genügend Speicherplatz haben. jja schreibt die temporäre [RocksDB](https://rocksdb.org)-Datenbank in das selbe Verzeichnis wie das erste PGN-Dateiargument. Der Standardkompressionsalgorithmus [Lz4](https://lz4.github.io/lz4/) und die Standardkompressionsstufe `4` zielen auf eine schnelle Konvertierung mit relativ moderater Speichernutzung ab. Wenn Ihnen während der Konvertierung der Speicherplatz ausgeht, versuchen Sie, einen Algorithmus wie [Zstd](https://github.com/facebook/zstd) mit einer "Ultra"-Stufe, d.h. einer Stufe größer oder gleich `20`, zu verwenden. 5. Verwenden Sie, wenn möglich, Filter, die während der PGN-Durchquerung verarbeitet werden. Da diese Filter vor dem Schreiben der Spieldaten in die temporäre Datenbank abgeglichen werden, können sie bei kluger Verwendung einen großen Einfluss auf Speicher- und Speicherkosten haben und somit die Gesamtleistung verbessern. Diese Filter sind `--filter=`, `--max-ply=`, `--min-pieces=`, `--only-white` und `--only-black`. # Danksagungen Vielen Dank an ___Steinar H. Gunderson___, der die [CTG-Spezifikation](https://web.archive.org/web/20210129162445/https://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=2319) veröffentlicht und das [remoteglot](http://git.sesse.net/?p=remoteglot;a=summary)-Tool entwickelt hat: Der [CTG](https://www.chessprogramming.org/CTG)-Sondierungscode in ___jja___ ist direkt von seinem [C](https://en.wikipedia.org%2Fwiki%2FC_%28programming_language%29%)-Sondierungscode portiert und die Spezifikation war eine enorme Hilfe bei der Klärung verschiedener Unstimmigkeiten. Vielen Dank an ___Fabien Letouzey___, den Autor der ursprünglichen [PolyGlot](http://hgm.nubati.net/book_format.html)-Software: Der [PolyGlot](http://hgm.nubati.net/book_format.html)-Sondierungs-, Bucherstellungs- und Zusammenführungscode in ___jja___ ist größtenteils von seinem entsprechenden [C](https://en.wikipedia.org%2Fwiki%2FC_%28programming_language%29%)-Code portiert. Vielen Dank an ___Michel Van den Bergh___, den Autor von pg\_utils, einer Sammlung von Tools zur Interaktion mit PolyGlot-Eröffnungsbüchern: Der [PolyGlot](http://hgm.nubati.net/book_format.html)-Buchbearbeitungscode von ___jja___ verwendet viele Ideen und Codeausschnitte aus pg\_utils. Vielen Dank an ___Peter Österlund___, den Autor von [DroidFish](https://www.chessprogramming.org/DroidFish): Der [ABK](https://www.chessprogramming.org/ABK)-Eröffnungsbuch-Interface-Code in ___jja___ verwendet Ideen und Codeausschnitte aus [DroidFish](https://www.chessprogramming.org/DroidFish). Vielen Dank an ___Jens Nissen___, den Autor von [ChessX](https://chessx.sourceforge.io/): Die [CTG](https://www.chessprogramming.org/CTG)- und [ABK](https://www.chessprogramming.org/ABK)-Sondierungscodes in ___jja___ verwenden Ideen und Codeausschnitte aus [ChessX](https://chessx.sourceforge.io/). Vielen Dank an [LiChess](https://lichess.org), die beste Schach-Website auf dem Planeten. Der `quote` Befehl von ___jja___ enthält eine Auswahl von Zitaten, die aus der [LiChess](https://lichess.org)-Codebasis importiert wurden. Vielen Dank an ___Shane Hudson___, den Autor von [Scid vs. PC](https://scidvspc.sourceforge.net/): Der `jja eco`-Befehl verwendet die [ECO](https://www.chessprogramming.org/ECO)-Klassifizierung, die vom [Scid](https://scidvspc.sourceforge.net/)-Projekt durchgeführt wurde. Zusätzlich verwendet der [PolyGlot](http://hgm.nubati.net/book_format.html)-Bearbeitungscode von ___jja___ Ideen und Code von [Scid](https://scidvspc.sourceforge.net/). Vielen Dank an ___Marcus Bufett___, den Autor von [chess-tactics-cli](https://github.com/marcusbuffett/chess-tactics-cli): Der Schachbrett-Anzeigecode in den [PolyGlot](http://hgm.nubati.net/book_format.html)- und [ABK](https://www.chessprogramming.org/ABK)-Bearbeitungsbildschirmen ist aus [chess-tactics-cli](https://github.com/marcusbuffett/chess-tactics-cli) entlehnt. # ChangeLog Wir haben leider nicht die Zeit oder Ressourcen, um das ChangeLog ins Deutsche zu übersetzen. Bitte beziehen Sie sich auf die originale [README](https://git.sr.ht/~alip/jja/tree/main/item/README.md#changelog)-Datei.