Niedawno przeglądając stronę z trasami rowerowymi natrafiłem na ciekawe wykresy. Można było na nich zobaczyć przekrój wysokościowy trasy, dzięki czemu widać w których momentach są podjazdy lub zjazdy. Pomysł bardzo ciekawy, jednak jeszcze ciekawsze było dojście do tego w jaki sposób te dane są generowane.
Na szczęście Google udostępnia bardzo fajne i proste w obsłudze mechanizmy umożliwiające wizualne stworzenie owych wykresów. Właściwie wszystko będzie się sprowadzać do pobrania danych za pomocą API, przetworzenie ich oraz stworzenie wykresu. A więc do dzieła!
Mapa z trasą
Na podstawie współrzędnych geograficznych jesteśmy w stanie wygenerować mapkę z trasą. Ja będę się posługiwał trasą Kraków – Zakopane – Bielsko-Biała. Mapa wygląda następująco:

Do stworzenia takiej mapy użyjemy Google Static Map API. Pełną dokumentację możemy obejrzeć pod tym adresem. Zasada działania jest prosta: podajemy współrzędne punktów oraz rozmiar i typ mapy, a cała reszta zrobi się sama.
Nie wiele osób zdaje sobie sprawę jakie możliwości posiada biblioteka GD, służąca do manipulacji obrazkami. Większość początkujących programistów używa jej głównie do tworzenia prostych wykresów, grafik, skalowania zdjęć, itp. Jednak to tylko urywek możliwości jakie posiada owa biblioteka.
Pokażę dzisiaj w jaki sposób można szybko i prosto tworzyć różnego efekty ze zdjęcia. Będziemy korzystać z funkcji imagefilter(), która została dołączona do PHP 5. Śmiało mogę powiedzieć, że za jej pomocą możemy osiągnąć podobne efekty jak w PhotoShop’ie, czy Gimp’ie. A więc do dzieła!
Składnia funkcji
Funkcja imagefilter() wymaga podania od nas co najmniej dwóch parametrów: uchwytu do obrazka, którym będziemy manipulować oraz nazwy filtru jaki na owym obrazu zastosujemy. Pozostałe parametry są opcjonalne.
Aby zobaczyć efekty poszczególnych filtrów będę operował na tym samym obrazku:
Fotografia pochodzi z rąk znajomego ze studiów. Można ją obejrzeć pod tym adresem.
Wszystkie filtry będziemy stosować w poniższym kodzie:
<?php
$image = imagecreatefromjpeg('nina.jpg');
//FILTR, KTÓRY CHCEMY ZASTOSOWAĆ
header('Content-type: image/jpeg');
imagejpeg($image);
Przykładowo, aby lekko rozjaśnić zdjęcie nasz plik będzie wyglądał następujaco:
<?php
$image = imagecreatefromjpeg('nina.jpg');
imagefilter($image, IMG_FILTER_BRIGHTNESS, 20);
header('Content-type: image/jpeg');
imagejpeg($image);
?>
Ale o poszczególnych filtrach trochę niżej.
Jasność
Aby rozjaśnić lub przyciemnić zdjęcie musimy zastosować filtr IMG_FILTER_BRIGHTNESS z parametrem wskazującym jak bardzo nasze zdjęcie ma się zmienić.

imagefilter($image, IMG_FILTER_BRIGHTNESS, 20);
Tworząc strony internetowe, zwłaszcza te „firmowe”, czasami zachodzi potrzeba dodania obsługi innych języków, aniżeli tylko polski. Oczywiście możemy przygotować różne pliki HTML, ale problem zaczyna się, np. podczas zmiany struktury strony. Możemy temu zapobiec, tworząc prostą klasę w PHP, która w prosty sposób pozwoli nam na stworzenie wielojęzycznej strony.
Nasza klasa będzie opierała się o wzorzec projektowy – singleton. Pozwoli zaoszczędzić nam to ilość operacji wykonywanych przez serwer, a ponadto będziemy mogli odwoływać się do statycznych metod klasy.
Na początek struktura plików. Będzie się ona prezentowała następująco:
- index.php – główny plik naszej strony internetowej
- lang.class.php – plik z naszą klasą
- langs – folder przechowujący pliki językowe
- pl.php – poszczególne języki
- en.php
- de.php
- ru.php
Na samym początku musimy wiedzieć jak powinien wyglądać taki system. Ja dałem sobie takie wymagania:
- Maksymalnie uproszczona procedura dodawania nowego języka
- Szybka i bezproblemowa instalacja
- Powinien działać bez większych ingerencji w stronę
Nasz skrypt będzie działał w PHP5 – dzięki temu będziemy mogli bezproblemowo i szybko napisać nasz sterownik. Zaczniemy od pliku lang.class.php.
Główna klasa
<?php
class Lang
{
private $languages = array('pl' => 'Polski', 'en' => 'English',
'de' => 'Deutsch', 'ru' => 'Русский');
private $current_language = FALSE;
private $lines = array();
private static $instance = FALSE;
Nasza klasa będzie się nazywała Lang. W jej nagłówku umieścimy kilka właściwości.
$languages będzie tablicą, która będzie przechowywała dostępne języki. Jako klucz podajemy skróconą nazwę języka, a jako zawartość nazwę języka. Dzięki temu, dopisanie nowego języka jest banalnie proste.
Właściwość $current_language będzie przechowywała aktualnie obsługiwany język, natomiast w $lines umieścimy poszczególne linie plików językowych, aby można było się do nich szybko odwołać.
Ostatnim elementem jest statyczna właściwość $instance. To dzięki niej będziemy mogli odwoływać się do klasy za pomocą statycznych metod. Ale o tym później.
Wszystkie te zmienne są prywatne, gdyż nie będzie potrzeby edytowania ich z zewnątrz.
public function __construct()
{
$this->set_language();
}
Zanim stworzymy naszą pierwszą aplikację warto odpowiednio skonfigurować naszego frameworka. Jeśli o to chodzi, to Kohana może pochwalić się ogromnym wachlarzem ustawień. Skonfigurować można niemalże wszystko: od głównego adresu strony, aż po sterowniki z jakich będzie korzystała aplikacja. KohanaPHP przetrzymuje całą konfigurację w katalogu /config odpowiednio w katalogach /system i /application. Domyślnie wszystko znajdziemy w tym pierwszym, jednak aby uniknąć problemów przy aktualizacji lepiej przenieść odpowiedni plik do katalogu /application i tam go wyedytować.
Podstawowa konfiguracja
Głównym plikiem w którym przechowywana jest konfiguracja frameworka jest plik config.php. Znajdziemy w nim ogólne ustawienia związane ze stroną. Najważniejsze z nich to:
$config['site_domain'] = 'http://nasza-strona.pl';
Adres pod którym znajduje się nasza aplikacja. Na jego podstawie generowane są między innymi wszystkie hiperłącza na stronie. Możemy pozostawić tą wartość pustą – wtedy adres zostanie wykryty automatycznie.
W dzisiejszych czasach przy projektowaniu strony internetowej nie liczy się już tylko wygląd i treść. Coraz wiele osób tworząc strony projektuje je typowo pod pozycjonowanie: odpowiednie tytuły stron, przyjazne linki, mapy stron, itp. Wszystkie te techniki znacząco mogą wpłynąć na wysokość naszej strony w wyszukiwarkach internetowych.
Dzisiaj chciałbym pokazać jak w prosty i zarazem skuteczny sposób stworzyć przyjazne tytuły stron. Będzie to pierwsza część wpisów na temat pozycjonowania strony od strony serwera. Jeżeli będziemy odpowiednio korzystać z funkcji, jakie oferuje nasz serwer, możemy bardzo wpłynąć na wypozycjonowanie strony.
Podczas projektowania strony internetowej, zazwyczaj można spotkać dwa rodzaje budowania strony:
- za pomocą pliku
index.php, który wczytuje w konkretnym miejscu plik z zawartością danej podstrony,
- za pomocą plików z podstronami, w których wczytywany jest nagłówek i stopka.
Stworzymy system, który będzie mógł obsługiwać obydwa powyższe metody. Na początku prześwietlmy kod HTML naszej strony internetowej. Zazwyczaj ma on taką strukturę:
Jeśli wczytujemy zawartość podstrony w <body> zazwyczaj robimy to w taki, lub podobny sposób:
if(isset($_GET['page']))
include($_GET['page'].'.php');
else
include('a.php');
Oczywiście powyższy przykład jest tylko poglądowy i nie radzę go używać ze względu na bezpieczeństwo. Ale wracając do tematu: sposób ten jest bardzo powszechnie używany i jest bardzo prosty w implementacji. Jednak jeśli chcemy wpłynąć na tytuł strony, to możemy się natknąć na problem. Zauważmy, że tytuł jest ustalany praktycznie na samym początku strony, natomiast podstrona w dalszej części. Nie możemy więc wyświetlić zmiennej pobranej z pliku. Wiec jak to obejść?
Możemy skorzystać z buforowania strony internetowej. Polega ona na wczytaniu całej strony do pamięci i na samym końcu wyświetleniu jej. W dobie szybkich serwerów cała operacja ma znikomy wpływ na szybkość ładowania strony. Zobaczmy jak skorzystać z tej metody.
Kohana składa się z trzech podstawowych części: system, modules i application. W ten sposób możemy łatwo i szybko pisać nasze aplikację – jest to tzw. budowa hierarchiczna. Oznacza to, że przy próbie wykonania określonej czynności (wywołanie kontrolera, modelu, widoku, itp.) Kohana zaczyna szukać w najważniejszej części, czyli application. Jeżeli nie znajdzie tam tego czego potrzebujemy przeszukuje po kolei katalog modules, a na końcu system. Jeżeli i tam nic nie znajdzie – wyświetli komunikat o błędzie.
Jednak skąd mamy wiedzieć w którym katalogu mamy kodować? Można to łatwo sprawdzić:
- system – jądro naszego systemu. To tam znajdują się wszystkie podstawowe pliki z klasami, konfiguracją, itp. Właściwie nie powinno się nic zmieniać w tej części aplikacji, gdyż w przypadku aktualizacji systemu utracimy wszystkie zmiany.
- modules – w tej części umieszczamy pliki, które są na tyle uniwersalne, że można je użyć np. w innym projekcie. Mowa tu o sterownikach map, logowaniu użytkowników, bibliotekach archiwizujących, itp.
- application – najważniejsza część naszej aplikacji. To tutaj znajdują się praktycznie wszystkie pliki odpowiadające za działanie i wygląd naszego serwisu.
Jeśli przyjrzymy się bliżej podanym katalogom, to zobaczymy, że każdy z nich składa się z podobnych katalogów. Są to:
- config – jak nazwa wskazuje znajdziemy tam konfigurację poszczególnych ustawień frameworka. To tam ustalamy np. jaki adres ma mieć nasza strona, jak powinna wyglądać struktura adresów, itp.
- controllers – podstawowa część każdej aplikacji. To z poziomu kontrolerów decydujemy jak ma działać każda podstrona, z jakiego szablonu ma korzystać, jakie zapytania ma wykonać. To kontroler odpowiada za przetworzenie wszystkich informacji i zwróceniu wyniku użytkownikowi.
- helpers – czyli pomocniki – proste funkcje, które są często używane przy pisaniu aplikacji, a równocześnie nie są za bardzo rozbudowane (w porównaniu do bibliotek). Przykładem „pomocnika” jest funkcja obcinająca długie wyrazy – często się jej używa, a jednocześnie nie jest bardzo rozbudowana.
- hooks – czyli „haki” – pozwalają rozbudować aplikację o dodatkowe, niestandardowe funkcjonalności.
- i18n (skrót od ang.
internationalization) – katalog z pakietami językowymi naszej aplikacji. Przydatne przy tworzeniu wielojęzycznych stron internetowych.
- libraries – biblioteki to rozbudowane, wielofunkcyjne klasy do obsługi naszej aplikacji. Zawierają one powiązane ze sobą funkcje, które tworzą „jednolitą” całość. Np. klasa do obsługi bazy danych: możemy za jej pomocą dodawać, edytować, czy usuwać dane z bazy.
- models – modele służą do pobierania informacji z bazy danych. Umieszczając zapytania w tej części możemy logicznie rozdzielić dane od mechanizmu działania strony.
- views – czyli pliki z pseudo-szablonami. Przechowując pliki w tym katalogu możemy rozdzielić logikę strony od jej wyglądu. Jeżeli w przyszłości będziemy chcieli zmienić wygląd naszej strony, to możemy zrobić to w prosty sposób, bez ingerencji w mechanizm działania strony.
KohanaPHP jest jednym z lepszych frameworków pisanych pod PHP. Początkowo był on oparty na innym frameworku – CI, lecz z czasem został na nowo przepisany.
Podstawową zaletą Kohany jest całkowite przejście na PHP5, a co za tym idzie, możemy w pełni stosować możliwości tego języka. CodeIgniter, choć jest bardzo dobrym i prostym frameworkiem, to jednak ciągłe przywiązanie do PHP4 nie pozwala w pełni na jego rozwój.
Zalety KohanaPHP
- Pisana całkowicie w PHP5: możemy korzystać z takich dobrodziejstw jak automatyczne ładowanie klas, przeciążenia, interfejsy, itp.
- Podobne działanie do CodeIgniter’a, a co za tym idzie przesiadka na nowy framework jest prosta i łatwa.
- Pisana przez społeczność, a nie firmę. Jeżeli jesteś programistą i chcesz podzielić się swoją wiedzą z innymi, to sam możesz dopisać jakiś moduł, czy poprawkę do Kohany. Nie musisz już czekać, aż ktoś łaskawie zainteresuje się problemem i stworzy nową wersję. Jeżeli nie chcesz czekać na nową wersję, zawsze możesz ściągnąć wersję z repozytorium, która jest nieustannie uaktualniana.
- Brak konfliktów nazw, co nieraz było uciążliwe w CI. Teraz możesz śmiało tworzyć jednolity system, złożony z kontrolera, modelu i widoku, bez obawy, że pojawią się błedy w nazewnictwie.
- Brak „zabijania” tablic superglobalnych jak to miało miejsce w CI. Ty sam decydujesz z jakich danych chcesz korzystać.
- Poza wzorcem MVC, na którym jest oparta Kohana, masz ogromną swobodę w projektowaniu swojej aplikacji.
- W 100% kompatybilny z UTF-8. Już nie musisz martwić się o to, że na stronie będą „krzaki”.
Cała KohanaPHP oparta jest na wzorcu MVC, czyli Model-Widok-Kontroler. Pozwala to oddzielić część prezentacyjną (widok) od części logiki (kontroler). Dzięki temu, gdy chcemy w naszej stronie zmienić szatę graficzną, możemy zrobić to bez jakiejkolwiek ingerencji w główną część aplikacji.
Patrząc po statystykach bloga dużo osób wchodzi z zapytania „jak odczytać tablicę getimagesize”. Powiem, że trochę mnie to zaskoczyło, gdyż dotychczas mało wspominałem na temat tej funkcji. Jednak skoro lud nalega, to nie wypada mu odmówić.
Funkcja getimagesize(), jak sama nazwa mówi, pobiera informacje o obrazku i zwraca je w postaci tablicy. Za jej pomocą możemy odczytać dane z obrazków typu GIF, PNG, JPEG (od PHP v4), TIFF (v4.2), SWC (v4.3), JPC, JP2, JPX, JB2, XBM, czy WBMP (v4.3.2).
Przejdźmy jednak do praktycznego zastosowania. Utwórzmy i wykonajmy poniższy kod:
<?php
$info = getimagesize('obrazek.jpg');
echo '<pre>';
print_r($info);
?>
Na ekranie ujrzymy takie dane (wartości są uzależnione od właściwości obrazka):
Array
(
[0] => 168
[1] => 119
[2] => 2
[3] => width="168" height="119"
[channels] => 3
[bits] => 8
[mime] => image/jpeg
)
Jest to tablica z wartościami, zwróconymi przez getimagesize(). Przejdźmy teraz do ich analizy.
Wiele z nas nie zdaje sobie sprawy z bezpieczeństwa naszej strony internetowej. Włamanie do serwisu może skończyć się w najlepszym przypadku skompromitowaniem, nieraz utratą całych danych. Podobnie jest w przypadku uszkodzeń serwera, czy po prostu przypadkowym usunięciem bazy danych. Nieraz nasz kilkuletni dorobek ginie w kilka sekund. Dobrym przykładem jest tu serwis społecznościowy ma.gnolia.com. Cała baza danych została zniszczona w wyniku uszkodzenia serwera. Niestety serwis zakończył swoja działalność.
Aby jednak nas nie spotkała taka „niespodzianka” powinniśmy regularnie tworzyć kopie zapasowe – nie tylko plików, ale i bazy danych. Najwygodniejszym rozwiązaniem jest chyba użycie wbudowanej w PHPMyAdmin’a funkcji „Eksportuj”. Jednak każdorazowe wchodzenie, logowanie i eksportowanie jest trochę nużące i z czasem kłopotliwe. Możemy jednak zautomatyzować ten proces, używając np komendy system() z odpowiednimi parametrami. Lecz nie jest to najlepsze rozwiązanie, gdyż większość hostingów blokuje tą funkcję ze względów bezpieczeństwa. Co więc nam pozostało? Skorzystanie z gotowych rozwiązań, albo napisanie własnego skryptu.
Pokażę dzisiaj w jaki sposób stworzyć prostą klasę do generowania zrzutu bazy danych. Klasa będzie oparta na PHP5, jednak kilka drobnych zmian spowoduje, że będzie działała także pod starszą wersją. No to zaczynamy…
Tworzenie skryptu
<?php
class DbDump
{
public $drop = TRUE;
private $db;
private $sql;
private $fields = array();
public function __construct($host = FALSE, $login = FALSE, $pass = FALSE, $db = FALSE)
{
@mysql_connect($host, $login, $pass)
or die('Blad przy polaczeniu z baza danych');
@mysql_select_db($db)
or die('Blad przy wyoborze bazy danych');
mysql_query('SET NAMES utf8');
$this->db = $db;
}
Nasz skrypt zaczynamy od stworzenia kilku zmiennych, które będą używane w naszej klasie. $drop będzie odpowiedzialna za przechowywanie informacji, czy do zrzutu ma być dodawane polecenie DROP TABLE IF EXISTS. Jest to zmienna publiczna, gdyż musimy mieć na nią wpływ podczas ustawiania konfiguracji naszej kopii. Ponadto dodaliśmy jeszcze zmienne $db, $sql oraz $fields. Ich zastosowanie opiszę w dalszej części. Kolejnym elementem naszej klasy będzie stworzenie konstruktora, który będzie nam inicjował połączenie z bazą danych. Po udanym połączeniu i wybraniu bazy ustawiamy kodowanie znaków na utf-8, aby nie było problemów z polskimi znakami. Ponadto zmienna this->db będzie przetrzymywała nam nazwę bazy danych na której operujemy.
W poprzednim poście pokazałem w jaki sposób „oszukać” programistów laików i odczytać kody CAPTCHA zabezpieczające strony internetowe. Jednak sam opis nie wystarcza za bardzo, aby skutecznie skanować kody na obrazkach. W niniejszym poście zaprezentuję kod, za którego pomocą odszyfrujemy zabezpieczający tekst.
W poniższym tutorialu zajmiemy się takim oto obrazkiem:

Jak widać bez problemu jesteśmy w stanie odczytać jego zawartość: 011e11af. Jednak komputer widzi obrazek mniej-więcej tak: 1000111010010010100011000..., itd. Tak więc nic nam to specjalnie nie mówi. Jednak stosując krok po kroku zasadę, którą przedstawiłem w poprzednim poście jesteśmy w stanie bezbłędnie rozszyfrować obrazek.
<?php
$image = 'token.gif';
$info = getimagesize($image);
$width = $info[0];
$height = $info[1];
$img = imagecreatefromgif($image);
Kod zaczynamy od stworzenie zmiennej, która będzie przechowywała adres do pliku z obrazkiem. Następnie za pomocą funkcji getimagesize() pobieramy informacje o pliku. Nas będzie interesowały tylko szerokość i wysokość obrazka. Są one przechowywane odpowiednio w zerowym i pierwszym kluczu, zwracanym przez funkcję. Przypisujemy je do zmiennych $width i $height. Ostatnim krokiem jest otwarcie obrazka funkcją imagecreatefromgif() i zapisanie uchwytu do zmiennej $img.