Blogity blog blog


Dependensų bootstrapinimas su Go

2014-12-13, by 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, by 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, by 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ą :-)

 

Autoauto

2014-05-27, by rtfb

Šiandieną perskaičiau vieną antraštę, kuri paskatino atsisėsti ir surašyti puokštę visokių įdomybių, susijusių su bepiločiais automobiliais.

Manau, jau visi žino apie ką eina kalba. Daugelis kompanijų – Google, Mercedes-Benz, Volvo, Nissan (tiek prisimenu iš atminties, o turbūt kitos irgi) – aktyviai dirba, stengdamiesi sukurti automobilius, kuriuos pilnai vairuotų kompiuteris. Gal ne pats pirmas modelis, bet anksčiau ar vėliau tai atrodys taip: atsisėdat į automobilį, žemėlapyje nurodot tašką B ir spaudžiat “važiuojam”, tuo tarpu pats sėdite užkėlęs kojas ant panelės ir endžiojinat vjūzus.

Man pačiam tai vis dar skamba kaip fantastika, ir tai, griežtai kalbant, dar ir yra fantastika, bet jau labai artimos ateities. Gal 10 metų. Gal 20. Nelabai svarbu kiek tiksliai, bet faktas, kad pirmieji modeliai išriedės jau po kelių metų, o paskui jie sparčiai tobulės, ir dar mums visai nesusenus, mes jais važinėsime. Deal with it.

Todėl naudinga būtų pasamprotauti kaip tai paįtakos mūsų gyvenimus, gal įtaka bus ne vien komfortinė?

Pradėsiu nuo banalesnių privalumų ir potencialių minusų irba problemų, o galui paliksiu įdomesnius dalykus, kurie kai kam gal net pakilnos stogą. Bent jau man kilstelėjo :-)

Patys banaliausi dalykai, apie juos neverta daug kalbėti:

  • Važiavimo laiką bus galima skirti sau. Dabar vairuotojas dirba vairuotoju, o galės skaityti knygą
  • Galėsime girti saugiai ir patogiai grįžti namo[1]
  • Suvartos mažiau degalų: kompas nespeedins ten, kur nereikia, prieš beužsidegantį šviesoforą pristabdys ne daugiau, negu būtina ir pan.
  • Mažesnis avaringumas
  • Pasikeis form factor: nebereikės vairo, vietoje jo galės būti įrengta patogi darbo vieta. Arba priekinės sėdynės bus išvis atsuktos į vidų

Taigi, avaringumas sumažės, bet naivu tikėtis, kad visai išnyks. Iš čia įdomus klausimas: kas kaltas dėl avarijos? Ne šeimininkas gi, jis juk niekaip prie avarijos neprisidėjo? Gamintojas? Tikriausiai… O ką kompui daryti tais retais atvejais, kai jis matys, kad šitoj situacijoj niekas negelbėja, fizikos dėsnių nesuklastosi, VIENĄ IŠ šitų pėsčiųjų partrenksiu. Kurį?

Kitas klausimas: praėjus kažkiek laiko, gal dešimtmečiui, gal dviem po pirmų modelių, ar senamadiškai nusiteikusiam žmogui bus leidžiama vairuoti automobilį rankomis? Daug šita tema nesiplėsiu, bet prognozuoju, kad ne, ir prognozuoju, kad labai gerai, kad ne :-)

Pakalbėkime apie tai, kaip pasiįtakos kasdienybė. Štai jūs važiuojate ryte į darbą. Vietoj dabar įprasto nervavimosi, ramiai skaitote knygą arba atsakinėjate į darbinius laiškus. Atvažiuojate, išlipate. Ar jūsų ofiso aplinka kuo nors skiriasi nuo šiandieninės? Taip. Kieme – nė vieno automobilio! Kodėl? Nes kai jūs atvažiuojate ir išlipate, jis užsidaro dureles ir nuvažiuoja toliau! Parkuotis. Kur nors nach prie Maximos bazės. Jūs jau sėdite ofise, geriat kavą ir plepat su kolegomis, o jis rieda neskubom judančiame sraute link parkingų kvartalo. Pasižymėkit kalendorių ir pradėkit countdown’ą iki dienos, kai tai taps realybe.

Pratęsiant temą, jeigu jau jis galės pats prisiparkuoti, tai galės ir pats nuvažiuoti trivialaus serviso: pasikeisti tepalų, padangų, whatnot. Jūs uždedat varnelę settinguose, kad jums visa tai nerūpi, ir jei nepažiūrėsit į banko išrašus, jūs net nežinosit, kad šiandieną jis praleido ne parkinge, o servise. (Beje, ar sakiau, kad parkingai bus talpesni per ploto vienetą?)

Bet ir tai dar ne viskas. Jeigu jau jūs ryte darbą pradedate dirbti dar automobilyje, tai ar didelis skirtumas, jei jame praleisite pusvalandžiu daugiau? Gal tas pusvalandis bus net produktyvesnis. Ergo, jeigu jūsų ofisas, sakykime, Vilniaus Naujamiestyje, ar yra esminis skirtumas kur gyvenate, Fabijoniškėse, ar Kulautuvoj? Nors iš pirmo žvilgsnio neakivaizdu, bet nekilnojamojo turto rinkoje irgi nusimato pokyčių. Galbūt didelių.

Na ir pabaigai, tas klausimas, kuris viską paskatino: ar galės tuos bepiločius automobilius valdyti vaikai? Atrodytų, pff, kas čia per klausimas! Kadangi vairuos kompas, o žmogus tik užsakinės, tai kam čia laukti pilnametystės? Juk nebereikės anei vairuotojo pažymėjimų, anei dar ko. Bet! Juk tai reikštų beprecedentę judėjimo laisvę nepilnamečiui, o gal net ir visai mažam vaikui. Įsivaizduokit, penkiametis atsisėda mašinon ir per pusdienį nuvažiuoja į kokią nors Krokuvą. O ten, aišku, baigiasi degalai, o telefoną vaikas pakeliui praganė degalinėj pirkdamas ledų ir fsio takoje. Nieko toks siurprizėlis tėvams, ar ne? Tad net ir čia bus kažkokių įdomybių. Galbūt reikės kažkokio vairuotojo pažymėjimo ekvivalento, kuris, tarkim, bus išduodamas tik nuo keturiolikos. Ar dar bala žino ko panašaus.

Žodžiu taip, jeigu reiktų rinktis disruptyviausią ateinančio dvidešimtmečio technologiją, bepiločiai automobiliai mano sąraše būtų labai aukštai. Kuo toliau, tuo labiau atrodo, kad jų įtaka bus labai plati.

Gal ką praleidau?

[1] O pakeliui užmigti mašinoj ir pramiegoti visą naktį kieme, o ryte atsibusti saulės perkaitintame salone su ekstra rūsčiom pagiriom, mu-hahaa! :-)

 

Lietuviškas Sex-Ed

2014-04-09, by rtfb

(Tai turėjo būti trumpas komentaras feisbukuose, bet visai trumpai nesigavo, tai dedu į blogą)

Leo Lenoxas parodė gerokai disturbing daiktą, švietimo ir mokslo ministerijos metodinį dokumentą apie tai, kaip mūsų vaikus žada rengti šeimai ir ugdyti lytiškai. Čia jums ne kokie nors kliedesiai apie princus ir princus, čia real shit.

Pasiskaitykite. Ten 60+psl, bet lengvai skaitosi skipinamuoju būdu, tai persižvelgia gana greitai. O be to, atidžiai skaityti pavojinga sveikatai, nes kuo atidžiau skaitai, tuo labiau ima noras daužyti galvą į stalą.

Planavau nieko iš šio dokumento necituoti, kad selektyviu citavimu nesudaryti klaidinančio įspūdžio – visgi vertybės yra vertybės ir labai jau lengva nejučiom pricituoti šiaudinių baidyklių. Bet mūsų ŠMM metodininkai talentingi, jie sugeba įpinti ir tokio hard-faktinio briedo, kad nepacituoti aš paprasčiausiai negaliu. Te jums:

Skirtingai nuo ankstesnių, mūsų laikais žmonės turi nedaug vaikų. Kad šalyje nemažėtų gyventojų, reikėtų, kad šeimoje augtų “2,1” vaiko – praktiškai tai reiškia, kad žmonės turėtų po tris vaikus.

Aš kokius septynis sykius skaičiau, ieškodamas, ką neteisingai perskaičiau, nes negalėjau patikėti savo akim, kad galima taip užrašyti. Bet neradau. Čia tikrai taip užrašyta. Fak…

Testas 58-59psl yra pisiec (neva tai teisingi atsakymai 60psl).

Vienok visa tai įkvepia. Įkvepia pačiam auklėti savo vaiką greitai, efektyviai ir kritiškai, kad iki to amžiaus, kai susidurs su šitu kliedesiu, mokėtų atskirti teisingą informaciją nuo pamazgų balos.