Komentoriviliittymä (CLI)
Johdanto
blunderDB sisältää täydellisen komentoriviliittymän (CLI) samassa suoritettavassa tiedostossa kuin graafinen käyttöliittymä. CLI on erityisen hyödyllinen seuraaviin tarkoituksiin:
ottelujen massatuonti: koko hakemistollinen ottelutiedostoja (XG, SGF, MAT, BGF…) tuodaan yhdellä komennolla,
automaatio: blunderDB:n integrointi shell-skripteihin säännöllisiä varmuuskopioita, ajastettuja vientejä tai käsittelyputkia varten,
palvelinkäyttö: tietokantojen hallinta koneilla, joilla ei ole graafista ympäristöä,
nopea tarkastus: tietokannan sisällön tai eheyden tarkistaminen käynnistämättä graafista käyttöliittymää.
CLI käyttää täsmälleen samaa tietokantamuotoa kuin graafinen käyttöliittymä: molemmat kirjoittavat samaa tiedostoa, eikä mitään tarvitse synkronoida.
Muista
Jos sovellus on auki samalla kun skripti kirjoittaa. Tiedosto on WAL-tilassa: luku ei koskaan estä kirjoitusta, ja molemmat ohjelmat työskentelevät samassa tietokannassa toisiaan häiritsemättä. Kaksi kirjoitusta sen sijaan seuraavat toisiaan — jälkimmäinen odottaa kirjoituslukkoa (kymmenen sekuntia lausetta kohti ja muutama uudelleenyritys päälle) eikä epäonnistu ennen kuin odotusaika on kulunut umpeen, jolloin viesti mainitsee SQLiten:
Error: failed to import match: sqlite: save match: database is locked (5) (SQLITE_BUSY)
Graafinen käyttöliittymä ei tarkkaile tiedostoa: se näyttää edelleen sitä, minkä oli ladannut, kunnes CTRL-R lataa asemat uudelleen. Mitään ei menetetä, mutta näyttö on tietokantaa jäljessä.
Yleinen syntaksi
Tila tunnistetaan automaattisesti: jos ensimmäinen argumentti on CLI-komento, blunderDB käynnistyy headless-tilassa, muuten se käynnistää graafisen käyttöliittymän.
# GUI
./blunderdb
# CLI
./blunderdb <command> [options]
Tämän sivun esimerkeissä kirjoitetaan ./blunderdb: binääri sellaisena kuin se ladataan, kutsuttuna siitä kansiosta, jossa se sijaitsee. Paketista asennettuna tai PATH-kansiosta linkitettynä (katso Lataaminen ja asentaminen) se on yksinkertaisesti blunderdb.
Totuusarvoiset valitsimet, joiden kohdalla lukee ”oletus: kyllä”, poistetaan käytöstä muodolla --option=false — --recursive=false, --analysis=false. Välilyönnillä erotettua muotoa ei ole: --recursive false jättää valitsimen oletusarvoonsa ja käsittelee sanaa false yhtenä argumenttina liikaa.
Käytettävissä olevat komennot
Komento |
Kuvaus |
|---|---|
create |
Luo uusi tietokanta. |
import |
Tuo tietoja (ottelu, asema, erä). |
export |
Vie tietoja. |
identity |
Näyttää tai siirtää liikkeeseenlaskijan identiteetin (vesileimojen allekirjoitusavain). |
open |
Muuntaa salasanalla suojatun tiedoston (.dbx) tavalliseksi tietokannaksi. |
search |
Hae asemia suodattimilla. |
list |
Näytä tietokannan sisältö. |
match |
Näytä ottelun asemat ja analyysit. |
collection |
Hallitsee kokoelmia (luettelo, sisältö, luonti, uudelleennimeäminen, poisto, vienti). |
anki |
Välitoistopakat (luettelo, tilastot, ennuste, synkronointi). |
rollout |
Pelaa aseman loppuun asti erottaakseen sen siirrot tai tuplauspäätöksen toisistaan (XGID tai OGID). |
epc |
Laskee ulosajoaseman (XGID tai OGID) Effective Pip Countin ja kuutiotuomion. |
bearoff |
Luo, listaa, tarkistaa ja poistaa bearoff-tietokantoja. |
analyze |
Kirjoittaa gammonNet-analyysin jokaiselle asemalle, jolla ei ole yhtään analyysiä. |
info |
Näytä tietokannan metatiedot. |
edit |
Muokkaa tietokannan metatietoja ja kynnysarvoja. |
verify |
Tarkista tietokannan eheys. |
vacuum |
Tiivistää tietokantatiedoston ja ottaa vapautuneen tilan takaisin. |
repair |
Laskee uudelleen sen, minkä tietokanta johtaa siitä mitä se tallentaa. |
delete |
Poista tietoja. |
healthcheck |
Kysyy käynnissä olevalta |
mcp |
Tarjoaa tietokannan työkalut tekoälyavustajalle (Model Context Protocol). |
completion |
Tulostaa shell-täydennysskriptin (bash, zsh, fish). |
help |
Näytä ohje. |
version |
Näytä versio. |
serve, migrate, call |
Palvelintila ja siirto PostgreSQL:ään: ks. Headless-tila (palvelin). |
Jokainen komento hyväksyy --help-valitsimen yksityiskohtaisen ohjeen näyttämiseksi.
create — Luo tietokanta
Luo uusi tietokantatiedosto valinnaisilla metatiedoilla.
./blunderdb create --db <path> [--user <name>] [--description <text>] [--force]
Valitsimet:
--db— Luotavan tietokantatiedoston polku (pakollinen).--user— Tietokannan omistajan nimi.--description— Tietokannan kuvaus.--force— Korvaa tiedosto, jos se on jo olemassa.--format— Tulostusmuoto:text(oletus) taijson(polku, versio, käyttäjä, kuvaus, luontipäivä).
.db-pääte lisätään automaattisesti, jos se puuttuu. Ylähakemistot luodaan tarvittaessa.
Esimerkki:
./blunderdb create --db mes_matchs.db --user "Jean" --description "Matchs de tournoi 2025"
import — Tuo tietoja
Tuo ottelu- tai asematiedostoja tietokantaan.
./blunderdb import --db <path> --type <type> [options]
Valitsimet:
--db— Tietokannan polku (pakollinen).--type— Tuontityyppi:match,positiontaibatch(pakollinen).--file— Tuotava tiedosto (tyypeillematchjaposition).--dir— Tuotava hakemisto (tyypillebatch).--recursive— Selaa alihakemistot rekursiivisesti (oletus: kyllä).--watch— Yhdessä--type batch-valitsimen kanssa: ei pysähdy, vaan tuo jokaisen ottelutiedoston heti kun se ilmestyy hakemistoon--dir(Ctrl-C lopettaa).--watch-every— Kuinka usein--watchkatsoo (oletus: 10s, alaraja 2s).--format— Tulostusmuoto:text(oletus) taijson.--fail-on-error— Epäonnistuu, jos edes yhtä kohdetta (positiontaibatch) ei voitu tuoda, vaikka muut onnistuisivat.
Paluukoodi noudattaa neljää sääntöä:
mitään ei tunnistettu (jokainen tiedosto epäonnistui): virhe, oli
--fail-on-errorannettu tai ei;pelkkiä kaksoiskappaleita (jokainen tiedosto oli jo tietokannassa): onnistuminen. Hakemisto, joka ajetaan uudelleen ilman uutta tiedostoa — skriptin tavallinen yö — päättyy koodiin 0, ja
duplicateson ainoa nollasta poikkeava;osittainen epäonnistuminen (osa kohteista tuotiin, osa hylättiin): virhe vain, jos
--fail-on-erroron annettu;vähintään yksi uusi kohde tuotiin ilman
--fail-on-error-valitsinta: onnistuminen, ja hylätyt tiedostot luetellaan taulukossa.
Kansion valvonta
--watch muuttaa hakemistotuonnin valvonnaksi: komento ei palaa, vaan tuo jokaisen ottelutiedoston, joka kansioon ilmestyy. Se on sovelluksen valvotun kansion käyttöliittymätön muoto.
# Importer ce que le dossier contient déjà, puis surveiller ce qui arrive
./blunderdb import --db base.db --type batch --dir ~/XG/Matches
./blunderdb import --db base.db --type batch --dir ~/XG/Matches --watch
Vain ilmestyvät tiedostot tuodaan: se mitä kansiossa on käynnistyshetkellä kirjataan tunnetuksi ja jätetään rauhaan — valvonnan osoittaminen neljän vuoden otteluihin ei saa tuoda niitä kaikkia. Yllä olevat kaksi komentoa siis täydentävät toisiaan juuri niin kuin toivoisi.
Tiedosto tuodaan vasta kun sen koko on vakiintunut, eli se on nähty kahdesti muuttumattomana: ottelu, jota toinen ohjelma kirjoittaa, kasvaa katsomasta toiseen, ja puoliksi kirjoitettuna tuotuna siitä tulisi syntaksivirhe, jolle kukaan ei voi mitään. Kansiota ei käydä läpi rekursiivisesti. Lukukelvottomaksi muuttunut verkkojako ei pysäytä valvontaa, eikä sen sisältö käy uudesta sen palatessa.
Ctrl-C pysäyttää tiedostojen välissä, ei koskaan kesken yhden: tuotava tiedosto viedään loppuun ja sen raportti tulostetaan ennen kuin komento palaa.
Ottelun tuonti
Tuetut muodot: eXtreme Gammon (.xg, .xgp), GNUbg (.sgf), Jellyfish (.mat, .txt), BGBlitz (.bgf) ja HedgeHog (.ogxm).
./blunderdb import --db base.db --type match --file match.xg
# Successfully imported match (ID: 1)
#
# Match Details:
# Players: Kévin Unger vs Maxence Job
# Event: HSBT Paris 2023
# Match Length: 7
# Games: 7
--format json antaa samat kentät yhtenä dokumenttina:
{
"type": "match",
"match_id": 1,
"player1": "Kévin Unger",
"player2": "Maxence Job",
"event": "HSBT Paris 2023",
"location": "Paris, Fédération Française de Bridge",
"match_length": 7,
"games": 7
}
Asemien tuonti
Tuo asemia tekstitiedostosta, yksi JSON-asema riviä kohti. Tämä on täsmälleen se, mitä export --type positions kirjoittaa: komennot vastaavat toisiaan, ja vienti tuodaan takaisin sellaisenaan ilman mitään muokkausta.
./blunderdb import --db base.db --type position --file positions.txt
# Successfully imported 4 positions
Yksi rivi sellaisena kuin export sen tuottaa — lauta vie siitä valtaosan, kaksikymmentäkuusi pistettä ja niiden perässä ulos kannetut nappulat:
{"id":1,"board":{"points":[{"checkers":0,"color":0},{"checkers":1,"color":1},…],"bearoff":[0,0]},"cube":{"owner":-1,"value":0},"dice":[0,0],"score":[7,7],"player_on_roll":0,"decision_type":1,"has_jacoby":0,"has_beaver":0,"individually_imported":true,"flagged":false}
Analyysit ja kommentit eivät kulje tässä muodossa: se kantaa aseman, ei mitään muuta. Kokonaisen kirjaston siirtämiseen tarvitaan export --type database.
Erätuonti
Tuo kaikki hakemiston ottelutiedostot yhdellä toimenpiteellä. Tämä on tehokkain tapa tuoda suuri määrä otteluita.
./blunderdb import --db base.db --type batch --dir ./matchs/
./blunderdb import --db base.db --type batch --dir ./matchs/ --recursive=false
./blunderdb import --db base.db --type batch --dir ./matchs/ --format json --fail-on-error
Yhteenvetotaulukko näyttää jokaisen tiedoston kohdalla, onnistuiko tuonti (✓), epäonnistuiko (✗) vai oliko kyseessä kaksoiskappale (⊘). Kaksoiskappaletta ei lasketa epäonnistumiseksi, ja erä, jossa on pelkkiä kaksoiskappaleita, on onnistuminen (ks. säännöt yllä).
Batch importing from: ./matchs/ (recursive: true)
Found 3 match file(s) to import
[1/3] Importing: 02_NDT_FR.txt... ERROR: failed to parse file: ingest: parse gnubg file: invalid MAT file: no match header found
[2/3] Importing: test.mat... DUPLICATE
[3/3] Importing: test.xg... OK (ID: 1, 341 positions)
====================================================================
IMPORT SUMMARY
====================================================================
Status File ID Player 1 Player 2 Games Positions Error
------ ---- -- -------- -------- ----- --------- -----
✗ 02_NDT_FR.txt 0 0 failed to parse file: ingest: ...
⊘ test.mat 0 0
✓ test.xg 1 Kévin Unger Maxence Job 7 341
--------------------------------------------------------------------
Total: 3 files | Success: 1 | Duplicates: 1 | Failed: 1 | Positions imported: 341
--format json antaa samat tiedot skriptille sopivassa muodossa: yksi olio tiedostoa kohti kentässä files, sitten kokonaissummat. Rauhallisen yön jäljiltä duplicates on ainoa nollasta poikkeava, failed on nolla ja paluukoodi on 0; vain erä, jossa mitään ei tunnistettu, päättyy virheeseen.
{
"files": [
{"file_path": "02_NDT_FR.txt", "success": false, "error": "failed to parse file: …"},
{"file_path": "test.xg", "success": true, "positions": 341}
],
"total": 3,
"success": 1,
"duplicates": 1,
"failed": 1,
"positions_imported": 341
}
export — Vie tietoja
Vie tietokannan sisältö tiedostoihin.
./blunderdb export --db <path> --type <type> --file <output> [options]
Valitsimet:
--db— Lähdetietokanta (pakollinen).--type— Vientityyppi:database,positions,matchestaimat(yhden tai useamman ottelun vienti Jellyfish.mat-transkriptioon) (pakollinen).--file— Tulostiedosto (pakollinen, paitsi--type mat-vaihtoehdolle yhdessä--dirkanssa).--dir— Erävientinä tehtävän.mat-viennin tulostushakemisto (useita otteluita, yksi tiedosto ottelua kohden; ilman--match-idsviedään kaikki ottelut).--analysis— Sisällytä analyysit (oletus: kyllä).--comments— Sisällytä kommentit (oletus: kyllä).--filters— Sisällytä suodatinkirjasto (oletus: kyllä).--played-moves— Sisällytä pelatut siirrot (oletus: kyllä).--matches— Sisällytä ottelut (oletus: kyllä).--collections— Sisällytä kokoelmat (oletus: ei).--collection-ids— Vietävien kokoelmien tunnukset (pilkulla eroteltuna).--match-ids— Vietävien otteluiden tunnukset (pilkulla eroteltuna, tyhjä = kaikki).--tournament-ids— Vietävien turnausten tunnukset (pilkulla eroteltuna).--password— Kääri tuloksen salattuun säiliöön (.dbx).--watermark— Kirjoittaa allekirjoitetun alkuperäilmoituksen vietyyn tiedostoon (katso Tietokannan jakaminen: alkuperä ja salasana).--watermark-note— Vesileimaan liitettävä vapaa teksti (käyttöehdot, yhteystieto); käytetään yhdessä--watermark-valitsimen kanssa.--format— Tulostusmuoto:text(oletus) taijson(vientiä kokoava asiakirja: polku, koko tavuina, määrät).
Esimerkkejä:
./blunderdb export --db base.db --type database --file sauvegarde.db
./blunderdb export --db base.db --type positions --file positions.txt
./blunderdb export --db base.db --type matches --file selection.db --match-ids 1,3,5
# .mat : un match, puis plusieurs (ou tous) dans un répertoire
./blunderdb export --db base.db --type mat --match-ids 5 --file match5.mat
./blunderdb export --db base.db --type mat --match-ids 5,9,12 --dir sorties/
./blunderdb export --db base.db --type mat --dir sorties/
# .dbx : filigrané et protégé par mot de passe
./blunderdb export --db cours.db --type database --file cours-diffusion.dbx \
--watermark "Cours de Jean Dupont — 12 mars 2026" \
--watermark-note "Merci de ne pas rediffuser." \
--password secret
Vesileima allekirjoitetaan paikallisella liikkeeseenlaskijan identiteetillä (katso identity-komento alla): sitä ei voi väärentää, mutta sen voi poistaa — tiedosto pysyy tavallisena SQLite-tietokantana. Se ei suojaa mitään, se vain kertoo, mistä tiedosto on peräisin. Salasana suojaa tiedoston kuljetusta (kadonnut kopio, vahingossa lähetetty liite), ei itse tietokantaa: kuka tahansa salasanan saanut voi avata sen. blunderDB ei koskaan kirjaa mitään vastaanottajan puolelle (ei rekisteriä, ei lokia) — katso ADR-0007.
identity — Liikkeeseenlaskijan identiteetti
Näyttää tai siirtää liikkeeseenlaskijan identiteettisi: Ed25519-avaimen, joka allekirjoittaa jokaisen vesileiman. Se syntyy itsestään ensimmäisen vesileiman yhteydessä; mitään ei tarvitse asettaa. Se kuuluu henkilölle, ei tietokannalle: kaikki merkitsemäsi kantaa yhtä ja samaa julkista sormenjälkeä.
./blunderdb identity
./blunderdb identity --name "Jean Dupont"
./blunderdb identity --export jean.bdbid --passphrase pw
./blunderdb identity --import jean.bdbid --passphrase pw
Valitsimet:
--name— Vaihtaa identiteetin näyttönimen.--export— Vie identiteetin.bdbid-tiedostoon.--import— Tuo identiteetin.bdbid-tiedostosta.--passphrase— Valinnainen tunnuslause, joka suojaa viedyn/tuodun tiedoston (paikallinen identiteetti jätetään tarkoituksella suojaamatta).--format— Tulostusmuoto:text(oletus) taijson(nimi, sormenjälki, tallennuspolku).
Viety tiedosto antaa kenelle tahansa sen haltijalle mahdollisuuden allekirjoittaa sinun nimissäsi — älä jaa sitä. Uudelleennimeäminen muuttaa vain nimilapun: jo merkityt tiedostot säilyttävät nimen, jolla ne sinetöitiin, ja ne todentuvat edelleen.
open — Suojatun tiedoston avaaminen
Muuntaa salasanalla suojatun tiedoston (.dbx) tavalliseksi tietokannaksi. Salasanaa kysytään vain kerran; sen jälkeen kyseessä on tavallinen tiedosto.
./blunderdb open --db cours.dbx --password secret
./blunderdb open --db cours.dbx --password secret --file ./mon-cours.db
Valitsimet:
--db— Avattava.dbx-tiedosto (pakollinen).--password— Säiliön salasana (pakollinen).--file— Tavallisen tietokannan tulostuspolku (oletus: sama nimi, pääte.db).
Mitä salasana suojaa: tiedoston kuljetusta — latauskansioon unohtunutta kopiota, vahingossa lähetettyä liitettä. Ei tietokantaa: kuka tahansa salasanan saanut voi avata sen. Säiliön otsake on selkokielinen, joten blunderdb info lukee suojatun tiedoston alkuperän ilman salasanaa.
search — Hae asemia
Hae asemia tietokannasta yhdisteltävien kriteerien avulla.
./blunderdb search --db <path> [options]
Pääasialliset valitsimet:
--db— Tietokanta (pakollinen).--format— Tulostusmuoto:table,jsontaixgid(oletus:table).--limit— Tulosten enimmäismäärä (0 = rajoittamaton).--offset— Ohita n ensimmäistä tulosta ennen kuin laskeminen alkaa; yhdessä--limit-valitsimen kanssa tämä on sivutus.--export— Vie tulokset uuteen tietokantaan.--query-help— Näyttää luettelon tunnuksista, jotka--queryymmärtää, eikä tee muuta. Yhtään tietokantaa ei avata:--dbon tarpeeton.
Käytettävissä olevat suodattimet:
--decision— Päätöstyyppi:checkertaicube.--dice— Nopanheitto.5,3hakee asemat, joissa molemmat nopat täsmäävät (järjestyksellä ei ole väliä).5hakee asemat, joissa 5 esiintyy jommassakummassa nopassa (toisen nopan arvo jätetään huomiotta). Sisältää--decision checker, jos--decision-arvoa ei ole annettu.--pip-min/--pip-max— Pip-eron väli.--winrate-min/--winrate-max— Voittoprosentin väli (%).--cube— Tuplauskuution arvo.--score1/--score2— Pelaajien pisteet.--match-length— Ottelun pituus.--error-min— Kynnys sille, mitä virhe asemassa maksaa: parhaan ja toiseksi parhaan siirron välinen ero tai suurin kolmesta kuutiovirheestä. Yksikkönä equity-pisteet —--error-min 0.1poimii asemat, joissa erehtyminen maksaa vähintään kymmenesosan pisteestä. Se ei kerro mitään siitä, mitä asemassa on pelattu.--move-error-min/--move-error-max— Kynnys pelaajan 1 tosiasiallisesti pelaaman siirron virheelle. Yksikkönä equityn tuhannesosat (millipisteet):--move-error-min 50on kahdeskymmenesosa pistettä. Tämä on hakukieliopin tunnusEsellaisenaan kirjoitettuna.--has-analysis— Vain asemat, joissa on analyysi.--off1-min/--off2-min— Vähimmäismäärä ulospelattuja nappuloita (pelaaja 1/2).--match-ids— Suodata otteluiden tunnusten mukaan (pilkulla eroteltuna).--tournament-ids— Suodata turnausten tunnusten mukaan (pilkulla eroteltuna).--position-ids— Suodata asemien tunnusten mukaan: väli2,7(asemat 2–7) tai puolipisteillä eroteltu eksplisiittinen luettelo5;10;15.--individual— Vain erikseen tuodut asemat, eli ne jotka lisäsit itse, eikä niitä jotka ottelun tuonti toi mukanaan.--flagged— Vain asemat, jotka on merkitty (flag) tutkittaviksi alkuperäisessä ohjelmassa (eXtreme Gammonin merkinnät). Ei takautuva: jo tuodut ottelut on tuotava uudelleen, jotta merkinnät saadaan.--has-comment— Vain asemat, joissa on kommentti. Alkuperää ei eroteta: käsin kirjoitettu muistiinpano ja ottelun tuonnin mukana tullut kommentti lasketaan molemmat. Ottelun tai turnauksen kommentteja ei katsota.--no-comment— Vain asemat ilman kommenttia. Toisensa poissulkeva--has-comment-valitsimen kanssa.
Varoitus
--error-min ja --move-error-min eivät mittaa samaa asiaa eivätkä ota samaa yksikköä: kerroin on tuhat. Ensimmäinen annetaan equity-pisteinä (0.1), kaksi muuta tuhannesosina (100) — yksi piste on 1000 tuhannesosaa. --move-error-min vastaa kysymykseen ”missä tein virheen”; --error-min vastaa kysymykseen ”mitkä asemat olivat hankalia”.
Mitä search tulostaa:
--format table (oletus) antaa yhden rivin asemaa kohti: tunniste, tulos, kuution arvo, päätöksen tyyppi, heitto, paras päätös ja sen equity. Kaksi viimeistä saraketta jäävät tyhjiksi asemalla, jolla ei ole analyysia.
Found 5 position(s)
ID Score Cube Type Dice Best Move Equity
-- ----- ---- ---- ---- --------- ------
2 7-7 0 cube No Double -0.005
4 7-7 0 cube No Double -0.027
6 7-7 0 cube No Double -0.161
8 7-7 0 cube No Double 0.256
10 7-7 0 cube No Double -0.234
--format json antaa taulukon samoista asemista. Kentät id, score, cube, decision_type (checker tai cube) ja dice ovat aina mukana; best_move, equity ja xgid esiintyvät vain, jos asemalla on analyysi, joka ne täyttää. Rivi Found n position(s) tulostetaan edelleen ennen taulukkoa: skriptin, joka odottaa pelkkää JSONia, on ohitettava ensimmäinen rivi tai käytettävä valitsinta --export.
[
{
"id": 5266,
"score": [
5,
4
],
"cube": 1,
"decision_type": "checker",
"dice": [
4,
3
],
"best_move": "10/3",
"equity": 0.565
}
]
--format xgid tulostaa yhden XGID:n riviä kohti eikä mitään muuta. Se tulostaa vain ne asemat, joiden tallennettu analyysi kantaa XGID:n: sovellukseen tekstiviennistä liitetyn aseman tai BGF-tiedoston, joka tuo XGID:n mukanaan. XG-, GNUbg- tai Jellyfish-ottelun tuonnin mukanaan tuomilla asemilla ei sellaista ole, jolloin tuloste jää tyhjäksi. Alikomento collection show sen sijaan muodostaa XGID:n uudelleen laudalta.
Kyselykieli:
Yllä olevat valitsimet kattavat vain osan suodattimista. --query antaa pääsyn sovelluksen kyselykieleen — komentorivin kieleen — ja siten kaikkiin suodattimiin, joita ei piirretä laudalle: siirtokuvio, kommenttiteksti, pelaaja, päivämäärä, equity, poissuljetut heitot, vyöhykkeet ja blotit.
Kielioppi on kirjoitettu vain yhteen paikkaan, Hakusuodattimet. Sen taulukko antaa jokaisen tunnuksen, sen muodon ja sitä vastaavan search-valitsimen silloin kun sellainen on olemassa. Tämä sivu ei toista sitä.
./blunderdb search --db base.db --query 's p>30 E>50'
./blunderdb search --db base.db --query 's m"13/11" t"blunder" pl"Alice" T>2026/01/01'
Aseman naapurien järjestäminen kulkee saman kieliopin kautta: --query 's like42', yksin tai muiden tunnusten seuraamana rajaamassa järjestettyä joukkoa.
--query-help muistuttaa luettelosta avaamatta yhtään tietokantaa:
$ ./blunderdb search --query-help
blunderdb search --query — the interface's query language
A query is the same text the application's command bar takes:
s cube p>30 E>50 cube decisions, 30+ pips behind, 50+ millipoints of error
s m"13/11" T>2026/01/01 played 13/11, imported this year
Flags (no value):
cube score match the cube / the score of the position on the board
d match the decision type (checker or cube)
…
Ranges — each takes x>n, x<n or xa,b (lower-case: you; upper-case: the opponent):
p P pip count difference / absolute pip count
…
E error of the played move, in millipoints
T creation date, T>2026/01/01
Values:
t"tag" comment text (";" separates alternatives)
…
--query korvaa suodatinvalitsimet sen sijaan että täydentäisi niitä: niiden yhdistäminen hylätään, ja virheellinen valitsin nimetään. Valitsimet, jotka kertovat mistä haetaan ja miten näytetään — --db, --format, --limit, --offset, --export — pysyvät voimassa.
Tunnus, jota mikään ei tunnista, kaataa komennon sen sijaan että kaventaisi hakua hiljaisesti. Kaksi rajoitusta seuraa siitä, ettei komentorivillä ole lautaa: nappulakuviota ei voi kirjoittaa, ja viisi laudalta lukevaa tunnusta — cube, score, d, D/D1 ja x — vertautuvat täällä tyhjään lautaan. Haku, joka tarvitsee jotakin näistä, kirjoitetaan kokonaan valitsimilla, koska --query ei yhdisty niihin — esimerkiksi kuutiopäätökset, joissa pip-ero on vähintään 30 ja virhe vähintään 50 millipistettä:
./blunderdb search --db base.db --decision cube --pip-min 30 --move-error-min 50
Esimerkkejä:
./blunderdb search --db base.db --decision cube
./blunderdb search --db base.db --individual
./blunderdb search --db base.db --error-min 0.1
./blunderdb search --db base.db --tournament-ids 1 --export cubes.db
# 6-5 dans les deux ordres, puis un 6 sur l'un des deux dés
./blunderdb search --db base.db --dice 6,5
./blunderdb search --db base.db --dice 6
# Pagination
./blunderdb search --db base.db --format json --limit 10 --offset 20
list — Luettele sisältö
Näytä tietokannan sisältö.
./blunderdb list --db <path> --type <type> [--limit <n>] [--offset <n>]
Tyypit:
matches— Luettelo tuoduista otteluista.tournaments— Luettelo turnauksista.positions— Luettelo asemista (oletuksena 10;--offset <n>ohittaa ensimmäiset n). Vain näytettävä ikkuna luetaan, oli tietokanta minkä kokoinen tahansa. Valinnalla--format csvsiitä tulee taulukkovienti: yksi rivi asemaa kohden, jossa on sen XGID, vaihe, tilanne, tuplauskuutio, pipit ja johdetut analyysisarakkeet.imports— Tallennetut tuonnit, uusimmasta vanhimpaan: tunniste, päivämäärä, muoto, lähde, tuodut / ohitetut / rikastetut ottelut, lukukelvottomat tiedostot ja uudet asemat. Valitsimella--batch <id>näytetään yhden tuonnin täysi raportti: merkityt asemat, asemat ilman analyysiä, kyseisen erän PR ja sen viisi huonointa päätöstä (katso Tuontiraportti).stats— Suorituskykytilastojen raportti: PR / Snowie ER / MWC (kokonais, nappulat, kuutio), liukuva PR viimeisten N päätöksen osalta, pahimmat virheet, jakauma kuutiotoiminnoittain ja virhesuuruuksien histogrammi.players— Vertailutaulukko, yksi rivi kutakin tietokannan pelaajaa kohden: ottelut, voitot/tappiot, lasketut päätökset, PR yhteensä / nappulat / kuutio, Snowie ER, virheet, karkeat virheet ja tuuri. Tämä on tilastopaneelin Pelaajat-välilehden komentorivivastine.moves— Kirjattujen siirtojen taulukkovienti, yksi riviä kohden, ottelu johon ne kuuluvat toistettuna joka rivillä: tunnisteet, päivämäärä, pelaajat, pituus, siirron numero ja tyyppi, asema, nopat, pelattu siirto, kuutiotoiminto, onni.--format csvvaaditaan.analyses— Tallennettujen analyysien taulukkovienti, yksi riviä kohden: moottori, syvyys, paras siirto ja sen ekviteetti, pelatun siirron virhe, paras kuutiotoiminto ja sen virhe, kuusi voittoprosenttia.--format csvvaaditaan.tags— Tietokannan tunnistesanasto: jokainen kommenttiin kirjoitettu#sanaja niiden asemien määrä, jotka sitä kantavat, käytetyimmästä alkaen. Tietokannassa, jossa ei ole yhtään tunnistetta, näytetään suositeltu sanasto tyhjän listan sijaan (katso Tunnisteet). Hyväksyy--format jsonja--format csv.
Taulukkoviennit
Kolme tyyppiä — positions, moves ja analyses — viedään CSV:ksi notebookia, taulukkolaskentaa tai skriptiä varten:
./blunderdb list --db base.db --type positions --format csv > positions.csv
./blunderdb list --db base.db --type moves --format csv > moves.csv
./blunderdb list --db base.db --type analyses --format csv > analyses.csv
--limit pätee vain jos annat sen. Sen oletusarvo (10) on olemassa, jottei päätteelle tulostettu list vierittäisi koko tietokantaa ohi; vienti sen sijaan menee tiedostoon, jota ohjelma lukee, ja sen katkaiseminen hiljaisesti kymmeneen riviin olisi ansa, jota kukaan ei huomaa ennen kuin luvut ovat väärin.
Sarakkeet ovat sopimus. Näitä nimiä vasten kirjoitetun notebookin tai skriptin täytyy toimia jatkossakin: sarakkeita lisätään loppuun, niitä ei koskaan nimetä uudelleen eikä järjestetä uudelleen. Kaikki ekviteetit ovat kokonaislukumillipisteinä, koska niin ne tallennetaan ja koska liukuluku CSV:ssä houkuttelee lokaalia muotoilemaan sen uudelleen.
Parquetia ei tarjota, ja se on mitattu eikä dogmaattinen valinta: sarakepohjainen kirjasto painaa useita megatavuja binäärissä, jonka kokoa seurataan, kun taas kaikki mihin tämä vienti on tarkoitettu lukee CSV:tä yhdellä rivillä (pd.read_csv, polars.read_csv, read.csv, taulukkolaskenta). Parquet ansaitsee paikkansa kymmenillä miljoonilla riveillä; kymmenen vuotta vanha backgammon-kirjasto sisältää satatuhatta. Jos jonain päivänä ero on mitattavissa oikealla tietokannalla, juuri se mittaus avaa asian uudelleen.
Näiden vientien mukana tulee esimerkkinotebook Jupyterille (notebooks/blunderdb-analyse.ipynb repositoriossa): PR ajan mittaan, virheiden suuruuksien jakauma, kymmenen pahinta päätöstä XGID:eineen. Se käyttää vain noita kolmea CSV-tiedostoa, ja se ajetaan joka yö jatkuvassa integraatiossa — notebook jota kukaan ei aja on notebook joka on lakannut toimimasta kenenkään huomaamatta.
Valitsimet (vain tyyppi stats):
--metric— Näytettävä mittari:prtaimwc(oletus:pr).--player— Rajaa ilmoitettuun pelaajaan.--tournament— Rajaa yhteen tai useampaan turnauksen tunnukseen (pilkulla eroteltuna).--from— Aloituspäivä (VVVV-KK-PP).--to— Lopetuspäivä (VVVV-KK-PP).--decision-type— Päätöstyyppi:all,checkertaicube(oletus:all).--top-blunders— Lueteltavien pahimpien virheiden määrä (oletus: 10).--format— Tulostusmuoto:texttaijson(oletus:text).
Valitsimet (vain tyyppi imports):
--batch— Erän tunniste: näyttää sen täyden raportin luettelon sijaan.--queue— Yhdessä--batch-valitsimen kanssa: erän opiskelujono sen raportin sijaan — asemat, jotka ansaitsevat toisen katseen, siinä järjestyksessä kuin ne käydään läpi (katso Opiskelujono). Ensin päätökset, jotka maksoivat jotain, sitten lähdeohjelmassa merkityt asemat, sitten tiukat kuutiopäätökset; asema esiintyy vain kerran.--format— Tulostusmuoto:texttaijson(oletus:text).
Raportin mitattu puolisko lasketaan uudelleen joka kutsulla: erä, jonka asemat on sittemmin analysoitu, palauttaa tämän päivän luvut, ei tuontipäivän lukuja.
Valitsimet (vain tyyppi players):
--from/--to— Päivämäärärajat (VVVV-KK-PP), esimerkiksi kilpailun päivät.--tournament— Rajaa yhteen tai useampaan turnaustunnukseen.--format— Tulostusmuoto:text,jsontaicsv(oletus:text).
--player ja --decision-type eivät koske tätä tyyppiä: taulukko kattaa kaikki pelaajat ja erittelee nappulat ja kuution jo omiin sarakkeisiinsa.
Muista
Viiva ”—” (CSV:ssä tyhjä kenttä) merkitsee arvoa, jota ei ole koskaan mitattu; sitä ei pidä sekoittaa nollaan. Näin on tuurin kohdalla kaikissa otteluissa, jotka tuotiin ennen skeemaversiota 2.15.0, sekä muodoissa, jotka eivät sitä kuljeta (BGF, Jellyfish .mat): tuo lähdetiedostot uudelleen saadaksesi sen. Sarake luck_rolls kertoo, kuinka monesta heitosta keskiarvo on laskettu.
Kukin tyyppi tulostaa yhden lohkon kohdetta kohden, ja ensin löydettyjen kokonaismäärän. Viimeinen rivi kertoo, mikä ikkuna näytetään: --limit rajaa sen (asemille oletus 10) ja --offset siirtää sitä:
Found 3859 position(s):
ID: 1
Score: 7-7
Player on roll: 0
Decision: Checker play
ID: 2
Score: 7-7
Player on roll: 0
Decision: Cube action
…
(Showing 1-10 of 3859 positions, use --offset and --limit to see more)
Esimerkkejä:
# Les imports enregistrés, puis le compte rendu de l'un d'eux
./blunderdb list --db base.db --type imports
./blunderdb list --db base.db --type imports --batch 3
./blunderdb list --db base.db --type stats
./blunderdb list --db base.db --type stats --metric mwc --player "Alice"
./blunderdb list --db base.db --type stats --decision-type checker --from 2026-01-01
./blunderdb list --db base.db --type stats --format json
# Un tableau par joueur, borné aux dates d'une compétition
./blunderdb list --db base.db --type players --from 2026-03-01 --to 2026-03-08
./blunderdb list --db base.db --type players --format csv
./blunderdb list --db base.db --type matches
./blunderdb list --db base.db --type positions --limit 20
match — Näytä ottelu
Näytä tuodun ottelun asemat ja analyysit.
./blunderdb match --db <path> --id <id> [--format <format>] [--output <file>]
Valitsimet:
--db— Tietokanta (pakollinen).--id— Näytettävän ottelun tunnus (pakollinen).--format— Tulostusmuoto:json,texttaisummary(oletus:json).--output— Tulostiedosto (oletus: vakiotuloste).
Esimerkkejä:
./blunderdb match --db base.db --id 1 --format summary
./blunderdb match --db base.db --id 1 --format text
./blunderdb match --db base.db --id 1 --output match1.json
collection — Kokoelmien hallinta
Hallitsee kokoelmia, näitä käyttöliittymän Kokoelmat-paneelissa käsin valittuja asemajoukkoja. Jokainen alikomento ottaa parametrin --db; list ja show hyväksyvät parametrin --format text (oletus), json tai csv, kuten list.
./blunderdb collection <subcommand> [options]
Alikomennot:
list— Kokoelmien luettelo: tunnus, nimi, asemien määrä, kuvaus.show --id <id>— Kokoelman asemat: tunnus, indeksi (käyttöliittymän tilarivillä näytetty 1-pohjainen numero), pistetilanne, päätöstyyppi ja XGID.create --name <nom> [--description <texte>]— Luo tyhjän kokoelman.filter --id <id> --query <kysely>— Tekee kokoelmasta elävän: sen sisällöksi tulee haun tulos, joka lasketaan uudelleen joka avauskerralla. Kysely kirjoitetaan sovelluksen omalla hakukieliopilla (katso Hakusuodattimet).--clearpalauttaa sen käsin tehdyksi listaksi ja säilyttää sen sisältämät asemat.rename --id <id> --name <nom> [--description <texte>]— Nimeää kokoelman uudelleen (kuvaus säilyy, jos sitä ei anneta).delete --id <id> [--confirm]— Poistaa kokoelman; sen asemat säilyvät tietokannassa.export --id <id[,id…]> --out <fichier.db> [--analysis=false] [--comments=false] [--watermark <texte>] [--watermark-note <texte>]— Vie yhden tai useamman kokoelman uuteen tietokantatiedostoon samalla kutsulla kuin käyttöliittymän vienti-ikkuna (katso vesileimasta komentoexport).
show-komennon näyttämä XGID on aseman analyysin yhteydessä tallennettu XGID, jos sellainen on olemassa (BGF- ja XGP-tuonnit); muutoin se generoidaan laudalta täsmälleen samoin kuin käyttöliittymän Kopioi asema -toiminto tekee — ottelun pituudeksi tulee tällöin suurempi kahdesta jäljellä olevasta pistemäärästä, sillä tallennettu asema ei säilytä todellista ottelun pituutta.
Esimerkkejä:
./blunderdb collection list --db base.db
# Found 2 collection(s):
#
# ID Name Positions Description
# -- ---- --------- -----------
# 1 Ouvertures blitz 0 À revoir
# 2 Videaux ratés 0
Tietokanta, jossa ei ole yhtään kokoelmaa, vastaa No collections found in database ja päättyy silti paluukoodiin 0.
./blunderdb collection show --db base.db --id 3 --format csv
./blunderdb collection create --db base.db --name "Ouvertures blitz"
./blunderdb collection rename --db base.db --id 3 --name "Ouvertures"
./blunderdb collection delete --db base.db --id 3 --confirm
# Exporter deux collections, marquées de leur origine
./blunderdb collection export --db base.db --id 3,4 --out ouvertures.db \
--watermark "Cours de Jean Dupont - 12 mars 2026"
anki — Välitoistopakat
Tarkastelee ja ylläpitää käyttöliittymän Anki-paneelin välitoistopakkoja (FSRS). Kortin kertaaminen vaatii laudan ja tapahtuu käyttöliittymässä; CLI listaa, mittaa ja synkronoi uudelleen.
./blunderdb anki <subcommand> [options]
Alikomennot:
decks [--format text|json|csv]— Pakkojen luettelo: lähde, korttien määrä, erääntyneet kortit, uudet kortit.stats --deck <id> [--format text|json]— Pakan kertaustilastot: yhteensä, uudet, opittavana, kerrattavat, nyt erääntyvät, sekä sen FSRS-parametrit.forecast [--deck <id>] [--days <n>] [--format text|json|csv]— Erääntyvät kortit kalenteripäivittäin (UTC) seuraaviennpäivän aikana (oletus 30, enintään 365); päivä 0 sisältää kaikki myöhässä olevat kortit;--deck 0(oletus) kattaa kaikki pakat.sync --deck <id>— Lisää kortin jokaiselle pakan lähteen asemalle, jolla ei vielä ole korttia; olemassa olevat kortit säilyttävät ajoituksensa.retention --deck <id> [--format text|json]— pakan mitattu muistiinjäänti verrattuna omistajan valitsemaan tavoitteeseen.card --id <id> --action suspend|unsuspend|bury|remove [--format text|json]— kohdistuu yhteen korttiin. Hyllytys siirtää sen syrjään historiaa menettämättä (se ei enää tule vastaan istunnossa); hautaus piilottaa sen seuraavaan päivään sanomatta mitään sen arvosta; poisto poistaa sen pakasta — asema itse jää kirjastoon, sillä pakka on vain sen päälle asetettu opiskelulista.log [--deck <id>] [--limit <n>] [--format text|json]— kertausloki, tuorein ensin (--deck 0, oletus, kattaa kaikki pakat;--limiton oletuksena 20). Loki on se, mitä ajoittajalle todella kerrottiin, vastakohtana sille, mitä se tänään suunnittelee: ainoa paikka, jossa vahingossa annettu arvosana näkyy.
Kokoelmaan perustuva pakka lukee kokoelmansa uudelleen. Hakuun perustuva pakka säilyttää haun sellaisena kuin käyttöliittymä sen tallensi (komento, lauta ja tuolloin löydettyjen asemien tunnukset): hakusyntaksi elää käyttöliittymässä, joten CLI synkronoi uudelleen tallennetuista tunnuksista ja ilmoittaa siitä virhetulosteeseen — avaa pakka käyttöliittymässä toistaaksesi itse haun.
Esimerkkejä:
./blunderdb anki decks --db base.db
./blunderdb anki stats --db base.db --deck 2 --format json
./blunderdb anki forecast --db base.db --deck 2 --days 14
./blunderdb anki sync --db base.db --deck 2
./blunderdb anki card --db base.db --id 12 --action suspend
./blunderdb anki log --db base.db --deck 2 --limit 50
# Day Due
# --- ---
# 2026-09-02 12
# 2026-09-03 4
# ...
#
# 37 card(s) due over 14 day(s)
stats — Toistuvat virheet
Ryhmittelee suodattimen virheet pelisuunnitelman ja teeman mukaan, kallein ensin: Stats-paneelin Errors-välilehden Toistuvat virheet -taulukko (ks. Stats-paneeli). Yleiset tilastot pysyvät komennon list --type stats alla.
./blunderdb stats recurring --db <fichier> [options]
Valitsimet:
--player <nom>— Vain tämän pelaajan päätökset.--tournament <ids>,--from <AAAA-MM-JJ>,--to <AAAA-MM-JJ>,--decision-type all|checker|cube— Sama suodatin kuin komennossalist --type stats.--limit <n>— Tekstinä näytettävien ryhmien määrä (oletus 20,0kaikille).--format text|json— JSON sisältää jokaisen ryhmän sekä täydellisen asemaluettelon.--quiz— Arpoo asemia kolmen kalleimman ryhmän asemista (--quiz-size <n>, oletus 20) ja tulostaa ne: nämä ovat tunnisteet, jotka tietovisa jaquiz_gradearvioivat. JSON:ssa kenttäQuiz.--deck <nimi>— Luo tämännimisen Anki-pakan, joka täytetään kolmen kalleimman ryhmän kaikilla asemilla.--group <sija>—--quiz- tai--deck-valinnan kanssa: tämän sijan ryhmä (1 on kallein) kolmen ensimmäisen sijaan.
Nappulasiirron teema on gammon, blots, point tai passive; kuutioteema on offer_missed, offer_premature, answer_wrong_pass tai answer_wrong_take. Virheet, joita mikään sääntö ei nimeä, jäävät pois luokituksesta: ne luetellaan erikseen, yksi rivi pelisuunnitelmaa kohti (Unthemed-kenttä JSONissa), koska selitys ottaa kantaa vasta 60 mp:stä alkaen, Virhe-kynnyksen yläpuolella. COST (PR) -sarake on osuus suodattimen PR:stä, jonka ryhmä edustaa.
Esimerkkejä:
./blunderdb stats recurring --db base.db --player "Alice"
./blunderdb stats recurring --db base.db --decision-type checker --format json
./blunderdb stats recurring --db base.db --quiz --format json
./blunderdb stats recurring --db base.db --group 1 --deck "Mon pire groupe"
stats training — Päätösvisan PR, otteluiden PR ja Ankin pysyvyys, koottuna kalenteri-ikkunoittain kuten Stats-paneelin Harjoittelu-välilehti (katso Stats-paneeli).
./blunderdb stats training --db <fichier> [options]
Valitsimet:
--window week|month— Kalenteri-ikkuna (oletusweek).--player <nimi>,--tournament <ids>,--from <VVVV-KK-PP>,--to <VVVV-KK-PP>,--decision-type all|checker|cube— Otteluiden suodatin; visan ja Ankin lokit eivät sisällä pelaajaa.--format text|json— JSON sisältää myös visa-istuntojen luettelon.
Jokainen sarja säilyttää otoskokonsa: ikkuna ilman päätöksiä on tekstissä viiva ja JSONissa nollalukumäärä, ei koskaan nolla-arvo.
Esimerkkejä:
./blunderdb stats training --db base.db --player "Alice"
./blunderdb stats training --db base.db --window month --format json
cubematrix — Tuplauskuution matriisi
Antaa aseman kuutiotuomion jokaisessa ottelun pistetilanteessa: kullekin away × away -ruudulle sen, tuplataanko asema ja otetaanko tuplaus vastaan. Puhdasta laskentaa: mitään tietokantaa ei avata, asema tulee XGID- tai OGID-muodossa (OpenGammon).
./blunderdb cubematrix [options] '<XGID|OGID>'
Valitsimet:
--format— Tulostusmuoto:texttaijson(oletus:text).--match-length— Ottelun pituus, jonka ruudukko kattaa, väliltä 1–25 (oletus: 7).--ply— Kunkin ruudun hakusyvyys,0tai2(oletus: 2).--prune-k— Karsintaverkon säilyttämien ehdokassiirtojen määrä (oletus: 12).--jobs— Rinnakkain ajettavat haut (oletus: yksi ydintä kohden). Ruudukko on sama arvosta riippumatta; vain aika muuttuu.
Aseman oma pistetilanne ohitetaan — ruudukko korvaa sen — mutta sen kuutio säilyy: kysymys on, missä pistetilanteessa kääntäisin tämän kuution. Ruudukko on kauttaaltaan Crawfordin jälkeinen.
Jokainen ruutu on oma hakunsa, koska moottori ottaa pistetilanteen huomioon: yksi ainoa haku luettuna eri otteluekviteettien läpi olisi väärässä juuri siellä, missä pistetilanne merkitsee.
Esimerkkejä:
# Grille d'un match en 5 points
./blunderdb cubematrix --match-length 5 'XGID=-b----E-C---eE---c-e----B-:0:0:1:00:0:0:0:7:10'
# Les équités de chaque case, pour un script
./blunderdb cubematrix --format json '<XGID>'
Tuloste text: ruudukko, jonka rivit ovat vuorossa olevan pelaajan vielä tarvitsemat pisteet ja sarakkeet vastustajan, sitten lyhenteiden ND / DT / DP / TG selitteet ja kunkin hylätyn ruudun syy.
rollout — Aseman rollout
Pelaa aseman suuren määrän kertoja gammonNetillä ratkaistakseen sen, mitä haku ei ratkaise: kaksi siirtoa, joiden ero on muutama tuhannesosa, tai tuplauspäätös, jossa malli epäröi. Nopilla pelataan sen siirrot (parhaat rolloutin syvyydellä, vähintään 2 ply, tai --move-valitsimella nimetyt); ilman noppia sen tuplauspäätös (Ei tuplausta ja Tuplaus/Hyväksy; Tuplaus/Hylkää on täsmälleen +1). Asema tulee XGID:stä tai OGID:stä tai tietokannasta (--db ja --id); ilman --store-valitsinta mitään ei tallenneta.
./blunderdb rollout [options] '<XGID|OGID>'
./blunderdb rollout --db <path> --id <position> [--store] [options]
Valitsimet:
--preset— Lähtöasetus:fast(oletus: 216 peliä katkaistuna 7 puolisiirtoon, pysäytys JSD 3:ssa 108:n jälkeen) taistandard(1296 peliä katkaistuna 11:een, pysäytys JSD 3:ssa 324:n jälkeen). Molemmat pelaavat 0 plyllä — pelkällä verkolla siirroissa, tuplauksessa ja lehdissä;--ply 1tai enemmän pelaa syvemmälle, moninkertaisella ajalla. Seuraavat valitsimet korvaavat sen yksi kerrallaan.--games,--min-games,--truncation,--jsd,--ply,--candidates— Rolloutin parametrit (--truncation 0pelaa jokaisen pelin loppuun,--jsd 0ei pysähdy koskaan ennen loppua).--move— Pelattava siirto blunderDB:n merkinnällä (toistettavissa).--seed— Noppien siemenluku, oletuksena kiinteä: sama komento antaa samat luvut.--jobs— Rinnakkain pelattavat pelit (oletus: yksi ydintä kohti); vain aika muuttuu.--format— Tulostusmuoto:texttaijson(oletus:text).--db,--id— Tietokanta ja pelattavan aseman tunniste XGID:n sijaan.--store— Tallentaa valmiin rolloutin asemaan toisena analyysinä omine asetuksineen, tuodun tai lasketun analyysin rinnalle, jota se ei koskaan korvaa. Keskeytettyä rolloutia ei tallenneta; kahdesta samoilla asetuksilla tehdystä rolloutista säilytetään pidempi sarja, ja muilla asetuksilla tehty rollout lisätään rinnalle.--list— Näyttää asemaan tallennetut rolloutit uusimmasta vanhimpaan sen sijaan, että pelaisi uuden.
Kaikki vaihtoehdot pelaavat samoilla nopilla, jokaisen heiton onni poistetaan kunkin pelin tuloksesta (varianssin vähennys), kaksi ensimmäistä heittoa stratifioidaan ja peli päättyy siihen, missä two-sided-bearoff-tietokanta kattaa sen. Jokainen rivi antaa ekvityn, sen 95 %:n välin, pelattujen pelien määrän ja JSD:n, eron parhaaseen erotuksen keskihajontoina. Tuplauskuutiota pelataan pelien aikana: sijoitus on luotettavampi kuin absoluuttinen ekvity. Ctrl-C näyttää, mitä päättyneet pelit ovat osoittaneet.
Esimerkkejä:
./blunderdb rollout 'XGID=-b----E-C---eE---c-e----B-:0:0:1:31:0:0:0:0:10'
./blunderdb rollout --move '8/5 6/5' --move '24/23 13/10' '<XGID>'
./blunderdb rollout --db base.db --id 42 --preset standard --store
./blunderdb rollout --db base.db --id 42 --list
epc — EPC-laskin
Laskee XGID:nä tai OGID:nä (OpenGammon) annetun ulosajoaseman Effective Pip Countin, voittotodennäköisyyden ja rahapelin kuutiotuomion. Puhdas laskenta: mikään tietokantatiedosto ei ole mukana.
./blunderdb epc [options] '<XGID|OGID>'
Valitsimet:
--format— Tulostusmuoto:texttaijson(oletus:text).--bearoff-ts— Valinnainen kaksipuolinen bearoff-tietokanta (.bd), joka laajentaa sisäänrakennettua TS-06-06:ta (luetaan myös ympäristömuuttujastaBLUNDERDB_TS_PATH). Laajin kelvollinen tietokanta voittaa; kelvoton tiedosto ohitetaan varoituksella.
Toimintatilat. Kaksipuolisen tietokannan kattamalla alueella voittotodennäköisyys ja rahapelin kuutioanalyysi (cubeless, ND, D/T, D/P, tuomio) ovat tarkkoja. Sen ulkopuolella voittotodennäköisyys arvioidaan (yksipuolisten heittojakaumien konvoluutio ja kalibroitu korjaus) ja näytetään mitatun virhemarginaalinsa kanssa; kuutiotuomiota ei tarkoituksella arvioida koskaan (katso ADR-0009).
Esimerkkejä:
# Régime exact : six pions ou moins de chaque côté
./blunderdb epc 'XGID=-BBB------------------bbb-:0:0:1:00:0:0:0:0:10'
# Avec la table TS-06-11 calculée : exact jusqu'à onze pions par joueur
./blunderdb epc --bearoff-ts ~/.local/share/blunderdb/gnubg_ts6x11.bd 'XGID=…'
bearoff — Bearoff-tietokannat
Luo ja hallinnoi bearoff-tietokantoja. Mitään ei ladata eikä mitään ole upotettu: taulukko lasketaan täällä ja tarkistetaan sitä sormenjälkeä vasten, jonka gnubg tuottaa sen alueelle. Yksikään alikomento ei puhu tietokannan kanssa — bearoff-taulukko on aritmetiikkaa pelistä, ei kenenkään asemista — joten yksikään ei ota --db.
./blunderdb bearoff generate --ts <domain> [options]
./blunderdb bearoff list [options]
./blunderdb bearoff verify <file.bd> [options]
./blunderdb bearoff delete --ts <domain> [options]
Alue kirjoitetaan kuten makebearoff-työkalussa: 6x9 kaksipuoliselle taulukolle yhdeksällä nappulalla pelaajaa kohden, os8 kahdeksan pisteen yksipuoliselle taulukolle (pelkkä os tarkoittaa os6).
Kaksi perhettä eivät vastaa samaan kysymykseen. Kaksipuolinen taulukko laajentaa aluetta, jolla voittotodennäköisyys ja kuution tuomio ovat tarkkoja; yksipuolinen laajentaa sitä, kuinka kaukana kotoa nappula saa olla ilman että EPC vaikenee (enintään kymmenen pistettä).
generate. Kertoo koon, muistintarpeen ja arvioidun ajan ennen aloitusta, sitten näyttää prosenttiosuuden ja mitatun jäljellä olevan ajan.
--ts— Laskettava kaksipuolinen alue, esimerkiksi6x9.--os— Laskettava yksipuolinen alue pisteiden määränä: 6–12. Näistä kahdesta tarvitaan täsmälleen yksi.--cores— Käytettävät ytimet (oletus: kaikki paitsi yksi).--data-dir— Minne kirjoitetaan (oletus: sovelluksen datakansio).--quiet— Ei edistymisriviä.
CTRL-C keskeyttää tauolle. Signaali otetaan kiinni: tila kirjoitetaan taulukon viereen, ja sama komento uudelleen ajettuna jatkaa siitä mihin jäi sen sijaan että laskisi kaiken uudelleen. Puoli tuntia aritmetiikkaa kannattaa kirjoittaa muistiin. bearoff delete heittää odottavan jatkon pois. Vain kaksipuolinen ajo menee tauolle; yksipuolinen on peräkkäinen eikä --cores hyödytä sitä.
list. Hinnoittelee jokaisen alueen — koko, muisti, aika tällä koneella — ja kertoo mitkä ovat jo olemassa, tuomioineen, ja millä on tauolla oleva ajo. --format json skriptiä varten, --cores arvion oletuksen muuttamiseen.
verify. Vastaa verified (samat tavut kuin viitteessä), unverified (hyvin muodostettu, mutta alueelle ei ole tallennettu sormenjälkeä) tai corrupt (tiedosto on ristiriidassa itsensä kanssa). Päättyy virheeseen viimeisessä tapauksessa: tämä komento on tehty skriptiin pantavaksi.
delete. Poistaa taulukon, odottavan jatkon ja kuolleen ajon jäänteet. Oletusalue lasketaan uudelleen sovelluksen seuraavalla käynnistyksellä; laajempaa ei.
Esimerkkejä:
# Ce que cette machine a, et ce que chaque domaine coûterait
./blunderdb bearoff list
./blunderdb bearoff generate --ts 6x9 --cores 4
# OS-08 : l'EPC répond alors jusqu'à un pion sur la 8
./blunderdb bearoff generate --os 8
# Sur un serveur, dans le volume que lit le démon
./blunderdb bearoff generate --ts 6x11 --data-dir /srv/bearoff
./blunderdb bearoff verify /srv/bearoff/gnubg_ts6x11.bd
analyze — gammonNet-täydennysanalyysi
Kirjoittaa gammonNet-analyysin jokaiselle asemalle, jolla ei ole yhtään analyysiä — ennen tämän toiminnon olemassaoloa kootun kirjaston täydentäminen (ADR-0013, ADR-0015). Kyseessä on sama toiminto kuin tuonnin jälkeinen automaattinen käynnistys ja graafisen käyttöliittymän painike « Analysoi nyt » sekä serve-daemonin päätepiste /v1/gammonnet.analyzeMissing yhdelle vuokralaiselle — saman toiminnon kolme eri muotoa, ei kolmea erillistä logiikkaa (katso Headless-tila (palvelin)).
./blunderdb analyze --db <path> [options]
Valitsimet:
--db— Tietokanta (pakollinen).--ply— Hakusyvyys (oletus: 2, kanoninen asetus).--prune-k— Karsinnan leveys (oletus: 12, kanoninen asetus).--candidates— Siirtopäätöstä kohden säilytettävien ehdokassiirtojen määrä (oletus: 10).--jobs— Rinnakkain analysoitavien asemien määrä (oletus: koneen ydinten määrä).--match— Rajaa erän yhden ottelun asemiin (0, oletusarvo, tarkoittaa koko kirjastoa).--compare— Ei kirjoita mitään: vertaa gammonNetia tuotuihin analyyseihin aukkojen täyttämisen sijaan (katso alta).--limit— Yhdessä--compare:n kanssa: pysähtyy tämän asemamäärän jälkeen (0 = kaikki).--format— Tulostusmuoto:text(oletus, edistymisen kanssa) taijson(yksi yhteenvetoasiakirja, tulostetaan lopussa).--rollout— Pelaa--query-valitsimen valitsemat asemat rolloutilla aukkojen täyttämisen sijaan (katso alla).--query—--rollout-valitsimen kanssa pelattavat asemat haun kyselykielellä (search --query-help); tyhjänä kaikki.
Ilman analyysiä tuotu ottelu saa näin PR-luvun. Näin on verkossa pelatun ottelun tai Jellyfish-.mat-tiedoston laita, kun kukaan ei ole ajanut sitä XG:n läpi. blunderDB tunsi asemat ja pelatut siirrot, mutta mikään ei kertonut mitä ne olivat arvoltaan; erän ajon jälkeen todella pelattua siirtoa verrataan gammonNetin järjestykseen, ja ero syöttää PR:n ja kaikki muut mittarit. Pelattu siirto tulee ottelun omasta siirtotaulusta, joka kirjoitetaan tuonnissa riippumatta siitä kantoiko tiedosto analyysin — sitä ei koskaan arvata.
Tätä vanhemmalla versiolla analysoitua tietokantaa ei tarvitse arvioida uudelleen: repair laskee sarakkeet uudelleen jo tallennetusta ja palauttaa noille otteluille niiden PR:n.
Vain yksi ottelu (--match). Tunnisteella, jonka list --type matches näyttää, erä käy läpi vain kyseisen ottelun asemat: sama aukkosääntö, samat takeet, kapeampi kattavuus. Juuri tuotu ottelu saa analyysinsä ilman että muuta kirjastoa käydään läpi, ja korjattu ja toistamiseen analysoitu ottelu maksaa vain korjauksen luomat asemat, koska kaikilla muilla on jo analyysi. Valitsinta ei voi yhdistää --stale- eikä --compare-valitsimeen, jotka molemmat katsovat asemia joilla jo on analyysi: molempien pyytäminen on virhe eikä hiljaisesti ohitettu kattavuus.
Rinnakkaisuus (--jobs). Erän asemat ovat toisistaan riippumattomia — mikään haku ei vaikuta seuraavaan — joten ne jaetaan --jobs säikeelle, joista jokaisella on oma evaluaattorinsa. Kirjoitetut analyysit ovat identtiset riippumatta siitä, mikä arvo on annettu valitsimelle --jobs; vain laskenta-aika muuttuu. --jobs 1 jättää koneen vapaaksi muuhun käyttöön. Keskeytys ei muutu: Ctrl-C pysäyttää erän ennen jokaista uutta asemaa, ja kaikki jo laskettu kirjoitetaan.
Aukkosääntö (ADR-0013). Asemaan, jolla on jo analyysi — XG, GNUbg, BGBlitz tai aiempi gammonNet-ajo — ei koskaan kosketa riippumatta siitä, mikä moottori puuttuu. Vain asema, jolla ei ole yhtään analyysiä, kirjoitetaan. Komennon voi siis käynnistää uudelleen milloin tahansa ilman riskiä ja keskeyttää siististi: Ctrl-C peruuttaa menettämättä mitään jo kirjoitettua, ja seuraava ajo jatkaa täsmälleen siitä, mihin edellinen jäi — lokia ei tarvita, koska « asemat ilman analyysiä » lasketaan uudelleen jokaisella käynnistyksellä.
Esimerkki:
./blunderdb analyze --db base.db
# Analyzing 1204 position(s) with gammonNet (2-ply, k=12, 16 job(s))...
# 1/1204 (0%)
# 61/1204 (5%)
# ...
# 1204/1204 (100%)
# Done.
./blunderdb analyze --db base.db --jobs 1
# Un seul match, celui qui vient d'être importé
./blunderdb analyze --db base.db --match 12
Erä-rolloutit (--rollout). Jokainen --query-valitsimen valitsema asema pelataan rolloutilla, yksi kerrallaan kaikilla ytimillä, ja rollout tallennetaan analyysin viereen, ei koskaan sen tilalle. Arvo on esiasetus — fast (216 peliä, katkaistu 7:ään) tai standard (1296 peliä, katkaistu 11:een) — tai vapaat asetukset: valinnainen esiasetus, sitten games=, min-games=, truncation=, jsd=, ply=, candidates=, seed=, pilkuilla erotettuina. Asema, jolla on jo rollout samoilla asetuksilla, ohitetaan: Ctrl-C:llä keskeytetty ajo jatkuu siitä, mihin se jäi, ja kesken oleva asema hylätään kokonaan. Aseman, jota vain rollout analysoi, haku löytää sen kautta; jo analysoitu asema säilyttää analyysinsa sarakkeet.
./blunderdb analyze --db base.db --rollout fast --query 'E>80'
./blunderdb analyze --db base.db --rollout 'standard,ply=1' --query 'c'
--compare: mitä gammonNet on arvoltaan sinun kirjastossasi?
Moottorin tarkkuus mitataan muualla vertailukorpuksia ja tarkkaa poistotaulua vasten. Kumpikaan mittaus ei vastaa siihen kysymykseen, joka käyttäjällä oikeasti on ja joka koskee hänen asemiaan: XG:stä tuoduissa otteluissa, missä sisäänrakennettu moottori on eri mieltä kuin tiedoston mukana tullut analyysi, ja mitä tuo erimielisyys maksaisi?
--compare vastaa, eikä kirjoita mitään. Se ei ole varotoimi vaan komennon koko idea: ADR-0013 suojaa tuotua analyysiä ehdoitta, joten vertailun voi ajaa kirjastoon, jota ei missään nimessä halua kirjoitettavan uusiksi.
Raportti antaa:
yksimielisyysasteen parhaasta vastauksesta, eriteltynä nappulasiirtoihin ja kuutiopäätöksiin — näillä kahdella ei ole mitään tekemistä toistensa kanssa, ja yksi luku peittäisi kumpi niistä pettää;
erimielisyyden hinnan, arvotettuna tuodun analyysin omalla asteikolla: mitä gammonNetin suosima siirto on arvoltaan tuodun moottorin mukaan, vähennettynä sen oman parhaan siirron arvolla. Tämä suunta on ainoa, jonka molemmat moottorit voivat yhdessä laskea; erimielisyyden hinnoittelu kahdesti houkuttelisi lukemaan pienemmän luvuista;
erittelyn pelin vaiheen mukaan, joka kertoo missä erimielisyydet ovat;
kymmenen kalleinta erimielisyyttä, asema kerrallaan.
Kaksi moottoria kirjoittaa saman siirron eri tavoin — XG kirjoittaa ”13/7” siinä missä gammonNet kirjoittaa ”13/8 8/7”, syönnit merkitään toisella puolella eikä toisella, toisto tiivistetään joskus muotoon ”(2)”. Nämä erot ovat murretta eivätkä erimielisyyttä: vertailu palauttaa molemmat merkinnät kanoniseen muotoon ennen vertaamista. Ilman sitä testikorpus näytti 78,8 % yksimielisyyttä 93,2 %:n sijaan — viisitoista prosenttiyksikköä valheellisia erimielisyyksiä.
Siirtoa, jota tuotu moottori ei ole listannut, ei voi hinnoitella sen asteikolla: se lasketaan nollakustannuksiseksi erimielisyydeksi eikä keksityksi kustannukseksi.
# Comparer sur un échantillon de 500 positions
./blunderdb analyze --db base.db --compare --limit 500
# compared: 118 decision(s) (refused 2, failed 0)
# same best answer: 93.2% (110/118)
# checker play: 93.7% (59/63)
# cube decision: 92.7% (51/55)
# ...
transcribe — Toista litterointi uudelleen
Toistaa litteroinnin uudelleen ja kertoo, mitä toisto siitä löytää. Lähde on .mat-tiedosto, kirjaston ottelu tai litteroinnin luonnos — täsmälleen yksi kolmesta. Ottelu luetaan sen .mat-muodon kautta, jonka se veisi ulos: toistettavaksi tulee siis se, mitä vienti sisältäisi.
./blunderdb transcribe --mat <fichier> [--check] [--render <sortie>]
./blunderdb transcribe --db <path> --match <id> --check
./blunderdb transcribe --db <path> --draft <id> --check
./blunderdb transcribe --db <path> --match <id> --edit [--accept-losses]
./blunderdb transcribe --db <path> --draft <id> --finish|--abandon
Valitsimet:
--mat— Toistettava.mat-tiedosto.--db— Tietokanta, valitsimia--matchja--draftvarten.--match— Toistettavan kirjaston ottelun tunniste.--draft— Toistettavan litteroinnin luonnoksen tunniste.--check— Luettelee löydetyt epäjohdonmukaisuudet (oletustoiminta).--render— Kirjoittaa litteroinnin takaisin.mat-muodossa tähän polkuun.--format— Tulostusmuoto:text(oletus) taijson.--edit— Avaa luonnoksen--match-ottelulle (tai palauttaa sille jo avatun).--accept-losses—--edit-valitsimen kanssa tuodulla ottelulla: hyväksyy, että sen analyysit ja kommentit voivat hävitä.--finish— Viimeistelee--draft-luonnoksen: kirjoittaa sen ottelun tai korvaa sen, josta se avattiin, ja vapauttaa luonnoksen.--abandon— Hylkää--draft-luonnoksen: poistaa sen ilman ottelua; ottelu, josta se avattiin, pysyy ennallaan.--yes—--abandon-valitsimen kanssa luonnokseen, josta ei ole koskaan syntynyt ottelua: vahvistaa, että kaikki siihen kirjoitettu menetetään.
--check nimeää jokaisen epäjohdonmukaisuuden siirron numerolla ja pelillä, jossa se on: laiton siirto, kaksi vuoroa peräkkäin samalle pelaajalle, mahdoton tuplauskuution toiminto, ottelun päättymisen jälkeinen toiminto, siirto jonka askeleet eivät käytä sen omia noppia, pelin ensimmäinen siirto tuplanopilla, joka ei voi olla aloitusheitto, kirjaamaton siirto — solu ???, jonka gnubg kirjoittaa kun se ei säilyttänyt pelattua siirtoa, eikä se tarkoita ettei pelaaja olisi voinut siirtää, epäjohdonmukainen ilmoitettu tilanne — peli, jonka tilannerivi ei ole se, jonka aiemmat pelit antavat, ja joka pelataan uudelleen kirjoitetulla tilanteella.
Epäjohdonmukaisuus raportoidaan, sitä ei koskaan pidetä esteenä: mitään ei hylätä sen takia, ja paluuarvo pysyy nollana riippumatta siitä, mitä toisto löytää. Nollasta poikkeava arvo kertoo todellisesta epäonnistumisesta — lukukelvoton tiedosto, tietokanta joka ei aukea, tuloste jota ei voi kirjoittaa. Skripti, joka haluaa toimia havaintojen perusteella, lukee ne muodossa --format json, jossa rikkinäinen tiedosto ja laittoman siirron sisältävä peli eivät mene sekaisin.
--render kirjoittaa litteroinnin takaisin .mat-muotoon, mikä sallii edestakaisen muunnoksen tarkistamisen oikealla tiedostolla testien ulkopuolella.
Vain kolme valitsinta kirjoittaa, samoilla menetelmillä kuin Litterointi-paneeli: --edit avaa luonnoksen olemassa olevalle ottelulle, --finish viimeistelee sen — ottelu korvataan samalla tunnisteella — ja --abandon poistaa luonnoksen ilman ottelua ja vaatii --yes-valitsimen luonnokselle, jota ei ole koskaan viimeistelty ja joka vie mukanaan kaiken siihen kirjoitetun. Tuotu ottelu sisältää analyysejä ja kommentteja, joita .mat ei sisällä: --edit ilmoittaa niiden määrän enintään ja kieltäytyy ilman --accept-losses-valitsinta.
Esimerkki:
./blunderdb transcribe --mat match.mat --check
# match.mat: 7 point match, 4 game(s), 203 action(s)
# Final score: 9-2
# Inconsistencies: none
tournament — Johdetun turnauksen lukeminen
Lukee johdetun turnauksen ilman graafista käyttöliittymää. Turnauksen johtaminen interaktiivisesti on Nicomaque-moottorin oman konsolin tehtävä; nämä alikomennot lukevat, mikään ei odota syötettä, ja vain move kirjoittaa.
./blunderdb tournament <sous-commande> --db <chemin> [options]
Alikomennot:
list [--format text|json]— Tietokannan johdetut turnaukset, niiden tila, moottorin versio, tapahtuma johon kukin kuuluu (tyhjä jos ei mihinkään) ja viimeisimmän päätöksen päivämäärä.verify --id N [--format text|json]— Toistaa johtamisen uudelleen ja ilmoittaa jäljellä olevat varoitukset. Päättyy virheeseen, jos yksikin jää: tämä on turnauksen jälkeinen tarkistus, ja skripti, joka ajaa sen kauden tietokannoille, haluaa paluukoodin eikä suodatettavaa riviä.standings --id N— Sijoitukset CSV-muodossa, palkinnot mukaan lukien, käyttöliittymän kielellä.ranking --season [--rencontre N] [--from AAAA-MM-JJ] [--to AAAA-MM-JJ] [--points 25,18,15] [--participation P] [--elo] [--format csv|json]— Kauden sijoitus: tapahtuman tai ajanjakson päättyneet turnaukset (rajat mukaan lukien, turnauksen päivämäärän mukaan; ilman suodatinta kaikki johdetut turnaukset), kukin sija muunnettuna pisteiksi pisteytyksellä (voittaja ensin; oletuksena 25, 18, 15, 12, 10, 8, 6, 4, 2, 1), lisäksi--participationjokaisesta pelatusta turnauksesta. Tasapisteissä olevat jakavat keskenään haltuunsa ottamiensa sijojen keskiarvon. Henkilö tunnistetaan turnauksesta toiseen nimen perusteella.--elolisää kauden otteluiden pohjalta uudelleen pelatun seuran Elon (FIBS-kaava, lähtö 1500). CSV antaa yhden rivin henkilöä kohti ja yhden pistesarakkeen turnausta kohti; päättymätön turnaus luetellaan, mutta se ei tuota mitään.page --id N|--rencontre N [--out <kansio>]— Kilpailun HTML-näyttösivu (--id), tai tapahtuman seinäsivu (--rencontre: yksi rivi per pöytä, riippumatta siitä mikä kilpailu sitä käyttää). Tasan toinen näistä vaaditaan. Ilman--out-valitsinta se menee vakiotulosteeseen; sen kanssa se kirjoitetaan kansioon, josta tulee johtamisen tai tapahtuman kansio.export --id N— Raaka tapahtumaloki, jonka moottorin työkalut voivat toistaa. Loki on johtamisen koko totuus: sijoitukset, kaaviot ja varoitukset toistetaan siitä. Tätä tulostetta lukeva työkalu ei tarvitse blunderDB:tä lainkaan.move --id N --match M --table T [--format text|json]— Vaihtaa käynnissä olevan ottelun pöydän, kuten ruudun vetäminen toisen päälle ruudukossa. Jos kohdepöytä on varattu, kaksi ottelua vaihtavat pöytiä keskenään; käytöstä poistettu pöytä hylätään. Tapahtumassa, jos pöydän on varannut toinen kilpailu, vaihto tehdään kahden kilpailun välillä: pöydänvaihto kirjataan kummankin lokiin. Tulostaa jokaisen käynnissä olevan ottelun pöydän.hall --rencontre N [--format text|json]— Tapahtuman kaikki pöydät: yksi rivi pöytää kohti, riippumatta siitä, mikä kilpailu sen varaa (kilpailu, ottelu, pelaajat), sitten kunkin kilpailun ehdotukset. Se on ruudukko, jonka Directionin Kaikki pöydät -näkymä näyttää. Pöydät ryhmitellään saleittain, kun tapahtumalla on saleja, ja ne nimetään, kun niillä on nimi.tables --rencontre N|--tournament N [--format text|json]— Pöytien ominaisuudet (nimi, sali, varattu, osoitettu) ja salit, joissa tapahtuman kukin kilpailu pelataan (--rencontre), tai yksin pelattavan kilpailun ominaisuudet (--tournament). Vain luku: kirjoitus kulkeecall-komennon kautta (rencontres.setTables,rencontres.setEventRooms,directions.setTables).
Yhteiset valitsimet: --db (pakollinen), --id (pakollinen paitsi komennoille list, page --rencontre hall ja tables), --format.
Esimerkkejä:
./blunderdb tournament list --db base.db
./blunderdb tournament verify --db base.db --id 3
./blunderdb tournament standings --db base.db --id 3 > classement.csv
./blunderdb tournament ranking --db base.db --season --from 2026-01-01 --to 2026-12-31 --elo > saison.csv
./blunderdb tournament page --db base.db --id 3 --out /tmp/affichage
./blunderdb tournament page --db base.db --rencontre 1 --out /tmp/evenement
./blunderdb tournament export --db base.db --id 3 > journal.json
./blunderdb tournament move --db base.db --id 3 --match m4 --table 7
./blunderdb tournament hall --db base.db --rencontre 1
./blunderdb tournament tables --db base.db --rencontre 1
trash — Roskakori
Mitä on poistettu ja millä sen saa takaisin. Poisto on yhä poisto: JSON-tilannekuva katoavasta kirjoitetaan ensin, eikä mikään muu tietokannassa tiedä tuon taulun olemassaolosta — ei hakusuodatin, ei tilasto, ei säilytyssääntö.
./blunderdb trash <sous-commande> --db <chemin> [options]
Alikomennot:
list— Mitä roskakorissa on, uusimmasta poistosta vanhimpaan.restore --id N— Palauttaa merkinnän N ja poistaa sen roskakorista.discard --id N— Poistaa merkinnän N heti, palauttamatta sitä.empty [--older-than P]— Tyhjentää roskakorin tai vain sen, mikä on yli P päivää vanhaa.delete --kind K --id N— Poistaa kohteen roskakorin kautta, jotta teon voi perua.Konposition,collectiontaicomment.
Yhteiset valitsimet: --db (pakollinen), --kind, --limit (oletus 50), --format (text tai json).
Muista
blunderdb delete poistaa yhä ilman turvaverkkoa: skripti, joka poistaa aseman, odottaa sen katoavan, ja hiljainen tilannekuvan jättäminen kasvattaisi tiedostoa, jonka kasvua kukaan ei pyytänyt. trash delete on se, joka säilyttää perumisen.
Aseman palautus kulkee uudelleen Zobrist-deduplikoinnin läpi: se ei koskaan luo kaksoiskappaletta, mutta se ei palauta vanhaa tunnistetta — alkuperäistä riviä ei enää ole. Palautettu asema on sama asema uudella numerolla.
Yli kolmekymmentä päivää vanhat poistaa blunderdb vacuum — ei koskaan tietokannan avaaminen.
Esimerkkejä:
# Supprimer une position en gardant l'annulation
./blunderdb trash delete --db base.db --kind position --id 412
# Voir la corbeille, puis remettre une entrée
./blunderdb trash list --db base.db
./blunderdb trash restore --db base.db --id 3
# Ne garder que ce qui a moins de trente jours
./blunderdb trash empty --db base.db --older-than 30
info — Tietokannan metatiedot
Näytä tietokannan metatiedot ja tilastot.
./blunderdb info --db <path> [--format <format>]
Valitsimet:
--db— Tietokanta (pakollinen).--format— Tulostusmuoto:texttaijson(oletus:text).
Esimerkkejä:
./blunderdb info --db base.db
# Database Information
# ==================================================
# Path: /home/jean/bg/base.db
#
# Metadata:
# Version: 2.20.0
# User: Jean
# Description: Matchs de tournoi 2025
# Date of Creation: 2026-09-06 02:43:51
#
# Statistics:
# Positions: 3859
# Analyses: 3855
# Matches: 11
# Games: 61
# Moves: 3766
--format json lisää tiedoston alkuperän — issuance kantaa vesileiman, jos sellainen on, sekä tämän koneen liikkeeseenlaskijan identiteetin:
./blunderdb info --db base.db --format json
{
"issuance": {
"watermarked": false,
"issuerFingerprint": "1186-57FA-060C-9378",
"issuerName": "unger"
},
"metadata": {
"database_version": "2.20.0",
"dateOfCreation": "2026-09-06 02:43:51",
"description": "Matchs de tournoi 2025",
"user": "Jean"
},
"path": "/home/jean/bg/base.db",
"stats": {
"analysis_count": 3855,
"game_count": 61,
"match_count": 11,
"move_count": 3766,
"position_count": 3859
}
}
edit — Muokkaa metatietoja
Muokkaa tietokannan käyttäjänimeä, kuvausta tai kynnysarvoja.
./blunderdb edit --db <path> [options]
Valitsimet:
--db— Tietokanta (pakollinen).--user— Uusi käyttäjänimi.--description— Uusi kuvaus.--clear-user— Tyhjennä käyttäjänimi.--clear-description— Tyhjennä kuvaus.--error-threshold— Virhekynnys millipisteinä: päätös, joka maksaa vähintään tämän verran, on virhe.--blunder-threshold— Blunderin kynnys millipisteinä: virhe, joka maksaa vähintään tämän verran, on blunder.--format— Tulostusmuoto:text(oletus) taijson({"changes": [...]}).
Vähintään yksi muokkausvalitsin vaaditaan.
Esimerkkejä:
./blunderdb edit --db base.db --user "Marie" --description "Ma collection"
./blunderdb edit --db base.db --clear-description
./blunderdb edit --db base.db --error-threshold 20 --blunder-threshold 80
verify — Tarkista eheys
Tarkista tietokannan eheys ja valinnaisesti vertaa ottelua sen lähdetiedostoon.
./blunderdb verify --db <path> [--match <id>] [--mat <file.mat>]
Valitsimet:
--db— Tietokanta (pakollinen).--match— Tarkistettavan ottelun tunnus.--mat— Verrattava MAT-tiedosto (käytetään yhdessä--match:n kanssa).--format— Tulostusmuoto:text(oletus) taijson(tilastot, orvot rivit, skeemapoikkeama ja mahdollinen ottelun tarkistus).
Ilman --match-valitsinta komento näyttää tietokannan yleiset tilastot. --match-valitsimen kanssa se tarkistaa ottelun tiedot ja voi verrata niitä alkuperäiseen lähdetiedostoon.
Jokainen ajo tarkistaa myös viite-eheyden: se laskee orvot rivit — pelit ilman ottelua, siirrot ilman peliä, siirtoanalyysit ilman siirtoa, analyysit ilman asemaa, kertauspäiväkirjan merkinnät ilman pakkaa tai ilman asemaa — ja tulostaa WARNING-rivin kokonaismäärällä, jos niitä on. Terve tietokanta vastaa Orphaned rows: none. Orpoja voi jäädä tietokantaan, jonka kirjoitti versio joka ei valvonut vierasavaimia jokaisella yhteydellä, tai ennen kuin kertauspäiväkirjalla oli omansa; ne eivät kuulu mihinkään otteluun eivätkä mihinkään pakkaan ja vievät vain tilaa. Komento päättyy silti paluukoodiin 0.
Jokainen ajo vertaa myös skeemaa viite-DDL:ään ja luettelee taulut, sarakkeet ja indeksit, jotka tietokannasta puuttuvat. Tietokannan avaaminen lisää puuttuvat osat, kun se on mahdollista, ja vain kirjaa lokiin sen, mitä se ei voi lisätä (tyypillisesti UNIQUE-indeksin, jonka uudelleenrakentamisen kaksoisrivit estävät): tässä tuo puute tulee näkyviin, ja kysely, joka nimeää jonkin näistä osista, epäonnistuu, kunnes syy on korjattu. Terve tietokanta vastaa Schema: matches the reference DDL. Kuten orporivit, skeemapoikkeama on havainto, ei virhe: paluukoodi pysyy nollana.
Jokainen ajo tarkistaa lopuksi säännöt, jotka nykyinen DDL esittää mutta joita SQLite ei osaa lisätä jo olemassa olevaan tauluun: CHECK-rajoitteet (nopat välillä 0–6, tuplauskuutio ja pipit ei-negatiivisia, 0–15 ulos kannettua nappulaa, kertausarvosana välillä 1–4), Zobrist-tiivisteen, jota riviltä ei koskaan pitäisi puuttua, sekä yhden analyysin asemaa kohden. Skeemaversiosta 2.18.0 alkaen luotu tietokanta valvoo niitä; vanhempi voi yhä sisältää rivejä, jotka uusi tietokanta hylkäisi, ja juuri ne lasketaan tässä sääntö kerrallaan. Terve tietokanta vastaa Constraints: every row satisfies the current DDL. Yksi havainto lisää: mitään ei korjata ja paluukoodi pysyy nollassa.
Jokainen ajo laskee lopuksi uudelleen kaksi denormalisoitua laskuria, match.game_count ja game.move_count, niistä riveistä joita ne väittävät laskevansa, ja kertoo kuinka moni on eri mieltä ja kuinka paljon pahimmillaan. Molemmat kirjoitetaan kerran, tuonnin yhteydessä, sen mukaan mitä lähdetiedosto sisälsi, ja juuri ne näkyvät otteluluettelossa ja pelinäkymässä: pieni ero on useimmiten tuonti, joka ohitti sen mitä ei osannut muuntaa. Mitään ei kirjoiteta uudelleen — laskurin korvaaminen tallennetulla pyyhkisi juuri sen eron, jota kannattaa katsoa. Terve tietokanta vastaa Counters: game_count and move_count agree with the rows.
Esimerkkejä:
./blunderdb verify --db base.db
./blunderdb verify --db base.db --match 1
./blunderdb verify --db base.db --match 1 --mat original.mat
Käyttö vartijana. Paluukoodi on 0 riippumatta siitä, mitä komento löytää: tuomion kantaa --format json, ja skriptin on luettava laskurit itse.
{
"stats": {
"analysis_count": 3855,
"game_count": 61,
"match_count": 11,
"move_count": 3766,
"position_count": 3859
},
"orphans": {
"games_without_match": 0,
"moves_without_game": 0,
"move_analyses_without_move": 0,
"analyses_without_position": 0,
"reviews_without_deck": 0,
"reviews_without_position": 0
},
"orphan_total": 0,
"schema_drift": {
"missing_tables": null,
"missing_columns": null,
"missing_indexes": null
},
"schema_drift_count": 0,
"constraint_violations": [
{"name": "position.zobrist_hash NOT NULL", "count": 0},
{"name": "position.dice_1 BETWEEN 0 AND 6", "count": 0}
],
"constraint_violation_total": 0,
"counter_drift": {
"matches_with_wrong_game_count": 0,
"games_with_wrong_move_count": 53,
"worst_game_count_gap": 0,
"worst_move_count_gap": 2
},
"counter_drift_total": 53
}
Kolme kenttää ansaitsee hälytyksen: orphan_total, schema_drift_count ja constraint_violation_total. Nollasta poikkeavina ne kuvaavat tietokantaa, joka on korjattava.
./blunderdb verify --db base.db --format json \
| jq -e '.orphan_total == 0 and .schema_drift_count == 0 and .constraint_violation_total == 0'
counter_drift_total ei kuulu näihin, ja yllä oleva esimerkki osoittaa sen: sen tuottanut tietokanta oli juuri tuotu, ja siinä on jo 53 peliä, joiden siirtolaskuri poikkeaa siitä, mitä rivit sisältävät. Nämä laskurit tulevat lähdetiedostosta, eivät tietokannasta; poikkeama kertoo tuonnista, se ei ilmaise vioittumista. Katsokaa sitä, mutta älkää käyttäkö sitä kynnysarvona.
vacuum — Tietokannan tiivistäminen
Ottaa takaisin levytilan, jonka poistot (ottelut, turnaukset, siivoukset) ovat jättäneet: SQLite ei koskaan pienennä tiedostoa itsestään dataa poistettaessa, sitä on pyydettävä nimenomaisesti. Tämä on ainoa tapa käynnistää tiivistys — se ei tapahdu koskaan automaattisesti tietokantaa avattaessa, koska sen kustannus on suuressa tietokannassa arvaamaton.
./blunderdb vacuum --db <path>
Valitsimet:
--db— Tietokanta (pakollinen).--format— Tulostusmuoto:text(oletus) taijson({"size_before", "size_after", "reclaimed"}, tavuina).
Komento aloittaa suorituksella wal_checkpoint(TRUNCATE), jotta ennen tiivistystä näytetty koko on rehellinen, tarkistaa, että levyllä on jäljellä noin kaksi kertaa tiedoston nykyinen koko (SQLite rakentaa koko tietokannan uudelleen ennen siihen siirtymistä), suorittaa VACUUM-toiminnon ja sen jälkeen ANALYZE-toiminnon virittääkseen kyselysuunnittelijan käyttämät tilastot. Jos levytila ei riitä, komento kieltäytyy käynnistymästä selkeällä viestillä sen sijaan, että riskeeraisi keskeytyneen tiivistyksen.
Esimerkki:
./blunderdb vacuum --db base.db
# Compacting database...
# Before: 128.4 MiB
# After: 41.2 MiB
# Reclaimed: 87.2 MiB
repair — Laske uudelleen se, mikä on johdettua
Laskee uudelleen sen, minkä tietokanta johtaa siitä mitä se tallentaa: jokaisen analyysin skalaarisarakkeet itse analyysistä, jonka projektio ne vain ovat; jokaisen aseman vaiheen ja pelityypin sen laudasta; ja jokaisen pistetilanteen Crawford-merkin siitä ottelusta, josta asema on peräisin, tai siitä XGID:stä, jonka mukana se tuli. Analyyseihin ei kosketa: uusiksi tehdään niistä johdetut arvot.
./blunderdb repair --db <path>
Valitsimet:
--db— Tietokanta (pakollinen).--format— Tulostusmuoto:text(oletus) taijson— yksi laskuri kierrosta kohden:repaired(analyysisarakkeet),phases(uudelleen luokitellut asemat) jacrawford(uudelleen tiivistetyt asemat). Kukin kertoo todella muuttuneiden rivien määrän.
Hyödyllinen sen jälkeen, kun tuodun analyysin lukutapaa on korjattu. Näin on käynyt jo kahdesti. XG-tuoja kirjoittaa ”ei tuplausta” kahdella tavalla, ja jälkimmäinen ymmärrettiin oikeana tuplauksena — sarake kantoi silloin tuplauksen virhettä, jota ei koskaan tapahtunut. Ja blunderDB:n itse laskema analyysi ei tiennyt mikä siirto oli pelattu, joten ilman analyysiä tuotu ottelu piti virheen nollassa kaikkialla ja PR:n arvossa 0,00; sarake lasketaan nyt uudelleen ottelun siirroista. Lukutavan korjaus ei muuta mitään jo kirjoitetuissa riveissä; tämä komento tekee ne uudelleen.
Crawford-vaihe puolestaan koskee asemia itseään. Pistetilanne 1 tarkoittaa ”yksi piste jäljellä, ja tämä peli ON Crawford-peli”; 0 tarkoittaa ”yksi piste jäljellä, Crawford on takanapäin”. Niin kauan kuin tuojat eivät kirjoittaneet tätä eroa, jokainen Crawfordin jälkeinen asema tallennettiin Crawford-asemana ja luettiin siis kuollein tuplauskuutioin — juuri siellä, missä perässä oleva tosiasiassa tuplaa ensimmäisellä tilaisuudella. Pistetilanteen korjaaminen muuttaa aseman tiivisteen: rivi tiivistetään siis uudelleen ja sulautetaan oikeaan kaksoseensa, jos tietokannassa on jo sellainen — analyysi, kommentit, kokoelmat, Anki-kortit ja niiden kertaushistoria, ottelun siirrot sekä roskakorin merkinnät, jotka viittaavat siihen, seuraavat eloon jäänyttä riviä. Asema, johon mikään ottelu ei osoita, korjataan vain sen XGID:n sanan perusteella, jonka se toi toisesta ohjelmasta (XG, BGBlitz…): kun tuon XGID:n Crawford-kenttä sanoo, ettei peli ole Crawford-peli, ja XGID todella kuvaa tämän aseman. Toiseen suuntaan asema ilman ottelua, joka on tallennettu kummallekin puolelle arvolla 0, muuttuu arvoon 1, kun sen tuoma XGID on 1 pisteen ottelun XGID ja kuvaa sen: 1 pisteen ottelun ainoa peli alkaa yhden pisteen päästä tavoitteesta, joten se on Crawford-peli, kuten tuojat sen kirjoittavat. Pidemmän ottelun Crawfordin jälkeinen DMP pysyy arvossa 0: sen XGID kertoo tuon ottelun pituuden. XGID, jonka blunderDB on itse kirjoittanut uudelleen, vain toistaa tallennetun pistetilanteen eikä todista mitään. Jokainen muu asema ilman ottelua jätetään ennalleen: mikään ei ole ristiriidassa sen kanssa, mitä sen pistetilanne ilmoittaa.
Mikään ei käynnistä sitä automaattisesti, ja se on tarkoituksellista: kaikkien analyysisarakkeiden uudelleenkirjoittaminen tai asemien uudelleen tiivistäminen pelkästä tietokannan avaamisesta ei ole jotain, mitä työkalun tulisi tehdä käyttäjänsä selän takana.
Esimerkki:
./blunderdb repair --db base.db
# 42 analyses repaired.
# 7 positions reclassified.
# 3 positions rehashed onto the right Crawford sentinel.
delete — Poista tietoja
Poista ottelu ja kaikki siihen liittyvät tiedot (pelit, siirrot, analyysit).
./blunderdb delete --db <path> --type match --id <id> [--confirm]
Valitsimet:
--db— Tietokanta (pakollinen).--type— Poistotyyppi:match(pakollinen).--id— Poistettavan kohteen tunnus (pakollinen).--confirm— Poista pyytämättä vahvistusta.--format— Tulostusmuoto:text(oletus) taijson({"match_id": N, "deleted": true}).
Esimerkkejä:
# Confirmation interactive, puis sans confirmation (scripts)
./blunderdb delete --db base.db --type match --id 1
./blunderdb delete --db base.db --type match --id 1 --confirm
healthcheck — Taustaprosessin tarkistus
Kysyy käynnissä olevalta serve-taustaprosessilta (ks. Headless-tila (palvelin)), onko se valmis: yksi GET /readyz-pyyntö, paluukoodi 0, jos taustaprosessi vastaa 200 (tallennus tavoitettavissa, skeema odotetussa versiossa), muuten 1 — tallennus ei tavoitettavissa, vanhentunut skeema tai osoitteessa ei kuuntele mikään. Tietokantatiedostoa ei avata.
./blunderdb healthcheck [--addr host:port] [--timeout 2s]
Valitsimet:
--addr— Osoite, jota taustaprosessi kuuntelee (oletusBLUNDERDB_ADDR, muuten:8080). Osoite ilman isäntää (:8080) tai yleisisännällä (0.0.0.0,[::]) tarkistetaan loopback-liitännän kautta.--timeout— Aika, jonka jälkeen tarkistus luovuttaa (oletuksena2s).
Tämä on komento, jonka konttikuvan HEALTHCHECK suorittaa (distroless-kuva, ilman curl-ohjelmaa); myös cmd/serve-hakemistosta käännetty serve-binääri ymmärtää sen. Se sopii yhtä hyvin skriptiin tai systemd-yksikköön.
Esimerkki:
./blunderdb serve --db base.db --addr 127.0.0.1:8080 &
./blunderdb healthcheck --addr 127.0.0.1:8080 && echo "démon disponible"
# ready
Epäonnistuessa syy tulostetaan, ja docker inspect näyttää sen unhealthy-tilassa olevalle kontille:
Error: healthcheck: http://127.0.0.1:8080/readyz answered 503 Service Unavailable (version_mismatch)
mcp — Tietokannan tarjoaminen tekoälyavustajalle
Tarjoaa tietokannan työkalut tekoälyavustajalle Model Context Protocol -protokollan kautta vakiosyötteen ja -tulosteen yli: avustaja käynnistää komennon. Työkalut hakevat asemia komentorivin kieliopilla, lukevat aseman ja sen analyysin, selittävät virheen, laskevat pelaajan tilastot, luettelevat ottelut, turnaukset ja kokoelmat sekä esittävät tietovisan kysymyksen. Ne vain lukevat, paitsi valitsimella --write. Täydellinen luettelo ja demonin HTTP-vastine: Työkalut tekoälyavustajalle (MCP).
./blunderdb mcp --db base.db [--write]
Valitsimet:
--db— Tietokantatiedosto (pakollinen).--write— Tarjoaa myös kirjoittavat työkalut: aseman tallennus, sen kommentointi, kokoelman luonti ja täyttö. Mitään ei poisteta.
Kuten call, komento siirtää vanhemman tietokannan skeeman avattaessa, myös ilman --write-valitsinta.
Esimerkki: tietokannan ilmoittaminen Claude Codelle.
claude mcp add blunderdb -- blunderdb mcp --db /chemin/vers/base.db
completion — Shell-täydennys
Tulostaa vakiotulosteeseen täydennysskriptin alikomentojen nimille. Jokaiseen skriptiin sisällytetty komentoluettelo generoidaan samasta taulukosta, jota myös blunderdb help ja main.go:n reititys (handlers()) lukevat: uusi alikomento tarjotaan siis täydennyksessä heti, kun se on kytketty, eikä mitään tarvitse ylläpitää käsin.
./blunderdb completion <bash|zsh|fish>
Esimerkkejä:
# bash
source <(blunderdb completion bash)
blunderdb completion bash | sudo tee /etc/bash_completion.d/blunderdb > /dev/null
# zsh : un répertoire déjà sur $fpath
blunderdb completion zsh > "${fpath[1]}/_blunderdb"
# fish
blunderdb completion fish | source
Paketit asentavat tämän automaattisesti: .deb/.rpm (nfpm) ja AUR-paketti tuottavat kolme skriptiä paketoidusta binääristä käännöshetkellä, ja Homebrew-cask suorittaa blunderdb completion <shell> kerran asennuksen yhteydessä komennolla generate_completions_from_executable. Mitään ei tallenneta arkistoon, joten täydennys ei voi koskaan poiketa alikomentotaulukosta.
version — Näytä versio
Näyttää blunderDB:n version ja tämän binäärin kirjoittaman tietokantaskeeman version; se on ensimmäinen asia, joka liitetään virheraporttiin.
./blunderdb version
# blunderDB version 0.36.0 (database schema 2.20.0)
Työnkulkuesimerkkejä
Turnaushakemiston tuonti
./blunderdb create --db tournoi_paris.db --user "Jean" --description "Open de Paris 2025"
./blunderdb import --db tournoi_paris.db --type batch --dir ./matchs_open_paris/
./blunderdb list --db tournoi_paris.db --type stats
Säännöllinen varmuuskopiointi
./blunderdb export --db production.db --type database --file sauvegarde-$(date +%Y%m%d).db
Virheiden analysointi
# Les positions délicates, puis celles de videau
./blunderdb search --db production.db --error-min 0.1 --export blunders.db
./blunderdb search --db production.db --decision cube --error-min 0.05 --export cube_errors.db
# Les coups réellement fautifs : au moins 100 millièmes d'équité perdus
./blunderdb search --db production.db --move-error-min 100 --format json
Paluukoodit
0— Onnistui.1— Virhe.
Tämä tekee CLI:stä sopivan käytettäväksi skripteissä virheenkäsittelyn kanssa:
if ./blunderdb import --db base.db --type match --file match.xg; then
echo "OK"
else
echo "KO"
exit 1
fi