Na Fakulteti za matematiko in fiziko Univerze v Ljubljani smo v okviru Programerskega kluba FMF postavili jelko z lučkami, ki jih lahko programiramo. Projekt poteka pod sponzorstvom podjetij Abelium in Acex.
Jelka stoji pri vhodu v stavbo na Jadranski 21 in je prižgana od jutra do zaprtja stavbe.
Izvorno kodo projekta si lahko ogledate na GitHubu.
Jelka je sestavljena iz več komponent, ki skupaj sestavljajo programabilno novoletno jelko. Jelko fizično upravlja Raspberry Pi, ki redno komunicira z glavnim strežnikom, da dobi seznam vzorcev, ki jih mora zagnati. Ta program se imenuje Korenine. Korenine ciklično menjavajo vzorce ter jih zaporedno zaganjajo v Docker containerju. Vzorci so zapakirani v Docker container in jih je mogoče napisati v kateremkoli programskem jeziku, ki zna pisati na standardni izhod. Program bere izhod vzorca ter glede nanj upravlja lučke na jelki s pomočjo knjižnice. Trenutno stanje jelke poleg tega pošilja nazaj na strežnik, kjer se prikazuje na simulaciji na spletni strani.
Glavni strežnik, imenovan Jelkob, gosti spletno stran projekta, bazo vzorcev in Docker register. Spletna stran je napisana v Djangu in uporablja ogrodje Django REST Framework za API. S spletno stranjo lahko upravljamo, kateri vzorci se zaganjajo na jelki in jih po potrebi ročno zaganjamo. Spletna stran prikazuje tudi seznam razpoložljivih vzorcev, trenutno stanje jelke in simulacijo.
Vzorci so napisani v različnih programskih jezikih in so shranjeni v repozitoriju Storži. Vsak vzorec je zapakiran v Docker container. Vzorci so lahko napisani v kateremkoli programskem jeziku, ki zna pisati na standardni izhod, vendar za popularne jezike, kot sta Python in JavaScript, ponujamo uporabniku prijazne knjižnice. Vzorci lahko preberejo 3D pozicije lučk na jelki in jih upravljajo tako, da želene barve lučk pošiljajo na standardni izhod.
Da smo dobili 3D pozicije lučk na jelki, smo posneli več videov jelke iz različnih kotov, medtem ko je bil prižgan kalibracijski vzorec. Iz teh videov smo nato izluščili 2D pozicijo vsake lučke za vsak kot. Na podlagi teh 2D pozicij smo nato izračunali 3D pozicije lučk na jelki. To smo naredili s programom, ki smo ga poimenovali Jelkulator.
Še en pomemben del projekta je Jelkly, Scratch-podobno orodje za vizualno programiranje, ki uporabnikom omogoča ustvarjanje lastnih vzorcev brez znanja programiranja. Jelkly je napisan v TypeScriptu z uporabo Microsoftovega orodja MakeCode (PXT), ki uporablja knjižnico Blockly (od tod tudi ime Jelkly). Na Jelklyju je tudi simulacija, s katero si lahko uporabniki lažje predstavljajo, kako bo njihov vzorec izgledal na pravi jelki. Uporabniki lahko vzorce, ustvarjene v Jelklyju, neposredno pošljejo na strežnik, kjer jih pregledamo, pretvorimo v JavaScript in dodamo v repozitorij Storži, kjer se lahko izvajajo na jelki.
Če želite prispevati svoj vzorec za Jelko FMF in že imate znanje programiranja, si oglejte repozitorij Storži, ki vsebuje že obstoječe vzorce in navodila za oddajo lastnih vzorcev v različnih programskih jezikih.
Če želite oddati vzorec, ampak še nimate znanja programiranja, si oglejte Jelkly, Scratchu podobno orodje za vizualno programiranje, s katerim lahko enostavno ustvarite in oddate svoje vzorce za Jelko FMF. Uporaba je preprosta tudi za začetnike in ljudi brez znanja programiranja, saj omogoča enostavno sestavljanje programov z uporabo vizualnih blokov.