Archive for the 'Piece of code' Category

2011-09-12Solr serveris lietuviško teksto paieškai

KąVeikiaValdžia.lt dokumentų paieškai naudoja galingą tekstų paieškos serverį — Apache Solr. Būtent šios technologijos dėka paieška tarp 60000 dokumentų (arba ~1.7 GB teksto) vyksta taip greitai.

Lietuviškų žodžių formas šis serveris atpažįsta dėka kodo sukurto Žygimanto Medelio, M. Petkevičiaus, Tomo Krilavičiaus.

Kadangi prisireikė šią technologiją panaudoti kitame projekte, o taip pat pastebėjau, jog kolegoms programuotojams sunku išmokti pasileisti ir naudoti Solr serverį, tai supakavau jį su visu lietuvių kalbos palaikymu ir padėjau viešam naudojimui į GitHub: emilis/solr-lt.

Pridėjau ir dokumentaciją pradedantiesiems… tiesa, darkyta anglų kalba.

Imkit, naudokit ir sėkmės jūsų darbuose!

P.S. Nepamirškit pasidalinti atgal pataisymais ir priminti man atnaujinti Solr versiją kai ji išeis. ;-)


2010-01-08Kaip parinkti šriftą puslapiui

Prieš kelias dienas man rimtai parūpo sutvarkyti vieno savo projektų dizainą. Kadangi ten daug teksto, tai nutariau patyrinėti kokiu šriftu geriau visą tą tekstą rodyti.

Problema gali atrodyti trivialiai išsprendžiama (parinkti Arial ir nesukti sau galvos), bet iš tiesų viskas yra sudėtingiau — neretai su geru šriftu, bet parinkus vidutinį dydį (kad akiniuočiai ir senimas įskaitytų) tekstas atrodo prastai.

Susiprogramavau sau tokį PHP skriptuką, kuris man parodytų visus protingo dydžio Arial, Tahoma ir Verdana dydžius:

<style type="text/css">

        .a { font-family: Arial; }
        .t { font-family: Tahoma; }
        .v { font-family: Verdana; }

        td {
            vertical-align: top;
        }

</style>
<table border="1" cellpadding="5" cellspacing="0">
<thead><tr><th>size</th><th>Arial</th><th>Tahoma</th><th>Verdana</th></tr></thead>
<tbody>
<?php

for ($i=8; $i<32; $i++)
{
    echo "<tr style=\"font-size: {$i}px\">";
    echo "<td>$i</td>";
    foreach (array("a", "t", "v") as $font)
    {
        echo "<td class=\"$font\">";
        echo "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam consequat tortor nec mi dignissim lobortis. Nulla pharetra viverra velit, vitae tincidunt diam bibendum a. Proin ultrices consectetur leo sit amet gravida. In venenatis placerat dictum. Maecenas eu elit non elit interdum tempor aliquam vel leo. Etiam ut posuere nibh. Phasellus quis tortor quis felis gravida rutrum. Nunc id molestie tortor. Maecenas eros neque, pulvinar sit amet elementum nec, aliquet id justo. Suspendisse elementum, magna facilisis iaculis laoreet, sem orci vulputate tortor, vitae adipiscing lorem orci vitae orci. Morbi accumsan consequat purus in sagittis. Duis in lacinia justo. Proin viverra rhoncus nunc, sit amet hendrerit urna mollis in. Integer eget augue pulvinar metus interdum egestas. Curabitur aliquam massa quis est lacinia in pulvinar nulla consequat. Aliquam erat volutpat.</p>";
        echo "<p>Quisque nec mauris orci. Cras tristique quam nec tortor adipiscing blandit. Quisque at purus lorem. Nam pellentesque ligula vel nisl imperdiet elementum sollicitudin orci iaculis. Vivamus ligula velit, accumsan sollicitudin lacinia vitae, luctus et tortor. Vestibulum aliquet fermentum mattis. Praesent luctus bibendum magna, ac interdum odio faucibus in. Nunc arcu ipsum, dignissim id aliquet ac, pretium ut arcu. Nullam sit amet est urna, at tincidunt quam. Suspendisse quis est eget dolor placerat commodo. Aenean augue metus, venenatis non pulvinar nec, dapibus nec quam. Morbi imperdiet scelerisque ante, vel dapibus leo tristique blandit. Donec neque nunc, pretium ac lacinia ut, adipiscing nec erat. Integer et enim vitae enim sollicitudin fringilla in vitae nisl.</p>";
        echo "</td>";
    }
    echo "</tr>";
}

?>
</tbody></table>

Rezultatą galite pamatyti čia (dydžiai nurodyti px).

Peržiūrėjau paskiau tą sąrašiuką ir susirašiau, kuriais šriftais ir dydžiais tekstą man lengviau skaityti.

Čia taip pat reikia atkreipti dėmesį, kad skirtingos naršyklės ir operacinės sistemos tuos šriftus dar ir skirtingai rodo — reikia pasitestuoti su tomis, kurias naudos dauguma jūsų lankytojų.


2009-02-24XWinLogger

Paskutines porą savaičių krapščiausi prie vienos programėlės, kuri man padeda skaičiuotis laiką, kurį prie kompiuterio skiriu įvairiems projektams ir veikloms.

Vakar pagaminau archyvą iš kurio galima susiinstaliuoti programėlę ir užregistravau projektą Launchpad.net sistemoje:

http://launchpad.net/xwinlogger/

Programėlė veikia Linux. Valdoma iš komandinės eilutės. Reikia:

T.y. Ubuntu 8.10 (Intrepid) su papildomu Firefox extensionu veikia be didelių problemų. Mažų problemėlių tikrai yra, nes kolkas programa dar labai developer-friendly ir tikrai joje dar pilna klaidų. Tai mano pirmas rimtesnis pasiprogramavimas su bash ir awk :-) .

Kai kam gali kilti natūralus klausimas, kodėl man neužtenka Rescuetime. Atsakau:

  • Man neužtenka tokio funkcionalumo kokį duoda Rescuetime. Turiu specifinių poreikių:

    • vienu metu naudoju du Firefox langus su skirtingais profiliais — vienas skirtas darbui, kitas naršymui — norėčiau, kad automatinė sistema tai atpažintų;
    • noriu tiksliai suskaičiuoti kiek laiko sugaištu kokiam projektui, o Rescuetime automatinė sistema, neretai neatpažįsta prie kokio projekto dirbu, kai gnome-terminal atidaryta tai viena, tai kita direktorija;
    • noriu ir pastebėti bei suprasti kiek laiko sugaištu visokiems išsiblaškymams (pvz. kas kiek laiko atsidarau el. pašto langą).
  • Manau, kad laikyti duomenis apie tai kokias programas kada ir kiek naudoju yra racionaliau pas save:
    • esu ramesnis dėl savo asmeninių duomenų privatumo;
    • galiu panaudoti tuos žalius duomenis įvairiais kitais būdais (pvz. jei reikėtų prisiminti ką veikiau konkrečiu metu).

Taigi, jei kas susidomėjote — siųskitės iš Launchpad (taip pat yra kodas: lp:xwinlogger). Ir būtinai man atsiųskite savo pastabas :-) .


2008-11-07Ar turtuoliai moka mažiau mokesčių?

Prieš keletą dienų perskaičiau straipsnį: Kęstutis Girnius: Konservatoriai: kova su tautos erozija ar turtingųjų šalpa?.

Straipsnio autorius pateikė tokią lentelę:

Politikas Pajamos Mokesčiai Procentas
Kubilius 79873,94 20458,00 25,6
Steponavičius 79281 20317 25,6
Valinskas 954684,31 142912 15,0
Zuokas 199926,56 25906 13,0

Nuo to laiko vis niežėjo nagai paskaičiuoti svetimus pinigus — ar iš tiesų turtingesnieji sumoka mažesnį procentą mokesčių valstybei.

Šiandien prisėdau, šiek tiek paprogramavau shell’u ir pythonu: išsilupau kandidatų į Seimą duomenis iš VRK svetainės ir šiek tiek paskaičiavęs pasidariau grafikėlį kaip susisieja pajamų lygis su sumokėtu mokesčių procentu:

Sumokėtų mokesčių % ir pajamų lygis

X ašyje naudoju logaritminę skalę — jei pajamų lygis skiriasi 1, tai reiškia, kad vienas žmogus už kitą uždirba 2 kartus daugiau. Kaip 0 pasiėmiau “stebuklingą” skaičių 430 Lt/mėn. (orientuodamasis pagal Statistikos departamento pateiktą 2006 m. skurdo lygį ir 2007 m. vidutines pajamas vienam asmeniui.

Gavosi kažkas panašaus į Gauso kreivę. Tai, kad dešinysis kreivės šonas leidžiasi žemyn, manrods ir parodo, kad turtingesni žmonės moka santykinai mažiau mokesčių. Iš kitos pusės, tai, kad tai duomenys išsidėsto pagal normąlųjį skirstinį, gal reiškia, kad tai natūralu… reikėtų palyginti su kitų šalių duomenimis.

Pastabos apie tikslumą:

  • Nežinau kiek tikslūs VRK naudojami duomenys. Manau, kad ten gali būti nemažai netikslumų: įvedimo klaidos, specialiai klaidingi duomenys ir pan..
  • Įdomu, kad yra pora kandidatų sumokėjusių 50-80% nuo savo pajamų. Gal tai kažkokia įvedimo klaida?
  • Nemažai kandidatų, nepriklausomai nuo jų pajamų, nemokėjo mokesčių iš viso, arba sumokėjo jų labai mažą procentą. Gal čia kokia sisteminė klaida?
  • Nemažai kandidatų pasirodė esantys žemiau skurdo ribos. Priežasčių, manau, gali būti įvairių (išlaikomi sutuoktinių, “gyvena į minusą” iš turimo turto ir pan.)

Programų kodas, CSV duomenys ir OpenDocument Spreadsheet failas su grafikais (500kB). Nepateikiu VRK svetainės HTML failų, nes jie užima ~130MB.

Pastabos skaitytojams:

  • Aukščiau yra pateiktas ODS failas su duomenimis ir grafikais (t.y. OpenOffice.org Excelis). Imkite ir naudokite savo pramogai ir naudai — leidžiu naudotis visais pateiktais failais, perdirbti, skelbti ir publikuoti juos kur patinka ir kaip patinka. Džiaugsiuosi, jei nepamiršite įdėti nuorodų į šaltinius — VRK ir mano svetaines.
  • Būtų įdomu taip pat susieti kandidatų valdomą turtą su jų mokamais mokesčiais. Tai palieku kaip pratimą skaitytojui :-) . Jei sugalvosite dar ką išlupti iš tų duomenų — būsiu dėkingas, jei atsiųsite rezultatus ir man pasižiūrėti.
  • Būtų įdomu perleisti panašią analizę per visus VMI deklaracijų duomenis. Kandidatai į Seimo narius visgi yra gan specifinė žmonių grupė.

Ir dar: labiausiai tikiuosi, kad naujoji Vyriausybė irgi įvertins ką gali reikšti tokie duomenys, kalbant apie socialinį atotrūkį Lietuvoje.


2007-10-30HTML pradžiamokslis

Netyčia namie radau knygą tokią:

Balčytienė A., Leonavičius G., Stankevičius J., Valavičius E., Žilinskas A.
Informatika. I dalis. Vilnius: “Baltic ECO” leidybos centras, 1997.

“Paprasčiausio puslapio pavyzdys” iš knygos programuotojų džiaugsmui:

Paprasčiausio puslapio pavyzdys

:-)


2007-05-05“IE bugas” sprendimas

Anksčiau rašiau apie Internet Explorer klaidą su kuria susidūriau — kai dingsta tekstas elemente su background-color CSS stilium.

Radau sprendimą puslapyje: IE CSS bugs when using floats and background-color.

Kartais labai gerai organizacijoje turėti gerų testerių — padeda tiksliau lokalizuoti klaidą ;-) .


2007-04-18Kaip išlupti lietuviškas raides iš sausainiukų su JavaScript

Kas dar nesupratot, čia įrašas kolegoms programuotojams :-)

Turėjau tokią problemą: reikėjo su JS pasiimti lietuvišką windows-1257 koduotą tekstą iš cookie. Problema tame, kad nuskaitant informaciją iš kukio su JS, vietoj lietuviškų raidžių atsiranda encodinti stringai.

Pavyzdys: PHP kode padarome:

setcookie('kukis', 'ąčęėįšųūž');

Po kukio informacijos nuskaitymo su JavaScript (kurios dėl vietos stokos neaprašinėsiu), gauname:

"%E0%E8%E6%EB%E1%F0%F8%FB%FE"

bandom:

unescape("%E0%E8%E6%EB%E1%F0%F8%FB%FE")

gaunam:

àèæëáðøûþ

blogai, nes reikia:

ąčęėįšųūž

Pasukau galvą ir išsprendžiau:

function fix_lt_chars(str)
{
    var lt_from = Array('%E0', '%E8', '%E6', '%EB', '%E1', '%F0', '%F8', '%FB', '%FE', '%C0', '%C8', '%C6', '%CB', '%C1', '%D0', '%D8', '%DB', '%DE');
    var lt_to = Array('%u0105', '%u010D', '%u0119', '%u0117', '%u012F', '%u0161', '%u0173', '%u016B', '%u017E', '%u0104', '%u010C', '%u0118', '%u0116', '%u012E', '%u0160', '%u0172', '%u016A', '%u017D');

    l = lt_from.length;
    for (i=0;i < l; i++)
    {
        str = str.replace(lt_from[i], lt_to[i]);
    }

    return str;
}

gera_reiksme = unescape(fix_lt_chars("%E0%E8%E6%EB%E1%F0%F8%FB%FE"));

gaunam:

ąčęėįšųūž

Sprendimas bjaurus, bet ką daryti, kai tas kukis viena esminių sistemos dalių, kurios neišeina pakeisti ;) .


2007-03-09IE bugas

Išsisaugokit kaip HTML failą ir atsidarykit su IE6 (kitų versijų kolkas netikrinau):

<html><head><style type="text/css">

#body { background-color: red; }

</style></head><body>
<div id="body">
<p><h2>this text is not visible</h2></p>
<hr>
</div>
</body></html>

Nekreipkit dėmesio į blogai suformuotą HTML — bet ką išmetus bugas dingsta, o sistemoj kurioj pastebėjau kyla ne vien nuo <p><h2>...</h2></p>.


2006-05-14Eilinė amerika (PHP)

Paskutiniu metu man labai norėjosi multiple inheritance su PHP.

Tai tiek užkniso, kad prisėdau, pasibandžiau ir atradau, kad bent jau metodus skolintis (ko man iš esmės ir reikėjo) iš ne vienos klasės galima gana paprastai.

Skriptukas pasibandymui jei kam įdomu bus ir pravers:

<?php

class First
{
    var $first_var;

    function echoVar()
    {
        echo "$this->first_var<br>n";
    }
}

class Second
{
    function echoItalicFirstVar()
    {
        echo "<em>$this->first_var</em><br>n";
    }

    function echoBoldMyVar()
    {
        echo "<strong>$this->my_var</strong><br>n";
    }
}

class MyClass extends First
{
    var $my_var;

    function echoMyVar()
    {
        echo "$this->my_var<br>n";
    }

    // Methods that operate on MyClass    // object attributes from Second class:
    function echoItalicFirstVar() { Second::echoItalicFirstVar(); }
    function echoBoldMyVar() { Second::echoBoldMyVar(); }
}

$obj = &new MyClass();

$obj->first_var = "This is first var.";
$obj->my_var = "This is my var.";

$obj->echoVar();
$obj->echoItalicFirstVar();
$obj->echoMyVar();
$obj->echoBoldMyVar();

?>



2006-01-23Kas tas yr CTLF

Užstrigau su CTLF nauja (beta) versija… Kodas jau virš mėnesio kaip yra, reikia dokumentaciją baigt tvarkyt.

Dar gyvenimas rūpesčių prideda ir atrodo kuo toliau tuo daugiau jų bus… Šiaubaš!

Prasėdėjau kelias valandas, tai sutvarkiau vieną dokumentacijos puslapį (apie direktorijų struktūrą ir ją aprašančias konstantas) ir pusiau paruošiau grafikus puslapiui apie objektų load’inimą:

schema

Paišinuką gaminau su Inkscape, clipartas iš Tango Desktop Project. Kaip smagu opensourcinti :) .

Jei kasnors negalit tvert kaip įdomu tas CTLF, tai tempkitės iš CVS betos source.


My English blog about programming.