A language is only as good as its developer is.

Don’t freelance

Praėjo jau 2 mėn., kai oficialiai palikau nuolatinį darbą ir nusprendžiau tapti laisvai samdomu programuotoju (freelancer’iu). Džiugu, kad nė akimirkos dar nesigailėjau dėl savo sprendimo :)

Pagaliau pradėjau judinti savo projektus, o vieną iš jų šį mėn. ir paleidom:

  • pozicijos.lt – įrankis skirtas tinklapių savininkams, kuriems įdomu kaip pagal tam tikrus raktinius žodžius jie yra randami paieškos sistemose. Taip pat, koks srautas ateina pagal tuos raktinius žodžius.

Šį mėn. planuoju paleisti dar vieną projektą. Bet apie jį rašysiu kituose įrašuose :)

Ta proga, radau iliustraciją, kuri visai neblogai iliustruoja kaip atrodo freelancer’io darbas :)

don't freelance

Doctrine Profiler

Pradėjus dirbti su ZFDebug pirmas dalykas, kurio pasigedau – Doctrine’os profiler’io palaikymo. Tad nusprendžiau jį parašyti. Juolab, kad neseniai kolega irgi buvo jį parašęs, tad iš esmės dviračio išradinėti neteko :) Tad čia gausis kaip praeito straipsnio tąsa.
More »

ZF Debug

Neseniai atradau Zend Framework debuger’į. Symfony tokį debuger’į turi pagal nutylėjimą. Tad, padirbėjęs su šiuo framework’u buvau pagalvojęs, kad visai neblogai būtų kažką panašaus tūrėti ir ZF. Bet mintys ir liko mintimis, kol neseniai keli kolegos (ačiū Pauliui ir Valdui) parodė, kad toks jau yra (ir gan seniai) :) . Tad integruojam!

More »

login /registracija

Pagaliau pradėjau programuoti devnet.lt projektą :) Manau kelių sav. bėgyje paleisiu beta versiją, kurią galėsite laužyti ir kritikuoti.

Programuojant kilo tokia mintis: o kodėl yra atskiriama registracija ir prisijungimas? Pvz. jei visa aktuali info (reikalinga prisijungti) yra email ir slaptažodis. Galvoju devnet.lt projekte šias dvi funkcijas sujungti į vieną: jei vartotojas ateis pirmą kartą – suveiks kaip registracija, priešingu atveju – prisijungimas. O prisijungus / užsiregistravus bus galima suvesti papildomą info apie save.

Kokią jūsų nuomonė apie tokią idėją? Laukiu komentarų :)

P.S. prisegu foto, kaip atrodo devnet.lt (sneak-peak) karkasas :)

devnet.lt

Domain wildcard

Neseniai reikėjo visus vieno domeno subdomenus nukreipti atgalį į pagrindinį domeną. Kitais žodžiais tariant, reikėjo sukurti alias’ą :)

Kadangi mano žinios serverių konfigūravime nėra labia didelės, tad galvojau, kad sprendimas bus daug sudėtingesnis, negu, kad iš tiesų jis buvo ;)

Užteko paredaguoti apache vhost config’ą, perkrauti apache daemon’ą ir vuolia! :) Visa magija slypi ServerAlias nustatyme. Nurodžius prie *, visi subdomenai bus nukreipti atgal į domeną.

<virtualhost *>
        ServerName  pozicijos.lt
        ServerAlias *.pozicijos.lt

        DirectoryIndex index.php
        DocumentRoot /www/pozicijos.lt/public/
	....
</virtualhost>

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/