release, debug, #ifdef

Czytam i czytam kod, staram się go zrozumieć. Czasem każą mi coś poprawić albo napisać testy. Ale jak widzę, że kod dla release, debug, czy np. QAC zachowuje się inaczej to lekki nerw mnie łapie. Pomijam różnice w dodatkowym kodzie z “logprint” czy “assert” – ok, to nie zmienia logiki aplikacji (chyba że jest app jest time-driven [sic!]). Ale! Jak można prześledzić zachowanie aplikacji, kiedy w jednej wersji zachowuje się inaczej niż w drugiej? Ja tego nie potrafię zrozumieć.
I jeszcze jedna dziwna rzecz, która do tej pory do mnie nie dotarła. Ktoś u klienta powiedział “mają być asserty“. No więc są:

if( warunek == ok )
{
    // do stuff 
}
else
{
    // assert( false );
}

I bardzo proszę mądrość internetową, która może tutaj kiedyś zawita o wytłumaczenie mi takiego kodu. Dodam że to w embedded, więc liczę na jakiś głębszy ukryty sens.

siara jak zwykle ale trzeba
uściski!
js

//łupdejt
Poprawka do formatowania kodu

Jak następnym razem zacznę projekt

Ostatnimi czasy więcej czytam niż piszę i tak mi się kilka przemyśleń zebrało na temat: “co ja bym zrobił lepiej w tym projekcie”. Żeby było jasne, to są moje przemyślenia, do których bd starać się zastosować. Czysta teoria, nie potwierdzoną praktycznie żadną praktyką. Może poza kilkoma linijkami kodu. Czytam teraz takie różne kawałki kodu, pisze różne testy i wynika z tego prosta sprawa. Taniej, szybciej i skuteczniej jest napisać kawałek prostego testu, a potem poprawić drobne błędy. Niż napisać oddać testerom i “czekać” na listę błędów. Można inaczej: jedna osoba pisze kod, druga testy. Według mnie to jest strasznie uciążliwe, o każdej zmianie trzeba informować piszącego test, a nie zawsze się o tym pamięta. Jak testy nie przechodzą to nie do końca wiadomo kto zjebał, takie to nie poręczne. W dodatku w tej sytuacji, osoba pisząca testu musi wiedzieć co się dzieje w kodzie, znać specyfikacje i ogólnie ogarniać komponent – dla mnie to nie potrzebne powtarzanie. Osobiście uważam, że developer który pisze kod, jest za niego odpowiedzialny jak i za jego jakość => sam powinien zadbać o jego poprawne działanie.

Oczywistą oczywistością jest to, że nie będzie po kolei. Tzn od ważnej do nie ważnej, od małej do dużej, czy od żółtej do czerwonej.

Do rzeczy:
Weryfikuj zawsze dane wejściowe, jeżeli używasz wskaźników to przede wszystkim sprawdź czy wskazują tam gdzie powinny. Czyli nie są null, jeżeli będziesz z nich odczytywać lub do nich zapisywać. Lub czy są null jeżeli będziesz do nich przypisywać. To w ogóle temat rzeka z tymi wskaźnikami. Jeżeli oczekujesz wartości sprawdź, czy te które dostałeś są poprawne, np. mieszczą się w obsługiwanych zakresach. Ten mały i prosty kawałek kodu, ułatwi późniejsze debugowanie. Po wszystkim można taki kod wrzucić w #ifdef _DEBUG_ i po sprawie.
Odruchowo do każdego kodu, który wypocisz dodaj kawałek testu, który sprawdzi czy rzeczywiście, to co zrobiłeś działa tak byś sobie życzył. Postaraj się wywołać metodę  / funkcję z każdym możliwym parametrem, nawet z takim, który uznasz za błędny. Przecież od tego masz weryfikacje danych wejściowych. Jeżeli kod ma coś zwrócić sprawdź czy wynik jest tym czego oczekujesz lub czy rzucony wyjątek jest tym o który chodzi. Do każdego z rodzaju testów stwórz sobie osobne środowisko, a ingerencje w kod testowany naprawdę ogranicz do niezbędnego minimum. Najgorszą sprawą jest, gdy okazuję się że test jednostkowe i systemowe nie mogą zostać przeprowadzone na tym samym kodzie, lub że wyniki dla tych samych komponentów dadzą inny wynik.
Po tym jak obmyślisz już co piszesz, jak, w czym, etc. I narysujesz sobie kilka kwadracików ze strzałeczkami i takich tam. Kiedy myślisz, że to już ten moment że możesz już pisać. Odczekaj jeszcze z 5 minut. Popatrz na te ładne obrazki i pomyśl czy to na pewno tak ma być. Nie zapomniałeś o czymś? Co się stanie i jak bardzo będziesz się musiał namęczyć żeby dodać jakiegoś nowego ficzera? Albo czy możliwe będzie ponowne wykorzystanie komponentów, które właśnie zamierzasz zakodzić. Czy napewno dziedziczenie a nie agregacja 😉 Jeżeli po 5 minutach nadal jesteś pewien swego, to śmiało zaczynaj pisać.
Tutaj się trochę powtórzę, ale to mój blog więc mogę. Chodzi mi o obrazki, jak sobie narysujesz już wszystkie klocki układanki, wszystkie przepływy, kto, z kim i dlaczego. Zrób przysłowiowy krok w tył i spójrz czy nie będzie Ci wstyd takiego gniota później pisać i poprawiać. Prawie zawsze można lepiej.
Życie: nigdy nie zaczynaj dnia pracy od suszonych owoców.

Jak już ktoś przebrniesz przez moje propozycje, dorzuć coś od siebie.
Wstyd mi za tego posta, ale musze.

krótko, szybko i na temat – jak zrobić własny widok

Jestem świeżo po przeczytaniu więc jeszcze pamiętam i mam zapisane najważniejsze kroki, oto przepis na własny widok.
1) Bierzesz 1 widok, który chcesz zmodyfikować na własny użytek – dziedziczysz po owym.
2) Robisz obsługę wszystkich możliwych konstruktorów widoku po którym odziedziczyłeś. Raczej ważne – nigdy nie wiesz, z którego dalvik wywali Ci wyjątek!
3) Jeżeli potrzebujesz dodajesz odpowiednie .xml z parametrami dla kolorów, rozmiarów czy innego dziadostwa, którego nie chcesz i nie powinieneś trzymać zaszytego na stałe w kodzie
4) W swojej metodzie inicjującej – inicjujesz wszystko co będzie ci potrzebne do używania w nowej klasie widoku, np. zaczytujesz kolorki z .xml.
5) W onDraw dodajesz swój kod. Wszystko co będzie przed super.onDraw() będzie pod klasą bazową, wszystko co będzie po będzie nad tym co narysowała klasa bazowa. Oczywiście jeżeli wywołasz super.onDraw(…);
6) Definiujesz layout swojego widoku w odpowiednim .xml. Łudząco podobny do głównego layout’u aplikacji.
7) Używasz swojego nowego widoku w kodzie. Np.int id = R.layout.myNewView; blabla.setView(id);

Po odpaleniu i wywalaniu się aplikacji przeglądasz jaki wyjątek poleciał w dalvikvm, poprawiasz, jarasz się swoim nowym widokiem.

Mega droidowych hakierów pozdrawiam. Na razie nie wiem jak inaczej zrobić własny widok. Jak się dowiem to napisze. Na ten czas to musi wystarczyć.

Działa? Poka – Pochwal się! Pytania? – dajesz!

ps. Jak się dowiem jak to dodam obsługę [code]…[/code] żeby ładne różowe kolory były.

SDJ za free

Dużo na głowie i nie mam czasu na naukę i kodowanie.

Teraz taki szybki wpis o Software Developer’s Journal – otóż można już to czasopismo legalnie ściągać za darmo ze strony wydawcy. Dla użytkowników AdBlock uwaga, wyłączcie blokowanie reklam, link do zaciągnięcia .pdf ma nie fortunna nazwę i jest blokowany. Oprócz najnowszego numeru można sięgnąć na kilka wydać wstecz.

Całkiem miła sprawa z tym SDJ.

projekt p2prss

Ostatnie dni skupiałem się tylko na czytaniu o androidzie, aby utrzymać równowagę w nauce, teraz trochę c# a w związku z czym powróciłem do projektu “p2prss”(o gps2kml nie zapomniałem, muszę trochę doczytać). Zalegało mi kilka rzeczy na liście todo za które miałem się zabrać. Na dodatek po włączeniu aplikacji od razu dodałem buga do listy rzeczy do zrobienia.

Aplikacja nie jest skomplikowana, zacząłem ją pisać, gdy uczyłem się podstaw programowania w c# i .net, więc nie jest to cud techniki. Spełnia swoje założenia także jest dobrze
 

Do czego służy i jak to się obsługuje:
To proste, należy dodać serwer, który udostępnia kanał rss z nowymi torrentami. Następnie zdefiniować obiekt pożądań i określić jakie kluczowe słowa powinny wystąpić, można zdefiniować słowa, których nie powinno być w interesującym nas torrencie. GUI jest przygotowane, na trochę większą ilość szczegółów, ale nie wiem czy będę z tego korzystać. Po przebrnięciu przez ten niezwykle skomplikowany proces, aplikacja będzie cyklicznie pobierać listę nowych torrentów. Jeżeli zostanie znaleziony taki, który będzie pasować do opisanego, wyświetli odpowiedni komunikat i umożliwi pobranie pliku .torrent. Ważne: p2prss nie obsługuje protokołu torrent, aby móc ściągać z materiały należy skorzystać z odpowiedniego programu, p2prss monitoruje tylko czy pojawił się oczekiwany torrent. Dodatkowo jeżeli użytkownik się nudzić, może przejrzeć aktualną listę świeżych torrentów i ściągnąć dowolny element z listy.
Plus kilka prostych ustawień i wybór wersji językowej.
 
Źródła projektu są tutaj
A tu można zostawić komentarz lub zaraportować problem.
Można też wysłać mi maila lub zostawić ślad po sobie w komentarzu.
Od razy mała informacja o legalności:
Pomijam fakt piractwa, każdy używa tego jak chce i na własną odpowiedzialność. Jako przykładowy serwer użyłem mininova.org, która udostępnia tylko darmowe rzeczy. A przedmiotem zainteresowań jest openSuse, więc nie powinno być problemów.
Pytania, uwagi, kpiny?