24 órás hackathon voltam

Mit is csinál? Alapvetően YAML és JSON fileokból XML fileokat generál…

A munkahelyemen félévente külön teret adnak a kreativitásnak: egy 24 órás programozó maratont (hackatlon) szerveznek, ahol különféle ötleteinket kiélhetjük magunk. Egy barátommal, aki történetesen a kollégám is (commiter oszlopban brogrammer néven szerepel), úgy döntöttünk, hogy az egyik cluster termékünk tesztjeit hatékonyabbá és olcsóbbá kellene tenni, amihez KVM alapú virtualizációval kellene egy framework, amiben lehet felhúzni clustereket percek alatt. (Így például a kereskedemi virtualizációs megoldások licencein tudnánk spórolni.)

Ezt a célt kitűzve magunk elé, belevágtunk a “Cluster Termékünk Neve virtualized smoke test” projektbe.

A munkakörülmények adottak voltak:

  • áram
  • LAN, internet (mondjuk csak WiFi volt technikai okokból, és ez kissé az utunkba is állt)
  • játszós gépek: 2 (Sun?) Blade (8 Xeon mag + 8 HT, 48 GB RAM, több mint elég HDD, Ubuntu 14.04 LTS)
  • kávé
  • energiaital (annak aki ilyesmiket iszik)
  • rostos és szénsavas üdítők
  • sör, buzisör
  • pizza
  • chips
  • xbox one, ps 4

Tehát étel, ital is volt gyakorlatilag végtelen mennyiségben. A bladek több mint elegendőek voltak számunkra. Our greetings fly to the lab operators!

Miután megterveztük a cluster setupot nekiláttunk egy RESTful webapp készítésének, amit backend microservicenek szántunk, de végül eléggé monolitikus lett a dolog. :) Ez az alkalmazás gyártotta le a libvirt számára a konfigurációs xml-eket, és bizgerálta a KVM-et a libvirt segítségével.

Összességében nem sikerült minden célunkat elérni, de sikerült egy olyan állapotig eljutni, hogy egy clustert be tudunk bootolni, és le tudunk állítani a kis webapp segítségével.

A sikerünkhöz hozzájárult a megfelelő stack választásunk:

  • Ubuntu 14.04 LTS
  • KVM
  • libvirt
  • Python 2.7 + IPython
  • Flask web microframework
  • Jinja 2 template engine
  • Stack és Heap in-memory adatbázisok
  • git
  • Gogs git frontend a szép színes git loghoz, és access controlhoz. (Tisztára egy privát github!)
  • Pure CSS a reszponzív témához (hisz ki ne akarná a mobiljáról vezérelni a clusterjét! Tudjuk, hogy lehetett volna Bootstrappal ezt is, de most így alakult.)
  • Bootstrap a színes gombokhoz és ikonokhoz
  • YAML a konfig fileokhoz
  • Visual Studio Code

Tanulságok

Jónéhány fontos tanulsága volt az eseménynek:

A pihenés fontos

A legfontosabbak a fáradtság kezelésével, és az energia helyes beosztásával kapcsolatos tanulságok: Utálom az energiaitalok szagát. A különféle serkentőszerek szervezetbe juttatásánál érdemes a használati útmutatót követni. Még akkor is, ha már 24 órája vagy ébren!

Nem érdemes így maratoniban kódolni, főleg nem úgy, hogy már reggel a munkába is hullafáradtan érkeztem, miután nem rendesen elaludni. Valószínűleg több eredményt értünk volna el, ha rendesen alszunk, mondjuk legalább 6 órát.

Amúgy épp a minap olvastam egy ehhez lazán kapcsolódó írást: Sabotage - az önszabotálás kultuszáról, okairól, hátrányairól, előnyeiről. Angolul.

A libvirt API, Python binding és a doksija elég gáz

Generált a binding. Ez nem lenne még gond, ha vették volna a fáradtságot rendesen megcsinálni. Sajnos nem vették, vagy teljesen eltér a rendesen megcsinálásról a véleményük az enyémtől. A C apiban, mivel ott nincsenek namespacek, prefixelt minden függvénynév. A bindingban ezek le vannak vágva, de elég brainfuck módon. Persze pythonban nincs segítség az autocomplete type hintjeiből sem. Az egészet talán legjobban összefoglaló példa:

Vajon mit csinálhat a libvirt connection createXML() metódusa? Nem, nem XML-t csinál! Egy VM leíró XML-t vár argumentumként, és abból csinál egy VM-et. Ez a C API-ban a DomainCreateXML hívás, ami már sejthető, hogy mit csinál.

A linux bugzani fog

Másik tanulság az, hogy linuxxot csak magic sysrq-val indíts újra, ha nincs iLO, IPMI vagy egyéb out of band remote konzolod. Történt ugyanis, hogy a libvirtes kisérletezgetés során a KVM kicsit betojt, és beragadt egy VM. Gondoltuk, hogy újraindítjuk, de le sem állt a gép, viszont az sshd-t már kilőtte… Szerencsénkre egy laboros kolléga még dolgozott ezen a késői órán is, és így erőből újraindította a gépet nekünk.

A konzolok továbbra is… konzolok

Az XBOX One és a PlayStation 4 is console plebeknek való. FPS játékot controllerrel játszani? Összességében nem találtam nagyon jónak a játékélményt egyiken sem, pedig neves franchiseok darabjait próbáltam ki. Az pedig, hogy a Need For Speed valamennyivel vagy nem lehet split-screen versenyezni (XBOX One), vagy úgy el van rejtve annak a módja, hogy nem találtuk meg, így vagy úgy, de a játékipar szégyene. A játékipar többnyire amúgy is szégyen.

A rendes nyelvek nem véletlen vannak ott az ipari felhasználásukban, ahol

Egy másik tanulság: a duck typing hamar nagyon drága lesz. Egy jó típusrendszer, egy jó fordító, és máris jobban megy a kód írása fáradtan is. A pythonban az első lépések nagyon faszák voltak, aztán már ennyi idő alatt eljutottunk oda, hogy jobban visszafogott minket, mint segített.

A fáradtság lenyomata

A projektet nem tesszük közzé, mert ez csak a miénk. Meg amúgy is csúf a kód, meg python. :)

Ellenben megosztjuk a commit messageket. Érdemes a commit messageken keresztül követni a fáradtság hatását a kognitív képességekre. Jól látható, hogy miként fogyott az erőnk az értelmes összefoglalók megírására. Emellett az is megfigyelhető, hogy miután hajnalban ledőltünk 1-2 órát aludni, majd megreggeliztünk, utána ismét értelmesebb üzeneteket tudtunk írni.

TimeCommitterCommit message
15:12:21initial commit
15:10:39kódfodrászExtended README
15:25:03brogrammerAdd kvm scripts for starters
18:19:55brogrammerAdd backend proto
18:31:51egy másik pókfirst
19:15:14brogrammerAdd template
21:29:32brogrammerninja2ization
18:37:55kódfodrászsome vscode defaults for the project
21:28:33kódfodrászStart rewriting of the backend app
21:50:11brogrammerAdd ninjaized templates
22:19:18kódfodrászAdded bridge name heuristic
22:46:48brogrammerAdd network xml creation
22:57:39kódfodrászbridge generation in Cluster
23:37:34brogrammerDomain status
23:42:12kódfodrászRefactored network creation. Added storage creation.
00:53:53kódfodrásztempalte loading from yaml
00:59:55brogrammerbringup
01:13:22brogrammerdont try this at home
01:21:09brogrammerworks as designed
01:21:46brogrammermoar blobz
01:32:48brogrammeronly on post.................
01:28:11kódfodrászdep injection. add storage. stuff.
01:40:10kódfodrászlisten on all interfaces
01:43:10kódfodrászfix stuff
01:53:02brogrammernetcode
02:00:29brogrammerrefactor
01:44:50kódfodrászadd shell script to start up app
01:57:20kódfodrászcreate domain in bringup
02:04:29brogrammerstorage
02:10:53brogrammerCall net and storage bringup
02:12:24brogrammertypo
02:13:05brogrammerfaszom mar
02:14:25brogrammerprxl
02:18:05brogrammermi van maaaar
02:15:40kódfodrászmar az en faszom is
02:22:39kódfodrászpython suxxs
02:27:12kódfodrászi am a bad mothafucka!
02:38:53brogrammeri
02:42:46brogrammerdebug
02:42:02kódfodrászlog some shit
02:46:10kódfodrászthis is a patriarchal commit
02:47:12kódfodrászthis time feminists won :(
02:49:14kódfodrásze!
02:56:51kódfodrászdem plates
03:07:17brogrammerlool
03:07:55brogrammerszabtoaaaaszzzsss
03:08:56brogrammernem
03:11:12brogrammerazrt
03:13:06brogrammertokeletes
03:15:14brogrammerforman
03:19:25brogrammermindent megcsinaltam
03:22:08brogrammermit tudjuk mirol van szo
03:36:02brogrammerwhitespace fix and backdoor for nsa
03:45:43brogrammerrandom minden
04:00:39kódfodrászteardown
04:35:49kódfodrásznem vagyok beszamithato
07:20:42brogrammercss a little (very little)
07:23:59brogrammeriii
07:32:45brogrammerAlways return something
07:38:54brogrammerDelete host handler
08:05:07brogrammerFixit
08:29:08kódfodrászez má' igen!
08:41:02kódfodrásza hohes c multivitamin nyito kupakot vagy gonosz vagy idiota emberek terveztek.
08:47:01kódfodrászén ugyan biztos nem a majomtól származom!!4! Kulonben is, te reviewztad
08:56:45brogrammerez meger egy komitot
09:00:54brogrammereloleptetnek menedzserre annyira szart kodoltam
09:02:01brogrammereating is for pussies
09:05:19brogrammerpitno plz
09:26:26kódfodrászAdd some responsiveness
09:49:41kódfodrászéjjel ötkor ne szivj táplálékkiegészitőt az orrodba
10:07:00brogrammerAdd bootstrap
10:16:09brogrammermore fancy
10:16:57brogrammercorrect to submit
10:18:41brogrammerFix action
10:36:00brogrammerjol szetcsesztem hehe
10:38:16brogrammeriso
10:52:20brogrammertemplate changes
13:23:56kódfodrászextend readme

Konklúzió

Részben sikerült a célunk. Kipróbáltunk dolgokat, amiket egy hétköznap nem tennénk. Jól éreztük magunk. Azt hiszem, hogy legközelebb is megyünk, és bőrőzünk! Én legalábbis szeretnék, és brogrammer is ennek jeleit mutatta.