W TYM NUMERZE DOWIESZ SI :Ę JAK PISAĆ OPTYMALNE

Transkrypt

W TYM NUMERZE DOWIESZ SI :Ę JAK PISAĆ OPTYMALNE
W TYM NUMERZE DOWIESZ SIĘ:
JAK PISAĆ OPTYMALNE SKRYPTY W JĘZYKU PHP
JAK BEZPIECZNIE WYKONYWAĆ OPERACJE W BAZIE DANYCH
JAK POWIELAĆ FRAGMENT FORMULARZA W JAVASCRIPT
JAK NAPISAĆ BOTA DZIAŁAJĄCEGO W SIECI GADU-GADU
JAK UPROŚCIĆ PISANIE SKRYPTÓW ZA POMOCĄ JQUERY
JAK ZAINSTALOWAĆ I SKONFIGUROWAĆ FRAMEWORK KOHANA
JAK ZRZUCIĆ FILM Z SERWISU YOUTUBE
GDZIE SZUKAĆ DARMOWYCH PROGRAMÓW, GIER, MUZYKI
GDZIE SŁUCHAĆ ZA DARMO ULUBIONYCH WYKONAWCÓW
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
Drodzy czytelnicy!
Twórcy magazynu
Oddajemy Wam pierwszy numer wolnego magazynu o tematyce komputerowej INSERT, dostępnego
dla wszystkich całkowicie za darmo. Kierujemy je
przede wszystkim do zaawansowanych użytkowników, zainteresowanych programowaniem, tworzeniem stron i aplikacji internetowych oraz innymi
dziedzinami informatyki, którzy chcą zwiększyć
swoją wiedzę i doświadczenie. W aktualnym wydaniu prezentujemy m.in. artykuł o popularnej bibliotece JavaScript jQuery, kurs języka Python, a także
porady dotyczące tworzenia i optymalizacji skryptów w języku PHP. Życzymy miłej lektury!
dreamwalker
Programowanie w języku Python
http://dreamwalker.jogger.pl
Spis treści
Optymalizacja kodu PHP.........................................3
Niezawodne porady PHP........................................6
Dynamiczne formularze..........................................7
Kurs języka Python – część I....................................8
jQuery – nieinwazyjny JavaScript............................9
Zrzuta z YouTube..................................................10
Instalacja i konfiguracja Kohany...........................11
Robot pomocnik....................................................12
Zostań legalnym użytkownikiem...........................15
Współpracujemy z serwisami
PurePC
eRIZ
XHTML, CSS, OO JavaScript, PHP+MySQL
Zend Certified Engineer
http://eriz.pcinside.pl
marines
Programowanie w językach webowych (PHP)
Tworzenie stron (XHTML/CSS)
Systemy operacyjne
http://marines.jogger.pl
uosiu
Linux, skrypty, psucie działających rzeczy
i doprowadzanie do używalności
okrężnymi drogami
http://blog.uosiu.info
WebCM
XHTML, CSS, JavaScript, PHP
Optymalizacja skryptów
Wynajdywanie koła na nowo
http://compmaster.prv.pl
Pavlick
Grafika komputerowa
Fotografia studyjna, obróbka zdjęć
Projektowanie stron internetowych
DTP: skład gazet, ulotek, plakatów, wizytówek
http://pavlick.pcinside.pl
Licencja magazynu
www.purepc.pl
PCTown
Magazyn jest dostępny całkowicie za darmo.
Możesz go rozpowszechniać i używać do celów
niekomercyjnych na zasadach licencji Creative
Commons NC.
Dołącz do nas!
Jeżeli chcesz współtworzyć magazyn INSERT,
dołącz do naszego zespołu. W tym celu napisz
na forum magazynu lub skontaktuj się z nami
za pośrednictwem poczty e-mail. Uwagi oraz
sugestie są także mile widziane.
forum.pctown.pl
SERENITY
serenity.org.pl
2
Narzędzia i wykorzystane materiały
Magazyn INSERT został złożony i zapisany w
formacie PDF w programie o otwartym kodzie
źródłowym OpenOffice.org Writer 3.0. Do
pokolorowania kodu PHP w artykułach użyliśmy
funkcji highlight_string(). Część ikon pochodzi
z darmowego zbioru Silk Icons.
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
OPTYMALIZACJA KODU PHP
Przyczyną problemów z wydajnością serwisu internetowego może
być nieoptymalny kod PHP. INSERT wyjaśni, jak go przyspieszyć.
PHP jest językiem interpretowanym po stronie serwera. Do
przeglądarki jest wysyłany jedynie
wynik jego działania. W typowym
serwisie internetowym serwer po
otrzymaniu żądania pobiera niezbędne rekordy (np. treść strony i
informacje o użytkowniku) z bazy
danych, a następnie przetwarza je
i wysyła do klienta. Przy dobrze
zoptymalizowanym kodzie może
on obsłużyć znacznie więcej internautów w określonym czasie.
Zacznij od... Xdebug
Podczas pisania aplikacji PHP
i jej optymalizacji pomocne jest
rozszerzenie Xdebug, ponieważ:
☑ wyświetla czas wykonywania
się funkcji oraz użycie pamięci w
przypadku wystąpienia błędu
☑ oferuje funkcje wyświetlające
np. całkowity czas interpretacji
kodu, szczytowe użycie pamięci...
☑ generuje pliki ze szczegółowymi informacjami na temat każdego wywołania funkcji i metod,
które można odczytać za pomocą
specjalnego programu
Konfigurujemy Xdebug
1 Pobierz rozszerzenie z oficjalnej strony xdebug.org w wersji
dla używanego systemu operacyjnego – dla Linuksa lub Windowsa.
2 Umieść plik .dll lub .so w folderze ext znajdującym się w katalogu instalacji PHP.
3 W pliku php.ini dodaj linijkę:
zend_extension_ts('PATH');
4 W miejsce PATH wpisz ścieżkę
bezwzględną do pliku .dll lub .so.
Dostępne są też opcje konfiguracyjne, opisane na stronie Xdebug.
5 Zapisz plik php.ini i zrestartuj
Apache.
Aby sprawdzić, czy rozszerzenie zostało zainstalowane prawidłowo, utwórz jakikolwiek skrypt i
wywołaj funkcję phpinfo(). Jeżeli
nie ma żadnej wzmianki o nim,
sprawdź, czy podałeś poprawną
ścieżkę (BEZWZGLĘDNĄ!) oraz
czy wersja Xdebug jest zgodny z
zainstalowaną wersją PHP.
Czas i użycie pamięci
Możesz użyć przedstawionych
poniżej funkcji:
//Użycie pamięci
echo xdebug_memory_usage();
//Szczytowe użycie pamięci
echo xdebug_peak_memory_usage();
//Czas w sekundach
echo xdebug_time_index();
Instrukcje czy funkcje?
Użycie instrukcji lub wyświetlenie wartości zmiennej / stałej
jest kilka razy szybsze od wywołania funkcji. Na przykład wersję
PHP można uzyskać na 2 sposoby.
//Użycie funkcji
echo phpversion();
//Wyświetlenie stałej
echo PHP_VERSION;
//Wersja rozszerzenia Xdebug
echo phpversion('Xdebug');
Od wersji PHP 5.1 uniksowy
znacznik czasu (liczba sekund,
która upłynęła od 11 stycznia 1970)
dla momentu przyjęcia żądania
znajduje się w tablicy $_SERVER.
W większości sytuacji można nim
zastąpić funkcję time().
echo
$_SERVER['REQUEST_TIME'];
Apostrof czy cudzysłów?
Jeżeli w łańcuchu znaków nie
używasz kombinacji: \n, \r, \t, \v,
umieść go w apostrofach. W przypadku użycia cudzysłowów PHP
sprawdza, czy w tekście znajdują
się zmienne oraz ww. symbole, co
pochłania więcej czasu.
//Szybciej - bez analizy
$x = 'Witaj' . $user
//Wolniej - z analizą
$x = "Witaj $user"
Łączenie ciągów tekstu
Staraj się zmniejszyć ilość złączeń ciągów tekstu (w pierwszym
przykładzie – za pomocą kropki).
Im jest ich więcej, tym większe
jest użycie pamięci przez skrypt,
gdyż jest to kosztowna operacja.
$user = 'Lech'; //Login
$lang = 'Zalogowany jako';
echo $lang . ': ' . $user;
W przykładzie zmienna $lang
zawiera tekst powitalny, specyficzny dla wybranego języka. W tym
przypadku może ona już zawierać
dwukropek:
$lang = 'Zalogowany jako: ';
echo $lang . $user;
Jeszcze lepszym wyjściem jest
użycie instrukcji printf(). Na miejscu określnika %s, oznaczającego
wartość typu string (ciąg tekstu),
pojawi się login.
$lang = 'Zalogowany jako: %s';
printf($lang, $user);
Unikaj operatora @
Operator @ postawiony przed
nazwą funkcji zapobiega wyświetlaniu błędów przez nią wygenerowanych. Jednak jego użycie znacznie spowalnia skrypt. Zaleca się
przemyśleć kod tak, aby pominąć
operator @, a nasze rozwiązanie
było jeszcze szybsze.
Nie wynajduj koła na nowo
Język PHP jest wciąż rozwijany. Warto dowiedzieć się, co nowego oferują nowe wersje. Być może
już istnieje potrzebna Ci funkcja,
którą chcesz napisać od podstaw?
Funkcje wbudowane w PHP
oraz w rozszerzenia są zawsze
szybsze od tych, które znajdują się
w interpretowanym kodzie, gdyż
zostały one napisane w języku C.
Oszczędź procesor
Rozważ następujący przykład:
setcookie('OK', 1, 60*60*24);
Powyższy kod ustawia cookie
na 1 dzień. Tylko po co PHP ma za
każdym razem liczyć wartość wyrażenia 60*60*24? Szybszy kod:
//Ustaw cookie na 1 dzień
setcookie('OK', 1, 86400);
Przeanalizuj teraz poniższą
pętlę FOR:
//$x jest tablicą
for($i=0; $i<count($x); ++$i)
{
echo $x[$i];
}
PHP liczy przy każdej iteracji
ilość elementów w tablicy. Jeśli w
pętli nie ulega ona zmianie, policz
ją tylko raz. Szybciej wykona się
3
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
poniższy kod:
$ile = count($x);
for($i=0; $i<$ile; ++$i)
{
echo $x[$i];
}
Zmienną $ile można utworzyć
w pierwszym wyrażeniu pętli FOR.
for($i=0, $ile=count($x) ...)
Jeżeli ilość elementów jest
stała (np. 20), wprowadź ją od
razu to drugiego wyrażenia:
for($i=0, $i<20; ++$i)
Zbędne zmienne
Nie twórz zmiennych, których
użyjesz tylko 1 raz. PHP przechowuje je w tablicy. Jeśli jest ich zbyt
wiele, znalezienie szukanej zmiennej może potrwać długo. Ze względu na ilość danych użycie pamięci
wzrośnie. Zasada dotyczy również
stałych i funkcji.
Są wyjątki od reguły. O tym
już za chwilę.
Operacje dyskowe
Operacje dyskowe (np. dołączanie plików, skanowanie katalogów), czyli wszystkie czynności
wymagające odczytu lub zapisu
danych na HDD, są czasochłonne.
Nie dołączaj plików bez potrzeby.
Oto kilka porad:
☑ Nie dołączaj kilka razy tego
samego skryptu.
☑ Jeśli dla każdego żądania skanujesz zawartość katalogu, rozważ
stworzenie cache (gotowej listy).
☑ Ładuj biblioteki do pamięci
tylko wtedy, gdy są potrzebne
☑ Nie dziel kodu aplikacji na
zbyt wiele plików, który musi być
zawsze dostępny.
Programowanie obiektowe
Zalążki programowania obiektowego pojawiły się już w PHP 3.
Nowy model obiektowy, oferujący
funkcjonalność istniejącą w wielu
innych językach, został wprowadzony dopiero w PHP5.
W PHP 4 obiekty są jednocześnie zmiennymi. Podczas przekazywania ich do funkcji, zwracania
lub przypisywania, są one kopiowane. Aby temu zapobiec, należy
przekazać obiekt przez referencje.
Sytuacja uległa zmianie w
PHP 5. Zmienna zawiera jedynie
identyfikator obiektu, który jest
4
kopiowany podczas ww. operacji.
__set, __get, __autoload
Metody magiczne __set oraz
__get() są uruchamiane, gdy PHP
nie znajdzie własności (zmiennej),
do której odwołujesz się. Nie definiuj ich, jeśli ważna jest wydajność
skryptu.
Następujące przykłady przedstawią przekazywanie danych do
szablonu na 2 sposoby:
//Z użyciem metody __set()
class Template
{
protected $data;
function __set($name,$val)
{
$this->name = $val;
}
}
$tpl = new Template;
$tpl -> title = 'Tytuł';
//Z użyciem własnej metody
class Template
{
protected $data;
function set($name, $val)
{
$this->data[$name] = $val;
}
}
$tpl = new Template;
$tpl->set('title', 'Tytuł');
Własności czy metody?
Wywołanie metody jest 2 razy
wolniejsze od wywołania zwykłej
funkcji. Natomiast czas dostępu
do własności obiektu jest niewiele
większy niż do globalnych zmiennych (poza klasą lub funkcją).
Programiści często definiują
metody służące tylko do zmiany
lub odczytu wartości własności
obiektu, nadając większą rangę
skalowalności aplikacji i hermetyzacji niż wydajności. Zastanów się
jednak, czy celem takiej metody
jest wcześniejsza obróbka danych,
czy tylko zwrócenie lub przypisanie wartości do zmiennej obiektu.
$mail -> title = 'Tytuł';
$mail -> setTitle('Tytuł');
Przestrzegaj typów danych
Dużym ułatwieniem podczas
tworzenia skryptów PHP jest to,
że PHP automatycznie konwertuje
typy danych. Jeżeli funkcja bądź
instrukcja językowa wymaga przekazania liczby całkowitej integer,
a otrzyma ciąg znaków (np. '70'
zamiast 70), interpreter zamieni
go na liczbę całkowitą i na odwrót.
Aby uniknąć zbędnych rzutowań typów danych, staraj się tak
zaprojektować aplikację, aby zminimalizować ich ilość.
Aby porównać 2 wartości lub
zmienne z uwzględnieniem typów
danych, użyj operatora ===.
if($a === $b) { }
Instrukcja switch
Gdy chcemy wykonać akcję w
zależności od wartości zmiennej,
zamiast pisać kilka razy if / elseif /
else, użyj instrukcji switch:
$x = 5;
switch($x)
{
case 1:
/* Akcja 1 */
break;
case 2:
case 3:
/* Akcja 2 */
break;
default:
/* Domyślna akcja */
}
Zakończ każdy bloku case instrukcją break; oprócz default.
Include + include_path
Domyślnie instrukcja include
sprawdza, czy plik, który chcemy
dołączyć dołączyć, nie znajduje się
w którymś z katalogów wymienionych w dyrektywie include_path.
Zaletą takiego rozwiązania jest to,
że nie musimy podawać ścieżki do
pliku, jeśli jest w include_path.
Aby PHP szukał pliku tylko w bieżącym lub określonym folderze,
poprzedź ścieżkę symbolem ./
//Najpierw w include_path
include('plik.php');
//Tylko w bieżącym folderze
include('./plik.php');
//Tylko w wyższym folderze
include('../sth.php');
Powyższe uwagi dotyczą także
instrukcji require, która różni się
tym, że w razie niepowodzenia wyświetla błąd krytyczny i przerywa
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
dalszą interpretację skryptu.
Testy pod obciążeniem
Zbadaj też wydajność skryptu
pod większym obciążeniem serwera. Służy do tego program Apache
Benchmark rozprowadzany wraz z
Apache 2. Z jego pomocą dowiesz
się, ile żądań serwer jest w stanie
obsłużyć podczas 1 sekundy na
wykorzystanym sprzęcie oraz ile
trwa złożenie 1 strony.
W systemie Windows znajduje
się on w katalogu bin w folderze,
w którym Apache został zainstalowany, np. C:\Apache2\bin\ab.exe.
1 Otwórz wiersz poleceń, wpisując cmd w oknie Uruchom.
Skrót klawiszowy: WINDOWS+R.
2 Przejdź do katalogu z programem i uruchom go z opcją -h, aby
wyświetlił pomoc i sposób użycia.
Przykład:
cd C:\Apache2\bin
ab -h
3 Narzędzie pokaże listę opcji,
których można użyć przy badaniu
wydajności skryptu. Aby wykonać
500 żądań przy 10 jednocześnie
konkurujących ze sobą, wpisz:
ab -n 500 -c 10
http://localhost/strona.php
Aby zwiększyć precyzję, zakończ zbędne procesy w systemie,
które wykorzystują moc procesora. Test możesz powtórzyć kilka
razy. Nie ustawiaj zbyt małej ilości
powtórzeń, gdyż niektóre liczby
zostaną obliczone niedokładnie.
Zapytania do bazy danych
Zazwyczaj najwięcej czasu
zajmują niezoptymalizowane lub
skomplikowane zapytania do bazy
danych. Staraj się zmniejszyć ich
ilość. W dalszej części artykułu dowiesz się, jak zoptymalizować zapytania SQL.
Indeksy
Utwórz indeksy na polach, do
których odwołujesz się w zapytaniu, np. po słowie WHERE lub ON.
W strukturze tabeli najważniejszy
jest klucz podstawowy, np. na polu
ID. Załóżmy, że chcesz wyświetlić
artykuł o ID=5. Wysyłasz następujące zapytanie:
SELECT * FROM `articles`
WHERE ID = 5;
Silnik bazy danych nie musi
przemierzać wszystkich rekordów.
Indeksy zawierają pozycję początków wierszy, a więc dotarcie do
celu jest bardzo szybkie.
Pozostałe typy kluczy to:
☑ zwykłe – KEY
☑ unikalne – UNIQUE KEY –
każdy rekord musi mieć inną wartość w tym indeksie niż pozostałe
☑ obce – FOREIGN KEY – gdy
wartość klucza w 1 tabeli zostanie
zmieniona, ulegnie ona zmianie
także w tabelach, które łączy ze
sobą (w MySQL dostępny tylko w
silniku InnoDB)
☑ pełnotekstowe – FULLTEXT
(MySQL: tylko w silniku MyISAM)
Łączenie tabel
W zapytaniach z użyciem JOIN
kolumny, wg których łączysz tabele (po słowie ON), powinny zawierać indeks. W ten sposób silnik
znajdzie istotne rekordy szybciej.
Wyrażenie WHERE
Spójrz na poniższy przykład:
SELECT * FROM `tabela` WHERE
`num`+10 > 100
Zakładamy, że 100 jest liczbą
wejściową z PHP. Zoptymalizujmy
teraz to zapytanie. Silnik SQL powinien od razu policzyć wartość
wyrażenia 100-90, jednak można
to zrobić w PHP, np. ($num – 10).
Do serwera SQL wysyłamy zaś:
SELECT * FROM `tabela` WHERE
`num` > 90
Wyrażenie EXPLAIN
Za pomocą słowa EXPLAIN
dowiesz się więcej na temat analizy zapytania przez bazę danych,
np. czy klucze są wykorzystywane.
EXPLAIN EXTENDED
SELECT * FROM `articles`
WHERE author = 1
AND access = 1;
Predefiniowane zapytania
Aby przekazać informacje do
bazy danych bezpiecznie i szybko,
nie narażając się na groźny atak
SQL Injection, wykorzystaj nowe
możliwości serwerów bazodanowych. W omawianym przypadku
są to predefiniowane zapytania
(ang. `prepared statements`).
W przykładzie demonstrującym zasadę ich działania wykorzystamy rozszerzenie PDO stworzone do obsługi wielu baz danych.
Zakładamy, że $db jest obiektem
klasy PDO.
1 Przygotuj szkielet zapytania
za pomocą metody prepare().
$q = $db->prepare('UPDATE
items SET title = :title,
txt = :txt WHERE ID = :id');
2 Wprowadź dane do zapytania.
Możesz to zrobić na 2 sposoby –
za pomocą metod bindValue() lub
bindParam() (z użyciem referencji)
bądź przekazując je od razu do
metody execute(). Zobacz: KOD 1.
Jeśli za jednym razem dodajesz do bazy danych wiele pozycji,
wystarczy podpiąć nowe dane do
istniejącego już zapytania. W ten
sposób można osiągnąć lepszą wydajność i bezpieczeństwo.
W przypadku, gdy dane pochodzące z zewnątrz nie powinny
zawierać kodu HTML, w szczególności wysłane przez internautów,
należy koniecznie wywołać funkcję
htmlspecialchars().
KOD 1: Przekazywanie danych do predefiniowanych zapytań
//Sposób 1 – wywołanie wielu funkcji
$q->bindValue('title', $_POST['title']);
$q->bindValue('txt', $_POST['text']);
$q->bindValue('id', $id, 1);
$q->execute();
//Sposób 2 – przekazanie tablicy z danymi
$data = array(
'title' => $_POST['title'],
'txt'
=> $_POST['text'],
'id'
=> (int)$id
);
$q->execute($data);
W MySQL dostępne jest też słowo
EXTENDED, wyświetlające szczegółowe informacje.
5
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
NIEZAWODNE PORADY PHP
INSERT przedstawia rozwiązania częstych problemów podczas
programowania w PHP.
Obsługa kodowania UTF-8
W kodowaniu UTF-8 znaki alfabetów niełacińskich (np. polskie
litery z ogonkami) zajmują po 2
bajty, a znaki CJK (od: chiński, japoński, koreański) po 3 bajty.
Standardowe funkcje w PHP
nie obsługują kodowań, zawierających wielobajtowe znaki. Sytuacja
ma zmienić się dopiero w PHP 6.
Na szczęście PHP 5 zawiera rozszerzenie mbstring – Multibyte
String, jednak nie jest domyślnie
instalowane. Mimo to jest ono
włączone na większości hostingów.
Aby zobaczyć różnicę, poniższe przykłady muszą być zapisane
w kodowaniu UTF-8.
//Wyświetli: 3
echo strlen('OŃ');
//Wyświetli: 2
echo mb_strlen('OŃ','UTF-8');
Możesz od razu ustawić kodowanie, którego używasz:
mb_internal_encoding('UTF-8');
Wtedy można pominąć ostatni
argument w funkcjach mbstring.
Rozważmy inny przykład – chcemy
znaleźć w tekście pozycję 1 lub
więcej znaków:
$x = 'PIĘŚĆ';
//Zwróci: 6
strpos($x, 'Ć');
//Zwróci: 4
mb_strpos($x, 'Ć', 'UTF-8');
Nowe funkcje w PHP5
☑ file_put_contents() – zapisuje
treść do pliku
☑ str_ireplace() – zamienia określone frazy na podane odpowiedniki
bez uwzględniania wielkości znaków
☑ stripos() – znajduje pierwsze
wystąpienie podanego ciągu tekstu
bez rozróżniania wielkości znaków
☑ scandir() – zwraca tablicę z listą
plików i folderów w danym katalogu
posortowaną alfabetycznie
☑ date_default_timezone_set()
–
dostępny dopiero od PHP 5.2.0 –
ustawia domyślną strefę czasową
☑ error_get_last()
☑ i wiele więcej...
6
Nowe klasy w PHP5
☑ SimpleXML i DOM (obiektowy
model dokumentu) – do operacji na
języku XML
☑ DateTime i DateTimeZone
☑ PDO – uniwersalny interfejs do
obsługi baz danych
☑ MySQLi – rozszerzenie obsługujące nowe możliwości MySQL (od
wersji 4.1), np. podpinanie danych,
transakcje...
☑ Tidy – obsługuje narzędzie Tidy
do analizy, czyszczenia, i naprawy
dokumentów HTML
☑ Klasy Standard PHP Library
☑ Exception – wyjątki, które mogą
zostać rzucone instrukcją throw
☑ i znacznie więcej... przeczytaj o
nich w podręczniku PHP
Ulepszona obsługa MySQL
PHP 5 oferuje ulepszone rozszerzenia do obsługi baz danych.
Jeżeli wciąż używasz starych funkcji mysql_*, czas zapoznać się z
nowymi możliwościami, które mają
obiektowe interfejsy MySQLi oraz
PDO. Należą do nich m.in.:
☑ transakcje
☑ podpinanie danych do zapytań
☑ nowe funkcje
Więcej informacji znajdziesz
w podręczniku PHP:
☑ http://php.net/MySQLi
☑ http://php.net/PDO
System szablonów
Systemy szablonów ułatwiają
oddzielenie warstwy prezentacyjnej (HTML + JS + CSS) od logiki
aplikacji (np. PHP + SQL), przez
co zmiana wyglądu dowolnego
elementu w serwisie jest łatwa i
nie wymaga edycji plików odpowiedzialnych za prawidłowe funkcjonowanie skryptu.
Systemy szablonów budzą też
kontrowersje, gdyż narzucają projektantom swój język programowania, którego muszą nauczyć się.
Krytycy twierdzą, że PHP i ASP są
już językami szablonów. Niektóre
systemy zwiększają czytelność
kodu, zaś inne jedynie go szpecą.
Wybór zależy od potrzeb oraz
preferencji twórców. Można pokusić się też o napisanie biblioteki na
potrzeby tworzonego przez nas
projektu. Poniżej przedstawiamy
systemy szablonów warte polecenia wraz z polskimi produkcjami.
☑ OPT 2 – http://invenzzia.org
☑ XT – http://neo.mlodzi.pl/xt
☑ PHPTal – http://phptal.bukox.pl
SQL – Składnia REPLACE
Jeżeli tworzymy skrypt, który
w zależności od potrzeb tworzy
nowy rekord bądź edytuje wszystkie pola w istniejącym, nie musimy pisać 2 zapytań. Język SQL
oferuje polecenie REPLACE. Jego
składnia jest podobna do używanej przy komendzie INSERT.
Polecenie REPLACE tworzy
całkowicie nowe rekordy. Istniejące dotąd dane zostaną usunięte!
Tabela musi zawierać podstawowy klucz lub unikalny. Polecenie zachowuje się podobnie jak
INSERT z 1 wyjątkiem. Jeśli istnieje rekord zawierający klucz o tej
samej wartości, jaki podaliśmy w
zapytaniu, zostanie on zastąpiony
nowym.
PDO – setFetchMode()
Za pomocą metody setFetchMode() należącej do klasy PDOStatement możesz ustalić, gdzie
PDO ma sprowadzić rekordy bazy
danych. Przykład wykorzystania:
$res = $pdo->query('...');
$res->setFetchMode(
PDO::FETCH_NUM);
foreach($res as $row)
{
var_dump($row);
}
Nie trzeba wywoływać tej metody dla każdego zapytania. Zaraz
po stworzeniu obiektu PDO należy
ustawić atrybut:
$db = new PDO('sqlite:db.db');
$db -> setAttribute(
PDO::DEFAULT_FETCH_MODE,
PDO::FETCH_ASSOC);
//Liczby zamiast stałych
$db = new PDO('sqlite:db.db');
$db -> setAttribute(19,2);
Powyższy kod spowoduje, że
PDO będzie sprowadzał pobrane
rekordy z bazy danych do tablicy
asocjacyjnej (zawierającej klucze
tekstowe).
WebCM
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
DYNAMICZNE FORMULARZE
Stosując język JavaScript do dynamicznego wstawiania i usuwania pól formularzy, można zaoszczędzić transfer i czas.
Rozważmy przykład zastosowania dynamicznych pól w formularzu. Podczas edycji menu nawigacyjnego często zachodzi potrzeba dodania nowej pozycji lub usunięcia już istniejącej. Możemy też
umożliwić zmianę ich kolejności.
Nie przeładowujmy całej strony,
aby te operacje wykonał serwer.
Znacznie szybciej zrobi to skrypt,
oszczędzając czas użytkownika.
OOP w JavaScript
W przeciwieństwie do innych
języków, w JavaScript programowanie obiektowe wygląda inaczej.
Wszystkie funkcje, zmienne, tablice są obiektami. Nie definiujemy
klas słowem class. Rolę klasy
może pełnić każda funkcja. Jeżeli
stworzymy jej instancję, staje się
też konstruktorem.
Metody dostępne dla każdego
obiektu (instancji) klasy definiujemy za pomocą wyrazu prototype.
Dostępność strony
Skrypt napiszemy tak, aby jedynie przechwycił sterowanie nad
fragmentem formularza. Użytkownicy z wyłączoną obsługą skryptów
wciąż będą mogli wykonywać operacje dodawania, usuwania oraz
przesuwania elementów standardową metodą (z użyciem serwera).
Kod HTML
Zacznijmy od przykładowego
formularza z elementami, którymi
będziemy manipulować.
Zobacz plik: kod1.html
W formularzu wydzieliliśmy
fragment, któremu nadaliśmy ID
items. Znajdują się w nim 4 przyciski w postaci grafiki, odpowiadające za akcje:
☑ skopiuj element
☑ usuń element
☑ przesuń element w górę
☑ przesuń element w dół
Nie przypisaliśmy tym przyciskom zdarzeń onclick. Kontrola
nad całym blokiem items zostanie
przechwycona przez skrypt, który
za chwilę napiszemy.
Klasa Fragment
Teraz otwórz pusty dokument
w edytorze i zapisz go z rozszerzeniem .js, np. forms.js. Zdefiniuj w
nim klasę (funkcję) Fragment.
Zobacz plik: kod2.js
Po utworzeniu nowej instancji
powstaną 2 zmienne lokalne. Ich
nazwy poprzedzamy słowem var.
Powstaną też 2 własności publiczne, przypisane do obiektu, które
można odczytać lub zmienić w dowolnym miejscu. Funkcja przyjmuje 2 argumenty:
☑ box – element kodu HTML, w
którym znajdują się dynamiczne
pola formularza
☑ opt – obiekt zawierający dodatkowe parametry (opcjonalnie)
między przeglądarkami. Internet
Explorer 6 nie przekazuje obiektu
zdarzenia do funkcji. Jest znany
jako window.event. W JavaScript
dozwolony jest zapis:
var
e = e || event,
o = e.srcElement || e.target;
if(!o.alt) return false;
Jeśli zmienna jest niezdefiniowana – undefined – przyjmuje ona
wartość po operatorze ||, czyli referencję do window.event.
Jak rozpoznać przycisk?
W tym celu posłużymy się
atrybutem alt, czyli tekstem alternatywnym dla grafiki. Zwiększymy
też dostępność aplikacji. Jest on
wyświetlany, gdy przeglądarka nie
może wyświetlić obrazków.
Teraz zmodyfikujmy skrypt,
aby wykonywał określoną akcję w
zależności od wartości atrybutu alt
elementu, który został kliknięty.
Dodatkowe opcje
Za pomocą obiektu opt można
np. określić maksymalną ilość elementów lub wskazać znacznik,
którym objęta jest każda pozycja.
Zobacz plik: kod4.js
WebCM
Nowy element
Wróćmy do kodu naszego formularza. Utworzyliśmy tam też
element, któremu nadaliśmy ID
tpl. Zawiera czysty fragment.
Dodajmy do klasy Fragment
metodę addItem(), która wstawi
na końcu nową pozycję. Używamy
wspomnianą własność prototype.
Zobacz plik: kod3.js
Na początku sprawdzamy, czy
przekazaliśmy szablon fragmentu
oraz czy limit pozycji nie został
osiągnięty. Następnie powielamy
cały szablon i umieszczamy kopię
w na końcu elementu items.
Przypisujemy zdarzenie
We wnętrzu konstruktora klasy Fragment przypisujemy onclick
dla całego bloku items – funkcję z
argumentem e, który w momencie
wywołania będzie zawierać obiekt
z informacjami o zdarzeniu.
Zwróć uwagę na różnice nazw
własności i obiektów oraz sposobie implementacji wielu funkcji
Więcej informacji
➢ developer.mozilla.org/pl
Dokumentacja silnika Gecko.
Porady i przewodniki dotyczące języków: JavaScript, HTML,
CSS, XML, XLST, XUL, Xpath...
formatów: SVG, RSS... a także
techniki AJAX. Znajdują się też
informacje o tworzeniu motywów i rozszerzeń dla przeglądarki Firefox.
➢ www.quirksmode.org
Zawiera 120 stron z poradami
dotyczącymi JavaScript i CSS.
Porusza szczególnie zagadnienie tworzenia skryptów pod
różne przeglądarki.
➢ kurs.browsehappy.pl
Kurs BrowseHappy naucza od
podstaw tworzenia stron internetowych za pomocą języków
XHTML i CSS bez użycia przestarzałych znaczników, a także
jak radzić sobie różnicami w
implementacji CSS i HTML w
popularnych przeglądarkach.
7
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
KURS J Ę ZYKA PYTHON – CZ ĘŚ Ć I
Piękne jest lepsze niż brzydkie.
Ewolucja języków programowania nieustannie prowadzi nas
ku coraz prostszym rozwiązaniom.
Zakładając dużą ilość pamięci w
komputerach, możemy pominąć
troskę o efektywne wyciśnięcie z
programu ile się da i drobiazgowe
wyliczenia komórek pamięci zajętych przez dane. Wchodzimy teraz
(ba! Już dawno weszliśmy!) w czasy, gdy króluje prostota kosztem
wydajności. Ale jak to mówią – kiedyś kompilator zakładał, że programista jest mądry i wie co robi,
teraz programista jest głupi a zadaniem kompilatora jest pokazanie mu gdzie się myli. Nie małą
wagę odgrywa również tutaj rozwój innych paradygmatów programowania, których elementy trafiają do nowoczesnych języków programowania.
Python jest językiem łączącym
w sobie paradygmat obiektowy i
funkcjonalny (a przynajmniej te
dwa są najlepiej widoczne). Był
tworem dość unikalnym i być
może to stało się przyczyną jego
sukcesu. Python ma wszystkie
standardowe instrukcje, jakie posiada każdy strukturalny język
programowania – mamy warunki,
pętle, instrukcje złożone, zarazem
jednak zawiera on listy w formie i
notacji znanej z języków takich
Haskell, Ocaml albo SML oraz
lambda-wyrażenia (o których powiemy później).
Język Python posiada wiele
zastosowań. Budowana przez lata
biblioteka standardowa zawiera
większość rzeczy, których chcielibyśmy użyć w pracy z nowoczesnym językiem programowania.
Mamy tam za równo obsługę sieci,
aplikacji okienkowych jak i parsery XML i biblioteki do przechwytywania danych z formularzy, gdy
używamy Pythona w skryptach
CGI. Osobiście używam tego język
an wielu płaszczyznach zastosowań – pisałem w nim aplikacje
okienkowe jak i konsolowe, biblioteki sys i os umożliwiają zastosowanie Pythona jako języka skryptów powłoki (zamiast Basha w Linuksie). Istnieje również możliwość wykorzystania Pythona do
8
budowania aplikacji internetowych, a frameworki takie jak Pylons albo Django pozwalają na budowanie ich w duchu MVC.
Rodowód Pythona
Nazwa języka Python wywodzi się z nazwy grupy Monthy Python. Sam język był projektem
ćwiczeniowym, na którym autor
chciał przetestować różne koncepcje. Guido van Rossum opublikował kod źródłowy swojej pracy i
zaczęło się! Python od swoich początków był projektem open source. Jego początki sięgają lat 80',
więc jest starszy od Linuksa.
Współczesny Python jest językiem
bogatym w funkcje i łatwym w nauce. Przez cały okres jego rozwoju
Guido van Rossum był koordynatorem projektu i czuwał nad tym
co Python ma mieć, a czego nie.
W tej chwili trwają prace na wersją 3.0, która ma wprowadzić rewolucyjne zmiany i naprawić błędy wcześniejszych edycji.
Filozofia
Python ma swoją własną filozofię, którą kierują się jego programiści i która wyznacza drogę
deweloperom. Po wpisaniu "import this" w konsoli Pythona pojawia się nam napis, tutaj jest zamieszczone tłumaczenie tego tekstu:
Zen Pythona
☑ Piękne jest lepsze niż brzydkie.
☑ Wyrażone wprost jest lepsze
niż domniemane.
☑ Proste jest lepsze niż złożone.
☑ Złożone jest lepsze niż skomplikowane.
☑ Płaskie jest lepsze niż wielopoziomowe.
☑ Rzadkie jest lepsze niż gęste.
☑ Czytelność się liczy.
☑ Sytuacje wyjątkowe nie są na
tyle wyjątkowe, aby łamać reguły.
☑ Choć praktyczność przeważa
nad konsekwencją.
☑ Błędy zawsze powinny być sygnalizowane.
☑ Chyba że zostaną celowo
ukryte
☑ W razie niejasności powstrzymaj pokusę zgadywania.
☑ Powinien być jeden – i najlepiej tylko jeden – oczywisty sposób na zrobienie danej rzeczy.
☑ Choć ten sposób może nie być
oczywisty jeśli nie jest się Holendrem.
☑ Teraz jest lepsze niż nigdy.
☑ Chociaż nigdy jest często lepsze niż natychmiast.
☑ Jeśli rozwiązanie jest trudno
wyjaśnić, to jest ono złym pomysłem.
☑ Jeśli rozwiązanie jest łatwo
wyjaśnić, to może ono być dobrym
pomysłem.
☑ Przestrzenie nazw to jeden z
niesamowicie genialnych pomysłów – miejmy ich więcej!
Ten kurs będzie opierał się o
Zen Pythona i każda z części jako
swego rodzaju motto miała będzie
jedną z powyższych sentencji.
Wprowadzenie
Naukę Pythona zaczniemy od
razu ambitnie – od oglądnięcia
sporego kawałka kodu, który coś
robi. W tym przypadku – liczy silnię. Po przyjrzeniu się strukturze
programu powiem o tym jak go
uruchomić.
def silnia(n):
if n==1 or n==0:
return 1
else
return silnia(n-1)*n
print silnia(5)
Jak widzimy kod jest prosty i
czytelny dzięki zrobionym wcięciom. Funkcja silnia oblicza silnię
korzystając z rekurencji.
Zakładam, że czytelnik zna
już jakiś język programowania, na
przykład C albo Javę. To, co prezentuje sobą Python jest trochę
odmienne od składni tych dwóch
języków. Widać jednak i pewne pokrewieństwa.
Co jednak może zaalarmować
w tym kodzie programistę C?
1 Argument funkcji silnia nie
ma podanego typu.
2 Nie ma nawiasów { i }, są za
to ładne wcięcia.
3 Na końcu definicji funkcji i po
warunku w instrukcji if jest drukropek.
To jest właśnie specyficzna
składnia Pythona. Uwaga 1 odnosi
się do znaczenia programu, a nie
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
do jego zapisu. Dlaczego mimo
braku deklaracji typu to działa?
Na razie czytelnik musi uwierzyć
na słowo, że działa. W następnej
części kursu omówione będą właśnie typy. Uwaga 2 – brak nawiasów. Skoro już wspomniałem o
tych wcięciach, to znaczy że pewnie jest to ważne. Istotnie – jest.
W Pythonie wcięcia się liczą. Ba!
Interpreter rozróżnia znaki tabulacji od spacji, więc trzeba bardzo
uważać. Wcięcia sprawiają, że programy wyglądają ładnie, a programista Pythona po przejściu na
inne języki tworzy je już automatycznie. Stąd właśnie stwierdzenie
"Piękno lepsze od brzydoty".
Oprócz zrobienia wcięć deweloperzy Pythona zrezygnowali też z
różnych śmieci, które niepotrzebnie komplikowały kod. Dzięki
temu piszemy ładne, przejrzyste
programy. Sam język jednak nie
starcza – nawet w języku Python
potrzebna jest dobra wola programisty.
Źródła:
http://en.wikipedia.org/wiki/Python_(programming_language)
http://sheep.art.pl/Zen_of_Python
dreamwalker
JQUERY – NIEINWAZYJNY JAVASCRIPT
W tym artykule dowiesz się, do czego służy popularna biblioteka
jQuery i jakie są zalety jej zastosowania.
Semantyka
Na przestrzeni wielu lat projektowanie serwisów www ewoluowało w pewien samoistny sposób
– wiele osób do dziś pamięta ograniczenia pierwszych „przeglądarek” internetowych, które uniemożliwiały stworzenie funkcjonalnych i atrakcyjnych stron. Wówczas opublikowanie czegokolwiek
w internecie utożsamiało twórcę
niemal z tzw. „chakierem”, gdyż
własna strona w sieci nie była
czymś trywialnym. Dzisiaj na ówczesne strony można jedynie popatrzeć z politowaniem, gdyż programy do przeglądania hipertekstu oferują znacznie więcej możliwości. Za przełomowe można
uznać wprowadzenie obsługi kaskadowych arkuszy stylów (CSS),
a także rozwój języka JavaScript.
Wówczas można było zacząć mówić o tzw. semantyce serwisów,
czyli oddzieleniu warstwy prezentacyjnej od warstwy treści. Pod
względem wizualnym budowa semantyczna nie wprowadza niczego nowego – zmiany dotyczą
struktury kodu oraz wzajemnych
powiązań – nazwę to „modułów”,
czyli oskryptowania i CSS-ów.
Konwencjonalny kod zakładał skupienie wszystkich elementów w
jednym pliku HTML. Skoro kod
semantyczny nie przynosi żadnych
różnic wizualnych, to jaki jest sens
tworzenia nowoczesnego kodu?
1 Odseparowanie warstw logicznych
Kod semantyczny zakłada, iż składowe odpowiedzialne za poszczególne elementy – treść, wygląd,
oskryptowanie są od siebie oddzielone – szkielet HTML w osobnym pliku, analogicznie CSS i JS.
Umożliwia to łatwe wprowadzanie
zmian w całym serwisie modyfikując zaledwie jeden plik – przykładowo – chcemy zmienić kolor
czcionki, czy tła – wystarczy modyfikacja arkusza stylów, a zmiany
zostaną powielone w ramach całego serwisu.
2 Oszczędność transferu
Elementy składające się na warstwę prezentacyjną pobierane są
tylko raz, przy pierwszym odwie-
dzeniu serwisu. W trakcie dalszego surfowania po stronach, z serwera pobierana jest tylko treść –
pozostałe składniki – z cache'u
przeglądarki.
Co semantyka ma wspólnego
z jQuery? Odpowiem posługując
się prostym przykładem – często
można się spotkać z kodem tego
typu:
<a href=”#” onclick=”instrukcja_z_pliku(); return
false”>test</a>
Bardzo ciężko jest oddzielić
kod JavaScript od właściwej treści, jaką powinien być tu tylko
link z napisem
„test”.
Atrybut
onclick wygeneruje błąd w przypadku, gdy zewnętrzna instrukcja
nie zostanie z różnych przyczyn
załadowana przez przeglądarkę.
Pełne oddzielenie poszczególnych
warstw nastąpi tylko wtedy, jeśli
podpięciem zdarzeń zajmie się
również JavaScript. Dlaczego piszę
akurat o jQuery w tym aspekcie?
Dlaczego framework jQuery?
Framework JavaScript jest
całkiem racjonalnym wyjściem. O
ile w przypadku oprogramowania
działającego po stronie serwera
sytuacja jest w miarę klarowna
(interpreter danego języka zawsze
przetwarza kod programu w ten
sam sposób niezależnie od serwera), to implementacje JavaScriptu
są różne praktycznie w każdej
przeglądarce. Pewien porządek
wprowadziło zaimplementowanie
obsługi metod DOM (Document
Object Model – model dokumentu
przypominający drzewo i jego gałęzie), które są obsługiwane przez
wszystkie współcześnie używane
przeglądarki. Niestety, pomimo to
– w dalszym ciągu można spotkać
się z ogromem niejasności, które
potrafią wprowadzić w stan skrajnego zirytowania nawet najbardziej doświadczonych webmasterów. Główną bolączką jest tu Internet Explo”d”er, który dość często
wymaga pisania osobnej implementacji konkretnego algorytmu.
Niestety, nie jest to tylko CSS, jak
możemy dość często zaobserwować, ale również JavaScript. Roz-
9
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
ważmy prosty przypadek przechwytywania kliknięcia myszą elementu „element”:
document.getElementById('ele
ment').onclick = function(e)
{
alert(e.srcElement);
}
W przeglądarkach poprawnie
interpretujących model DOM powyższy kod zadziała bez problemu
i wyświetli nazwę tagu, do którego
odnosi się identyfikator „element”.
Niestety, w przypadku IE zdarzenie przechowywane jest w innej
zmiennej:
document.getElementById('ele
ment').onclick = function(){
alert(
window.event.srcElement
);
}
Z kolei kod dla IE jest niekompatybilny
z
rozwiązaniem
przyjętym przez W3C. Zamiast
jednego, uniwersalnego rozwiązania, trzeba uwzględnić oba przypadki:
document.getElementById('ele
ment').onclick = function(e)
{
e = e=='undefined' ?
window.event : e;
alert(e.srcElement);
}
M. in. z powodu różnej interpretacji JavaScript przez przeglądarki zaczęto stosować frameworki. Pozwalają one zminimalizować
(zaznaczam: zminimalizować, a
nie wyeliminować) konieczność pisania osobnego kodu w zależności
od przeglądarki. Powyższy algorytm zaimplementowany w jQuery
wygląda tak, jak poniżej:
$('#element').click(
function()
{
alert(this.srcElement);
}
)
Prawda, że proste? jQuery
dba za nas o to, aby wyszukać element i odpowiednio obsłużyć zdarzenie. Oprócz jQuery istnieją
również inne frameworki, np.
Prototype, moo.tools, YUI, Dojo,
extJS, czy inne. Dlaczego skupiam
się na jQuery?
1 Wydajność. jQuery pomimo
niezłych możliwości, jakie oferuje
„fabrycznie”, to pod względem
10
wydajności znajduje się w ścisłej
czołówce. Również adekwatnie do
tak samo funkcjonalnych bibliotek.
2 Społeczność. Do omawianego
przeze mnie frameworka zostało
napisanych już setki wtyczek i
cały czas powstają nowe. Można je
również tworzyć samodzielnie, nic
nie stoi na przeszkodzie. ;]
3 Prostota i intuicyjność. Osoby
trochę obeznane z JavaScriptem
poczują się jak w domu – jQuery
pozwala na wymienne stosowanie
metod DOM w połączeniu z własnościami frameworka. W dodatku
nie trzeba znać wszystkiego na
pamięć – otrzymujemy dobrą dokumentację, można też „zgadywać” nazwy metod – jedyne wymagania, to znajomość podstawowej składni JS i języka angielskiego.
4 Wspomaganie programisty.
Rozważmy poniższy przypadek –
chcemy odnaleźć element „element”, nadać mu klasę „klasa” i
go pokazać. W czystym JavaScripcie wyglądałoby to:
var element = pięcioelementowy('element');
element.className = element.className+' klasa';
element.style.display =
'none';
w jQuery możemy napisać wszystko w dosłownie jednej linijce:
$('#element').addClass('klasa').hide();
Chyba widać różnicę. ;]
Oprócz wspomnianych przeze
mnie unifikacji metod niezależnie
od przeglądarek, jQuery wprowadza również te nieobsługiwane,
np. wyszukiwanie elementów poprzez wyrażenia CSS czy rozszerzanie podstawowych elementów
języka o nowe metody.
Osobiście dodam, że dzięki
jQuery można oszczędzić mnóstwo
nerwów i zamienić pracę przy
front-endzie w przyjemność. ;]
W kolejnych częściach skupię
się na praktycznym zastosowaniu
funkcji frameworka.
eRIZ
ZRZUTA Z YOUTUBE
Jak zrzucić film wideo z serwisu YouTube w systemie Linux?
Wiele osób ogląda filmiki na
serwisach takich jak break.com,
youtube.com, metacafe.com lub
innych podobnych. Spora grupa z
tych ludzi chce je potem wgrać na
komórkę i pokazać go innym w
szkole/pracy/u babci/gdziekolwiek
indziej. Szukanie programów do
konwersji plików .flv do innych
formatów może zabrać wiele czasu. Z INSERTem zrobicie to w
chwile!
Do dzieła!
Najpierw należy namierzyć
pożądany przez nas filmik. Następnie link do niego należy wkleić w
duże niebieskie pole URL na stronie keepvid.com oraz kliknąć na
DOWNLOAD. Klikamy prawym
przyciskiem myszki na
›› Download ‹‹
(video.mp4 – High Quality)
wybieramy opcje „zapisz element
docelowy jako” i zapisujemy go w
ulubionym folderze na dysku.
Teraz pora na terminal – należy przejść do folderu, gdzie zapisaliśmy plik.
20:52 [ uosiu @ samhain ] /home/
uosiu > cd ~uosiu/Wideo
Następnie należy uruchomić
program mencoder służący do kodowania plików:
mencoder FILM.mp4
-ovc lavc
-oac mp3lame
-lameopts q=0
cbr=BITRATE_MUZYKI_W_MP3
-lavcopts vcodec=mpeg4
-o FILM.avi
Gratulacje! Teraz masz film w
najzwyklejszym mpeg4 z dźwiękiem w mp3.
uosiu
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
INSTALACJA I KONFIGURACJA KOHANY
Kohana jest frameworkiem napisanym w PHP 5. Opiera się na
projekcie CodeIgniter. INSERT pomoże go skonfigurować.
Z wielu frameworków dla języka PHP wyłonić możemy świeży
jeszcze projekt jakim jest Kohana
PHP. Wykształcił się on ze znanego dobrze w światku programistów PHP CodeInitera, który przestał nadążać za stosunkowo szybko rozwijającym się językiem. Czym
więc różnią się te dwa frameworki?
Większych zmian jest kilka, ale za
to radykalnych. Najważniejszą z
nich jest pełna kompatybilność za
PHP5 rezygnując zupełnie z
wspierania PHP4. Jest to zdecydowany krok w stronę większej wydajności oraz subtelne wymuszenie przygotowywania programistów do zbliżającego się PHP6.
Drugą zmianą jest pełna kompatybilność z kodowaniem UTF-8, z
którym problemy miał CodeIgniter,
a który staje się standardem. Do
tego wszystkiego dochodzi znacznie podniesione bezpieczeństwo
skryptów bazowanych na tymże
frameworku. W tym artykule
przedstawię instalację i wstępną
konfigurację tego frameworka.
Skąd pobrać?
Kohanę można znaleźć na polskiej witrynie autorów pod adresem kohanaphp.pl. W zakładce
"Pobierz" znajdziemy narzędzie do
wyboru składników frameworka,
które mamy zamiar używać. Lista
zawiera moduły (4), dodatkowe
narzędzia (3) i języki (6, w tym język Polski). Jeżeli chcemy sprawdzić w całości co oferuje Kohana
możemy zaznaczyć wszystkie moduły i dodatkowe narzędzia. Język
według uznania. Ostatecznie klikamy przycisk "Pobierz Kohanę!".
Zapisujemy archiwum na dysku.
Środowisko pracy
Kohana nie ma zbyt wygórowanych wymagań co do serwera
na jakim pracuje, jednak należy
pamiętać o dwóch rzeczach. To o
czym wspomniałem już na początku, Kohana nie akceptuje wersji
PHP niższej niż 5, a konkretnie
5.1.3. Musi też działać na serwerze obsługującym w pełni kodowanie UTF-8 (PCRE, SPL). Dotyczy
to także konfiguracji PHP (wyma-
gane funkcje iconv() i mcrypt()).
Jak autorzy podkreślają Kohana
powinna działać na dowolnej aplikacji serwerowej. Wiadomo, że na
pewno działa na serwerach Apache 1.3, Apache 2.0, lighttpd i Microsoft IIS.
Instalacja
Przygotowanie Kohany do działania jest bardzo proste. Wszystko
dlatego, że jej autorzy chcieli
uczynić ją jak najbardziej przenośną. Przechodzimy do głównego
katalogu naszego serwera HTTP.
Tworzymy tam katalog "kohana"
(lub dowolny inny, według uznania). W nim znajdzie się nasza instalacja Kohany. Rozpakowujemy
zawartość katalogu znajdującego
się w pobranym archiwum ZIP do
katalogu, który utworzyliśmy przed
chwilą. To mogłoby być na tyle.
Możemy sprawdzić, czy nasza Kohana już działa przechodząc pod
adres naszego serwera i katalog,
w którym zainstalowaliśmy ją.
Jeżeli wszystko wygląda w porządku, Twoja nowa instalacja Kohany jest gotowa do działania. Od
teraz możesz zacząć pisać aplikację.
Konfiguracja
Kohana jest bardzo lekkim
frameworkiem, lecz posiada bardzo duże możliwości konfiguracyjne. Omówię tutaj tylko podstawowy plik konfiguracyjny, z którego
korzysta cały framework. Jest to
plik /application/config/config.php.
Otwórz go w swoim ulubionym
edytorze. Pierwszą rzeczą, którą
powinniśmy zrobić to ustawienie
adresu URL pod jakim znajduje
się instalacja Kohany. Adres ten
znajduje
się
w
zmiennej
$config['site_domain'] i domyślnie
jest to 'localhost/kohana/'. Jeżeli
nie uruchamiamy Kohany na lokalnym serwerze lub uruchamiamy ją
w innym katalogu powinniśmy
zmienić jej zawartość. Jeżeli będziemy chcieli korzystać z połączenia szyfrowanego SSL przyda
się ustawienie protokołu 'https' w
zmiennej $config['site_protocol'].
Dzięki temu tworzone linki będą
go od razu zawierały. Kohana ob-
sługuje kompresję wyjścia GZIP.
Zmienna
$config['output_compression'] wskazuje na poziom
kompresji (w skali 1-9) lub jej całkowity brak (domyślnie wyłączone). Jak już wcześniej wspominałem programiści Kohany położyli
duży nacisk na jej bezpieczeństwo.
Po raz pierwszy spotkamy się z
tym już w pliku konfiguracyjnym
w zmiennej $config['global_xss_filtering']. Decyduje ona o automatycznym filtrowaniu wszelkich danych wymienianych między użytkownikiem a skryptem (czyli tablic
superglobalnych $_GET, $_POST,
$_FILES). Domyślnie ta opcja jest
włączona. Kolejną dość ważną dla
początkującego użytkownika tego
frameworka opcją jest wyświetlanie błędów. Znajduje się ona w
zmiennej $config['display_errors'].
Jeżeli jest uaktywniona (domyślnie), za każdym razem gdy wystąpi błąd zostaniemy o tym szczegółowo powiadomieni (miejsce wystąpienia błędu, dane dostępne w
obiektach, etc.). Ostatnią wartą
uwagi pozycją w pliku konfiguracyjnym jest zmienna $config['preload']. Zawiera ona biblioteki (libraries) i moduły (modules), które
mają się ładować automatycznie.
Pozwoli to nam zapomnieć o konieczności ładowania modułów i
bibliotek ręcznie na poziomie kontrolera. Plik config.php zawiera
jeszcze kilka innych zmiennych,
które nie mają większego wpływu
na komfort programowania. Zachęcam jednak do zapoznania się
z nimi samodzielnie.
Wsparcie
Jako, że Kohana jest bardzo
młodym projektem nie znajdziemy
na jego temat wiele informacji. Na
stronie docs.kohanaphp.com znajduje się dość obszerna, angielskojęzyczna dokumentacja, która stale powiększa swoje zasoby (bazuje
na skrypcie wiki - DokuWiki). Poza
tym jeden z użytkowników Kohany
prowadzi bloga, w którym pisze
tutoriale do Kohany. Blog znajduje
się pod adresem: learn.kohanaphp.com (po angielsku). Jeżeli szukamy polskojęzycznego wsparcia
udajmy się na polskie forum Kohany: forum.kohanaphp.pl
marines
11
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
ROBOT POMOCNIK
Jak napisać bota działającego przez sieć Gadu-Gadu?
Wiele osób używało kiedyś infobota, lub innego „stwora” działającego poprzez sieć Gadu-Gadu.
Napisanie takiego programu nie
jest trudne. W tym artykule autor
opisze proces tworzenia takowego
programu dla swojej licealnej klasy...
Od stuleci (czasu informatycznego) jednym z narzędzi używanych do pisania takich botów
jest EKG, czyli Eksperymentalny
Klient Gadu-Gadu – konsolowy
klient sieci GG dla systemów z rodziny *nix, a po drobnych przeróbkach – dla większości systemów z
rodziny POSIX (m.in. BeOS).
EKG jest zapleczem do komunikacji z siecią Gadu-Gadu, zaś do
przetwarzania wiadomości można
zatrudnić skrypty powłoki (bash,
Python, PHP, Perl, czy nawet C
albo Asembler – autor na potrzeby
tego artykułu wybrał PHP), bądź
też napisać skrypt w Pythonie i załadować go jako moduł EKG.
Ale po co?
Na początku pierwszej klasy
liceum wymienialiśmy się "materiałami umożliwiającymi podniesienie oceny z przedmiotu" za pomocą serwisu nasza-klasa.pl, jednakże na forum szkoły wchodzili
również nauczyciele, wobec czego
pomysł ten wydawał się idiotyczny
– czas przejść "do podziemia". A
więc pora napisać bota klasowego.
W swoim założeniu bot klasowy miał być implementacją rozmów w sieci IRC w ramach sieci
Gadu-Gadu – użytkownik wysyła
wiadomość, która jest rozsyłana
do wszystkich zapisanych użytkowników. Zapewne, czytelniku
zastanawiasz się teraz, czemu nie
użyć rozmów konferencyjnych,
które oferuje ta sieć. Otóż autor
nie użył takiego typu konwersacji,
gdyż nie wszyscy w klasie chcieli
wszystkim podawać swój numer
gg, bądź nie posiadają odpowiedniego numerka. Często zdarza się
w śród ludzi, że nie używają też
oryginalnego klienta. Bot również
ma służyć do świadczenia usług
per-user, co również czyni konfe-
12
rencje formą nieefektywną.
Złapmy za kartkę papieru
i długopis
Należy w tym momencie
usiąść chwilę i zastanowić się jak
miałaby wyglądać praca z takim
botem, co taki bot musiałby
umieć, jaką składnie miałyby mieć
wydawane mu polecenia etc. W
moim przypadku użytkownik zapisuje się do listy wysyłkowej – w
sieci IRC byłoby to dołączenie do
kanału. Następnie taka osoba wysyłałaby wiadomość. Taka wiadomość byłaby rozsyłana do wszystkich aktywnych numerków na liście wysyłkowej w formacie podobnym do IRCa – <nick> $treść.
Skoro już o aktywności mowa –
użytkownik mógłby zawiesić swoją
działalność – będąc zapisanym w
systemie informuje bota, iż nie
chce otrzymywać wiadomości.
Tak więc nasz bot musi
„umieć” polecenia
☑ zapisz hasło nick //użytkownik
zostaje zapisany w systemie jako
$nick, jeśli poda prawidłowe hasło
☑ msg //w czasie eksploatacji
bota polecenie msg zostało również zduplikowane jako brak polecenia dla zapisanych użytkowników. Osoba niezapisana dostanie
komunikat "brak uprawnień"
☑ pause //wpisując to polecenie
użytkownik włącza lub wyłącza
tryb uśpienia (nieotrzymywania
wiadomości)
☑ wypisz //użytkownik wypisuje
się z systemu
☑ sugestia //bot wysyła sugestię
do administratora bota
Co to pociągnie?
Jak już pisałem we wstępie –
za zaplecze do obsługi sieci GaduGadu będzie służyć EKG. Pora
przestudiować pomoc do rożnych
komend. A więc tango z EKG czas
zacząć. Po uruchomieniu programu po raz pierwszy pokaże się informacja powitalna wraz ze sposobem rejestracji konta w programie. Wklepujemy owe magiczne
komendy, podając numer gg i hasło naszego bota. Następnie pora
wpisać polecenie /help – niezwykle interesujące są polecenia /on
oraz /exec. Wpiszmy więc /help on
oraz /help exec. W pomocy do polecenia on interesuje nas przełącznik -a, który dodaje zdarzenie do
listy, zdarzenie msg, chat, które
odpowiada za przychodzące wiadomości oraz lista zmiennych. Tutaj najważniejsze to:
%1, które oznacza numerek
nadawcy
%3, jest to NIEFILTROWANA
treść wiadomości – w połączeniu z
/exec nadawca ma szerokie pole
do popisu w zakresie wyciągania
poprzez bota zawartości wielu plików w systemie oraz różnego rodzaju psucia.
%4 – podobne jak %3, lecz
wszelkie niebezpieczne znaki są
escape'owane
przez
program
(\znak)
/exec zaś wykonuje polecenie
w systemie. Przykład /exec date –
wyświetla aktualny czas, zaś /exec
rm -rf robi gruntowne czystki na
dysku twardym ;)
A zatem polecenie, które uruchomi bota brzmi /on -a msg,
chat * /exec /home/user/sciezka/do/
bota.php %1 '%3' (zamknąłem %3,
czyli ten niebezpieczny wariant w
apostrofie, co oznacza, ze system
nie będzie się zabierał za przetwarzanie treści w środku, lecz po
prostu przekaże go do programu
'jak leci' – szczegóły już niedługo
w kursie pisania skryptów powłoki).
Zatem już wiemy, jak EKG odpali skrypt przetwarzający wiadomość. Teraz należy pomyśleć o komunikacji w drugą stronę – odsyłanie wyników do ludzi.
Bot może po prostu wyrzucać
wyniki na stdout (w C – printf, w
C++ cout, a bashu echo 'tekst'),
lecz wynik byłby odsyłany tylko do
nadawcy wiadomości – w jako system masowej korespondencji nie
ma to racji bytu. Zaglądając do
manuala EKG (man ekg), można
zauważyć ciekawy przełącznik -c,
który tworzy plik kontrolujący
klienta. Bingo! O to chodziło.
Więc już wiadomo, jak bot będzie
wysyłał wiadomości – emulując
człowieka siedzącego przed monitorem, sterując poprzez plik.
Plik ten traktuje się jako zwykły
plik – po prostu się do niego pisze
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
polecenia, zakańczając je enterem
(bashowe echo "cos" > plik).
Algorytmy
Bot nie człowiek, lecz cyfrowy
idiota i jakiś schemat działania
mieć musi, czas więc sobie taki
schemat rozrysować.
KOD 3: Funkcja zapisz()
$tmp = explode(' ',$argv[2], 2); //-- wiadomość została rozcięta na dwie części - polecenie i jego parametry
$polecenie = $tmp[0];
$wartosci = $tmp[1];
unset($tmp);
$cos = explode(' ', $wartosci, 2); //-- rozcina parametry na
haslo i nick
zapisz($numer_nadawcy, $cos[0], $cos[1]);
Zapisany
Funkcja ta przyjmuje wartość
prawdziwą, jeżeli w bazie MySQL
jest już wpis z takim numerem
GG. Bardzo ważna dla bota funkcja, gdyż większość poleceń będzie
dostępna tylko dla zarejestrowanych użytkowników.
KOD 2: Funkcja zapisany()
<?php
function zapisany($numer_nad
awcy)
{
$odpowiedz = mysql_query(
sprintf("SELECT nick FROM
`users` WHERE number = %d
LIMIT 1",
(int) $numer_nadawcy));
$row = mysql_fetch_assoc(
$odpowiedz);
//-- CHECKING WHETHER USER
IS SUBSCRIBED TO SPAMLIST ;)
if (empty($row)) {
return false;
}
else {
return true;
}
}
?>
Zapisz
Bot dostaje wiadomość od
użytkownika o przykładowej treści
"zapisz wnaszejklasiefajniejest józek" – należy sprawdzić czy hasło
podane przez użytkownika jest takie samo, jak to zdefiniowane w
kodzie – autor napisał skrypt w języku PHP.
Najpierw należy treść wiadomości rozciąć na kawałki, aby porównać poszczególne części z
wzorcami – rozdzielnikiem jest
spacja. Następnie, jeżeli wszystko
się zgadza, wykonywane jest zapytanie do bazy danych, które dodaje użytkownika.
function zapisz($numer_nadawcy, $password, $nick) {
$file = fopen('/home/uosiu/rurka' ,'w');
//-- IF USER ISN'T SUBSCRIBED, THEN ADD TO DB
if (!zapisany($numer_nadawcy)) {
global $zapisz_passwd;
if ( $password == $zapisz_passwd) {
fwrite($file, "/msg $numer_nadawcy Zostales/as zapisany/a do systemu wysylkowego klasy 2F. Witamy!
");
$a = mysql_query("INSERT INTO `bot`.`users`
(`ID`, `number`, `nick`, `pause`) VALUES ( NULL, '$numer_nad
awcy', '$nick', '0')");
}
else {
fwrite($file, "/msg $numer_nadawcy ...
");
}
}
//-- ELSE NOTIFY, THAT (S)HE IS ALREADY SUBSCRIBED
else {
fwrite($file, "/msg $numer_nadawcy Juz jestes zapisany/a!
");
}
fclose($file);
}
Pause
Funkcja ta sprawdza wartość
pola pause w bazie danych dla danego numeru, jeżeli to jest 0, to
ustawia 1, jeżeli 1 to 0. Wg autora
to żadna filozofia ;)
Wypisz
Funkcja ta kasuje użytkownika z bazy danych.
KOD 4: Funkcja pause()
function pause($numer_nadawcy) {
$file = fopen('/home/uosiu/rurka' ,'w');
$odpowiedz = mysql_query(sprintf("SELECT pause FROM `users
` WHERE number = %d LIMIT 1", (int) $numer_nadawcy));
$row = mysql_fetch_assoc($odpowiedz);
if ($row['pause'] == '0') {
$odpowiedz = mysql_query(sprintf("UPDATE `bot`.`users` S
ET `pause` = '1' WHERE number = %d LIMIT 1", (int) $numer_na
dawcy));
fwrite($file, "/msg ".$numer_nadawcy." zapauzowano
");
}
else {
$odpowiedz = mysql_query(sprintf("UPDATE `bot`.`users` S
ET `pause` = '0' WHERE number = %d LIMIT 1", (int) $numer_na
dawcy));
fwrite($file, "/msg ".$numer_nadawcy." odpauzowano
");
}
fclose($file);
}
13
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
KOD 5: Funkcja wypisz()
function wypisz($numer_nadawcy) {
$a = mysql_query(sprintf(
"DELETE FROM `users` WHERE number = %d LIMIT 1",
(int) $numer_nadawcy));
$b = mysql_fetch_assoc($a);
$file = fopen('/home/uosiu/rurka', 'w');
fwrite($file, "/msg ".$numer_nadawcy." Zostales/as wypisany/a z systemu wysylkowego klasy 2F
");
fclose($file);
}
Msg
De facto funkcja ta jest najważniejszym elementem naszego
bota. Jej argumentami są: numer
nadawcy, jego nick i treść. Najpierw należy pobrać z bazy danych wszystkich userów, którzy
nie mają takiego samego numeru
jak nadawca, oraz nie są zapauzowani:
Następnie już z górki – do momentu, kiedy tablica się nie skończy, należy wysyłać wiadomość do
kolejnych użytkowników w tablicy.
Podsumowanie
Mam nadzieję, że powyższy
artykuł wraz z wycinkami kodów
pokazał, iż pisanie botów z zapleczem w postaci EKG nie jest trudne. Cała potrzebna wiedza to:
przeczytany podręcznik (manual)
do EKG, /help on, /help exec
oraz odrobina wiedzy z zakresu
algorytmiki. Wskazana jest również pewna biegłość w obróbce
strumieni tekstu w swoim ulubionym języku programowania :)
Dodatkowo załączam szkic
bota napisanego w języku Python,
który będzie modułem EKG, nie
zaś osobnym procesem. Oszczędzi
to zasoby systemowe na serwerze.
uosiu
KOD 6: funkcja msg()
$a = mysql_query(
sprintf("SELECT number FROM `users` WHERE pause = '0'
AND number != '$numer_nadawcy'", (int) $numer_nadawcy));
KOD 7: wiadomość do kolejnych użytkowników w tablicy
while ($b = mysql_fetch_assoc($a))
{
fwrite($file, "/msg ".$b['number']." <".$nadawca."> $tresc");
sleep(1);
}
KONKURS
Przegląd nowości – IE 8 i GG 8
Weź udział w konkursie na najlepszego bota GG. Prace należy
wysyłać pod adres e-mail:
[email protected]
Microsoft Internet Explorer 8
już się zbliża...
Czy okryty złą sławą IE przy okazji 8 edycji odzyska chociaż część
użytkowników straconych na rzecz
Opery i Firefoksa? IE 8 wprowadzi m.in. większą wydajność, liczne uproszczenia obsługi, zwiększy bezpieczeństwo oraz będzie
lepiej chronił przed szkodliwym
oprogramowaniem.
Osoba, która wygra konkurs na
bota dostanie do wyboru konto w
serwisie SERENITY:
➢ konto normal na 3 miesiące:
 15 procesów w tle
 5 połączeń do protokołu IRC
 500 MB przestrzeni dyskowej
Czasowe przepełnienie do 5 GB
 brak limitu transferu
➢ konto mini na pół roku:
 5 procesów w tle
 1 połączenie IRC
 100 MB miejsca na dysku
Czasowe przepełnienie do 1 GB
 brak limitu transferu
Przegląd nowości – Opera 10
Po 13 latach dzielnych bojów na
rynku doczekaliśmy się 10. odsłony programu, póki co w wersji
alfa. Opera 10 będzie w pełni
przechodzić test Acid3. Nowa
wersja posiada silnik Presto 2.2,
który ma być o 30% szybszy od
poprzedniej wersji. Nowy silnik
będzie podstawą dla przyszłych
wersji mobilnych przeglądarek.
Przeczytaj więcej »
14
Przeczytaj więcej »
Nowe GG do ściągnięcia
Nowa wersja popularnego komunikatora internetowego jest już
dostępna. Wśród nowych funkcji
znajdziemy między innymi moduł
sprawdzania pisowni, dzięki któremu ilość błędów popełnianych
przez rozmówców powinna ulec
zmniejszeniu. Pojawiła się także
możliwość wstawienia swojego
awatara. Poprawiono komunikację głosową oraz wprowadzono
rozmowy w zakładkach i nowy
moduł radia.
Przeczytaj więcej »
Źródło: PurePC.pl
PurePC – Wiemy, co się kręci!
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
ZOSTA Ń LEGALNYM U Ż YTKOWNIKIEM
Do zastosowań domowych nie musimy kupować drogich programów. Poznaj ich darmowe odpowiedniki. Gdzie ich szukać?
Piractwo komputerowe jest
kradzieżą! Ceny programów i gier
są wysokie, a domowych użytkowników nie stać na oryginały. Bycie
legalnym jednak jest możliwe, a
tym bardziej wyzbycie się piractwa. Jak tego dokonać?
Często korzystamy z pirackich programów pomimo tego, że
istnieją ich darmowe zamienniki.
Jeśli nielegalne kopie pochodzą z
nieznanych źródeł, mogą być zmodyfikowane przez crackerów, a
wtedy jesteśmy narażeni na obecność błędów, wirusów i programów szpiegujących. Czy nie lepiej
spać spokojnie podczas nalotów
Policji?
System operacyjny
Jest to chyba największy problem. System Microsoft Windows
jest obecnie powszechnie używanym systemem, a jego ceny dla
większości Polaków są wysokie.
Producenci komputerów PC zazwyczaj dołączają legalną kopię w
wersji OEM do oferowanych towarów. To jedna z najtańszych metod
zdobycia legalnego systemu Windows.
Możesz także skorzystać z alternatywnych systemów, dostępnych całkowicie za darmo. Prawdopodobnie słyszałeś już o otwartym systemie Linux, rozwijanym
przez Linusa Torvaldsa. Jest głównie stosowany na serwerach, lecz
powstaje dużo dystrybucji dla zastosowań biurkowych, np. dla
biur, dla graczy, do obróbki multimediów, do celów edukacyjnych,
do Internetu oraz pod ogólne zastosowania. Istnieją też inne rodziny systemów operacyjnych, np.
BSD. Zobacz więcej w Wikipedii:
system operacyjny.
Jeśli nie wiesz, jak rozpocząć
przygodę z Linuksem i którą dystrybucję wybrać, wejdź na stronę
jakilinux.org.
Niestety, programiści olewają
te systemy. Jest możliwość uruchomienia w systemie Linux programów napisanych pod Windows,
lecz w niektórych przypadkach
pojawiają się problemy. Jeżeli jesteś programistą i chcesz tworzyć
wieloplatformowe programy, skorzystaj z bibliotek, które to ułatwią, np. wxWidgets, QT, GTK.
Pakiet biurowy
Microsoft Office nie jest jedynym zaawansowanym pakietem
biurowym do zastosowań domowych i biurowych. Najpopularniejszym darmowym odpowiednikiem
jest OpenOffice.org. Jest dostępny
całkowicie po polsku! Pakiet zawiera: edytor tekstu, arkusz kalkulacyjny, edytor wyrażeń matematycznych, edytor grafiki wektorowej oraz moduł do tworzenia
prezentacji. Umożliwia zapis dokumentów do formatu PDF bez
instalacji dodatków. Obsługuje
rozszerzenia.
Pakiet OpenOffice.org jest
rozpowszechniany
na
licencji
open source. Powstaje wiele kompilacji, np. OpenOffice.ux.pl zawierający więcej grafiki i przykładowych dokumentów, OpenOffice
Novell Edition, GoOO albo płatny
OpenOfficePL oferujący dodatkowo pomoc techniczną. OpenOffice.ux.pl jest dostępny w wersji bez-
GIMPshop zbliżony interfejsem do
Photoshopa.
Dla grafików 3D również istnieje kilka dobrych produkcji. Najpopularniejszy jest Blender 3D.
Program jest trudny w obsłudze,
lecz trzymając jedną rękę na myszce, a drugą na klawiaturze, większość operacji można wykonać
szybciej niż w płatnych aplikacjach. Interfejs przypomina korektor muzyczny, tablicę przycisków,
a niektórym kojarzy się ze wstążkami zastosowanymi w Microsoft
Office (który został wydany kilka
lat później). W Blenderze 3D wykonamy też animacje i gry.
Programy SHAREWARE
Kolejną sprawą są programy
na licencji shareware. Są udostępniane za darmo, lecz ich legalnie
używać po okresie próbnym, należy je zarejestrować i uiścić opłatę.
Zazwyczaj nie brakuje ich darmowych odpowiedników freeware.
Wystarczy poszukać w portalu DobreProgramy.pl albo skorzystać z
wyszukiwarki. Oto przykładowa lista zamienników. Trial – to demo
komercyjnego programu, zaś GPL
– licencja open source, czyli programu z dostępnym dla każdego
kodem źródłowym.
Tabela 1: Przykłady darmowych odpowiedników płatnych programów
przeznaczenie
shareware / trial
freeware / GPL
Przeglądanie i podstawowa
obróbka grafiki
ACDSee
IrfanView
Operacje na serwerze FTP
Total Commander,
FlashFXP
FileZilla
FL Studio
Jeskola Buzz,
Psycle
Pajączek,
PHP Designer
kED, HateML Pro,
1st Page
WinRAR, WinZip
7-Zip, TugZIP
Tworzenie muzyki
Tworzenie stron WWW
Archiwizery
płatnej oraz płatnej z pomocą
techniczną i podręcznikiem.
Tworzenie i edycja grafiki
Innym przykładem jest program do obróbki grafiki rastrowej
– Adobe Photoshop, który kosztuje
jeszcze więcej niż Microsoft Office. Zbliżoną do niego funkcjonalność posiada darmowy program
The GIMP. Jest dość intuicyjny w
obsłudze. Na bazie Gimpa powstał
Nie ma sensu podawać więcej
przykładów, gdyż i tak nie wymienię wszystkich. Jeśli uważasz, że
któregoś brakuje w tabeli, napisz
komentarz pod tym artykułem na
stronie eioba.pl.
Magazyny komputerowe
Darmowe programy czasami
nie mogą zastąpić komercyjnego
oprogramowania, np. do tworzenia animacji Flash lub nauki języ-
15
Magazyn wolnego oprogramowania INSERT – wydanie pierwsze
ków obcych. Płatne programy są
dołączane na płytach CD lub DVD
większości czasopism komputerowych, które nie kosztują fortuny.
Ich autorzy otrzymują za to swoje
honorarium. Zdarzają się często
dobre okazje. Programy, muzykę
i filmy znajdziemy także w wielu
innych gazetach, np. w Gazecie
Wyborczej. Nie brakuje czasopism
dla fanów gier komputerowych.
Darmowa muzyka
Ci, którzy twierdzą, że ściąganie pirackich plików .mp3 z sieci
jest jedynym sposobem, aby słuchać dobrej muzyki za darmo, są
w błędzie. Największym zbiorem
darmowych utworów na licencji
Creative Commons jest Jamendo.
Są tam różne produkcje – i ciekawe, i kiepskie. Niektóre lepsze od
płatnych. Różne gatunki muzyki.
Musisz sam odnaleźć najlepszych
wykonawców. Nie zniechęcaj się,
jeśli początkowe poszukiwania nie
będą efektywne. Zachęcam jednak
do dzielenia się ulubionymi zespołami, albumami bądź tytułami z
tak potężnego zbioru muzyki dostępnej całkowicie za darmo!
W Internecie możesz znaleźć
inne serwisy społecznościowe, w
których zespoły lub niezależni
twórcy udostępniają swoje dzieła
bez opłat, np. Muzango stworzony
przez Gadu-Gadu SA.
Wykorzystaj Internet
Darmowe kreacje są też dostępne w serwisie społecznościowym last.fm. To nie wszystko. Dostępne są także fragmenty większości popularnych utworów. Na
stronach wykonawców znajdziesz
odnośnik do radia, które umożliwia odtworzenie pełnych wersji
wybranych utworów w określonej
kolejności – zazwyczaj pogrupowanych jest kilku wykonawców. Produkcje, których słuchasz za pomocą radia, są automatycznie dodawane do Twojej biblioteki.
Możesz także odtworzyć swoją bibliotekę, gdy znajdzie się w
niej wystarczająca ilość utworów.
Radio będzie odtwarzać tylko te
pozycje, które się w niej znajdują.
Ciekawym projektem jest też
serwis open.fm zawierający ponad
40 dostępnych za darmo kanałów
radiowych, np. „100% Dżem”.
16
Wyrzeczenia
Najlepsze darmowe programy
Nie można być legalnym bez
wyrzeczeń, np. usunięcia wszystkich nielegalnych programów i
plików oraz nieinstalowania ich.
Jeśli nie posiadasz oryginalnej komercyjnej gry – po prostu znajdź
inną. Może jest podobna, a darmowa? Autorzy często udostępniają
dema swoich gier. W przypadku
Need For Speed, jeśli chcesz się
tylko pościgać i nie potrzebujesz
nic więcej, wystarczy Ci wersja
DEMO. Bezsensowne jest także
zaśmiecanie dysku twardego zbiorami nielegalnych utworów muzycznych i filmów, które często
lecą w radiu i telewizji.
Polecane strony WWW
http://dobreprogramy.pl
http://jakilinux.org
http://ubuntu.pl
http://jamendo.com
http://www.opensourcedvd.pl
http://www.pandora.com
http://czytelnia.ubuntu.pl
WebCM
Polecani wykonawcy
➢ JT Bruce
Progresywny rock i metal
Obecnie są dostępne 3 albumy
do pobrania bez żadnych opłat.
Kompozycje cechują się dużą
dynamiką i szerokim zakresem
dźwięków oraz nagłymi zmianami nastroju. Brak wokalu.
➢ Daniel Bautista
Hiszpański gitarzysta. W jego
zbiorze muzyki udostępnianej
za darmo znajduje się między
innymi muzyka klasyczna, np.
utwory Jana Sebastiana Bacha,
symfonie Beethovena, a także
znane kompozycje „Dla Elizy”
oraz „Sonata Księżycowa”. Jest
także popularny „Lot trzmiela”
Nikołaja Rimskiego-Korsakowa.
➢ Maya Filipič
Pasjonaci fortepianowej muzyki poważnej też znajdą coś dla
siebie. Polecamy kompozytorkę
i pianistkę ze Słowenii.
➢ Inni wykonawcy:
 Jakub Borowski (PL)
 Carlos Saura (ES)
 7BZH (Celtic)
➢ The GIMP
Rozbudowany program działający na platformach: Windows,
POSIX (m.in. Linux) i MacOS
do obróbki grafiki rastrowej.
Zawiera dużo narzędzi. Jego
możliwości można rozszerzać
za pomocą filtrów i wtyczek.
www.gimp.org
➢ kED
Polski lekki edytor stron WWW.
Główne cechy to: kolorowanie
składni wielu języków w 1 dokumencie, łatwa zmiana strony
kodowej, szybkie wstawianie
znaczników za pomocą klawiatury, wyszukiwanie i zamiana
fraz, szybkie tworzenie wcięć,
sortowanie, zaznaczanie fragmentów. Zawiera też okna do
wstawiania tabel, grafiki...
freezone.fc.pl/?file=soft
➢ IrfanView
Przeglądarka grafiki. Zawiera
narzędzia do obróbki obrazów,
np. zmiany rozmiaru, kolorów,
kontrastu, nasycenia i jasności,
obrotu o dowolny kąt, zmiany
głębi kolorów. Ciekawą funkcją
jest automatyczne dopasowanie
kolorów. Można stosować różne
efekty, np. wyostrzenie, mediana, rozmycie, sepia, wykrycie
brzegów, dyfuzja, skręcenie...
Program umożliwia masowe
dokonanie zmian za pomocą
„przetwarzania wsadowego”.
irfanview.com
➢ 7-Zip
Archiwizer plików. Obsługuje
formaty: 7Z, ZIP, GZIP, BZIP2,
TAR, CAB, AJR, DEB, ISO, MSI,
RPM, ODT, XAR... Skompresowane pliki i foldery zajmują
mniej miejsca niż w przypadku
komercyjnych konkurentów.
www.7-zip.org
➢ Blender 3D
Rozbudowany program do tworzenia grafiki trójwymiarowej,
opisany wyżej w tym artykule.
Umożliwia też tworzenie animacji i gier. Interesujący jest zbiór
szkoleń w serwisie YouTube.
www.blender.org
obsługa programu – filmy

Podobne dokumenty