Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: singles, dodany: 16.03.2011 19:06, tagi: css, javascript

Na rynku przeglądarek internetowych można wyróżnić „Wielką Piątkę” – należą do niej: Firefox, Opera, Safari, Chrome oraz Internet Explorer, vel Twoja Nowa ;). Każda z tych przeglądarek posiada tzw. zestaw narzędzi developerskich. Uważam, że śmiało można powiedzieć, że prawdziwy rozwój narzędzi tego typu rozpoczął się od rozszerzenia Firefoxa: Firebug – będącego do dzisiaj najbardziej popularnym narzędziem tego typu – dla niektórych wręcz niedoścignionym wzorem. Lecz nie o Firebugu będzie ten wpis, tylko o nowej wersji operowej ważkiOpera Dragonfly – zestawu narzędzi deweloperskich przeznaczonych dla tej norweskiej przeglądarki.

Instalacja

Słowo „instalacja” zostało tutaj użyte jako metafora, ponieważ nie musimy nic instalować (poza Operą oczywiście ;) bądź ściągać uaktualnień. Wystarczy w pasku przeglądarki wpisać opera:config#DeveloperTools|DeveloperToolsURL, a w podświetlonym polu podać następujący adres: https://dragonfly.opera.com/app/cutting-edge/. Po zapisaniu konfiguracji możemy już korzystać z nowej wersji narzędzia wybierając narzędzia deweloperskie z menu bądź korzystając ze skrótu klawiszowego Ctrl + Shift + I.

Wygląd

Znacznej poprawie uległ wygląd w porównaniu do poprzedniej wersji, co dobrze oddają poniższe screeny. Teraz Dragonfly przypomina WebInspectora z WebKita.

Opera Dragonfly Old Version

Stara wersja narzędzia Opera Dragonfly

Opera Dragonfly new version

Nowa wersja narzędzia Opera Dragonfly

Poszczególne opcje zostały zdecydowanie lepiej pogrupowane, otrzymały ikony, konsola pojawia się na półprzezroczystej warstwie – tak samo opcje. Wszystko wygląda schludniej i zdecydowanie łatwiej znaleźć to czego szukamy.

DOM

Dostajemy prawie wszystko, do czego zdążyliśmy przyzwyczaić się używając FireBuga. Czyli drzewo dokumentu, a z prawej strony wyliczone listę zastosowanych stylów (także w postaci obliczonej), właściwości elementu oraz jego układ. Dodatkowo w ostatniej wymienionej zakładce mamy listę elementów wyznaczających offset danego elementu.

Opera Dragonfly DOM

Opera Dragonfly: Zakładka DOM i lista elementów wpływających na offset

Niestety, nie ma możliwości edycji parametrów elementu z poziomu zakładki Układ – możliwe jest to tylko z zakładki Style. Z ciekawostek – po kliknięciu prawym przyciskiem na nazwie właściwości CSS, jedna z opcji brzmi Specyfication for [nazwa właściwości. Po wybraniu tej opcji zostajemy przekierowani do dokładnego opisu danej właściwości na stronie W3C.

Opera Dragonfly DOM

Opera Dragonfly: Zakładka DOM i widoczna opcja Specyfication for ...

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: batman, dodany: 15.03.2011 16:37, tagi: php

Jeśli regularnie śledzicie mój blog, nie mogliście nie zauważyć serii zatytułowanej “PHP w chmurze”. Jej celem było zapoznanie się z chmurą Windows Azure oraz wszystkimi wadami i zaletami tego rozwiązania. Zacząłem również tworzyć pierwsze projekty działające w chmurze lub z jej zasobów korzystające. Najbardziej dojrzały z nich, wykorzystujący wszystkie dostępne mechanizmy przechowywania danych w chmurze znajdziecie w ostatniej części serii.

Dlaczego o tym piszę? Ponieważ dzisiaj na łamach serwisu MSDN ukazał się pierwszy artykuł poświęcony tematyce PHP na Windows Azure. Artykuł znajdziecie pod adresem http://msdn.microsoft.com/pl-pl/library/php-na-windows-azure. Kolejne części będą ukazywać się w regularnych odstępach. Zachęcam do lektury.

Autor wpisu: batman, dodany: 15.03.2011 08:50, tagi: internet

Natknąłem się ostatnio na interesującą stronę, która pokazuje jak szybko/wolno ładuje się wskazana strona w różnych lokalizacjach naszego globu. Po wpisaniu adresu testowanej strony, wyborze lokalizacji oraz przeglądarki na jakiej chcemy ją przetestować, otrzymamy w wyniku ilość sekund po których nasza strona została wczytana. Poza samym czasem ładowania, możemy zapoznać się ze szczegółowymi informacjami dotyczącymi poszczególnych elementów naszej strony – odpowiednik zakładki Sieć znanej z Firebuga.

Strona znajduje się pod adresem http://loads.in/

Autor wpisu: Śpiechu, dodany: 14.03.2011 22:34, tagi: php

Domknięcia i funkcje anonimowe to nowa rzecz w PHP 5.3. Nie będę pisał teorii, bo szkoda czasu (Google sporo wie jakby co). Za to skupię się na praktycznym wykorzystaniu. Przykłady w necie zawierają zazwyczaj bardzo proste rzeczy. Dzisiaj pokażę coś trochę trudniejszego.

Napiszemy sobie klasę Liczydlo, w której da się zapisywać różne algorytmy liczące np. jak policzyć średnią arytmetyczną, medianę i największy wspólny dzielnik. Algorytmy będą zapisywane w jednej zmiennej obiektu w postaci tablicy asocjacyjnej. Ostateczne rozwiązania będą wykonywane poprzez metodę przypominającą wzorzec projektowy Strategia.

Do napisania ~100 linijek. Start!

<?php
class Liczydlo {
 
   protected $algorytmy = array();
 
   public function setAlgorytm($nazwa, $funkcja) {
      // sprawdzamy czy uzytkownik rzeczywiscie podaje nam
      // funkcje anonimowa
      if (is_callable($funkcja)) {
         // algorytm latwo daje sie zapisac w tablicy
         $this->algorytmy[$nazwa] = $funkcja;
      }
      else {
         throw new Exception("{$funkcja} nie da sie wywolac jako funkcja");
      }
   }
 
   // glowna metoda liczaca, przyjmuje stringa z nazwa algorytmu
   // i zestaw liczb, na ktorych ma byc wykonane dzialanie
   public function rozwiaz($ciag) {
      $rozpoznany = $this->rozpoznajCiag($ciag);
      $algorytm = $this->zwrocAlgorytm($rozpoznany['algorytm']);
      return $algorytm($rozpoznany['liczby']);
   }
 
   // rozdziela ciag na nazwe algorytmu i tablice z liczbami do policzenia
   protected function rozpoznajCiag($ciag) {
      $ciag = preg_split('/[\s,;]+/', $ciag);
      return array('algorytm' => strtolower($ciag[0]), 'liczby' => array_slice($ciag, 1));
   }
 
   protected function zwrocAlgorytm($nazwa) {
      if (empty($this->algorytmy[$nazwa])) {
         throw new Exception("Nie znaleziono algorytmu o nazwie {$nazwa}");
      }
         return $this->algorytmy[$nazwa];
   }
}

Tyle na temat klasy. Póki co wie ona jak rozdzielić podany jej ciąg na działanie i liczby, ale nie zna żadnych algorytmów. Tutaj na scenę wchodzą domknięcia.

$liczydlo = new Liczydlo();
 
// na poczatek banal, ktory przyda sie pozniej
// czyli suma wszystkich liczb
$liczydlo->setAlgorytm('suma', function(array $liczby) {
   $wynik = '';
   foreach ($liczby as $liczba) {
      $wynik += $liczba;
   }
   return $wynik;
});
 
// teraz uzyjemy use() do wlaczenia w cialo funkcji zmiennej
// spoza zasiegu
$liczydlo->setAlgorytm('srednia', function(array $liczby) use ($liczydlo) {
   $liczbaElementow = count($liczby);
   if ($liczbaElementow < 2) throw new Exception('Podaj co najmniej 2 liczby');
   // skoro liczydlo potrafi policzyc sume to skorzystamy z tej mozliwosci
   $suma = $liczydlo->rozwiaz('suma ' . implode(',', $liczby));
   return $suma / $liczbaElementow;
});
 
// tutaj pojdziemy krok dalej, czyli policzymy mediane,
// ktora z kolei skorzysta ze sredniej (ktora z kolei korzysta z sumy)
$liczydlo->setAlgorytm('mediana', function(array $liczby) use ($liczydlo) {
   $liczbaElementow = count($liczby);
   if ($liczbaElementow < 2) throw new Exception('Podaj conajmniej 2 liczby');
   sort($liczby,SORT_NUMERIC);
   if (($liczbaElementow % 2) == 0) {
      return $liczydlo->rozwiaz('srednia ' .
         $liczby[($liczbaElementow/2)-1] . ',' .
         $liczby[$liczbaElementow/2]);
   }
   else {
      return $liczby[floor($liczbaElementow/2)];
   }
});
 
// no i to co tygryski lubia najbardziej, czyli
// liczenie najwiekszego wspolnego dzielnika za pomoca
// funkcji anonimowej zagniezdzonej w funkcji anonimowej
$liczydlo->setAlgorytm('nwd', function(array $liczby) {
   $nwdAlg = function($liczba1, $liczba2) {
      $liczba1 = (int) $liczba1;
      $liczba2 = (int) $liczba2;
      $liczba3 = 1;
      while ($liczba2 != 0) {
         $liczba3 = $liczba1 % $liczba2;
         $liczba1 = $liczba2;
         $liczba2 = $liczba3;
      }
      return $liczba1;
   }; // tutaj koniec zagniezdzonej f. anonimowej
   $liczbaElementow = count($liczby);
   if ($liczbaElementow < 2) throw new Exception('Podaj conajmniej 2 liczby');
   $nwd = $nwdAlg($liczby[0],$liczby[1]);
      if ($liczbaElementow > 2) {
         for ($i = 2 ; $i < $liczbaElementow ; $i++) {
            // rekurencyjne wywolanie funkcji $nwdAlg            
            $nwd = $nwdAlg($nwd,$liczby[$i]);
         }
      }
      return $nwd;
});

Jak tego ustrojstwa używać? Np. tak:

echo $liczydlo->rozwiaz('nwd 6,9,90');
echo $liczydlo->rozwiaz('mediana 1,3,4,5,6');

Otrzymujemy wyniki zgodne z przewidywaniami: 3 i 4.

Na koniec wnioski:

  • możemy sprawdzić czy zmienna nadaje się do wywołania za pomocą funkcji is_callable()
  • jedna funkcja anonimowa może zawierać inne funkcje anonimowe
  • aby dostarczyć coś spoza zasięgu funkcji używamy use()

Zażalenia lub prośby o dodatkowe wyjaśnienia pisać w komentarzach. Klasę pisałem w ramach relaksu niedzielnego, to mogą pojawić się jakieś błędy.

P.S.: Sposób liczenia NWD podpieprzyłem z jakiegoś forum dla gimnazjalistów :-) (tak to jest jak się śpi na matematyce)

Autor wpisu: batman, dodany: 14.03.2011 08:00, tagi: zend_framework

Pracując nad różnymi projektami opartymi o Zend Framework, obserwowałem jakie funkcjonalności najczęściej w tych projektach się powtarzały, by móc przygotować jedną uniwersalną, prostą w przenoszeniu bibliotekę rozwiązującą konkretny problem. Okazało się, że najczęściej potrzebowałem prostej biblioteki do wysyłania powiadomień do użytkowników. Wysyłane informacje były najróżniejsze – od linka potwierdzającego założenie konta w serwisie, po skomplikowany graficzny newsletter. Mając dość ciągłego dłubania i szukania projektu, w którym już to robiłem, stworzyłem jedną uniwersalną bibliotekę do wysyłania powiadomień. Budowa biblioteki jest prosta jak konstrukcja cepa. Jest to jedna abstrakcyjna klasa, po której dziedziczą wszystkie “wysyłacze”, składająca się głównie z setterów i getterów. W celu wyrenderowania treści, która zostanie wysłana do użytkownika, korzysta z Zend_View. Aby zapewnić jak największą elastyczność, podczas ustawiania niezbędnych danych możemy skorzystać ze wspomnianych setterów, Zend_Config lub tablic. W chwili obecnej biblioteka oferuje jedynie wysyłanie maili.

Przykładowy kod wysyłający wiadomość z kontrolera wygląda następująco.

$options = $this->getInvokeArg('bootstrap')->getOption('notification');
$notification = new Batman_Notification_Sender_Mail($options['register']);
$notification->setTo('odbiorca@domena.pl');
$notification->userName = 'Jan Kowalski';
$notification->serviceName = 'Nazwa serwisu';
$notification->send();

Jak się nietrudno domyślić, mamy tutaj do czynienia z potwierdzeniem rejestracji w serwisie. Do konstruktora przekazujemy konfigurację przechowywaną w application.ini. W najprostszej postaci wygląda ona następująco.

notification.register.template.templateName = "confirm_registration.phtml"
notification.register.template.templatePath = APPLICATION_PATH "/layouts/notifications"

Do tego dochodzi konfiguracja klasy wysyłającej wiadomości

notification.register.mail.from = "Rejestracja "
notification.register.mail.subject = "Potwierdzenie rejestracji w serwisie"

Na koniec pozostaje jeszcze plik widoku, do którego poprzez obiekt Zend_View trafiają dane.

<h1>Witaj <?php echo $this->userName; ?></h1>
<p>Właśnie zarejestrowałeś się w serwisie <?php echo $this->serviceName; ?></p>
<p>Dziękujemy!</p>

Dokumentację (jak na razie w języku angielskim), bug tracker, repozytorium oraz pliki do pobrania znajdziecie pod adresem https://github.com/wilgucki/Batman-s-ZF-library. Wszelkie uwagi mile widziane.

Autor wpisu: Zyx, dodany: 13.03.2011 11:08, tagi: php

Mój ostatni wpis na temat Symfony wywołał spory odzew. Kilka osób poprosiło mnie, bym przygotował podobną charakterystykę także i innych platform, co też niniejszym, mimo pewnych obaw postanowiłem uczynić. Dlaczego? Otóż wypadałoby, by na tapetę poleciał w końcu Zend Framework. Z jednej strony, to właśnie w nim zrobiłem najwięcej projektów, a z drugiej - ostatni projekt wykonałem więcej niż rok temu i nieco wypadłem z obiegu, jeśli chodzi o nowsze wersje. Dlatego nie będę wchodzić głęboko w szczegóły techniczne, a skoncentruję się na tych aspektach, które zmienić się nie mogły.

Autor wpisu: singles, dodany: 12.03.2011 23:56, tagi: php

Wbrew pozorom, wpis ten nie jest skierowany tylko i wyłącznie do początkujących programistów. Spotkałem już kilka osób, które piszą w PHP od kilku lat i do dzisiaj wykorzystują do tego celu tzw. edytory programistyczne – EditPlus, Notepad++, PSPad itp. Żeby było jasne – wcale nie mówię, że to źle. Sam używam Notepada++ do szybkich poprawek czy też małych skryptów. Jednak przy kilku(nastu) godzinach pracy z kodem dziennie, IDE staje się narzędziem bardzo ułatwiającym pracę.

Wracając do pełnoetatowych programistów PHP. Kiedy pytam takie osoby, dlaczego nie używają IDE to odpowiedź brzmi zazwyczaj:

bo to wielka wolna kobyła.

Jest w tym stwierdzeniu trochę prawdy, aczkolwiek zależy to od IDE, a raczej języka, w jakim zostało napisane. Drugą grupą osób są ludzie, którzy poużywali trochę IDE, a potem wrócili do swoich edytorów, bo nie widzieli różnicy, a chodziło to wolniej. Problem w tym, że osoby te używały IDE jako edytora programistycznego, a nie jako IDE.

Wydaje mi się, że taki stan rzeczy wynika z następującego faktu – spora część ludzi nie wie co takie IDE potrafi.

Poniżej zawarłem listę funkcjonalności najczęściej spotykanych w zintegrowanych środowiskach programistycznych – z punktu widzenia programisty PHP. Abstrahuje od konkretnego produktu, ponieważ większość narzędzi, z którymi się spotkałem udostępniała wymienione niżej funkcje. Tak więc zaczynamy! Wartym odnotowania jest fakt, że edytory programistyczne także mogą posiadać niektóre z wymienionych funkcjonalności.

Podział na projekty

W IDE operujemy zazwyczaj pojęciem projektu – zestawu klas i komponentów, które są częściami jednej aplikacji (aczkolwiek nie jest to obligatoryjne). W ramach plików projektu znajdą się w takim razie pliki .php, .(x)html, obrazki, skrypty JavaScript czy też arkusze stylów. Dlaczego wspominam o tak prostej rzeczy – ponieważ wiele funkcjonalności opiera się właśnie na indeksowaniu zawartości tych plików.

Szybkie otwieranie plików projektu

IDE (a także niektóre edytory) udostępniają funkcję, którą w skrócie można nazwać: „Przejdź do danego pliku”. Funkcja ta nazywana jest różnie: Go To File, Go to Resource, ale jej działanie jest bardzo podobne. Wciskamy prostą kombinację klawiszy (np. Ctrl + Shift + O) i otwiera nam się małe okno z polem wyszukiwania na górze oraz listą plików poniżej. I tak, w miarę wpisywania kolejnych liter danej nazwy zostają tylko pliki pasujące do wpisanego wzorca. Następnie wystarczy wybrać plik, nacisnąć Enter i plik zostaje otwarty.

Go to file window

Lista plików pasujących do podanego wzorca

Przejście do deklaracji klasy/funkcji/metody

Wiele razy zdarzała mi się sytuacja, że patrząc na cudy kod prosiłem kogoś o pokazanie definicji użytej klasy/metody/funkcji. Co ta osoba wtedy robiła? Chwytała myszkę i nawigowała po drzewie projektu w poszukiwaniu tej pliku zawierającego wspomnianą definicję. W przypadku klas sytuacja była zazwyczaj prostsza – zakładając, że plik miał nazwę odpowiadającą nazwie klasy. Niestety, czasami poszukiwane były funkcje, a wtedy byłem świadkiem przeglądania kilku plików typu: basic_functions.php czy też html_helpers.php i wyrazu twarzy pt. „gdzie to było?”. Niektóre z osób używały wyszukiwania ciągu tekstowego w plikach. Co ciekawe, sytuacja takie zdarzały się wśród ludzi korzystających z IDE jak i z edytorów programistycznych. Jednak dzięki indeksowaniu zawartości plików projektu, IDE rozwiązują ten problem w prosty sposób – udostępniając polecenie: Go to Declaration. Naciśnięcie jednej kombinacji klawiszy automatycznie przenosi nas do odpowiedniego pliku i poszukiwanej deklaracji. Osobiście, często korzystam z tej funkcjonalności podczas pracy z ZF – kiedy chce się dowiedzieć jak działa dana metoda, błyskawicznie przechodzę do jej deklaracji i po krótkiej analizie kodu moja ciekawość zostaje zaspokojona :) Warto zauważyć, że funkcjonalność ta nie jest ograniczona tylko do plików PHP – działa tak samo w przypadku skryptów JavaScript czy też w niektórych IDE w przypadku CSS (przejście z kodu HTML do definicji klasy w innym pliku .css).

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.