1 września

No w zasdzie 2 września dziś, no ale co zrobić ;) Wpis ten to takie podsumowanie wakacji, choć dla mnie się one jeszcze nie kończą, wszak student dopiero 1 października startuje :D

Dobra a teraz do konkretów, wakacje miały upłynąć pod znakiem (a raczej literką) D. Język D był jednym z przedmiotów, które musiałem zaliczyć na studiach aby ukończyć 3 rok i móc podejść do egzaminu licencjackiego. Przedmiot ukończyć udało się pozytywnie bez większych problemów, jednak język sam w sobie mnie nie urzekł, co można zobaczyć po dość małej ilości wpisów na jego temat. Problemy były prawie od samego początku, brak dobrego IDE (żadne nie miało przyzwoitego uzupełniania składni), ostatecznie wybrałem Entice’a, znajomy korzystał z wtyczki do eclipse – Descent, ale też szału nie ma. Napisanie prostego „Hello World” większych problemów nie sprawia, jednak po pewnym czasie okaże się, że Phobos to nienajlepsza biblioteka i zechcemy korzystać z Tango, niby wszystko ok, jednak nie da się połączyć pisania programu w tych 2 bibliotekach (no przynajmniej mnie się to nie udało), a do tego musiałem posiadać, albo 2 wersje kompilatorów jedna z bibliotekom standardową, druga z Tango i używać tej, która skompiluje mi dany projekt albo jakoś się nakombinować, czego z racji mojego lenistwa nie robiłem. Kolejny program do napisania i kolejny problem, program miał posiadać GUI, wybrałem DWT, pisanie z użyciem tej biblioteki nie było najtrudniejsze, mnogość tutoriali (również tych do SWT, bo pisze się niemal tak samo) na pewno na duży plus, jednak aby skompilować te „wypociny” ponownie trzeba było się namęczyć i korzystać z niejakiego dsss (opis instalacji DWT tutaj). O 3d w D już pisałem wcześniej, więc rozpisywać się na ten temat nie będą, w każdym bądź razie też trochę czasu nad konfiguracją trzeba było spędzić, aby skompilować program. Później miałem jeszcze ambicje popisać jakieś programy wielowątkowe i sieciowe, jednak po około 3 godzinach spędzonych nad wątkami, gdzie przepisałem przykłady z tutoriali i żaden nie działał (używałem Tango), poprostu odechciało mnie się tego języka na dobre i zaprzestałem jakiejkolwiek współpracy z nim, gdyby jednak ktoś miał więcej samozaparcia do tego języka i chciał pisać aplikacje wielowątkowe to być może uda mu się to z Tango, gdyby jednak nie, to znalazłem taki opis przy pomocy biblioteki standardowej – Język D: Wielowątkowość. Po tych wszystkich przeżyciach niestety, ale jeżeli będę musiał coś napisać i nie uda się to w Javie, to skorzystam z C++, a nie D, jednak na pewno nie mogę powiedzieć, że już nigdy nie skorzystam z tego języka.

Co do innych osiągnięć wakacyjnych to standardowo po wielkich planach, efekt nimal niewidoczny. Trochę poczytałem o JUnit i Springu, ale na dobrą sprawę nic nie pisałem z użyciem tego. Jednak mam nadzieję, że po 10 września (egzamin licencjacki) ulegnie to zminie i zaczne na poważnie ukierunkowywać się w pewną strone, a że jakiś czas temu wybór padł na Jave, a główni J2EE i rzeczy z tym związane, to gdy tylko wezmę się do roboty efekty będzie można zobaczyć na blogu w postaci wpisów, tak więc do zobaczenia(?) ;)

3d w D

Po dłuższej przerwie postanowiłem coś znowu „spłodzić”, tym razem będzie trochę o tym jak tworzyć grafikę 3d za pomocą języka D. Nie będzie to na pewno kurs tworzenia grafiki 3d bo sporo tego w sieci, powiem tylko jak skonfigurować wszystko aby kompilować programy oraz podam kilka przydatnych linków ;).

Po pierwsze musimy posiadać kompilator dmd z biblioteką standardową (z Tango nie działało mi). Do kompilacji używać będziemy też build’a (po ściągnięciu zmieniamy nazwę na build i umieszczamy w katalogu bin kompilatora dmd, zatroszczyć się również musimy, aby ścieżka do folderu bin znajdowała się w zmiennej środowiskowej PATH). Korzystać będziemy z biblioteki derelict, najnowszą wersję możemy pobrać stąd. Po rozpakowaniu zobaczymy sporą ilość folderów np. DerelictGL, a w nim folder derelict i tak będzie w kilku przypadkach, a nam dla łatwiejszej kompilacji potrzebne będą tylko foldery derelict ze swoimi zawartościami. Aby tego dokonać (wersja dla Windowsa:)) będąc w folderze trunk klikamy na F3 i wyszukujemy foldery z frazą derelict, kopiujemy je (tylko te o nazwie derelict!) do np. folderu sciezka\do\twojego\dmd\src\ext\. No i to by było na tyle jeżeli chodzi o konfigurację, czy działa możemy sprawdzić próbując skompilować następujący kod:

import derelict.opengl.gl;
import std.stdio;

void main()
{
    try {
        DerelictGL.load();
        writefln("Successfully loaded the OpenGL shared library.");
    } catch (Exception e) {
        writefln("Could not load the OpenGL shared library.");
    }
}

Kompilujemy program używając polecenia:

build nazwa_pliku.d -Isciezka\do\twojego\dmd\src\ext gdi32.lib -exec

Możemy również skopiować cały katalog derelict do katalogu w którym znajduje się nasz plik z kodem i kompilować program w następujący sposób:

build nazwa_pliku.d gdi32.lib -exec

gdi32.lib w podanym przykładzie nie jest niezbędny, jednak czasem biblioteka ta jest potrzebna do skompilowania niektórych aplikacji.

Na koniec jak obiecałem parę linków jeszcze ;)
tu jest ciekawy szablon dla aplikacji pisanych z wykorzystaniem OpenGL (ostatni kod)
a tu kurs OpenGL za pomocą którego można nauczyć się tworzyć figury, bryły, obracać nimi, używać światła, tekstur itp., a nabytą wiedzę wykorzystujemy w szablonie i cieszymy się umiejętności pisania programów z użyciem grafiki 3d ;)

Kontenery w języku D

Ostatnio pisząc jakiś programik w D poczułem potrzebę użycia listy, chwilę pomyślałem no i doszedłem do wniosku, że takie coś musi być w bibliotece, przecież nie będę tego pisał sam, jak to miało miejsce w c ;). Przeszukuję tego Phobosa i niestety na nic nie natrafiłem (nie wykluczam, że nie istnieje), tak więc pozostaje użycie czegoś takiego:

Typ tab[];
Typ a = new Typ();
tab ~= a;

Owszem jest to ciekawy krok w przód w porównaniu do c, ładnie tablica sama zwiększa rozmiar, ale to nie to czego szukałem. Jako osoba ostatnimi czasy pisząca w Javie miałem „potrzebę” używania wspaniałych ArrayList i HashMap, dalsze poszukiwania doprowadziły mnie do Tango i takiego odkrycia:

import tango.io.Stdout;
import tango.util.container.LinkedList;
import tango.util.container.HashMap;

void main() {
	LinkedList!(int) q = new LinkedList!(int);
	q.append(2); q.prepend(1); q.append(3);
	foreach(i; q) {
		Stdout(i).newline();
	}
	q.add(4);
	Stdout(q.get(0)).newline();
	q.size(); //ilosc elementow w liscie
	q.head(); //zwraca pierwszy element listy, nie usuwa go
	q.removeHead(); //zwraca pierwszy element listy i usuwa go
	q.tail(); //ostatni element listy
	q.removeTail();
	q.remove(1); //usuwa z listy element o podanej wartosci
	q.removeAt(0); //usuwa z listy element z danej pozycji
	q.clear(); //usuwa wszystkie elementy z listy
	
	HashMap!(int, int) m = new HashMap!(int, int);
	m.add(1, 12); m.add(2, 43); m.add(3, 34);
	foreach(i; m) {
		Stdout(i).newline();
	}
	int x; m.get(1, x);
	Stdout(x).newline();
	Stdout(m.opIndex(1)).flush();
	m.size(); //ilosc elementow w odwzorowaniu
	m.containsKey(1); //sprawdza czy dany klucz istnieje, zwraca true lub false
	m.contains(12); //sprawdza czy taka wartosc istnieje, zwraca true lub false
	m.removeKey(1); //usuwa z odwzorowania element o danym kluczu
	m.remove(43); //usuwa z odwzorowania element o danej wartosci
	m.clear(); //usuwa wszystkie elementy z odwzorowania
}

prawda, że wygląda lepiej :D

Przejdźmy teraz do krótkiego omówienia kodu. 6 linia to deklaracja listy, która będzie przechowywała zmienne typu int, ogólnie trochę dziwnie to wygląda, do tej pory spotkałem się z zapisem <typ> a tutaj !(typ), no ale nic idziemy dalej. 7 linia to dodanie elementów do listy, append dodaje element na koniec listy, prepend na początek, kolejna linia to wspaniał‚a pętla foreach, która „przechodzi” przez wszystkie elementy listy udostępniając je jako zmienną (w moim przypadku i). Linia 11 wygląda ładnie, jednak dla mnie nie była zbyt intuicyjna, przyzwyczajony, że add dodaje element na końcu listy tutaj się trochę zdziwił‚em, gdyż jest to alias do prepend a nie append (co sprawdzamy w kolejnej linii). Linii 13-20 nie będę opisywał, jest to kilka funkcji jakie oferuje klasa LinkedList i opisane są w kodzie.

Przejdźmy teraz do HashMap, najprościej mówiąc jest to odwzorowanie przekształcające jedną wartość na drugą, np. jako klucz możemy mieć czyjś nick, a jako wartość jego numer telefonu ;), oczywiście klucze muszą być unikatowe. Jednak dla uproszczenia zastosowałem int i int, gdyż nie ważny jest przykład a idea :D. Najpierw tworzymy zmienną HashMap, podajemy jej dwa typy, pierwszy to typ klucza, a drugi to typ wartości. W linii 23 dodajemy elementy do mapy (klucz, wartość), następnie prezentacja wspomnianej już pętli foreach. 27 linia może być dość ciekawa, funkcja get ponownie dość mało intuicyjna, gdyż nie zwraca nam wartości przyjmując jako parametr klucz, tylko przyjmuje dwie wartości, pierwsza klucz, a druga to zmienna pod jaką ma zostać zapisana wartość, zwraca true (jeżeli podany klucz istnieje) lub false (jeżeli nie istnieje). Rozwiązanie może i ciekawe, ale jeżeli ktoś woli stare „podejście” to może użyć funkcji opIndex (linia 29), która zwraca wartość po podaniu klucza. Dalsze funkcje klasy HashMap opisane są w kodzie.

Oczywiście wypisałem tutaj tylko 2 częściej używane moim zdaniem kontenery i to nie z wszystkimi oferowanymi przez nie funkcjami, po dalszą wiedzę odsyłam do dokumentacji biblioteki Tango.

Obsługa plików w języku D

Ostatnio trochę z musu niestety (sam pewnie bym się za to nie zabrał :P) zacząłem programować w języku D. Dlaczego z musu(?), a no dlatego, że jest to przedmiot na studiach, który muszę zaliczyć ;)

Jeden z programów, który muszę napisać ma za zadanie obsługę plików, jako że nie znalazłem w sieci (słaby w googlowaniu jestem ;)) nic po polsku o plikach w języku D, to postanowiłem takie coś skrobnąć, może się komuś przyda, na początek kodzik:

import std.stdio;
import std.stream;

void main() {
	File plik = new File();
	plik.open("plik.txt", FileMode.OutNew); //"nowy" plik
	plik.writeLine("linia tekstu");
	plik.close();

	plik.open("plik.txt", FileMode.In); //plik do czytania
	while(!plik.eof()) {
		writefln("%s", plik.readLine());
	}
	plik.close();

	plik.open("plik.txt", FileMode.Append); //dopisywanie do pliku
	plik.writef("kolejna linia tekstu");
	plik.close();

	writefln();

	plik.open("plik.txt", FileMode.In); //plik do czytania
	while(!plik.eof()) {
		writefln("%s", plik.readLine());
	}
	plik.close();
}

a teraz parę słów o nim :)

Pierwsze linijki to standardowo import potrzebnych paczek, następnie tworzymy nowy obiekcik typu File, w moim przypadku „pusty” obiekcik, ale można też wykonać to w taki sposób:

File plik = new File("plik.txt", FileMode.OutNew);

6 linia to otwarcie pliku „plik.txt” do pisania w taki sposób, aby to był jakby nowy plik (czyli jeżeli nie ma takiego pliku to jest on tworzony, a jeżeli taki plik istnieje to cała jego zawartość jest kasowana). W 7 linii następuje zapis linii tekstu do pliku (łącznie ze znakiem nowego wiersza), linia 8 to jak się można domyśleć zamknięcie pliku. W linii 10 następuje otwarcie pliku do czytania, linia 11 to pętla, która wykonuje się do momentu napotkania znaku końca pliku, pętla ta wypisuje każda linię na standardowe wyjście (linia 12). W linii 16 następuje otwarcie pliku do pisania w taki sposób, że zachowuje aktualną zawartość pliku i ustawia wskaźnik na jego końcu, czyli dopisywanie do pliku.

To była obsługa plików w Phobosie, a teraz kodzik robiący to samo, ale za pomocą biblioteki Tango

import tango.io.device.File;
import tango.io.Stdout;

void main() {
	File.set("plik.txt", "linia tekstu\r\n");
	
	char[] tekst = cast(char[])File.get("plik.txt");
	Stdout(tekst);
	
	File.append("plik.txt", "kolejna linia tekstu");
	
	Stdout.newline();
	
	tekst = cast(char[])File.get("plik.txt");
	Stdout(tekst);
}

Na początku standardowo czyli import potrzebnych paczek, 5 linia to zapis tekstu do pliku, zapis ten nadpisuje aktualną zawartość pliku, linia 7 to pobranie zawartości pliku do zmiennej, linia 10 to natomiast dopisanie nowego tekstu do już istniejącego w pliku.

No i to by było na tyle, mam nadzieję, że się komuś przyda ;)