• 2012 (3)
  • 2011 (51)
  • 2010 (38)
  • 2009 (36)
  • < kwietnia 2011 >
    Pn Wt Ś Cz Pt So N
            1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30  

    Weź udział!

    Logo konkursu Wolny Wybór

    wypróbuj

    Logo wielojęzycznego chatu

    : Home / blog / wpisy wg daty
    Kwietnia 2011

    Piątek 29 kwietnia 2011

    Ubuntu 11.04 - recenzja PDF Drukuj Napisz e-mail
    Wpisał %s Kuba Chrobot
    piątek, 29 kwietnia 2011 13:19
    Inne tematy / Linux

     

    WSTĘP

    28 kwietnia 2011 roku o godzinie 11:04 udostępniona zostala wersja finalna nowej wersji najpopularniejszej dystrybucji linuxa Ubuntu. Ta wersja jest szczególna – zmieniono domyślne środowisko graficzne, zmieniono główne oprogramowanie, jest jeszcze lepszy Ubuntu Software Center. Czyli przedstawiamy „Natty Narwhal”.

    Read more
    Zmieniony ( sobota, 30 kwietnia 2011 05:02 )

    Strumieniowe kanały muzyczne na bazie YouTube PDF Drukuj Napisz e-mail
    Wpisał %s Jan Jackowicz-Korczyński
    piątek, 29 kwietnia 2011 08:53
    Multimedia / audio

    Serwis ShortForm udostępnia i umożliwia tworzenie strumieniowyh kanałów muzycznych.

    Dokument jest aktualnie ładowany...

    Read more
    Zmieniony ( piątek, 29 kwietnia 2011 08:59 )

    ShortForm: społeczny serwis kanałów na bazie Youtube PDF Drukuj Napisz e-mail
    Wpisał %s Jan Jackowicz-Korczyński
    piątek, 29 kwietnia 2011 08:40
    Multimedia / video

    Serwis SchortForm jest serwisem udostepniającym kanały muzyczne i filmowe w czasie rzeczywistym z serewisu Youtube. Jest ciekawym i innowycajnym wykorzystanie Youtube API. Serwis udostepnia transmisję strumieniową wielu tematycznych kanałów muzycznych oraz filmowych tworzonych i udostępnianych przez autorów i własciecieli serewisu. Ma wbudowaną także funkcję społecznościową. Można założyć konto VJ'eja w serewisie i tworzyć oraz udostęponiać swoje kanały muzyczne i filmowe.  Stąd serwis oferuje bardzo duży zakres kanałów do wyboru. 

    Autorzy usługi bazując na API Youtube zbudowali dla Video Di' jeów bardzo atrakcyjne narzedzia do generowania własnych kanałów. Ich opis można znaleźć w artykule ShortForm: Mix and Share the World's Videosautorstwa dewelopera serwisu Jereme Monteau, (apiblog.youtube.com/2011/04/shortform-mix-and-share-worlds-videos.html )

     

    SchortForm ma siedzibę w San Francisco i jest finansowany przez NetService Ventures Group and IVF.

    Zobacz: http://www.shortform.com

    Read more
    Zmieniony ( piątek, 29 kwietnia 2011 09:11 )


    środa 27 kwietnia 2011

    Możliwość załączania zewnętrznych dokumentów do artykułu PDF Drukuj Napisz e-mail
    Wpisał %s Jan Jackowicz-Korczyński
    środa, 27 kwietnia 2011 17:57
    Pomoc redakcyjna / artykuły

    W systemie udostępniliśmy dodatek (plugin) Ari Doc Viewer, który umozliwliwia właczenie to treści artykułu zewnętrznych dokumentó w następujących formatach:

     

    • doc / docx - Microsoft Word Document
    • xls / xlsx - Microsoft Excel Spreadsheet
    • ppt / pptx - Microsoft PowerPoint
    • pps - PowerPoint Slideshow
    • odt - OpenDocument Text
    • ods - OpenDocument Spreadsheet
    • odp - OpenDocument Presentation
    • sxw - OpenOffice.org Writer Document
    • sxc - OpenOffice.org Calc Spreadsheet
    • sxi - OpenOffice.org Impress Presentation
    • wpd - Corel Word Perfect Document
    • pdf - Adobe Portable Document Format
    • rtf - Rich Text Format
    • html - Hyper Text Markup Language
    • txt - Plain Text Document
    • csv - Comma Separated Values
    • tsv - Tab Separated Values
    • pages - Apple Pages
    • ai - Adobe Illustrator
    • psd - Adobe Photoshop
    • dxf - Autodesk AutoCad
    • svg - Scalable Vector Graphics
    • eps / ps - PostScript
    • ttf - TrueType
    • xps - XML Paper Specification

    plugin uruchamia się za pomocą kodu:

    {aridoc opcjonalnie: parametry} dokument  {/aridoc}


    Dostępne parametry:

    engine - dostępne wartości: 

    •  iframe - za pomocą kodu html <iframe>
    • article - inny artykuł Joomla 
    • zoho - za pomocą viewera systemu ZOHO
    • google - za pomocą viewera systemu Google Docs

    width - wartość podaje się w pikselach lub procentach

    height - wartość podaje się w pikselach lub procentach

    loadingPane - określa, czy wyświetlić animację w trakcie ładaowania dokumentu, wartość = 0 nie wyświetlać, wartość = 1 wyświetlać.

    loadingMessage - komunikat jaki ma być wyświetlany w trakcie ładowania dokumentu

    class - Klasa CSS dloa konteneru dokumentu


     

     Wszystkie parametry można jako domyślne ustawić w konfiguracji pluginu: 


    Przykłady:

    {aridoc engine="zoho" width="600" height="300"}PATH_TO_DOCUMENT{/aridoc} 

    {aridoc engine="zoho" width="600" height="300"}http://www.domain.com/docs/doc1.pdf{/aridoc} 

    {aridoc engine="google" width="550" height="450"}documents/my_doc.doc{/aridoc} 

    {aridoc engine="iframe" width="500" height="400"}LINK_TO_PAGE{/aridoc} 

    {aridoc engine="iframe" width="100%" height="400"}http://www.ari-soft.com{/aridoc} 

    {aridoc engine="article" width="500" height="400" id="ARTICLE_ID"}{/aridoc} 

    {aridoc engine="article" width="500" height="400" id="45"}{/aridoc} 


    Plugin Ari Doc Viewer jest dostepny dla Joomla 1.5 oraz 1.6: 

    http://extensions.joomla.org/extensions/core-enhancements/embed-a-include/16126



    Read more
    Zmieniony ( środa, 27 kwietnia 2011 18:34 )


    Wtorek 26 kwietnia 2011

    Jak przejść na IPv6 PDF Drukuj Napisz e-mail
    Wpisał %s Teodor Woźniak
    wtorek, 26 kwietnia 2011 17:59
    Inne tematy / Sieci komputerowe

    Wielkimi krokami zbliża się wprowadzenie IPv6. Wynika to z nieracjonalnego rozdawania adresów IPv4 na początku istnienia Internetu a także z rosnącej liczby użytkowników globalnej sieci. IPv6 oprócz większej przestrzeni adresowej ma kilka ważnych zalet: możliwość uproszczenia budowy routerów (nie muszą fragmentować pakietów), całkowita rezygnacja z NAT-u, autokonfiguracja bez potrzeby wysyłania zapytań do routera, badanie sąsiedztwa bez ARP itd. Pomijając błąd jaki popełniła grupa wdrażająca standard, polegający na przydzieleniu każdemu użytkownikowi puli /64, protokół jest obiecujący zarówno dla dostawców treści jak i dla użytkowników.

    Read more


    Laci Perényi Sportsart PDF Drukuj Napisz e-mail
    Wpisał %s helly
    wtorek, 26 kwietnia 2011 17:04
    Photo / Art

    I am really into sports thats why I chose Laci Perényi, one of the most renowned German sport photographers. Perényi, who was born  in Bratislava, Slovakia, was in the 1970ies  a competitive athlete himself and a member of the first German swimming national team. His work as a sports photographer he started in 1974 and among many other national and international events of all sports, he was accredited as a sport photographer at 15 Olympic Games and 8 FIFA World Cups. What's so special about him? He doesn't only want to document the competitions but he wants to take "other" pictures. He takes them from other places, doesn't want to show all the advertising around it and plays with the light. His sports pictures are creative and art. Have a look... http://www.lp-sportsart.de/

    Read more


    Poniedziałek 25 kwietnia 2011

    Wydajność bazy danych, a wydajność plików tekstowych PDF Drukuj Napisz e-mail
    Wpisał %s Tomasz Stasiak
    poniedziałek, 25 kwietnia 2011 15:58
    IT / Dev zone

    W związku z dyskusją jaka się wywołała między mną, a yarpo w komentarzach pod moim artykułem dotyczącym logowania w PHP, skorzystałem z propozycji i zrobiłem kilka testów wydajnościowych porównujących szybkość działania bazy danych opartej na plikach i takiej opartej na MySQL. Stanowiska były następujące: ja twierdziłem, że pliki są szybsze, yarpo, że niekoniecznie.

    Testy zostały przeprowadzone na małej (275 userów) i dużej (27057 userów) porcji danych, z wykorzystaniem bazy MySQL oraz plików tekstowych; przy nich była brana pod uwagę szybkość dodawania oraz szybkość wyszukiwania. Parametry środowiska testowego (serwera):

    {codecitation}

    Procesory: 2 x Intel(R) Core(TM) i7 CPU X 980 @ 3.33GHz

    RAM: 1362160 kB/24738796 kB

    Apache: 2.2.17

    MySQL: 5.1.56

    Silnik bazy danych: MRG_MYISAM

    {/codecitation}

    Kody, które służyły do testów:

    Baza na plikach:

    {codecitation class='brush: php'}

            include 'profiler.php';

            /**

             * Pliki tekstowe

             */

            /// Tworzenie bazy użyszkodników

            $file = fopen("db.php", "a");

            $time1 = new Profiler();

            fwrite($file, "

             for($i = 0; $i < 275; ++$i)

            {

                    $user = HTMLSpecialChars(chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)));

                    $db[] = array('user' => $user, 'passwd' => hash('sha256', $user));

            } // End for

            fwrite($file, '$db = '.var_export($db, true).';');

            echo 'Wpisywanie trwało: ' . $time1->stop()."\n";

            fclose($file);

     

            /// Szukanie

            include 'db.php';

            $time2 = new Profiler();

             for($i=0, $x = count($db); $i < $x AND $db[$i]['user'] != 'k+]?N]Z+8' AND $db[$i]['passwd'] != '2895c383bd3c5ba1a6672d0759f88c0f692fd90bd9298e8ce572eac8cf042373'; ++$i);

            echo 'Szukanie trwało: ' . $time2->stop();

    {/codecitation}

    Baza danych:

    {codecitation class='brush: php'}

            include 'profiler.php';

            /**

             * Baza danych

             */

            $conn = mysql_connect("localhost", "adm", "aaaa");

            mysql_select_db("tomekby_test");

            /// Tworzenie bazy użytkowników

            $count1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM `users`;"));

            $time1 = new Profiler();

             for($i = 0; $i < 300; ++$i)

            {

                    $user = HTMLSpecialChars(chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)).chr(rand(32, 126)));

                    $q = "INSERT INTO `users` (`id`, `user`, `passwd`) VALUES (NULL, '".$user."', '".hash('sha256', $user)."');";

                    mysql_query($q);

            } // End for

            echo 'Wpisywanie trwało: ' . $time1->stop();

            /// Liczenie dodanych rekordów

            $count2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM `users`;"));

            echo "\nDodane: ".($count2[0] - $count1[0]);

     

            /// Szukanie

            $time2 = new Profiler();

             mysql_query("SELECT * FROM `users` WHERE `user` = 'k+]?N]Z+8' AND `passwd` = '2895c383bd3c5ba1a6672d0759f88c0f692fd90bd9298e8ce572eac8cf042373';");

            echo "\n".'Szukanie trwało: ' . $time2->stop();

            

            mysql_close($conn);

    {/codecitation}

    Profiler: (tu podziękowania dla yarpo za klasę, bo nie chciało mi się samemu pisać :p)

    {codecitation class='brush: php'}

    // autor Patryk yarpo Jar, klasa Profiler pozwala na mierzenie czasu wykonania skryptu

    class Profiler {

        private $start = false;

        private $stop  = false;

        private $duration = false;

     

        public function __construct() {

            $this->start = $this->getCurrentTime();

        }

     

        private function getCurrentTime() {

            list($usec, $sec) = explode(" ", microtime());

            return ((float)$usec + (float)$sec);

        }

     

        private function measureDuration() {

            if (false != $this->stop or false != $this->start) {

                $this->duration = $this->stop - $this->start;

                return $this->duration;

            }

     

            return false;

        }

     

        public function start() {

            $this->stop = false; // skoro zaczelismy, to popredni stop jest niewazny

            $this->duration = false; // nie wiemy kiedy konie, wiec skad mamy znac dlugosc?

            $this->start = $this->getCurrentTime(); // aktualny czas

     

            return $this->start;

        }

     

        public function stop() {

            $this->stop = $this->getCurrentTime();

            return $this->measureDuration();

        }

     

        public function getStartTime() {

            return $this->start;

        }

     

        public function getStopTime() {

            return $this->stop;

        }

     

        public function getTime() {

            // jeszcze nie obliczono trwania

            if (false === $this->duration) {

                return $this->stop();

            }

     

            return $this->duration;

        }

    }

    {/codecitation}

    Jak widać do obu baz byli dodawani użytkownicy o losowo generowanych nazwach i hasłach, a później wyszukiwany jakiś użytkownik, który niekoniecznie musiał istnieć.

    Oba kody spokojnie można by jeszcze zoptymalizować, ale więcej mówi raczej typowy przypadek. W żadnym z testów nie uwzględniłem czasu otwarcia połączenia/wybrania bazy czy otwarcia/include'a pliku, aby pokazać sam czas operacji na danych (BTW mam nieodparte wrażenie, że otwarcie połączenia i wybranie bazy jest bardziej czasochłonne od otwarcia pliku...). Baza danych znajdowała sie na tym samym serwerze, co skrypt (co widać po wpisaniu localhost w hoście bazy).

    Teoretycznie można by się pokusić o trochę bardziej realistyczny przypadek, czyli otwieranie/zamykanie za każdym razem pliku/połaczenia z bazą, aby zasymulować operacje wykonywane przez różnych użytkowników (bo od kiedy jeden uzytkownik wykonuje ponad 50 tysięcy operacji na bazie danych w jednym czasie? :>), ale nie jestem pewien, jak serwer by zareagował na takie obciążenie i wolę go nie przeciążać za bardzo.

    Wyniki z użyciem plików:

    {codecitation}

     Test na 27057 rekordach

     Wielkość pliku: 3,59 MiB

     Wpisywanie trwało: 0.197447061539

     Szukanie trwało: 0.0108730792999

     

     Test na 275 rekordach

     Wielkość pliku: 36,91 KiB

     Wpisywanie trwało: 0.00179982185364

     Szukanie trwało: 0.000112056732178

    {/codecitation}

    Wyniki z użyciem bazy danych:

    {codecitation}

     Dodane: 27057

     Wielkość tabeli: 3,12 MiB

     Wpisywanie trwało: 1.76564502716

     Szukanie trwało: 0.00290703773499

     

     Dodane: 275

     Wielkość tabeli: 34,00 KiB

     Wpisywanie trwało: 0.0166158676147

     Szukanie trwało: 0.00014591217041

    {/codecitation}

    Jak widać, im więcej rekordów tym większą wydajność (w stosunku do plików) oferuje baza danych. Na niewielkiej porcji danych pliki tekstowe są niewiele szybsze od bazy przy wyszukiwaniu, natomiast o wiele szybsze przy zapisie. Prawdę mówiąc zdziwiła mnie tak duża różnica prędkości zapisu między bazą danych a plikami. Spodziewałem sie, że te drugie będą szybsze, ale nie prawie 10 razy! Niestety pliki mają także swe wady - przy dużej ilości danych może nam po prostu zabraknąć pamięci, gdyż cała tablica z pliku tekstowego musi zostać wczytana do pamięci, a przy kilku(dziesięciu|set) tysiącach użytkowników te dane mogą sporo zajmować (przede wszystkim przy bardziej rozbudowanych strukturach, nie tylko uzytkownik/hasło). Dodatkową ciekawostką może być fakt, iż tabela bazy danych MySQL waży mniej niż plik tekstowy.

    Mam teraz wrażenie, że jakimś cudem udało mi się obalić dowód przez oczywistość :P

    W razie wszelkich sugestii śmiało pisać - postaram się wybronić ze swego stanowiska.

     

    ps. początkowo to miał być zwykły komentarz, ale się "trochę" za bardzo rozrósł...

    ps2. prawie zapomniałem: paczka z kodem

     

    //edit: Nowe testy:

    Tym razem porównanie między szybkością otwarcia połączenia, wybrania bazy i zamknięcia połączenia oraz między czasem otwarcia, zablokowania i zamknięcia pliku. Tym razem nie będę się aż tak rozpisywal, bo już sił brakuje - może później ;]

    Kod użyty do testowania:

    {codecitation class='brush: php'}

         include 'profiler.php';

         /// Łączenie/odłączanie bazy danych
         $time1 = new Profiler(); // Czas startu
         for($i = 0; $i < 100000; ++$i)
         {
              $conn = mysql_connect('localhost', '123', '123456');
              mysql_select_db('test');
              mysql_close($conn);
         } // End for
         echo 'Operacje trwały: ' . $time1->stop()."\n"; // Czas końca

         /// Otwieranie/zamykanie/blokowanie pliku
         $time2 = new Profiler(); // Czas startu
         for($i = 0; $i < 100000; ++$i)
         {
              $file = fopen('file', 'a');
              if (flock($file, LOCK_EX))
              flock($file, LOCK_UN);
              fclose($file);
         } // End for
         echo 'Operacje trwały: ' . $time2->stop(); // Czas końca

    {/codecitation}

    Tym razem oba testy zostały umieszczone w jednym pliku. Jak widać, w obu przypadkach zostało wykonane 100.000 operacji. Wyniki (output skryptu) - najpierw baza danych, później pliki:

    {codecitation}

    Operacje trwały: 10.1349132061

    Operacje trwały: 0.940469026566  

    {/codecitation}  

    Trzeba przyznać, że wyniki testu są druzgoczące - o ile przy zapisie/odczycie z bazy/pliku różnice były co najwyżej rzędu wielkości, to w tym wypadku różnica to ponad dwa rzędy wielkości (0,9s dla pliku w porównaniu do 10,1s dla bazy). Chociaż, patrząc z drugiej strony - nikt normalny chyba nie otwiera połączenia z bazą danych 100k razy za jednym zamachem? :>

     

    jeszcze tradycyjna paczka z kodem :)

    Read more
    Zmieniony ( wtorek, 26 kwietnia 2011 12:50 )


    Sobota 23 kwietnia 2011

    Logowanie w PHP - część druga PDF Drukuj Napisz e-mail
    Wpisał %s Tomasz Stasiak
    sobota, 23 kwietnia 2011 22:30
    PHP / Artykuły PHP

    Logowanie w PHP - część druga (wykorzystanie bazy danych)

    W tej części postaram się wyjaśnić, jak w prosty sposób stworzyć logowanie na stronie z wykorzystaniem bazy danych MySQL.
    Aby tego dokonać będziemy potrzebowali czterech rzeczy - serwera z obsługą php i bazą danych MySQL, oraz trzech plików: db.php, który stworzy nam odpowiednie tabele w bazie danych, login.php w którym umieścimy formularz logowania, oraz secret.php, który będzie odpowiedzialny za sprawdzenie, czy użyszkodnik użytkownik ma dostęp do tajnych zasobów.
    Zaczynamy! Tworzymy plik login.php z formularzem logowania o treści identycznej jak w poprzednim przykładzie:
    http://ideone.com/4Wmqm
    Do połączenia i wykonywania wszystkich operacji na bazie danych wykorzystamy bibliotekę PDO (która powinna być uprzednio zainstalowana na serwerze). Następnie musimy utworzyć plik db.php, w którym umieścimy kod łączący się z bazą danych oraz tworzący w niej odpowiednią tabelę:
    http://ideone.com/52z94
    Wyjaśnienie: na początku otwieramy sekcję try..catch łapiącą wszelkie wyjątki, które może wyrzucić klasa PDO, wewnątrz try{} kolejno:

    • otwieramy połączenie z bazą danych, gdzie: host_bazy to domena/adres IP serwera bazy danych (jeśli to jest ta sama maszyna, można wpisać localhost); nazwa_bazy - jest to nazwa bazy danych z której będziemy korzystać; user i pass to odpowiednio nazwa użytkownika i jego hasło do bazy danych
    • tworzymy tabelę users zawierającą dane o użytkownikach
    • dodajemy użytkownika admin z takim samym jak poprzednio haszem hasła - czyli utworzonym z 'adminpasswd'
    • Wyświetlamy komunikat

    Natomiast w bloku catch łapiemy ewentualne wyjątki oraz wyświetlamy je jeśli wystąpią. W tym wypadku hasło tak samo jak w wypadku logowania z użyciem plików tekstowych jest haszowane. Do wygenerowania haszu z hasła można skorzystać z dostępnych w Internecie narzędzi, np. http://www.insidepro.com/hashes.php. Po utworzeniu odpowiednich tabel można (a nawet dobrze by było) usunąć ten plik, gdyż nie jest on nam do niczego potrzebny. Jeśli to już zostało zrobione, pozostał już tylko 1 plik - secret.php zawierający zasoby, do których dostęp chcemy ograniczyć. Oto, co powinien zawierać:

    • Sprawdzenie, czy użytkownik istnieje w bazie danych i czy podał prawidłowe dane
    • Zapisanie w sesji informacji o tym, że użytkownik ma prawo do dostępu (aby nie trzeba było się logować po każdym odświeżeniu stron
    • Wyświetlenie naszej tajnej treści

    Zaczynamy - tworzymy plik secret.php o następującej treści:
    http://ideone.com/xDC0d
    Teraz wyjaśnienie co się dzieje linijka po linijce: standardowo otwieramy sekcję kodu PHP, w następnej linii rozpoczynamy sesję, po czym sprawdzamy, czy: a) użytkownik wysłał uprzednio jakieś dane przez formularz, b) jest zalogowany. Jeśli żadna z tych sytuacji nie zaistniała - kończymy działanie skryptu (dyrektywa die()). Gdy już wiemy, że użytkownik jest zalogowany/przesłał dane przez formularz otwieramy połączenie z bazą danych - host i nazwa bazy danych, jak i hasło muszą być atkie same jak podczas tworzenia tabeli uzytkowników. Następne 3 linie to tworzenie zapytania wyszukującego użytkownika w bazie danych. :user oraz :passwd oznaczają odpowiednio użytkownika i hasło. Następnie pod wspomniane :user i :passwd podpisujemy odpoiednio nazwę użytkownika, jak i hasz hasła podanego przez użytkownika (podanie danych w ten sposób zamiast bezpośrednio w zapytaniu zabezpiecza nas przed błędami typu SQL Injection; patrz: mój artykuł o bezpieczeństwie danych osobowych w serwisach internetowych, a w szczególności sekcje dot. odzyskiwania haseł i błędów SQL Injection).
    Warunek if sprawdza, ile rekordów zwróciło zapytanie; jeśli 1, oznacza to, że użyszkodnik użytkownik z takim hasłem i nazwą został odnaleziony w bazie danych i możemy ustawić wartość $_SESSION['logged_in'] (informującej o zalogowaniu) na true. Ostatnia linia w sekcji try to zamknięcie połączenia pobranych wyników. W sekcji catch, podobnie jak w pliku db.php łapiemy ewentualny wyjątek i wyświetlamy go. Sekcji wewnątrz ciała dokumentu nie będę opisywał, gdyż było to zrobione w poprzedniej części.

     

    Jeszcze obiecane porównanie:

        Logowanie z wykorzystaniem plików tekstowych:
            Zalety:
                - Szybkość
                - Niewielkie wymagania wobec serwera
            Wady:
                - Skomplikowane zarządzanie użytkownikami (edycja/usuwanie)
        Logowanie z wykorzystaniem bazy danych:
            Zalety:
                - Łatwość zarządzania użytkownikami
            Wady:
                - Mniejsza szybkość
                - Większe wymagania o serwera

    Jak widać, logowanie z użyciem bazy danych ma mniej zalet, lecz ta jedna zwykle przeważa - utrata wydajności nie jest tak duża, a zarządzanie jest wiele prostsze i wydajniejsze.

     

    //edit: paczka z kodem do pobrania

    Read more
    Zmieniony ( poniedziałek, 25 kwietnia 2011 14:45 )


    Piątek 22 kwietnia 2011

    Logowanie w PHP - część pierwsza PDF Drukuj Napisz e-mail
    Wpisał %s Tomasz Stasiak
    piątek, 22 kwietnia 2011 22:02
    PHP / Artykuły PHP

    Logowanie w PHP

    W tym tutorialu postaram się opisać, jak w prosty sposób stworzyć logowanie na stronie. Jest ono przydatne, np. gdy chcemy udostępnić jakieś informacje
    lub funkcjonalność tylko zarejestrowanym użytkownikom – np. dać możliwość dodawania nowości, zdjęć etc. Potrzebne będą:

    • Serwer z obsługą PHP, np. WAMP lub XAMPP lub konto hostingowe
    • Podstawowe wiadomości dotyczące PHP i HTML
    • W dalszej części dodatkowo serwer MySQL
    • Zapał do pracy :)

    Tekst został podzielony na dwie części: logowanie z użyciem plików tekstowych, oraz z użyciem bazy danych MySQL, gdzie także zostanie umieszczone porównanie obu sposobów. Pomijam tu element konfiguracji serwera jak i bazy danych, jako iż było to opisywane w sieci wiele razy i nie dotyczy tego tekstu.

    Część pierwsza – logowanie z użyciem plików tekstowych

    Na początku będziemy potrzebowali trzech plików: login.php – zawierającego formularz logowania, db.php – zawierającego informacje o użytkownikach, oraz secret.php – czyli pliku, który chcemy zabezpieczyć przed wścibskimi użytkownikami.

    Zaczynamy – tworzymy plik login.php i umieszczamy w nim nasz formularz z danymi, które musi wpisać użytkownik, aby uzyskać dostęp do tajnego pliku:

    http://ideone.com/4Wmqm

    Jak widać powyżej, w formularzu zostały umieszczone 2 pola: user, czyli nazwa użytkownika oraz passwd, czyli hasło tegoż użytkownika. Następnie musimy stworzyć bazę danych zawierającą dane użytkowników (plik db.php):

    http://ideone.com/vldGC

    Kilka słów wyjaśnień: w pierwszej linii otwieramy kod PHP i sprawdzamy (funkcja defined()), czy stała SECRET_CONST jest zadeklarowana. Jeśli nie – zostanie wywołana funkcja die(), która kończy wykonanie skryptu. Jest to zabezpieczenie przed odczytaniem przez niepowołanych użytkowników zawartości tego pliku oraz przed próbą dołączenia go do niepowołanego skryptu. Jest to skrócona forma, wykorzystująca pewne cechy języka PHP, równie dobrze można by tę linię zapisać w taki sposób:

    http://ideone.com/qOxnM

    Lecz, jak widać tamten kod jest znacznie krótszy. Dalej mamy definicję dwuwymiarowej tablicy – pierwsza kolumna oznacza ID użytkownika (w wypadku pozostawienia pustego nawiasu ID będzie ustalane automatycznie od 0). Druga kolumna oznacza odpowiednio nazwę użytkownika (pole user) oraz jego hasło (pole passwd), które jest zakodowane za pomocą wybranej funkcji haszującej (w tym wypadku SHA-256) – w tym wypadku hasz odpowiada hasłu „adminpasswd”. Jest to niezbędne, gdyż zabezpiecza nas w dużym stopniu przed uzyskaniem nieautoryzowanego dostępu nawet w wypadku wykradzenia pliku z informacjami o użytkownikach (patrz: mój artykuł o bezpieczeństwie danych osobowych w serwisach internetowych, a w szczególności sekcja dot. odzyskiwania haseł). Dodanie następnego użytkownika ogranicza się do skopiowania drugiej i trzeciej linii oraz zmianie nazwy użytkownika i hasła. Do wygenerowania haszu z hasła można skorzystać z dostępnych w Internecie narzędzi, np. http://www.insidepro.com/hashes.php.

    Pozostał jeszcze jeden plik – secret.php, do którego dostęp ma być ograniczony. Oto elementy, które musi zawierać:

    • Definicja naszej stałej SECRET_CONST, dzięki której będziemy mogli skorzystać z naszej bazy danych
    • Sprawdzenie, czy użytkownik istnieje w bazie danych
    • Zapisanie w sesji informacji o tym, że użytkownik ma prawo do dostępu (aby nie trzeba było się logować po każdym odświeżeniu strony)
    • Wyświetlenie naszej tajnej treści

    Zabieramy się do pracy – tworzymy plik secret.php o następującej treści:
    http://ideone.com/gkQuP

    Wyjaśnienie linijka po linijce: na początku otwieramy tag PHP aby móc wykonać nasz kod, w następnej linii rozpoczynamy sesję, aby można było z niej korzystać. Następnie definiujemy naszą stałą SECRET_CONST, która umożliwi nam korzystanie z bazy użytkowników; w czwartej i piątej linii upewniamy się, czy aby na pewno użytkownik wpisał dane do formularza i czy nie jest już przypadkiem zalogowany, jeśli nie – wyświetlamy odpowiedni komunikat oraz kończymy działanie skryptu. Jeśli już jesteśmy upewnieni, że użyszkodnik użytkownik wpisał dane do formularza lub jest zalogowany możemy przystąpić do sprawdzania poprawności wpisanych przez niego danych. Dołączamy plik z informacjami o użytkownikach (dyrektywa include()) oraz w pętli for() sprawdzamy, dane wszystkich użytkowników (do czasu napotkania prawidłowych danych). Jeśli użytkownik podał prawidłowe dane, ustawiamy wartość $_SESSION[‘logged_in’] na true, aby oznaczyć informację o tym, że użytkownik został zalogowany. W następnej sekcji kodu PHP (wewnątrz sekcji HTML BODY) sprawdzamy, czy użytkownik jest zalogowany; jeśli tak – wyświetlamy naszą tajną treść, jeśli nie – także odpowiedni komunikat.

    To by było na tyle – w następnej części opiszę jak wykonać logowanie z wykorzystaniem bazy danych MySQL.

     

    //edit: paczka z kodem do pobrania

    Read more
    Zmieniony ( poniedziałek, 25 kwietnia 2011 14:46 )


    środa 20 kwietnia 2011

    LipDub - nowa forma internetowej ekspresji medialnej PDF Drukuj Napisz e-mail
    Wpisał %s Jan Jackowicz-Korczyński
    środa, 20 kwietnia 2011 04:41
    Multimedia / video

    W sieci pojawiły się nowe atrakcyjne formy kreatywności wideo: LipDub. 

    Lip-dub to technika tworzenia teledysków, w którym amatorzy udają, że wykonują daną piosenkę i wzbogacają ją o własną interpretacją wizualną. Termin ten pochodzi od dwóch zjawisk filmowych - lip synchronization (dopasowywanie dźwięku do ruchu warg) oraz dubbing.

    Ojcem tej techniki można by nazwać Jakoba Lodwicka, założyciela firmy Vimeo, który w 2006 roku, spacerując ze słuchawkami na uszach nagrał filmik ze swoim podśpiewywaniem, w domu podłożył oryginalną ścieżkę dźwiękową i umieścił go w internecie. Lip-dub bardzo szybko stał się popularny wśród internautów, którzy zaczęli tworzyć setki własnych "piosenek". Wkrótce pojawiły się też grupowe nagrania. A stąd był juz tylko krok do zapoczątkowania nietypowej studenckiej odmiany tej zabawy, którą nazwano University LipDub. 

    Lipduby upowszechniło środowisko akademickie. Wykształciła się konwencja LibDuba:

    • dobra piosenka,
    • kilkadziesiąt/kilkuset studentów-aktorów
    • scenografia w postaci uczelnianych korytarzy
    • wszystko kręcone jednym nieprzerwanym ujęciem.

    Na YouTube w ostatnim czasie zaroiło sie od akademickich LipDubów. W polskiej sieci  powstał również serwis: lipdub.pl.

    Powstały również pierwsze LipDuby zrealizowane w szkołach średnich. Zobacz: Licea Rekramuja sie Tańcząc (diablicami).

    Zjawisko LipDub jest dobrym przykładem rozwoju sieciowej kultury powstającej oddolnie, samorzutnie, a nie wymyślonej przez kreatorów kultury czy specjalistó od sieci i mediów. 

    Read more

    Strona 1 z 4
    << Początek < Poprzednia 1 2 3 4 Następna > Ostatnie >>