Przejdź do głównej zawartości

Posty

Wyświetlanie postów z 2012

Dlaczego nie PHP - $this w metodach statycznych (odc. 4)

W języku PHP widziałem już kilka dziwnych zjawisk. Jednak to na co natknąłem się niedawno, powaliło mnie zupełnie na kolana. PHP w momencie gdy nie ma ustawionego poziomu raportowania błędów na "strict" pozwala na wywoływanie metod, które nie są zadeklarowane jako statyczne przy użyciu operatora :: oraz odwrotnie - metody statyczne można wywoływać w kontekście obiektu poprzez $this. Dla przykładu przedstawię kod. <?php class A { public function test () { return B :: test (); } } class B { public function test () { return get_class ( $this ); } } $obj = new A (); echo $obj -> test (); ?>   Zazwyczaj takie działania w innych językach powodują błędy. W PHP, które nie jest ustawione na "strict" wykona powyższy kod. Co ciekawe wynik będzie dosyć zaskakujący. Na logikę w kontekście statycz

Dlaczego nie PHP - kompatibilność wsteczna (odc. 3)

Na początku marca 2012 wydano  nową wersję 5.4 języka PHP. Nowa wersja wprowadza wiele udogodnień oraz kilka nowinek do gramatyki. Na przykład możliwość używania operatora tablicowego za operatorem funkcji $obiekt->funkcja()[4]; , składni $klasa::funkcja(). Jako zupełna nowość pojawiły się długo oczekiwane cechy (ang. traits). Niestety ze względu na porzucenie części kompatybilności wstecznej niektóre skrypty/programy pisane pod 5.3 mogą przestać działać. Na taki problem napotkałem się po aktualizacji oprogramowania przez pewnego administratora, który nie informując nikogo a swoim zamiarze nagle zmienił na serwerze dedykowanym wersję PHP z gałęzi 5.3.x na 5.4.x.   Problem dotyczył konkretnie framework'a Kohana 2.3.4. Zdaję sobie sprawę, że framework ten był pisany z myślą o PHP 5.2 jednak pod 5.3 wszystko działało jak dawniej. Po kilku godzinach ciężkich prób i walki na podstawie informacji znalezionych na forum debiana udało się wprowadzić stosowną poprawkę do kodu. Co cie

Dlaczego nie PHP - Rzutowanie łańcuchów znakowych (odc. 2)

Ostatnio natknąłem się w pracy na niemiłą niespodziankę. Okazało się, że PHP ma trochę odmienne podejście do konwersji łańcuchów tekstowych do zmiennych typu logicznego (boolean). Różnica polega na tym, że większość języków niepuste ciągi znaków rzutują do boolean na logiczną prawdę (TRUE).  Weźmy na przykład tutaj Pythona: matis@linux-xcbr:~> python Python 2.6.5 (r265:79063, May  6 2011, 17:25:59) [GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> bool("0") True >>> Jednak jak wiadomo Python pomimo dynamicznego typowania jest zaliczany do języków silnie typowanych, dlatego postanowiłem zweryfikować dla spokoju swojego sumienia jak to się odbywa w JavaScript, który tak jak PHP jest językiem słabo typowanym. Poniżej komenda wpisana do konsoli Firebuga wraz z rezultatem: >>> Boolean("0") true

Dlaczego nie PHP - Tablice (odc. 1)

Po wielu nerwowych godzinach spędzonych przy PHP postanowiłem podzielić się z innymi użytkownikami internetu na temat moich spostrzeżeń odnośnie do języka i platformy PHP - zarówno tych negatywnych jak i pozytywnych (choć tych będzie chyba trochę mniej). Język ten rozwija się stosunkowo powoli, a twórcy późno dochodzą do wniosków, do których doszli twórcy takich języków jak Python już w fazie projektowania. W pierwszych artykułach doczepię się gramatyki języka, której w mojej ocenie brakuje kilku "drobiazgów". Na pierwszy ogień niech pójdą tablice i praca z nimi. <?php $element_trzeci = $obiekt -> pobierz_tablice ()[ 2 ]; ?> Konstrukcja znana z wielu języków programowania (chociażby Python, Java, JavaScript itp, itd). Niestety w PHP 5.3  kod ten się nie wykona - zobaczymy piękny komunikat "syntax error". Konstrukcja ta została wprowadzona stosunkowo niedawno w wersji 5.4 (programiści PHP musieli czekać do drugiej dekady XXI wieku na coś, co w

OpenSUSE 11.3, Intel GM45 i WebGL w Firefoxie

Miałem problem z uruchomieniem aplikacji internetowych napisanych przy użyciu stosunkowo nowej technologii jaką jest WebGL. Mam laptopa ze zintegrowanym chipsetem graficznym Intel GM45, który oczywiście nie wspiera sprzętowo renderowania 3D. Odpalenie WebGL w Firefoxie 10.0.0.2 przysporzyło mi trochę problemów pod systemem OpenSUSE (w moim przypadku w starej wersji 11.3 64bit z repozytorium ciągłym Thumbelweed ). Poniżej przedstawiam kolejne kroki jakie wykonałem, a po których WebGL wystartował przy renderowaniu software'owym: Najpierw musimy zainstalować bibliotekę Mesa (jeśli jej jeszcze nie mamy): sudo zypper in Mesa W Firefoxie należy w pasku adresu wpisać: about:config W wyszukiwarce można odfiltrować zmienne odpowiedzialne za WebGL poprzez wpisanie: webgl Ustawiamy odpowiednie zmienne jak poniżej webgl.force-enabled  jako: true webgl.force_osmesa jako: true webgl.osmesalib jako: /usr/lib64/libOSMesa.so.7 Oczywiście jeśli masz inną wersję Mesy to link sy

Zdalne wykonanie komendy w BASH z przypisaniem do lokalnej zmiennej

Jeśli lubisz czasem tak jak ja tworzyć kod w BASHu to możliwe, że natkniesz się na problem wykonania zdalnej komendy (na przykład na serwerze) i pobrania wyniku tej komendy do lokalnej zmiennej. Mam tu na myśli na przykład skrypt, który sprawdza czy na serwerze w danym katalogu pojawił się jakiś pliczek - z tym zastrzeżeniem, że skrypt ma się wykonywać nie po stronie serwera a hosta, który się do niego łączy. Kwestie tego jak się logować przez SSH - czy przez zaszycie hasła w skrypcie czy przez wymianę kluczy pozostawiam Tobie i konkretnej implementacji jednak zdecydowanie lepszym pomysłem wydaje się wymiana kluczy. W każdym razie zaszywanie hasła w skrypcie wiąże się z pewnym ryzykiem. Przejdźmy zatem do meritum. W celu pobrania wyniku zdalnej komendy do lokalnej zmiennej należy użyć podobnej konstrukcji: wynik=$(ssh login@host polecenie_zdalne) W podobny sposób można użyć telnetu - jednak w przypadku tego protokołu o bezpieczeństwie możemy pomarzyć. Konkretny przykład: wynik