SDJ 01.2011 PL.pdf

(13720 KB) Pobierz
394335858 UNPDF
394335858.025.png
1/2011 (193)
SPIS TREŚCI
BIBLIOTEKA MIESIĄCA
PROGRAMOWANIE IOS
4 Biblioteka Thrust – GPGPU w natarciu
Rafał Kocisz
Jeśli jesteś zainteresowany wykorzystaniem mocy GPU
do rozwiązania Twoich problemów, ale brak Ci czasu na
to aby zapoznać się z niskopoziomowymi detalami obsłu-
gi sprzętu, to biblioteka Thrust jest idealnym rozwiąza-
niem dla Ciebie. Przeczytaj poniższy artykuł, a przeko-
nasz co za jej pomocą możesz osiągnąć.
20 Rozgrywka sieciowa w iOS 4 – GameKit
Framework
Dariusz Niklewicz
Powszechnie wiadomo, jak kłopotliwe potrafi być wytwo-
rzenie i testowanie aplikacji sieciowej, w szczególności
gry. Firma spod znaku nadgryzionego jabłka postanowi-
ła jednak i w tej kwestii ułatwić życie deweloperom, czego
efektem jest wprowadzenie GameKit Framework.
KLUB TECHNICZNY
26 „Znajomi! Zobaczcie moje osiągnięcia!”
– Czyli integracja Twittera w grach na iOS
Marek Pańczyk
Wielu złorzeczy na Twittera i prymitywizm zalewającej go
treści. Jednak stają się oni maluczkimi w obliczu 175 mi-
lionów kont na Twitterze. A co za tym idzie żaden twórca
gier nie może przejść obojętnie obok tak gigantycznej rze-
szy potencjalnych odbiorców.
Transparent Data Encryption
Piotr Tucholski
Kradzież danych może prowadzić do poważnych kon-
sekwencji. Dane nawet w plikach binarnych są łatwe do
odczytania, co wiąże się z możliwością przejęcia pouf-
nych informacji przez osoby niepowołane i w konsekwen-
cji z utratą zaufania ze strony klientów lub nawet z karami
i koniecznością płacenia wysokich odszkodowań. Istnie-
je coraz więcej wymogów i regulacji określających zabez-
pieczenie danych tak podczas procesu przesyłania, jak
i w spoczynku.
WEB DEVELOPMENT
32 Łatwiejsze programowanie interfejsów
użytkownika opartych o GWT
Rafał Pietrasik
Dla tych wszystkich, którzy pisząc internetowe aplikacje
z bogatym interfejsem użytkownika, natknęli się na pro-
blemy z testami, skomplikowanym i trudnym w utrzyma-
niu kodem, lub - po prostu - chcą lepiej pisać swoje apli-
kacje w GWT.
PROGRAMOWANIE JAVA
14 Wiosna z drugą twarzą w chmurach
– część 4. Kompletny przykład procesu
z użyciem Spring Framework i Hibernate.
Paweł Nieścioruk
Artykuł jest czwartym z serii artykułów prezentujących
kompletny proces wytwarzania aplikacji webowej w tech-
nologii Java Server Faces (JSF) w wersji 2.0. W artykule
tym zostanie poruszony temat użycia Hibernate w wersji
3, jako dostawcy implementacji JPA w kontekście aplika-
cji JSF. Hibernate będzie współpracował z frameworkiem
Spring w wersji 3.
40 RESTEasy i JBoss Seam – Integracja
RESTEasy i JBoss Seam
Grzegorz Gwóźdź
Artykuł stanowi wprowadzenie do tzw. „restful web servi-
ces” i prezentuje ich implementację za pomocą farmewor-
ka RESTEasy, zintegrowanego z JBoss Seam.
44 Tworzenie pluginów do Wordpressa
Marcin Lenkowski
Wordpress to najpopularniejszy i według wielu programi-
stów i użytkowników najlepszy na świecie system do two-
rzenia blogów i nie tylko. W artykule dowiemy się w jaki
sposób tworzyć różnorodne wtyczki do tego CMS’a z uży-
ciem wbudowanych w wordpressa bibliotek.
2
1/2011
2
394335858.026.png 394335858.027.png 394335858.028.png 394335858.001.png 394335858.002.png
 
SPIS TREŚCI
SPIS TREŚCI
Andrzej Korolczuk
Tylko nieliczne aplikacje i gry w Internecie są należycie
zabezpieczone. Programując w technologii Adobe Flash,
musisz mieć na uwadze kilka „furtek”, z których korzy-
stają hakerzy przy włamywaniu się do aplikacji. W niniej-
szym artykule postaram się pokazać Ci, co zrobić, aby za-
bezpieczyć owoce swojej pracy. Skupimy się głównie na
grach, jako że to one najczęściej są atakowane przez hac-
kerów.
KONKURS GG.PL
krok po kroku
Przemek Lącki
IBM WebSphere MQ to kompletne rozwiązanie realizujące
usługę systemu kolejkowego. Może pracować niezależnie
jako zewnętrzny serwer, który poprzez szereg specjalnych
interfejsów daje możliwość korzystania ze swoich zasobów
aplikacjom napisanym w różnych językach, lub działać ja-
ko zewnętrzny dostawca dla serwera Websphere AS.
BAZY DANYCH
FELIETON
54 Data Repeater – W prostocie siła
Konrad Kubecki
Data Repeater to kontrolka, za pomocą której można pre-
zentować w postaci tabelki informacje pobrane z bazy da-
nych. Największa zaleta? Łatwość użycia oraz szybkość
implementacji.
Paweł Opydo
Jak to jest, że jedna aplikacja na iPhone odnosi sukces,
a inna nie? Dlaczego spośród kilkunastu symulatorów
starych aparatów hitem okazał się być Hipstamatic? Dla-
czego spośród dziesiątek podobnych gier akurat Doodle
Jump przyniósł milionowe przychody? Na co warto zwró-
cić uwagę, jeżeli chce się zarobić krocie na programach
w App Store?
WARSZTATY
60 Systemy rozpoznawania mowy – Krótka
historia systemów ASR (Automatic Speech
oraz z jakimi problemami się borykają.
Dariusz Wawer
Idea maszyny będącej w stanie zrozumieć lub przetwo-
rzyć ludzką mowę istnieje już ponad 70 lat. W praktyce
systemy takie wykorzystywane są już ponad 20 lat. Jed-
nakże, pomimo niezwykle szybkiego rozwoju techniki,
systemy rozpoznawania mowy ASR są wciąż niedosko-
nałe. O historii, metodach oraz problemach tych syste-
mów napiszę pokrótce w tym artykule.
Miesięcznik Software Developer’s Journal
(12 numerów w roku)
jest wydawany przez Software Press Sp. z o.o. SK
Redaktor naczelny:
Łukasz Łopuszański lukasz.lopuszanski@software.com.pl
Skład i łamanie:
Tomasz Kostro www.studiopoligraficzne.com
Kierownik produkcji:
Andrzej Kuca andrzej.kuca@software.com.pl
Adres korespondencyjny:
Software Press Sp. z o.o. SK,
ul. Bokserska 1, 02-682 Warszawa, Polska
tel. +48 22 427 36 91, fax +48 22 224 24 59
www.sdjournal.org cooperation@software.com.pl
TECHNOLOGIE JUTRA
Dział reklamy: adv@software.com.pl
Redakcja dokłada wszelkich starań, by publikowane
w piśmie i na towarzyszących mu nośnikach informacje i programy
były poprawne, jednakże nie bierze odpowiedzialności za efekty
wykorzystania ich; nie gwarantuje także poprawnego działania
programów shareware, freeware i public domain.
68 Logowanie do mózgu
Grzegorz Gałęzowski
Gry takie jak „Guitar Hero” i systemy Wii zapoczątko-
wały nową erę wśród kontrolerów gier wideo. Teraz „no-
wy” (kto jeszcze pamięta Atari Mind Link) wynalazek mo-
że spowodować, że cały proces kontroli może pójść krok
dalej i wskazywać na powolną śmierć tradycyjnych kon-
trolerów.
Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich
firm.
Zostały użyte wyłącznie w celach informacyjnych.
Osoby zainteresowane współpracą prosimy o kontakt:
cooperation@software.com.pl
www.sdjournal.org
3
394335858.003.png 394335858.004.png 394335858.005.png 394335858.006.png 394335858.007.png 394335858.008.png 394335858.009.png
BIBLIOTEKA MIESIĄCA
Biblioteka Thrust
GPGPU w natarciu
Jeśli jesteś zainteresowany wykorzystaniem mocy GPU do
rozwiązania Twoich problemów, ale brak Ci czasu na to aby
zapoznać się z niskopoziomowymi detalami obsługi sprzętu,
to biblioteka Thrust jest idealnym rozwiązaniem dla Ciebie.
Przeczytaj poniższy artykuł, a przekonasz co za jej pomocą
możesz osiągnąć.
Dowiesz się:
• Do czego służy i co oferuje biblioteka Thrust.
Powinieneś wiedzieć:
• Znajomość podstaw języka C++;
• Znajomość podstaw biblioteki STL.
Computing on Graphics Processing Units ) to
niewątpliwie temat na czasie . Technika ta po-
zwala ujarzmić moc przetwarzania zaszytą w nowo-
czesnych kartach graficznych. Cały czas słyszy się
o przykładach innowacyjnych zastosowań tej techno-
logii. Z drugiej strony, sytuacja na rynku rozwiązań
GPGPU przypomina nieco historię obsługi kart gra-
ficznych w komputerach osobistych w latach dziewięć-
dziesiątych ubiegłego wieku: spora fragmentacja ryn-
ku, brak standardów, potrzeba tworzenia nieprzeno-
śnego oprogramowania korzystającego z niskopozio-
mowych API oferujących bezpośredni dostęp do zaso-
bów sprzętowych. W dzisiejszych realiach niedogod-
ności tego rodzaju odstraszają wielu programistów.
Biblioteka Thrust jest próbą wprowadzenia znaczą-
cych udogodnień w zakresie obsługi przetwarzania
GPGPU bazującego na technologii CUDA, rodem z fir-
my NVIDIA. Jest to w mojej opinii próba bardzo uda-
na. Nie pretenduje być może do rozwiązania wszyst-
kich problemów związanych z programowaniem GPG-
PU (chociażby kwestie fragmentacji i przenośności),
ale stanowi bardzo konkretne wsparcie przy stosowa-
niu technologii CUDA (będącej de facto jednym z wio-
dących tego typu rozwiązań dostępnych na rynku).
prosty przykład wykorzystania biblioteki Thrust. Za-
praszam zatem do zapoznania się z zawartością Li-
stingu 1.
Listing 1. Thrust – pierwsze spojrzenie
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
int main ( void )
{
// (1)
thrust :: host_vector < int > h_vec ( 1 << 24 );
thrust :: generate ( h_vec . begin () , h_vec . end () ,
rand );
// (2)
thrust :: device_vector < int > d_vec = h_vec ;
// (3)
thrust :: sort ( d_vec . begin () , d_vec . end ());
// (4)
thrust :: copy ( d_vec . begin () , d_vec . end () , h_
vec . begin ());
Do ataku!
Mam nadzieję, że wstęp do niniejszego artykułu za-
ostrzył Twój apetyt. Aby jeszcze bardziej podsycić
Twoją ciekawość, na początek proponuję Ci obejrzeć
return 0 ;
}
4
1/2011
P rzetwarzanie GPGPU (ang. General-Purpose
394335858.010.png 394335858.011.png
 
394335858.012.png 394335858.013.png 394335858.014.png 394335858.015.png 394335858.016.png
GPGPU w natarciu
Jeśli spodziewałeś się niskopoziomowego kodu na-
jeżonego egzotycznymi konstrukcjami, to mam na-
dzieję, że się miło rozczarowałeś. Prostota i elegancja
które emanują z tego fragmentu kodu to niewątpliwie
pozytywne cechy biblioteki Thrust.
Rozważmy poszczególne elementy tego protego
przykładu. Na początek pliki nagłówkowe – jak widać,
dla łatwego odróżnienia wszystkie odniesienia do tych
plików poprzedzone są przedrostkiem thrust . Patrząc
na ciało funkcji main() na od razu rzuca się w oczy
podobieństwo przedstawionego tu kodu do przykła-
dów wykorzystania biblioteki STL. Na początek two-
rzony jest obiekt typu thrust::host_vector<int> . Jak
łatwo się domyśleć, jest to instancja szablonu klasy
o interfejsie podobnym do kontenera std::vector . Za-
stanawiasz się zapewne co oznacza tajemniczy pre-
fiks host . W tym miejscu warto pokrótce omówić termi-
nologię stosowaną w ramach biblioteki Thrust (a tak-
że w ramach technologii CUDA). Otóż w ramach tej
terminologii pojęcie host oznacza system gospoda-
rza, tj. system w którym zainstalowane jest urządze-
nie zawierające jednostkę GPU. Z kolei samo urzą-
dzenie wyposażone w tę jednostkę określane jest ja-
ko device (de facto słowa te w języku angielskim ozna-
czają kolejno: gospodarz i urządzenie ). Należy sobie
w tym miejscu uświadomić, że gospodarz i urządzenie
to dwa kompletnie różne systemy – w sensie czysto
sprzętowym. I jedno i drugie wyposażone jest w wła-
sny procesor (procesory), pamięć itd. Co za tym idzie,
każde z nich wykonuje swój własny kod i pracuje na
własnych danych. Jeśli chcemy połączyć te dwa urzą-
dzenia musimy skorzystać ze specjalnych mechani-
zmów komunikacji.
Szablon thrust::host_vector<int> reprezentu-
je kontener służący do przechowywania danych po
stronie gospodarza. Kontener ten w naszym przypad-
ku przechowywał będzie 2^24 (czyli 16777216!), lo-
sowych wartości całkowitych (fragment kodu ozna-
czony jako (1) ). Posortowanie takiej ilości danych
to niebagatelne zadanie dla pojedynczej jednostki
przetwarzającej. Jednakże GPU może poradzić so-
bie z tym problemem znacznie szybciej. W tym celu
musimy przekazać do niego te dane. To właśnie od-
bywa się w linii:
thrust::device_vector<int> d_vec = h_vec;
Jak łatwo się domyśleć, szablon thrust::device _
vector<int> reprezentuje kontener do przechowywa-
nia danych, tyle że po stronie urządzenia. Przypisa-
nie:
d_vec = h_vec;
spowoduje transfer danych z systemu gospodarza na
urządzenie. W dalszej kolejności (3) następuje sorto-
wanie ( thrust::sort() ) – oczywiście po stronie urzą-
dzenia. I wreszcie – transfer danych na system go-
spodarza, tym razem zrealizowany za pomocą algo-
rytmu thrust::copy() .
Prawda, że proste? Tyle na początek. W dalszej
części artykułu wrócimy jeszcze to poszczególnych
Listing 2. Thrust – intgracja z kontenerami STL
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <list>
int main ( void )
{
std :: list < int > h_list ;
h_list . push_back ( 1 );
h_list . push_back ( 2 );
h_list . push_back ( 3 );
thrust :: device_vector < int > d_vec ( h_list . size ());
thrust :: copy ( h_list . begin () , h_list . end () , d_vec . begin ());
thrust :: device_vector < int > d_vec2 ( h_list . begin () , h_list . end ());
return 0 ;
}
www.sdjournal.org
5
394335858.017.png 394335858.018.png 394335858.019.png 394335858.020.png 394335858.021.png 394335858.022.png 394335858.023.png 394335858.024.png
 
Zgłoś jeśli naruszono regulamin