Bliskie spotkania 3 stopnia z iPadem

28.05.2010 @ 21:10:52 by Rafał Kozik | iPad

Dzisiaj odbyła się premiera iPada w Europie, a przynajmniej w tej bardziej cywilizowanej części. Polska niestety musi sobie jeszcze na niego poczekać, a szkoda, bo urządzenie jest bardzo ciekawe.

Obrazek
my precious

Tak się złożyło, że jestem aktualnie na wakacjach w Barcelonie i udało mi się pobawić chwilę tym ciekawym urzadzeniem. Nie ma co się za bardzo rozpisywać w tej kwestii, bo wszystkie informacje na jego temat można znaleźć w sieci. Trochę wniosków z 10 minutowej zabawy:

  • Bardzo solidnie wykonany -- w sumie standard wśród produktów Apple, więc to nie jest żadne zaskoczenie.
  • Waży trochę więcej niż się spodziewałem, ale waga jest raczej w sam raz (w tej kwestii chyba każdy ma swoją opinię).
  • Duża klawiatura ekranowa nawet się sprawdza do wprowadzania tekstu.
  • Przy głośniejszym odtwarzaniu dźwięku bardzo drży -- nie wiem czy to wada egzemplarza którym się bawiłem, czy ogólny problem. Co najmniej irytujące.
  • Wbudowane aplikacje działają świetnie -- oglądałem mapy, książkę adresową, notatki i youtube. Są znacznie lepsze niż odpowiedniki na iPhone.
  • Prędkość działania jest bardzo dobra -- nie widać żadnych przycięć, spowolnień ani nic takiego. System działa lepiej niż na iPodach z którymi miałem styczność.
  • Gra się na tym bardzo fajnie -- sprawdziłem Plants vs Zombies, Flight Control, Labyrinth 2 i jakieś wyścigi. Ta platforma ma ogromny potencjał.

Gdybym miał wymieniać wady to z mojej perspektywy jest tylko jedna -- cena. Przy aktualnym kursie Euro podstawowy model kosztuje ~2000 zł. Wbudowana obsługa sieci 3G (moim zdaniem obowiązkowa przy tego typu urządzeniu) to koszt dodatkowych 100 Euro. Mimo wszystko chętnych nie brakuje -- koło godziny 15 nie było wystawionego żadnego egzemplarza na sprzedaż ;)


Mechanizm promocji w C++

18.05.2010 @ 11:33:28 by Rafał Kozik | C++ szablony programowanie

W standardzie języka C (i C++) opisany jest mechanizm promocji, który polega na automatycznej konwersji z mniejszego typu na większy (np. short na int). Istnieją dwa rodzaje promocji:

  • promocja całkowita (ang. integral promotion) -- konwersja liczb całkowitych
  • promocja zmiennoprzecinkowa (ang. floating point promotion) -- konwersja liczb zmiennoprzecinkowych

Zachowanie to jest bardzo intuicyjne. Dodatkowo, w przypadku użycia funkcji o zmiennej ilości argumentów (tzn. użycia ...), małe typy całkowitoliczbowe ulegają promocji do int / unsigned int, a float do double. To jest już trochę mniej naturalne, ale ta wiedza może czasami się przydać (choćby do tego, żeby tego nie używać ;)).

W C++, z mechanizmem promocji wiąże się dodatkowy problem przy pisaniu funkcji szablonowych. Typowa implementacja max wygląda tak:

template <typename T>
const T& max(const T& a, const T& b)
{
    return (a > b) ? a : b;
}

Wszystko byłoby fajnie, gdyby nie fakt, że wywołanie max(1.0f, 2.0) się nie skompiluje. Da się to rozwiązać bawiąc się trochę szablonami -- o tym w dalszej części.


Szablony w C++

17.05.2010 @ 20:27:08 by Rafał Kozik | C++ szablony programowanie

Szablony są bardzo ciekawym elementem języka C++. Zdarza mi się przeglądać nie mój kod i często mam wrażenie, że ich użycie (poza wykorzystywaniem biblioteki STL) ogranicza się do tworzenia uniwersalnych funkcji i struktur danych, a to dopiero wierzchołek góry lodowej.

Co właściwie można osiągnąć za pomocą szablonów?

  • implementacja uniwersalnych funkcji i struktur danych
  • wykonywanie obliczeń w trakcie kompilacji
  • podejmowanie decyzji w trakcie kompilacji
  • generowanie zoptymalizowanego kodu źródłowego
  • budowanie uniwersalnych wzorców zachowań

Ostatnie dwa punkty mogą wymagać dodatkowego wyjaśnienia.

Jeżeli chodzi o generowanie zoptymalizowanego kodu źródłowego, to za pomocą szablonów możemy generować kod, który nie ustępuje pod względem wydajności ręcznej implementacji. Możliwa jest implementacja klasy wektora (matematycznego), gdzie rozmiar jest parametrem szablonu, a wydajność jest zawsze taka jak w przypadku optymalnej implementacji dla każdego rozmiaru z osobna.

W kwestii budowania uniwersalnych wzorców zachowań sprawa jest trochę bardziej skomplikowana -- mam tu na myśli programowanie z użyciem wytycznych, które opisuje Andrei Alexandrescu w książce "Modern C++ Design". Podczas implementacji często istnieje wiele możliwych (i sprzecznych ze sobą) rozwiązań. Czy kod ma być thread-safe? Jak ma wyglądać alokacja pamięci? Decyzje o tym powinien podejmować użytkownik kodu w zależności od swoich potrzeb i takie właśnie zachowanie można osiągnąć używając szablonów w C++.

Mechanizm szablonów ma bardzo dużą siłę ekspresji, rzadko spotykaną w innych językach. Aby nie pozostać gołosłownym, w najbliższym czasie pojawi się seria wpisów z użyciem szablonów.


Zmiana rejestratora domeny

14.05.2010 @ 12:51:55 by Rafał Kozik | strona webdev z życia

Za kilka dni mija 5 lat odkąd jestem właścicielem domeny revo.pl. Zbliża się termin ważności i miałem kilka problemów z jego przedłużeniem. Mam nadzieję, że tym wpisem zaoszczędzę komuś nerwów w przyszłości ;)

5 lat temu wykupiłem plan hostingowy i domenę w firmie X (nie będę wytykał palcem). Z hostingiem, z powodu bardzo niskiej jakości usług, szybko się pożegnałem. Domena niestety została w tej firmie -- do wczoraj. Jakiś czas temu dostałem przypomnienie o terminie wygaśnięcia domeny i za nią zapłaciłem. Gdy zaczął zbliżać się termin ważności, a domena nie została przedłużona, upominałem się drogą mailową. Gdy to nie poskutkowało próbowałem się dodzwonić, jednak nikt pod wskazanym numerem nie odbierał telefonu. Na szczęście firma X jest tylko resellerem i udało mi się zdobyć kod AUTHINFO od rejestratora (firma HRD). Musiałem tylko dopełnić jeszcze kilka formalności związanych ze zmianą adresu e-mail w bazie danych resellera -- mimo, że w panelu administracyjnym zmieniłem e-mail kilka lat temu, do domeny była przypisana skrzynka, która już nie istnieje.

Po zdobyciu kodu AUTHINFO przeniosłem domenę do NetArt. Tam mam wszystkie swoje domeny i nigdy nie miałem z tą firmą najmniejszych problemów. Cały transfer zajął niecałą dobę. Konfiguracja dns została automatycznie przepisana, więc nie było żadnych przerw w działaniu strony i skrzynek pocztowych. Opłaciłem już fakturę związaną z przedłużeniem (sam transfer jest bezpłatny) i pewnie jeszcze dzisiaj będę miał przedłużoną ważność domeny.

Dlaczego o tym piszę? Pewnie wiele osób ma domeny i/lub inne usługi wykupione w małych, jednoosobowych firmach, które w pewnym momencie mogą przestać odpowiadać. Nie mówię, że takie firmy są złe z definicji, ale jeżeli bywały jakies problemy w przeszłości (a u mnie tak było) to warto uciec jak najszybciej, żeby nie tracić nerwów. W najgorszym przypadku można stracić trochę pieniędzy, domenę i/lub dane składowane na serwerze. Czasami jest to dość duża strata.


Testowanie stron w starszych wersjach IE

29.04.2010 @ 14:05:01 by Rafał Kozik | webdev

Większość nowoczesnych przeglądarek jest aktualizowana dość często (i automatycznie), więc nie ma potrzeby sprawdzania kompatybilności stron internetowych z ich starszymi wersjami. Niestety z IE jest trochę gorzej i wciąż dużo osób używa wersji 6 lub 7. O ile IE6 powinien zniknąć w czeluściach internetu, ponieważ wsparcie dla niego zaczyna znikać z popularnych serwisów, IE7 cieszy się dużą popularnością.

W jaki sposób łatwo sprawdzać kompatybilność stron internetowych z różnymi wersjami IE? Istnieje bardzo proste rozwiązanie -- IETester. Program pozwala uruchomienie strony na każdym silniku IE, począwszy od wersji IE5.5.


Gry na iPhone warte polecenia, część 1

03.04.2010 @ 20:48:52 by Rafał Kozik | iPhone gry

Chyba każdy kto zajmuje się tworzeniem gier, niezależnie czy robi to hobbystycznie czy zawodowo, lubi sobie czasami w coś zagrać. Tak jest w moim przypadku i muszę przyznać, że w ciągu ostatnich kilku miesięcy grałem znacznie więcej niż wcześniej. Wszystko za sprawą iPoda Touch. Miałem wcześniej Nintendo DS i Sony PSP -- z żadnym z tych sprzętów nie spędziłem aż tyle czasu. Pewnie dlatego, że gry są strasznie drogie i nie ma darmowych gier i wersji demo. Dzisiaj postanowiłem napisać o kilku grach, które szczególnie przypadły mi do gustu. Zapraszam do dalszej części.


Continuous integration

20.03.2010 @ 00:15:46 by Rafał Kozik | agile iPhone programowanie gamedev

Jedną z rzeczy na które kładziony jest nacisk w zwinnych metodologiach (ang. agile) to ciągła integracja. Pod tą nazwą nie kryje się nic innego jak częste, automatyczne czynności dotyczące projektu, zwykle kompilacja i uruchamianie testów jednostkowych i/lub regresyjnych. Ma to na celu szybkie wykrywanie problemów i ich rozwiązywanie. Ponieważ problemy są wykrywane szybko, powinno dać się je dość łatwo wyeliminować. Dzięki temu w każdym momencie mamy dostęp do sprawnego builda.

Przykładowe zalety takiego podejścia:

  • częste buildy, np. po każdym uaktualnieniu repozytorium
  • uruchamianie testów i zbieranie informacji które zmiany odpowiedzialne są za ich niepowodzenie
  • możliwość kompilacji z różnymi kompilatorami i na różnych platformach

Podczas każdego builda powstają pliki, które możemy chcieć zachować -- nazywane są artefaktami. Mogą to być logi, wyniki testów, pliki wykonywalne, informacje o użytych plikach itp. Pozwala to na jeszcze lepsze śledzenie zmian w projekcie i znajdowanie problemów.

Najważniejszą rzeczą w całej idei continuous integration jest automatyzacja. Możemy kupić potężny komputer za kilka tysięcy, który będzie to wszystko robił i można znacząco zmniejszyć obciążenie członków zespołu. To inwestycja, która na pewno zwróci się bardzo szybko.

Tyle w teorii -- a jak to wygląda w praktyce? Na licencji MIT dostępny jest Hudson. Jego konfiguracja jest bardzo prosta i współpracuje chyba z każdym popularnym systemem kontrolii wersji ;) Sam używam go na komputerze Mac Mini do kompilacji 3 projektów -- frameworka i aplikacji, które go używają. Jak wiadomo, aplikacje pod iPhoneOS można niestety kompilować tylko pod systemem Mac OS X. Dzięki takiemu rozwiązaniu w kilkadziesiąt sekund od aktualizacji repozytorium mam przygotowanego zipa ze skompilowaną aplikacją, którą mogę pobrać w każdym miejscu na świecie przez przeglądarkę i zainstalować przez iTunes pod Windows. Ma to ogromne znaczenie w zespołach, które mają dostęp tylko do jednego komputera Mac.


Freedoku w druku

11.03.2010 @ 12:45:49 by Rafał Kozik | freedoku

We wrześniu pisałem o Freedoku w wersji do druku. Trochę to zajęło, ale Freedoku pojawiło się w wersji drukowanej!

Freedoku jest umieszczane na łamach miesięcznika "Teraz Zagłębie", ukazującego się w miastach Zagłębia Dąbrowskiego. Poniżej można zobaczyć jak to wyszło (pozwoliłem sobie rozmyć reklamy):


Obrazek

Pojawiło się kilka problemów technicznych z wydrukiem, jednak mam nadzieję, że uda się je rozwiązać w kolejnych numerach.

Jakie dalsze plany dla Freedoku? Na razie żadne, chociaż kto wie, może kiedyś pojawi się wersja na którąś z popularnych platform mobilnych.


Problem z multi-touch w Nexus One

05.03.2010 @ 23:31:30 by Rafał Kozik | sprzęt

Dzisiaj będzie trochę gdybania ;) Zrobiło się głośno o tym, że Nexus One 'gubi się' przy obsłudze multi-touch. Google obwinia HTC za użycie niskiej jakości ekranu dotykowego. Niestety wydaje mi się, że nie uda się tego rozwiązać w aktualizacji oprogramowania. Dlaczego? O tym w dalszej części.


Multi-touch

25.02.2010 @ 15:12:03 by Rafał Kozik | iPhone

Odkąd pierwszy raz miałem styczność z multi-touch, polubiłem tę technologię. Moim zdaniem świetnie sprawdza się w urządzeniach mobilnych, gdzie m.in. jest idealna do powiększania i zmniejszania zawartości ekranu.

A jak wygląda to po stronie developera? Sprawdziłem jak to jest w przypadku iPhone SDK -- są co najmniej dwa sposoby na realizację obsługi multi-touch.

Jeżeli interesuje nas obsługa powiększania to do tego celu powinna nadać się kontrolka UIScrollView, która ma już wbudowaną obsługę tego typu interakcji.

Dla osób, które potrzebują większej kontroli nad danymi, możliwy jest bezpośredni dostęp do danych o dotyku. W widoku możemy zaimplementować metody touchesBegan, touchesMoved, touchesEnded. Jako parametr dostajemy listę UITouch*, skąd możemy dowiedzieć się o aktualnym (locationInView) i poprzednim (previousLocationInView) miejscu dotyku.

Wystarczy tego pisania, idę sobie podotykać ;)


 [1] 2 3 ...