Październikowy wieczór, nikt nie chciał „wyjść” na piwo, a ja zrobiłem sobie dziś przerwę w „treningach” i tak z okazji pojawienia się bonusowego czasu przeznaczyłem go na przemyślenia.

Około miesiąc temu skończył się sezon kolarski i mając trochę innej pracy postanowiłem odpocząć od roweru. Biorąc pod uwagę zaistniałą sytuację, „rozłąki” tej miało być 2 tyg, jak postanowiłem tak zrobiłem. Przez rozłąkę z rowerem mam na myśli też wszelkie rzeczy z tym związane, a przede wszystkim dietę, żyje się tylko raz więc od czasu do czasu można pozwolić sobie na nie liczenie kalorii. Pracy którą założyłem początkowo było sporo, później jednak się to lekko zluzowało, a że jestem typem człowieka, który ciężko zmienia postanowienia, to końcówka 2-tyg laby zaczęła mi się strasznie dłużyć. Nagle gdy nie musiałem iść na trening, gdy nie musiałem się spinać, żeby wszystko zgrać i z wszystkim się wyrobić uświadomiłem sobie, że „nie mam w co wsadzić ręce” (a zbiegło się to jeszcze z okresem w którym nie miałem internetu w domu). Ile razy można oglądać ten sam film, ile można spać popołudniami, ile można siedzieć przed kompem i klikać w kółko jedno i to samo, nawet mając internet to przeglądamy w kółko jedne i te samy strony, a najgorsza jest świadomość, że wiemy iż i tak nie zaskoczy nas na tych stronach nic nowego a dla zabicia czasu i tak kilka razy „refreszniemy” je, po pewnym czasie nawet „fejsbuka” nie daje się już oglądać ;)

Dodatkowym bodźcem dla tego tekstu jest dzisiejszy dzień – wtorek. Dziś znowu miliony polaków pokażą jakimi są fanami „kopanej” i pięknego stylu Barcelony, a Liga Mistrzów to sport na najwyższym poziomie. Otworzą borowara i dumnie zasiądą przed TV (znaczy w tym momencie pewnie już siedzą), naoglądają się wygimnastykowanych „atletów”, wpadną w kompleksy i otworzą kolejne piwo by na wieczór z dumą powiedzieć „trzy strzeliłem” i pójść spać. Przecież łatwiej jest założyć, że takim jak oni nigdy nie będę i nawet nie próbować, bo szkoda czasu, dla nich
Czas j tam upłynie

A wracając do wpisu i moich przemyśleń. Po 2 tygodniach nic nie robienia wsiadłem na rower i w jeden „łikend” zrobiłem 180km, mimo dużego zmęczenia po ponad 130km trasie poczułem, że dobrze wykorzystałem swój czas i że nie zmarnowałem całej niedzieli przed kompem.

W międzyczasie dowiedziałem się o półmaratonie w Szamotułach i postanowiłem się za siebie zabrać („dzięki” odpoczynkowi waga skoczyła mi o 4kg w ciągu 2 tyg). Czasu nie było wiele (2 tyg), ale wystarczająco, aby choć trochę przyzwyczaić nogi do innego wysiłku niż ten na rowerze. W myśl powyższej zasady nie zrezygnowałem z celu tylko dlatego, że czasu jest za mało i nie dam rady, starałem się dobrze wykorzystać każdy pozostający dzień i udało mnie się wykonać przed wyścigiem 7 typowo biegowych treningów + kilka dłuższych rowerowych przejażdżek (wszak dla płuc nie ma znaczenia czy biegamy czy jeździmy, a nogi przynajmniej u mnie trochę odpoczną). Efektem powrotu do sportu jest zrzucenie niechcianego kilograma, brak „nudy” i poczucia zmarnowanego czasu. I mimo coraz mocniej dającej o sobie znać jesieni, a za chwilę zapewne zimy, wiem że od tego (sportu) nie odejdę.


zdjęcia
Rober Zabel – https://picasaweb.google.com/106465947546898436235/SamsungPoMaratonSzamotuY21102012
Agnieszka Kaniewska – https://picasaweb.google.com/104617059929125164683/20121021IISamsungPoMaratonSzamotuY

23 października 2012 | biegi | Brak komentarzy »

Ostatnio miałem takie małe zadanko, którego celem było wyszarzenie ikony, gdy zajdzie jakieś zdarzenie. Oczywiście nie interesowało mnie, utworzenie ręcznie szarego odpowiednika dla kolorowej ikony i wyświetlanie go gdy zajdzie taka potrzeba, dlatego poszukałem czy istnieje coś takiego w PHP,a że chwilę poświęciłem na znalezienie tego, to zanotuje tutaj ;)

Jak się okazało po chwili nieudolnych poszukiwań (uleciała mnie nazwa desaturacja, dlatego pewnie tak długo to trwało) znalazłem funkcje w php, która zrobi wszystko co mnie interesuje za „free” i nie potrzeba będzie jakiś dodatkowych libów.

Funkcja, o której mowa to

bool imagecopymergegray ( resource $dst_im , resource $src_im ,
					int $dst_x , int $dst_y , int $src_x , int $src_y ,
					int $src_w , int$src_h , int $pct )

mnogość parametrów i mnie zabija do teraz, ale po kolei
$dst_im – zasób do którego zapisany zostanie wynik działania funkcji
$src_im – zasób w którym znajduje się kolorowe zdjęcie
$dst_x – punkt x w zasobie docelowym, od którego zaczniemy wypełniać zasób
$dst_y – punkt y w zasobie docelowym, od którego zaczniemy wypełniać zasób
$src_x – punkt x w zasobie źródłowym, od którego zaczniemy pobierać punkty do przetworzenia
$src_y – punkt y w zasobie źródłowym, od którego zaczniemy pobierać punkty do przetworzenia
$src_w – szerokość zasobu (fragmentu, jaki chcemy przetworzyć)
$src_h – wysokość zasobu (fragmentu, jaki chcemy przetworzyć)
$pct – skala szarości, przez jaką „przepuścimy” źródłowy zasób, przy czym 0 to pełna skala szarości, a 100 to zerowa skala szarości (zasób pozostanie niezmieniony)
funkcja na wyjściu zwraca true/false w zależności od tego czy się udało przetworzyć zasób

I teraz już wszystko jest jasne

Na koniec mały bonus, moja klaska, którą napisałem i wykorzystuje do przetwarzania obrazków w aplikacjach PHP

class Image {
	private $image = null;
	private $imageType = null;
	private $imageTypeExtension;

	public function __construct($filename = null) {
		if($filename == null || !file_exists($filename))
			throw new Exception('File not exists');
		$this->load($filename);
	}

	public function load($filename) {
		$imageInfo = getimagesize($filename);
		$this->imageType = $imageInfo[2];
		if($this->imageType == IMAGETYPE_JPEG) {
			$this->image = imagecreatefromjpeg($filename);
			$this->imageTypeExtension = 'jpg';
		} elseif($this->imageType == IMAGETYPE_GIF) {
			$this->image = imagecreatefromgif($filename);
			$this->imageTypeExtension = 'gif';
		} elseif($this->imageType == IMAGETYPE_PNG) {
			$this->image = imagecreatefrompng($filename);
			$this->imageTypeExtension = 'png';
		} else {
			throw new Exception('Unsupported image type, only jpg, png, gif');
		}
		if($this->image === false) {
			throw new Exception('Unsupported image type, only jpg, png, gif');
		}
	}

	public function save($filename, $imageType = IMAGETYPE_JPEG, $compression = 80, $permissions = null) {
		$result = false;
		if($this->image == null)
			throw new Exception('Image error');
		if($imageType == IMAGETYPE_JPEG) {
			$result = imagejpeg($this->image, $filename, $compression);
		} elseif($imageType == IMAGETYPE_GIF) {
			$result = imagegif($this->image, $filename);
		} elseif($imageType == IMAGETYPE_PNG) {
			$result = imagepng($this->image, $filename);
		}
		if($permissions != null) {
			chmod($filename, $permissions);
		}
		return $result;
	}

	public function getWidth() {
		if($this->image == null)
			throw new Exception('Image error');
		return imagesx($this->image);
	}

	public function getHeight() {
		if($this->image == null)
			throw new Exception('Image error');
		return imagesy($this->image);
	}

	public function resizeToHeight($height) {
		$ratio = $height / $this->getHeight();
		$width = $this->getWidth() * $ratio;
		$this->resize($width, $height);
	}

	public function resizeToWidth($width) {
		$ratio = $width / $this->getWidth();
		$height = $this->getHeight() * $ratio;
		$this->resize($width, $height);
	}

	public function scale($scale) {
		$width = $this->getWidth() * $scale / 100;
		$height = $this->getHeight() * $scale / 100;
		$this->resize($width, $height);
	}

	public function resize($width, $height) {
		if($this->image == null)
			throw new Exception('Image error');
		$newImage = imagecreatetruecolor($width, $height);
		imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
		$this->image = $newImage;
	}

	public function getType() {
		if($this->image == null)
			throw new Exception('Image error');
		return $this->imageType;
	}

	public function getTypeExtension() {
		if($this->image == null)
			throw new Exception('Image error');
		return $this->imageTypeExtension;
	}

	public function setGrey($grey = 0) {
		return imagecopymergegray($this->image, $this->image, 0, 0, 0, 0, $this->getWidth(), $this->getHeight(), $grey);
	}
}

I sposób wykorzystania dla dzisiejszego przykładu

$img = new Image('kolorowy_obrazek.jpg');
$img->setGrey();
$img->save('szary_obrazek.jpg');
19 października 2012 | PHP | Brak komentarzy »

Sezon 2012 się zakończył, przynajmniej dla mnie jeżeli chodzi o ściganie, teraz wstępuję w okres rozjazdowo-przygotowawczy do nowego sezonu, poprzedzony 2 tyg „(nie)zdrowym opierdalaniem się” ;)
Przy okazji postanowiłem też powrócić na stare śmieci i uciec z bloga TC-Team.pl, skoro Krzyś przestał się udzielać, to sam mogę pisać tu, nie muszę tam ;) Swoją drogą przypomniał mnie się pierwszy wpis dotyczący moich rowerowych wyczynów – http://lewyino.pl/2009/06/a-ja-na-tej-wojnie-ponad-2-godziny/ ciekawe kto to czytał :P

Co do sezonu 2012, to na poważne zacząłem go w marcu, styczeń i luty były dość słabo przetrenowanymi miesiącami, głównie z racji kontuzji złapanej na początku roku (a może to taka moja wymówka;)) W każdym bądź razie od marca zacząłem więcej jeździć na rowerze, miałem końcówkę siłowni oraz nie mogłem zaniedbywać biegania, przecież pierwszy start w sezonie nie był na rowerze, a był to połmaraton Poznański i miał początkowo cel – przebiec, a w trakcie treningów cel został podniesiony na ukończenie w czasie poniżej 2 godzin, cel udało się osiągnąć 1:51:53 (czas netto niecałe 1:50) i w taki oto sposób rozpocząłem sezon.
Sezon 2012 był też pierwszym moim pełnym sezonem, a więc też sezonem z największą ilością startów, nie pamiętam ile planowałem, ale jak zawsze więcej by się chciało niż zrealizować się dało.
Starty rozpocząłem 15.04 w Murowanej Goślinie podczas Powerade Garmin MTB Marathon i wynik mnie zaskoczył, 37/299 osób open na dystansie mini (w poprzednim sezonie meldowałem się trochę wyżej niż w połowie stawki) pokazał, że pojeździć, nawet nie dużo na rowerze, ale zawsze podczas zimy to kosmiczna różnica względem osób „zimujących”, zwłaszcza różnica ta uwidacznia się na początku sezonu, później się zaciera, ale satysfakcja z dobrego wyniku daje dalszą motywację ;)
Nad startami rozczulać się nie będę, każdy z nich w miarę możliwości opisywany był na blogu i informacje szczegółowe znaleźć można tutaj – http://TC-Team.pl
Jednak w podsumowaniu przypomnieć trzeba sobie każdy
22.04 i kolejny start – Dolsk i Grand Prix Wielkopolski w maratonach MTB, 2x przebita opona i pierwszy w życiu DNF
29.04 – Metropolia w Bydgoszczy i pierwszy w życiu tak długi wyścig (55km)
20.05 – Gniezno i GP WLKP, oraz sprawdzian formy przed szczytem
27.05 – Skandia Lublin, główny wyścig sezonu ze względu na Mistrzostwa Polski Dziennikarzy w maratonach MTB
03.06 – Skandia Gdańsk
17.06 – Igrzyska Olimpijskie Sportowców Wiejskich
24.06 – Wyrzysk i GP WLKP, pierwszy poważny zgon na trasie, 70km w wysokiej temperaturze + przebita opona na start
22.07 – Skandia Bytów, czyli Kebab, żubrówka i życiówka, ale nie próbujcie tego sami :D
12.08 – Suchy Las GP WLKP
19.08 – Wałcz GP WLKP i kolejny mocny zgon, 80km w upale i piaskach
26.08 – Kaczmarek MTB Nowa Sól, coś nowego, a do tego bardzo fajna impreza i myślę, że w przyszłym sezonie odwiedzę coś więcej z tego cyklu
09.09 – Skandia Rzeszów, ważny start z pomyłką organizatora i 500km w jedną stronę, żeby pościgać się przez 10km na trasie wyścigu rodzinnego
15.09 – Michałki i tyle dziur nie przeżyłem chyba przez resztę sezonu, ale wyścig miał coś w sobie i pewnie tam wrócę za rok
22.09 – Skandia Kwidzyn, najlepszy wynik na koniec sezonu
23.09 – Łopuchowo GP WLKP i kolejny dobry start ale tym razem z pechem i kolejnym laczkiem

I tak w skrócie można podsumować ten sezon. 16 startów na rowerze (w tym 2 nieukończone, pierwszy laczek, drugi organizator) podczas których złapałem 4 laczki (2 w Dolsku licze, pierwsze w życiu na wyścigu) i 1 półmaraton. Sezon z głównym nastawieniem na doświadczenie i rozwój, posmakowanie dłuższych dystansów i powalczenia podczas MP Dziennikarzy, w zasadzie wszystko udało się zrealizować, więc można sezon uznać za udany.
Dodatkowo udało się też zrealizować mniejszy plan zgubienia kilku kilogramów, w styczniu po wejściu na wagę ujrzałem 93.8kg i postanowiłem coś z tym zrobić, nieśmiało myślałem o 80kg na koniec sezonu, a potem „dogubieniu” jeszcze 5kg zimą i następny sezon chciałbym zacząć z wagą 75kg. Jednak to co zrobiłem nawet mnie zadziwiło, na końcówkę sezonu waga spadła do 75kg (a nawet lekko poniżej), ciekawe tylko do jakiego poziomu podskoczy po aktualnym 2 tygodniowym lenistwie.

tak więc na pocątek następnego sezonu może 70kg ;)

Jeszcze parę suchych statystyk dla potomnych, okres 01.03.2012 – 30.09.2012
dystans: 6257.7km
czas: 269h 13m
w tym jakieś 150km bieganie, a że za szybko nie biegam to pewnie zajęło to jakieś 15h ;)

A teraz dla tych co dotarli do końca jeszcze rozkminka ;)
Blog ma nazwę – „Z życia programisty, nie tylko o programowaniu” i coś czuje, że trzeba zmienić bo wpisy rowerowe mogą być częstsze. Na razie z pomysłów jest całkowity obrót „Z życia rowerzysty-amatora, nie tylko o „pedałowaniu” i miks „Z życia programisty, głównie o „pedałowaniu””, a może jakieś propozycję ;)

na koniec mała galeria wybranych zdjęć z sezonu


autorami zdjęć są
Kamil Mateja – https://plus.google.com/photos/106937120747539372065/albums/5791071249723184305
Mi Se – https://picasaweb.google.com/105479128468102583795/GrandPrixWielkopolskiWMaratonachMTB23092012Opuchowo
Mi Se – https://picasaweb.google.com/105479128468102583795/MichaKi2012WWieleniu
Marcin Jaworski – https://plus.google.com/photos/114371762412810657309/albums/5776193556103092065?banner=pwa
Mi Se – https://picasaweb.google.com/105479128468102583795/GrandPrixWielkopolskiWMaratonachMTB201212082012SuchyLas
Pyrcyk Poznań – https://picasaweb.google.com/114488523242078825673/GRANDPRIXWLKPWMARATONACHMTBSUCHYLAS12082012
Cyryl Szweda
Wojtek Szabelski / Freepress.pl

1 października 2012 | Kolarstwo | Brak komentarzy »

Chciałbym zaprezentować wszystkim nasze ostatnie przedsięwzięcie: video-it.pl
Ostatnio zacząłem oglądać trochę filmów z różnych konferencji i z kumplami stwierdziliśmy, że przydałoby się miejsce w którym byłby wszystkie interesujące filmiki pod ręką. Video-IT.pl ma być właśnie takim miejscem. Każdy film można ocenić oraz skomentować.
W chwili obecnej portal ma nieco ponad 60 nagrań z różnych informatycznych konferencji – w wolnym czasie zbiór ten powinien być wzbogacany o kolejne nagrania.
Mamy nadzieje, że taki zbiór filmów przypadnie Wam do gustu. Jeśli macie jakieś sugestie – zapraszamy do podzielenia się nimi w komentarzu.

14 czerwca 2011 | Inne | Brak komentarzy »

Na początek po długiej przerwie lekko, szybko i przyjemnie, głównie żeby się przełamać i zacząć coś jednak pisać ;)

Tak więc podstawy cURL w PHP na przykładzie dość oklepanym, ale też użytecznym, czyli odczytanie podstawowych danych z google.

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, "http://www.google.pl");
$google = curl_exec($curl);
curl_close($curl);

Pierwsza linijka to otwarcie sesji cURL, następne 2 linijki to ustawienie opcji, pierwsza informuje, że będziemy chcieli odczytać zwrotną informację z danej strony, a druga ustawia jaki adres chcemy odwiedzić. 4. linijka to wykonanie połączenia i przypisanie zwrotnej informacji do zmiennej, gdybyśmy nie ustawili w 2. linijce opcji, że chcemy odczytać informację zwrotną wówczas 4. linijka wykonałaby tylko połączenie. Ostatnia linijka to zamknięcie sesji cURL.

Jak by nie patrzeć nic szczególnego, proste połączenie, teraz jednak lekka modyfikacja i stworzymy już w miarę przydatny skrypt, który będzie pobierał z google 2 chyba najczęściej sprawdzane informacje (przynajmniej przeze mnie ;)) czyli ilość podstron za indeksowanych przez google i pozycje naszej witryny na daną frazę.

$q = trim($_GET['q']);
$q = strip_tags($q);
$q = str_replace(" ", "+", $q);

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, "http://www.google.pl/search?q=".$q);
$google = curl_exec($curl);
curl_close($curl);

Zmienna q przyjmować będzie frazę, jaką wpisujemy normalnie w wyszukiwarce (u mnie dla prostoty bez formularzy zmienna pobierana metodą GET), usunięte tagi i następnie zamiana spacji na znak „+” jak to ma miejsce w google. Gdy już mamy zapytanie, tworzymy połączenie, jak w poprzednim przykładzie z odpowiednio zmodyfikowanym adresem. Teraz nie pozostaje nam już nic innego jak przetworzyć tekst ze zmiennej google.

function ilePodstron($google) {
	$tmp = strpos($google, "resultStats") + 11;
	$start = strpos($google, " ", $tmp) + 1;
	$koniec = strpos($google, " ", $start);
	$wynik = substr($google, $start, $koniec - $start);
	$wynik = str_replace(",", "", $wynik);
	return $wynik;
}

Powyższa funkcja wyświetli nam ilość podstron za indeksowanych na daną frazę, 2. linia sprawdza pozycję wystąpienia ciągu „resultStats”, po którym następuje wypisanie ilość wyników w google, następnie szukamy pierwszej spacji po tym ciągu (dokładne określenie miejsca w którym zaczyna się liczba), potem wyszukanie kolejnej spacji (miejsce gdzie kończy się liczba ;)), 5. linia to już pobranie ze zmiennej google tylko fragmentu zawierającego liczbę, później jeszcze usuwam zbędny przecinek i zwracam wynik, prawda że proste ;) (co do informacji, ile mamy za indeksowanych podstron naszej konkretnej witryny frazę należy zmodyfikować do postaci „site:adres_strony”)
Teraz troszkę trudniejsza funkcja, czyli sprawdzenie miejsca naszej witryny w google pod daną frazą.

function ktoraPozycja($google) {
	$s = trim($_GET['s']);
	$s = strip_tags($s);
	$s = strtolower($s);
	if(!$s)
		return;
	$start = 0;
	$wynik = 1;
	while(true) {
		$start = strpos($google, "<cite>", $start);
		if($start === false)
			return;
		$start += 6;
		$koniec = strpos($google, "</cite>", $start);
		$strona = strip_tags(strtolower(substr($google, $start, $koniec - $start)));
		if(strpos($strona, $s) !== false)
			return $wynik;
		$wynik++;
	}
}

Jak wcześniej, tak i teraz dla prostoty adres interesującej nas strony pobieram metodą GET do zmiennej s. Aby nie mieć problemów później, to od razu zmieniam sobie adres na małe litery (4. linia), później sprawdzenie, czy w ogóle chce się sprawdzać stronę (czy w adresie jest zmienna s ;)). Teraz już najważniejsza część, czyli pętla, która wykonuje się, do puki w zmiennej google znajdujemy ciąg „<cite>” (w tych tagach google umieszcza adresy kolejnych witryn), linie 10. i 11. to sprawdzają i jeżeli ciąg taki nie występuje wychodzi z funkcji. Linia 13. to ustawienie zmiennej start po ciągu „<cite>”, czyli w miejscu rozpoczęcia występowania adresu witryny, linia 14. to ustawienie końca występowania adresu strony, linia 15. to wycięcie adresu strony ze zmiennej google, zamienienie adresu na małe litery i usunięcie zbędnych tagów (czasem zdarza się tag <b>). 16. linia sprawdza czy pobrany przed chwilą adres pasuje do tego jaki szukamy i jeżeli tak, to zwraca pozycję naszej strony i kończy działanie funkcji.

No to by było na tyle po powrocie ;)

A i jeżeli by ktoś nie zauważył, zaszła też zmiana w adresie bloga ;)

27 września 2010 | PHP | 1 komentarz »

Ostatnio ktoś mi powiedział, że używanie takiej kobyły (Maven) do takiego programiku mija się z celem, może i tak, ale dobre praktyki się przydają, to raz, a dwa trochę bibliotek będzie potrzebnych do uruchomienia programu, więc aby nie było problemów, to Maven zrobi to za nas :D

Na początek odpalamy eclipse i tworzymy nowy projekt maven (do tego celu używam wtyczki m2eclipse) jako groupId podaje pl.xon.lewy jako artifactId openjpa i klikam finisz (wsześniej podczas tworzenia zaznaczyłem, że chcę pominąć sekcję z archetypami), podobny efekt do tego, który osiągnąłem można uzyskać poprzez wydanie w konsoli poleceń mvn archetype:create -DgroupId=pl.xon.lewy -DartifactId=openjpa -Dversion=1.0 następnie polecenie mvn eclipse:eclipse i już projekt jest gotowy do zaimportowania do eclipse.

Na początek dodajemy do projektu kilka niezbędnych bibliotek, pierwsza z nich odpowidzialna za głównego bohatera naszego wpisu, czyli OpenJPA, najprościej dokonać tego poprzez kliknięcie prawym przyciskiem myszy na nazwie projektu, nastepnie Maven i Add Dependency i wyszukujemy openjpa, ja wybieram wersję 2.0.0-M3, taki sam efekt uzyskać można poprzez dodanie wpisu w sekcji dependencies w pliku pom.xml

<dependencies>
	<dependency>
		<groupId>org.apache.openjpa</groupId>
		<artifactId>openjpa</artifactId>
		<version>2.0.0-M3</version>
	</dependency>
</dependencies>

Następny krok to biblioteka HSQLDB, dodaje się ją w taki sam sposób, w moim przypadku wersja 1.8.0.10

<dependency>
	<groupId>hsqldb</groupId>
	<artifactId>hsqldb</artifactId>
	<version>1.8.0.10</version>
</dependency>

No to dodanie zależności do naszego projektu mamy za sobą, kolejnym ważnym krokiem jest utworzenie pliku persistence.xml, w którym zapisujemy konfigurację dla JPA, jak wiadomo Maven ma ściśle określoną strukturę plików, tak więc plik presistence.xml też ma „swoje” miejsce i znajdować musi się w katalogu NASZ_PROJEKT/src/main/resources/META-INF/presistence.xml, jego wygląd uzależniony jest w pewnym sensie od bazy i dostawcy JPA jakiego używamy, dla HSQLDB i OpenJPA mój plik wygląda tak

<?xml version="1.0"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="default">
		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
		<class>pl.xon.lewy.Klasa</class>
		<properties>
			<property name="openjpa.ConnectionURL" value="jdbc:hsqldb:file:test.db;shutdown=true" />
			<property name="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" />
			<property name="openjpa.ConnectionUserName" value="sa" />
			<property name="openjpa.ConnectionPassword" value="" />
			<property name="openjpa.jdbc.Schema" value="PUBLIC" />
			<property name="openjpa.Log" value="DefaultLevel=ERROR, Tool=INFO" />
			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
		</properties>
		</persistence-unit>
</persistence>

mam nadzieję, że większość linijek jest zrozumiała i nie trzeba ich omawiać, ważne na pewno jest name w presistence-unit, ponieważ po nim identyfikujemy baze jakiej używamy, gdyż w pliku presistence.xml możemy zdefiniować sobie ich więcej, kolejna ciekawa linijka to ta z <class> gdyż w tym miejscu definiujemy klasy, które będą mapowane w danej bazie (linijek takich może pojawić się wiecej niż jedna).

Dobra gdy wszystko skonfigurowane czas napisać jakąś encję (klasę, która będzie odzwierciedlana w bazie danych), u mnie ona oczywiście nazywa się Klasa i jest w paczce pl.xon.lewy, aby klasa stała się encją, przed jej nazwą należy dodać adnotacje @Entity, w klasie dodałem też jakieś zmienne, które będą kolumnami w bazie, plik wygląda mniej więcej tak

package pl.xon.lewy;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Klasa {
	@Id
	@GeneratedValue
	private int id;

	@Column
	private int jakasLiczba;

	@Column
	private String jakisNapis;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getJakasLiczba() {
		return jakasLiczba;
	}

	public void setJakasLiczba(int jakasLiczba) {
		this.jakasLiczba = jakasLiczba;
	}

	public String getJakisNapis() {
		return jakisNapis;
	}

	public void setJakisNapis(String jakisNapis) {
		this.jakisNapis = jakisNapis;
	}
}

adnotacja @Column nie jest niezbędna, przydaje się, gdybyśmy chcieli jakąś zmienną umieszczać w kolumnie o innej nazwie (@Column(name=”liczba”)).

Gdy mamy już naszą klase, należy stworzyć jeszcze klasę główną programu (u mnie nazwa Main)

package pl.xon.lewy;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Main {
	private static EntityManagerFactory jpaFactory = Persistence.createEntityManagerFactory("default");

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		if(args.length == 2) {
			EntityManager jpa = jpaFactory.createEntityManager();
			jpa.getTransaction().begin();
			Klasa k = new Klasa();
			k.setJakasLiczba(Integer.parseInt(args[0]));
			k.setJakisNapis(args[1]);
			jpa.persist(k);
			jpa.getTransaction().commit();
			jpa.close();
		} else {
			EntityManager jpa = jpaFactory.createEntityManager();
			Query zapytanie = jpa.createQuery("SELECT k FROM Klasa k");
			List<Klasa> wyniki = zapytanie.getResultList();
			for(Klasa k : wyniki) {
				System.out.println("[klasa]");
				System.out.println("id: " + k.getId());
				System.out.println("liczba: " + k.getJakasLiczba());
				System.out.println("napis: " + k.getJakisNapis());
			}
			jpa.close();
		}
	}
}

Na koniec pozostało jeszcze trochę konfiguracji Maven’a, dodanie kilku pluginów, które ulatwią życie ;)

Pierwszy z nich odpowiedzialny jest za stworzenie pliku jar, wraz z odpowiednim plikiem manifestu dla niego i wygląda mniej więcej tak

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<archive>
			<manifest>
				<mainClass>pl.xon.lewy.Main</mainClass>
				<packageName>pl.xon.lewy</packageName>
				<addClasspath>true</addClasspath>
				<classpathPrefix>lib</classpathPrefix>
			</manifest>
		</archive>
	</configuration>
</plugin>

Kolejnym pluginem jest plugin ustawiający z jakiej wersji JAVY będziemy korzystać podczas kompilacji projektu, tutaj ważne jest aby była to JAVA w wersji minimum 5, ponieważ dopiero wtedy wprowadzono adnotacje

<plugin>
	<inherited>true</inherited>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.0.2</version>
	<configuration>
		<source>1.6</source>
		<target>1.6</target>
	</configuration>
</plugin>

Teraz chyba najważniejszy dla naszej aplikacji plugin, który odpowiedzialny jest za OpenJPA

<plugin>
  	<groupId>org.codehaus.mojo</groupId>
	<artifactId>openjpa-maven-plugin</artifactId>
	<version>1.0</version>
	<configuration>
		<addDefaultConstructor>true</addDefaultConstructor>
		<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
	</configuration>
	<executions>
		<execution>
			<id>enhancer</id>
			<phase>process-classes</phase>
			<goals>
				<goal>enhance</goal>
			</goals>
		</execution>
	</executions>
</plugin>

Ostatnim pluginem, który wykorzystam w mojej aplikacji jest plugin umożliwiający tworzenie wersji nadających się do rozpowszechnienia

<plugin>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>2.2-beta-2</version>
	<configuration>
		<descriptor>src/main/assembly/src.xml</descriptor>
	</configuration>
</plugin>

jak widać wtyczka ta potrzebuje jeszcze odpowiednio napisanego pliku deskryptora, u mnie wygląda on mniej więcej tak

<assembly>
	<id>bin</id>
	<formats>
		<format>zip</format>
	</formats>
	<fileSets>
		<fileSet>
			<directory>target</directory>
			<outputDirectory>/</outputDirectory>
			<includes>
				<include>*.jar</include>
			</includes>
		</fileSet>
	</fileSets>

	<dependencySets>
		<dependencySet>
			<outputDirectory>/lib</outputDirectory>
			<includes>
				<include>*:jar</include>
			</includes>
		</dependencySet>
	</dependencySets>
</assembly>

w 4 linijce podane jest jakiego formatu ma być plik wynikowy, nastepna sekcja informuje o umieszczenie wszystkich plików z rozszerzeniem jar z folderu target w głównym folderze w archiwum, w dependency dodaje informację o umieszczeniu wszystkich potrzebnych bibliotek w katalogu lib

No i tak dotarliśmy do końca, pozostaje już tylko wywołanie polecenia mvn assembly:assembly, które możemy wykonać z poziomu eclipse, klikamy prawym przyciskiem myszy na nazwie projektu, nastepnie Run As i Maven assembly:assembly i w ten sposób otrzymujemy plik zip z naszym projektem, inną ciekawą opcją mvn assembly jest wywołanie mvn assembly:directory, które od poprzedniego różni się tym iż nie ładuje wszystkiego do pliku zip, który musimy wypadować i dopiero na nim działać, a poprostu zamiast archiwum tworzy folder z jego zawartością.

teraz możemy uruchomić program, np wywołanie
java -jar openjpa-1.0.jar 13 „to jest szczesliwa liczba”
doda do bazy instancję naszej klasa z liczbą 13 i napisem „to jest szczesliwa liczba”, sprawdzić to możemy poprzez wywołanie programu bez parametrów

17 listopada 2009 | JAVA | Komentarzy: 2 »

Na moim wydziale od jakiegoś czasu odbywa się kółko informatyków dotyczące technologii .NET. Sam uczęszczam na nie już dość długo, ale raczej tak po prostu przejść się, zobaczyć o co chodzi, niż dla wiedzy (coś w myśl zasady, że przyjaciół trzeba mieć blisko siebie, a wrogów jeszcze bliżej ;)). Jednak w tym roku prowadzący postanowił poprowadzić spotkania w jakimś bliżej ustalonym z góry harmonogramie i wymyślił przygotowanie do egzaminu 70-536. Tak więc każde kolejne spotkanie to omówienie zagadnienia z kolejnego rozdziału z książki przygotowującej do tego egzaminu.

Jako, że spotkania odbywają się pod hasłem „studenci dla studentów” (sam wymyśliłem :P) no to sami zapisywaliśmy się do przedstawienia jakiegoś działu. Zanim kartka z zapisami do mnie doszła najciekawsze tematy zostały już „zaklepane” no i zapisałem się na pierwszy wykład, co by przetrzeć szlaki.

Prezentację, jaką przygotowałem można zobaczyć tutaj, jest to skrótowy opis pierwszego działu opisującego podstawy .NETa (framework fundamentials).

A poziom prezentacji, cóż nie mnie to oceniać, ale podobno za szybko mówiłem (fakt miałem 1.5h, a wyrobiłem się w 20 min), no ale kurcze są to takie podstawy, że ciężko mówić o tym długo, o tym dogłębnie uczą studia, ja starałem się tylko pokazać jak to wygląda w .NET i jak to „zapisuje” się przy pomocy C kratka :P

2 listopada 2009 | .NET, C# | Brak komentarzy »

Jak wiadomo PHP demonem szybkoście nie jest i skrypty napisane w nim też do najszybszych nie należą, tak więc dość ważne jest abyśmy sami ich dodatkowo nie zwalniali. Poniżej zaprezentuję parę uwag, jak pisać skrypty w php, aby choć odrobinę szybciej chodziły, taka mała optymalizacja php ;)

po pierwsze echo jest szybsze niż print

przy wyświetlaniu znaków należy stosować ‚ zamiast „, gdyż w cudzysłowach możemy umieścić zmienne i wyświetlana jest ich wartość, a nie nazwa jak ma to miejsce w apostrofach, tak więc tekst umieszony między ” jest dodatkow przetwarzany przez co wydłuża się praca skryptu

przy wykonywaniu pętli, która ma sprawdzić wszystkie elementy tablicy należy najpierw odczytać ilość elementów w tablicy ($ilosc = count($tablica)) i używać zmiennej w pętli (for($i = 0; $i < $ilosc; $i++)), a unikać takiego zapisu (for($i = 0; $i < count($tablica); $i++))

przy podmienianiu napisów, lepiej stosować szybsze str_replace niż prag_replace

bloki „else if ” są szybsze niż switch/case

wytłumienie błędów za pomocą @ jest bardzo wolne i lepiej nie używać, gdy nie ma ogromnej potrzeby

stosowanie $row[‚id’] jest około 7 razy szybsze niż $row[id]

preinkrementacja (++$i) jest szybsza od postinkrementacji ($i++)

inkrementacja zmiennych w obiekcie ($this->i++) jest około 3 razy wolniejsza niż zmiennych lokalnych ($i++)

mam nadzieję, że te parę uwag choć odrobine pozwoli przyśpieszyć pisane przez was skrypty ;)

21 października 2009 | PHP | Brak komentarzy »

Od 2 dni teoretycznie mogę chwalić się wykształceniem wyższym, dokładnie jak to leci nie wiem, ale powinno być coś w stylu licencjat informatyki (nie mam jeszcze papierka, ale jak dostanę, na pewno napiszę ;)). Jak to przebiegał egzamin pisać mnie się też nie chce, napisze tylko tyle, że dostałem pytanie z działu, którego miało nie być, na pozostałe 2 odpowiedziałem i ocena 3, no nic, liczy się papier :P

Wpis ten nie pojawia się, w celach chwalenia się, ale raczej jako zakończenie pewnego etapu w życiu, teraz jeszcze magisterka, ale w międzyczasie samodokształcanie, za które zaraz się będę brał i mam nadzieję, że już niebawem będę mógł coś o postępach w tym kierunku napisać, bo przecież wyższe już do czegoś zobowiązuje :D

12 września 2009 | Inne | Brak komentarzy »

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

2 września 2009 | Inne, język D | Brak komentarzy »