Closed gpetho closed 2 years ago
Probléma: Ha egy korpusz az utasításoknak megfelelően le lett fordítva
make compile
-lal, utána a felhasználó módosítja akár a korpusz konfigurációs fájlját, akár a vertical fájlt, a felhasználó azt várná, hogy amake compile
újbóli futtatása újragenerálja simán a korpusz indexét. Ezzel szemben nem ez történik, hanem ha már kész indexszel rendelkező korpuszra futtatjuk újból amake compile
-t úgy, hogy közben változtattunk akár a konfiguráción, akár a korpuszon magán, akkor az vagy leáll egy semmitmondó hibaüzenettel, vagy hibaüzenet nélkül lefut ugyan, de nem frissíti a korpuszt.
Ezzel egyetértek, hogy nem jó így. Köszi, hogy szóltatok!
Javasolt megoldás: A
make compile
távolítsa el a már létezőcorpora/*/indexed
alkönyvtárakat.
Ezzel már nem értek egyet.
A következő esetet szeretném ha működne:
A jelenlegi megoldás, minden indexet törölni fog, ami nem jó.
Tehát, az elvárás (mint az rm
parancs):
Paraméterek:
Működés:
Mindezt a compile.sh-n belül, nem a Makefileban. Ha a feldolgozás bármely pontján nincs 0-ás exit code, akkor ott álljon meg hibával.
Ha ezt tudod ebbe a branchbe implementálni, akkor elfogadom. Ha nem, akkor ezt a PR-t lezárom nyitok egy issue-t és valamikor, amikor lesz időm, megcsinálom.
(A compilecorp
-nak van --recompile-corpus
opciója, ami itt kellhet. Vö:
make execute CMD="compilecorp --recompile-corpus --no-ske CORPUS_REGISTRY_FILE"
.)
Két kérdés:
--recompile-corpus
gyorsabb mint a sima kompillálás?--recompile-corpus
-nál? (Ha attól még lekompillálja, akkor az fél siker, ha hibát dob, az kár.)Értem, hogy mi zavar az általam javasolt megoldásban, de pontosan az általad leírt esetről:
A következő esetet szeretném ha működne:
* Van egy nagy korpuszom, amit jó sok óra alatt lekompilláltam. * Vannak más korpuszok, amiket lekompilláltam. * A más korpuszok egyikén módosítottam, szeretném újrakompillálni. * Nem akarom a jó sok óra alatt újrakompillált nem módosult korpuszt törölni és újrakompillálni. * Nem akarom, hogy hibás állapot legyen, mert ott vannak az indexek, ahol újra akarjuk kompillálni a korpuszt.
szól a README.md
-ben a make compile
alatti alpont, amit módosítottam a leírt problémának megfelelően ebben a pull requestben így (nem tudom, hogy ezt olvastad-e):
- Compile all corpora listed in
corpora/registry
directory using the docker image:make compile
- To compile one corpus at a time, use the following command:
make execute CMD="compilecorp --no-ske CORPUS_REGISTRY_FILE"
- If you want to recompile a single corpus after either the configuration or the vertical files of that corpus have been modified, the root-owned
indexed
subdirectory that was generated in the course of the previous compilation should be removed before recompilation, e.g.sudo rm -r corpora/susanne/indexed/
. (This is done automatically for all corpora bymake compile
.) If this subdirectory is not removed, the compilation will likely fail with an unhelpful error message, or the index will not be generated as expected.
Tehát ha a dokumentációnak megfelelően jár el a felhasználó, akkor szerintem nem léphet fel az a probléma, amit leírsz.
Igazából az egész történetben a lényeg az, hogy a felhasználó tudjon egyáltalán arról, amit az "If this subdirectory is not removed..." kezdetű mondatban írok, mert ez a jelenlegi dokumentációból egyszerűen nem derül ki, és az ember alapból nem számít rá, hogy erre szükség van. Az, hogy a make compile
töröl-e bármit vagy nem, az szerintem nagyjából mindegy, a "biztonság kedvéért töröljünk mindent" egyszerűen az idiótabiztos megoldás. Minden más (ellenőrzés, figyelmeztetés, -f) igazából kényelmi funkció, ami persze nem baj, ha ott van, de a lényegen nem változtat.
Tehát ha a dokumentációnak megfelelően jár el a felhasználó
Bocs, ennél én paranoiásabb vagyok. :) Kell még biztosíték.
Ez a sor 1:1 ellentmond az én elvárásomnak.
ez a jelenlegi dokumentációból egyszerűen nem derül ki, és az ember alapból nem számít rá, hogy erre szükség van.
Ez külön hiba. A dokumentációé. Ezt javítani kell. Ebben egyetértünk.
Az, hogy a make compile töröl-e bármit vagy nem, az szerintem nagyjából mindegy, a "biztonság kedvéért töröljünk mindent" egyszerűen az idiótabiztos megoldás.
Én overkillnek érzem a dolgot. Ha rá tudna kérdezni a törlés előtt, akkor az olcsóbb, mint újrakompillálni egy korpuszt tévedés esetén. Valamint a recompile vs. törlés kérdéskörben a recompile pártján állok. Főleg ha gyorsabb a recompile mint a sima.
Az is egy álláspont, hogy a compile simán hibát dob, ha nem tiszta a corpora mappa. A custom dolgokat meg execute-tal oldja meg, aki akarja. Még az is belefér nekem, hogy mindent legyalul a corpora mappában a compile, de előtte kérdezzen rá, hogy tényleg ezt akarod? (Én inkább olyan esetet tudok elképzelni, ahol valószínűleg nem.) A "módosítottam egy korpuszon"-ra meg ott az execute+recompile, nem?
Dolgozom rajta.
Addig is:
Valamint a recompile vs. törlés kérdéskörben a recompile pártján állok. Főleg ha gyorsabb a recompile mint a sima.
A te repód, a te döntésed, de ha engem kérdezel, a recompile csak akkor jobb, mint az explicit és átlátható törlés és compile, ha gyorsabb. A törlés ugyanis sudót kér, és ha átírjuk úgy, hogy sudo rm -vr $(wildcard corpora/*/indexed/)
, akkor fel is sorolja, hogy mit akar törölni. Szerintem nem életszerű, hogy erre a felhasználó úgy írja be az adminjelszót, hogy igazából nem akarta volna törölni. Én amikor belefutottam ebbe a problémába, éppen azért meg sem próbálkoztam az indexed törlésével, mert írásvédett volt, és ezt csak akkor léptem meg, amikor sehogy máshogy nem sikerült megszabadulni a hibaüzenetektől. (A recompile kapcsolókat nem sikerült akkor megtalálnom a dokumentációban.) Ezzel szemben ugyanakkor a dockerben futtatáshoz, ezen belül a recompile-hoz sudo sem kell az alapértelmezett beállítások szerint. Erre szerintem érdemes gondolni mint szempontra.
Ez a sor 1:1 ellentmond az én elvárásomnak.
Értem, rendben, kiveszem, bár lásd az előző észrevételt.
A "módosítottam egy korpuszon"-ra meg ott az execute+recompile, nem?
Persze, ott lenne, ha lenne, de jelenleg nincs. Execute van csak recompile nélkül, ami nem csinál semmit, ha már megvan az index. Berakok egy figyelmeztetést a compile-ba és egy külön recompile célt a Makefile-ba.
Teszteltem egy 10 millió tokenes korpuszon.
A
--recompile-corpus
gyorsabb mint a sima kompillálás?
Nem, pontosan ugyanannyi idő alatt fut le.
Ha nem volt előzőleg lekompillálva, akkor mi történik a
--recompile-corpus
-nál? (Ha attól még lekompillálja, akkor az fél siker, ha hibát dob, az kár.)
Ahogy az előző alapján várható is, nincs hiba, de még üzenet sem. Simán lefut.
Módosítottam a pull requestet úgy, hogy azt csinálja, amiről szó volt.
make compile
nem töröl és nem is ír felül semmit, csak figyelmeztet, hogy a már lefordított korpuszt nem fogja módosítani, és használjuk helyette a make recompile
-t.make recompile
szabály a --recompile-corpus kapcsolót használja, így felülírja a korábbi indexeket, és szintén figyelmeztet előtte. Ennek a célja az lenne a szándékom szerint, hogy talán kényelmesebb és világosabb, mint az előző make execute
-os megoldás.make execute
funkciója furcsán volt leírva, erre javasoltam egy módosítást.make compile
-hoz kapcsolódó korábbi módosításaimat töröltem, csak egy figyelmeztetést tettem be, hogy ez már lefordított korpuszokra nincs hatással.make recompile
.Mindkét szabály megerősítést kér a felhasználótól ennek a megoldását innen vettem: https://stackoverflow.com/questions/47837071/making-make-clean-ask-for-confirmation. Ez csak y
válaszra megy tovább, bármi másra hibaüzenettel (make: *** [Makefile:73: recompile] Error 1
stb.) megszakad. Szebb lenne hibaüzenet nélkül, de ahhoz nem vagyok elég ügyes, hogy ezt megoldjam. Említetted, hogy jó lenne egy force kapcsoló arra, hogy ne kérdezzen, ha nem szeretnénk. Erre sincs jó ötletetem, hogy ezt hogy lehetne technikailag jól megcsinálni, ezért ezt kihagytam.
Teszteltem egy 10 millió tokenes korpuszon.
A
--recompile-corpus
gyorsabb mint a sima kompillálás?Nem, pontosan ugyanannyi idő alatt fut le.
Megnéztem és a compilecorp
-ban (ami egy shell script) pontosan abban különbözik a --recompile-copus
-szal és nélküli futtatás, hogy törli-e a megfelelő index fájlokat előzőleg vagy nem.
Olykor nem árt a forráskódot is megnézni, ha már nyílt forrású a program. Ez pl. fényt derít arra, hogy nézi a program az index fájlok utolsó módosítását és warningot ad, ha úgy látja, hogy régebbiek, mint a forrás vertical fájlok. Mivel a docker UTC időben fut valószínűleg nem fogja észrevenni a magyar idő szerinti változást.
Ha mégis észrevenné, akkor a --recompile-copus
opció használatát javasolná.
Tehát azt gondolom, hogy
compile.sh
-n belül legyen default a --recompile-corpus
, mert ártani nem árt, de legalább megold egy sor nem kezelt problémát.compile.sh
-n belül vizsgálja meg, hogy van-e kompillált korpusz, ha van akkor szóljon, hogy mindent újra fog kompillálni igen/nem? És hogy az egyes korpuszok kompillálásához pedig milyen parancsot kell hasznáni. Ezen kívül legyen egy FORCE_RECOMPILE
változó, ami ha létezik és nem üres, akkor az egyenlő az igen válsszal. (Így a Makefile-on nem kell változtatni.)Ami a README.md-t illeti:
Az execute
pontosítást köszönöm!
A make recompile
helyett maradjon a mostani módszer. Esetleg említsd meg a --recompile-corpus
opciót.
A FORCE_RECOMPILE
-t vezesd be Bálint táblázatába, kérlek.
Megj.: Ha ragaszkodsz a sed
-hez, akkor: sed 's#^corpora/\([^/]*\)/indexed/$#\1#'
A && read ans && [ $${ans:-N} = y ]
szép találat! :)
Tehát azt gondolom, hogy
A
compile.sh
-n belül legyen default a--recompile-corpus
, mert ártani nem árt, de legalább megold egy sor nem kezelt problémát.A
compile.sh
-n belül vizsgálja meg, hogy van-e kompillált korpusz, ha van akkor szóljon, hogy mindent újra fog kompillálni igen/nem? És hogy az egyes korpuszok kompillálásához pedig milyen parancsot kell hasznáni. Ezen kívül legyen egyFORCE_RECOMPILE
változó, ami ha létezik és nem üres, akkor az egyenlő az igen válsszal. (Így a Makefile-on nem kell változtatni.)Ami a README.md-t illeti:
Az
execute
pontosítást köszönöm! Amake recompile
helyett maradjon a mostani módszer. Esetleg említsd meg a--recompile-corpus
opciót. AFORCE_RECOMPILE
-t vezesd be Bálint táblázatába, kérlek.
Igen, ez ésszerű megoldásnak tűnik.
Az én feladatom az volt, hogy jelezzem a problémát; az fakultatív volt, hogy meg is oldjam. Biztos tanulságos lenne átírni így a compile.sh
-t, de ezzel most nincs kedvem több időt tölteni, tehát utasítsd el nyugodtan azokat a részeit a pull requestnek, amiket visszalépésként ítélsz meg a korábbihoz képest, és zárd le így. Ha valamikor unatkozom, és addig nem csinálja meg más, akkor visszatérek majd rá.
Az egészben az egyetlen lényeges pont számomra továbbra is az, hogy a dokumentáció szóljon, hogy a compile nem működik már lefordított korpuszra. Ha ez megvan, én alapvetően boldog vagyok.
@sassbalint kérte, hogy jelezzem az alábbi problémát, és javasoljak rá megoldást.
Probléma: Ha egy korpusz az utasításoknak megfelelően le lett fordítva
make compile
-lal, utána a felhasználó módosítja akár a korpusz konfigurációs fájlját, akár a vertical fájlt, a felhasználó azt várná, hogy amake compile
újbóli futtatása újragenerálja simán a korpusz indexét. Ezzel szemben nem ez történik, hanem ha már kész indexszel rendelkező korpuszra futtatjuk újból amake compile
-t úgy, hogy közben változtattunk akár a konfiguráción, akár a korpuszon magán, akkor az vagy leáll egy semmitmondó hibaüzenettel, vagy hibaüzenet nélkül lefut ugyan, de nem frissíti a korpuszt.A hiba a következőképpen reprodukálható a legegyszerűbben:
corpora/registry/emagyardemo
fájlt úgy, hogy eltávolítjuk az utolsó sort (STRUCTURE s
), mert elfelejtettük beletenni, amikor összeállítottuk a korpuszunkat.make compile
STRUCTURE s
sort, beletesszük (azaz visszatesszük) a konfigurációs fájlba.make compile
megszakad az alábbi hibaüzenettel:Javasolt megoldás: A
make compile
távolítsa el a már létezőcorpora/*/indexed
alkönyvtárakat.