Dec 12 2009

Pudzianowski vs. Najman

DSC_3333Wiem, Strongman czy walki MMA nie sa tematem tego bloga, ale sorry, nie moge sie powstrzymac. Miazga miazga. Po Najmanie spodziewalem sie czegos wiecej, ale Pudzian zaskoczyl mnie jeszcze bardziej. Jestem jego fanem i od lat sledze jego kariere jako Strongmana – jego sila przeraza. Najsilniejszy czlowiek swiata, … duzo mozna o nim mowic, ale zrozumie to jedynie ten kto interesuje sie silaczami. Ale MMA? Pudzian i MMA? Bylem nieco zaskoczony. Kto i jak moze pokonac takiego czlowieka? Musialby byc niewiarygodnie szybki, twardy i dokladny, jest ktos taki? Napewno nie jest to Najman, chociaz sam, nie chcialbym sie z nim konfrontowac, cwicze Aikido, cwiczylem wczesniej Jujitsu, troche machalem hantlami, i wiem co moze zrobic ponad 100kg rozpedzonej masy ciala. Wyobraz sobie jak dokladnie i jak silnie trzeba wyprowadzic cios, aby powalic ja na glebe. Heh. Mariusz najwyrazniej nie potrzebuje sie nad tym zastanawiac. 20 sekund okladania, bez jakiejkolwiek kontry, nawet mniej, liczac kiedy Najman zaczal w pokorze bic w mate ringu.

Gratulacje Mariusz!
Zycze powodzenia w MMA i dziekuje za silne doznania z ostatniej walki :)

Zdjecie pochodzi ze strony Mariusza.


Dec 11 2009

MySQL tradycyjnie – tworzenie, aktualizacja, usuniecie usera

Dzisiaj druga czesc MySQL tradycyjnie, ostatnio zabraklo manipulacji uzytkownikami, wiec teraz wlasnie o tym.
Zalozmy, ze chcemy dodac nowego uzytkownika lonio i nadac mu prawa do bazy danych o nazwie lonio_db.

Ustanawiamy polaczenie

czlowiek@maszyna:~$ mysql -u root -p
Enter password:
...
mysql>

Tworzymy bazke lonio_db

mysql> CREATE DATABASE lonio_db;
Query OK, 1 row affected (0,02 sec)

Dodajemy uzytkownika lonio i nadajemy mu prawa do bazy lonio_db

mysql> CREATE USER 'lonio'@'localhost' IDENTIFIED BY 'haslo';
mysql> GRANT ALL PRIVILEGES ON lonio_db.* TO 'lonio'@'localhost'
    -> WITH GRANT OPTION;

Lonio juz istnieje i ma pelne prawa do swojej bazki.

Zmienmy mu teraz haslo

mysql> UPDATE mysql.user SET Password=PASSWORD('nowe-haslo') WHERE User='lonio';
mysql> FLUSH PRIVILEGES;

No i w koncu mozemy usunac lonia i jego bazke

mysql> DROP USER 'lonio'@'localhost';
mysql> DROP DATABASE lonio_db;

Wiecej informacji na temat zarzadzania uzytkownikami znajdziesz tutaj.


Dec 10 2009

Apache i Tomcat – konektor AJP

Bylo juz o konfiguracji kontenera Apache-Tomcat, pojawil sie tez opis mixa Apache-PHP-MySQL, pozostaje jednak, jeszcze pare innych waznych konfiguracji, tj. Tomcat Workers (load balancing) czy konektor AJP, ktorym dzis sie zajmiemy.

W skrocie, konektor AJP sluzy do polaczenia dwoch punktow webowych protokolem AJP, np. serwer Apache na jednej maszynie oraz Tomcat na drugiej. Mozemy ukryc w ten sposob serwer Tomcat przed bezposrednim dostepem z zewnatrz – na przyklad.

1. Instalujemy Apache (na maszynie 192.168.1.1)

czlowiek@maszyna:~$ sudo apt-get install apache2

Domyslna instalacja na apache2-mpm-worker

czlowiek@maszyna:~$ apache2ctl -V
Server version: Apache/2.2.12 (Ubuntu)
Server built:   Nov 12 2009 22:51:51
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.8, APR-Util 1.3.9
Compiled using: APR 1.3.8, APR-Util 1.3.9
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
...

nie dziala najlepiej w konektorze AJP, wiec instalujemy apache2-mpm-prefork, ktory jest moze mniej wydajny, ale za to bardziej stabilny.

2. Instalujemy apache2-mpm-prefork

czlowiek@maszyna:~$ sudo apt-get install apache2-mpm-prefork

Tak jest poprawnie

czlowiek@maszyna:~$ apache2ctl -V
...
Server MPM:     Prefork
...
 -D APACHE_MPM_DIR="server/mpm/prefork"
...

3. Wlaczamy modul proxy_ajp

czlowiek@maszyna:~$ sudo a2enmod proxy_ajp

4. Konfigurujemy modul

czlowiek@maszyna:~$ sudo nano /etc/apache2/mods-enabled/proxy.conf

wlaczamy requesty i zmieniamy prawa

ProxyRequests On
Allow from all

5. Konfigurujemy konekta, otwieramy konfig apache

czlowiek@maszyna:~$ sudo nano /etc/apache2/sites-enabled/000-default

i dopisujemy linie

ProxyPass /examples/servlets/ ajp://192.168.1.5:8009/examples/servlets/

w wezle

<VirtualHost *:80>

gdzie adres ip 192.168.1.5 bedzie maszyna z zainstalowanym serwerem Tomcat.

Wiec, na drugiej maszynie konfigurujemy Apache-Tomcat. Tym razem pobieramy gotowa paczke – jezeli jednak instalacja, to zapraszam tutaj.

6. Pobieramy najnowsza paczke (na maszynie 192.168.1.5)

czlowiek@maszyna2:~$ sudo -i
root@maszyna2:~$ wget http://ftp.tpnet.pl/vol/d1/apache/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz

7. Ekstraktujemy i kopiujemy

root@maszyna2:~$ tar xzvf apache-tomcat-6.0.20.tar.gz -C /tmp
root@maszyna2:~$ mkdir /usr/local/tomcat6 && cp -R /tmp/apache-tomcat-6.0.20/* /usr/local/tomcat6

8. Testujemy Tomcata

root@maszyna2:~$ wget -q http://localhost:8080 -O /tmp/atest && cat /tmp/atest | grep -i "Apache Tomcat"
    <title>Apache Tomcat</title>
...

lub wpisujemy adres (http://localhost:8080) w ulubionej przegladarce

tomcat-start-page

9. Konfigurujemy Tomcata – otwieramy server.xml i upewniamy sie, ze ponizszy konektor jest odkomentowany.

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Teoretycznie wszystko dziala poprawnie, ale na wszelki wypadek restarty i testy

root@maszyna2:~$ /etc/init.d/apache2 restart
root@maszyna2:~$ /usr/local/tomcat6/bin/shutdown.sh
root@maszyna2:~$ /usr/local/tomcat6/bin/startup.sh

Po wpisaniu adresu http://192.168.1.1/examples/servlets/ dostaniemy strone z przykladami servletow na serwerze Tomcat z maszyny o ip 192.168.1.5

Oczywiscie jezeli port 8009/tcp na maszynie 192.168.1.5 jest zamkniety to trzeba go otworzyc dla polaczen z serwerem Apache zainstalowanym na maszynie 192.168.1.1


Dec 10 2009

Google Chrome Beta dostepna dla Linuxa

google-chrome-logoPare dni temu dostalem maila informujacego o dostepnosci Google Chrome dla systemu Linux. Oto kilka ciekawostek od zespolu Google Chrome, cytujac orginalny email:
~60 000 wierszy kodu specjalnie dla Linuksa,
23 wersje deweloperskie,
2713 poprawionych bledow w wersji Linux,
12 zewnetrznych wspolpracownikow pracujacych nad bledami w kodzie Google Chrome dla Linuksa oraz 48 zewnetrznych tworcow kodu

Paczke sciagamy z oficjalnej strony GC. Do wyboru, wersje 32 i 64 bit w debach (Debian/Ubuntu) i rpm (Fedora/openSUSE).

Podczas pierwszego uruchomienia, Chrome zaproponuje import ustawien – historia, ulubione, zakladki, wyszukiwanie, hasla – z innych przegladarek, np. Firefox’a.

gc-import-1gc-import-2

Mozemy pominac ten krok dla czystej konfiguracji Google Chrome. Wyszukiwarka, jak nie trudno sie domyslic – Google, ktora mozemy zmienic na Onet, WP, a nawet Bing ;) .
Technicznie nieco kuleje podobnie zreszta jak Safari (WebKit) – css’y, i wyswietlanie grafik, tj .ico.
google-chrome-linux
Zapraszam do testowania.


Dec 2 2009

Flex i klasy z “wieloma” konstruktorami

Jako, ze AS3 nie umozliwia przeladowania konstruktorow w klasach, malo tego, ukrywa konstruktory klas dziedziczonych, czym bardzo utrudnia tworzenie zlozonych obiektow, postaramy sie to obejsc, metoda “kontrolowany multi injection”.

Zalozmy, ze mamy klase Employee dziedziczaca po Person, ktora chcemy inicjowac na dwa sposoby:

wstrzykiwanie statyczne

public function Employee(name: String, surname: String, reward: uint = 0)
{
	super(name, surname);
	this._reward = reward;
}
...
var employee: Employee = new Employee("Jan", "Kowalski", 100);

wstrzykiwanie obiektowe

public function Employee(person: Object, reward: uint = 0)
{
	super(person.name, person.surname);
	this._reward = reward;
}
...
var employee: Employee = new Employee( { name : "Jan", surname : "Kowalski" }, 100);

Co musimy zrobic aby klasa Employee umozliwiala obydwie metody inicjacji? Przypomnij sobie jak wyglada obiekt Array. Masz? Zrobimy podobnie.

kontrolowany multi injection

public function Employee(...args)
{
	var name: String;
	var surname: String;
	var l: uint = args.length;
	if (l == 1 && (args[0] is Object)) {
		name = args[0].name;
		surname = args[0].surname;
	} else if (l == 2 && (args[0] is String) && (args[1] is String)) {
		name = args[0];
		surname = args[1];
	}
	if (name && surname) {
		super(name, surname);
	} else {
		throw new Error("Invalid arguments.");
	}
}

Czyz to nie “Multiple Constructors”? Prawie profesjonalnie ;)