A language is only as good as its developer is.

M. Burke “The principles of successful freelancing” [I dalis]

Prieš pradėdamas dalį savo laiko skirti laisvai samdomam darbui tūrėjau nemažai dvejonių. Ir kaip tik tuo pat metu iš (ex)kolegos gavau šią knygą :) Perskaitės ją, supratau, kad buvau neapgalvojęs tikrai daug dalykų. Tad tiems, kurie užsiima freelance’u arba planuoja tai daryti siūlau pasiskaityti apžvalgą arba iš karto ieškotis knygos :)
More »

setter & getters

Pastaruoju metu dažnai apsirašinėjant objektus teko rašyti daug setter’ių ir getter’ių. Man, kaip ir manau daugumai programuotoju, pabodo vis rašyti tą patį, tad nusprendžiau panaudoti magiškas PHP funkcijas :) Tiksliau užteko vienos __call(string $name, array $arguments). Kodas atrodo taip:

/**
* dynamic set & get methods
* @param string $name
* @param string $value
* @author aur1mas
*/
public function __call($name, $value)
{
/**
* lower 4th letter (in setter & getters it's first letter of property)
* @var string
*/
$name{3} = mb_strtolower($name{3}, 'utf-8');
if (strpos($name, 'set') !== false) {
$property = '_' . str_replace('set', '', $name);
if (property_exists($this, $property)) {
$this->$property = $value[0];
return;
}
}
else if (strpos($name, 'get') !== false) {
$property = '_' . str_replace('get', '', $name);
if (property_exists($this, $property))
return $this->$property;
}
else {
  throw new Exception(
    'Dynamic setting only supports set & get methods');
}
  throw new Exception(
    'Property: ' . $property . ' not found in object ('
      . get_class($this) . ') declaration.');
}

Manau daugumai kodas yra aiškus. Atributus apsirašinėju su ‘_’ prefix’u (pagal Zend Framework standartą).
Kodo panaudojimo pavyzdys atrodytų taip:

<?php
class Human extends Base{
  protected $_eyes;
}

$human = new Human();
$human->setEyes('brown');

Jei kam kyla kokių nors klausimų ar turite pastabų (bug’ų) – rašykit :)

REST autorizacija

Neseniai teko padirbėti su WebServisais, konkrečiau su REST. Naudojau Zend_Rest komponentą. Susidūriau su problema, kai reikėjo perduoti autorizacijos duomenis.
Intuityviai bandžiau rašyti taip:

...
$client = new Zend_Rest_Client(
'http://username:password@api.uri');
...

Ir po netrumpo debug’inimosi supratau ką darau netaip. Pasirodo norint perduoti autorizacijos duomenis reikia naudoti Zend_Http_Client ir jį peduoti Rest klientui. Tad teisingai parašytas kodas tūrėtų atrodyti taip:

...
$client = new Zend_Rest_Client('http://api.uri');

$httpClient = new Zend_Http_Client();
$httpClient->setAuth('username', 'password',
 Zend_Http_Client::AUTH_BASIC);
$client->setHttpClient($httpClient);
...

Sėkmingo naudojimo ;)

“A” letter fix

Kurie reguliariai skaitote mano blog’ą tūrėtumėte prisiminti, jog rekomendavau zendcasts.com puslapį, kaip mokomąją priemonę mokytis programuoti “Zend Framework”.

Kurie mokėtės ir sekėti, tūrėjote susidurti su problema, kai reikėjo integruoti “Zend Framework” ir “Doctrine”. Problema iškildavo, kai apsirašydavote modelį, kuris prasideda raide “A” (iš tikrųjų pavadinimas galėjo būtų bet koks, iki “Base_” :) ). Klaidos kodas:

“aurimas-computer:scripts aurimas$ ./doctrine build-all-reload force
Fatal error: Class 'Model_Base_Account' not found ...”

Klaida kildavo dėl to, jog “application/scripts/doctrine.php” nebuvo aprašytas autoload’as ir skriptas imdavo viską iš eilės ir vykdydavo (ką rasdavo nurodytoje direktorijos).

Sprenimas – inicijuoti autoload’ą. Reikia pridėti papildomą eilutę:

$application->getBootstrap()->bootstrap('autoload');

Tada kodas tūrėtų atrodyti taip:

$application->getBootstrap()->bootstrap('autoload');
$application->getBootstrap()->bootstrap('doctrine');
$doctrineConfig = $application->getOption('doctrine');

Sėkmės toliau naudojat ir dirbant su ZF ir Doctrine ;)

Insert subquery

Kelis kartus teko susidurti su problema, kai reikėdavo daryti mysql insert’ą panaudojant select’ą. Kitais žodžiais tariant, reikėjo insert’inti subquery. Ir visus tuos kartus ieškojau sprendimo internete, nes kažkaip neužsifiksuodavo sprendimas :) Tad, nusprendžiau pasirašyti reminder’į kur ieškoti ir tuo pačiu gal kam dar pravers :)

Paprastas insert’as atrodytų taip

INSERT INTO table (id) VALUES (1), (2)

O insert’as panaudojant subquery

INSERT INTO table (id) VALUES (SELECT id FROM table2)

Manau realių pritaikymų rodyti nereikia ;)

Šaltinis: http://codespatter.com/2008/03/20/multiple-inserts-with-a-subquery/

I. Jansch “Guide to enterprise PHP development”

Jau nuo knygos išleidimo, tikslus jos pavadinimas I. Jansch “Guido to enterpise PHP development”, norėjau ją nuspirkti ir perskaityti. Tuo metu galvojau, kad gal ji man bus kiek per sudėtinga, tačiau dabar galiu drąsiai pareikšti, kad tada ji būtų buvusi man įdomesnė :) Apie tai ką perskaičiau norėčiau pasidalinti su jums, tam, kad patys galėtumėte susidaryti nuomonę ar vertą skaityti ;) More »

Zend_Pdf & Cirilica

Pastaruoju metu nemažai tenka dirbti su “Zend Framework” komponentais. Tad gal ir dažniau pasidalinsiu sunkumais ir sprendimais su kuriais susidūriau. Šiandien ant operacinio stalo Zend_Pdf komponentas.

Problema. Reikia sugeneruoti pdf’ą failą naudojant pdf šabloną, bei jį užpildyti kirilicos simboliai. Problema ta, kad ‘by default’ Zend_Pdf nepalaiko kirilica simbolių. Pavyzdinis kodas:

$pdf = new Zend_Pdf();
$pdf->pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
$pdfPage = $pdf->pages[0];
$pdfPage->setFont(
  Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA), 12);
$pdfPage->drawText(’This is my text.’, 72, 740, ‘UTF-8′);
$pdf->save('/somehere/on/the/machine/document.pdf');

Sprendimas. embed’inti šriftus. Siūlau naudoti šiuos šriftus. Tada eilutę ‘Zend_Pdf_Font::fontWithName()’ keičiam į ‘Zend_Pdf_Font::fontWithPath(‘/var/blah/dah/FreeSerif.ttf’)’ ir vuolia :) Po visos procedūros kodas tūrėtų atrodyti taip:

$pdf = new Zend_Pdf();
$pdf->pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
$pdfPage = $pdf->pages[0];
$pdfPage->setFont(
  Zend_Pdf_Font::fontWithPath('/var/blah/dah/FreeSerif.ttf'), 12);
$pdfPage->drawText(’This is my text.’, 72, 740, ‘UTF-8′);
$pdf->save('/somehere/on/the/machine/document.pdf');

Viso šio sprendimo minusas yra tas, jog gautas failo dydis pakinta keliais šimtais kilobaitų. Tačiau, lyginant su prieš tai tūrėtomis alternatyvomis, tai gautas failo dydis vistiek buvo ženkliai mažesnis.

Naudoti šaltiniai:

new name – new look

Pribrendo laikas atsinaujinti, tad tuo pačiu sugalvojau pasikeisti ir domeną. Nes http://sektorius.info nelabai ką pasakantis, tad nuo šio mano namų adresas – aur1mas.devnet.lt.

Laikinai dar vyks redirect’as iš aur1mas.sektorius.info domeno.

Taip pat, norėčiau pakalbėti apie mano naująjį dizainą. Atkreipsiu dėmėsį į dešniąją pusę (prie nuotraukos). Kas manęs nepažįsta, tai galima susipažinti (dabar žinosit kaip atrodau :) ). Tada seka ikonos, kurias norėčiau detaliau paaiškinti.

RSS – nuorodą manau visi supratot. Jos paskirties irgi aiškinti nereikia ;)

Kitos ikonos (nuorodos), iš kairės į dešinę:

  1. delicious.com – man bookmark’ų list’as. Straipsniai, kuriuos laikui esant skaitau. Jei norite matyti kuo duomiuosi, bei perskaityti tai anksčiau nei aš iš digg’insiu – tai sekite mane :)
  2. digg.com – straipsniai, kurie man patiko ir manau, kad jie verti pasiskaityti ir kitiems. “Ideas worth spreading” :)
  3. facebook.com – kaip nuorodos be social network’o :) gali būti mūsų susipažinimo ir bendravimo priemonė.
  4. flickr.com – kadangi laisvalaikiu mėgstu fotografuoti, tai įdomesnes foto dedu visam pasauliui.
  5. github.com – man git repozitorija. Visus public projektus planuoju talpinti į ją. Kam bus įdomu ką programuoju plačiąjai visuomėnei – sekite :)

Su nauju vardu ir dizainu planuoju ir daugiau rašyti. Netapsiu naujienų portalu ir nepranešinėsiu kas naujo įvyko IT pasaulyje (mano blog’as apie IT), nes tai puikiai galėsiu išreikšti per delicious.com ir digg.com. Bandysiu rašyti gilesnėm ir analitinėm temom.

Stay tuned! ;)

Every feature is bug

Skype programa sukūrė galimybę redaguoti savo žinutes (leidžia pasitaisyti). Pabandykite, tai padaryti bendruose chat’uose ir “netyčia” paspauskite ant kolegos žinutės ir pasirinkite “Edit message” :) Ugha :D

P.S. Ačiū (ex) kolegai, hipiznui, už leidimą pasidalinti šiuo bug’u (feature’u):)

47k lt :)

Prieš porą dienų su kolegomis kalbėjome apie “open source” projektus ir kaip iš jų uždirbti. Diskusijos eigoje prisiminiau tokį gerą sandorį, kur valstybė nusipirko OpenSource CMS’ą už 47k lt :) .

Ta proga priminiau kolegoms tą psl. adresu vyriausybe.lt ir jau norėjau pasakyti, kad pažiūrėkite HTML kodą, nes jame yra palikti “SiteSupra” komentarai, bet … Pasirodo valstybė, net neslepia šito:

site supra

Pažiūrime į footer’į ir viskas tampa aišku :) Įdomu ką reiškia “Trial version”? Jei “Trial version” kainuoja 47k, tai kiek kainuoja full licence? :)