Archive for October, 2007

Dienas citāts

Wednesday, October 31st, 2007
Can you run Emacs inside Vi? NO, can you do the contrary? YES.

All that proves is that emacs users need vi commands more than vi users need repetitive strain injury.

Debugging

Tuesday, October 30th, 2007

Onkulim izrādījās taisnība: “Atkļūdošana ir divreiz sarežģītāka nekā programmēšana. Tāpēc, rakstot pēc iespējas gudrāku kodu, tu neesi pietiekoši gudrs, lai to atkļūdotu”, un tā es pazaudēju divas dienas.

Nekā personīgā

Wednesday, October 24th, 2007

Bijušo Latvijas 1. televīzijas žurnālistu jaunā garadarba Nekā personīga reklāma TV3 ēterā man izklausās apmēram šādi:

ejiet dirst

nekā personīga, mums vienkārši patīk sūtīt dirst

un, protams, nekā personīga

Tādēļ, ka kopš “De Facto” laikiem man viņu tonis un stils šķiet uzbrūkošs, nosodošs un sīkumains. Š½urnālistiem, manuprāt, vajadzētu būt neitrālākiem. Š ī reklāma atgādina taisnošanos, kad ir neērti vai bail paust savu viedokli par kādu un tādēļ, papildus negatīvas attieksmes paušanai, tiek piemeklēti dažādi attaisnojumi: “Es cilvēku X ciest nevaru, bet gan jau viņš ir labs cilvēks”.

Nekā personīga, man vienkārši tā liekas.

C++ binary compatibility

Tuesday, October 23rd, 2007

C++ klases definīcijas tiek glabātas header failā, arī viss, kas tiek uzskatīts par private. Tas ļauj veidot objektus stekā, nevis heap atmiņā, un to nevar izdarīt, ja kompilators nezin klases izmēru. Tajā pašā laikā klases lietotāji kļūst pārāk atkarīgi no klases realizācijas un kaut kur pazūd informācijas slēpšana.

#ifdef” nav veids, kā risināt savietojamības problēmas. (Š odien gribas iespert cilvēkiem, kas tā dara.) Pareizais veids kā mazināt atkarību no klases atribūtiem un nodrošināt savietojamību, ir radīt jaunu klasi atribūtu glabāšanai un header failā to tikai deklarēt:

class FooPrivate;
class Foo {
private:
    FooPrivate *priv;
...
};

Pašu privāto klasi vajag definēt kodā, kas to izmanto:

class FooPrivate {
public:
    std::string foo;
};
...
Foo::Foo() {
    priv = new FooPrivate;
    ...
}
Foo::~Foo() {
    delete priv;
    ...
}
void Foo::doStuff() {
    ...
    blah += priv->foo;
    ...
}

Vismaz šādi to dara GNOME, KDE un citās bibliotēkās. Plašāka informācija par C++ binārās savietojamības problēmām.

Copy/Paste detection

Wednesday, October 17th, 2007

“One of my most productive days was throwing away 1000 lines of code.”
– Ken Thompson.

Jo mazāk koda, jo labāk. Veicot rudens koda tīrīšanu, izmēģināju Java programmu PMD/CPD, kura, papildus citām iespējām, māk atrast ar copy/paste ražotu kodu. Lai gan, spriežot pēc sākumlapas, PMD ir vairāk orientēts uz nepilnību atrašanu Java kodā, CPD daļa atbalsta arī C/C++ kodu. PMD parsē programmas kodu, būvē abstraktu sintakses koku (AST) un tieši to izmanto programmas analīzei. Tas ļauj atrast līdzīgu kodu pat tad, ja tiek lietoti citi mainīgo nosaukumi.

PMD instalēšana Gentoo GNU/Linux ir tik vienkārša, ka kļūst žēl Windows lietotāju – emerge pmd un export CLASSPATH=`java-config -p pmd,backport-util-concurrent`. Pēc tam CPD var uzrīdīt kodam:
java net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files /path/to/c/source --language cpp

PMD spēja apstrādāt lielāko daļu C++ koda un pat, grrr, Better C. Dažus sīkumus dažu cilvēku kodā gan nesaprata, piemēram virkni “\%” printf parametros vai “” normālas koda rindiņas beigās. Mainot --minimum-tokens vērtību var meklēt lielākus vai mazākus līdzīgus koda fragmentus. Lai gan prātīgāk ir sākt ar lielākiem koda gabaliem un mazos atstāt brīžiem, kad kļūs pavisam garlaicīgi. Patīkami, ka programma pat ar --minimum-tokens 50 neko neatrada libDRY bibliotēkā, kur nonāk dažāds koplietošanas kods, kurš īsti neiederas esošajās bibliotēkās un ir pārāk īss, lai dzīvotu atsevišķā bibliotēkā. Citur gan tik labi neklājās.

Bet ne viss kods, kas izskatās pēc copy/paste, tāds ir. Ir, protams, cilvēki, kuri nemāk izmantot vai papildināt bibliotēkas. Līdzīga koda atkārtošanās var signalizēt arī par kādas funkcionalitātes trūkumu bibliotēkās vai sliktu interfeisu, kas uzspiež rakstīt boilerplate kodu. Dažreiz to var viegli pamanīt vizuāli, bet programma to noteikti var paveikt ātrāk un lielākā koda daudzumā.

Nākotnē būs jāiemācās lietot interesantais Squash, kas ļauj automatizēt sarežģītāku koda pārrakstīšanu nekā vienkāršs search/replace. Līdzīgi kā PMD, šis rīks apstrādā parsētu kodu un meklē token virknes, kas atbilst uzdotam šablonam un pārraksta to ar vajadzīgo kodu.

WTF of the week

Tuesday, October 16th, 2007

C++ sagādā pārsteigumus. Vakar saskāros ar kļūdu, kurai risinājumu atradu uzreiz, otrais minējums par cēloņiem un izpildes ceļu bija gandrīz pareizs, bet kāpēc tā notiek un kāpēc kompilators izvēlas tādu izpildes ceļu, neesmu sapratis arī tagad. Lai gan tas noteikti ir pieminēts C++ standartā un saistīts ar veidu kā C++ piemeklē funkcijas, kuras var būt pārlādētas ar citu parametru tipu, kuri konstruktorā var saņemt tekošo tipu un $@&*$@&%. Kompilatoram noteikti ir taisnība, viņam tāpat grūti ar C++ un šoreiz es nemēģināšu to saprast.

Zemāk ir minimāls piemērs, kurš demonstrē WTF. Pārdesmit koda rindiņās to pamanīt nevajadzētu būt grūti. Katrs, kurš “zin C++” (kāds no 5 cilvēkiem?), var mēģināt to izskaidrot – nevis kas kodā ir nepareizi (to es sapratu uzreiz), bet kādēļ rezultāts ir tāds kāds ir.

#include <stdio.h>

class Poop {
public:
    Poop & operator >> (long &value) {
        value = 13;
        return *this;
    }

    operator bool() {
        return true;
    }
};

int main()
{
    int value = 0;
    Poop poop;

    poop >> value;
    printf("value = %d\n", value);
    return value;
}

Vismaz GCC versijas 2.95.2, 3.3.5 un 4.1.2 šo kodu kompilē bez kļūdām, lai gan pirmā un pēdējā, kad ieslēgti visi brīdinājumi (-Wall), lamājas par “warning: value computed is not used”.

(more…)

Better bash

Sunday, October 14th, 2007

Dzīve sagādā pārsteigumus. Kādreiz mani fascinēja labāks C, toties piektdien “apsēdos” un apmulsu, kad ieraudzīju labāku bash. Tādas sajūtas laikam bija Austrālijas atklājējiem, kad ieraudzīja ķengurus, pīļknābjus un citus dabas brīnumus. Cilvēks realizējis try/catch izņēmumu apstrādei un komandu rezultāta kodus kā izņēmumus. Bash skriptā!

try "Copy $src to $dst"
    copy_file $src $dst
catch "Failed to copy $src"

The Wide Finder Project

Monday, October 8th, 2007

Tim Bray turpina darbu pie rakstu sērijas par Wide Finder (un Wide Finder Roundup), kas izraisījusi interesantus komentārus un diskusijas starp dažādu programmēšanas valodu faniem. Viss sākās no mēģinājuma Erlang programmēšanas valodā uzrakstīt žurnālfailu apstrādi. Man visu laiku bija vēlme paspēlēties ar Erlang, bet, paskatoties dažādus risinājumus, šī vēlme pārgāja.

Maza daļa taisnības ir cilvēkiem, kas saka, ka žurnālfailu apstrāda nav Erlang uzdevums un to pašu var paveikt ar dažām UNIX komandām. Tomēr man šķiet, ka mūsdienās nav daudz programmu speciālu uzdevumu risināšanai. Gandrīz katra sevi cienoša programma raksta žurnālfailus, izmanto datubāzi, komunicē ar citām programmām un procesiem: valodas universāla lietošana ir prasība, nevis papildus labums. Tāpēc Erlang lieliskais laiksakritības (concurrency) atbalsts, ja tic publikācijām, nav tā vērts, lai samierinātos ar sliktām vai stipri viduvējām iespējām citās jomās.

Vēl smieklīgāki ir cilvēki, kas saka: “Erlang šim uzdevumam nav paredzēts, labāk pamēģini valodu X (par kuras pastāvēšanu es pirmo reizi dzirdu)“. Toties Fredrik Lundh demonstrē vairākus risinājumus Pitonā, kas ir vienkārši un eleganti: viena, vairākpavedienu un vairāk-procesu variantus.

American Idol

Friday, October 5th, 2007

Esmu atklājis jaunu humoršovu, kurš nu jau ir kļuvis par manu mīļāko – American Idol. Neviens scenārija autors nespētu izdomāt tādus personāžus, kādi uzrodas reālajā dzīvē. Cilvēki, kas nemāk un nekad nemācēs dziedāt, toties ar augstu pašapziņu. Ä»oti labi dziedātāji bez jebkādas pašapziņas. Un vēl frīki, pēc kuriem ilgojas Tvaika iela. Nu patīk man pasmieties par cilvēku emocijām, neadekvāto reakciju, salauztajiem sapņiem – galu galā paši vainīgi, ka piedalās šovā. Vakar sapratu otru patikšanas iemeslu. Simon Cowell, pēc dzeršanas līdz 3 naktī, nokavēja šova sākumu un bez viņa piezīmēm šovs vairs nebija tāds kā agrāk. Cilvēks ar Gregory House līdzīgu uzvedību un viņš ir īsts, wow.