Wednesday, 20 February 2013

BB: Metaa!

Blogibloggi

Minua ärsyttää ja harmittaa tämä blogi. Tämän postausvauhti on moninkertaistunut negatiivisesti vuosi vuodelta, ja mitä minä olen tehnyt? En ainakaan korvannut määrää riittävällä laadulla, vaikka tästä tasosta olenkin tullut roimasti ylöspäin. Etenkin 2010 aloittamani uudenvuoden kertomukset ovat edustaneet tekstieni yläpäätä. Niissä on sisältöä (ainakin sanamäärällä tarkasteltuna, vaikka sanamäärä onkin sisällöstä yhtä hyvä mittari kuin rivimäärä ohjelmakoodin laadusta), niissä on yritetty välttää juttuja, joita en edes itse tajua vuotta myöhemmin, ja niissä on yritetty olla koherentteja alusta loppuun. Haastavan kuuloista, eikö :)

Blogin pölyjä pitää siis pyyhkiä, ennenkuin raukka aivan tukehtuu. Miten tämä prosessi oli suotavaa toteuttaa? Blogin kirjoitetun formaatin huomioonottaen voisin ehdottaa kirjoittamista. Silmitöntä kirjoittamista. Nyt olisi hyvä hetki sulkea suodatin, joka näyttää minulle jokaisen tekstin huonot puolet, ja on näin jo tappanut ensimmäisen bb-tekstini, jonka toinen versio tämä on. No, mistä kirjoittaisin? Kirjoittamisaiheita ei roiku ihan joka oksalla, jos ymmärrät mitä tarkoitan, kuulisin ihmisten sanovan jos en soittaisi Epicaa rauhallisena taustamusiikkina. Vaikka aiheita roikkuisikin puiden oksilla, autolla- ja junalla taitettavilla työmatkoilla keskinopeus nousee niin suureksi ettei niitä ehdi tarkastella lähemmin, puhumattakaan siitä että ottaisi kotiin mukaan.

Niin, pölynpyyhintätekstit, joita ei kannata ottaa kovin tunteella, ja joiden takana en välttämättä enää julkaisun jälkeen seiso, merkitsen nimellä blogibloggi. Luovaa. Arvatkaa keneltä sain idean tähän.

Kirjoittaminen ei ole helppoa. Jotta se helpoittuisi, siinä on tultava taitavammaksi, mikä vaatii että kirjoittaa, mutta kuten äsken yritin selittää, tämä on loputon rekursio: ongelmana kirjoittamisen haastavuus, ratkaisuna on kirjoittamisen harjoittelu kirjoittamalla, mutta sen ongelmana on kirjoittamisen haastavuus, mikä ratkeaisi harjoittelemalla kirjoittelua kirjoittamalla, mutta se palauttaisi meidät lähtötilanteeseen niin monta kertaa, että kohta kutsupinostamme loppuu tila. Ongelma on siis vaikea, koska rekursion pohjaehto ei tule koskaan todeksi, ellei tilannetta muuta tavalla, joka on reaalimaailmassa mahdotonta, ohjelmoijalle haastavaa, mutta kirjoittajalle todella helppoa: kierretään ongelman ympäri, ja ratkaistaan se välttelemällä sen katsetta niin kauan, että se kuolee huomionpuutteeseen. Vähemmän abstraktilla tasolla selitettynä, kirjoitetaan jostain niin helposta aiheesta, että jopa ei-ohjelmoija osaa siitä kirjoittaa: METAA!

Metallahan tarkoitan tietysti metabloggausta, ja tässä tekstissä yleisestä kirjoittelusta kirjoittelua. Muuan Atwood1 kerran kirjoitti metablogailusta (Puhun listan 10. (ja tämän tekstin tapauksessa myös 9.) jäsenestä) melko hyvin:

Meta-blogging is like masturbating. Everyone does it, and there's nothing wrong with it. But writers who regularly get out a little to explore other topics will be healthier, happier, and ultimately more interesting to be around – regardless of audience.
Olkoon tämä teksti siis hetkeni metaforiseen itsetyydytykseen blogini parrasvalossa.

Kirjoittelua ja blogaamista

Kerran lausuin hyvälle ystävälleni Tässille että "Se on mun blogi, ja mä voin tehdä sillä mitä haluan", minkä lopputuloksena oli muuan otsikko yool-blogiin. Aivan, otsikko, se ei ollut teksti. Sen leipätekstin sanamäärä oli pienuudessaan henkilökohtainen ennätykseni. Leipätekstissä merkkejä kaksi, aitoja sanoja ei yhtään. Katsokaa vaikka.. Nyt, kun neljä vuotta myöhemmin tarkastelen tilannetta, huomaan olleeni oikeassa, ja silti rikkoneeni etikettiä. Blogille voi tehdä mitä haluaa, mutta se yleensä (toivottavasti) vain tappaa blogin. Teksteissä taas, tiukan asiatekstin ulkopuolella, avaruudessa jossa suurin osa blogiteksteistä elää, sen sijaan lähes mikä vain on sallittua. Ero on hiuksenhieno, sekä vaikea selittää, mutta kun sen ymmärtää, on tajunnut sekä ohjelmoinnista että proosan (ja ehkä runojenkin? En osaa sanoa; en ole tehnyt niitä aikoihin) kirjoittamisesta jotain syvällistä. Aikoinaan minulla oli proosaprojekti, jossa olin yrittänyt pysyä realistisessa romantiikassa, mutta tajuttuani että omassa universumissani kaikki oli sallittua, tein hahmoista tietoisia siitä että he ovat vain mielikuvituksen tuotetta. Se toimi hyvin, mutta teksti oli muuten sen verran kamala etten laita sitä nettiin referenssiksi :)

Pisteet sille, joka keksii mistä keksin tehdä fiktiivisistä hahmoista tietoisia fiktiivisyydestään

Oma ääni on tärkeä. Tiedän kuulostavani tämän sanottuani yläasteen äidinkielenkirjalta, mutta toisinkuin silloin tunsin, tämä on todella tärkeää. Objektiiviset, ei kenellekään ja silti kaikille suunnatut tekstit, joita tapaa uutislehdissä ja äidinkielen yo-kirjoituksissa, ovat toki ehkä asiasta tietoa etsivälle mielenkiintoisia, mutta ei niistä saa näitä harvoja erikoistapauksia lukuunottamatta mielenkiintoisia millään. Näin ollen minun on rikottava tekstini objektiivisuus, ja todettava myös, että ellei teksti käsittele ohjelmointia (tai sen oheisprosesseja), tai kirjoittamista, laskee sen kiinnostavuus runsaasti. Voitte olla eri mieltä, mutta <sarcasm>minä olen oikeassa :)</sarcasm>.

Tästä tulikin mieleeni, Yegge kerran otti puheeksi sen, että blogaajat ovat narsisteja. Tunnustan tämän piirteen itsessäni, oikeassa elämässä olen ehkä hieman introvertimpi, paitsi harvoille ja valituille, mutta blogeissa aiheina on minä, minä, minä ja minä, ja suu käy mahdollisimman jatkuvasti. Se on lähes-tarkoituksellista, koska jos välttelisin minusta itsestäni kirjoittelua, olisi näiden kirjoittelu todella tylsää, koska koulutukseni on ohjelmoijan eikä toimittajan. Minua ihmetyttää myös argumentit siitä, miten osa ihmisistä ei uskalla laittaa ajatuksiaan nettiin. Toki niiden poistaminen netistä voi olla haasteellista, mutta sen takia kirjoitellessa pitääkin olla varovainen siitä ettei lausu mitään ajattelematonta, ja muistaa mainita milloin teksti muuttuu asiallisesta vitsin väännöksi, niinkuin minä tein yllä <sarcasm>-tageilla.

Blogikirjoituksen perimmäinen tarkoitus on olla loki siitä, miten kirjoittaja on päässyt tilanteesta A johtopäätökseen D. Ajatellessaan, kirjoitaessaan ja keskustellessaan ihminen muodostaa päänsä sisällä puumaisen rakenteen, jossa jokaisesta pointista voi liikkua eteenpäin monella eri tavalla, ja läpikäytyään tämän puun optimaalisinta reittiä pitkin, on tuloksena blogitekstin/esseenkaltainen, lineaariseksi litistynyt joukko pointteja, joiden välillä kirjoittaja yrittää liikkua jouhevasti, välillä onnistuen paremmin, useimmiten huonommin. Jos oikein tarkasti kuuntelette, harjoittelemattomissa puheissa ja sponttaaneissa keskusteluissakin on tällainen tietorakenne taustalla, läpikäymisprosessi on vain paljon selvemmin esillä, kun äänessäolijalla ei ole aikaa viimeistellä sitä.

Mutta ajattelu, siinä vasta mielenkiintoinen touhu. Väittäisin että blogin kirjoittaminen on ajattelutöistä jalointa ja tehokkainta, minkä vuoksi yool-blogi on yhä olemassa, ja mikä tärkeintä, paljon toimivampaa kuin ajattelu ääneen tai pään sisällä, ilman persistenttiä mediaa2 ajatteleminen. Yeggeä lainatakseni, blogi tarjoaa helpon laajennuksen pään sisäiselle keskusmuistille, jonne on todella vaikeaa säilöä mitään pitkäkestoista. Kun saan idean, on helpompi avata läppäri ja Emacs, ja kirjoittaa ideasta luonnosteksti ~/Dropbox/bloggailu:un, josta se on käytettävissä kunhan pääsen kotikoneelle, jossa se on helposti saatavissa Dropboxista, kuin jos yrittäisin säilöä sitä omaan muistiini, jolloin kotikoneelle päästyäni en pohtisi "Dropboxissa oli jotain inspiroivaa", vaan pikemminkin "Pelaisko pleikkarilla vai tietskarilla illan ratoksi?".

Fiktio/Proosa

Fiktiivinen teksti, ah siinä vasta hieno taiteenlaji. Asiatekstejä harrastan koska niitä kirjoittamalla otetaan paljon vakavammin3, ja ne ovat omalla oudolla tavallaan kiehtovia, vähän niinkuin Javalla XML:n jauhaminen on mielenkiintoista, kun on ensin perehtynyt miten asiat tehtäisiin Lispillä jos oltaisiin fiksuja. Fiktiivisiä tekstejä harrastan samasta syystä kuin harrastan peliohjelmointia4: koska se on uskomattoman mielenkiintoista, ja omalla alallaan parasta. Omalla tavallaan fiktiiviseen kirjoitusharrastukseeni vaikutti se, että olin nuorempana (kuulemma :) kamalan nirso kirjojen suhteen: kun suurin osa kirjoista oli pöljiä, mikä oli paras tapa saada epäpöljä kirja? No kirjoittaa itse sellainen, tietysti!

Olen vuosien saatossa kirjoittanut varmaan parin sadan tuhannen sanan edestä proosaa, 10 000-60 000 sanan tekstejä, joiden määrää en pysty varmistamaan kun tikkuni, jolla Dropboxia vanhemmat tarinat elävät, on hukassa, ja olen omaani ja muiden työtä tutkimalla ja tarkkailemalla oppinut jutun jos toisenkin. Tärkein asia, joka pätee sekä asiatekstissä että proosassa, on sammuttaa itsekritiikki, ja antaa sielun vuodattaa sanoja paperille/Emacsiin. Toki, jos aikoo julkaista tekstin, kannattaa siitä aivopierut siivota pois, mutta jos se jää pöytälaatikkoon, sottaisempi on mielestäni parempi. Sottaisia tekstejä voi sitten vuosien päästä käyttää esimerkkeinä siitä mikä toimii ja mikä ei.

Tai, kuten Yegge Stephen Kingiä tulkitsee:

Stephen King also offers good advice: be honest. His definition of honesty is subtle, and in a sense it takes him his entire book On Writing to define it. It's a funny and thoughtful book, and I recommend it, even if you're not one of his fans. His "honesty" is the closest word to something we have no word for, so it's hard to capture as a line or two of advice. If I were forced to paraphrase, it'd be that you need to un-learn the stuff they taught you about writing in school, and just write directly from your soul.

Then, of course, you need to go back and edit your work before publishing it. Your soul might occasionally emit statements that are legally actionable, and your soul doesn't always have good judgement or common sense. You should follow the official company guidelines for writing blogs. They're of course the bare minimum, and you should follow them.
Minun pitäisi luultavasti perehtyä Kingiinkin jonain kauniina päivänä, tai ainakin sitatoituun On Writing - teokseen.

Kliseet ovat kivoja. MERPGin maailmaan perustuva, vuoden työn alla, koodinimellä Lomaproosa kulkeva teokseni pyörii kliseiden, sekä uusien ja vanhojen vitsien ympärillä. Tämä voi toimia kerran, mutta lainatakseni Atwoodia, jota jo yllä lainasin, tällaisesta kirjoittamisesta tulee äkkiä samanlaista kulunutta roskaa kuin metailusta blogissa. Tämän vuoksi suunnitelmanani on kirjoittaa tarinan alkupuoli (ensimmäiset mitä, 25 000 sanaa?) lähes uudelleen löydettyäni loppuratkaisun. Tammikuussa, Egyptissä ollessani, löysin lopultakin kyseiseen tarinaan punaisen langan, jonka puuttuminen oli haitannut tarinan kulkua jo ainakin puoli vuotta, ja nyt en pysty selailemaan ensimmäisiä neljääkymmentä sivua, koska niissä Rajolilla (sama Rajol kuin Pröngissä ;) ei ole mitään suuntaa elämällään, joten hän keskittyy lähinnä lainailemaan Assassin's Creediä ja Dragon Ageja.

Ennen tämän tekstin johtopäätöksiä haluan tuoda esiin erään seikan, jonka tajuaminen nauratti ainakin minua. Tekstit, joille on määritelty tiukka aihe, ovat määritelty tiukasti epäonnistumaan. Sen takia äidinkielen yo-kokeestani tuli muistaakseni vain C, joka aiheutti hieman "Etkös sä kuitenki aika hyvin äikkää osaa?" - reaktioita ympärilläni. Sekä Yegge että Graham argumentoivat siitä kuinka oikeassa esseekirjoituksessa on unohdettava mitä koulussa on siitä kerrottu, ja kuinka kumpikin yllättyy parhaimpien esseidensä lopputuloksista, olkoon lopputulos se kuinka Graham tajuaa jonkin uuden asian, joka on hänellä alitajunnassaan kolkutellut jo jonkin aikaa, tai se, kuinka Yegge kuulee kuinka jokin hänen yleistietona pitämänsä fakta oli täysin uutta jollekulle. Jokainen ihminen on oppimisessaan eri vaiheessa: minä pidän itsestäänselvyytenä sitä miten helppoa Emacsissa on liikkua dokumentin eri osien välillä, mutta Tässi ja useimmat töissä ovat täysin tyytyväisiä Wordin tai erilaisten IDE-ohjelmien TODELLA kömpelöihin tekstinkäsittelyominaisuuksiin5. Vastaavasti Tässi pitää (valistuneesti arvaten :P) kompleksilukuja itsestäänselvyytenä, ja vaikka ottaakin ylpeydelle sanoa, töissä IDE-ihmiset tietävän C#stä ja Javasta juttuja, joita pitävät itsestäänselvyytenä, ja joista minulla ei ole hajuakaan.

Yllättyneisyys tekstin lopputuloksesta pätee myös proosassa. Minä ainakin suunnittelen proosiani todella huonosti (mikä näkyy :), Lomaproosankin suunnitelma löytyy... täältä. Tämän vuoksi kirjoittaminen on kuin lukisi interaktiivista kirjaa. Aamulla kun aloitan kirjoittamaan, en tiedä missä päähenkilö on illalla. Tällöin tyhmistä ratkaisuista voi myös syyttää vain itseään, ja niistä voi peruuttaa takaisin, niinkuin aion Lomaproosassa tehdä (En tunnusta kirjoittaneeni tarinan pahiksen kuolemasta niin pöljää kuin se nyt on!).

Johtopäätöksiä? Mitä opimme?

The topic sentence is your thesis, chosen in advance, the supporting paragraphs the blows you strike in the conflict, and the conclusion-- uh, what is the conclusion? I was never sure about that in high school. It seemed as if we were just supposed to restate what we said in the first paragraph, but in different enough words that no one could tell. Why bother?

Puolikkaiden kappaleiden lainaaminen kontekstin ulkopuolelle on kivaa :) En itsekään ole enää aivan varma mitä johtopäätösten alle itse asiassa kuuluu, tiivistelmä asiakappaleista? Se on helppoa:

  1. Tämän blogin turmioksi tulee koitumaan alle kymmenen postin vuositahti, etenkin kun sovellamme 90% on roskaa - sääntöä (jonka lähteen pastean kommentteihin sen löydettyäni). Tätä vastaan taistellakseni aloin blogibloggi-tekstit, joihin kirjoitan mitä mieleen tulee, sen kummempia suodattamatta.
  2. Metabloggaus jää tähän postiin
  3. Kirjoitteluoppeja
  4. Ajatteluoppeja
  5. Fiktio-oppeja
  6. Paljon blogilinkkejä, sekä semikoherenttiä, perustelematonta lukioäikän haukkumista :P
  7. Yllätys on tärkeää - onko tässä tekstissäni siis mitään tärkeää?

Ei minulla varmaan muuta tälle illalle. Toivottavasti saan seuraavan tekstin aikaiseksi ennen huhtikuuta :P

[1] Mitä varten ihmiset eivät aseta fiksuja id-attribuutteja dokumentteihinsa? Helpottaisi linkkausta todella paljon.

[2] Mitä persistentti media on suomeksi? Puhun siis paperin, blogin tai Emacsin kaltaisista medioista, joihin ajatusten vuodattaminen takaa niiden säilyvyyden, toisinkuin niiden ääneenajattelu tai pään sisälle jättäminen.

[3] Ainakin ohjelmointipiireissä, voisin yrittää tehdä seuraavan blogibloggitekstin siitä...

[4] Oikeasti! MERPG edistyy, hitaasti mutta varmasti, ja jos tänä keväänä saisi kartat ja grafiikat lopultakin kuntoon, pääsisi moottorissa eteenpäin!

[5] Pitäisikö kirjoittaa bloggiblogitekstinä myös ylistyslaulu Emacsille? Olisiko kiinnostuneita?

Monday, 7 January 2013

Uuden vuoden projekteja

Hyvää uutta vuotta 2013!

D&W:n puolella ehdinkin jo analysoida mennyttä vuotta; nyt on aika analysoida tulevaa. Kirjoitan tätä Egyptistä, ilman internet-yhteyttä, joten en voi ottaa kantaa vuoden ensimmäisen viikon mahdollisiin tapahtumiin MERPGin ja muiden ympärillä, vaan sen sijaan kirjoittelen altaalla ja lämmöstä nauttiessa syntyneistä ideoista. Näitä on monia, ainakin kolme, ja jokainen näistä ideoista tuo lisäarvoa MERPGiin tai tiimille.

mAnimaattori



Tarve tälle projektille on ollut olemassa yhtä kauan kuin MERPGistä on puhuttu, mutta nyt vasta osaan antaa sille nimen. Aikoinaan oletin että Coolbasic-foorumin Latexi95:n Animaattori valmistuisi sopivasti MERPGin animointivaiheeseen, mutta nyt näyttää siltä kuin Animaattori 3:n toinen inkarnaatio on jäätynyt ja haudattu. Etelänlomani aikana "tulin lukeneeksi" viimeiset 300 sivua Clojure-raamatustani (ja Pitkä Sigma 4:n, ja 200 sivua Poea, hienoja kirjoja), ja nyt minulla on jonkinlainen käsitys siitä miltä oman animaattorin tulisi näyttää.

MERPGin animaatiot tunnetusti ovat framecount*frameW pikselin levyisiä ja frameH korkuisia animaatioita. Javan kaksiulotteiset grafiikkaluokat muistaakseni sallivat kuvien helpon jakamisen ja yhdistelyn, joten animaattorin ainoa "iso" ongelma on freimien käsittelyyn käytettävän käyttöliittymäkomponentin löytäminen/rakentaminen. Olisi kiva jos varsinaisen kuvankäsittelyn voisi ulkoistaa Paint.NETille upottamalla sen Swing-layouttiin, mutta se on vaikeampi toteuttaa kuin Emacsin tekstieditorin integrointi Visual Studioon, toisinsanoen siis mahdotonta. Onneksi javakäyttöliittymien rakentaminen ei vuodenvaihdetta edeltäneiden kokeilujeni pohjalta ole Clojurella ja Seesaw'lla lainkaan samanlainen PITA kuin raa'alla Swingillä.

Käytännössä tämän ohjelman malliksi riittäisi lista/vektori java.awt.Image'ista, jotka tallennusmetodi yhdistäisi yhdeksi Imageksi, joka kirjoitetaan ImageIO:lla levylle. Luonnollisesti latausmetodi lataisi kuvan, hajottaisi sen useaksi imageksi, ja muodostaisi näistä listan. Freimien määrä pitäisi myös jostain päätellä, minä en ainakaan keksi miten sen voisi päätellä pelkästä png-kuvasta rajoittamatta joko freimien leveyttä tai jotain muuta suuretta. Pöljempi voisi luulla että koska MEMAPPERin tilet ovat 50x50, animaatioidenkaan ei ole mitään syytä olla eri kokoisia, mutta se on väärin, koska viime keväänä päätin että hahmojen liike on jatkuvaa, eivätkä ne ole muutenkaan 50x50 - tilejen rajoittamia

Yksi tapa ratkaista ongelma olisi rakentaa Clojuren record, johon tallennetaan Image-lista ja tilejen määrä. Tämä sitten sarjallistettaisiin java.io.Writeobjectilla (tai jollain sellaisella, en omaa localhostissa javadoceja, joista luntata nimiä), jolloin ei IO:n yhteydessä tarvitsisi leikkiä ImageIOlla. Tässä kohtaa todellakin toivon java.awt.Image - luokan olevan sarjallistuskelpoinen.

Näkymään koostuisi yhdestä ikkunasta. Tässä ikkunassa olisi kolme osaa: piirtopinta, AKA "PDN-klooni", työkalualue, ja aikajana. Aikajanalla näytetään jokaisesta freimistä thumnail, ja siltä pystyy ottamaan jokaisen freimin lähempään tarkasteluun piirtopinnalle. Kun freimejä on enemmän kuin ikkunaan mahtuu, näytetään joko nuolinapit, tai sitten toteutetaan jonkinlainen hiireen perustuva animaationsisälläliikkumismenetelmä. Aikajana tarjoaa myös taikanapin freimien lisäämiselle, sekä napin, joka ensin varmistaa että olethan nyt varma, ja sen jälkeen poistaa jos käyttäjä oli varma.

Sitten on työkalualue. Alussa siellä on todennäköisesti tasan pikselintarkka kynä, ja ehkä jotain muototyökaluja. Muut työkalut yritän kirjoittaa pyynnöstä, tai annan ohjelmointitukea kaikille, joilla on abstrakti algoritmi, jonka haluavat muuttaa Clojureksi, mAnimaattorin ladattavaan muotoon. Lisäksi työkalualueella on väridialogi ja "Outline - Filled - Outline & Filled" - valinnat, jotka toimivat kuten PDN:ssä. Työkalujen kirjoituksen tueksi kirjoittanen deftool-makron, joka antaa värin ja Outline-valinnan arvon ohjelmoijalle. Tietysti jos hyvä ohjelmoija olisi, tekisi näille arvoille myös funktiorajapinnat, jotta HOFfien käytöstä ei tulisi ihan kamalaa.

Tätä ohjelmaa helpottaisi kuitenkin jos löytyy  Swing-yhteensopiva, upotettava kuvienmuokkas-UI-elementti.

MEsE



Clojureraamattua lukiessani huomasin Leiningenin, Clojuren Mavenin, olevan aika tajuttoman kiva kapistus. Viuhkaan, jonne en jumalauta yhtään .waria laita enää ikinä, laittaessani MEsEn palvelinpuolta, ensin piti shellillä tappaa tomcat, sitten netbeansissa clean&buildata uusi koodi, ftp:llä siirtää 25-megainen .war (...ehti hyvin keittää teetä yhden siirron aikana, ja huh hellettä jos huomasit paketissa bugeja...), riidellä tomcat päälle, ja toivoa että se oli päällä vielä huomennakin. Tämä on ihan yhtä pöljä tapa ohjelmoida kuin miltä kuulostaakin. Sen sijaan, edellämainitusta Clojureraamatusta luin leinin kykenevän tekemään tämän saman Amazonin clj-ympäristöön seuraavan proseduurin mukaan: kirjoitetaan % lein deploy shelliin. Okei, myönnetään, project.clj vaatii hieman määrityksiä ennen kuin deploy - komento on olemassa, mutta silti erittäin paljon pienempi PITA (kiva akronyymi <3 ) rakentaa asianmukainen project.clj kuin tehdä ensimmäinen prosessi neljä kertaa päivässä yhden nullpointerin etsimisen vuoksi, ja huomata sen jälkeen aamun muuttuneen aamuyöksi.

En takaa että korrekti komento oli lein deploy. Kirjoitan tätä tekstiä ulkomuistista, tarkistamatta mitään mistään, joten mikään ei välttämättä pidä paikkaansa, mutta joka tapauksessa kyseessä oli yksinkertainen, lyhyt lein-komento.

Näinollen, kunhan kotiin pääsen, on minun tarkistettava mitä Amazonin ympäristö maksaa, ja tarjoaisiko Leiningen yhtä kivan tuen ilmaiselle Google App Enginelle. Jos (käy ihme ja ) Amazonia voi yksityisenä käyttää ilmaiseksi, tai GAElle tarjotaan samaa tukea, tiputan vanhan MEsErver-koodipohjan ja aloitan sen suosiolla alusta Clojurella. Tämä ratkaisisi monia ongelmia, joita vanhassa koodissa on, deployingin (mitä hittoa se on suomeksi?) lisäksi. Javan Collections - API on olevinaan kiva, mutta MEsErverissä se oli enemmän kuutamolla kuin normaalisti. Jostain syystä olioita, jotka olin tasan tarkkaan laittanut kokoelmiien, ei enää hetken päästä löytynyt niistä, eivätkä oliot poistuneet pyydettäessä. Lisäksi yhtään monimutkaisemmat datankäsittelyoperaatiot javakokoelmilla ovat juuri niitä: monimutkaisia. Miten kukaan selviää ilman mappia/selectiä, filtteriä/whereä ja muita!?

Joka tapauksessa, tutkin siis kotiinpäästyäni MEsEn toteutusmahdollisuuksia Clojure-palvelimella.

Salaperäinen kolmas projekti

Ehdin jo unohtaa mikä tämä oli. Ehkä Javaan pohjautuva MEserver GAElle, jos lein ei tue ympäristöä? En tiedä.

Sunday, 30 December 2012

Uusi vuosi, uudet junat


Vuosi on taas lopuillaan. Kaikki numerollisesti lahjakkaat toivottavasti tietävät tämän tarkoittavan pientä yhteenvetoa ja ehkä kuvakollaasiakin. Viime vuonna näihin aikoihin pohdiskelin että olipa -11 hieno vuosi, onkohan tuosta seuraavasta mihinkään sen rinnalla. Nyt tiedän vastauksen: Oli! Tämä oli upea vuosi, vaikka tähän ei kuulunutkaan mitään eriskummallisia ruotsinmatkoja. Tämä vuosi oli työtä, työtä ja työtä. Vähemmän yllättäen sitä tarvitaan tässä maailmassa.

Viime Tammikuussa aloin työssäoppia. Puolen vuoden PHP-hommien jälkeen sitten valmistuin. Tässä välissä näin PHP:n kauneimmat ja kauheimmat puolet. PHP on kiva kieli, ei ehkä kaunis, mutta oikein käytettynä sillä saa hyviä nettisivuja aikaiseksi. Pröng olisi elävä esimerkki siitä, jos jaksaisin toteuttaa sinne puoliakaan siitä mitä olen suunnitellut, ja olisin julkaissut sen avoimena. Tunteeni PHP:tä kohtaan eivät kuitenkaan olleet näin positiivisia työssäoppimiseni jälkeen. Työskenneltyäni phpBB3:n kaltaisten hirvitysten kanssa, ja pärjättyäni Taitajien PHP-hommissa vähintäänkin keskinkertaisesti, olin sitä mieltä etten halunnut kuullakaan koko kielestä enää. Voinette arvata että Java-ohjelmoijaksi koulutettuna käytin kieltä kuin Javaa, ja sitten suutuin sille kun vähemmän-yllättäen (ehkä jopa onneksi) se ei taipunut samoihin muotteihin kuin työpöytäjava. Myöhemmin, lueskeltuani serverijavapatterneista taitajia varten, aloin tekemään pohjatyötä omalle MVC-kehykselleni. Kesään mennessä olin kuitenkin jättänyt tuon projektin innostuttuani jostain muusta. Myöhemmin, opiskeltuani Common Lispiä ja Clojurea, päässäni naksahti jotain: dynaamiset kielet voivat olla kivoja. Tämän todistaakseni kirjoitin PHP:lle keväällä aloittamaani MVC-härpäkkeeseen M-kirjainta edustamaan tietokantarajapinnan, jonka kirjoittaminen olisi ollut mahdollista staattisesti tyypitetyssä ympäristössäkin, mutta jonka kirjoittamista helpotti dynaamisuus. Tietokanta-entiteettien ominaisuuksia ei määritelty luokkatasolla, vaan yläluokan property-mapissa, jonka kanssa interaktoitiin __get() ja __set() - metodien läpi.

Kun kehys oli olemassa, ja olin päättänyt jo keväällä vanhan Pröngin kuolemasta, oli pieni vaiva rakentaa Pröng käyttämään tätä kehystä, jolla se toivottavasti on vielä vuoden päästä, ellen sitten innostu Clojurella leikkimään palvelimella. Fakta on, että nämä viime vuosien uudelleenkirjoitusrumbat ovat tappaneet innovaation Pröngistä. Yritän ensi vuonna saada aikaiseksi luonnosten ympärille uusiakin ominaisuuksia. Kalendaari pitäisi toteuttaa, ja tutkia miten tagisysteemin ympärille saa toteutettua keskustelulaudan. Lautoja on Pröngissä nähty muutamakin, mutta ne ovat joko koostuneet litteistä, peräkkäisistä viesteistä, tai olleet rikki.

Jättäkäämme Pröng. Taisin mainita Jyväskylän taitajakisat, joissa olin keväällä. Se oli hauska matka: maanantaina junalla ensin tampereelle "bongaamaan lentokoneita", kuten kerroin mukana kulkeneille opettajille, jotka ihmettelivät että mitä sinä siellä laiturilla juoksentelit kameran kanssa vartin mittaisen veturinvaihdon aikana. Oriveden kohdalla sitten kysyttiin että missä minä niitä lentokoneita oikein näin. Helppoon kysymykseen helppo vastaus: tässä:
Lentokone Tampereella
Kisat olivat myös kivoja: minä en osaa sanoa ei tuntien mittaisille koodausmaratoneille. Valitettavasti kisoissa arvioitiin runsahalti graafista silmää, joten voitte Pröngin ulkoasua tarkkailemalla päätellä kuinka hyvin pärjäsin. Koulustani oli muuan toinenkin opiskelija kisaamassa, ja vaikka hän "ei kyllä oikeastaan osaa PHP:tä käyttää", hän sai eniten pisteitä näissä kisoissa. En tiedä täysin mihin se perustui, mutta väittäisin että hänellä oli silmää designille, hän osasi käyttää css:ää, eikä keskittynyt yli-insinörisöimään (to over-engineer på english) logiikkaa sivujen taustalla. Onneksi kisoissa oli myös Windows Phone - tehtävä, niin hassulta kuin se Verkkosivusarjassa kuulostaakin. XAMLilla minäkin sain aikaiseksi ulkoasun, joka näytti yhtä hyvältä kuin 27-sarjalainen Dv12 (toisinsanoen Ruotsinlaiva) Jyväskylässä. Alla referenssikuva. Lisäksi (siihen aikaan) C# oli paljon fiksumpi kieli kuin PHP, joten logiikan aikaansaanti ei vaatinut itkua, kiroilua eikä hammasten kiristystä. Kisojen loputtua, ennen pisteiden julkistusta, minulla oli kaunis Metro-app, jolla pääsin kuudennelta sijalta kolmanneksi. Se oli kivaa.
Ruotsinlaiva ja rapuvaunuja

Kesä ja muut

Tästä oli aika ohjelmointipainotteinen alaotsikko. Kannattaa hypätä seuraavaan otsikkoon, ellette ole kiinnostuneita Lispistä ja Emacsista.
Ksältä ei kyllä ole paljoa tarinoita kerrottavana. Emme käyneet Kemissä, emme Ruotsissa, emme missään. Vietimme aikaa lähinnä järvellä - ja kautta hiljaisen blogini millainen paikka tuo lähijärvi onkaan. Niin pitkälle kuin muistan, emme kehittäneet siellä yhtään mitään, vaan sosialisoimme ja tuhlasimme aikaa, kuten normaalit myöhäisteinit. Se tuntui hyvältä.
Teineilyn lisäksi aloin myös palkkatyöt kesän myötä. Toukokuun viimeisenä kävimme Tässin kera tutkimusmatkalla Kauniaisissa. Kesäkuun ensimmäisellä viikolla juoksin pääsykokeissa, joista kummatkin pääsin yllätyksekseni läpi, mutten lopulta mennyt kumpaankaan... vielä. Sinä viikonloppuna kävimme Tässin ja kumppaneiden kanssa Saaristo Open Airissa tutustumassa suomirockin hassuimpiin nimiin ja kertaamassa edellisen syksyn kokemuksia Within Temptationista. Seuraavana tiistaina astuin sitten palkkatyöhön, joista minua ei todennäköisesti saa irti kuin opiskelupaikka Skotlannissa. Töissä olen päässyt käyttämään ympäristöä, joka on hieman niinkuin Java, mutta ei onneksi sinne päinkään: C#tä nimittäin. C#n ohella sain myös Java-hommia, ja pääsin tutustumaan Linuxiin. Lisäksi kokeilin emacsia, jolla tätäkin kirjoitan, mikä johti elispin, Common Lispin ja Clojuren opiskeluihin ja tekstiin Yool-blogissa.
The Grani
Tuolle tekstille pitänee kyllä joskus kirjoittaa jatkoa. Emacs on editori, joka muka-aukeaa hetkessä, kun ymmärtää ettei keskustele perinteisen tekstieditorin vaan lisp-ohjelman kanssa, mutta aito aukeaminen kestää paljon pidempään. Tuolloin olisin tehnyt java-ohjelmani mielelläni Netbeansilla, mutta nyt kun lopultakin asensin kotikoneeni Archin Emacsiin asianmukaisen Clojure-kehitysympäristön, en mielelläni palaa Javaan. Kieleen toki saatan palata, etenkin koska töissä kieli kuuluu vakioituun työkalupalettiin, toisinkuin Clojure (mikä on sääli), mutta Netbeansista haluan päästä eroon mahdollisimman pian. Tapa, jolla Emacs ja Clojure-runtime mahdollistavat interaktiivisen kehityksen, on vain uskomattoman kaunis.

Hitto soikoon, opinpa tässä tätä kirjoittaessani komennosta M-x htmlfontify-buffer. Sitä pitää soveltaa seuraavan blogitekstin kanssa.

Lisp noudattaa samaa kaavaa: pinta näyttää yksinkertaiselta, mutta alla on paljon kivaa, mikä pitää vain löytää. Clojuren Seesaw yhdistää Swingin ja WPF:n parhaista puolista suurimman osan, Lispit toimivat myös XML:n korvikkeena, ja makrot. Makrot ovat kauniita, vaikka laiskuudessani en ole niitä vielä päässyt soveltamaan. Kuvitellaan että meillä on kertomafunktio. Matemaattisesti kertoma merkitään huutomerkillä parametrin perässä, eikö? Miten tämä sitten normaaleissa kielissä merkittäisiin? kertoma(luku); - muodossa todennäköisesti. Sitä ei voisi merkitä edes muodossa !(luku), koska ! on negaatio-operaattori. Noh, Lispeissä ei ole mitään syytä sille ettei funktion nimi voisi olla !. Kokeilkaa vaikka: seuraava koodi menee läpi Clojure-kääntäjästä:

(defn !
"Laskee luvun kertoman :)" [luku]
 (if (number? luku)
(if (= luku 1)
 luku
(* luku (! (- luku 1))))
 -1))

Anteeksi huono muotoilu.

Tuo on yksinkertainen rekursiivinen kertoma, joka palauttaa -1:n jos parametri ei ole luku. Tätä sitten kutsutaan näin: (! 3). Tämä palauttaisi kuuden. Helpolla makrolla voimme kuitenkin tehdä tästä vielä matemaattisemman näköisen: (matikka (3 !)) palauttaa myös kuuden, mutta nyt ! - operaattori tuleekin parametrin jälkeen. Jätän yleisön tehtäväksi arvata mitä matikka-makro tekee.

Jos olette kiinnostuneita XML:n korvaamisesta Lispillä, lukekaa hieman Yeggeä, ja sen jälkeen googlatkaa xmlgen-kirjastoa Emacsille. Sillä tämäkin teksti on kirjoitettu: nämä rivit ovat Lisp-puussa, jonka Emacs muuttaa edellämainitulla html:ksi ennen bloggeriin siirtoa. Tällä hetkellä html on siirrettävä bloggeriin käsin, mutta sinä hetkenä kun innostun rakentelemaan, rakennan todennäköisesti Clojurella blogger-java-apia hyödyntävän palikan, jolle emacs lähettää html:n, ja joka lähettää sen eteenpäin bloggerille.

Linux-kokemuksistani yoolblogin teksti antaa myös huonon kuvan. Lokakuussa asensin pöytäkoneelleni Arch Linuxin, mitä suosittelen jokaiselle, joka luulee ymmärtävänsä Linuxeista mitään. Sitähän minä en tee, mutta onnistuin Archin kanssa yllättävän hyvin. Minulla on KDE päällä, graafisessa tilassa, ja 2 kolmesta näytöstänikin näyttää kuvaa. Tätä liittoa ei ole ihan taivaassa tehty, mutta ohjelmoijana pidän tästä ympäristöstä. Shelli on kiva Windowsin komentoriviin verrattuna, virtuaalikonsoleita olen usein kaivannut Windowsiin, ja esimerkiksi Clojuren Lein - projektinhallinta oli paljon helpompi asentaa tänne kuin Windowsiin. Lisäksi focus-follows-mouse-ominaisuutta ilman on hankala elää, kun siihen on kerran tutustunut.

Syksy ja muut

Elokuu oli kiva. Silloin oli puolivuosittaisen Hyvinkään Rautatiemuseo-reissun aika. Edelliset reissuthan olivat viime vuoden syyskuussa, Riihimäen asematapahtuman yhteydessä, ja viime-maaliskuussa, kun rautatiemuseolle pääsi ilmaiseksi museon synttäreiden vuoksi. Tällä kertaa oli vuorossa yhdistetty VR:n 150-vuotisbileiden juhla-/rautatiemuseoviikonloppu. Olin siellä valitettavasti vain lauantaina, joten en ulkotapahtumien ja sellaisten vuoksi ehtinyt käydä tutkimassa oliko hallien sisältö muuttunut sitten viime näkemän, enkä ehtinyt myöskään matkustaa lätällä, mutta pitäähän ensi kertaankin jotain jättää. Mitä ehdimme tuona lauantaina mukana olleiden ihmisten kanssa tehdä, oli tutustuminen paikalliseen konepajaan, ulkona olleeseen kalustoon tutustuminen (o/ eka kerta Dr16:n hytissä), sekä jotain, mitä kovin moni kasarin alun jälkeen syntyneistä ei välttämättä voi väittää tehneensä: matkustimme Hyvinkäältä Karjaalla alla olevan Hr1:n vetämänä.
Pekka-ukkonen Hyvinkäällä
Ensimmäinen Dr16 - "Isovaalee", jonka olen luonnossa kohdannut.
Ensimmäinen luonnossa kohtaamani Dr16 kesältä -11 Kemistä


Syyskuu oli töitä ja koulua. Pitkän matikan opiskelu tekee jokaiselle ohjelmoijaksi itseään kutsuvalle hyvää. Tekee pahaa ajatella että on olemassa ohjelmoijia, joilla on pohjalla vain lyhyt matikka, tai mikä kamalampaa, vain ammattikoulun matikka. Ei sitä matikkaa tarvitse missään käyttää, geneerisessä SYÖTÄ-LUE-MUOKKAA-POISTA - ohjelmassa, kuten Pröng, ei välttämättä tarvitse matemaagisuutta mihinkään, mutta hyvcässä ympäristössä opiskeltu matikka auttaa ajattelemaan. Lisäetuna selviää, jos saa tehtäväkseen tehdä datan visualisointia firman oman ohjelman sisällä. Sen voi nimittäin visualisoida kahdella tavalla: joko toivoo että käyttöympäristö omaa excelin, ja winapilla yrittää kolvata sen ikkunan sisään, mikä on vaikeaa, vaikkei välittäisi ohjelman vakaudesta yhtään mitään. Vaikeustaso moninkertaistuu jos haluaa että ohjelma ei selviää tästä ilman hassuja bugeja. Toinen vaihtoehto on piirtää tilastot käsin datan pohjalta GDI+lla (tai Swingillä, tai mitä piirrintä ympäristö käyttääkään), mikä ei C#llä ole ennenkuulumatonta tai haasteellista. Haaste tulee siitä jos yrittää jotain viivadiagrammia monimutkaisempaa piirtää ilman edes lyhyttä matikkaa.

Lokakuu oli pimeä. Se koostui samanlaisesta työstä ja koulusta kuin syyskuukin. Sen lisäksi tuolloin oli karsinnat Worldskillseihin, jonne minut tiestysti kutsuttiin, koska olin pärjännyt NIIN hyvin Taitajissa. Vähemmän yllättäen karsinnoissa pisteet jaettiin lähinnä ulkoasun pohjalta, ja minun ulkoastaitoni tunnetaan. Ei tullut Saksanmatkaa minulle, ei. Sen sijaan marraskuu alkoi Tampereenmatkalla. Vietin viikon Diabeteskeskuksessa, joka on jopa pimeään vuodenaikaan suomen kauneimpien paikkojen joukossa. En tiedä voittaako Näsijärven rannan maisemat jopa paikallisen järvemme maisemat upeudessaan, etenkin kesäisin taistelu on melkoisen tiukka, mutta ainakin lähelle pääsee. Paikallinen seura oli myös mahtavaa (MOI JANI!!!). Kämppikseni oli oikein hieno mies, jonka kanssa olemme käyneet monia viisaita keskusteluja. Muutkin ihmiset olivat - ainakin osa - oikein mukavia. Yritin epätoivoisesti tutustua muutamaan heistä, mutta sitten viikkoni kaupungissa teki ilkeän tempun: se loppui.

Marraskuuhun kuului myös Nightwishin Imaginaerum - elokuva. Elokuva ei koskaan ilmeisesti saanut suurta suosiota osakseen, mutta niiden, jotka sen ovat oikeasti nähneet, keskuudessa se on melkoinen kulttielokuva, jota ainakin minä odottelen innoissani DVDlle. Koska DVD-julkaisussa kesti, hyiolkoon, yli kaksi viikkoa, piti Tässin ja velikultani (MOI EEKU!!!) kanssa käydä katsomassa elokuva myös Tennispalatsissa. Toisen kerran jälkeen pieni tauko tuli tarpeeseen: levyn ongelmana on, että kun sen on kymmenen kertaa kuunnellut läpi viikon aikana, siihen kyllästyy. Todennäköisesti elokuvakin oli sellainen, enkä halua kyllästyä siihen kuten joihinkin elokuviin (kasituntiset ja Pirates of the Caribbean, katson teitä).

Joulukuussa tapahtui hassuimmat tapahtumat ensi vuotta ajatellen: MERPG1:n ensipuolikkaan kässäri valmistui, Lomaproosa on vähitellen 60 sivullaan ja 25 000 sanallaan alkanut rullata, ja minulla on Clojure-ympäristö lopultakin valmiina MERPGiin. Lisäksi kävimme Tässin ja velikultani (MOI EEKU!!!! (Hmh, deja vu)) kanssa katsomassa Hobitin, joka tarjosi taas paljon uutta inspiraatiota Lomaproosalle. Jos olisin hyvä ihminen, avaisin kirjat Hobitti ja Sormusten herrat, joista toisen luin ja toista aloitin viimeksi kymmenisen vuotta sitten (hyi että kuinka aika kulkee), mutta ongelmia on, kuten aina. Minulla on aivan liian paljon luettavaa nytkin. En tykkää yhtään.

Lomaproosaa, ja kirjoitusta yleensä, pitäisi joku päivä oikeasti analysoida blogiin. Mielenkiintoinen ominaisuus proosateksteissä on, että niiden kirjoittaminen on haastavaa aluksi, 20. sivulla (kun aloitusajatukset on käytetty loppuun, ja, hyi olkoon, pitäisi oikeasti keksiä uutta sisältöä), ja välillä myös 40. sivun paikkeilla. Sen jälkeen tarina vyöryy eteenpäin omalla painollaan, ja tarina luo sisäisiä ristiriitoja aivan itsenäisesti, aivan kuten monisäikeiset Java-ohjelmat.

Nyt jää mm. Lahden ja Oulun Sonata-keikoista kirjoittamatta, mutta sen kanssa on nyt pakko elää, koska minä en jaksa. Suunnitelmana oli tehdä tänään vielä muutakin kuin tätä...

Mitä ensi vuonna?

Otsikon kysymys vaivaa minua joka vuosi. Jos tämä vuosi oli näin loistava, voiko ensi vuosi olla edes yhtä hyvä? Vuosi sitten vielä epäilin tätä, mutta nyt tiedän paremmin. Ensi vuonna lähden mahdollisesti Skotlantiin opiskelemaan pelien tekoa (Comp. Sci:n pelientekoon liittyvät osa-alueet + opiskelua jokaisen konsolin sdk:n kanssa, sekä median tuottoa afaik.), julkaisemme toivottavasti MERPGin ekan puoliskon, ja elän elämääni. Tällä hetkellä ajatuksenani on kirjoittaa pitkä matikka maaliskuussa, mutta ellen oikeasti jatka matikan kertailua pian, saatan jänistää siitä, etenkin kun jätin (tyhmänä ihmisenä) mainitsematta kirjoitusaikeistani skottikoulun hakupapereissa, eli minulla ei ole minkäänlaista pakkoa päästä sitä läpi. Ellei tietysti lasketa sitä, että haluan näyttää Tässille ja muille, että olen ns. "kaheli" :)

Kiitos kaikille vanhoille tutuille, kuten Tässille ja Sonjalle (joka tarvitsee blogilempinimen! Karkuzhan ei vain toimi!), puoli-uusille tutuille, kuten Alpille ja Vohvelieläimelle (Siinä vasta hyvä ja toimiva blogilempinimi), sekä vuoden aikana tulleille täysin uusille tuttavuuksille, kuten Taitaja- ja Työporukoille, sekä Tampereella tavatuille, ja kaikille. Työ olette parhaita. Hyvää uutta vuotta, ja toivottakaa onnea MERPGin tuotantoonsaattamiseen! En tykkää itsestäni yhtään jos sitä ei ole julkaistu kun menen skotlantiin!

Friday, 28 December 2012

MERPGin kässärin ensimmäinen julkinen versio


Vuosi sitten päätimme Tässin kanssa Merpgtarina - blogin olevan kamala. Niinhän se olikin, mutta opin siitä paljon. Opin miten tiimin sisäistä dokumenttikiertoa EI pidä toteuttaa :) Tarinankerrontaan blogiformaatti on nimittäin aivan kamala; tekstit näkyvät uusimmasta vanhimpaan, mutta tekstien sisällä aika kuitenkin kulkee kronologisesti. Tämä tappaa luettavuuden. Lisäksi osa noista tekstuaalisista ratkaisuista ko. blogissa on vähintäänkin luovia, joten teksti piti kirjoittaa puhtaaksi.

Päätin että MERPG1 täytyy jakaa kahtia, jotta jonkinlainen peli saadaan ulos ennen vuotta 2020. Se ei ollut ainoa syy, mutta niiden tarkempi analysointi vaatisi oman tekstinsä (jota ette minut tuntien tule saamaan :) en minä osaa kirjoittaa mistään yleishyödyllisestä). Nyt, vuosi hidastahtisen puhtaaksikirjoittamisen aloituksen jälkeen ensimmäinen puoli kässäriä on valmis, ja pian pitäisi siirtyä taas koodin kimppuun. Tässi voisi ehkä harkita karttasuunnittelua kun ehtii ;) ja kun olen varmistanut ettei karttaohjelma ole mädäntynyt rikki

tl;dr

Merpg.websiin(minun piti jo vuosi sitten siirtää tuo viuhkaan wordpressille...) on ilmestynyt uusi sivu: Dokumentit. Sinne on julkaistu kässärin julkaisukelpoinen, mutta vielä muuttuva versio sekä odt:nä että docx:nä. Jos ette jaksa etsiä sivustolta, suorat linkit ovat tässä:
Sivistyneistä kommenteista ei ole mitään haittaa :)

Wednesday, 26 December 2012

MERPG-runo

Huomasinpa kirjoittaneeni MERPGin ensimmäisen osan loppupuolelle paikallisen ilkimyksen lausuman runon. Jaanpa sen nyt suurelle yleisölle ennen varsinaista kässäriä:

Kellojen soidessa kaupungin yllä
Taivaiden hämärtyessä tähtien alla
He huomasivat ajan liekeissä olevan

Vuorella makaa pelastus
Horisontissa lähestyy kuolema
Raukat pelkäävät, heikot vihaavat
Vahva on vain syytös

Kuka meidät synkästä yöstä pelastaisi?
Kuka vuorelle muurin rakentaisi
Kuka Samettitakin lunastaisi?

Ettekö te tyhmät huomaa
verta, jolla kirjanne on kirjoitettu
hikeä, jolla muuri suojaksenne on rakennettu
kyyneliä, jotka vuodatan tämän maailman vuoksi

Laulakaa turhasta toivosta
Kertokaa tarinoita viattomuudesta
Lukekaa sanoja kauneudesta
Lausukaa säkeitä tuhosta

Olette taistelussa, jota teidän ei ole tarkoitettu voittavan

Ja jos jollekulle tulee olo siitä, että tätä kirjoittaessa on kuunneltu Sonata Arctican Wildfire-trioa, olo on aivan oikea.

Saturday, 8 December 2012

MEsEstä tietoa


Mese taas toiminnassa.

Viritin viuhkaan ikivanhan tomcat 7.16:n (nykyversio on joku 7.33, 7.16 oli uusin versio silloin kun viuhkassatoimimisen mahdollistavat kustomisaatiot tehtiin tomcatin tiedostoihin, ja nämä kustomoidut tiedostot ovat hajonneet uusien versioiden myötä), ja asensin MEsErverin sinne. Käänsin MEsE-clientistä uuden version, ja heitin sen ME-säilöön, eli se ei ole vielä julkisessa jakelussa. Minun pitäisi päivittää heinäkuista speksiä, sekä rakentaa lopultakin jokin jakelutoteutus, sekä bugiseuranta, mutta nyt tämä posti saa toimia MEsEn/yool-messengerin bugiseurantamediana. Tässä tunnetut "ominaisuudet":
  • Käyttöliittymä vastailee etenkin käynnistyessään tuplaklikkeihin vähän huonosti, ja keskusteluikkunoita aukeaa helposti neljäkin kappaletta
  • Timeout-uloskirjautumisessa KESTÄÄ, joten älkää kaatako niitä clienttejänne. Ikkunan sulkemisen pitäisi lähettää palvelimelle logout-signaali
  • Kohtasin clientillä kummallisen kaatumisen. Jos saat "{exception-message} unhandled. Application closing." - viestin, jonka jälkeen ohjelma sammuu, ole hyvä ja hihku minulle.
  • Pääikkunan sulkeminen tappaa client-prosessin (kauniisti), joten ÄLÄ SULJE SITÄ, ellei tarkoituksesi ole kirjautua ulos
  • Spämmit kulkevat, mutta jos palvelin kaatuu, varastoon menneet spämmit katoavat. Spämmit eivät siis ole luotettava viestintätapa tiedolle, jonka on pakko päästä perille
  • Kuvan ja näyttönimen vaihto ei tällä hetkellä onnistu kuin tietokannasta käsin. Näille pitänee rakentaa joku UI.
  • Puolet speksatuista ominaisuuksista puuttuvat :)
Jos olet Tässi, MEsE:n asennusohjelma on ME-säilössä, olettaen palvelimen kestävän tämän illan stressitestit, ja tunnukset ovat samat kuin Pröngiin. (olettaen ettet ole salasanaa muuttanut puoleen vuoteen.... Voiko sitä muuttaa Pröngissä?). Jos et, saat odottaa hetken MEsEä :P

Jos kohtaatte hassuja ominaisuuksia, keksitte kehitettävää, tai kohtaatte Application closing - viestin, kommentoikaa tämän tekstin kommentteihin

Saturday, 3 November 2012

Se pidempi teksti Pröngistä

Pröng on julkaistu

Muistaakseni lupasin laajemman tekstin Pröngistä tälle viikolle. Saa nähdä ehdinkö ihan tavoitteeseeni, viikko lähentelee hälyttävästi loppuaan, ja toivon etten kirjoittele ensi viikolla ennen sunnuntaina kuin kaksi kertaa: matkalla tampereelle ja matkalla sieltä kotiin. Muuten suunnitelmananani on olla olematta kovin aktiivinen ensiviikolla internetissä syistä, joista voisi joskus olla jännä kirjoittaa. Ei kuitenkaan ensi viikolla. Ensi viikolla olen kirjoittamatta syistä, joista en halua kirjoittaa ensi viikolla, koska haluan kirjoittaa niistä ensi viikolla. Lupaava alku tekstille: tietäkää takana olevan tehokas MERPGinkehityssessio, mikä ei koskaan lupaa koherenttia tekstintuottoa. Tästäkin sen näkee: otsikko kertoo Pröngistä, ja nyt olen lähinnä mussuttanut siitä, miten en halua haluta olla haluamatta.

Julkaisin siis uuden koodin tiistaina Pröngissä. Eilen, kun Pröng joutui kehittelyjen ja saunonnan vuoksi tosikäyttöön, selvisi kaksi asiaa, jotka olemme listanneet edellisen postin kommentteihin: Luonnoksen lisäys oli rikki, ja rivinvaihtoja järjestelmä tukee taas miten jaksaa. Vanha koodi muutti luonnos-lomakkeelta saamastaan luonnoksesta \n - merkit <br> - merkeiksi, eli html-rivinvaihdoiksi, ja sen jälkeen se poisti tekstistä kaikki pelottavat html-merkinnät ja tallensi sen kantaan. Näinhän tätä ei todellakaan olisi kannattanut tehdä: mitä jos datasta ollaan kiinnostuneita Pröngin ulkopuolella? Mitä jos joskus tehdään esim. WPF-ohjelma, joka on kiinnostunut datasta, mutta ei todellakaan osaa käsitellä HTMLää. Oikea paikka pelottavien html-merkintöjen siivoamiselle olisi ollut esityskerros, eli ne olisi siivottu juuri ennenkuin ne echotetaan selaimelle.

Tästä voidaan päätellä että kannassa on rivinvaihtoja monenlaisissa muodoissa. Tästä näette oireen huonosti kohdellusta tietokannasta. Ensi viikon jälkeen pitäisi läpikäydä luonnokset käsin ja korjata tuollaiset poikkeamat. Toinen toteuttamista odottava projekti on säätää luonnoksen esittävä proseduuri muuttamaan \n - rivinvaihdot <br> - merkinnöiksi. Tallennusproseduuri tietääkseni tallentaa rivinvaihdot ihan validisti kantaan asti, mutta en ole vielä testannut, ja pyydän ettei kukaan muukaan menisi testaamaan.

Luonnosten rikkonaisuudesta vielä. Yritin lisätä Pröngiin Luonnosta 519, "Voi hitsi kun voikukkia ei voi syödä", kun kohtasin yllättävää käyttäytymistä: Se ei lisäytynyt kantaan. Ihmettelin minuutin että mitä hittoa, sitten tajusin ongelman. Joku viisas joskus kertoi miten historiaa tuntemattomat ovat tuomittuja toistamaan sitä. Olin ilmeisesti unohtanut oman historiani, sillä kuten ainakin Tässi muistaa, vanhassa Pröngissä oli koko elämänsä ajan sellainen ongelma, että kaikki LID-linkit osoittivat devpröngin puolelle. Nyt oli käynyt samoin: luonnostenlisäysformi osoitti devpröngiin! Yllättäen sessio, joka oli olemassa osoitteessa prong.viuhka.fi, ei enää ollutaan olemassa feuer.viuhka.fi:ssä, jolloin autentikointikoodi ilmoitti että tähän kantaanhan ei sitten kirjoiteta mitään.

Arkkitehtuurista

Nyt taas tuntuu siltä, että tällä arkkitehtuurilla päästään pitkälle. Perusrakenne on lopultakin aitoa MVC:tä. Frontcontroller valitsee cmd-urlparametrin perusteella asianmukaisen controllerin, joka hakee tietokannasta tarvittavan datan ja lähettää sen vapaasti valitsemalleen näkymälle. Muistaakseni haukuin PHP:n erilaisten model/ORM - toteutusten tasoa blogissa aiemmin, ja selitin suunnittelevani omaa mapper-toteutusta. Noh, minähän kirjoitin sellaisen. Pröngissä kaikki domain-oliot periytyvät Entiteetti-luokasta, joka sisältää ison mapin, johon olioiden ominaisuudet tallennetaan. Entiteetti-luokassa on myös ylikirjoitettu set() ja get() - metodit, joita kutsutaan jos PHP ei löydä oliolta sellaista kenttää, jota ohjelmoija yrittää käsitellä. Nämähän sitten asettavat ja hakevat datansa tästä mapista, jolla myös tietokannan ja XML:n teko tekeminen helpottuvat.

Tietokanta on myös kiva. PDO:n vuoksi mallikerros ei tiedä mitään käytössä olevasta tietokannasta. Olioilla on ApplyToDatabase() - metodi, joka tarkistaa löytyykö olio kannasta, ja tuloksen mukaan ohjaa sisäisen datamappinsa joko Database::Insert()ille tai Database::Update()lle. Hakuproseduurit taas ovat lispihtäviä. Database-luokalla on metodi SelectAll(), jolle annetaan tyhjä, hakukohteen tyyppinen olio parametrina, ja se hakee kaikki oliot parametrin nimeämästä taulusta. Database::SelectAll(new Luonnos()); siis palauttaa kaikki luonnokset, Database::SelectAll(new Kommentti()); kaikki kommentit, ja niin edespäin. Toinen hakuun liittyvä metdoi, Database::SelectWhere() ottaa tauluparametrin lisäksi predikaattifunktion, jonka avulla se sitten suodattaa palautettavan joukon. Esimerkiksi Database::SelectWhere(new Luonnos(), function($luonnos) {return $luonnos->LID > 300;}); palauttaa kaikki luonnokset, joiden LID on yli 300.

Näitä metodeja käytän koodissa melko vapasti. Kuten kukin voi arvata, jos jokaisen luonnoksen latauksessa läpikäydään koko tagien- ja kommenttien joukko, lähentelee operaation big-O - lukema kompleksisuutta O(MG). Sen kanssa on vain pakko elää, kunnes alan jäädyttää koodin ominaisuuksia korvaamalla Database::Select*() - kyselyjä joihinkin optimoidumpiin, ei niin dynaamisiin toteutuksiin. Kompleksisuus ei ole kuitenkaan itsessään pullonkaula. Pullonkaula on tietokanta: Arkiston lataus tuotti kuusi TUHATTA "select * from tagit" - kyselyä, mikä meni läpi kehitysserverillä juuri ja juuri naurettavien vasteaikojen kanssa, mutta jolle piti kehittää ratkaisu kun viuhkan PHP ilmoitti ettei onnistu. Helppoa: Kakutetaan ensimmäisen SELECT * FROM T - kyselyn tulokset, ja palautetaan ne, ellei parametrilla spesifioida että halutaan päästä kakun ohi kantaan. Tämä toimii, koska PHP-sivujen elinaika on sellainen, että joka sivunlatauksella aloitetaan alusta.

Nyt on pakko kyllä lopettaa. Tämä teksti vaikuttaa niin sekavalta, etten uskalla jatkaa enempää, ja alkaa muutenkin peti kutsua. Nähdään taas joskus.