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