Nov 3 2009

Hello world na Androida

Zajmiemy sie dzisiaj tworzeniem prostej aplikacji na platforme Android i uruchomimy ja na naszym Era G1. Jezeli nie masz jeszcze skonfigurowanego srodowiska, to pora poczytac, jak skonfigurowac Android SDK na systemie Ubuntu.

Tworzymy aplikacje HelloWorld

1. Podlaczamy Era G1 do komputera za pomoca kabla USB

2. Wlaczamy debugowanie przez USB w naszym Androidzie
Wybieramy Menu->Ustawienia->Aplikacje->Programowanie a nastepnie zaznaczamy opcje Debugowanie USB

android-debug

3. Uruchamiamy Eclipse i przechodzimy do widoku Java

4. Tworzymy nowa aplikacje
Wybieramy File->New->Project…, rozwijamy galaz Android, zaznaczamy Android Project i naciskamy Next

android-new-app

5. Wypelniamy formularz New Android Project
Wpisujemy nazwe projektu HelloWorld, nastepnie w grupie Build Target wybieramy Android 1.5 SDK. Teraz uzupelniamy wlasciwosci,
w polu Application name wpisujemy HelloWorld,
w polu Package name wpisujemy rewers naszej domeny, np. org.losoft.android,
w polu Create Activity wpisujemy wyswietlana nazwe skrotu do aplikacji.
Na koniec klikamy Finish.

android-new-app-dialog

6. Kompilujemy aplikacje
Wybieramy Project->Clean…

7. Uruchamiamy HelloWorld na Era G1
Jezeli telefon jest poprawnie podlaczony do komputera, to jest rowniez widoczny w DDMS.
Aby uruchomic aplikacje klikamy przycisk Run->Run, w wyswietlonym dialogu

android-new-app-runas

zaznaczamy Android Application i klikamy OK, po chwili w naszym telefonie powinien wyswietlic sie czarny ekran aplikacji z napisem Hello World, HelloWorld!.

android-helloworld

That’s it. W menu pojawi sie nowa aplikacja,

android-menu

ktora usuwamy z telefonu za pomoca standardowego narzedzia Zarzadzaj aplikacjami

android-apps


Nov 3 2009

Android SDK na Ubuntu

Poprzedni post prawil o screenshotach z Androida, wiec jako, ze jestem w temacie, wroce dzisiaj do SDK i przedstawie jak zainstalowac i skonfigurowac srodowisko Eclipse/DDMS, aby utworzyc prosta aplikacje na Androida.

Na poczatek …

1. Pobieramy Eclipse

2. Pobieramy Android SDK

3. Instalujemy Sun Java JDK

czlowiek@maszyna:~$ sudo apt-get install sun-java6-jdk

4. Wypakowujemy paczke z Android SDK do katalogu /home/czlowiek/Programy/sdk/android

5. Wypakowujemy Eclipse do katalogu /home/czlowiek/Programy/eclipse

6. Uruchamiamy Zacmienie

czlowiek@maszyna:~$ ~/Programy/eclipse/eclipse

eclipse-splash

7. Instalujemy ADT Plugin (tutaj wersja aktualizowana)
Otwieramy Help->Software Updates…, wybieramy zakladke Available Software, naciskamy przycisk Add Site… i w polu Location wprowadzamy nastepujacy adres url


http://dl-ssl.google.com/android/eclipse/

Po OK’u zaznaczamy nowo dodany element i naciskamy Install…

eclipse-install-adt

Gdy wszystko zostanie zainstalowane uruchamiamy ponownie Eclipsa i …

8. Konfigurujemy DDMS’a
Wybieramy Window->Open Perspective->Other…,
open-perspective

zaznaczamy DDMS i klikamy OK. Powinnismy miec podobny widok

eclipse-ddms-view

9. Podlaczamy Android SDK
Klikamy Window->Preferences, wybieramy zakladke Android i ustalamy sciezke do uprzednio rozpakowanego SDK /home/czlowiek/Programy/sdk/android

select-sdk

To juz koniec, srodowisko jest juz /kompletne/ i /skonfigurowane/. Teraz mozemy przystapic do napisania naszej pierwszej aplikacji.


Oct 15 2009

Watki w C

Po tym jak napisalismy i uruchomilismy nasz programik helloworld, mozemy teraz przejsc do bardziej ciekawych rzeczy. Na rozgrzewke proponuje pare watkow. Naszymi bohaterami beda, zbieracze zbierajacy ziarno z pola i znoszacy je do spichlerza.

Czym jest watek? Nie wiem jak w innych systemach, ale w unixach jest to proces, wykonywany w watku glownym, ktory jest procesem ;) . Dobrze, jak juz wiemy co to jest watek to przejdziemy dalej.

Tworzymy plik programu

czlowiek@maszyna:~$ nano seeds.c

Dolaczamy pliki naglowkowe

#include <stdio.h>
#include <string.h>
#include <pthread.h>

Tworzymy globalne przechowywacze oraz strukture wlasciwosci zbieracza

int grain; // ziarno na polu
int granary; // ziarno w spichlerzu
 
// struktura wlasciwosci zbieracza
struct collector
{
	char name[32]; // nazwa zbieracza
	int seeds; // ilosc zebranych ziaren
	int performance; // wydajnosc
};

I funkcje watku zbieracza – bedzie wywolywana podczas kazdego utworzenia

void* collect_seeds (void* collector_data)
{
	// pobranie danych zbieracza
	struct collector *data;
	data = (struct collector *) collector_data;
 
	// zebranie ziarna
	int collected;
	collected = data->performance;
	if (collected <= grain) {
		grain = grain - collected;
	} else {
		collected = grain;
		grain = 0;
	}
 
	// aktualizacja danych zbieracza
	data->seeds = data->seeds + collected;
	printf ("%s zebral %i\n", data->name, collected);
 
	// zwrocenie ilosci zebranych ziaren
	return (void*) collected;
}

A teraz watek glowny

int main (int argc, char *argv[])
{
	// ustalenie ilosci ziarna
	if (argc == 2 && atoi(argv[1]) > 0) {
		grain = atoi(argv[1]);
	}
	if (grain == 0)
		grain = 1000;
	granary = 1; // nie wymietli wszystkiego ; )
 
	// mieszadlo liczb losowych
	srand (time (0));
 
	// ustalanie danych zbieraczy
	struct collector collector1;
	strncpy (collector1.name, "Dziwigor", sizeof (collector1.name) - 1);
	collector1.seeds = 0;
	collector1.performance = rand() % 10 + 1; // losowanie wydajnosci
 
	struct collector collector2;
	strncpy (collector2.name, "Niesiebud", sizeof (collector2.name) - 1);
	collector2.seeds = 0;
	collector2.performance = rand() % 10 + 1;
 
	printf ("Ziarno na polu: %i ziaren\n", grain);
	printf ("Ziarno w spichlerzu: %i ziaren\n", granary);
	printf ("Zaczely sie zniwa\n\n");
 
	int collected_seeds;
 
	// wskazniki do watkow zbieraczy
	pthread_t thread1;
	pthread_t thread2;
 
	// petelka dopoki nie zostanie zebrane cale ziarno
	while (grain > 0) {

Do tej pory luzik wszystko wiadomo, tworzenie i ustalanie wartosci zmiennych, no i teraz dochodzimy do najwazniejszego elementu programiku – wyzwalanie watkow

Utworzenie watku

		// utworzenie watku Dziwigora
		pthread_create (&thread1, NULL, collect_seeds, (void*)&collector1);

Pobranie danych z watku

		// pobranie zebranych ziaren
		pthread_join (thread1, (void*) &collected_seeds);

“Przesypanie” ziarna do spichlerza, i tak w kolko, dopoki ludki nie zbiora wszystkiego

		// aktualizacja spichlerza
		granary = granary + collected_seeds;
 
		pthread_create (&thread2, NULL, (void*) collect_seeds, (void*)&collector2);
		pthread_join (thread1, (void*) &collected_seeds);
		granary = granary + collected_seeds;
 
		printf ("Pozostalo: %i ziaren\n", grain);
	}
 
	printf ("\nZniwa zakonczone\n");
	printf ("%s zebral %i\n", collector1.name, collector1.seeds);
	printf ("%s zebral %i\n", collector2.name, collector2.seeds);
 
	printf ("Ziarno na polu: %i ziaren\n", grain);
	printf ("Ziarno w spichlerzu: %i ziaren\n", granary);
}

Jezeli skonczylismy pisac kod, to kompilujemy programik

czlowiek@maszyna:~$ gcc -o seeds seeds.c -pthread

za pomoca parametru -pthread informujemy kompilator aby dolaczyl obpowiednie biblioteki, jak tego nie zrobimy to sofcik oczywiscie nie skompiluje sie.

Uruchamiamy programik

czlowiek@maszyna:~$ ./seeds 100
Ziarno na polu: 100 ziaren
Ziarno w spichlerzu: 1 ziaren
Zaczely sie zniwa

Dziwigor zebral 5
Niesiebud zebral 6
Pozostalo: 89 ziaren
Dziwigor zebral 5
Niesiebud zebral 6
Pozostalo: 78 ziaren
...
Dziwigor zebral 5
Niesiebud zebral 6
Pozostalo: 1 ziaren
Dziwigor zebral 1
Niesiebud zebral 0
Pozostalo: 0 ziaren

Zniwa zakonczone
Dziwigor zebral 46
Niesiebud zebral 54
Ziarno na polu: 0 ziaren
Ziarno w spichlerzu: 101 ziaren

Gdy widzimy cos podobnego to odnieslismy kolejny sukces ;) .

Tutaj wersja dla niecierpliwych:
Pobierz zrodlo i/lub binarke


Oct 13 2009

Hello world w C/C++

Wstep do programowania C/C++ w Linuxie zaczniemy standardowo od programiku helloworld.

Przygotowujemy srodowisko

czlowiek@maszyna:~$ sudo apt-get install build-essential

i to juz wystarczy aby napisac prosty programik w C.

Generujemy kod programiku

czlowiek@maszyna:~$ nano helloworld.c
#include <stdio.h>
 
int main (int argc, char *argv[])
{
	printf ("Hello World!\n");
	return 0;
}

Kompilujemy programik korzystajac ze standardowego gcc (gcc [opcje] plik)

czlowiek@maszyna:~$ gcc -o helloworld helloworld.c

Uruchamiamy programik

czlowiek@maszyna:~$ ./helloworld
Hello World!

Niama. To teraz C++

Generujemy kodzik

czlowiek@maszyna:~$ nano helloworld.cpp
#include <iostream>
 
int main (int argc, char *argv[])
{
	std::cout << "Hello World!" << std::endl;
	return 0;
}

Kompilujemy korzystajac tym razem z g++ (g++ [opcje] plik)

czlowiek@maszyna:~$ g++ -o helloworld_c++ helloworld.cpp

Uruchamiamy programik

czlowiek@maszyna:~$ ./helloworld_c++
Hello World!

cool. To pobawmy sie.

Tworzymy plik viewparams.c

czlowiek@maszyna:~$ nano viewparams.c

i wstawiamy to

#include <stdio.h>
 
int main (int argc, char *argv[])
{
	printf ("argc = %d\n", argc);
	int i;
	for (i = 0; argv[i]; i++) {
		printf("argv[%d]", i);
		printf(" = %s\n", argv[i]);
	}
	return 0;
}

Kompilujemy i uruchamiamy programik z parametrami

czlowiek@maszyna:~$ gcc -o viewparams viewparams.c
czlowiek@maszyna:~$ ./viewparams parametr1 parametr2 parametr3
argc = 4
argv[0] = ./viewparams
argv[1] = parametr1
argv[2] = parametr2
argv[3] = parametr3

Teraz programik plus

czlowiek@maszyna:~$ nano plus.c
#include <stdio.h>
 
int main (int argc, char *argv[])
{
	if (argc < 3) {
		printf ("Niepoprawna liczba argumentow :/\n");
		printf ("Przyklad uzycia: plus 50 25\n");
		return 1;
	}
	int sum, i;
	sum = 0;
	for (i = 0; argv[i]; i++) {
		sum += atoi(argv[i]);
	}
	printf ("%d\n", sum);
	return 0;
}

Kompilujemy i uruchamiamy

czlowiek@maszyna:~$ gcc -o plus plus.c
czlowiek@maszyna:~$ ./plus 50 25
75
czlowiek@maszyna:~$ ./plus 1 2 3 4 5 6 7 8 9 0
45

plus-minus? ;)


Oct 5 2009

Flex Builder 3 debugowanie pod Ubuntu

Nawiazujac do poprzedniego wpisu o instalacji Flex Builder 3, pragne dodac krotki opis konfiguracji tego srodowiska w taki sposob aby mozliwe bylo debugowanie kodu w czasie rzeczywistym. Sam mialem z tym problem, wiec moze komus sie przyda.

1. Na poczatek potrzebujemy zmodyfikowanej wersji Flash Playera

czlowiek@maszyna:~$ wget http://download.macromedia.com/pub/flashplayer/updaters/10/flash_player_10_linux_dev.tar.gz -O /tmp/flash_player_10_linux_dev.tar.gz

2. Nastepnie ekstraktujemy do katalogu tymczasowego

czlowiek@maszyna:~$ tar xzvf /tmp/flash_player_10_linux_dev.tar.gz -C /tmp
czlowiek@maszyna:~$ tar xzvf /tmp/flash_player_10_linux_dev/plugin/debugger/install_flash_player_10_linux.tar.gz -C /tmp

3. Instalujemy Flash Player

czlowiek@maszyna:~$ /tmp/install_flash_player_10_linux/flashplayer-installer

czytamy instrukcje i odpowiadamy na pytania, sciaga: y, n ;) .

Restartujemy Firefox’a i na upartego powinno wszystko dzialac. Ja osobiscie mam wieczny problem z kompatybilnoscia FF i FP. Firefox potrafi sypnac sie z byle powodu (sa rozne, tylko jemu znane) lub Flash Player nie odpowiada na zapytanie debuggera. Po wielu doswiadczeniach i zmarnowanych godzinach na analizie problemu doszedlem do wniosku, ze FF nie jest jedyna przegladarka i ze w tej kwestii Epiphany Web Browser sprawdza sie znakomicie.

4. Instalujemy Epiphany Web Browser

czlowiek@maszyna:~$ sudo apt-get install epiphany-browser

5. Konfigurujemy Eclipse-Flex do wspolpracy z nowa przegladarka
Window->Preferences, nastepnie zakladka General->Web Browser teraz klikamy New i wypelniamy formularz zgodnie z zalaczonym PrtScrn’em
Flex changing the web browser
sciaga:

Epiphany Web Browser
/usr/bin/epiphany-browser

Jako, ze Epiphany nie chwyta FF’owego plugina, musimy nadpisac glowny plik playera.

6. Nadpisujemy liba

czlowiek@maszyna:~$ sudo cp /tmp/install_flash_player_10_linux/libflashplayer.so /usr/lib/adobe-flashplugin/libflashplayer.so

Tak oto po paru zabiegach mozemy cieszyc sie “stabilnym” srodowiskiem Flex Builder 3 pod Ubuntu :)
Flex Epiphany debugging

Kodzik

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	creationComplete="init()">
	<mx:HBox horizontalAlign="center" verticalAlign="middle" width="100%" height="100%">
		<mx:VBox>
			<mx:Label id="lb_helloWorld" text="Hello world" fontSize="36" />
			<mx:HBox horizontalAlign="center" verticalAlign="middle" width="100%" height="100%">		
				<mx:Button id="btn_increase" label="+" />
				<mx:Button id="btn_decrease" label="-" />
			</mx:HBox>
		</mx:VBox>
	</mx:HBox>
 
	<mx:Script>
	<![CDATA[
		private var _fontSize: int = 36;
 
		public function init():void
		{
			this.btn_increase.addEventListener(MouseEvent.CLICK, this.increaseFontSize);
			this.btn_decrease.addEventListener(MouseEvent.CLICK, this.decreaseFontSize);
		}
 
		public function increaseFontSize(event: MouseEvent): void
		{
			this._fontSize++;
			this.lb_helloWorld.setStyle("fontSize", this._fontSize);
		}
 
		public function decreaseFontSize(event: MouseEvent): void
		{
			this._fontSize--;
			this.lb_helloWorld.setStyle("fontSize", this._fontSize);
		}
	]]>
	</mx:Script>
</mx:Application>

Zobacz takze:
- Instalacja Flex Builder 3 na Ubuntu