Archiwum
- Sierpień 2008 (4)
- Lipiec 2008 (5)
- Czerwiec 2008 (3)
- Maj 2008 (1)
- Kwiecień 2008 (2)
- Marzec 2008 (3)
- Luty 2008 (9)
- Styczeń 2008 (2)
- Grudzień 2007 (2)
- Listopad 2007 (3)
- Październik 2007 (6)
- Wrzesień 2007 (8)
- Sierpień 2007 (5)
- Czerwiec 2007 (1)
- Maj 2007 (10)
- Kwiecień 2007 (5)
- Marzec 2007 (26)
- Luty 2007 (21)
- Styczeń 2007 (11)
- Grudzień 2006 (4)
- Listopad 2006 (9)
- Październik 2006 (6)
- Wrzesień 2006 (2)
- Lipiec 2006 (1)
- Czerwiec 2006 (13)
- Maj 2006 (2)
- Kwiecień 2006 (9)
- Marzec 2006 (1)
- Luty 2006 (2)
- Styczeń 2006 (17)
- Listopad 2005 (5)
- Październik 2005 (1)
- Sierpień 2005 (1)
- Lipiec 2005 (17)
- Czerwiec 2005 (2)
- Maj 2005 (4)
- Kwiecień 2005 (4)
- Marzec 2005 (7)
- Luty 2005 (20)
- Styczeń 2005 (24)
- Grudzień 2004 (21)
- Listopad 2004 (25)
- Październik 2004 (22)
- Wrzesień 2004 (38)
- Sierpień 2004 (5)
Kategorie
- Batalie (23)
- Emigracja (50)
- Komercha (4)
- Ogłoszenia (19)
- Ogólne (229)
- Opowiadacze (13)
- Pieprzenie (29)
- Podróże (23)
- Prasówka (6)
- Programowanie (39)
- Cocoa (14)
- iPhone (2)
- Mac OS X (17)
- Obj-C (12)
- Technikalia (21)
Czytam
Żeby nie było, że się obijam
XCode działa niemal non stop. Oto jak moje biurko teraz wygląda:

Objective-C i prywatne metody
Doskonale zdaję sobie sprawę, że sprzedaję truizmy, ale czasem początkującym programistom tego języka może się to przydać. Bo przecież... jak mieć do cholery prywatne metody w klasie języka Objective-C? Przecież słowa kluczowe @public, @protected czy @private są słowami kluczowymi, których da się użyć tylko w kontekście atrybutu.
A co z metodami?
Z pomocą przychodzi nam pewna zabawka tego języka, czasami określana mianem konkretyzacji. Nawet nie wiem, czy ja nie zmyśliłem tej nazwy, więc nie będę ściemniał. Sprzedam jedynie ideę.
Czasami okazuje nam się, że istnieje klasa, która spełnia prawie wszystkie nasze oczekiwania... poza jednym na ten przykład. Potrzebujemy więc dorzucić do klasy dodatkową metodę, ale nie mamy dostępu do jej źródeł. Z drugiej strony chcemy tę metodę dodać tylko w jednej części naszego kodu, a nie wszędzie. Jak to zrobić?
Załóżmy, że klasa, którą chcemy poszerzyć nazywa się NSSomeClass a metoda, jaką chcemy dorzucić to screwYou;. Wykorzystywać będziemy ją tylko w kontekście jednej jednostki kompilacji (pliku, jakby ktoś nie wiedział) przy implementacji innej klasy.
Zatem w pliku przed implementacją czegokolwiek dorzucamy taki kawałek:
@interface NSSomeClass (AdditionalMethod)
- (void)screwYou;
@end
@implementation NSSomeClass (AdditionalMethod)
- (void)screwYou
{
NSLog(@"Screw You!\n");
}
@end
Jak łatwo zauważyć dorzuca to dodatkową metodę (konkretyzuje klasę pod nazwą AdditionalMethod), a potem to implementuje.
Chyba łatwo zauważyć, że można to także zrobić w całości ze swoją klasą i najzwyczajniej w świecie dorzucić prywatne metody już w jednostce kompilacji, a nie pliku nagłówkowym?
W sumie wychodzi to całkiem fajnie, bo prywatne metody są tak prywatne, że nawet nie figurują w nagłówku :D
Z cyklu durnot
Idąc za Jajcusiem i Patrysem, przedstawiam swoje wyniki:
Test Driven Development pod Maczkiem
Ostatnio jest niewyobrażalne halo na punkcie programowania dyktowanego testami. Nie powiem, w wielu przypadkach się to przydaje. Na przykład w moim - pisząc frameworka chcę mieć ładne testy regresji i pilnować, żeby nic się przy nowych dodatkach nie schrzandoliło. I niekoniecznie chcę od razu cały kombajn aplikacji do tego, którą chcę pisać później.
Chłopaki z Apple postarali się dostarczyć magiczne coś, co się nazywa OCUnit. Kombajn, którego się tylko karmi klasami do testów i tyle. Wystarczy dodać projekt tego typu, pakować testy i patrzeć jak się ładnie testuje.
Wyczytałem na ten temat mnóstwo dobrego, ale osobiście stwierdzam, że jest to straszliwe badziewie. Ten projekt nie produkuje aplikacji tylko tzw. Bundle. W efekcie znaczy to, że żeby debuggować niewychodzący test trzeba się gimnastykować, czego nie znoszę przepotwornie.
No nic. Pozostaje mi zaimplementowanie własnego środowiska testującego. Zajęło mi to tylko godzinkę, ale efekt jest taki, jaki chciałem.
Na pohybel z tym co wymyślił te durnowate OCUnit!
Cocoa i wątki
Przez dłuższy czas zastanawiałem się, czy nadal używać POSIXowych wątków w swojej bibliotece, czy rzucić się na jakieś ciekawsze zastosowanie oryginalnych wątków Cocoa.
Dokumentacja na stronach Apple jest trochę lakoniczna, a i gugiel nie do końca pomaga. Zdecydowałem się więc rzucić trochę światła na ten banalniacki mechanizm.
Żeby odpalić nowy wątek musimy zrobić dwie podstawowe rzeczy. Mieć klasę która będzie miała metodę tego wątku (czyli takie coś, co będzie się pętlić i robić dziwne rzeczy, które są nam potrzebne) oraz użyć magicznej klasy NSThread.
Powiedzmy więc, że mamy klasę MojaKlasa i w niej metodę metodaWatku: . Nasza metoda powinna nie zwracać nic i przyjmować tylko jeden parametr typu id. Generalnie rzecz biorąc jest to strasznie podobniackie do funkcji puszczanej do pthread'a.
Żeby odpalić nasz nowy wątek wystarczy użyć jednej metody z klasy NSThread (metoda klasy, a nie obiektu, więc nic nie musimy tworzyć. Kod banalniacki podaję tutaj:
MojaKlasa *obiekcik = [[MojaKlasa alloc] init];
[NSThread detachNewThreadSelector: @selector(metodaWatku:) toTarget:obiekcik withObject: nil];
Co to zrobi? A mianowicie odpali w nowym wątku naszą metodę w podanym obiekcie obiekcik przekazując metodzie nil'a. Jeśli chcemy coś jej przekazać to podajemy to w ostatnim parametrze do metody detachNewThreadSelector:toTarget:withObject.
Mówiłem, że banalniackie :)
Jak zabić wątek? Zakończyć naszą metodę, albo wykonać metodę exit na obiekcie wątku (NSThread).
Oczywiście NSThread ma dodatkowo parę innych metod. Zarówno klasy jak i instancji. Pozwala na zidentyfikowanie w jakim wątku się aktualnie znajdujemy (metoda klasy currentThread) ustawianie priorytetu wątku i tym podobne pierdoły. Ale ogólnie rzecz biorąc całość jest przepotwornie prostacka.
Mimo wszystko spodziewałem się po kolegach z Apple trochę bardziej wyszukanych sposobów. Z drugiej strony oni się bardzo cieszą z tych selektorów, mimo że często dziedziczenie po ładnej klasie było by znacznie fajniejsze.
XMPP.Framework - wielki comeback
Ja chyba nigdy nie będę w stanie być słowny.
Tym razem postaram się po raz kolejny. Projekt iTalk'a nadal w powietrzu, czeka nieustannie, aż skończę XMPP.Frameworka do jako takiej sytuacji, żeby można było przynajmniej gadać normalnie.
I chyba w końcu prawie mi się to udało. Wszystko co miałem przepisałem praktycznie od zera. Zamiast swoich rozwiązań XMLowych użyłem NSXMLElement. Ponieważ od Tigera również jest libsasl, jego również tam znajdziecie, zamiast moich wypocin, które mogą być pełne wad. Oczywiście wziąłem do siebie ideę "KISS". Podszedłem do sprawy również na tyle inteligentnie, że najpierw zaprojektowałem co chcę zrobić. Efekt to doxygenowa dokumentacja interfejsów wersji 0.1. I trochę moich prywatnych wypocin jak co zrobić pod spodem.
Przy okazji podszkoliłem już mój Objective-C na tyle, że nauczyłem się pisać metody prywatne (korzystając z ładnego ukrywania rozszerzeń), co też odśmieciło kod.
Pod spodem oczywiście Expat. Jestem zadowolony. Zaczyna działać. A jeśli będzie tak dobrze, jak już wygląda, to niebawem wersja ta wyjdzie i będę mógł dołożyć jakiś interfejs graficzny na szybko :)
Ale nic nie obiecuję. Nie wychodzi mi to najlepiej.
Chudnięcie
Moja mysza bardzo długo namawiała mnie na "zrobienie czegoś z rosnącym brzuchem". Było to na tyle upierdliwe, że w końcu dla świętego spokoju postanowiłem ulżyć jej w cierpieniach. Na prawdę nie wiedziałem co czynię...
Od wspólnego znajomego (podczas naszego ostatniego pobytu w Polsce) dostaliśmy kartkę z rozpisaną specjalną sekwencją ćwiczeń o dźwięcznej nazwie "Areobicznej Szóstki Weidera".
Po entej z rzędu rozmowie na temat mojego sadła usiadłem i rozpocząłem zabawę.
Było ciężko. Naprawdę ciężko. Pod koniec dnia ćwiczeń byłem wyczerpany. Wiadomo jednak, że na coś takiego należy się przygotować. Niećwiczone mięśnie będą boleć.
To na co nie byłem przygotowany, to fakt, że każdego następnego dnia będzie jeszcze gorzej. Boli przepotwornie! W połowie ćwiczeń z wysiłku znoszę jajko, pod koniec myślę już tylko jak szybko umrzeć. Ale przeżywam.
Dziś jest dopiero 6sty dzień ćwiczeń (z 42). Rano wstałem i zapiąłem się paskiem na nową dziurkę.. znacznie ciaśniej. Zupełnie naturalnie, bez żadnego ściskania. Ze zdziwienia, pobiegłem na wagę.
Schudłem pięć kilogramów... W TYDZIEŃ!!!
Teraz wiem, że będę ćwiczyć. Mimo że boli. Bo ciekawość w jakim stanie będzie mój brzuch pod koniec serii jest znacznie silniejsza od tego bólu.
Od nowa się
No i zaczęło się. Szukam nowej pracy.
Ofert z Londynu, które mnie interesują jest przerażająco mało, więc dopiero zobaczymy jak to będzie.
Ech, przydała by się jakaś firma programująca na maczkach. Ale za cholerę takich tu znaleźć nie mogę. Smuggi? Nie szukają u Ciebie ludzi? :)


