28. toukokuu 2011, 18:58

Konffitiedostojen toteuttamisesta

Erilaisia rc-tiedostoja (runtime configuration) on vaikka pilvin pimein, ja syitä tähän on monia. Yksi on erilaiset vaatimukset hyvältä konffilta, ja toisaalta toinen on että alkeelliset konffilukijat syntyvät jo parilla rivillä. Kehittyneintä puolta edustaa Xmonadin ja DWM:n suunnittelumalli “konffista-käännetään-ajettavat”. Toimii, jos käytät kehittynyttä ja sofistikoitunutta kieltä (DWM, epäonnistuit juuri).

Alkeellisimpia lukijoita C++:lla

Kirjoitin erästä soittolistaohjelmaa varten hyvin alkeellisen lukijan. Hyviä puolia ovat esimerkiksi kovakoodattujen vakioiden puute. Harmikseni en vain koskaan saanut loppua ohjelmaa niin valmiiksi, että konffilla olisi ollut kovasti käyttöä. Koitanpa etsiä sen tähän:

string temp;
std::ifstream config (file.c_str());
if(config.is_open()) {
    // check out config line by line
    while(config.peek() != EOF) {
        std::getline(config, temp);
        TrimSpaces(temp);
        if(temp[0] == '#')  // we could add some extra comment markers here
            continue; // to the next line

        // fetch the position of '='
        size_t loc = temp.find_first_of('=');
        if(loc == string::npos)
            continue;	// some issues here

        string name, value; // the parts of the config setting line
        name = temp.substr(0, loc);
        value = temp.substr(loc+1);

        // insert the succesful pair into the config map:
        this->config.insert(std::pair<string, string>(name, value));
    }
    config.close();
}

No, koodini on kirjoitettu aika kauan aikaa sitten. Nyttemmin asian voisi hoitaa hyvinkin elegantisti. Idea on kuitenkin hyvä: yksinkertaisesti työnnetään koko konffin avain-asetusparit kuvaukseen, josta ne on sitten helppo kaivaa esille. Lukuasetuksia varten pitäisi koodata vähän lisää abstraktiota, mutta noin muuten. Se toimi täydellisesti niihin toimiin, joihin sitä itse tarvitsin (lähinnä tallentamaan käyttäjätunnuksen ja salasanan verkkoyhteyttä varten).

Fiksummat konffitiedostot

Edelläkuvattu malli on tavallaan kytköksissä kaikkiin alkeellisia avain-asetus -pareja sisältäviin asetustiedostoihin. Tavallisesti enempää ei tarvitse ollakaan. Toki listoja ja kuvauksia sisältävät JSON-muotoiset konffit ovat askel eteenpäin nykyisestä, mutta periaatteessa sitä samaa kauraa.

Erikoistuneita DSL -kieliä seuraa Turing-täydelliset kielet. Eric S. Raymondin mukaan joskus kannattaa huolehtia, että konffikieli ei ole Turing-täydellinen, ja joskus kannattaa varmistaa, että se on.

Jos mennään turing-täydellisiin kieliin, niin on mukavaa käyttää olemassaolevia kieliä, joille on kieliä ja muuta. Yleisimmät kielet tähän hommaan ovat Lua ja Scheme. Kumpikin rajusti kustomoitavissa, sekä kevyitä, ja helposti integroitavissa isompaan ohjelmaan. Tänään StackOverflow-kysymyksen innoittamana tutkin JScheme-nimistä Scheme-toteutusta Javalle.

Schemen minimalistisuus kannustaa konffien luomiseen. JScheme on nopea pirulainen, ja tukee kaikkea Schemen hyvää, kuten TCO:takin. Mitä se ei tue, esimerkiksi isoja lukuja, joten se on vähän kamala siinä suhteessa. JSchemellinen java-ohjelma käynnistyy rajun nopeasti. Pitäisi kirjoitella vastaava perusviritelmä Clojurelle, jotta voi verrata. Nykyisiä ratkaisuja voi lukea täältä.

Totta puhuen, JScheme jätti vähän pahan maun suuhun. Kaikki pitää hakea javan puolelle manuaalisesti. Toki ratkaisu löytyy tavalla tai toisella: saada kaikki kuvauksessa on minusta se ideaalisin ratkaisu. Kuitenkin Clojure pitää kääntää ensin, ja se on hidasta. Ja muutenkin Clojure on suunniteltu staattisia komponentteja varten, ei tulkattavia käynnistysskriptejä varten: missään ei ole kunnon ohjeita tai puheita tästä. Kaikki Clojure-Java -yhteenkäymiseen liittyvä keskustelu on pitkälti keskustelua Clojure-koodin kääntämisestä java-luokiksi. Tätä tuskin käyttäjämme haluaa joka muutoksen jälkeen tehdä. Ja varamsti sen käännöksen voi tehdä javassakin. Hidasta kuitenkin.

Eli päädymme puolivälitauolle: toivottavasti tiedostamme staattisen konffitiedoston heikkoudet, ja ymmärrämme Turing-täydellisen kielen hyödyt. Mutta sitten teknisesti emme ole saaneet vielä toimivaa systeemiä parsittua kasaan.

Tageja: , , , , ,

---
---

---

Aiheen vierestä