obiektowy perl – jak?

na wstępie – ja wiem, że perl nie jest prawdziwie obiektowy. nie ma enkapsulacji. jeśli szukasz tutaj okazji do zwady to jej nie znajdziesz. wiem, że java, smalltalk, python, ruby i pewnie z 3 tony innych języków mają lepszą obiektowość.

nie musisz tego dalej czytać. to niebezpieczne. zawiera kawalki kodu perlowego, które (co dowiedli angielscy naukowcy) są niebezpieczne i powinny być traktowane tak jak niebezpieczne odpady z elektrowni jądrowych.

papa.

ok. teraz, odstraszywszy cieniasów można przejść do sedna.

programowanie obiektowe w perlu jakie jest każdy koń widzi. jest kilka metod, prostych, skomplikowanych, fajnych i totalnie niefajnych.

najprostszą metodą na zrobienie obiektowej klasy jest coś takiego:

package costam;<br />
use strict;<br />
sub new {<br />
my $class = shift;<br />
my $self  = {};<br />
bless $self, $class;<br />
return $self;<br />
}

i potem w każdej funkcji (która teraz jest metodą) piszemy na początku:

my $self = shift;

i już. dane obiektu trzymamy w $self, traktując go jako referencję na hasza. proste, miłe i skuteczne.

część mądrych ludzi stwierdziła, że jest to niebezpieczne bo z zewnątrz każdy może zobaczyć jakie zmienne (wartości w haszu) ma obiekt zadeklarowane. stąd pojawiła się idea obiektów inside-out, które są bezpieczne (poniekąd), modne i ogóle fajne. i których ni chu-chu nie lubię i polubić chyba nie zdołam.

trzymam się za to obiektów bazujących na haszach.

pisanie za każdym razem my $self = shift; jest upierdliwe.

brak akcesorów do zmiennych bywa niemiły.

konieczność pisania za każdym razem praktycznie tego samego sub new {} jest wkurzająca.

czy nie da się z tym nic zrobić?

da! na każdy problem jest lekarstwo (w przypadku perla jest to wiele lekarstw, gdzie każdy ma ulubione inne).

moim ulubionym lekarstwem jest spiffy. miły moduł, którego użycie wygląda tak:

use Spiffy qw( -Base );

i to wszystko.

co daje?

no cóż. zacznijmy od przepisanie pierwszego przykładu (klasa co nic nie robi i ma tylko konstruktor). wersja spiffy:

package costam;<br />
use strict;<br />
use Spiffy qw( -Base );

i to wszystko. konstruktor jest tworzony automatycznie. co jeszcze?

otóż pojawia się kilka fajnych rzeczy:

  1. upierdliwe my $self = shift; znika – nie trzeba go pisać. spiffy dodaje to automatycznie do kodu w czasie kompilacji. niby pierdoła, ale jak ma się moduł z np. 40 metodami, to to już jest 40 linijek zbędnego kodu mniej!
  2. możliwość definiowania pól (z automatycznym tworzeniem akcesorów):
    field ‘logfile' => undef;
    zdefiniuje metodę $self->logfile która w zależności czy zostanie wykonana bez czy z parametrami to odpowiednio zwróci albo ustawi wartość pola ‘logfile' (podawanie wartości domyślnej => jest opcjonalne)
  3. pola stałe:
    const ‘debuglevel' => 3;
    zasadniczo generuje metodę debuglevel która zwraca wartość 3
  4. stub'y – metody które istnieją, ale próba wywołania skończy się błędem. służą do wymuszania przedefiniowania określonych metod w klasach dziedziczących:
    stub ‘save';
    musi zostać przedefiniowany, inaczej każde wywołanie $object->save zakończy się błędem (informującym o przyczynie, a nie czymś w stylu “undefined subroutine").
  5. uproszczone wołanie metod z klas dziedziczonych. bez spiffy'ego trzeba było robić coś w stylu $self->SUPER::metoda(@_); teraz wystarcza proste:
    super;
  6. syntactic sugar – w modułach które używają spiffy'ego nie trzeba podawać już tego “1;" na końcu.
  7. wszystkie zdefiniowane pola są honorowane przy wywołaniu konstruktora. tak więc można:
    package cos;
    use strict;
    use Spiffy qw( -Base );
    field ‘x' => 0;
    field ‘y' => 0;
    package main;
    my $object = cos->new( x=> 10 );
    i zadziała to w pełni logicznie 🙂

oczywiście nie ma róży bez kolców.

ponieważ dodanie kilku z powyższych punktów wymusza używania czarnej magii (filtry kodu), spiffy nie jest do końca zgodny ze wszystkim co chodzi po ziemi.

pojawiły się nawet opinie, że jakieś moduły są psute używaniem spiffy'ego – czego osobiście przez kilka lat spiffy'owania nie zauważyłem, ale nie twierdzę, że problem nie istnieje.

istotnym problemem jest coś takiego.

bez spiffy'ego można napisać klasę dziedziczącą z kilku klas tak:

use base qw( klasa::a klasa::b );

ale jeśli używamy spiffy'ego to sprawa się komplikuje i trzeba to rozbić:

use base qw( klasa::a );<br />
use base qw( klasa::b );

nie jest to w/g mnie wielkie utrudnienie – zwłaszcza biorąc pod uwagę ile rzeczy spiffy mi zaoszczędza.

na koniec drobna informacja o innych rzeczach jakie spiffy daje – z tym, że są to rzeczy z których zdecydowanie rzadziej korzystam:

  • prywatne metody. metoda zapisana poprzez:
    my sub jakas_metoda {
    staje się metodą prywatną i może zostać wywołana jedynie przez inne metody tego obiektu
  • dopisanie XXX pozwala na proste debugowanie kodu – poprzez wypisywanie ładnie sformatowanych (yaml) sturktur danych. przykład użycia z manuala:
    XXX my @stuff = grep { /keen/ } $self->find($a, $b);

tak to wygląda. dzięki temu jak to działa można napisać np. coś takiego:

package modulik;<br />
use strict;<br />
use Spiffy qw( -Base );<br />
field 'x' => 0;<br />
field 'y' => 0;<br />
const 'wsp_x' => 1.33;<br />
sub suma {<br />
return ( $self->x + $self->y ) * $self->wsp_x;<br />
}<br />
package main;<br />
use strict;<br />
my $object = modulik->new(x => 10, y => 12);<br />
print $object->suma, "\n";

nie jest to może najbardziej zaawansowany kod jaki można sobie wyobrazić. ale spróbujcie go zapisać bez spiffy'ego.

aha. no i spiffy, wewnętrzenie trzyma wszyskie pola (field) jako klucze w $self – czyli tak jak perl przykazał.

wybuchowe laptopy

(wstęp: piszę tego posta, jak i większość innych, z della latitude d610. i mam nadzieję, że on mi nie wybuchnie).

dell ma ostatnio drobne problemy z bateriami w laptopach.

najpierw zapalił sie laptop na konferencji w japonii:

dell banger1.jpgdell banger2.jpg

potem podobny los spotkał innego lapa, tym razem w stanach:

burneddell.jpg

i teraz – kolejna maszynka, tym razem w singapurze:

470_dell1.jpg 470_dell3.jpg470_dell4.jpg470_dell5.jpg470_dell6.jpg470_dell7.jpg

zaczynam się poważnie obawiać swojego della. do domu chyba go nie będę zabierał.

choć trzeba sprawiedliwie dodać, że nie tylko dell ma takie problemy. gdzieś czytałem (nie pamiętam gdzie) o laptopie apple'a który spalił się wraz z dywanem na którym leżał. właściciele ocenili straty na $15000.

czy wasze leptopy też wydają się groźne?

standard iso dotyczący bezpieczeństwa komputerowego

dowiedziałem się właśnie, że iso opublikowało standard (iso27001) tyczący się bezpieczeństwa systemów informatycznych.

jest to o tyle istotne, że biorąc pod uwagę ostatnie wydarzenia na świecie (zgubione laptopy z danymi ludzi, wycieki danych) mogę sobie bezproblemowo wyobrazić jak duże firmy zaczną wdrażać ten standard i dodatkowo będą go wymagać od podwykonawców.

dokładny standard można przeczytać poprzez zakup ($107 lub 90 funtów) – nawet jeśli nie zamierzamy (nie chcemy, nie stać nas, nie widzimy potrzeby) faktycznie uzyskać certyfikatu zgodności – zawsze wiedza tam zawarta, “best practices" i międzynarodowe standardy zachowania będą bardzo przydatne.

jak wymyślić coś nowego, fajnego?

proste – zebrać kilka sprytnych osób, i pogadać.

ibm stwierdził, że tego mu trzeba. zebrał więc 100000 (sto tysięcy) swoich pracowników i dal im szansę pogadania nt. nowych projektów!

oczywiście zebranie takiej ilości ludzi i pozwolenie im na gadanie w świecie rzeczywistym byłoby bardzo trudne. zamiast tego przeprowadzono całe spotkanie (innovation jam) online.

po około tygodniu rozmów, forum zostało zamknięte. teraz przez miesiąc wydzielony team przejrzy logi rozmów i wylosuje najlepsze pomysły. a potem jam się powtórzy, z tym, że wtedy będą oceniać te najlepsze pomysły.

co z tego wyjdzie? nikt nie wie. nawet ludzie z ibm'a. mogą wyjść rzeczy wielkie, użyteczne. może się też zdarzyć, że nic z tego nie wyjdzie, ale to akurat jest mało prawdopodobne.

pozostaje sie uzbroić w cierpliwość i pod koniec sierpnia szukać newsów o tym co ibm będzie robił 🙂

ftth we francji. a kiedy u nas?

ftth (fiber-to-the-home, czyli światłowód do domu) jest dosyć drażliwym tematem w stanach. wnikać nie będę, ale mają tam związany z tym niezły przekręt.

natomiast we francji właśnie rusza pilotowy program dla mieszkańców wybranych miast. za 70 euro miesięcznie dostajesz światłowód a w nim:

  • telefon
  • tv (pewnikiem coś jakby kablówka)
  • internet

jaki internet? *szybki* 2.5 gigabita download, 1.2 gigabita upload!

rany. płyta cd ściągnięta w 3 sekundy (900 mega danych.). 70 euro to daje, przy dzisiejszym kursie jakieś  275 pln miesięcznie. niby sporo. ale ja teraz płacę za chello 12mbit/1mbit 299pln! eh.

interesujące dodatki do kont gmailowych

może nie wszyscy wiecie, że mając konto pocztowe na gmailu ma się praktycznie nieograniczoną ilość kont.

po pierwsze – gmail pozwala w dowolnym miejscu nazwy konta wstawić kropkę. tak więc mając emaila hubertlubaczewski@gmail.com (akurat takiego nie mam) można też używać hubert.lubaczewski@gmail.com.

dodatkowo – jeśli w nazwie konta wstawimy znak + to wszystko co za nim będzie zostanie zignorowane. czyli do rzeczonego konta można by dorobić hubert.lubaczewski+newsy@gmail.com. i działać będzie.

po co to? proste. mając te możliwości można zrobić dowolnie dużo aliasów do różnych celów. np. do podawania na formularzach webowych. dzięki czemu od razu się dowiemy kto sprzedał email – np. jeśli rejestruję się zawsze podając +domena_na_ktorej_sie_rejestruje – np.: hubert.lubaczewski+onet.pl@gmail.com, i potem dostanę na ten konkretny adres/alias spam – od razu widzę, że to onet mnie “zdradził".

tak samo z newsami, forami itd, itp.

oczywiście nie chodzi o samą ochronę przez spamem – można w ten sposób sobie prosto segregować pocztę. przykładem może być prosty filtr który jeśli zobaczy maila wysłanego na hubert.lubaczewski+bb@gmail.com wyśle mi automatycznie kopię na blackberry'ego (taka komórka z obsługą maili).

lista możliwych zastosowań jest spora. trzeba tylko pomyśleć i zastanowić sie do czego by się samemu użyło automatycznego segregowania poczty.

cieszmy się.

nasi wspaniali rządzący opanowali widać wszystkie inne problemy. i teraz zajmują się (jak widać najważniejszym): fotografowaniem obiektów strategicznych.

mon (ministerstwo obrony narodowej. obrony? może ośmieszania) chce przywrócić znane z prlu tabliczki o zakazie fotografowania.

po co? noooo .. aby jak terrorysta będzie chciał rakietą strzelić np. w okęcie, to nie będzie mógł sobie wcześniej fotki strzelić i nie będzie wiedział w które okno dokładnie trafić.

co prawda misie mózgowcy z monu zapomnieli o całkowicie publicznie dostępnych zdjęciach satelitarnych i lotniczych (google earth i maps, odpowiednie serwisu microsoftu i yahoo). nic to. może i sobie namierzy satelitarnie, ale zdjęcia nie będzie mógł mieć.

jakie to dokładnie strategiczne obiekty będą chronione? w/g życia warszawy:

“…Zakaz ma dotyczyć lotnisk, portów, stacji i węzłów kolejowych, ważniejszych mostów i wiaduktów, zapór wodnych, elektrowni i urządzeń elektroenergetycznych, kopalń, składów paliw, żywności i artykułów sanitarnych oraz magazynów, których zawartość stwarza zagrożenie wybuchowe lub pożarowe. Obejmie również urzędy administracji państwowej, komendy policji, straży pożarnej czy straży granicznej, sądy, prokuratury, areszty i więzienia, a także placówki NBP i BGK oraz Mennicy Państwowej."

najbardziej mi się podoba punkt o magazynach których zawartość stwarza zagrożenie pożarowe.

rodzina i znajomi handlują dywanami. mają magazyn. nie znam się na tym za bardzo ale zgaduję, że dywan nieźle się pali. czyli ich magazyn będzie teraz chroniony. i jakbym chciał zrobić mu zdjęcie to będzie mi groziła “wysoka grzywna".

o co dopiero pomyśleć o hurtowniach książek. fajerwerków. uff.

no nic. pozostaje się cieszyć, że wszystkie inne problemy zostały już zażegnane. nie ma biedy, rolinicy są szczęśliwi, korupcja wyeliminowana, drogi zrobione i ogólnie cud miód i orzeszki. i tylko ja mam problemy ze wzrokiem bo tego nie widzę.

concorde był za drogi i nieekonomiczny. pora spróbować znowu

concorde. jedyny (nie liczę rosyjskiego tupoleva tu-144, bo to 1. kopia concorde'a, 2. i tak nie działał) naddźwiękowy samolot pasażerski.

wycofany niedawno po katastrofie w anglii, z tym, że był to raczej wygodny powód – concorde'y były nieekonomiczne, bilety drogie a standard taki sobie (co nie zmienia faktu, że wszystkie bilety na ostatni lot concorde'em wykupiono mocno przed terminem).
czy na tym zakończy się era pasażerskich, cywilnych lotów naddźwiękowych? najprawdopodobniej nie.

są przynajmniej 2 projekty zbudowania nowych, cywilnych samolotów naddźwiękowych. o jednym z nich wiadomo na razie jedynie, że ma nazwę kodową “Supersonic Business Jet" i będzie przewoził od 8 do 12 osób.

o drugim wiadomo więcej.

przedw wszystkim – będzie wyglądał tak:

dn9628-1_550.jpg

to nie jest zdjęcie ( a dokładniej nie tylko zdjęcie ) – na razie jest to grafika komputerowa bazująca na komputerowym modelu tego cudeńka.

co jeszcze wiadomo? wiadomo, że zaprojektował (a właściwie projektuje, bo jeszcze nie zakończono prac projektowych) lockheed-martin.

że nazywa się “Quiet Supersonic Transport", gdzie “quiet" tyczy się tego, że będzie o 20 decybeli cichszy od concorde'a dzięki odpowiedniej budowie, itd, itp.

wiadomo też, że będzie mógł latać z prędkością około 1.6 macha (2000 km/h tłumacząc na ludzki).

i że będzie małym samolotem biznesowym – 12 miejscowym dokładniej.

to ostatnie wraz z osiągami sugeruje, że cena będzie “sympatyczna" i raczej nie da sie kupić biletu na przelot tym cudeńkiem.

prace postępują. konsorcjum powołane do tego by zbudować i sprzedać samoloty wystapiło do odpowiednich urzędów o zgody i certyfikowanie samolotu do lotów z prędkościami ponaddźwiękowymi. przewiduje się, że są szanse na to, że pierwszy komercyjny lot samolot odbędzie w 2013 roku.

nie wiem jak wy, ale ja zaczynam napełniać skarbonkę.

co kieruje takimi ludźmi?

abs news ostatnio podało takiego newsa:

robert charles browne (jak się rewelacje potwierdzą, to znajomość nazwiska w pewnych kręgach może być niemalże obowiązkowa), odsiadujący wyrok za zabójstwo (dożywocie za morderstwo w 1987 roku, złapani w 1995) powiedział, że ofiara za którą siedzi to ogólnie drobiazg, bo od 1970 do złapania zabił łącznie 48 osób.

jak na razie udało sie potwierdzić okoliczności śmierci 9 ofiar, co spowodowało komentarz, ze strony władz, że o ile browne może przesadzać i ubarwiać, ale jest spore prawdopodobieństwo, że to jest prawda. czynności śledcze trwają.

przeczytałem newsa z dosyć mieszanymi uczuciami. kilka luźnych komentarzy:

czemu? i to nawet 2 czemu:

  1. czemu ktoś zostaje seryjnym mordercą? jakie czynniki na to wpływają? mama go w dzieciństwie za mało lub za duzo przytulała (to tak a propos con-air z nickolasem cage'em)?
  2. czemu facet siedzący na dożywociu w więzieniu nagle decyduje się mówić o większej ilości swoich zbrodni (lub wymyślać je)? podnieść swój prestiż w więzieniu? facet ma 53 lata i “wypadki z mydłem" już mu się raczej nie zdarzają. nawrócił się? chce komuś zaimponować?

to imponowanie nie jest takie głupie. jeśli okaże się to prawdą, zaraz doczekamy się odcinka o nim na discovery, ruszy pewnie film bazujący na jego historii – amerykanie (a tak naprawdę cały świat) fascynują się takimi historiami i filmów na ich temat nie brakuje – jest top-ten, a to przecież nie wszystkie filmy, nie ma na nim chociażby fenomenalnego obywatela x ze stephenem reą, donaldem sutherlandem i maxem von sydowem, czy monster ze śliczną inaczej charlize theron.

co do imponowania – jeśli liczba 48 uzyska potwierdzenie to browne wskoczy na 15 miejsce na liście największych (pod względem ilości ofiar) seryjnych moderców świata. lub na 14 jeśli z listy usuniemy kevorkiana, którego umieszczenie na liście jest dosyć kontrowersyjnym pomysłem.

czy w ten sposób chce (browne) odejść w “chwale"? być konsultantem w filmie o sobie? napisać i sprzedać bestseller? zarobić miliony których nie będzie miał jak wydać?

ale z drugiej strony – czy ktoś wie na pewno co siedzi w głowie człowieka który zabił od kilku (potwierdzone 10) do kilkudziesięciu ofiar?