Otaczają nas zewsząd. Na pierwszy rzut oka niewidoczne, ukryte
|
|
- Łucja Dudek
- 8 lat temu
- Przeglądów:
Transkrypt
1
2
3
4 OD REDAKCJI Otaczają nas zewsząd. Na pierwszy rzut oka niewidoczne, ukryte w kieszeniach mijających nas przechodniów, zamknięte w teczkach bądź neseserach. Cały czas aktywne, tworzą gigantyczną, ruchomą sieć, która oplata nasz świat. Dzięki nim, możemy porozumiewać się niemalże bez ograniczeń i mieć nieprzerwany dostęp do informacji czy rozrywki... Czy to wstęp do powieści typu science-fiction? Oczywiście, że nie: łatwo odgadnąć, iż mowa tu o nowoczesnych urządzeniach mobilnych. Kiedy myślimy o przytoczonych powyżej faktach, dochodzimy do wniosku, iż przyszło nam żyć w niesamowitych czasach rozkwitu Ery Informacji. W przeciągu ostatnich 30 lat byliśmy świadkami szalonego boomu komputerów osobistych, rewolucji internetowej, zaś ostatnio lawinowego rozwoju urządzeń przenośnych. Jednakże kolejne lata obserwacji kolejnych nowinek technologicznych utwierdzają nas w przekonaniu, iż dziedzina Informatyki, a szczególnie działka wytwarzania oprogramowania - jest ciągle tym smolistym grzęzawiskiem nie do pokonania, o którym pisał w 1975 roku Frederick P. Brooks Jr. w swoim bestsellerze p.t. Mityczny osobomiesiąc. Odpowiedź na pytanie 'dlaczego?' jest prosta: czynnik ludzki. Po prostu nie da się raz zaprojektować i stworzyć miliona kopii idealnego programisty tak jak to się z robi z procesorami czy innymi układami elektronicznymi. Kolejne pokolenia inżynierów oprogramowania trzeba żmudnie i nieustannie edukować i wychowywać ciągle od nowa i od nowa. Jednakże, o dziwo cały czas znajdują się chętni do tego aby brnąć we wspomniane wcześniej grzęzawisko, uczyć się i ujarzmiać niezbadane dotąd obszary informatycznej wiedzy oraz praktyki. Dlaczego tak się dzieje? Może dlatego, że programowanie daje Człowiekowi niespotykane dotąd możliwości kreowania otaczającej go rzeczywistości, co z kolei niesie niesamowitą satysfakcję. Może to właśnie ten entuzjazm napędzany poprzez kolejne pokolenia informatyków sprawia, iż ta młoda dziedzina wiedzy rozwija się tak dynamicznie... Drogi Czytelniku, mamy zaszczyt oddać do Twoich rąk pierwszy, pilotażowy numer SDJ: Biblia Programisty Programowanie Urządzeń Mobilnych. Nie bez przyczyny tematem przewodnim tej nowej serii zostało programowanie urządzeń mobilnych. Na kartach pisma, które trzymasz w ręku znajdziesz rozwiązania szeregu problemów, z którymi tu i teraz zmagają się programiści, ujarzmiający nowinki technologiczne ukryte w naszych kieszeniach. Prezentowany materiał został dobrany przekrojowo, tak abyś miał okazję przekonać się o różnorodności rozwiązań mobilnych. Wierzymy, iż niezależnie od tego czy jesteś doświadczonym programistą czy też świeżo upieczonym studentem informatyki, przedstawione tu informacji pokażą Ci nowe kierunki i pomogą pewniej poruszać się po technologicznych meandrach programowania nowoczesnych telefonów komórkowych. Mamy również nadzieję, iż przedstawione artykuły będą dla Ciebie bodźcem do zgłębiania nowych zagadnień i poszerzania swojej wiedzy. Na koniec chcieliśmy podkreślić, iż Redakcji SDJ bardzo zależy na zapoznaniu się z Twoją opinię o niniejszym numerze, zarówno w odniesieniu do prezentowanej treści jak i formy. Jeśli zechciałbyś podzielić się Twoimi uwagami w tym temacie, to zapraszamy do kontaktu. Łukasz Łopuszański Redaktor naczelny Rafał Kocisz Redaktor prowadzący 4 SDJ Extra 34 Biblia
5
6 SDJ Extra 34 Biblia SPIS TREŚCI 10 Opis DVD PROGRAMOWANIE WINDOWS MOBILE 12 RIL API w sercu telefonu Przemysław Mogaj Radio Interface Layer (RIL) jest kluczowym elementem odpowiadającym za komunikacje pomiędzy systemem Windows Mobile a siecią GSM. W środowisku programistów WM panuje opinia, że API do obsługi RIL jest niejasne i trudne w użyciu. W artykule postaramy się pokazać, jak powiada przysłowie nie taki diabeł straszny jak go malują. 24 RAPI Współpraca komputerów desktop z Windows CE i Mobile Daniel Stoiński Czasami podłączamy urządzenie mobilne wyposażone w Windows CE/Mobile do komputera stacjonarnego, aby skopiować pliki, połączyć się z Internetem czy wygodnie wysłać z klawiatury kilka SMS-ów. W świecie mobilnych urządzeń Microsoftu te i wiele innych ciekawych funkcji dostępnych jest za pośrednictwem biblioteki RAPI. Nie tylko dla MS Windows. 40 Rozpocznij Przygodę z Windows Mobile Zobacz, jak to się robi w technologii Microsoft Daniel Dudek Firma Microsoft od wielu lat wspiera programistów aplikacji mobilnych, dając im coraz nowsze i lepsze narzędzia. Z roku na rok programiści mają dostęp do większej ilości zasobów urządzeń mobilnych, a prostota, z jaką można tworzyć takowe aplikacje w chwili obecnej, nie odstrasza już nowych adeptów tej sztuki. 46 MS SQL SERVER CE 3.5 Jak wykorzystać w swojej aplikacji silnik SQL Servera CE 3.5. Łukasz Strąk Dzięki nowej wersji SQL Servera CE możesz zarządzać danymi poprzez zapytania bez konieczności instalacji dodatkowych usług i bez dostępu do Internetu. Ułatwia to dystrybucję oprogramowania. W artykule znajdziesz informacje, które pozwolą Ci rozpocząć pisanie aplikacji wykorzystujących SQL Server CE. 56 Moc pod kontrolą Efektywne zarządzanie zasilaniem w aplikacjach dla systemu Windows Mobile Marian Witkowski Odwiecznym problemem i wyzwaniem dla konstruktorów urządzeń mobilnych była możliwość ich długiej pracy z wykorzysta- 6 SDJ Extra 34 Biblia
7 Miesięcznik Software Developer s Journal (12 numerów w roku) jest wydawany przez Software Press Sp. z o.o. SK niem zasilania bateryjnego. Cel ten został w dużej mierze osiągnięty, ale mimo wszystko źle napisana aplikacja potrafi zmusić użytkownika do częstszego używania ładowarki. Dyrektor wydawniczy: Anna Adamczyk Redaktor naczelny: Łukasz Łopuszański lukasz.lopuszanski@software.com.pl Redaktor prowadzący: Rafał Kocisz rafal.kocisz@software.com.pl PROGRAMOWANIE SYMBIAN OS 62 Obsługa akcelerometru na platformie Series60 Wykorzystaj w pełni możliwości telefonu komórkowego! Rafał Kocisz, Wojciech Gasek Akcelerometr, bądź inaczej sensor ruchu, od stosunkowo niedawna jest wykorzystywany jako rozszerzenie technologicznych możliwości nowoczesnych telefonów komórkowych. Artykuł pokazuje, jak oprogramować akcelerometr w aplikacjach Symbian OS, działających na platformie S60, oraz jak w praktyce wykorzystać potencjał tego urządzenia. 78 SDL na Symbianie Cztery porty Bartosz Taudul W jaki sposób można wykorzystać jedną z najlepszych i najszerzej wykorzystywanych bibliotek ułatwiających tworzenie gier? Czy jest dostępna jej implementacja na Symbiana? Na co należy zwrócić szczególną uwagę podczas jej użytkowania? Odpowiedzi na wszystkie te pytania (i nie tylko) znajdują się w artykule. PROGRAMOWANIE ANDROID 90 Android Market bliżej dewelopera Stworzenie aplikacji to dopiero początek. Dowiedz się, jak ją sprzedać! Adam Skrzyszewski Głównym zmartwieniem deweloperów planujących sprzedaż swoich programów jest dotarcie do odpowiedniej grupy odbiorców. Android Market, jako oficjalna platforma dystrybucyjna, zakłada nieograniczony dostęp do wszystkich posiadaczy urządzeń z oprogramowaniem Google. Czy zastanawiałeś się, jak wykorzystać ten ogromny potencjał? 98 Android na przykładzie: geotagging zdjęć Praktyczne wykorzystanie najciekawszych funkcji mobilnej platformy firmy Google Piotr Buła Android to nowa, otwarta platforma mobilna od Google. W artykule przedstawiono ciekawsze jej możliwości, na przykładzie aplikacji umożliwiającej geotagging zdjęć wykonanych za pomocą telefonu komórkowego opartego na tej platformie. Korekta: Tomasz Łopuszański Projekt okładki: Agnieszka Marchocka Monika Grotkowska Skład i łamanie: Monika Grotkowska monika.grotkowska@software.com.pl Tomasz Kostro tomasz.kostro@software.com.pl Dział produkcji i kolportażu: Alina Stebakow alina.stebakow@software.com.pl Kierownik produkcji: Andrzej Kuca andrzej.kuca@software.com.pl Nakład: egz. Adres korespondencyjny: Software Press Sp. z o.o. SK, ul. Bokserska 1, Warszawa, Polska tel , fax cooperation@software.com.pl Dział reklamy: adv@software.com.pl Obsługa prenumeraty: EuroPress Polska software@europress.pl Dołączoną do magazynu płytę DVD przetestowano programem AntiVirenKit firmy G DATA Software Sp. z o.o. 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. Uszkodzone podczas wysyłki płyty wymienia redakcja. Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich firm. Zostały użyte wyłącznie w celach informacyjnych. Redakcja używa systemu automatycznego składu Osoby zainteresowane współpracą prosimy o kontakt: cooperation@software.com.pl Druk: ArtDruk Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy technicznej w instalowaniu i użytkowaniu programów zamieszczonych na płycie DVD dostarczonej razem z pismem. Sprzedaż aktualnych lub archiwalnych numerów pisma po innej cenie niż wydrukowana na okładce bez zgody wydawcy jest działaniem na jego szkodę i skutkuje odpowiedzialnością sądową. 7
8 SDJ Extra 34 Biblia 118 Google Android Programowanie z wykorzystaniem Google Maps Igor Kruk W artykule JME MIDlet Przelicznik walut na podstawie kursów NBP opisuje architekturę JME oraz prezentuje sposób, w jaki można rozpocząć przygodę z programowaniem z wykorzystaniem tej technologii. Artykuł poświęcony jest platformie Android, na której można tworzyć zaawansowane aplikacje m.in. z wykorzystaniem Google Maps. 124 Google Android Programowanie interfejsu użytkownika pod Android OS Tomasz Milczarek Artykuł jest wprowadzeniem do programowania interfejsu użytkownika (UI User Interface) na platformie Google Android. Omawia podstawowe komponenty interfejsu i sposoby rozmieszczania ich na ekranie. Przedstawia również tworzenie formularzy, przenoszenie danych między formularzami oraz interakcję między różnymi ekranami użytkownika. PROGRAMOWANIE JAVAME 148 JME na przykładzie Przelicznik walut na podstawie kursów NBP Igor Kruk Jeszcze kilka lat temu obsługa technologii Java była informacją, która miała zachęcić do zakupu telefonu komórkowego. Przez tych kilka lat nastąpił znaczny rozwój komórek i choć obecnie większość z nich posiada własny system operacyjny i nie służą już tylko do wykonywania rozmów i przesyłania wiadomości, to technologia JME jest nadal popularna. 154 Klasyczna platformówka na komórkę Piszemy grę bazującą na platformie Java Micro Edition Cezariusz Klonkowski Tworzenie każdej gry, nawet najprostszej, łączy w sobie wiele wyzwań, z którymi musi uporać się programista. Tworzenie aplikacji dla platformy mobilnej niesie dodatkowe problemy. Jednak satysfakcja z napisania własnej, nawet bardzo prostej gry na telefon komórkowy, jest bezcenna! Jeśli chciałbyś poczuć taką satysfakcję, to przeczytaj ten artykuł. PROGRAMOWANIE IPHONE OS 132 Poznajemy iphone SDK Pierwsze kroki Tomasz Dubki Nikt nie zaprzeczy, że jednym z najpopularniejszych urządzeń mobilnych ostatnich 12 miesięcy jest iphone. Doskonały wygląd zewnętrzny, przejrzysty graficzny interfejs użytkownika oraz bogata funkcjonalność to tylko niektóre jego cechy. W niniejszym artykule przedstawimy to urządzenie z punktu widzenia programisty. 140 Objective-C kontra Java i C++ Wprowadzenie do języka Rafał Kocisz Java i C++ panują niepodzielnie w działce technologii mobilnych. Język Objective-C jest stosunkowo nowym graczem na tym rynku, stoi jednak za nim potężna marketingowa siła platformy Apple iphone/ itouch. Niniejszy artykuł zawiera szybkie wprowadzenie do Objective-C oraz porównanie jego możliwoci z językami Java i C Testowanie aplikacji na platformie JME Zbieranie informacji debugowych w ograniczonym środowisku uruchomieniowym Marcin Maciejewski ROZWIĄZANIA MOBILNE 172 Lotus Notes Traveler Andrzej Olsztyński W tym roku, zgodnie z danymi IBM, po raz pierwszy w historii, więcej ludzi na świecie będzie miało telefon komórkowy niż stacjonarny. Wiele produktów IBM jest dostępnych na platformach mobilnych. Ostatnim ważnym wydarzeniem w tym zakresie było wprowadzenie oprogramowania Lotus Notes Domino, czyli pakietu IBM do pracy grupowej na iphone. 8 SDJ Extra 34 Biblia
9 178 Stary software nowa platforma Kamil Kowalski, Artur Chruściel W jednym z numerów SDJ (2/2009) przybliżyliśmy profil prac zespołu zajmującego się rozwojem oprogramowania dla radiotelefonów systemu TETRA w krakowskim centrum Motoroli. Dziś przyjrzymy się problemom, przed którymi stanęliśmy w ostatnich latach w związku z migracją na nowe platformy sprzętowe. 182 Oracle SPATIAL Opis podstawowych funkcjonalności opcji Oracle SPATIAL dedykowanej dla systemów GIS Tomasz Murtaś Poprzez opcję SPATIAL baza danych zyskuje możliwość zarządzania danymi o charakterze przestrzennym. To zupełnie nowy wymiar pozwalający jeszcze precyzyjniej odwzorowywać rzeczywistość, modelować dane i analizować zależności. 186 Wzorce projektowe w Java Card Leszek Siwik, Krzysztof Lewandowski, Adam Woś Tworzenie oprogramowania wymaga starannego projektu i dużej dokładności. Platforma Java Card do tej pory pozostawała swego rodzaju skansenem, gdzie szeroko akceptowany był kod, który w innych obszarach byłby absolutnie nieakceptowalny. Z pewnością warto więc poświęcić czas na zapoznanie się z dobrymi praktykami projektowania i programowania 206 Flash Lite Grzegorz Trubiłowicz, Mateusz Pietrek, Karol Bednarz Flash Lite pomimo kilku lat na rynkach całego świata nadal pozostaje nieodkrytym środowiskiem. Jest to jednak rozwiązanie dające ogromne możliwości, dlatego warto się mu bliżej przyjrzeć. FELIETONY 214 Raport większości Arkadiusz Merta Technologie mobilne otwierają nowe możliwości być może jeszcze bardziej rewolucyjne niż zjawisko Internetu. W odróżnieniu od Sieci tort jest dzielony na innych zasadach, i to przez znacznie większą ilość graczy. 217 Ruch jest wszystkim [cel niczym] Arkadiusz Merta Co napędza rozwój technologi mobilnych? Czy to nasze potrzeby, czy potrzeba zwiększenia naszej efektywności. 192 Open GL ES 1.x Fakty i mity Krystian Kostecki Programowanie aplikacji na urządzenia przenośne jest fascynującym zajęciem. Dodanie im trzeciego wymiaru sprawia jeszcze większą satysfakcję. Czy tworzenie efektownej, ale i wydajnej grafiki na te malutkie urządzenia nie jest abstrakcją lub mitem? Jak wykorzystać moc krzemu, który mieści się w dłoni? Czy można wierzyć standardom? Oceńcie sami. 9
10 Opis CD Kursy WINDOWS MOBILE Kurs podstaw tworzenia aplikacji na Windows Mobile (kurs w języku angielskim). Szkolenie zostało podzielone na 7 działów: wprowadzenie emulatory podstawy programowania aplikacji okienkowych zaawansowane aplikacje Windows Forms wykorzystanie baz danych bezpieczeństwo programowanie mobilnych aplikacji internetowych W każdym z działów możemy wybrać jaki sposób podania tych samych zagadnień jest dla nas najwygodniejszy dokument, laboratoria hands-on-lab, webcast z prezentacją czy screencast z kodem. Mobile development is growing fast, and Windows Mobile is at the forefront with over 18 million phones shipped last year and many more cutting-edge devices on the way. Visual Studio developers have tremendous opportunities in this space. Why? Developing for a Windows Mobile phone leverages your existing coding experience and takes it to new heights. In this track, we ll go through the fundamentals of building mobile applications. You ll learn how to set up Visual Studio with the latest SDK and device emulators, and you ll see how to build, deploy and debug applications. We ll also explore AJAX capabilities that offer the richness of the desktop for mobile devices. Level 1: Mobile Development Introduction Level 2: Device Emulators Level 3: Mobile Windows Forms Development Level 4: Advanced Mobile Windows Forms Development Level 5: SQL Server CE Introduction Level 6: Security and Deployment Level 7: Mobile Web Development Google Android Programowanie interfejsu użytkownika pod Android OS Screencast jest wprowadzeniem do programowania interfejsu użytkownika (UI User Interface) na platformie Google Android. Omawia podstawowe komponenty interfejsu i sposoby rozmieszczania ich na ekranie. Przedstawia również tworzenie formularzy, przenoszenie danych między formularzami oraz interakcję między różnymi ekranami użytkownika Google Android charakteryzuje się bogatym zestawem komponentów pozwalającym na realizację nawet najbardziej skomplikowanych interfejsów. W przypadku developerów niezbyt zadowolonych ze standardowej biblioteki, zawsze pozostaje możliwość rozszerzania istniejących już komponentów. Z racji tego, że Android tworzony jest przez firmę Google, istnieje łatwy dostęp do takich komponentów jak MapView czy WebView, umożliwiających korzystanie w tworzonych aplikacjach z Google Maps oraz pozwalających na łatwe przeglądanie zawartości Internetu. To znacznie poszerza krąg pomysłów na aplikacje, już na starcie pozwala uczynić je bardziej ciekawymi i konkurencyjnymi. Można sądzić, że powyższe zalety (prostota tworzenia interfejsów, duży wybór komponentów, łatwe wykorzystanie Google Maps i Internetu) spowodują, że Android OS umocni swoją pozycję w świecie platform programistycznych na urządzenia mobilne. Dzięki temu tutorialowi dowiesz się, jak poprawnie rozmieścić komponenty komponenty użytkownika na ekranie, jak tworzyć poszczególne widgety, jak ekrany użytkownika współpracują ze sobą. Pierwsza część screencasta stanowi omówienie idei stojącej za powstaniem Google Android OS, podstawowych zasad, które przyjęli twórcy tego systemu oraz przedstawiona jest jego architektura. Omówione zostały typowe kontrolki i ich zastosowanie. Druga część screencasta przedstawia przykład tworzonej aplikacji realizującej wykresy biorytmów. Tworzenie aplikacji zostało pokazane w następujących krokach: tworzenie nowego projektu w środowisku Eclipse ADT (Android Development Toolkit); konfiguracja projektu; tworzenie podstawowej klasy akcji; tworzenie layoutu; definiowanie widoków w plikach XML; oprogramowywanie kontrolek; oprogramowywanie zdarzeń w Google Android; interakcja pomiędzy kontrolkami a klasą typu Activity; stworzenie przejścia między dwoma ekranami użytkownika; przesyłanie danych między ekranami; stworzenie własnego widoku. Narzędzia Windows Mobile 6.5 Developer Toolkit Wydana na początku czerwca 2009 dokumentacja, przykładowy kod, nagłówki, biblioteki oraz emulatory do najnowszej wersji systemu Windows Mobile 6.5. Dostępne są dwie wersje w zależności od tego czy interesuje nas pisanie aplikacji dla systemu Windows Mobile Professional czy Standard. 10 SDJ Extra 34 Biblia
11 Opis CD Toolkit wymaga instalacji Windows Mobile 6 SDK (do pobrania bezpłatnie ze stron Microsoftu). Aplikacje Consumer Solution Accelerator Consumer Solution Accelerator jest wzorcową aplikacją dla Windows Mobile napisaną w językach C# i C++, w oparciu o.net Compact Framework 3.5. Aplikacja ma na celu ułatwić użytkownikowi dotarcie na spotkanie prezentuje mapy wykorzystując nawigację GPS, szacuje czas przejazdu, informuje uczestników spotkania w razie ewentualnego spóźnienia. Wraz z kodem aplikacji czytelnicy otrzymują zestaw dokumentów opisujących krok po kroku poszczególne etapy tworzenia danej aplikacji. Od wprowadzenia, przez dobór architektury aż po dodawanie do projektu kolejnych elementów kodu. Czytelnicy mogą sami stworzyć aplikacje na podstawie dokumentów lub uczyć się przez czytanie gotowego kodu. Materiały dodatkowe do artykułów Redakcja nie udziela pomocy technicznej w instalowaniu i użytkowaniu programów zamieszczonych na płytach CD-ROM dostarczonych razem z pismem. Jeśli nie możesz odczytać zawartości płyty CD, a nie jest ona uszkodzona mechanicznie, sprawdź ją na co najmniej dwóch napędach CD. W razie problemów z płytą, prosimy pisać pod adres: cd@software.com.pl 11
12 Programowanie Windows Mobile RIL API w sercu telefonu Radio Interface Layer (RIL) jest kluczowym elementem odpowiadającym za komunikacje pomiędzy systemem Windows Mobile a siecią GSM. W środowisku programistów WM panuje opinia, że API do obsługi RIL jest niejasne i trudne w użyciu. W tym artykule postaram się pokazać, że jak powiada przysłowie nie taki diabeł straszny jak go malują. Dowiesz się: Czym jest Radio Interface Layer; Jak używać RIL API; W jaki sposób stworzyć serwis systemowy Windows Mobile; W jaki sposób korzystać z rejestrów systemu Windows Mobile. Poziom trudności Powinieneś wiedzieć: Jak programować w języku C++; Podstawy WINAPI. Pamiętam jakby to było wczoraj: dostałem do analizy kod źródłowy, należało stwierdzić, czy flow programu jest zgodny z przyjętą koncepcją. Kod ani długi, ani krótki, zadanie wydawało się więc proste, i uznałem, że to nagroda za wcześniejszy okres wytężonej pracy... Kilka godzin i kaw, później niebezpiecznie blisko zbliżyłem się do granicy załamania nerwowego, a moje myśli skakały pomiędzy planem zamachu na osobę, która wymyśliła, że wszystko dzieje się asynchronicznie, a rozważaniami na temat sposobów na skrócenie swoich cierpień. Tak właśnie wyglądał mój pierwszy kontakt z RIL'em. Niestety, a może właśnie stety od tamtego czasu nader często przyszło mi pracować w oparciu o wspomniane API. Swoimi doświadczeniami postaram się podzielić w tym artykule, a ponieważ w moim odczuciu najlepiej uczyć się na bazie przykładów, dlatego też, aby zobrazować podstawowe mechanizmy, pokażę Ci drogi czytelniku, jak stworzyć prostą aplikację, która pozwoli na blokowanie połączeń telefonicznych, a dodatkowo wyśle informacyjnego SMS'a do osoby, która próbowała się z Tobą skontaktować. Ale po kolei... Wiem, że najchętniej uruchomiłbyś IDE i zaczął pisać kod, na początek warto jednak powiedzieć słów kilka o tym, czym jest RIL. Pomyśl teraz chwilę o urządzeniach z systemem Windows Mobile można wymienić dwie ich główne linie rozwojowe. Po pierwsze są to urządzenia klasy PDA (ostatnimi czasy na wymarciu), z drugiej zaś strony urządzenia, które można sklasyfikować jako tzw. Smartphony. Jaka jest pomiędzy nimi różnica? Oczywiście te drugie pozwalają na szeroko rozumianą komunikację pomiędzy urządzeniem a siecią GSM/UMTS. I tu na scenę wchodzi właśnie RIL (Radio Interface Layer). Mówiąc o RIL, mamy na myśli pewne warstwy abstrakcji, które oddzielają sprzęt od systemu myślę, że jak najbardziej będzie tu na miejscu porównanie do sieciowego modelu OSI zostało to pokazane na Rysunku 1. Na samym szczycie hierarchii mamy aplikacje wchodzące w bezpośrednią komunikację z użytkownikiem i dostarczające mu funkcjonalność związaną z telefoniczną stroną urządzeń z WM (zauważ, że pod pojęciem OEM nie kryją się tylko aplikacje dostarczane przez producenta telefonu, ale również twoje). Szczebel niżej kryje się tzw. RIL Proxy to właśnie z nim będziesz miał do czynienia, tworząc aplikacje oparte o Radio Interface Layer. Wywołując funkcje wchodzące w skład RIL API, tak naprawdę wysyłasz zapytania do Proxy, w odpowiedzi otrzymując wyniki. RIL Proxy tłumaczy twoje zapytania na odpowiednie polecenia typu DeviceIOControl, i wysyła je do sterownika modemu (radia). Następnie te polecenia tłumaczone są na komendy AT, które wędrują do urządzenia, by tam zostać odpowiednio przetworzone. Taka architektura ma wiele zalet. Po pierwsze wymaga na producentach sprzętu radiowego stworzenie sterowników w taki sposób, aby były kompatybilne z RIL API- (jak już wspomniałem, cała komunikacja w systemie WM jest oparta właśnie o RIL'a). To z kolei pozwala producentom telefonów na wybór szerokiej gamy podzespołów, bez przejmowania się narzutem czasu niezbędnym do wypuszczenia produktu na rynek. Inną zaletą jest fakt asynchroniczności do- RIL: Szybki start Aby tworzyć aplikacje w oparciu o RIL API, musisz mieć dostęp do symboli znajdujących się w pliku RIL.DLL na urządzeniu. Można go uzyskać w sposób dwojaki. Pierwszą drogą jest użycie funkcji LoadLibrary, a następnie zmapowanie potrzebnych symboli. Innym rozwiązaniem jest dołączenie do projektu statycznej biblioteki RIL.LIB oraz załączenie pliku nagłówkowego RIL.H. Ponieważ pliki te nie wchodzą w skład Windows Mobile SDK, konieczne jest zdobycie ich z innych źródeł. Microsoft dołącza je do OEM Adaptation Kit(OAK) zestawu bibliotek i plików nagłówkowych przeznaczonych do współpracy z pakietem Platform Builder. Niezbędne pliki można również pobrać z tej strony: ~itsme/projects/xda/ril.html. Przed kompilacją musisz pamiętać, aby do dodatkowych bibliotek linkera dodać bibliotekę RIL.LIB. 12 SDJ Extra 34 Biblia
13 RIL API w sercu telefonu stępu do sprzętu pozwala to na uniknięcie sytuacji, w której jedna aplikacja zawłaszcza modem, odcinając dostęp do niego pozostałej części systemu. Do 2004 roku RIL API przeznaczone było do wewnętrznego użytku Microsoftu, a nawet po tej dacie Microsoft zalecał, aby używać API takich jak TAPI, SMS API, SIM API... Ostatnio jednak certyfikowany trener Microsoftu stwierdził, że to podejście jest już nieaktualne, i gigant z Redmond poprosił swoich trenerów, aby spopularyzowali bezpośrednie korzystanie z Radio Interface Layer. Jakie może to Tobie, jako programiście, przynieść korzyści? Po pierwsze może się to przyczynić do wzrostu wydajności Twojej aplikacji(wszystkie wspomniane powyżej API są tylko wrapperami na RIL). Po drugie wydaje mi się, że każdy, kto był zmuszony do pracy z chociażby z TAPI, doceni prostotę RIL. Kolejnym argumentem jest to, że przy użyciu jednego API jest się w stanie kontrolować całość telefonicznej strony systemu. Pozwala to zaoszczędzić czas, zostaje bowiem zdjęta z programisty konieczność przyswajania wielu różniących się architekturami metod dostępu do poszczególnych funkcji. Mimo że RIL API zostało upublicznione, to jednak pliki nagłówkowe nie są niestety dołączone do Windows Mobile SDK. Aby dowiedzieć się skąd je zdobyć oraz jak zacząć pracę, spójrz proszę do ramki RIL: Szybki Start. Najtrudniejszy pierwszy krok Spójrzmy na aplikację okiem przysłowiowego Kowalskiego. Przeciętny użytkownik nie jest świadom tego, jak wiele skomplikowanych działań podejmowanych jest za tzw. frontendem dla niego aplikacja jest tożsama z tym, co może zobaczyć na wyświetlaczu. W tym artykule skupię się jednak na tym, co się dzieje w tle programowanie interfejsu użytkownika pozostawiając innym autorom. Aby jednak nie stawiać Cię przed koniecznością ręcznego edytowania rejestrów (dlaczego właśnie rejestrów, niech pozostanie jeszcze przez chwilę tajemnicą), stworzyłem bardzo prostą aplikację, której ekran można zobaczyć na Rysunku 2 (kod aplikacji znajduje się na płycie DVD). Aplikacja ta daleka jest od doskonałości i przewidziana jest do użytku na platformie WM Professional, wydaje mi się jednak, że stanowić będzie dobry starter do dalszych działań. We wstępie określiliśmy mniej więcej, co będzie robić nasza aplikacja. Pora zastanowić się teraz nad znalezieniem odpowiedzi na pytanie jak? na to pytanie odpowiadać będziemy krok po kroku, w myśl zasady po nitce do kłębka. Rejestry systemowe Rozpocznijmy od znalezienia sposobu na zapisywanie konfiguracji naszej aplikacji. Przez konfigurację będziemy tu rozumieć trzy rodzaje informacji. Po pierwsze czy nasza aplikacja powinna być aktualnie aktywna, czy nie? Po drugie czy powinniśmy odrzu- Rysunek 1. Schemat architektury RIL Rysunek 2. Przykładowy interfejs użytkownika Rejestry Typy wartości REG _ SZ łańcuch tekstowy zakończony znakiem końca łańcucha( /0); REG _ EXPAND _ SZ łańcuch tekstowy zakończony znakiem końca łańcucha, zawierający w sobie zmienne środowiskowe(np. %PATH%); REG _ MULTI _ SZ seria łańcuchów tekstowych oddzielonych znakami końca łańcucha i zawierająca, zakończona podwójnym znakiem końca łańcucha; REG _ DWORD 4-bajtowa wartość binarna; REG _ BINARY dowolna wartość binarna; REG _ DWORD _ BIG _ ENDIAN wartość typu DWORD przechowywana w formacie big endian; REG _ DWORD _ LITTLE _ ENDIAN to samo co REG_DWORD; REG _ LINK łącze symboliczne; REG _ NONE wartość nieokreślona; REG _ RESOURCE _ LIST lista zasobów sterownika. 13
14 Programowanie Windows Mobile Listing 1. RegistryHelper.h #ifndef _REGISTRYHELPER_H_ #define _REGISTRYHELPER_H_ #define MAX_BLOCKED_NUM 40 #define MAX_TEXT_LENGTH 256 #define MESSAGE_BUFFER_SIZE 161 #define SOFTWARE_KEY #define MESSAGE_VALUE #define REJECT_ALL_CALLS_VALUE cać wszystkie przychodzące połączenia? Po trzecie jeśli nie mamy odrzucać wszystkich połączeń, to czy są takie numery, które powinniśmy blokować? W ramach konfiguracji musimy również uwzględnić treść wiadomości SMS, która zostanie przesłana do odrzuconego numeru, jak również liczbę numerów, które będziemy blokować(tak dla ułatwienia sobie życia). Zastanówmy się, w jaki sposób taką konfigurację możemy przechowywać? Pierwsze instynktownie nasuwające się rozwiązanie to zapisywanie jej w pliku. Historia zapisywania konfiguracji w plikach ma długą tradycję. Kiedyś aplikacje z PC-towych wersji Windowsa używały do tego celu plików INI. Osobiście uważam, że jeśli chodzi o konfigurację opartą o pliki doskonale sprawdza się format XML, jednak z powodu braku natywnego wsparcia dla tego formatu, ta droga wydaje się zbyt pracochłonna. Na szczęście system Windows Mobile- (podobnie jak i inne systemy z rodziny Windows) dostarcza bardzo przyzwoity system przechowywania konfiguracji są to rejestry systemowe. Rejestry można traktować jako pewien rodzaj bazy danych, zawierającej zbiór kluczy i wartości, przy czym klucze mogą zawierać w sobie zarówno inne klucze, jak i wartości. W ten sposób tworzy się drzewiasta struktura, która w swoich liściach zawiera konkretne wartości, a klucze stanowią ich gałęzie. Od korzenia tego drzewa odchodzą trzy główne pnie: HKEY_LOCAL_MACHINE, HKEY_ CURRENT_USER, oraz HKEY_CLASSES_ROOT. L"\\Software\\SDJ\\CallRejecter" L"Message" L"RejectAllCalls" #define BLOCKED_LIST_VALUE L"BlockedList" #define ACTIVATE_SERVICE_VALUE typedef struct callrejectersettings_tag DWORD dwactivateservice; DWORD dwblockall; DWORD dwblockedcount; TCHAR tcmessage[message_buffer_size]; L"ActivateService" TCHAR tcblockedlist[max_blocked_num][max_text_length]; CALLREJECTERSETTINGS, *LPCALLREJECTERSETTINGS; VOID ConvertToStringsArray(TCHAR lpszoutput[][max_text_length],lptstr lpszinput,lpdword lpdwcount); VOID ConvertToRegMultiSz(LPTSTR lpszoutput,tchar lpszinput[][max_text_length],dword ncount); DWORD CalculateRegMultiSzSize(TCHAR lpszinput[][max_text_length], DWORD ncount); BOOL SetDwordValue(DWORD dwvalue,lptstr lpszkey, LPTSTR lpszvalueid); BOOL SetSzValue(TCHAR lpszvalue[message_buffer_size],lptstr lpszkey, LPTSTR lpszvalueid); BOOL SetMultiSzValue(TCHAR lpszvalue[][max_text_length],dword ncount,lptstr lpszkey,lptstr lpszvalueid); BOOL GetDwordValue(LPDWORD lpdwvalue,lptstr lpszkey,lptstr lpszvalueid); BOOL GetMultiSzValue(TCHAR lpszvalue[][max_text_length],lpdword lpdwcount,lptstr lpszkey,lptstr lpszvalueid); BOOL GetSzValue(TCHAR lpszvalue[message_buffer_size],lptstr lpszkey,lptstr lpszvalueid); BOOL ReadSettings(LPCALLREJECTERSETTINGS lpcrssettings); BOOL SaveSettings(CALLREJECTERSETTINGS crcsettings); #endif Pierwszy przechowuje konfigurację sprzętową oraz ustawienia aplikacji, drugi jak wskazuje nazwa przechowuje dane specyficzne dla użytkownika, a ostatni informacje na temat skojarzeń plików i obiektów OLE. Ważną zaletą rejestrów jest to, że ich zawartość zostaje zachowana po restarcie urządzenia. Oczywiście nie należy umieszczać wartości gdziekolwiek wprowadziłoby to tylko bałagan i utrudniło ewentualne analizy. Zwyczajowo przyjęło się umieszczać konfigurację aplikacji w następującej ścieżce rejestru: HKEY_LOCAL_MACHINE\ Software\Nazwa firmy\nazwa aplikacji. Tak też uczynimy i my. Jako nazwę firmy przyjmiemy SDJ, a jako nazwę aplikacji CallRejecter. Rejestry mogą przechowywać wartości różnego typu, od wartości liczbowych typu DWORD, przez łańcuchy tekstowe, aż po wartości binarnych(uprasza się jednak, aby nie próbować tam wpychać obrazków czy innych plików binarnych). Lista możliwych typów wartości została przedstawiona w ramce Rejestry typy wartości. Należy w tym miejscu jeszcze wspomnieć o kilku zasadach, którymi powinno się kierować, dodając do rejestru własne klucze i wartości (ma to znaczący wpływ na wydajność dostępu do rejestrów): należy sprawić, by struktura zagnieżdżonych kluczy była tak płytka, jak to tylko możliwe; zamiast zagnieżdżonych kluczy, jeśli to tylko możliwe, należy używać wartości; jedna wartość powinna przechowywać tak wiele informacji, jak to tylko możliwe(np. jeśli będziemy posiadać wartości dotyczące czasu i daty warto rozważyć połączenie ich w jedną wartość. Samo dostarczenie odpowiednio sformatowanej struktury, pozwalającej na grupowanie różnych informacji, na niewiele by się zdało, gdyby nie funkcje pozwalające operować na rejestrach. Do podstawowych operacji wystarczy używać czterech podstawowych funkcji: RegCreateKeyEx, RegQueryValueEx. RegSetValueEx, RegCloseKey. Pierwsza z nich tworzy klucz lub, jeśli ten istnieje otwiera go. Aby używać dwóch kolejnych funkcji (odpowiednio: odczyt i zapis wartości), należy podać uchwyt do klucza zwrócony przez pierwszą funkcję. Po zakończeniu operacji na kluczu należy zamknąć uchwyt do niego przy użyciu ostatniej z funkcji. Oczywiście zbiór funkcji służących operacjom na rejestrach jest obszerniejszy(patrz odnośnik w ramce W Sieci). Tutaj wyjaśniono jedynie te najczęściej stosowane. 14 SDJ Extra 34 Biblia
15 RIL API w sercu telefonu Listing 2. RegistryHelper.cpp (Wycinek) #include "stdafx.h" #include <windows.h> #include "RegistryHelper.h" BOOL ReadSettings(LPCALLREJECTERSETTINGS lpcrssettings) memset(lpcrssettings,0,sizeof(callrejectersettings)); if (!GetDwordValue(&(lpcrsSettings->dwActivateService),SO FTWARE_KEY,ACTIVATE_SERVICE_VALUE)) return FALSE; if (!GetDwordValue(&(lpcrsSettings->dwBlockAll),SOFTWARE_ KEY,REJECT_ALL_CALLS_VALUE)) return FALSE; if (!GetSzValue(lpcrsSettings->tcMessage,SOFTWARE_ KEY,MESSAGE_VALUE)) return FALSE; if (!GetMultiSzValue(lpcrsSettings->tcBlockedList,&(lpcr ssettings->dwblockedcount),software_ KEY,BLOCKED_LIST_VALUE)) return FALSE; return TRUE; BOOL SaveSettings(CALLREJECTERSETTINGS crssettings) if(!setdwordvalue(crssettings.dwblockall,software_ KEY,REJECT_ALL_CALLS_VALUE)) return FALSE; if(!setdwordvalue(crssettings.dwactivateservice,software _KEY,ACTIVATE_SERVICE_VALUE)) return FALSE; if(!setszvalue(crssettings.tcmessage,software_ KEY,MESSAGE_VALUE)) return FALSE; if(!setmultiszvalue(crssettings.tcblockedlist,crssettings.dwblockedcount,software_key,blocked_ LIST_VALUE)) return FALSE; return TRUE; BOOL GetDwordValue(LPDWORD lpdwvalue,lptstr lpszkey,lptstr lpszvalueid) BOOL bresult = FALSE; HKEY hkey; DWORD dwdisposition; DWORD dwtype; DWORD dwsize; DWORD dwrejectallcalls; if(error_success == RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpszkey,0, NULL, 0, 0, NULL, &hkey, &dwdisposition)) dwtype = 0; dwsize = 0; if (ERROR_SUCCESS == RegQueryValueEx(hkey, lpszvalueid, 0, &dwtype, NULL, &dwsize)) if ((REG_DWORD == dwtype)&&(dwsize>0)) dwrejectallcalls=0; if (ERROR_SUCCESS == RegQueryValueEx(hkey, lpszvalueid, 0, &dwtype, reinterpret_cast<lpbyte>(&dwrejectall Calls), &dwsize)) *lpdwvalue=dwrejectallcalls; bresult = TRUE; RegCloseKey(hkey); return bresult; BOOL SetDwordValue(DWORD dwvalue,lptstr lpszkey, LPTSTR lpszvalueid) BOOL bresult = FALSE; HKEY hkey; DWORD dwdisposition; DWORD dwtype; DWORD dwsize; DWORD dwrejectallcalls; if(error_success == RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpszkey, 0, NULL, 0, 0, NULL, &hkey, &dwdisposition)) dwtype = REG_DWORD; dwrejectallcalls=dwvalue; dwsize = sizeof(dword); if (ERROR_SUCCESS == RegSetValueEx(hkey, lpszvalueid, 0, dwtype, reinterpret_cast<lpbyte>(& dwrejectallcalls), dwsize)) bresult=true; RegCloseKey(hkey); return bresult; 15
16 Programowanie Windows Mobile Na Listingach 1 i 2 przedstawiony został fragment kodu wrappera, który posłuży nam do zapisywania/odczytywania ustawień naszej aplikacji. Kod na listingu drugim jest niekompletny, przedstawione zostały jedynie funkcje związane z odczytem/ zapisem wartości typu REG_DWORD(przez analogie łatwo jest dopisać funkcje dla pozostałych typów wartości). Dodatkowo umieszczone na Listingu 2 zostały funkcje czytające/zapisujące całość naszych ustawień do/z struktury typu CALLREJECTERSETTINGS(zdefiniowanej na Listingu 1). Prześledźmy krok po kroku operacje odczytu(funkcja GetDwordValue) i zapisu(funkcja SetDwordValue) umieszczone na Listingu 2. Rozpocznijmy od tej drugiej. W pierwszym kroku staramy się otworzyć interesujący nas klucz: RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpszkey, 0, NULL, 0, 0, NULL, &hkey, &dwdisposition)) Jako pierwszy parametr podajemy wartość klucza głównego, natomiast drugi to wartość podklucza. Gdybyśmy chcieli iterować od korzenia do konkretnej gałęzi drzewa, mysielibyśmy wywoływać tę funkcję tak długo, aż doszlibyśmy do interesującego nas klucza. Istnieje na szczęście prostszy sposób. Wystarczy podać jeden z kluczy głównych, a następnie ścieżkę prowadzącą bezpośrednio do interesującego nas klucza(w naszym przypadku będzie ona miała wartość(\software\sdj\callrejecter). Rysunek 3. Przykładowy wpis do rejestrów dotyczący usługi LgeCCoreDrv Wartości argumentów ustawionych na zero lub NULL, oraz ostatniego argumentu są mało istotne. Pod wartość hkey podstawiony zostanie uchwyt do klucza, o który wnioskowaliśmy (w naszym przypadku to będzie klucz CallRejecter). Następnie musimy zainicjalizować parametry, które przekażemy do funkcji: RegSetValueEx(hkey, lpszvalueid, 0, dwtype, reinterpret_cast<lpbyte>(&dwre jectallcalls), dwsize)). Funkcja ta przyjmuje wartość uchwytu do klucza, który pobraliśmy w poprzednim kroku, a następnie łańcuch określający nazwę wartości, którą chcemy ustawić. Kolejny argument jest zarezerwowany i musi być ustawiony na zero, następnie musimy podać typ wartości(dla tej konkretnej sytuacji będzie to REG_DWORD), a na końcu bufor, który zawiera wartość do zapisu. W ostatnim parametrze przekazujemy rozmiar bufora. Finalnym krokiem jest zwolnienie uchwytu do wcześniej pobranego klucza (RegCloseKey(hkey)). Jeśli teraz przyjrzysz się funkcjom odczytującym, zauważysz zapewne, że w zasadzie nie różnią się one znacząco. Jedyną różnicą (oprócz użycia funkcji RegQueryValueEx w miejsce funkcji RegSetValueEx) jest to, iż tym razem nie musimy inicjalizować konkretnymi wartościami zmiennych odpowiedzialnych za typ oraz rozmiar na konkretne wartości. O ile w przypadku wartości typu REG_DWORD rozmiar bufora będzie miał zawsze tę samą wartość (sizeof(dword), o tyle już w przypadku wartości typu REG_SZ lub REG_MUL- TI_SZ musimy wcześniej zaalokować odpowiednią ilość pamięci. W tym celu przy pierwszym użyciu dodajemy operację odczytu, w której zamiast wskaźnika na bufor, przekazujemy wartość NULL. W ten sposób dokonamy jedynie odczytu rozmiaru danej wartości (w bajtach) oraz jej typu. Serwisy systemowe Mając ustalony sposób, w jaki będziemy przechowywać ustawienia dla naszej aplikacji, wypadałoby zastanowić się, co będzie stanowiło jej szkielet. Jak już wspomniałem, chcielibyśmy, aby nasza aplikacja działała w trybie 24/7, czyli zawsze, kiedy uruchomione jest urządzenie. Możemy to zrobić na dwa sposoby. Pierwszym jest standardowa aplikacja, która po uruchomieniu będzie ustawiać się w tryb oczekiwania na nadejście odpowiednich komunikatów, a następnie umieścić ją w sekcji autostart urządzenia. Rozwiązanie to jest jednak mało eleganckie - nie powinno się tworzyć w ten sposób programów, które nie komunikują się bezpośrednio z użytkownikiem. Inżynierowie projektujący system Windows Mobile w celu realizacji zadań uruchamianych w tle dostarczyli programistom mechanizm w postaci tzw. serwisów systemowych, czyli aplikacji, które z założenia nie będą wchodzić w bezpośrednią interakcję z użytkownikiem na poziomie graficznym. Zadaniem serwisów jest monitorowanie stanu systemu i reagowanie na zmiany w nim zachodzące. W ten właśnie sposób zaprogramujemy postawione sobie zadanie. Serwisy (zwane też usługami) są realizowane w postaci dynamicznie łączonych bibliotek DLL ( jeśli nie wiesz jeszcze, w jaki sposób takie biblioteki tworzyć, spójrz proszę do ramki W sieci, jeden z linków prowadzi do artykułu na ten temat) ładowanych przez jeden z ważniejszych procesów systemowych Services.exe. Aż do wersji Windows CE 4.2.NET programiści w ce- Serwisy Rejestry Poniżej zamieszczony został zbiór możliwych wartości związanych z inicjalizacją serwisu przez proces Services.exe. W nawiasach podano typ danej wartości. Context (REG _ DWORD) wartość inicjalizująca przekazywana do procedury inicjalizacyjnej; Description (REG _ SZ) opis serwisu; DisplayName (REG _ SZ) nazwa serwisu; Dll (REG _ SZ) dynamicznie łączona biblioteka (DLL) zawierająca serwis; Flags (REG _ DWORD) określa zbiór flag używanych do modyfikacji zachowania funkcji ActivateServices. Oto poprawne wartości flag: DEVFLAGS _ NONE (0x ): brak określonych flag; DEVLFAGS _ UNLOAD (0x ): wyładuj serwis po powrocie z funkcji xxx _ Init; DEVFLAGS _ LOADLIBRARY (0x ): skorzystaj z funkcji LoadLibrary do załadowania pliku DLL usługi; DEVFLAGS _ NOLOAD (0x ): nie ładuj serwisu; DEVFLAGS _ TRUSTEDCALLERONLY (0x ) : serwis może być wywołany tylko przez zaufane procesy; Index (REG _ SZ) indeks (instancji serwisu); Keep (REG _ DWORD) jeśli ustawiony na 0, serwis zostanie wyładowany natychmiast po inicjalizacji; Order (REG _ DWORD) kolejność, w jakiej ładowane są serwisy, serwis o najniższej wartości ładowany jest w pierwszej kolejności; Prefix (REG _ SZ) trzyliterowy prefiks definiujący usługę wraz z wartością indeksu pozwala na odwołanie się do konkretnej instancji serwisu. 16 SDJ Extra 34 Biblia
17 RIL API w sercu telefonu lu realizacji zadań serwisów zmuszeni byli używać systemu sterowników dopiero w tej wersji pojęcie to zostało wprowadzone do rodziny CE. W związku z tymi zaszłościami historycznymi usługi odziedziczyły po sterownikach pewne cechy, jak np. punkty wejścia, lub również trzyliterowy prefiks, który wraz z numerem instancji serwisu służy do pobrania uchwytu. Skąd jednak zarządca serwisów systemowych wie, że dany serwis ma zostać załadowany? I czy samo załadowanie serwisu do pamięci oznacza, że będzie on działał? Odpowiem w pierwszej kolejności na pytanie drugie: nie, sama obecność usługi w pamięci nie oznacza jej działania (oczywiście w sensie spełniania funkcji, dla której serwis został stworzony, w dalszym ciągu serwis jest gotowy do odbierania komunikatów od procesu Services.exe). Dlaczego? Otóż dlatego, że serwis może znajdować się w kilku stanach: może być uruchomiony lub też wstrzymany, dochodzi do tego jeszcze kilka mniej istotnych stanów. Wróćmy więc do pierwszego pytania. Spójrz proszę na Rysunek 3. Przedstawiony tam został wycinek systemowych rejestrów zawierający wpisy dla usługi LgeCCoreDrv. Znajdują się tam informacje na temat wszystkich ważnych właściwości związanych z inicjalizacją serwisu (spójrz na ramkę Serwisy rejestry). Jeśli podobny wpis dodasz do rejestru dla swojego serwisu (w ścieżce HKEY_LOCAL_MACHINE\Services\ Nazwa serwisu), wówczas zostanie on załadowany wraz ze startem systemu (pamiętaj jednak, że załadowany to nie to samo, co uruchomiony). Innym sposobem na załadowanie serwisu bez konieczności tworzenia wpisu w rejestrze jest użycie funkcji RegisterService (jest ona zdefiniowana w pliku nagłówkowym Services.h). Jest jeszcze trzecia droga łącząca zalety obydwu rozwiązań. Jest nią funkcja ActivateService. W zaprojektowanym przeze mnie GUI pozwoliłem sobie na użycie właśnie tego ostatniego podejścia. Funkcja ActivateService przyjmuje dwa argumenty: pierwszy określający nazwę klucza rejestrów zawierającego informację o usłudze, drugi jest natomiast zarezerwowany i powinien zostać ustawiony na zero. Wspomniałem wcześniej o punktach wejścia do serwisu. Są to funkcje o z góry zdefiniowanych nazwach, które pozwalają procesowi Services.exe na komunikację z załadowaną biblioteką DLL. Istnieje dziesięć standardowych punktów wejścia: xxx_init, xxx_deinit, xxx_open, Listing 3. CallRejecterService.cpp #include "stdafx.h" #include <windows.h> xxx_close, xxx_read, xxx_write, xxx_ Seek, xxx_iocontrol, xxx_powerdown oraz xxx_powerup. Jak już wspomniałem, jest to spadek z czasów, gdy jako dostawców usług używano sterowników. W procesie implementacji xxx w nazwach funkcji zamieniamy oczywiście na trzyliterowy prefiks, pod jakim serwis funkcjonuje w systemie. Na szczęście nie musimy implementować wszystkich funkcji. Pominiemy funkcje wynikające z podejścia do serwisu jako pliku (Open, Close, Read, Write, Seek). Na Listingu 3 został przedstawiony szkielet naszego serwisu. Zauważmy, że w miejsce xxx wstawiliśmy trzyliterowy prefiks CRS (dla ciekawskich wymyśliłem go jako akronim od Call Rejecter Service). Musimy jeszcze sprawić, aby nasze funkcje były widoczne na zewnątrz pliku DLL. Możemy to zrobić dwojako, po pierwsze możemy do tego użyć dyrektywy declspec(dllexport) przy definicji funkcje; drugim sposobem jest dołączenie do projektu pliku DEF. Taki przykładowy plik definicji został przedstawiony na Listingu 4. Czas wyjaśnić znaczenie poszczególnych funkcji, zanim przejdziemy do ich implementacji. CRS_Init jak nietrudno się domyślić, ta funkcja jest wywoływana podczas inicjowania serwisu, co może nastąpić w dwóch sytuacjach: w wyniku wywołania funkcji RegisterService lub w momencie, w którym następuje inicjalizacja procesu Services.exe. W tym drugim przypadku jako argument do funkcji przekazana zostanie umieszczona w rejestrach wartość Context. W przypadku powodzenia, powinna zostać zwrócona wartość niezerowa, w przeciwnej sytuacji usługa zostanie wyładowana. Nie trzeba być orłem, aby odgadnąć przeznaczenie funkcji CRS_Deinit. Jako jedyny argument przyjmuje ona wartość zwróconą przez poprzednią funkcję. Pamiętajmy, że skoro funkcja CRS_Init zwraca wartość typu BOOL APIENTRY DllMain( HANDLE hmodule, DWORD ul_reason_for_call, return TRUE; DWORD CRS_Init(DWORD dwdata) DWORD dwcontext = 1; return dwcontext; LPVOID lpreserved ) DWORD CRS_Deinit(DWORD dwcontext) return TRUE; DWORD CRS_IOControl(DWORD dwdata, DWORD dwcode, PBYTE pbufin, DWORD dwlenin, PBYTE return TRUE; void CRS_PowerDown(DWORD dwcontext) return; void CRS_PowerUp(DWORD dwcontext) return; Listing 4. CallRejecterService.def LIBRARY EXPORTS CRS_Init CRS_Deinit CRS_IOControl CRS_PowerDown CRS_PowerUp "CallRejecterService" pbufout, DWORD dwlenout, PDWORD pdwactualout) 17
18 Programowanie Windows Mobile Listing 5. Funkcja CRS_IOControl DWORD CRS_IOControl(DWORD dwdata, DWORD dwcode, PBYTE pbufin, DWORD dwlenin, PBYTE pbufout, DWORD dwlenout, PDWORD pdwactualout) switch(dwcode) case IOCTL_SERVICE_QUERY_CAN_DEINIT: if ((pbufout) && (dwlenout >= sizeof (BYTE))) *pbufout = 1; if (pdwactualout) *pdwactualout = sizeof(byte); case IOCTL_SERVICE_REFRESH: UpdateConfiguration(); break; return TRUE; Listing 6. Brakująca zawartość pliku CallRejecterService.cpp #include <Service.h> #include "RilHelper.h" BOOL APIENTRY DllMain( HANDLE hmodule, DWORD ul_reason_for_call, LPVOID lpreserved ) return TRUE; DWORD CRS_Init(DWORD dwdata) DWORD dwcontext = 0; if (UpdateConfiguration()) if SUCCEEDED(InitializeCallRejecter()) dwcontext = 1; return dwcontext; DWORD CRS_Deinit(DWORD dwcontext) DeinitializeCallRejecter(); return TRUE; void CRS_PowerDown(DWORD dwcontext) DeinitializeCallRejecter(); return; void CRS_PowerUp(DWORD dwcontext) InitializeCallRejecter(); return; DWORD, to w łatwy w sposób można na nią rzutować wskaźnik na dowolną strukturę czy typ. Dzięki takiemu rozwiązaniu możemy uniknąć stosowania zmiennych globalnych. Para funkcji CRS_PowerUp i CRS_PowerDown służy do przygotowania serwisu na przejście urządzenia w stan niskiego poboru energii, a potem na przywrócenie odpowiedniego stanu po powrocie do normalnego stanu zasilania. Funkcje te przyjmują jako argument wartość zwróconą przez CRS_Init (vide unikanie zmiennych globalnych). Powinieneś zawsze obsłużyć w swoim serwisie te dwie funkcje, tak aby możliwe było przed przejściem w stan obniżonego zużycia energii zwolnienie jak największej liczby zasobów przywłaszczonych przez usługę. Ostatnia funkcja (CRS_IOControl) odpowiada za komunikację aplikacji zewnętrznych z usługą. To właśnie tu trafiają komunikaty wysłane chociażby przy użyciu funkcji ServiceIOControl. Na Listingu 5 została umieszczona wypełniona funkcja CRS_IOControl naszego serwisu. W naszym prostym serwisie obsłużymy jedynie dwa komunikaty, zachęcam jednak do eksperymentów z innymi, jak również do definiowania swoich. Pierwszym z obsłużonych komunikatów jest IOCTL_SERVICE_QU- ERY_CAN_DEINIT. Może być on np. następstwem wywołania funkcji DeregisterService (której zadaniem jest wyładowanie serwisu). Jeżeli usługa z jakiegoś powodu nie może być wyładowana, wówczas w buforze wyjściowym powinna ustawić zero, jeżeli wartość w buforze będzie niezerowa, oznacza to, że będzie mogła zostać wywołana funkcja CRS_Deinit. Drugim komunikatem obsłużonym w naszym serwisie jest IOCTL_SERVICE_RE- FRESH, którym subtelnie sugerujemy serwisowi, że powinien ponownie wczytać swoją konfigurację, ponieważ uległa ona zmianie. Co prawda nie zdefiniowaliśmy jeszcze funkcji UpdateConfiguration, ale zapewniam Cię, że gdybyś zdefiniował chociażby puste ciało tej funkcji, dokonał odpowiednich wpisów w rejestrach i wrzucił skompilowaną bibliotekę na urządzenie, byłbyś w stanie uruchomić naszą usługę (a nawet udałoby Ci się ją zatrzymać) Nuda, nic się nie dzieje... Gdybyśmy poprosili inżyniera Mamonia o komentarz na temat naszego oprogramowania, tak pewnie by je właśnie podsumował i nie ma w tym nic dziwnego, zważywszy na fakt, iż w tej chwili nasza usługa nie robi właściwie nic (a już zdecydowanie nie to, do czego ją przewidzieliśmy). Pora więc nieco ożywić akcję i wprowadzić wreszcie na scenę głównego bohatera tego artykułu. Najpierw jednak spójrzmy na Listing 6 umieściłem na nim wypełnione ciała pozostałych funkcji, nie przejmujemy się przy tym faktem, że wprowadzone zostały ko- 18 SDJ Extra 34 Biblia
19 RIL API w sercu telefonu lejne funkcje, o których implementacji nic nie wiemy. Za chwilę wszystko stanie się jasne (o ile już nie jest). Na Listingach 7 i 8 została przedstawiona pozostała część naszego serwisu (ta, która wreszcie coś robi). Jak wspomniałem we wstępie, RIL API ma wśród wielu programistów opinię, nazwijmy to delikatnie, niezbyt przyjemnego dzieje się tak prawdopodobnie dlatego, że z jednej strony większa część funkcji wchodzących w jego skład ma charakter asynchroniczny, z drugiej zaś sama architektura jest typowym przykładem event-driven programming. Chcąc skorzystać z dobrodziejstw dostarczanych przez Radio Interface Layer, musisz w pierwszej kolejności zarejestrować połączenie z RIL Proxy. Robi się to przy użyciu funkcji RIL_ Initialize. Funkcja ta przyjmuje jako pierwszy argument numer Proxy, do którego chcemy się podłączyć (nie wiem, jaka jest prawidłowość, ale w tym miejscu działa przeważnie tylko wartość 1). Kolejne dwa parametry to wskaźniki na funkcje, za pomocą których RIL Proxy będzie się komunikowało z naszą aplikacją, następnie musimy podać klasę notyfikacji, które chcielibyśmy otrzymywać. Następny parametr typu DWORD to wartość, którą będziemy przekazywać do dwóch wspomnianych wcześniej funkcji pamiętaj, że podobnie jak w przypadku Listing 7. RilHelper.h #ifndef _RILHELPER_H_ #define _RILHELPER_H_ #include "ril.h" #define RIL_TIMEOUT 3000 #define HANGUP_SUCCESS L"HangUpSuccess" #define HANGUP_FAIL L"HangUpFail" #define GETMSGCONFIG_SUCCESS L"GetMsgConfigSuccess" #define GETMSGCONFIG_FAIL L"GetMsgConfigFail" #define SENDMSG_SUCCES L"SendMsgSuccess" #define SENDMSG_FAIL L"SendMsgFail" enum RilFunctions HANGUP,GETMSGCONFIG,SENDMESSAGE; HRESULT InitializeCallRejecter(); HRESULT DeinitializeCallRejecter(); BOOL IsOnBlockedList(LPTSTR lpsznumber); BOOL UpdateConfiguration(); VOID RilNotifyCallback(DWORD dwcode, const void* lpdata, DWORD cbdata, DWORD dwparam ); VOID RilResultCallback(DWORD dwcode, HRESULT hrcmdid, const void* lpdata, DWORD cbdata, DWORD dwparam); HRESULT GetMsgConfig(); HRESULT SendSMS(RILADDRESS radest); #endif R E K L A M A 19
20 Programowanie Windows Mobile Listing 8. RilHelper.cpp #include "stdafx.h" #include "RilHelper.h" #include "RegistryHelper.h" HRESULT hrresults[3]=e_fail,e_fail,e_fail; HANDLE hevents[6]=null,null,null,null,null; HRIL hril=null; LPRILMSGCONFIG g_lprmcmsgconfig = NULL; CALLREJECTERSETTINGS g_crssettings=; HRESULT GetMsgConfig() HRESULT hr = E_FAIL; DWORD dwevent=0; if (hril) hr = RIL_GetMsgConfig(hRil); hrresults[getmsgconfig] = hr; if(succeeded(hr)) dwevent = WaitForMultipleObjects(2,&hEvents[2*GETMS GCONFIG],FALSE,100*RIL_TIMEOUT); switch(dwevent) case WAIT_OBJECT_0: hr = S_OK; break; default: hr = E_FAIL; return hr; HRESULT SendSMS(RILADDRESS radest) RILMESSAGE rm=; HRESULT hr = E_FAIL; DWORD dwevent = 0; if (hril) rm.cbsize = sizeof(rilmessage); rm.dwparams = RIL_PARAM_M_SVCCTRADDRESS RIL_PARAM_ M_TYPE RIL_PARAM_M_DESTADDRESS RIL_PARAM_M_PROTOCOLID RIL_PARAM_ M_MSGLENGTH RIL_PARAM_M_FLAGS RIL_PARAM_M_VPFORMAT RIL_PARAM_ M_DATACODING RIL_PARAM_M_VP RIL_PARAM_M_MSG; rm.rasvcctraddress.cbsize = g_lprmcmsgconfig- >rasvcctraddress.cbsize; rm.rasvcctraddress.dwnumplan = g_lprmcmsgconfig->rasvc CtrAddress.dwNumPlan; rm.rasvcctraddress.dwparams = g_lprmcmsgconfig->rasvcc traddress.dwparams; rm.rasvcctraddress.dwtype = rm.rasvcctraddress.dwtype; _tcscpy_s(rm.rasvcctraddress.wszaddress,256,g_ lprmcmsgconfig->rasvcctraddress.wszad dress); rm.dwtype = RIL_MSGTYPE_OUT_SUBMIT; rm.dwflags = RIL_MSGFLAG_NONE; rm.msgoutsubmit.dwprotocolid = RIL_MSGPROTOCOL_SMETOSME; rm.msgoutsubmit.radestaddress.cbsize = radest.cbsize; rm.msgoutsubmit.radestaddress.dwnumplan = radest.dwnumplan; rm.msgoutsubmit.radestaddress.dwparams = radest.dwparams; rm.msgoutsubmit.radestaddress.dwtype = radest.dwtype; _tcscpy_s(rm.msgoutsubmit.radestaddress.wszaddress,256,radest.wszaddress); rm.msgoutsubmit.rmddatacoding.cbsize = sizeof(rilmsgdcs); rm.msgoutsubmit.rmddatacoding.dwparams = RIL_PARAM_ MDCS_TYPE RIL_PARAM_MDCS_ALPHABET; rm.msgoutsubmit.rmddatacoding.dwtype = RIL_DCSTYPE_ GENERAL; rm.msgoutsubmit.rmddatacoding.dwalphabet = RIL_ DCSALPHABET_DEFAULT; rm.msgoutsubmit.rmddatacoding.dwmsgclass = RIL_ DCSMSGCLASS_0; rm.msgoutsubmit.rmddatacoding.dwflags = RIL_DCSFLAG_NONE; SYSTEMTIME curtime; GetLocalTime(&curTime); rm.msgoutsubmit.stvp.wyear = curtime.wyear; rm.msgoutsubmit.stvp.wmonth = curtime.wmonth; rm.msgoutsubmit.stvp.wdayofweek = curtime.wdayofweek; rm.msgoutsubmit.stvp.wday = curtime.wday; rm.msgoutsubmit.stvp.whour = curtime.whour; rm.msgoutsubmit.stvp.wminute = curtime.wminute; rm.msgoutsubmit.stvp.wsecond = curtime.wsecond; rm.msgoutsubmit.stvp.wmilliseconds = curtime.wmilliseconds; rm.msgoutsubmit.cchmsglength = wcstombs(reinterpret_ cast<char *>(rm.msgoutsubmit.rgbmsg),g _crssettings.tcmessage,256); hr = RIL_SendMsg(hRil,&rm,RIL_SENDOPT_NONE); hrresults[sendmessage] = hr; if(succeeded(hr)) dwevent = WaitForMultipleObjects(2,&hEvents[2*SENDM ESSAGE],FALSE,RIL_TIMEOUT); switch(dwevent) case WAIT_OBJECT_0: hr = S_OK; break; default: hr = E_FAIL; return hr; VOID RilResultCallback(DWORD dwcode, HRESULT hrcmdid, const void* lpdata, DWORD cbdata, DWORD dwparam) if (dwcode = RIL_RESULT_OK) if (hrcmdid==hrresults[hangup]) SetEvent(hEvents[2*HANGUP]); 20 SDJ Extra 34 Biblia
ActiveXperts SMS Messaging Server
ActiveXperts SMS Messaging Server ActiveXperts SMS Messaging Server to oprogramowanie typu framework dedykowane wysyłaniu, odbieraniu oraz przetwarzaniu wiadomości SMS i e-mail, a także tworzeniu własnych
Bardziej szczegółowoPolitechnika Poznańska, Instytut Informatyki, TWO/GE. Programowanie dla ios
Politechnika Poznańska, Instytut Informatyki, TWO/GE Programowanie dla ios 13 stycznia 2012 Urządzenia ios Urządzenie Data prezentacji iphone 9.01.2007/06.2007 ipod touch 5.09.2007 iphone 3G 9.06.2008
Bardziej szczegółowoSystem zarządzający grami programistycznymi Meridius
System zarządzający grami programistycznymi Meridius Instytut Informatyki, Uniwersytet Wrocławski 20 września 2011 Promotor: prof. Krzysztof Loryś Gry komputerowe a programistyczne Gry komputerowe Z punktu
Bardziej szczegółowoTemat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie z Seminarium Dyplomowego Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
Bardziej szczegółowoMonoGame. Wieloplatformowe gry w C# Mateusz Cicheński
MonoGame Wieloplatformowe gry w C# Mateusz Cicheński Plan prezentacji Założenia Alternatywy Narzędzia Różnice między WP8, ios, Android DEMO Podsumowanie Założenia CEL: Stworzenie wieloplatformowej gry
Bardziej szczegółowoZasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Bardziej szczegółowoWprowadzenie do projektu QualitySpy
Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować
Bardziej szczegółowoMETODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Bardziej szczegółowoAndroid - wprowadzenie. Łukasz Przywarty 171018
Android - wprowadzenie Łukasz Przywarty 171018 Ramowy plan prezentacji Czym jest Android: definicja, krótka historia. Architektura systemu. Architektura aplikacji. Właściwości systemu. Środowisko deweloperskie.
Bardziej szczegółowoLaboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą
Bardziej szczegółowoProjektowanie, tworzenie aplikacji mobilnych na platformie Android
Program szkolenia: Projektowanie, tworzenie aplikacji mobilnych na platformie Android Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Projektowanie, tworzenie aplikacji mobilnych
Bardziej szczegółowoTechnologia Flash cieszy się coraz większą popularnością. Liczba dostępnych
Flash i PHP 01 Technologia Flash cieszy się coraz większą popularnością. Liczba dostępnych narzędzi do tworzenia prostych oraz złożonych interaktywnych animacji wzrasta z dnia na dzień. Trzeba przyznać,
Bardziej szczegółowoWorld Wide Web? rkijanka
World Wide Web? rkijanka World Wide Web? globalny, interaktywny, dynamiczny, wieloplatformowy, rozproszony, graficzny, hipertekstowy - system informacyjny, działający na bazie Internetu. 1.Sieć WWW jest
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoSystemy mobilne. Laboratorium. Dostęp do danych GPS w Windows Phone 7
Systemy mobilne Laboratorium Dostęp do danych GPS w Windows Phone 7 1. Wprowadzenie Laboratorium ma na celu zapoznanie się z narzędziami dostępu do danych dotyczących lokalizacji w urządzeniach mobilnych
Bardziej szczegółowoCzym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
Bardziej szczegółowoMiędzyplatformowy interfejs systemu FOLANessus wykonany przy użyciu biblioteki Qt4
Uniwersytet Mikołaja Kopernika w Toruniu Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej Agnieszka Holka Nr albumu: 187396 Praca magisterska na kierunku Informatyka
Bardziej szczegółowoREFERAT PRACY DYPLOMOWEJ
REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i implementacja środowiska do automatyzacji przeprowadzania testów aplikacji internetowych w oparciu o metodykę Behavior Driven Development. Autor: Stepowany
Bardziej szczegółowoInformacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Bardziej szczegółowoJava pierwszy program w Eclipse «Grzegorz Góralski strona własna
Strona 1 z 9 «Przykładowe zadania do cz. III ćwiczeń z genetyki Java pierwsze kroki w programowaniu (01)» Kategoria: java, Tagi: eclipse - java - programowanie. Autor: Grzegorz, napisał dnia: February
Bardziej szczegółowoWindows 10 - Jak uruchomić system w trybie
1 (Pobrane z slow7.pl) Windows 10 - Jak uruchomić system w trybie awaryjnym? Najprostszym ze sposobów wymuszenia na systemie przejścia do trybu awaryjnego jest wybranie Start a następnie Zasilanie i z
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoStawiamy pierwsze kroki
Stawiamy pierwsze kroki 3.1. Stawiamy pierwsze kroki Edytory tekstu to najbardziej popularna odmiana programów służących do wprowadzania i zmieniania (czyli edytowania) tekstów. Zalicza się je do programów
Bardziej szczegółowouczyć się bez zagłębiania się w formalnym otoczeniu,
CZĘŚĆ 3 - INTERNET 3.1 WSTĘP Internet jest globalnym zbiorem połączonych ze sobą komputerów, które przesyłają informacje między sobą za pośrednictwem szybkich połączeń sieciowych oraz linii telefonicznych.
Bardziej szczegółowoWykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Bardziej szczegółowoProgramowanie Urządzeń Mobilnych. Laboratorium nr 7, 8
Programowanie Urządzeń Mobilnych Laboratorium nr 7, 8 Android Temat 1 tworzenie i uruchamianie aplikacji z użyciem Android SDK Krzysztof Bruniecki 1 Wstęp Platforma Android jest opartym na Linuxie systemem
Bardziej szczegółowoTworzenie oprogramowania
Tworzenie oprogramowania dr inż. Krzysztof Konopko e-mail: k.konopko@pb.edu.pl 1 Tworzenie oprogramowania dla systemów wbudowanych Program wykładu: Tworzenie aplikacji na systemie wbudowanym. Konfiguracja
Bardziej szczegółowoPo zakończeniu rozważań na temat World Wide Web, poznaniu zasad organizacji witryn WWW, przeczytaniu kilkudziesięciu stron i poznaniu wielu nowych
rk Po zakończeniu rozważań na temat World Wide Web, poznaniu zasad organizacji witryn WWW, przeczytaniu kilkudziesięciu stron i poznaniu wielu nowych pojęć, prawdopodobnie zastanawiasz się, kiedy zaczniesz
Bardziej szczegółowoTworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski
Tworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski Agenda Dlaczego PhoneGap i co to jest? Możliwości PhoneGap Jak pisać aplikacje z PhoneGap? Konfiguracja i przykład aplikacji
Bardziej szczegółowoRejestr HKEY_LOCAL_MACHINE
Rejestr HKEY_LOCAL_MACHINE Poddrzewo HKEY_LOCAL_MACHINE zawiera dane konfiguracyjne lokalnego systemu. Informacje tutaj przechowywane są wykorzystywane przez aplikacje i sterowniki urządzeń, a także przez
Bardziej szczegółowowww.gim4.slupsk.pl/przedmioty
Lekcja 4. Program komputerowy - instalacja i uruchomienie 1. Rodzaje programów komputerowych 2. Systemy operacyjne 3. Instalowanie programu 4. Uruchamianie programu 5. Kilka zasad pracy z programem komputerowym
Bardziej szczegółowoBiorąc udział w projekcie, możesz wybrać jedną z 8 bezpłatnych ścieżek egzaminacyjnych:
Egzaminy na plus Stres na minus! Zdawaj bezpłatne egzaminy Microsoft, Linux, C++ z nami i zadbaj o swoją karierę. Oferujemy Ci pierwsze certyfikaty zawodowe w Twojej przyszłej karierze, które idealnie
Bardziej szczegółowo1.Wstęp. 2.Generowanie systemu w EDK
1.Wstęp Celem niniejszego ćwiczenia jest zapoznanie z możliwościami debuggowania kodu na platformie MicroBlaze oraz zapoznanie ze środowiskiem wspomagającym prace programisty Xilinx Platform SDK (Eclipse).
Bardziej szczegółowo2.5 Dzielenie się wiedzą
2.5 Dzielenie się wiedzą 2.5.1 Baza wiedzy zespołu Tworzenie bazy wiedzy w OneNote, zapoznanie się z przykładowymi bazami wiedzy, stworzenie struktury bazy wiedzy, zdefiniowanie własnych tagów, stworzenie
Bardziej szczegółowoProgramowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści
Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop. 2017 Spis treści O autorach 11 Podziękowania 12 Wprowadzenie 13 CZĘŚĆ I ZACZNIJ PROGRAMOWAĆ JUŻ DZIŚ Godzina 1. Praktyczne
Bardziej szczegółowoPodczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Bardziej szczegółowoPlatformy programistyczne:.net i Java L ABORATORIUM 7,8: HACKATHON - JTTT
Platformy programistyczne:.net i Java L ABORATORIUM 7,8: HACKATHON - JTTT O co chodzi? - Przypomnienie Hackathon - http://en.wikipedia.org/wiki/hackathon A hackathon is an event in which computer programmers
Bardziej szczegółowoDiagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.
Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze
Bardziej szczegółowoBudowa aplikacji ASP.NET z wykorzystaniem wzorca MVC
Akademia MetaPack Uniwersytet Zielonogórski Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC Krzysztof Blacha Microsoft Certified Professional Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC Agenda:
Bardziej szczegółowoDokumentacja projektu QUAIKE Architektura oprogramowania
Licencjacka Pracownia Oprogramowania Instytut Informatyki Uniwersytetu Wrocławskiego Jakub Kowalski, Andrzej Pilarczyk, Marek Kembrowski, Bartłomiej Gałkowski Dokumentacja projektu QUAIKE Architektura
Bardziej szczegółowoPodstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch
INFORMATOR TECHNICZNY WONDERWARE Informator Techniczny nr 60 04-12-2002 Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch Wstęp PoniŜsza dokumentacja oparta na przykładach stworzonych
Bardziej szczegółowoREFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania
REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania Autor: Anna Nowak Promotor: dr inż. Jan Kowalski Kategorie: gra logiczna Słowa kluczowe: Sudoku, generowanie plansz, algorytmy,
Bardziej szczegółowoMAMP: Można to pobrać i zainstalować z XAMPP: Można go pobrać i zainstalować z
WordPress : Omówienie I Instalacja Na początek, dlaczego byłbyś zainteresowany wykorzystaniem WordPressa razem z PhoneGap? Zapytałbym: "Dlaczego byś nie?" Moim zdaniem WordPress jest jednym z najłatwiejszych
Bardziej szczegółowoWykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Bardziej szczegółowoPliki zorganizowano w strukturze drzewiastej odzwierciedlając strukturę logiczną aplikacji:
Technologia wykonania projektu: HTML5 Javascript: o jquery (1.9.1), o CreateJS (0.6.1): EaselJS, TweenJS, PreloadJS. Części funkcjonalne projektu: Strona internetowa pliki strony internetowej zlokalizowane
Bardziej szczegółowoCiekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:
1. Listener dla przycisku. Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod: W linii 24 tworzymy globalną metodę mglobal_onclicklistener,
Bardziej szczegółowoPrzewodnik instalacji i rozpoczynania pracy. Dla DataPage+ 2013
Przewodnik instalacji i rozpoczynania pracy Dla DataPage+ 2013 Ostatnia aktualizacja: 25 lipca 2013 Spis treści Instalowanie wymaganych wstępnie komponentów... 1 Przegląd... 1 Krok 1: Uruchamianie Setup.exe
Bardziej szczegółowoUruchamianie bazy PostgreSQL
Uruchamianie bazy PostgreSQL PostgreSQL i PostGIS Ten przewodnik może zostać pobrany jako PostgreSQL_pl.odt lub PostgreSQL_pl.pdf Przejrzano 10.09.2016 W tym rozdziale zobaczymy, jak uruchomić PostgreSQL
Bardziej szczegółowoWebowy generator wykresów wykorzystujący program gnuplot
Uniwersytet Mikołaja Kopernika Wydział Fizyki, Astronomii i Informatyki Stosowanej Marcin Nowak nr albumu: 254118 Praca inżynierska na kierunku informatyka stosowana Webowy generator wykresów wykorzystujący
Bardziej szczegółowo[Junior Developer - pierwsza praca jako programista - JavaDevMatt] 1. Sponsorzy Partnerzy projektu O czym i dla kogo jest ta książka?
Spis treści 1. Sponsorzy 11 2. Partnerzy projektu 13 3. O czym i dla kogo jest ta książka? 15 4. Skąd pomysł na napisanie książki? 18 4.1. Co nowego w tym wydaniu? 20 5. Z jakich powodów nie warto zostać
Bardziej szczegółowoJęzyk JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 1, część 2 1 Język JAVA podstawy Plan wykładu: 1. Krótka historia Javy 2. Jak przygotować sobie środowisko programistyczne 3. Opis środowiska JDK 4. Tworzenie programu krok po
Bardziej szczegółowoSOA Web Services in Java
Wydział Informatyki i Zarządzania Wrocław,16 marca 2009 Plan prezentacji SOA 1 SOA 2 Usługi Przykłady Jak zacząć SOA Wycinek rzeczywistości Problemy zintegrowanych serwisów : Wycinek Rzeczywistości Zacznijmy
Bardziej szczegółowoKrótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.
GRZEGORZ FURDYNA Krótka Historia Co to jest NetBeans? Historia Wersje NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły NetBeans Profiler Narzędzie do projektowania GUI Edytor NetBeans
Bardziej szczegółowoParagon Boot Media Builder
PARAGON Software GmbH ul. Śląska 22/21 42 217 Częstochowa, Polska Tel. +48 (34) 343 81 81 Internet: www.paragon software.pl E mail kontakt@paragon software.pl Paragon Boot Media Builder Podręcznik użytkownika
Bardziej szczegółowoTo sposób w jaki użytkownik wchodzi w interakcje z systemem. Środowisko graficzne używa kombinacji graficznych elementów(przyciski, okna, menu) i
Aleksandra Dębiecka To sposób w jaki użytkownik wchodzi w interakcje z systemem. To sposób w jaki użytkownik wchodzi w interakcje z systemem. Środowisko graficzne używa kombinacji graficznych elementów(przyciski,
Bardziej szczegółowoProjekt Hurtownia, realizacja rejestracji dostaw produktów
Projekt Hurtownia, realizacja rejestracji dostaw produktów Ćwiczenie to będzie poświęcone zaprojektowaniu formularza pozwalającego na rejestrację dostaw produktów dla naszej hurtowni. Dane identyfikujące
Bardziej szczegółowoPodręcznik użytkownika platformy szkoleniowej Audatex. wersja 1.2
Podręcznik użytkownika platformy szkoleniowej Audatex wersja 1.2 Warszawa 2015 Spis treści 1. Zakup kursu... 3 2. Logowanie do systemu... 3 2.1. Jak zalogować się do systemu?... 3 2.2. Co zrobić kiedy
Bardziej szczegółowoObiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Bardziej szczegółowoSZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski -
S t r o n a 2 SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski - Copyright by Artur Niewiarowski 2013 ISBN: 978-83-937802-0-4 - Artur Niewiarowski Self-Publishing - All rights reserved. Wszelkie prawa
Bardziej szczegółowoAplikacja Sieciowa wątki po stronie klienta
Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się
Bardziej szczegółowoPrzewodnik Szybki start
Przewodnik Szybki start Program Microsoft Access 2013 wygląda inaczej niż wcześniejsze wersje, dlatego przygotowaliśmy ten przewodnik, aby skrócić czas nauki jego obsługi. Zmienianie rozmiaru ekranu lub
Bardziej szczegółowoJęzyk C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop
Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop. 2016 Spis treści Wprowadzenie 11 Adresaci książki 12 Co wyróżnia tę książkę na
Bardziej szczegółowoProgramowanie aplikacji na urządzenia mobilne
Informatyka I Programowanie aplikacji na urządzenia mobilne dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 JME - Java Platform Micro Edition JME platforma Java przeznaczona
Bardziej szczegółowoWskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Bardziej szczegółowoEW1051 Czytnik kart inteligentnych ID USB 2.0
EW1051 Czytnik kart inteligentnych ID USB 2.0 2 POLSKI EW1051 Czytnik kart inteligentnych ID USB 2.0 Spis treści 1.0 Wprowadzenie... 2 1.1 Funkcje i właściwości... 2 1.2 Zawartość opakowania... 2 2.0 Instalacja
Bardziej szczegółowoUlotka skrócona Moduł Analizy BI. Wersja: 2013.0.1
Ulotka skrócona Moduł Analizy BI Wersja: 2013.0.1 Spis treści 1. Reinstalacja z poprzedniej wersji... 3 2. Raporty Wzorcowe... 5 2.1 Nowości... 5 2.2 Zmiany... 6 3. Ogólne... 6 3.1 Nowości... 6 3.2 Zmiany...
Bardziej szczegółowoProjekt Hurtownia, realizacja rejestracji dostaw produktów
Projekt Hurtownia, realizacja rejestracji dostaw produktów Ćwiczenie to będzie poświęcone zaprojektowaniu formularza pozwalającego na rejestrację dostaw produktów dla naszej hurtowni. Dane identyfikujące
Bardziej szczegółowoPROJEKT WSPÓŁFINANSOWANY ZE ŚRODKÓW UNII EUROPEJSKIEJ W RAMACH EUROPEJSKIEGO FUNDUSZU SPOŁECZNEGO OPIS PRZEDMIOTU. studia pierwszego stopnia
OPIS PRZEDMIOTU Nazwa przedmiotu Programowanie i obsługa systemów mobilnych Kod przedmiotu Wydział Instytut/Katedra Kierunek Specjalizacja/specjalność Wydział Matematyki, Fizyki i Techniki Instytut Mechaniki
Bardziej szczegółowoCechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;
14.3. Podstawy obsługi X Window 14.3. Podstawy obsługi X Window W przeciwieństwie do systemów Windows system Linux nie jest systemem graficznym. W systemach Windows z rodziny NT powłokę systemową stanowi
Bardziej szczegółowoPoradnik opracowany przez Julitę Dąbrowską.
Poradnik opracowany przez Julitę Dąbrowską. Pobrany ze strony www.kalitero.pl. Masz pytania skontaktuj się ze mną. Dokument stanowi dzieło w rozumieniu polskich i przepisów prawa. u Zastanawiasz się JAK
Bardziej szczegółowoWindows Mobile. Andy Wigley, Daniel Moth, Peter Foot, Microsoft Mobile Development Handbook, Microsoft Press 2007
Windows Mobile Andy Wigley, Daniel Moth, Peter Foot, Microsoft Mobile Development Handbook, Microsoft Press 2007 Wykład 14-2 Windows CE Modułowy system operacyjny Platform Builder pozwala na wybranie tych
Bardziej szczegółowoRe_Forms 21 Często zadawane pytania (FAQ)
Re_Forms 21 Często zadawane pytania (FAQ) 1 Level Dlaczego trzeba konwertować Oracle Forms? Nie trzeba, ale można. Konwersja jest interesującą ekonomicznie alternatywą dla przepisywania krytycznych systemów
Bardziej szczegółowotimetrack Przewodnik Użytkownika timetrack Najważniejsze Funkcje
timetrack Przewodnik Użytkownika timetrack jest łatwą w obsłudze aplikacją, stworzoną do rejestracji czasu. Pozwala ona na zapisywanie czasu spędzonego z klientami oraz podczas pracy nad projektami i zadaniami
Bardziej szczegółowoA Zasady współpracy. Ocena rozwiązań punktów punktów punktów punktów punktów
A Zasady współpracy Ocena rozwiązań 3.0 25 40 punktów 3.5 41 65 punktów 4.0 66 80 punktów 4.5 81 100 punktów 5.0 101 130 punktów Warunki zaliczenia przedmiotu Student uzyska ocenę zaliczającą (3.0) o ile
Bardziej szczegółowoXQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Bardziej szczegółowoSwing Application Framework czyli tam i z powrotem. Copyright Piotr Kochański & Erudis, www.erudis.pl
Swing Application Framework czyli tam i z powrotem Informacje o mnie Imię: Piotr Nazwisko: Kochański Praca: programista Java, PHP + kilka egzotycznych wynalazków Miejsce pracy: firma Erudis (prawdopodobnie
Bardziej szczegółowoTak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS www.informatyka.edu.pl
To jeden z ostatnich odcinków naszego kursu. Mam nadzieję, że pisanie własnego programu było ciekawym doświadczeniem. Zaproponowana w tym odcinku funkcja uatrakcyjni twój program. Stworzymy tak zwane okno
Bardziej szczegółowotel. (+48 81) 538 47 21/22 fax (+48 81) 538 45 80 Cel przedmiotu
0-68 Lublin tel. (+48 8) 538 47 / fax (+48 8) 538 45 80 Przedmiot: Programowanie aplikacji Rok: 4 Semestr: 7 Rodzaj zajęć i liczba godzin: Studia stacjonarne Studia niestacjonarne Wykład 30 4 Ćwiczenia
Bardziej szczegółowoInstrukcja instalacji serwera bazy danych Microsoft SQL Server Express 2014
Instrukcja instalacji serwera bazy danych Microsoft SQL Server Express 2014 Instrukcja jest przeznaczona dla użytkowników systemu Bibliotekarz.NET Web Platform. Instrukcja została przygotowana 26.07.2016.
Bardziej szczegółowoKonspekt pracy inżynierskiej
Konspekt pracy inżynierskiej Wydział Elektryczny Informatyka, Semestr VI Promotor: dr inż. Tomasz Bilski 1. Proponowany tytuł pracy inżynierskiej: Komunikator Gandu na platformę mobilną Android. 2. Cel
Bardziej szczegółowoOpis zmian funkcjonalności platformy E-GIODO wprowadzających możliwość podpisania wniosku bezpośrednio w oknie przeglądarki.
Opis zmian funkcjonalności platformy E-GIODO wprowadzających możliwość podpisania wniosku bezpośrednio w oknie przeglądarki. Wstęp. Opisane poniżej zmiany wprowadzają modyfikacje platformy e-giodo w zakresie
Bardziej szczegółowoMVVM Light Toolkit. Julita Borkowska
MVVM Light Toolkit Julita Borkowska Czym jest MVVM Light Toolkit? MVVM Light Toolkit został stworzony w 2009 roku przez Laurenta Bugnion. Jest to biblioteka dostarczająca zestaw komponentów pomocnych podczas
Bardziej szczegółowoedycja 1 opracowany zgodnie z Zarządzeniami Wewnętrznymi PWr. nr 14/2012 i 15/2012 i 34/2012
Wrocław, 18.05.2015 Program kształcenia i plan studiów podyplomowych: Android i ios nowoczesne aplikacje mobilne edycja 1 opracowany zgodnie z Zarządzeniami Wewnętrznymi PWr. nr 14/2012 i 15/2012 i 34/2012
Bardziej szczegółowoPodstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Bardziej szczegółowoPracownia internetowa w szkole ZASTOSOWANIA
NR ART/SBS/07/01 Pracownia internetowa w szkole ZASTOSOWANIA Artykuły - serwery SBS i ich wykorzystanie Instalacja i Konfiguracja oprogramowania MOL Optiva na szkolnym serwerze (SBS2000) Artykuł opisuje
Bardziej szczegółowoInstrukcja instalacji Mobile Marketing Pro
Instrukcja instalacji Mobile Marketing Pro Przed rozpoczęciem instalacji MMPro należy pobrać i zainstalować dwa wymagane darmowe komponenty niezbędne do prawidłowego działania programu. Net Framework 2.0
Bardziej szczegółowoSYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE WINDOWS 1 SO i SK/WIN 006 Wydajność systemu 2 SO i SK/WIN Najprostszym sposobem na poprawienie wydajności systemu, jeżeli dysponujemy zbyt małą ilością pamięci RAM
Bardziej szczegółowoForex PitCalculator INSTRUKCJA UŻYTKOWNIKA
Forex PitCalculator Forex PitCalculator jest aplikacją służącą do obliczania podatku należnego z tytułu osiągniętych na rynku walutowym zysków. Jest to pierwsze tego typu oprogramowanie na polskim rynku.
Bardziej szczegółowoWskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
Bardziej szczegółowoUsługi analityczne budowa kostki analitycznej Część pierwsza.
Usługi analityczne budowa kostki analitycznej Część pierwsza. Wprowadzenie W wielu dziedzinach działalności człowieka analiza zebranych danych jest jednym z najważniejszych mechanizmów podejmowania decyzji.
Bardziej szczegółowoStrona tytułowa, zgodnie z wymaganiami zamieszczonymi na stronie www uczelni. Wzór strony dostępny jest w dzienniku wirtualnym - 1 -
Strona tytułowa, zgodnie z wymaganiami zamieszczonymi na stronie www uczelni. Wzór strony dostępny jest w dzienniku wirtualnym - 1 - Spis treści 1 Wstęp... 3 1.1 Cel pracy... 3 1.2 Układ pracy... 4 2 Podstawy
Bardziej szczegółowoTWORZENIE PREZENTACJI MS POWERPOINT
TWORZENIE PREZENTACJI MS POWERPOINT Wstęp TWORZENIE PREZENTACJI MS POWERPOINT Czasami zdarza się, że zostajemy poproszeni o poprowadzenia spotkania czy szkolenia w firmie, w której pracujemy lub po prostu
Bardziej szczegółowoPLAN REALIZACJI MATERIAŁU NAUCZANIA Z INFORMATYKI II. Uczeń umie: Świadomie stosować się do zasad regulaminów (P).
PLAN REALIZACJI MATERIAŁU NAUCZANIA Z INFORMATYKI II DZIAŁ I: KOMPUTER W ŻYCIU CZŁOWIEKA. 1. Lekcja organizacyjna. Zapoznanie uczniów z wymaganiami edukacyjnymi i PSP. 2. Przykłady zastosowań komputerów
Bardziej szczegółowoInstrukcja instalowania aplikacji TNS mobistat. Smartfon Android. Help Desk helpdesk@mobistat.pl +48 504 129 635
Instrukcja instalowania aplikacji TNS mobistat Smartfon Android Help Desk helpdesk@mobistat.pl +48 504 129 635 Kilka uwag ogólnych W razie gdy mamy wątpliwości czy któryś z elementów ścieżki badania działa
Bardziej szczegółowoUniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki. Paweł Parys. Nr albumu: 209216. Aukcjomat
Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki Paweł Parys Nr albumu: 209216 Aukcjomat Praca licencjacka na kierunku INFORMATYKA w zakresie INFORMATYKA Praca wykonana pod kierunkiem
Bardziej szczegółowoDysk 20GB przestrzeni Ajax Ajax 1.0 Baza danych MS SQL 2005 lub 2008 Express Java Java 6 run time Microsoft Silverlight 3.
Systemy do kompleksowej administracji środowiskiem IT : Symantec Management Platform Solutions - rozwiązanie ułatwiające zarządzanie zasobami informatycznym Głównym zadaniem podlegającym kompetencji działu
Bardziej szczegółowoJak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
Bardziej szczegółowoProduktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i
Program szkolenia: Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Produktywne tworzenie aplikacji webowych z
Bardziej szczegółowo1. Opis aplikacji. 2. Przeprowadzanie pomiarów. 3. Tworzenie sprawozdania
1. Opis aplikacji Interfejs programu podzielony jest na dwie zakładki. Wszystkie ustawienia znajdują się w drugiej zakładce, są przygotowane do ćwiczenia i nie można ich zmieniac bez pozwolenia prowadzącego
Bardziej szczegółowoSymulator tabletu z systemem Windows 8.
Symulator tabletu z systemem Windows 8. Witam w mojej kolejnej publikacji, tym razem dowiesz się: - Jak uruchomić symulator tabletu z w pełni funkcjonalnym systemem operacyjnym Windows 8; - Jak wykorzystać
Bardziej szczegółowo