Blogity blog blog


Igrekas

2018-03-04, rtfb

Šiandien nelygioje kovoje prieš Wikipediją krito viena iš neįmintų vaikystės mįslių. Nežinau kaip jums, o man nuo pat šeštos klasės (ar kada ten?) buvo visiškai nesuprantama kodėl matematikoje raidė ‘y’ vadinama igreku. Kaip ir aišku, kad kažkoks toks ištarinys, palengvinantis raidės tarimą garsu. Kaip ir iksas, zet ir panašūs. Nu bet kodėl būtent toks keistas žodis, niekaip negalėjau atspėti, o paaiškinti niekam nepasirodė reikalinga1.

Atradimo džiaugsmą itin didina tai, kad atradimas įvyko neieškant, jis pats mane atrado, ir visiškai neperspėjęs iššoko prieš akis.

Maintaininu aš sau ramiai vieną tokią biblioteką. Ateina žmogus, užrašo man bugreportą, kad prancūzų kalboj ten kažkaip kažką, labai keistai ten pas juos. Duoda nuorodą į Wikipediją, kur kruopščiai skundžiamasi, kad pas juos labai keistai, ir kad niekas kitas to nesupranta ir neužjaučia.

Paskaitau aš kaip ten pas juos viskas prancūziška, tada paskrolinu straipsnį aukštyn, kad pažiūrėti ko ten dar yra, ir bam, atskrolinu lentelę su prancūzų abėcėle, o iš ten ilgom šviesom šviečia:

Letter Name Name (IPA) Diacritics and ligatures
Y i grec /iɡʁɛk/ Ÿÿ

i grec!. Graikiška i! Toliau beliko tik pasitikslinti ar teisingai supratau. Ir atrasti nuorodą, kad kaip minimum dar pas olandus taip pat vadinasi.

O paskui dar radau, kad čia ne pačių prancūzų išmislas, o paveldėtas reikalas:

In Latin, Y was named I graeca (“Greek I”), since the classical Greek sound /y/, similar to modern German ü or French u, was not a native sound for Latin speakers, and the letter was initially only used to spell foreign words.

Toksai vat mažytis dienos džiaugsmas, TIL’as.


  1. To be fair, aš pirmąsias pamokas praleidau, ar tai sirgau, ar tai kažką ten, tai gal mums ir buvo paaiškinta, bet aš to negirdėjau.

 

da Vinci Jr. 1.0

2017-05-06, rtfb

Užpraeitą savaitgalį, vedamas netikėto impulso, nusipirkau 3D printerį.

Gavosi vienas iš tų atvejų, kai pagiringas nusiperki daiktą, kurį blaivas pirkti vis susilaikai. Nu beveik. Iš tikro tai tiesiog pataikiau pasižiūrėti ką siūlo Topo Centras kaip tik tuo metu, kai jie paleido 40% nuolaidą. Tai negi nepirksi?

Žodžiu, nusipirkau, ir skubiai, kol niekas iš po nosies nenukosėjo. Ir čia, aišku, prasidėjo nuotykiai. Mat aš gi linuxistas. O mūsų poreikius, kaip žinia, daug devaisų gamintojų mėgsta ignoruoti. Tai spėkite, ar turi tie XYZ Printing kokio nors softo Linuxui? Aaa, a vot ir neatspėjote… Turi. Kažkokį ten XYZmaker.

Su juo pirmiausia buvo bėdų, kad aš jo neradau. Mat jie savo internete rašo kažką apie Linux version, bet kažkodėl tas tekstas nėra hyperlinkas ir besiblaškant aš ilgai negalėjau rasti kur jį nudownloadinti. Vėliau radau, bet vėliau.

Pradžioj, galvoju, kol aš ten blaškausi su tuo softu ir aplinkui, lai jis spausdina ką nors daugiau, nei prikomplektuotas sample’as. Paprašiau Lauros duot pavarinėti vienintelį namuose Windowsinį kompą, bet ten irgi ištiko bėdutė: tame kompe Vista, o jų softas sukasi ant .NET 4, o .NET 4 ant Vistos jau nebesiinstaliuoja. Snap.

Žodžiu, bevakarėjant šeštadieniui mane bandė imti panika, kad gal bus embarrassmento vežti tą gargarą grąžinti, nes nepavyks užmegzti su juo ryšio. Bet sekmadienį reikalai pasistūmėjo.

Pirmiausia, radau kur parsisiųsti tą XYZmaker’į ir jis man ant Linuxo pasileido. Jėėė! Bet printerio jis man nematė. Būūū! Laimei, printeris moka spausdinti ir iš SD kortelės. Tai jau eksportavimui printerio nematymas turėtų netrukdyti, ane? Turėtų, bet kažkodėl trukdo. Eksportuoja, eksportuoja, progress baras kažkoks bėga, bet galų gale failo kažkodėl nepagamina. Oh well. Reikės pareportinti jiems šitus bugus, bet dar neprisiruošiau.

Žodžiu, fakapiškės, bet galų gale pavyko sukonstruoti toolchainą, kuris man veikia nuo braižyklės iki printo. Tai čia aš ir baigsiu bėdavotis apie bėdas ir papasakosiu kaip dalykai veikia, kai jau veikia.

Pradėkime nuo to, kad braižyti aš nemoku. Todėl braižymui aš naudoju OpenSCAD. Labai geras daiktas tokiam kaip aš, nes leidžia brėžinį aprašyti tekstu, kur aprašinėji paprastas figūras ir darai su jomis transformacijas. Maždaug šitaip:

$fn=96;
difference() {
    union() {
        translate([-1.2, -1, 0]) {
            sphere(2);
        }
        translate([1.2, -1, 0]) {
            sphere(2);
        }
        rotate([-90, 0, 0]) {
            cylinder(h=8, r=1.2);
        }
        rotate([-90, 0, 0]) {
            translate([0, 0, 8]) {
                cylinder(h=1.5, r1=1.5, r2=0.5);
            }
            translate([0, 0, 7.8]) {
                cylinder(h=0.2, r=1.5);
            }
        }
    }
    translate([-4, -10, -2.5]) {
        cube([8, 20, 2]);
    }
}

Tada surenderini, pasižiūri ar gavosi tai, ko norėjai ir galima eksportuoti į keletą daugiau ar mažiau paplitusių formatų.

Toliau tą formatą (aš renkuosi .stl) reikia paversti į printeriui suprantamą formatą, .gcode1. Tai daroma su slicinimo softu. Aš pirmiausia pabandžiau tokį softą Cura ir jis man suveikė, tai kol kas prie jo ir likau, kito dar nebandžiau.

Cura yra kažkoks didelis softas, kuris daug visko moka, bet aš jame bukvaliai tik atsidarau .stl failą ir išeksportuoju .gcode, daugiau nieko. Tiesa, kad teisingai suslicinti, jam reikia žinoti printerio parametrus, o by default Cura XYZ printerių nepalaiko, dėl to čia susiradau instrukcijas kaip susikonfigūruoti (dar galima rasti čia). Dar reikėjo čia susirasti kur reikia pasidėti tuos printerių definitionus ant Linuxo ir mano konkrečios Cura versijos.

So. Mažumėlę pasikrušus, turim .gcode failą. Galima spausdinti? Ne. Mat XYZ printeriai nesupportina .gcode failų ir turi kažkokį savo proprietary formatą .3w. Įdomu tai, kad tas .3w nėra joks ten proprietary formatas, o yra lygutėliai tas pats .gcode, tik prieš tai užšifruotas AES šifru su fiksuotu slaptažodžiu. Be menkiausios abejonės, internetai tą slaptažodį žino.

Tad sekantis žingsnis yra pasileisti https://gitlab.com/anthem/py-threedub ir konvertuoti iš .gcode į .3w. threedub moka ne tik konvertuoti failus, bet ir bendrauti su pačiu printeriu, ir jam netgi geriau sekasi, nei tam XYZmaker, bet visgi ne iki galo. Kai pasiunčia printeriui job’ą, printeris kažkodėl nemato to job’o pabaigos. threedub jau baigė siųsti ir daugiau nieko nebesiunčia, o printeris nejaučia EOT ir rašo, kad vis dar waiting for the job. Čia irgi reikės pasiaiškinti, gal teks kokį bugą pataisyti ar pareportinti. Bet man kol kas pakanka failo konversijos ir spausdinimo iš SD kortelės.

Lo and behold! pirmas printas padarytas:

bibis

Printas akivaizdžiai savievidentualiai dedikuojamas nelygioje kovoje prieš offlainą kritusiam internetų herojui Mykolui Kleckui :-)

Ir beje, tas OpenSCAD kodo gabalas kur aukščiau rodžiau, yra šito printo sorsas. Tai galit reproducinti jeigu užpageidausit :-)

Tas printeris, beje, turi ir daugiau cirkų, bet šiai dienai gal užteks.


  1. Dideliausiam mano nustebimui, G-code yra ne koks nors ten dvimpirmam amžiuje printeriams sukurtas formatas, o gūdžiam šeštam dešimtmetyje MIT sukurtas formatas automatizuotiems įrankiams valdyti.

 

Dependensų bootstrapinimas su Go

2014-12-13, rtfb

Mėgstu programuoti Go. Dar mėgstu nedaryti rankomis to, ką turėtų daryti kompiuteris. Todėl šiandien parodysiu kaip neseniai suderinau šitus du gerus dalykus vienoje kombinacijoje, kurios nauda viršija dedamųjų sumą.

Kas per daiktas yra Go jau turbūt nereikia pasakot, visgi jau penki metai praėjo ir pakankamai buzzo nubuzėjo. (O pakol aš šito rašinio draftą voliojau, tai net ir 1.4 versiją išleido :-)). Tik paminėsiu, kad kuriant šitą kalbą, vienas iš tikslų buvo padaryti ją toolable, t.y. tokią, kuriai lengva rašyti įrankius.

Iš to išplaukia visokie malonūs, iš pirmo žvilgsnio nebūtinai akivaizdūs efektai. Pvz., Go kalboje nesiginčijama apie kodo formatavimą. Nes yra (standartinis) įrankis go fmt, kuris suformatuoja kodą košer būdu. Ir bet kokie ginčai yra beprasmiai ne filosofine, o labai praktine prasme. Panašiai kaip koks Pythono PEP-8, tik realizuotas kode, su kurio pagalba aš galiu 10MLOC svetimo prastai suformatuoto kodo paversti standartiniu. Smulkmena, bet maloni :-)

Taigi, mano projekte, kuris yra šio blogo kodas, buvo kažkiek instrukcijų kiek ir ko reikia susiinstaliuoti, kad susikompiliuotų. Maždaug toks sąrašiukas:

$ npm install
$ bower install ribs
$ cd src && go get
$ go get code.google.com/p/go-html-transform/css/selector

Pamaniau, būtų smagu viso to atsikratyti kaip nors gudriai, kad esant reikalui suveiktų automagiškai. Lyg tyčia sutapo keletas aplinkybių, pabaksnojusių, kad tinkamiausia tam vieta yra meikfailas, o ir būdas tą padaryti pasipainiojo laiku ir vietoje.

Kol kas paliksiu npm ir bower nuošaly, jie yra paprastesni, tad kai išsiaiškinsime su go get, anie du paaiškės savaime, pagal analogiją.

Pirmiausia pasišalino paskutinė eilutė. Ji buvo reikalinga parsiųsti paketui, kuris naudojamas tiktai testuose, bet ne pagrindiniam kode. Pasirodo, jos reikėjo tik dėl to, kad aš nepaskaičiau dokumentacijos ir nežinojau, kad prie go get pridėjus flagą -t, parsiunčiami ir testams reikalingi paketai. Valio.

Galima būtų kviesti šitą komandą kas kartą kompiliuojant. Ne baisiai ilgai trunka pakartotinis jos paleidimas, kokią sekundę. Bet labai jau ilga ta sekundė :-). Rimtai, ilga. Ant mano jau beveik trijų metų senumo laptopo, paredagavus vieną failą, projekto perkompiliavimas ir visi testai užtrunka 3.3sec. make clean && time make -- apie 5.5sec. Tai plius viena sekundė yra daug.

Vietoj to galima pasinaudoti make pagal paskirtį: kiekvieną biblioteką nurodyti kaip targetą ir jeigu kurios nors trūksta, tik tada leisti go get. Kažkaip taip:

DEPENDENCIES = \
    path/to/library1 \
    path/to/library2 \
    path/to/library3

$(DEPENDENCIES):
    go get -t

Tik, žinoma, labai nesinori atskirai laikyti šito bibliotekų sąrašo. Visų pirma, jos jau yra suvardintos kažkur programos kode, nesinori rankioti. O kartą surankiojus, sąrašas būtinai ilgainiui išsiskirs su realybe ir pasens.

Štai čia ir pagelbės Go kalbos toolability.

Yra toks kartu su visa Go kalba ateinantis toolsas go, kurio subkomandos yra skirtingi įrankiai. Šiai užduočiai bus reikalingas go list. Pastarasis moka parodyti visokius dalykus apie kodą. Tame tarpe, lyg tyčia, moka išrašyti visas importuojamas bibliotekas:

go list -f '{{.Deps}}' ./src

Šita komanda parodo viską, kas yra importuojama, maždaug taip (sąrašas sutrumpintas, palikti tik keli paketai iš beveik šimto):

bufio
compress/gzip
container/list
fmt
github.com/docopt/docopt-go
github.com/russross/blackfriday
golang.org/x/crypto/bcrypt
golang.org/x/crypto/blowfish
golang.org/x/net/html

Kaip matom, parodo visai viską, kas yra importuojama, įskaitant ir standartinės bibliotekos paketus, todėl reikia truputį pafiltruoti. Tikras kodas meikfaile atrodo maždaug taip:

GO_DEPS_CMD=\
    go list -f '{{ join .Deps "\n"}}' ./src
GO_UNFILTERED_DEPS=${shell ${GO_DEPS_CMD}}
THIRD_PARTY_PKGS=github% golang.org/x/%
GO_UNIQUE_DEPS=\
    $(sort $(filter $(THIRD_PARTY_PKGS),${GO_UNFILTERED_DEPS}))

Note: make’o sort ne tik rūšiuoja, bet ir išmeta dublikatus, kaip shello sort | uniq

Kai turim paketų sąrašą, belieka sukonstruoti tikrus kelius failų sistemoje. Tą padaryti labai lengva, nes paketus Go parsisiunčia ir deda į $GOPATH nurodytą vietą. Tereikia pridėti prefiksą:

GO_DEPS = $(addprefix $(GOPATH)/src/, $(GO_UNIQUE_DEPS))

Ir pagaliau galima pasimėgauti rezultatais:

$(GO_DEPS):
    @echo "Running 'go get', this will take a few minutes..."
    @go get -t ./...

Dabar kaskart paleidus make, patikrinama ar neatsirado naujų importuojamų paketų ir jeigu atsirado, parsiunčiama. Taip pat, parsisiuntus projektą naujoje mašinoje (arba VM’e, arba naujam žmogui, arba continuous integration serveryje), sutrumpėja šamaniškas prerekvizitų susirankiojimo šokis, kurį reikia sušokti. Parsisiunti kodą ir iškart kvieti make, tiek žinių. Skirtumas tik toks, kad pirmą kartą make ilgiau veiks kol viską parsiųs.

Baigdamas noriu padėkoti Pythono workshopo žmonėms, kurie savo projekto aplinkos kūrimą užtęsė tiek, kad atkreipiau dėmesį į tai, kad mano meikfailas yra buvo visai ne meikfailas, o kažkoks skriptas atsiprašant :-)

 

Kodėl aš nerašau scenarijų

2014-06-27, rtfb

TL;DR: kodėl blogai skriptą vadinti scenarijumi?

Todėl, kad scenarijus implikuoja sceną ir aktorius ir režisierių, o gal net operatorių ir apšvietėją. O turėtų implikuoti popieriaus lapą arba jų pluoštą arba rankraštį. Tam daug geriau tinka skriptas.


Net nežinau nei kas, nei kada pasiūlė, kad anglišką programavimo terminą script į lietuvių kalbą derėtų versti kaip ‘scenarijus’. Niekada nemėgau šito pasiūlymo, o kažkada ėmiausi ir kažkiek pasikapsčiau aplink šitą terminą.

Paaiškėjo, kad terminas išverstas tiksliai. Su tuo šį man nežinomą vertėją pasveikinsiu, pateiksiu įrodymus, kad jis išvertė tiksliai, o tada paaiškinsiu, kodėl terminas išverstas tiksliai, bet tūpai.

Istoriškai programavime skriptu buvo vadinamos interpretuojamos programos. Vikipedija paaiškina, kad ankstyvosiomis dienomis šitas terminas buvo naudingas pabrėžti skirtumui tarp “tikros” programos (parašytos greita, transliuojama kalba) ir greitai parašomų, bet lėtai vykdomų klijų, toms “tikroms” programoms susieti. Tikrai kažkas scenariško.

Žiūrint į bendrinės anglų kalbos žodyną, labiausiai tinkanti reikšmė (neskaičiuojant paties kompiuterinio termino) irgi scenarijus:

The written document containing the dialogue and action for a drama; the text of a stage play, movie, or other performance. Especially, the final form used for the performance itself.

Bet kas mums ta bendrinė kalba? Seni barzdoti wizardai dažnai vartojo gerokai nebendrinius žodžius ir jų prasmes, tai verta pasiklausti šitos srities žinovų. Štai ką atsakė Eric S. Raymondas:

From: "Eric S. Raymond" <esr@thy....com>
Date: Tue, 26 May 2009 08:09:53 -0400
Subject: Re: Etymology of 'script' in computing

Vytautas Šaltenis <vyt...@gmail.com>:
> I am mostly interested in tracking down the thought line of the coiners of
> the term -- were they thinking about the modern theatrical/cinema
> meaning of the script, or rather the original meaning of a writing, a
> written paper?

It's originally a Unix term, and I think I've seen an explanation from one
of the maintainers that they had the theatrical/cinema meaning in mind.
--
<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>

Deja, pats Kenas Thompsonas negalėjo jam paantrinti, bet tik dėl to, kad nebeatsimena:

From: Ken Thompson <ken@goo....com>
Date: Wed, 27 May 2009 15:42:09 -0700
Subject: Re: Etymology of scripting in programming

i am afraid that i cant help you too much.
i used the term for shell scripts from
the earliest times. to me it meant a
program for an interpreter.
i can't remember if we invented the term
or if we picked it up from multics.

ken

Taigi, QEDMF: konceptualiai, script = scenarijus.

O dabar pakalbėkime apie tai, ar žodis scenarijus yra tinkamas išreikšti skripto koncepcijai. Nes jeigu jau renkamės iš teatrinio žargono, kodėl taip iškart scenarijus? Gal geriau pjesė? Arba libretas.

Panašu, kad į lietuvių kalbą žodis scenarijus atėjo iš itališko scenario, sceninės špargalkės teatre. Kas galbūt irgi visai žaismingai atkartoja tai, kaip skriptai naudojami programavime. Bet yra vienas viską gadinantis bet: nelemta šaknis, kurianti scenos įvaizdį, o ne rašto.

Angliško termino -- net jeigu pirma žodynine reikšme ir laikysime kino terminą -- šaknis atėjo iš rašto ir kelia atitinkamas asociacijas. Lietuviškai gi, pasakai “scenarijaus autorius” ir sprogsta galvos, iškart lauki pratęsimo “režisierius…, operatorius…”:

from:    Gintautas Miliauskas <gintas@ak....lt>
to:      komp_lt@konferencijos.lt
date:    Sat, May 23, 2009 at 1:06 PM
subject: Re: Scratch vertimai

Sveiki,

> ps.: tiesa, vietoj "Programos" gal labiau tiktų "Scenarijaus"
> bet tada gal  "programavimas" keisti "scenarizavimas" :D

Taip ir pagalvojau: „scenarijaus autorius – Jonas Petraitis“.
Betrūksta tik režisieriaus...

--
Gintautas Miliauskas

[sidenote: vietoj tiesioginės citatos čia turėjo būti nuoroda į komp_lt archyvą, bet atrodo, kad pas mus kaupti viešų konferencijų archyvus nėra populiaru… grrr.]

Atrodytų, smulkmena, bet svarbi. Programos yra pirmiausiai rašto forma, o tik paskui kažkas automatiškai vykdomo.

Ką siūlau?

Palikti skriptą ramybėje. Šaknis lotyniška, tad netgi pagal VLKK išsigalvotas taisykles tokie terminai lietuviams oficialiai nerėžia ausies, ne kaip kokia dviguba vė. Žodis kuo puikiausiai kaitomas, visuose kontekstuose skamba kaip ten buvęs. Nedarykime vielabraukių ten, kur jų nereikia.

 

Homeopatija ir nepageidaujamas šalutinis poveikis

2014-06-16, rtfb

Visuomenėje plačiai paplitusi nuomonė, kad homeopatiniai preparatai neturi šalutinio poveikio. Šitas mitas toks gajus, kad juo tiki netgi dauguma skeptikų. Antai toksai žymus klounas James Randi mėgsta reklamuotis, kad “perdozuoja” homeopatinių preparatų ir jo vedamos minios šmaikštuolių daro visokias specialias perdozavimo dienas.

Vienok, TANSTAAFL. Homeopatija, kaip ir viskas, turi šalutinį poveikį. Paskaičiuokime ir įsitikinkime.

Štai Vikipedija rašo:

30C: dilution advocated by Hahnemann for most purposes. On average, this would require giving two billion doses per second to six billion people for 4 billion years to deliver a single molecule of the original material to any patient.

Nesunku suprasti, kaip tokia formuluotė pasitarnauja nekenksmingumo mitui. Kaip matote, čia figūruoja visokie juokingi skaičiai su daug nulių, apie kurių dydį žmonės nelabai pratę samprotauti. Ir tie skaičiai sudaro įspūdį, kad jokio šalutinio poveikio negali būti.

Tai pabandykime vieną iš tų skaičių pasiversti į ką nors suprantamo, ką atpažintume, pamatę gatvėje.

Kas yra du milijardai dozių? Tarkime, kalba eina apie skystą preparatą ir dozė yra 2x2x2 milimetrų tūrio lašelis. Na, įsivaizduojate? Daugmaž tipiškas vidutinio dydžio lašelis. Kiek bus du milijardai tokių lašelių?

>>> (2e-3)**3 * 2e9
16.0

Ogi 16 kubinių metrų. Išrikiuokime juos į eilę ir prisiminkime, kad visa tai yra per sekundę. Reiškia, tie 16 kubų turi visi į jus įriedėti 16 metrų per sekundę greičiu, kas yra lygu 57.6 kilometro per valandą.

Tai vat kai mieste matote šešiolikos tonų fūrą, važiuojančią beveik leistinu greičiu, tai žinokite, kad homeopatinio preparato vartojimo šalutinis poveikis gali būti kaip tos fūros įvažiavimas jums į veidą. Kas sekundę. Ir taip keturis Gyr. Sakyčiau, poveikis gerokai nepageidaujamas :-)

Todėl neperdozuokite homeopatijos, labai nesveika sveikatai.

Pabaigoje pridursiu, kad 30C yra ne šiaip kokie į istoriją nugrimzdę skaičiai. Šiais laikais, mūsų internetai rašo ir apie 1000C ir apie 10000C. Ką čia prasidėt su smulkmenom! Apgraibom pakliksėjęs vietinėje rinkoje radau preparatų su ingredientais po 200D ir 1000D. Kaip tokius skaičius pasiversti kuo nors maybe įsivaizduojamu, aš dar pagalvosiu ir gal parašysiu kitą kartą :-)