Subversion ja versionhallinta

Kaikki enemmän tai vähemmän ohjelmointiin tutustuneet varmasti tietävät, että koodia on kätevää säilyttää versionhallinnassa. Pieniäkin projekteja on suhteellisen vaivatonta ja hyödyllistä säilyttää esimerkiksi Subversion-versionhallinnassa, vaikkapa ihan vain omalla työasemalla sijaitsevassa repositoryssä.

Versionhallinta on tietenkin omimmillaan isommissa projekteissa, joissa toteuttajia on useita ja repository sijaitsee keskitetysti jollain palvelimella. Versionhallinnan ei tarvitse rajoittua pelkästään sovelluskoodiin, vaan sen voi ulottaa muihinkin muuttuviin ja versioitaviin projekteihin, kuten esimerkiksi PL/SQL-paketteihin ja asetustiedostoihin.

Coding Horror -blogi ohjeistaa kätevästi Subversionin (SVN) asennuksessa omalle koneelle ja kattaa myös hieman versionhallinnan perusteita. Subversion onkin kohtalaisen hyvin tuettu eri ohjelmien toimesta ja sille on saatavilla useita eri ohjelmistoja eri alustoille kuten TortoiseSVN, SubCommander ja Eclipseen saatava Subversive. Muista ohjelmista mainittakoon Trac, joka tarjoaa projekteille viritellyn wikin, tikettiträkkerin ja liitynnän Subversioniin.

Jos versionhallinta yleisesti ei ole tuttu asia, kannattaa vilkaista visuaalinen opastus versionhallintaan ja sen toteuttamisesta keskitettynä mallina Subversionilla löytyy kattava Version Control with Subversion -kirja.

Vaihtoehtona hajautettu versionhallinta?
Versionhallintaa voi toteuttaa myös hajautettuna mallina, kuten Linuxin Kernelin kehittämisessä Gitiä käyttäen. Muita hajautettuja malleja ovat muun muassa Mercurial (mm. Mozilla) ja Bazaar (mm. Ubuntu). Keskitettyyn malliin verrattuna hajautetussa mallissa on esimerkiksi jokaisella kehittäjällä oma paikallinen repository. Hajautetuista lähteistä tulokset yhdistetään erilaisin perusteilla, kuten määrättyjen projektijäsenten päätöksillä mitkä muutokset siirretään eteenpäin tai sitten voidaan käyttää keskitetyn mallin tapaa. Hajautetun mallin järjestelmät ovat yleistymässä, mutta muutos keskitetystä mallista hajautettuun vaatii totuttelua. Pitämällä paikallista repositoryä, päästään aina käsiksi historiatietoon, sekä saadaan versionhallinnan tarjoamat edut ilman koodin yleisesti julkistamista.

Versionhallinta onkin osaltaan myös uskonnollinen kysymys samalla tavalla, kuten esimerkiksi käyttääkö vimiä vai emacsia, KDE:tä vai Gnomea tai Linuxia vai Windowsia. Erilaisista versionhallintamalleista löytyykin vahvoja mielipiteitä, kuten Linus Torvaldsin esitys hajautetun mallin Gitistä osoittaa. Yleisesti katsottuna tärkeintä kuitenkin on, että käytössä on edes jokin versionhallintajärjestelmä. Oli se sitten Subversion, Git, Mercurial, Bazaar tai vanha kunnon CVS.

Subversionilla alkuun
Tavallaan Subversionin ja yleisesti ottaen keskitetyn versionhallinnan voisi sanoa olevan jo hieman vanhentunutta, mutta Subversion tarjoaa tällä hetkellä helposti lähestyttävän ja hyvin tuetun kokonaisuuden versionhallintaan.

Toisaalta taas Subversionissa on heikkouksiakin, joten muihinkin vaihtoehtoihin kannattanee tutustua, kun perusteet ovat hallussa. Etenkin hajautettu malli vaikuttaa ihan kätevältä.

Ohjelmointi kuin urheiluharrastus, harjoittelulla parempiin tuloksiin

Joulun kiireiden keskellä on hyvä pysähtyä ja irtautua arkielämän hössötyksistä ja syventyä hyvän kirjallisuuden ääreen tai tietoteknisten harrastusten pariin. Vaihtoehtoja ajanvietteeksi on monia ja Codeulate-blogi tarjoaa vaihtoehdoksi harjoittelua: ohjelmoinnin harjoittelua. Vaikka ohjelmointitaidot olisivatkin jo hallussa valitsemallasi ohjelmointikielellä, on hyvä silti panostaa harjoitteluun. Ohjelmointia voi käsitellä kuin mitä tahansa urheilu- tai musiikkiharrastusta; paremmaksi kehitytään vain harjoittelemalla.

Ohjelmointia voi harjoitella erilaisilla tavoilla ja Internetissä on tarjolla erilaisia sivustoja, jotka tarjoavat älynystöreille harjoitteita. Project Euler lähestyy aihetta matemaattisten ongelmien kautta ja ratkaisut eivät vaadi tutkintoa matematiikasta. Python Challenge vastaa tarjoamalla 33-tasoisen haasteen. Molemmilla sivustoilla on ongelmien lisäksi tarjolla ratkaisut ja keskustelufoorumi muiden ohjelmoijien ratkaisujen tutkimiseen. Vastaavasti 99 Prolog -ongelmaa keskittyy loogiseen ongelmanratkontaa ja tarjoaa ratkaisut Prologilla toteuttuna. Ongelmia voi tietenkin ratkoa haluamallaan ohjelmointikielellä.

Ohjelmoinnin harjoittelemisessa ei kuitenkaan ole kiire ja teokset, jotka mainostavat ”Opi ohjelmointikieli X 21 päivässä” -otsikolla pitäisikin itseasiassa otsikoida ”Opettele ohjelmoimaan 10 vuodessa”. 3 päivässä, viikossa tai kuukaudessa saa vain pintapuolisen käsityksen jostakin ohjelmointikielestä ja todellinen hallitseminen ja käsittäminen tapahtuu pidemmällä aikajänteellä. Tutkimusten mukaan jonkin tietyn aiheen oppiminen ja hallitseminen vie 10 vuotta, oli se sitten shakin peluu, musisointi, maalaaminen, tennis tai ohjelmointi.

Oikotietä parempiin suorituksiin ei ole ja kuten monissa muissakin harrasteissa ja taidoissa, myös ohjelmoinnissa kehitytään paremmaksi vain harjoittelemalla ja mahdollisesti harjoittelemalla laaja-alaisesti. Yhtäläisyyksiä löytyy myös siinä, että toiset vain ovat parempia kuin toiset ja vain lahjattomat treenaavat.

Jos pelaaminen on liian helppoa, rakenna Guitar Hero -botti

Pelien pelaaminen on usein kovin mekaanista ja loppujen lopuksi kohtalaisen yksinkertaista, mutta viihdyttävää ajanvietettä. Jos pelaaminen kuitenkin tarjoaa liian vähän haasteita, kannattaa esimerkiksi opettaa tietokone pelaamaan. Eräänä päivänä Xbox 360:lla Guitar Hero 2:sta pelatessaan Kevin Herron päätti toteuttaa ainakin yhden jänskän projektin sinä kesänä ja lopputuloksena oli Tom Hannu -Guitar Hero botti. Tietokoneohjelma, joka ensin opettelee Guitar Hero -pelin kappaleen ja tämän jälkeen soittaa sen.

Tom Hannun rakenne on selkeä ja toteutuskin kohtalaisen selkeä. Kokonaisuus jakautuu kahteen osaan: kitaraohjaimeen liitettyyn rautapuoleen ja kappaleiden opetteluun ja soittamiseen liittyvään ohjelmistopuoleen. Kitaraohjaimeen liittyvä puoli on toteutettu käyttämällä Parallax BASIC Stamp 1 Project -mikrokontrolleria, jossa on 4 MHz prosessori, 16 tavua muistia ja 8 I/O liitintä. Käytännössä mikrokontrolleri siis liitetään peliohjaimen nappeihin, jonka jälkeen voidaan välittää komentoja tietokoneelta sarjaliitäntää käyttäen ja painella soittimen nappeja.

Soittavan botin ohjelmistopuoli koostuu kolmesta erillisestä ohjelmasta: silmät, aivot ja sormet. ”Tomin silmät” -ohjelma toimii konenäkönä, jolla analysoidaan harjoitusmoodissa pelin soittovideo ja kerätään talteen kappaleen nuottikartta. ”Tomin aivot” -ohjelmalla tarkastellaan kerätty nuottikartta kappaleesta ja samalla voidaan tarvittaessa muokata nuotteja. Itse soittaminen tapahtuu ”Tomin sormet” -ohjelmalla, jolla voidaan lähettää napin painallus Xbox 360:n kitarasoittimelle ja soittaa kappaleen nuottikartta.

Tom Hannun projektisivuilta löytyy kuvia Tom Hannu -botista ja videoita ohjelmien toiminnasta. Lopputulos näyttää hyvältä, joskin onko pelaaminen enää hauskaa, jos tietokone tekee sen puolestasi. Sivuilta on lisäksi saatavilla lähdekoodit Tomin silmille ja aivoille, mutta Tomin sormia ei ole saatavilla. Ohjelmat on toteutettu käyttämällä Mac OS X:n frameworkkeja ja Xcodea.

Oivaltavaa ja varmasti erittäin opettavaista harrastelua pelaamisen sivutuotteena.

LTY:n .NET Sovelluskehitys -intensiivi, päivät 3, 4 ja 5

Päivät venyivät pitkiksi, kun tietotekniikan opiskelijat pääsivät Visual Studioon sisään ja koodia tulevaa sovellusta varten alkoi syntymään. Useat ryhmät olivat ideoinnin vähyyden ja tiukan aikataulun takia päätyneet kehittämään jonkinlaista kurssin harjoitustyönpalautus -web-sovellusta. Muita ideointeja oli muistiinpano -webtyökalu, opiskelumateriaalin tarjoaminen webin avulla, prosessorin muistioperaatio -simulaattori, kielenopiskelu -sovellus ja tietojen hakeminen web-sivulta.

Kurssin puolesta keskiviikkona ja torstaina oli muutamia demoja Visual Studion käytöstä ja valmiista komponenteista. Muutamat elementit sivulle ja käyttäjän autentikointi oli valmis. Osaltaan kätevää, mutta toisaalta valmiit elementit ja kehitysympäristö pakottivat tiettyyn toteutustyyliin. Ainakin Web-sovelluksen ja osittain tietokantojen näkökulmasta valmiit elementit tuottivat päänvaivaa. En ollut Googlen mukaan ainut, joka kirosi Sitemapin muotoilua. Valmiit elementit kuitenkin mahdollistivat nopean kehittämisen ja valmista jälkeä syntyi. Aikaa olisi vain voinut olla enemmän käytettävissä, vaikka päivät venyivätkin seuraavan päivän puolelle.

Perjantain palautustilaisuudessa valmiusasteet vaihtelivat, mutta aika hyvin oli valmista saatu tehtyä. Ulkoasun ja käytettävyyden viimeistely uupui lähes jokaisessa työssä, joka tosin oli oletettavaakin muutaman päivän projektia ajatellen. Oman ryhmäni Courserator -projekti liittyi harjoitustöiden palautukseen ja teknisesti kaikki ominaisuudet saatiin toteutettua. Myös ulkoasuun sijoitettiin hieman muita ryhmiä enemmän työaikaa, sillä viimeistelty työ luo hyvän mielen, eikä sen toteuttamiseen juuri aikaa mene. Projektista myöhemmin muutamia kuvia, kunhan pääsen takaisin kotiin.

Kurssin viimeisenä päivänä projektien esitystilaisuuden jälkeen myös palkittiin parhaana ideana ”Muistiinpanotyökalu”, teknisestä toteutuksesta ”Adaptive English learning application” ja ”Kurssien sivuilta tapahtumien parsettaminen omalle sivulle” ja ryhmien lisäksi palkittiin muutama osallistuja Code Camp -hengestä ja sisukkuudesta. Muista erottuvalla idealla pääsi pitkälle, vaikka toteutukseltaan moni ”harjoitustyön palautustyökalu” oli teknisesti toimivampi. Kielenopiskeluun liittyvä toteutus oli kyllä myös ideansa lisäksi teknisesti hyvä.

Kokonaisuudessaan .NET Sovelluskehitys -intesiivi oli hyvä kurssi, joskin Code Camp -henkisesti alkuviikon alustukset ja muutamat demot olisivat voineet keskittyä enemmän ratkaisuihin kuin arkkitehtuuriin ja sen yksityiskohtiin. Kehittäessä sovellusta tuli tutustuttua Visual Studioon, sen toiminnallisuuteen ja komponentteihin, mutta kehitysympäristön hallitsemiseksi hyvin, tarvittaisiin hieman lisää koodaamista.

Intensiivikurssista on vielä edessä viiden sivun raportin kirjoittaminen, joka on ”Imagine Cup” -kilpailua varten tähdätty, tarkoituksena kuvata idea ”Technology & Education” -aihepiirin projektista. Raporttia ei ole pakko lähettää kilpailuun ja luultavasti emme sitä sinne lähetä.

Päivitys 15.3.2007:
.Net Sovelluskehitys -intensiivikurssi sai myös huomiota paikalliselta medialta, kun Etelä-Saimaan toimittaja kävi paikalla kuvaajan kanssa. Tapahtumasta tehty juttu löytyy Etelä-Saimaan verkkosivuilta.

Microsoftin puolelta järjestävänä tahona mukana ollut Aali Alikoski kirjoittaa tapahtumasta blogissaan, josta löytyy myös muutamia kuvia.

LTY:n .NET Sovelluskehitys -intensiivi, päivä 2

.NET Sovelluskehitys -intensiivin toinen päivä alkoi mikroluokassa ohjelmointiympäristöön tutustumisella. Luokkaan oli asennettu valmiiksi Visual Studio 2005, mutta kaveri oli tietenkin onnistunut valitsemaan juuri yhden niistä neljästä koneesta, joissa Visual Studion asennus ei kunnolla toiminut. Onneksi ohjelmointiympäristön debug-ominaisuuskin saatiin kuntoon ylläpidon suoritettua noin pari tuntia yhteensä kestäneen korjaus- ja service pack -asennuksen.

Sillä välin kun muut leikkivät Visual Studiolla, ehdin todeta Monodevelop -ohjelman asentamisen OS X:lle mahdottomaksi. Fink ei löytänyt peileiltä haluttuja paketteja Gnome-työpöytäympäristön asentamiseksi. Kai ohjelman voisi asentaa käsinkin, mutta sivuilla olevat ohjeet ja lista useista paketeista, joita pitäisi kääntää tietyillä optioilla, ei oikein herätä innostusta. Lisäksi sivuilla mainittu MacUX -projekti Monodevelop -asennuspaketin kasaamiseksi OS X:lle, on kirjoitusten mukaan jäämässä kesken. Pitää vielä yrittää Finkin kautta asennusta, asentamalla ensin Gnomen eri lähteistä (stable) ja tämän jälkeen Monodevelopin (unstable).

OS X:lle tarjolla olevien .NET-järjestelmän -kehitystyökalujen suhteen on harmillista, että Monodevelopin asentaminen OS X:lle on turhan hankalaa ja muiden ohjelmien tuki ohjelmoijalle on olematonta. Vaikka XCode:lla voi ohjelmoida C#:ia, on sen käyttäminen aloittelijan lähtökohdista kohtalaisen hankalaa ilman minkäänlaisia ohjelmointiapuja. Yhtä hyvin voisi ohjelmoida vimillä. Leikin kuitenkin XCoden lisäksi hieman Interface Builder -ohjelmalla ja helpostihan Cocoa# -käyttöliittymä rakentui.

Päivä sisälsi myös katsauksen .NET-järjestelmän tarkempiin ominaisuuksiin ja toiminnallisuuteen ja näimme muutamia demoja. Ei mitään sinällään erikoista. Mainostaakseen Imagine Cupia Microsoft tarjosi jokaiselle kilpailusivustolle rekisteröityneelle yhden vapaavalintaisen kirjan ja pelin. Valitsin vaihtoehdoista ”ASP.NET 2.0 Applications: Advanced Topics” -kirjan ja ”Gears Of War” -pelin Xbox 360:lle, vaikka en kyseistä konsolia omistakaan. Pitänee kai harkita ostamista :)

Päivän lopuksi käsiteltiin kurssin arvosteluperusteita ja aihepiiriä, johon liittyen pitäisi perjantaihin mennessä koodata jonkinlainen Windows- tai Web-pohjainen sovellus. ”Technology & Education” -teema on sinällään läheinen, mutta järkevän sovelluksen kehittäminen lyhyessä ajassa tuo omat haasteensa. Aivan yksin ei sovellusta tarvi kehittää, vaan päivän aikana muodostettiin 3-4 hengen ryhmiä. Varsinaisen ohjelman jälkeen ryhmät jäivät ideoimaan voittajasovellustaan tähtäimessään perjantain koodijulkistus ja palkinnot. Voi olla hankalaa kehittää toimivaa ideaa näin lyhyessä ajassa, joka jaksaisi kantaa myös mainostettuun Imagine Cupiin. Eihän sitä tosin koskaan tiedä.

Huomenna ja torstaina aamupäivät on varattu luennoille ja iltapäivällä jatketaan koodausta. Aikaa ei juuri tuhlattavaksi ole.

LTY:n .NET Sovelluskehitys -intensiivi, päivä 1

Tänään alkoi Lappeenrannan teknillisen yliopiston järjestämä .NET Sovelluskehityskurssi, joka toteutetaan intensiivinä 5.3 – 9.3.2007 Code Camp -periaatteella. Ensimmäisen päivän ohjelmana oli Microsoftin sovelluskehityskiertue, joka käsitti katsauksen .NET kehitysympäristöön, ominaisuuksiin ja mahdollisuuksiin. Kurssi toimii myös lähtölaukauksena Imagine Cup:iin.

Microsoftin sovelluskehityskiertue oli jotakuinkin samanlainen kuin vuosi sitten, kun sellaisessa kävin. Alkuun yleisesti aiheesta, Imagine Cup:n mainostusta, jonka jälkeen käsiteltiin .NET-järjestelmää kohtalaisen yleisellä tasolla ja luotiin katsaus mitä .NET 3.0 tuo tullessaan. Lisäksi yhteistyökumppani kertoi työelämän tarpeista ja haasteista sovelluskehityksen parissa työskenneltäessä. Aiheiden välissä pidettiin sopivasti kahvitaukoja, jotka Microsoft ystävällisesti tarjosi ja jonka laskuun myös lounas meni. Tietenkin Microsoftin Visual Studio -kehitystyökalua ja kumppanuusohjelmia mainostettiin riittävästi. Kyllähän se Visual Studio ihan kivalta ja toimivalta näytti. Esitysten jälkeen ilta jatkui LTY:n rantasaunalla illanvieton ja vapaamuotoisen keskustelun merkeissä ja tarjolla oli syötävää, juotavaa ja sauna.

Tapahtuma oli ihan mukava ja esityksiäkin jaksoi kuunnella, vaikkakin aiheita käsiteltiin hieman liian yksinkertaisesti. .NET-ympäristöstä sai jonkinlaisen kuvan, mutta joitakin aiheita olisi voinut käsitellä hieman syvemmin ja jättää toisia aiheita, kuten C# esimerkkien rakentamista, hieman vähemmälle. Arkkitehtuuri ja mahdollisuudet käsiteltiin aika pintapuolisesti ja kokonaiskuva jäi aika hajanaiseksi; paljon kivoja ominaisuuksia, hienoja käyttöliittymiä, helppoa koodigeneroimista, erilaisia rajapintoja ja hyvät kehitystyökalut. Myös Vistan karkkimainen käyttöliittymä ja toiminta tulivat tutuiksi.

Huomenna intensiivikurssi jatkuu luennoilla, demoluennoilla, aiheen valinnalla ja koodaamisella. Asensinkin jo Mac OS X:lle Mono -ympäristön, XCode:en C# -pluginin. ASP.NET -sovelluksia voi ajaa Mono:n mukana tulleen XSP -palvelimen avulla. Kaikki tarvittava löytyi Mono -projektin sivuilta, mutta ympäristön voi asentaa myös Darwin Portsin kautta. Peruskoodit kuten C# HelloWorld.cs, Cocoa# -HelloWorld.app ja ASP.NET HelloWorld.aspx toimivat, joten asennus onnistui. Monon, C# -ympäristön ja XCoden käytöstä lisää myöhemmin.

Kurssilla koodausympäristönä toimii Visual Studio 2005, mutta oma Mono -ympäristö Mac OS X:ssä helpottaa ominaisuuksien testaamista ja samalla voi vertailla koodin toimivuutta .NET ja Mono -ympäristöissä. Nopeasti testattuna XCoden C# -pluginin tuki ohjelmoijalle oli olematonta, joten ohjelmointiympäristöjen vertailu ei ole mielekästä. Jos omistaisin Macbookin voisin ajaa Windowsia ja Visual Studiota Parallelin kautta ja silti nauttia OS X:n mukavuuksista.

Saa nähdä kuinka ahdasta huomenna mikroluokkaan ja koneiden äärelle tulee, sillä luokka on kohtalaisen pieni ja innokkaita koodaajia ensimmäisen päivän perusteella runsaasti.

LTY:n Tietoliikenteen kesäkoulu, päivä 2 ja Code Camp

Kesäkoulun toinen ja viimeinen päivä käynnistyi seminaareilla aiheista: ”IST Magnet / Beyond Magnet”, ”Rapid Prototyping of Ubiquitous Applications”, ”Evaluating Ubiquitous Applications” ja ”Advantages from PeerHood environment for application development”. Aiheet jatkoivat hieman samaa linjaa kuin ensimmäisenkin päivän seminaarit. Hieman ympäripyöreätä ja no, ehkä odotin seminaareilta hieman käytännöllisempiä aiheita. PeerHood oli taas liian tekninen, joka sekään ei oikein palvellut kokonaisuutta.

Iltapäivällä aiheet siirtyivät enemmän koodauspuolelle käsittäen aiheet ”Maemo”, ”Mobile application development with Python” ja demonstraatiot aiheista ”Server-side Context Tool for MUPE Application Development” ja ”Enter Sandman (MUPE Game Demo)”. Python ja Maemo vaikuttivat ihan hyviltä ja syksystä lähtien LTY:ssä ohjelmoinnin peruskurssi (massakurssi titeläisille ja mm. tutalaisille) käsittelee Pythonia entisen C-kielen asemesta.

Seminaarien ja demojen jälkeen ilta jatkui Code Campissä, jossa tavoitteena oli toteuttaa ”tieteellinen” sovellus Maemo-alustalle Nokia 770 laitteelle. Aikaa vajaa 22 tuntia, välineinä muutama Nokia 770 laite, GPS ja bluetooth-laitteita ja kehitysalustana Linux, jossa oli tarvittava Maemo-ympäristö asennettuna emulaattoreineen. Python vaikutti kielenä hyvältä ja koodia syntyi nopeasti, joskin itse keskityin sovelluksen graafiseen puoleen. Verrattuna viime kevään lyhyen katsauksen Symbian koodaukseen, oli Maemo selkeästi parempi alusta koodaria ajatellen.

Työn aihe ja toteutus olivat vapaita ja ryhmämme toteutti WinAmp-kaukosäätimen käyttämällä Pythonia ja WinAmpin HTTP-pluginia. Muut ryhmät tekivät muun muassa tiedostolistaajan, upload-palvelimen lisäten metatietoja lähetettyihin kuviin, lähistöllä olevien bluetooth-laitteiden paikannusta kartalle, babelfish-wrapperin ja pong-pelin. Toteutukset jäivät suurilta osin aika vajavaisiksi ja niinpä ryhmämme etäsoitin vei koodausleirin voiton. Ryhmä jossa olin mukana voitti viime vuonna koodausleirin GPS-nopeusmittari -sovelluksella. Kiertopalkintona oleva pizzalaatikko ja siinä olevat voittajien nimiplakaatit on nähtävillä LTY:n Tieto-Sähkötalon kuudennen kerroksen vitriinissä.

Kesäkoulun ja koodauksen jälkeen suuntasimme kohti Helsinkiä ja Assemblyjä, joiden tunnelmasta lisää myöhemmin.