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.
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.
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ą, .gcode
1. 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:
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.
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.
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 :-)
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.
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ą :-)