Mėnesio pradžioje buvo išleista „Mūšio dėl Vesnoto“ 1.8 versija. Ši, šiaip jau eilinė, atvirojo kodo projekto laida man svarbi tuo, kad tai pirmasis pilnas leidimas nuo tada, kai prisijungiau prie vertėjų komandos.
Ta proga labiausiai noriu pasidžiaugti, kad per metus sutvarkėme visas pradedantiesiems skirtas kampanijas. Išvertėme jas iki galo, ištaisėme daug klaidų (tame tarpe ir originaliam tekste :-)). Daug darbo įdėjome ir kitur, nors išbaigtumu kol kas dar negalime girtis.
Bendros informacijos apie naujienas leidime čia nekartosiu, pasiskaitykite oficialiame skelbime: http://wesnoth.org/start/1.8/.
Norintys prisidėti prie vertimo ar pranešti apie klaidas, kontaktinę info ras čia:
http://wiki.wesnoth.org/LithuanianTranslation, čia: wesnoth-lt@googlegroups.com ir čia: #wesnoth-lt @ irc.FreeNode.net
Didelis dėkui projekto koordinatoriui Andriui Štikonui, bei kolegoms vertėjams Mariui Taubai ir Jurgiui Sūdžiui. Taip pat dėkui visiems, kas teikė siūlymus probleminiams atvejams -- jūsų per daug, kad visus išvardinčiau :-)
Malonaus žaidimo!
Ilgai neprisiruošiau atlikti reikiamų darbų, bet vakar sutapo reikiama nuotaika su dar kažkuo, ko tam reikia, ir nusipirkau domeną, beigi perkėliau turinį pas jago.
Štai jis: http://www.rtfb.lt/.
Ačiū Ilzei, kurios džiaugsmas dėl ekvivalento buvo dalis to „dar kažko“, ko man trūko, kad prisiruošt :-)
Senasis rtfb.gamedev.lt kol kas dar irgi veikia, bet tik kol sutvarkysiu visus reikiamus „page has moved“.
Scenoje vėl Redmondo rastamanai. Šįkart jų čempionai, Windows Installer komanda.
Citata iš dokumentacijos (apie reliacinės bazės stulpelį):
===============================================================
Display (type Integer)
----------------------
The number in this field specifies the order in which the
feature is to be displayed in the user interface.
The value also determines whether or not the feature is
initially displayed expanded or collapsed. If the value is null
or 0 (zero), the record is not displayed.
* If the value is odd, the feature node is expanded initially.
* If the value is even, the feature node is collapsed initially.
===============================================================
(http://msdn.microsoft.com/en-us/library/aa368585(VS.85).aspx)
Gražu, ar ne? Ėmė ir sukišo nesusijusius parametrus į vieną skaičių. Matyt, taupo baitus. Windows Installeryje. Ha ha!
Bet čia nieko. Sunku patikėti, bet tai yra gėlytės, lyginant su tikru perlu. Toliau kalba eina apie kitą lentelę, Signature, su kurios pagalba galima sistemoje ieškoti, ar yra jums reikalingas failas. Pvz., ar yra .NET'as ir kokia jo versija. Viskas puiku, viskas faina. Bet štai padarai, ir neveikia. Tada žiūri kodėl ir randi šitokį siurprizą (skaitykit atidžiai):
===============================================================
Languages (type Text)
---------------------
The languages supported by the file.
MinVersion (type Text)
----------------------
The minimum version of the file, with a language comparison.
If this field is specified, then the file must have a version
that is at least equal to MinVersion. If the file has an equal
version to the MinVersion field value but the language specified
in the Languages column differs, the file does not satisfy the
signature filter criteria.
Note: The language specified in the Languages column is used
in the comparison and there is no way to ignore language. If you
want a file to meet the MinVersion field requirement regardless
of language, you must enter a value in the MinVersion field that
is one less than the actual value. For example, if the minimum
version for the filter is 2.0.2600.1183, use 2.0.2600.1182 to find
the file without matching the language information.
===============================================================
(http://msdn.microsoft.com/en-us/library/aa371853(VS.85).aspx)
Дорогая редакция, я фалломорфируюсь. Mėgstu sakyti, kad aš irgi noriu tokios žolės, bet šiuo atveju, tai nu ir nafig, tokio šūdo aš nerūkysiu.
Neapsiimsiu aiškinti kas čia negerai. Kad apsakyti tai žodžiais, reikia būti poetu. Ir dar, ko gero, rašyti klasikine kalba ir hegzametru. Na, jūs suprantat kur lenkiu.
Jeigu kažkam iš skaitytojų neprogramuotojų neaišku apie ką aš čia, patikėkite mano žodžiu, tai tas retas atvejis, kai palaimintas tas, kuris sėdi ir karpo ausimis nieko nesuprasdamas. Tikrai. Žmogų, be daugelio metų dvasinių treniruočių, staiga suvokusį šito kretinizmo mastą, gali ištikti nihilizmo priepuolis.
O programuotojams tema pamąstymui: jeigu komanda, kuri daro vieną iš core OS komponentų, sugeba paleisti į productioną šitokį kolosalaus masto mėšlą, ką galima manyti apie bendrą to komponento kokybę? Ar galima daryti prielaidą, kad kiti, į proto ribas telpantys, to komponento aspektai, yra geresni tyčia, ar taip gavosi nesąmoningai? Ir svarbiausia, kaip jaustis vartotojui, kuriam pateikiamas softas yra pošlykštis dėl to, kad pastatytas ant mėšlo krūvos, kuriai nepateikiama alternatyva?
Mieli kolegos, susimildami, būkit geri, nevartokite darbe svaigalų...
Vakar darbe pabaigiau vieną darbelį ir prieš dėdamas jį į revizijų kontrolę, nusprendžiau pabūti doras ir padaryti tai, ką mes vadinam TMR: Total Massive Rebuild. Tai veiksmas, kai perkompiliuoji visai visą produktą, kad įsitikinti, kad niekam nieko nesugadinai.
Nu cvs up, nu make clean, nu make all. Įprasti dalykai. Kompiliuojasi.
Tik kompiliuojasi neilgai, sustoja, nes sugriūna kažkuris unit testas. Galvoju, WTF? Bet aiškintis neturėjau laiko, tai užsiėmiau tuo šiandien.
Gana greitai išsiaiškinu kodėl griūna testas -- kolega neseniai padarė pakeitimą, visai gerą pakeitimą, dėl kurio šita problema ir turi išlįsti, o ne tyliai likti praignoruota. Viskas lyg ir tvarkoj. Bet vienas dalykas netvarkoj -- o kodėl *man* išlenda šita klaida, o kitiems ne?
Padebuginus paaiškėja, kad nesuveikia štai toks kodas:
mkdir ("%TEMP%/sub1/sub2/sub3/.../sub28/sub29");
(Tik vietoj %TEMP% ten buvo tikras kelias į temp direktoriją: C:\Users\Vytautas.Saltenis\AppData\Ir\Dar\Kažkas\Nepamenu\Kas\. Nu ir, aišku, vietoj daugtaškio visi trūkstami sub-sub-sub.)
Įtarimas aiškus -- kažkodėl viršija MAX_PATH. Betgi nusikopijuojam tą eilutę, pamatuojam jos ilgį ir matom, kad ne, neviršija. Jos ilgis 248. Va šitoj vietoj prasideda kondicija "O-ba...".
Pirma mintis: gal aš neteisingai atsimenu kiek yra MAX_PATH? Pasitikrinu, 260. Reiškia teisingai, ne tas...
Tada tikrinam klaidos kodą. errno po mkdir() būna 2, kas yra ENOENT, ką dokumentacija iškilmingai išaiškina: "Path was not found.". Blet. Koks dar not found? Aš gi sukurti bandau!
Gūglinam kaip ant Vindauso padarytas mkdir(). Randam, kad ten jis yra plonas wrapperis ant CreateDirectory() -- "gerai bent tiek, o ne atskira realizacija", spėju pagalvoti.
OK, tad kaipgi galima priversti CreateDirectory() nesuveikti? Ten yra kažkoks antras parametras, kažkas su security, gal ten kažkas ne taip? Nu, debuginam visaip kaip išsijuosę, ir žiūrim, kad mkdir() padarytas maždaug va taip:
int mkdir (char *path)
{
return CreateDirectory (path, NULL);
}
Blyn. Nu irgi nėra kam nesuveikti... Nebent tas NULL 20 metų veikė, o dabar neveikia. Vėjai.
Bet čia eiga pasisuka link atomazgos, prieinama prie CreateDirectory() dokumentacijos. Paskaitom prierašą prie pirmo parametro, ir liekam "в охуе":
"There is a default string size limit for paths of 248 characters. This limit is related to how the CreateDirectory function parses paths."
Bingo! Pasirodo, visgi susidūriau su limitu, pasiaiškinam kodėl kiti nesusidūrė, pataisom ir ilgai ir laimingai gyvenam. Boring.
The *fun* part! Kuo galvojo tas senovinis Microsoft darbuotojas, kuris parašė CreateDirectory()? Ar jis išvis galvojo? Ne, nu rimtai. Gaunasi taip: mūsų sistemoje apribojimas kelio ilgiui yra 260, bet aš chujovas programuotojas, dėl to nemoku suprogramuoti taip, kad būčiau suderinamas su likusia sistema ir padarysiu 248 ir dokumentacijoje parašysiu, kad aš chujovas programuotojas. Rimtai, taip išeina. Paskaitykit dar kartą citatą iš dokumentacijos:
"There is a default string size limit for paths of 248 characters. This limit is related to how impaired was the original author of CreateDirectory."
Pakalbam apie tai su kolegomis, pažvengiam, aptariam, paspėliojam kodėl 248, o ne 246, kodėl išvis yra toks MAX_PATH ir kodėl jis 260, o ne 256 ir pan... Linksmiausia išsakyta versija tokia: o nefig tau kurti direktorijos, į kurią paskui netilps 8.3 failas! Dėl to ir MAX_PATH - 12 = 248. Skamba įtikinamai ;-)
Akylesni skaitytojai gal pastebėjo ir iki šiol nesupranta kodėl gi man neveikė? Juk mano kelio ilgis buvo 248, ir funkcija priima 248. Turi veikti. Cha cha! Nieko jūs nesuprantat! Chujovą funkciją reikia ne tik chujovai suprogramuoti, ją paskui dar reikia ir chujovai dokumentuoti! Kitaip gausis tik pusiau chujova funkcija. Iš tikro jinai veikia su keliais iki 247 simbolių ilgio imtinai, o dokumentatorius parašė kokio dydžio buferis ten viduje naudojamas keliui kartu su terminuojančiu nuliu laikyti.
Atrodytų, tokia vat nuotaikinga istorija. Ir maniau, kad toliau jau nėra kur, kad čia viršūnė. Nope, naivu. Betvarkydamas mūsų kodą, užklydau į kitos įdomios funkcijos GetTempFileName() dokumentaciją. Skaitom pirmo parametro aprašymą:
"The directory path for the file name. [...] The string cannot be longer than MAX_PATH–14 characters or GetTempFileName will fail. If this parameter is NULL, the function fails."
Uch ty! Štai jums ir 246! Man dabar baisu į gūglą įvesti "MAX_PATH - 17", bijau, kad ką nors suras :-)
Beje, plika akim tai sunkiai įžiūrima, bet ten dokumentacijoj parašyta ne "MAX_PATH-14". Rimtai, nejuokauju. Ten ne minusas, ten tipografinis brūkšnys, "En dash" vadinasi. Ir jeigu nukopijuosi tą daiktą į kodą, gausi keistų pranešimų nuo kompiliatoriaus, versijų kontrolės sistemos ir kitų "suinteresuotų šalių".
Va taip vat. Pyzdėc, gerbiamieji Redmondo programuotojai. Pyz-dėc.
Upė šaltuonėlė -
Mano Širvinta.
Rudenio lapelių
Mirga priberta...
Nei ji mano, nei čia ta Širvinta, apie kurią rašė Salomėja, bet who cares?! I can haz poytree in meblog :-). Užtat šaltuonėlė. Kyzdėc kokia šaltuonėlė. Taip kardinaliai sušalęs dar turbūt gyvenime nebuvau.
Bet apie viską nuo pradžių.
Važiavom iš vakaro, kad išvengti rytinio chaosėlio. Nakvojom ne starto taške, o kažkur prie Musės, ten patogi stovyklavietė. Nors didžioji plaukikų dalis ir jungėsi ryte -- nakvojom tik keturiese: aš, jago, Pofkė iš Upių Labirinto (org) ir Jakas.
Pirmas dalykas ne pagal kanonus, ką padarėm, buvo dar besipakuojant dalykus:
„Jago, palatkių neimam, ane?“
„Ajo, galim neimt“.
Tai neėmėm :-). Mes su jago išbandinėjom neseniai „išrastą“ miegojimo būdą baidarėje su palapinskraiste, o Pofkė išvis miegojo va taip:

Taigis, 3/4 miegojo po atviru.
Kitas pokštas, kurį nusprendžiau priparkuoti prie pirmojo sekė iš to, kad jeigu jau miegoti po atviru prie ~nulio, tai reikia pasirūpinti, kad miegoti būtų šilta, ar ne? Teisingai! Vadinasi, žieminio miegmaišio neimam, imam vasarinį ir žiūrim, ar gerai miegasi su vasariniu ir pora megztinių ;-). Paaiškėjo, kad su mano Campusu „Light 100“, kurio komfortinė temperatūra +9, prie žadėtų -2 (kiek buvo iš tikro, nežinau) miegasi visai komfortiškai; šalta buvo tik kojoms žemiau čiurnų.
Pamiegojom (tiesa, mažokai), atsikėlėm, pavalgėm, nuvažiavom startuot. Įdomiausia buvo persirenginėti sningant. Startavom.
Upė džiugino ir nedžiugino pamainom. Ten kur džiugino, ten faina, ten kur nedžiugino, tai nuobodu iki mirties. Mat vanduo gana pakilęs ir ten, kur ne slenksčiai, atrodo vos ne kaip Neris ties Vilniumi. Kartkartėm užplaukus pašiaušto vandens ruožą, buvo smagu pirmą kartą normaliai išsibandyti naująjį laivą -- susigalvoti slalomą per ruožą, apiplaukti „va ten“, o ne kur patogiau ir panašiai. Dar kartą patiko laivo manevringumas.
Pagrindinė plaukimo bėda buvo žema temperatūra, praktiškai nenustojantys lietus, šlapdriba ir sniegas. Na ir kad būtų ne per lengva, priešpriešinis vėjas. Sumoje tai sukėlė gerokai netikėtą patyrimą, kad vos per kelias valandas mūsuose įmanoma sušalti į ožio ragą. Taip, kad net kaulų čiulpai pradėjo kristalizuotis, nepaisant visai pusėtino apsirengimo.
Vaizdas prieš pat startą:

O čia aš po finišo, šildausi ant primuso:

Pailsėjau gamtoje su draugais. Dabar kurį laiką plaukti nebenorėsiu ;-). Įdomiausia tai, kad nesusirgau. Gal dar ir ankstoka girtis, dar tik para su kableliu praėjo, bet jau turiu vilties, kad bent jau paukščių gripo nepasigavau :-).
З.Ы. Adi, Bilbai, šiknon jūsų „mėgstu, kai šalta“! Nieko asmeniško. Tiesiog jūs nežinot ką reiškia šalta. Kai praėjus ~6val po upės, sėdi pirty, su drabužiais, geri karštą arbatą ir vis dar krečia šaltis, va čia yra Šalta!