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 ;)

26 lipca 2009 | język D | Brak komentarzy »

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.

9 lipca 2009 | język D | Brak komentarzy »

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 ;)

5 lipca 2009 | język D | Brak komentarzy »

Jako, że blog jest zatytułowany „Z życia programisty”, to wypadało by pewnie coś o tym programowaniu napisać, a nie tylko ciągle o rowerach :-P

Tak więc szanowne Panie i szanowni Panowie mam zaszczyt przedstawić projekt „Desty”. Jest to owoc pracy 5 studentów Wydziału Matematyki i Informatyki UMK w Toruniu, który został zrealizowany w ramach przedmiotu programowanie zespołowe. Jako, że jest to mój pierwszy „programistyczny” wpis, to nie ma co za dużo klikać w klawiaturę, proponuję obejrzeć film z publicznej prezentacji, miłego oglądania :-)

16 czerwca 2009 | Inne | Brak komentarzy »

Dla mnie jako Polaka i fana kolarstwa, takie chwile jak ta dzisiejsza, to chwile dla których warto żyć, chwile które ciężko opisać, najlepiej obejrzeć to jeszcze raz!

Sylwester Szmyd wygrywa 5. etap Dauphine Libere, który kończy się na legendarnym Mont Ventoux, górze na której wygrywają tylko najlepsi!

11 czerwca 2009 | Kolarstwo | Brak komentarzy »

Deszcze niespokojne
potargały sad,
a my na tej wojnie
ładnych parę lat.

Ta oto piosenka zabrzmiała tuż przed startem do IV edycji SKANDIA Maraton LANG TEAM w Nałęczowie.

Ale od początku. Pogoda przed startem w Nałęczowie nie rozpieszczała, od środy praktycznie w całej Polsce przytoczone już deszcze niespokojne. No ale trudno, cocojumbo i do przodu jak to mawiają, więc postanowiłem się wybrać. Dzień wcześniej oczywiście wyjazd już do Warszawy i nocleg u znajomego, a w niedzielę o godzinie 6:40 pociąg do Nałęczowa. Ranek napawał optymizmem, niemal bezchmurne niebo, ale niestety im bliżej miejsca docelowego tym gorsza pogoda, do tego informacje, że deszcz ma zacząć padać o 10:30. Po dojechaniu do celu, szybkie rozeznanie i zapisanie się na wyścig – dystans mini 34 km i udział w Mistrzostwach Polski dziennikarzy. Następnie przebranie się w odpowiedni strój, wsiadamy na rower i udajemy się na start. Na starcie ostatnie rozmowy i nagle zaczyna padać, a żeby wszystkim zrobiło się weselej, osoba odpowiedzialna za oprawę muzyczna najpierw puszcza piosenkę „Ciągle pada”, a następnie „Deszcze niespokojne”. Tuż przed startem jeszcze informacja, że w środkowej części trasy można napotkać problemy, ponieważ całą noc padało.

Teoretycznie pierwsze 2 km miały być startem honorowym, jak się później okazało „gaz” poszedł już od początku, a że mój rowerem, a zwłaszcza opony jakie posiadał nie bardzo nadawały się na tego typu pogodą, to od początku jechałem dość powoli, pierwsze osoby zacząłem tak naprawdę mijać gdy zaczął się asfalt, o tyle dobrze, że było go dość dużo od startu, tak więc startując z końca stawki, myślę, że przebiłem się przez około 100-120 osób. Po paru kilometrach asfaltu pierwsza ciekawsza przeszkoda – podjazd po betonowych płytach i wszystko byłoby okej, gdyby nie fakt, że przy końcu podjazdu zakopał się samochód i zablokował przejazd, rozładowanie „korka” zajęło sporo czasu, sam stałem chyba z 5 min. Potem jeszcze trochę asfaltu i nadrobionych parę pozycji (teoretycznie pierwsze 10km było po asfalcie), a następnie zaczyna się zabawa, pierwsze drogi leśne, nie takie złe, w miarę utwardzone i można było jechać, oczywiście osoby posiadające bardziej przystosowane do warunków ogumienie zaczęły mnie wyprzedzać, tak jak ja je wcześniej. Nie wdając się w szczegóły opiszę tylko kilka najfajniejszych momentów trasy, dość ciekawy zjazd do wąwozu, nie pamiętam który kilometr, pamiętam, że ustawione tam były 3 aparaty, może znajdę zdjęcia gdzieś w sieci, to umieszczę, w każdym bądź razie sporo osób będzie miało super fotki, gdy upada :-). Najciekawszym moim zdaniem miejsce na trasie był chyba około 2-3 km odcinek w polu i to dosłownie, polna gliniana ścieżka a przejechanie przez nią było niemożliwe, wszyscy zsiedli z rowerów i prowadzili je bokiem, gdzie jeszcze ziemia nie była tak rozjechana, niestety na niewiele to się zdawało i tak co parę minut trzeba było ściągać błoto z hamulców, ponieważ koła stawały w miejscu, a sam rower ważył kilka kilogramów więcej. Ostatnim ciekawym miejscem był wąwóz w Wąwolnicy (chyba) i gdyby nie założona tam kostka brukowa byłoby naprawkę nieciekawie.

już na mecie :D

Ostatecznie jak się okazało dystans 34 km pokonałem w czasie 2 godzin 4 minut i 29 sekund, co dało mi 232 lokatę wśród wszystkich startujących na dystansie mini, 72 w mojej kategorii wiekowej i 15 wśród dziennikarzy. Z czasu na pewno zadowolony być nie mogę, 10 minut gorzej niż w zeszłym roku, mimo lepszego przygotowania, siły były, niestety sprzęt na więcej nie pozwolił.

Mistrzem Polski dziennikarzy został Cyryl Szweda, o tyle cieszy iż jest to dobry znajomy, z którym miałem przyjemność podróżować przez pół Polski z Torunia do Nałęczowa :-)

1 czerwca 2009 | Kolarstwo | 1 komentarz »

A w zasadzie witaj drogi czytelniku. Na początek może wypada się przedstawić, tak więc nazywam się Mateusz Lewandowski, aktualnie jestem studentem informatyki na wydziale Matematyki i Informatyki Uniwersytetu Mikołaja Kopernika w Toruniu.

Jako, że ostatnio coraz większą popularnością cieszą się blogi, to sam postanowiłem zobaczyć, jak to będzie mi wychodzić i jak długo będzie chciało mi się pisać. Blog, jak nazwa może wskazywać będzie o programowaniu, ale nie tylko, na pewno znajdzie się tu sporo wpisów o moim hobby, jakim jest kolarstwo, jak i o moim nałogu, jakim są zakłady bukmacherskie. Co do samego programowania, to głównie skupiać się będę wokół Javy i PHP, powinno pojawić się również kilka wpisów o języku D, jak i Pythonie.

Mam nadzieję, że blog zyska choć paru czytelników, a informacje jakie tutaj będę umieszczał nie będą tylko sztuką dla sztuki.

P.S. nie studiuję polonistyki, tak więc jeżeli się pojawią jakieś błędy (stylowe, ortograficzne, itp.), to proszę o wyrozumiałość :-)

23 maja 2009 | Inne | komentarze 2 »