Ten blog nie jest już rozwijany. Wraz ze wszystkimi artykułami zostały przeniesiony pod adres wmroczkowski.pl

Czy chcesz przejść pod nowy adres?

środa, 27 sierpnia 2008

EA Sports kontra użytkownicy TouTube

Dzisiaj trochę z innej beczki ale ciągle o programowaniu ;) Jak wiadomo napisanie bezbłędnego programu nie jest rzeczą łatwą, zwłaszcza jeśli chodzi o grę komputerową. Tylko programiści gier mogą wiedzieć jak wiele warunków musi zostać spełnionych i ile testów musi przejść program zanim zostanie ostatecznie skończona - a terminy gonią. Dotyczy to w szczególności gier, które ukazują się co roku, odświeżone, z nazwą różniącą się tylko rokiem na końcu. Wiecie już o jakie gry chodzi? Oczywiście, słynne gry sportowo-zręcznościowe EA Sports. Bezwzględni użytkownicy YouTube nie przepuszczą żadnej grze, jeżeli zauważą jakieś bugi, publikując błędy w postaci filmów w internecie. Wchodząc na YouTube możecie znaleźć mnóstwo tego typu filmów, wystarczy wpisać "game bugs" lub coś podobnego. Do tej pory nikt z tego powodu nie był specjalnie urażony; twórcy gier uczyli się na błędach a internauci się śmiali. Levinator25 myślał, że tak będzie również tym razem i zamieścił na YouTubie filmik z bug'iem z Tiger Woods PGA Tour 08, w którym mogliśmy zobaczyć jak nasza postać w grze cudownie chodzi po wodzie. Chciałbym zobaczyć minę Levinatora25, kiedy zobaczył odpowiedź EA Sports na jego film ;) Obejrzyjmy ją razem.

niedziela, 24 sierpnia 2008

Google i matematyka

Właśnie trafiłem na pewną ciekawostkę. Nasza ulubiona wyszukiwarka nie jest jednak idealna - wystarczy wejść na google.pl i sprawdzić ile to jest 399 999 999 999 999-399 999 999 999 998. My znamy wynik, ale czy google zna? A może to kolejny żart jego twórców, obdarzonych tak dobrze już znanym i nie do końca rozumianym poczuciem humoru?

niedziela, 17 sierpnia 2008

Podstawy HTML i CSS - wideo tutorial

Serfując w sieci znalazłem bardzo interesujący tutorial - można się z niego w 40 minut nauczyć podstaw HTML i kilka naprawdę istotnych rzeczy na temat CSS. Jeżeli ktoś zaczyna zabawę z tymi językami to naprawdę gorąco polecam zacząć od tego - to tylko 40 minut!


źródło: http://pl.youtube.com/watch?v=GwQMnpUsj8I&feature=rec-fresh

piątek, 15 sierpnia 2008

Mod_rewrite, czyli przyjazne adresy URL z .htaccess

Często zdarza się, że nasze adresy URL do podstron zaczynają nabierać naprawdę przerażająco długiej długości, np. /index.php?id=galeria&sid=2008&ssid=wakacje. Z takim adresami często nie radzą sobie roboty indeksujące strony, dlatego część podstron może po prostu zostać nie dodana do indeksu. Oczywistym minusem tak długich adresów jest również ich nieczytelność. Tutaj z pomocą przychodzi nam moduł Apache'a - mod_rewrite. Przede wszystkim należy sprawdzić w pliku konfiguracyjnym Apache'a czy nasz serwer go obsługuje, szukamy więc linijki LoadModule rewrite_module modules/mod_rewrite.so. Jeżeli jest odhashowana to wszystko w porządku, w przeciwnym wypadku usuwamy hasha (#). Jeżeli oczywiście nie masz dostępu do pliku konfiguracyjnego to po prostu wykonaj w jakimś skrypcie php polecenie phpinfo(); i odszukaj części odpowiadającej za uruchomione moduły - powinieneś tam znaleźć wpis odpowiedzialny za mod_rewrite. Jeżeli go nie znajdziesz to musisz się skontaktować z administratorem w celu uruchomienia tego modułu.
Mod_rewrite korzysta z wyrażeń regularnych, oto najważniejsze z nich:
. Dowolny znak
^ Oznacza początek napisu
$ Oznacznik końca (c$ znaczy, że ciąg tekstowy musi zakończyć się na c)
+ Wystąpi jeden lub więcej razy
* Zero lub więcej wystąpień
? Zero lub jedno wystąpienie
! Negacja wyrażenia
( Rozpoczyna grupowanie (przetwarzanie ciągu znaków, jakby był to pojedynczy element)
[ Rozpoczyna klasę znaków, np. dopasowane do przedziału od 0 do 9, to definicja klasy [0-9]

Przykładowy wpis do .htaccess może wyglądać tak:
RewriteEngine on
RewriteRule ^index.html$ index.php [L]

Pierwsza linia powoduje uruchomienie mod-rewrite, natomiast w drugiej widzimy już użycie wyrażeń regularnych. Taki zapis oznacza, że jeżeli na serwerze mamy plik index.php to możemy się również do niego odnieść wpisując index.html. Jeżeli chodzi o atrybut [L] to jest to skrót od Last rule i oznacza on, że linia w której się znajduję jest ostatnią linią, czyli kolejne reguły nie będą dalej wykonywane. Dodatkowo możemy dopisać atrybut [NC], który oznacza że to czy adres będzie wpisany dużymi literami czy małymi nie robi żadnego znaczenia, tak więc wpisując domeda.com/STRONA1/index.php otrzymamy to samo co przy wpisie domeda.com/strona1/index.php.
Teraz zajmijmy się już konkretnymi przykładami. Załóżmy, że nasza strona znajduję się pod takim adresem: www.strona.pl/menu.php?id=4. Aby adres był czytelny dla użytkownika dobrze jakby był takiego formatu: www.strona.pl/menu-4. Aby otrzymać taki wynik wystarczy dodać do .htaccess następującą linkijkę: RewriteRule ^menu-([^-]+).html$ menu.php?id=$1. Teraz po kolei wyjaśnię ten zapis: ([^-]+) oznacza wszystkie znaki z wyjątkiem myślnika, w takim przypadku za wykluczenie odpowiedzialny jest znak ^, natomiast + oznacza wystąpienie znaku raz lub więcej razy. Jeżeli np. chcemy aby tam były umieszczone wyłącznie liczby to wpisujemy ([0-9]+) . Jeśli chodzi o okrągłe nawiasy oznaczają one zmienne - w tym przypadku to co jest w nawiasie w pierwszej części ciągu jest przenoszone do drugiej części do zmiennej $1 i wyświetlane w URL. Jeżeli nawiasów byłoby więcej to odpowiadałyby one kolejno zmiennym $1 $2 $3 itd.

Tutaj bardziej czytelny przykład:
RewriteEngine On
RewriteRule (aktualnosci)/(kraj)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3
#lub
RewriteRule (+)/(+)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3
#lub
RewriteRule ([a-z]+)/([a-z]+)/([0-9]+) /wyswietl.php?what=$1&skad=$2&id=$3

Zamieni on adres http://moja-strona.pl/wyswietl.php?what=aktualnosci&skad=kraj&id=108 na: http://moja-strona.pl/aktualnosci/kraj/108. Po więcej szczegółów odsyłam do dokumentacji Apachea.

.htaccess i blokowanie dostępu do stron

Wcześniej pisałem o blokowaniu dostępu do strony za pomocą pliku .htpasswd, jednak możemy również zablokować dostęp do naszych stron przez określony adres IP lub przez całe ich grupy. Tutaj jak zwykle przydatność takiego blokowania jest jedynie ograniczona przez naszą wyobraźnię. Adresy blokujemy komendą deny, np.:
deny from 111.222.333.444

Jeżeli chcemy ograniczyć dostęp wszystkim np. do jakiejś strony:
deny from all

Istnieje również możliwość udostępnienia stron tylko wybranym adresom:
deny from all
allow from 111.222.333.444
W pierwszej linii blokujemy dostęp wszystkim adresom, a w drugiej linii dajemy dostęp określonym adresom IP.
Często bardzo ważne jest nadanie kolejności przetwarzania wpisów, do tego celu używamy Order allow, deny. Taki zapis powoduje, ze najpierw przetwarzane są instrukcje odpowiedzialne za dostęp a następnie te za blokowanie. Rozważmy następujący przykład:
order allow, deny
deny from 111.222.333.444
deny from 555.666.777.888
allow from all
Jeżeli w takim przypadku nie użylibyśmy dyrektywy order allow, deny to najpierw zostały by zablokowane adresy 111.222.333.444 i 555.666.777.888 po to tylko żeby za chwilę zostały odblokowane dyrektywą allow from all.
Mamy również możliwość blokowania hostów z jakiejś określonej domeny. Robimy to tak samo jak powyżej, jednak zamiast adresu IP wpisujemy adres domeny, np.: deny jakas.domena.com.

niedziela, 10 sierpnia 2008

Budowa stron błędów w .htaccess

Kontynuując tworzenie pliku .htacces napiszę trochę istotnych informacji na temat stron błędów a Apache. Za pomocą odpowiednich plików w .htaccess możemy tworzyć własne strony błędów. HTTP posiada numeryczne kody, które odpowiadają wynikom poszczególnych operacji jak i też błędów. Dzielą się one na następujące grupy:
1XX - kody informacyjne;
2XX - kody powodzenia;
3XX - kody przekierowania;
4XX - kody błędów aplikacji po stronie użytkownika;
5XX - kody błędów aplikacji po stronie serwera;

My zajmiemy się tymi dwoma ostatnimi, czyli komunikatami o błędach. Na początek musi wiedzieć dokładnie jakie kod co oznacza, a więc (źródło:http://czytelnia.reporter.pl/rozdzialy/aparec.pdf):
4xx — kody błędów klienta:
400 Złe zadanie
401 Dostęp nieautoryzowany
402 Wymagana opłata (niestosowane)
403 Dostęp zabroniony
404 Nieznaleziony
405 Metoda niedozwolona
406 Nie do zaakceptowania
407 Wymagane uwierzytelnienie proxy
408 Upłynął limit czasu zadania
409 Konflikt
410 Nieobecny
411 Potrzebna długość
412 Niespełnione warunki wstępne
413 Zadanie zbyt długie
414 Zadanie URI zbyt długie
415 Nieobsługiwany rodzaj medium
416 Zakres zadania niezadowalający
417 Oczekiwanie niespełnione
5xx — kody błędów serwera:
500 Wewnętrzny błąd serwera
501 Niezaimplementowany
502 Zła brama
503 Usługa niedostępna
504 Upłyną limit czasu bramy
505 Nieobsługiwana wersja protokołu HTTP

Wszystko co należy zrobić aby odwołać się do określonego błędu to dodać do pliku .htaccess następującą linię:
ErrorDocument 403 /errors/403.html
W katalogu /errors/ umieszczamy strony z opisami błędów, które zostają uruchomione w momencie wystąpienia danego błędu.
Oczywiście można pójść na łatwiznę i załatwić to bez tworzenia nowych stron o błędach w html tworząc zwykłe przekierowanie:
ErrorDocument 404 http://www.google.pl/search?hl=pl&client=firefox-a&rls=org.mozilla%3Apl%3Aofficial&hs=pC6&q=space+of+code&btnG=Szukaj&lr=lang_pl

Kolejną możliwością jest zwyczajne wyświetlanie prostego tekstu, np.:
ErrorDocument 403 "Ten serwer wymaga uwierzytelnienia, musisz się zalogować"

W skrócie to tyle na temat stron błędów w .htaccess. Reszta zależy już tylko od waszej wyobraźni. Dobrej zabawy!

sobota, 9 sierpnia 2008

Tajniki pliku .htaccess - budowa od podstaw

Dzisiaj opowiem trochę o pliku który tak bardzo ułatwia mi wszelkie prace związane z Apache'm - mowa tu o .htaccess. Oczywiście sam plik jest zwykłym plikiem tekstowym w którym zapisujemy ustawienia serwera Apache dlatego należy uważać na wszelkie edytory tekstowe, które zapisują pliki z rozszerzeniem .txt bo wtedy zwyczajnie nasz plik nie będzie działał. A więc krótko; jeżeli chcesz zabezpieczyć pewne strony lub pliki na swoim serwerze przed niepowołanymi użytkownikami, zmienić wyświetlany w URL adres, zablokować niepożądanych gości po adresie IP, wyświetlać tylko niektóre pliki z katalogu, tworzyć przekierowania, zdefiniować jakie typy rozszerzeń będą otwierane przez jakie programy, wybrać czy plik ma być otwierany czy zapisywany na dysku i wiele wiele innych rzeczy to zdecydowanie powinieneś zapoznać się z plikiem .htaccess!
Ja zacznę od podstaw. Warto wiedzieć jak budować taki plik, więc zacznijmy od najbardziej praktycznej rzeczy jaki istnieje w programowaniu - od komentarzy. Komentarze w .htaccess tworzy się podobnie jak w PHP, czyli poprzez dodanie znaku # na początku linii. Warto również pamiętać aby każde linie zamykać enterem.

Do dzieła! Na początek zadbałbym o odpowiednie uprawnienia dostępu do pliku. Optymalnie będą to ustawienia 644, które pozwolą na dostęp do pliku przez serwer ale uniemożliwią jego zmianę z poziomu przeglądarki - wpisujemy w shellu Chmod 644 .htaccess.
Pierwszym naszym wpisem będzie określenie domyślnego pliku strony WWW, do tego celu użyjemy DirectoryIndex. Tutaj możemy podać kilka nazw głównych plików, które oddzielamy spacjami np. DirectoryIndex index.php index.html index.htm glowna.php main.html. Tutaj ważna jest kolejność, jeżeli istnieje plik index.php to on będzie naszym domyślnym, jeżeli nie istnieje to następny w kolejności, czyli index.html. To jest bardzo przydatne w przypadku, gdy nasza strona ma trochę inną strukturę niż standardy, np. naszym startowym plikiem może być start.php, wtedy ten plik zostanie wczytany po wejściu na nasz serwer. Oczywiście jeżeli planujemy jakieś prace remontowe i nie chcemy żeby nasi goście oglądali ten bałagan dajemy DirectoryIndex roboty.html i wtedy nasi goście oglądają piękną informację na temat tego co się dzieje na stronie.

Teraz parę zdań na temat powiązań typów plików, czyli MimeType. Są to rozszerzenia, które zwracane są przeglądarce po znalezieniu na serwerze danego typu pliku. Chodzi tutaj o reakcję naszej przeglądarki na odczyt pliku z jakimś rozszerzeniem. Oczywiście większość rozszerzeń jest zdefiniowana domyślnie na naszym serwerze, czyli np. po kliknięciu w plik audio pojawia nam się monit odnośnie ściągnięcia pliku na dysk. Czasami jednak zdarza się, że chcemy aby konkretne rozszerzenia były otwierane trochę inaczej, np. jeśli chcemy niektóre pliki ściągać na dysk zamiast ich wyświetlać wpisujemy:
AddType application/octet-stream .pdf .gz

Możemy również wymusić otwieranie odpowiednich typów w plików w wybranych przez nasz programach - bardzo przydatne przy spakowanych plikach. Poniżej znajduję się listing przypisanie większości znanych formatów do aplikacji źródło: Internet Maker:
1. #css, html, xml, asp, flash i inne
2. AddType text/css .css
3. AddType application/xhtml+xml .xhtml
4. AddType text/html .shtml
5. AddType text/xml .xml
6. AddType text/html .asp
7. Addtype application/x-httpd-php .php
8. AddType application/x-shockwave-flash .swf
9. AddType application/x-director .dir .dcr .dxr .fgd
10. AddType application/x-authorware-map .aam
11. AddType application/x-authorware-seg .aas
12. AddType application/x-authorware-bin .aab
13. AddType image/x-freehand .fh4 .fh5 .fh7 .fhc .fh
14. AddType application/x-java-applet .class
15. # dokumenty
16. AddType application/pdf .pdf
17. AddType application/msword .doc
18. #multimedia
19. AddType audio/mpeg .mp3
20. AddType video/x-msvideo .avi
21. AddType audio/x-wav .wav
22. AddType video/quicktime .mov .qt
23. AddType video/x-ms-asf .asf .asx
24. AddType audio/x-ms-wma .wma
25. AddType audio/x-ms-wax .wax
26. AddType video/x-ms-wmv .wmv
27. AddType video/x-ms-wvx .wvx
28. AddType video/x-ms-wm .wm
29. AddType video/x-ms-wmx .wmx
30. AddType application/x-ms-wmz .wmz
31. AddType application/x-ms-wmd .wmd
32. #skompresowane
33. AddType application/zip .zip
34. AddType application/x-gzip .gz
35. AddType application/x-gtar .gtar
36. AddType application/x-rar-compressed .rar
37. AddType application/octet-stream .dmg
38. AddType application/x-7z-compressed .7z
39. #graficzne
40. Addtype image/jpg .jpg
41. Addtype image/gif .gif
42. #pozostałe
43. AddType application/x-bittorrent .torrent
44. AddType application/vnd.rn-realmedia .rm
45. AddType audio/vnd.rn-realaudio .ra .ram
46. AddType video/vnd.rn-realvideo .rv

A teraz bardzo przydatna informacja dla osób, które mają problemy z kodowaniem tekstu na stronach. Dzięki odpowiednim wpisom w .htaccess możemy ustawić kodowanie dokumentów, np.:
AddDefaultCharset ISO-8859-1
AddDefaultCharset ISO-8859-2


Za pomocą pliku .htaccess można bardzo łatwo i szybko wprowadzić autoryzację użytkowników dla danego katalogu. Do tego celu będziemy musieli utworzyć plik .htpasswd w którym będą wpisywani użytkownicy oraz ich zakodowane hasła. Na stronie tools.dynamicdrive znajdziemy edytor pliku .htpasswd - wystarczy wypisać użytkowników oraz ich hasła, a skrypt wygeneruje nam odpowiedni kod do wklejenia do naszego pliku. Standardowo wpis w .htpasswd wygląda tak:
uzytkownik:/YKTtGojL9BVA
Skrypt ze strony dynamicdrive wygeneruje wam również kod do wklejenia do pliku .htaccess, który będzie miał postać:
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /home/mysite/.htpasswd
AuthGroupFile /dev/null
require valid-user
W polu restricted area możemy wpisać co chcemy, np. "Ta strefa wymaga autoryzacji, zaloguj się" - to właśnie wyświetli się podczas próby wejścia na zabezpieczony teren. AuthUserFile musi kierować do naszego pliku z hasłami, natomiast require valid-user odpowiada za obszar jaki ma być zabezpieczony hasłem. Jeżeli zostawimy tak jak jest to wtedy cała strona będzie wymagała zalogowania, natomiast jeżeli chcemy zabezpieczyć hasłem tylko jeden plik, np.:dane_osobowe.html to dodajemy odpowiednie tagi:
<files html="dane_osobowe.html">
require valid-user
</files>
Zabezpieczanie w ten sposób strony dotyczy tylko połączeń HTTP. Jeżeli ktoś połączy się z serwerem przez FTP to takie uwierzytelnienie nie będzie działać.

W kolejnym poście opiszę strony błędów, które możemy tworzyć za pomocą pliku .htaccess.

poniedziałek, 4 sierpnia 2008

Budujemy panel w PHP do zarządzania adresami sieci w Linux w oparciu o edycję pliku /etc/network/interfaces

Dzisiaj zajmiemy się budową panelu w PHP, który poprzez proste wpisywanie adresów w pola tekstowe będzie nam edytował plik /etc/network/interfaces po czym zrestartuje automatycznie sieć. Jest to bardzo przydatne jeżeli ktoś zarządza serwerem bądź ruterem na linuxie i zamiast łączyć się przez SSH po prostu loguje się na stronę jako admin lub ktokolwiek i tam swobodnie i bez przeszkód wpisuje swoje ustawienia sieci. Całość tłumacze w oparciu o Debiana.
Zaczynając pisać kod w PHP, który wykonuje pewne polecenia przez przez konsole należy zaznajomić się z prawami dostępu w linuxie. Jak wiadomo domyślnie wszelkie skrypty linuxa, które służą do edycji systemowych ustawień należą do właściciela i grupy root. Niestety (albo stety) nie możemy (nie chcemy) uruchomić serwera apachea jako root ponieważ jest to wysoce ryzykowne dla naszego serwera. W standardzie apache uruchamia wszelkie skrypty jako użytkownik www-data lub po prostu 33. Dlatego właśnie musimy zmienić właściciela oraz grupę wszystkich plików które będą przez nas używane na www-data.
Oto lista plików, których właścicieli musimy zmienić poleceniami: chown www-data [plik] oraz chgrp www-data [plik]:
1. /etc/network/interfaces
2. /etc/init.d/networking
3. /etc/network/run/ifstate

Ok, jeżeli mamy już zmienione uprawnienia możemy zabrać się za nasz panel, ale najpierw rzućmy okiem na nasz plik /etc/network/interfaces. U mnie wygląda on tak:
auto lo
iface lo inet loopback
up ip l s imq0 up && ip l s imq1 up
auto eth0
iface eth0 inet static
address 212.244.101.111
netmask 255.255.255.53
network 10.5.1.0
broadcast 10.5.1.10
gateway 10.5.1.1
up echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
auto eth1
iface eth1 inet static
address 212.244.101.129
netmask 255.255.255.128
network 212.244.101.128
broadcast 212.244.101.255
up route add -host 212.244.101.244 dev eth1
auto eth1:1
iface eth1:1 inet static
address 10.10.1.1
netmask 255.255.0.0
network 10.10.1.1
broadcast 10.10.1.255
auto eth1:0
iface eth1:0 inet static
address 172.16.171.1
netmask 255.255.255.0
network 172.16.171.0
broadcast 172.16.171.255


Tutaj każdy będzie musiał się wykazać inicjatywą i zbudować własny kod PHP pod swój plik interfaces.
Aby zbudować panel będziemy musieli utworzyć dla pliki PHP: panel.php i panel_edit.php.
Tak mniej więcej będzie wyglądał plik panel.php:


A tak będzie wyglądał nasz plik panel_edit.php:


Wszelkie szczegóły starałem się umieścić w kodzie w komentarzach. Kod nie jest skomplikowany, więc myślę że każdy sobie poradzi z jego zrozumieniem. W razie problemów proszę pisać w komentarzach - postaram się rozwiać wszelkie wątpliwości.