PHP – Late Static Bindings

05 cze 2014

Załóżmy, że klasa rodzica jest abstrakcyjna (oczywiście, nie musi nią być). Chodzi o przypadek, gdy pewne stałe są zdefiniowane w klasach dzieciach.
Może to nie jest do końca OK, ale akurat taki przypadek dziś miałem.

class A extends B
{
const TEXT = 'A';
}

abstract class B
{
public function __construct()
{
echo self::TEXT;
}
}

new A();

Powoduje PHP Fatal error: Undefined class constant ‚TEXT’ in ….

Ale można dobrać się do owej stałej korzystając z dobrodziejstw Late Static Bindings.

Zmianie ulega jedna linia:
echo static::TEXT; // static zastępuje self

Po tej zmianie, zostanie wyświetlona stała A::TEXT.

Aktualizacja node.js [Ubuntu]

28 maj 2014

Załóżmy, że mamy na maszynie node.js w jakiejś starszej wersji. Załóżmy, że chcemy ją podnieść do najświeższej.

Możemy to zrobić używając npm
sudo npm cache clean -f
sudo npm install -g n
sudo n stable

Następnie podnieśmy npm do najnowszej wersji:
npm update npm -g

Gotowe!

PS może się zdarzyć (mi się trafiło), że każda komenda npm kończyła się błędem

npm ERR! Error: CERT_NOT_YET_VALID

Przyczyna prozaiczna – rozjechał się czas w wirtualce, pokazywał 16 Mar 19:32:52 zamiast 28 May 14:32:05. W tym celu konieczne okazało się zsynchronizowanie czasu z serwerem ntp, co robimy komendą:

sudo ntpdate ntp.ubuntu.com

Instalacja MongoDB w Ubuntu z repozytorium 10gen

04 lut 2014

Niby proste zadanie, bo jak jest opisane na stronie MongoDB, wystarczy wywołać kilka komend (dodanie klucza i repo):


sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
sudo apt-get update

Teraz możemy zainstalować MongoDB w najnowszej wersji używając komendy sudo apt-get install mongodb-10gen

Czyżby? A co jeśli…
Okazuje się, że jeśli mieliśmy wcześniej zainstalowane MongoDB z repo Ubuntu, jest wielce prawdopodobne iż trafimy na takowy błąd:

Rozpakowanie mongodb-10gen (z …/mongodb-10gen_2.4.9_amd64.deb) …
dpkg: błąd przetwarzania /var/cache/apt/archives/mongodb-10gen_2.4.9_amd64.deb (–unpack):
próba nadpisania „/usr/bin/mongo”, który istnieje także w pakiecie mongodb-clients 1:1.6.3-1ubuntu2
dpkg-deb: error: subprocess wklej was killed by signal (Przerwany potok)
Wystąpiły błędy podczas przetwarzania:
/var/cache/apt/archives/mongodb-10gen_2.4.9_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Jak żyć, Panie Premierze?
Rozwiązanie jest dość proste – należy usunąć pakiet mongodb-clients:
sudo apt-get purge mongodb-clients

(Prawie) gotowe
Teraz możemy bezproblemowo zainstalować MongoDB z repo 10gen: sudo apt-get install mongodb-10gen

Robomongo – łatwiejsza praca z MongoDB

09 kwi 2013

Robomongo to multiplatformowa aplikacja do zarządzania i obsługi MongoDB. Bazuje na oryginalnym shellu MongoDB, dzięki czemu wszystkie komendy wykonujemy w JavaScript & JSON.

(c) http://www.robomongo.org/

(c) http://www.robomongo.org/

Dodatkowo program umożliwia pracę w kartach (tabach), co jest także bardzo wygodne. No i ma podpowiadanie komend, zupełnie jak shell.

(c) http://www.robomongo.org/

(c) http://www.robomongo.org/

Kolejną bardzo przydatną funkcją jest możliwość zwracania kilku wyników jednocześnie – w polu zapytania wpisujemy (dwa lub więcej) poprawne query i po wywołaniu mamy wyniki z każdego z osobna.

(c) http://www.robomongo.org/

(c) http://www.robomongo.org/

W tej chwili program dostępny jest dla Windows i Mac OS X. Wersja dla Linuxa w przygotowaniu, chociaż z github można ściągnąć źródła i próbować kompilować samemu (program wykorzystuje biblioteki Qt).

Obsługa błędów w DOMDocument

13 gru 2012

Korzystając z klasy DOMDocument w PHP do parsowania stron HTML, w przypadku niektórych stron pojawiało się ostrzeżenie:

DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: (tu numer linii)

Powodem była błędna składnia strony (np. nie escape’owane ampersandy). Klasa DOMDocument posiada publiczny atrybut, który teoretycznie powinien pomóc – strictErrorChecking. Teoretycznie, bo nazwa i opis wskazują, że służy do rzucania wyjątkami przy błędach. Niestety…

Rozwiązaniem na powyższy problem okazało się wywołanie funkcji libxml_use_internal_errors tuż przed załadowaniem kodu HTML:

libxml_use_internal_errors(true);

Twitter Bootstrap bez wsparcia dla IE7

10 lis 2012

Począwszy od wersji 3 (kolejna duża wersja) Twitter Bootstrap przestanie wspierać IE7.
I dobrze, bo dużo z nią problemów ;)

Informacja o tym ukazała się przy okazji informacji o dodaniu do nadchodzącej wersji (2.2.2) nowej czcionki z ikonami – Glyphicons. A IE7 nie najlepiej radzi sobie z tego typu rozwiązaniem.

infogr.am – tworzymy infografiki

05 lis 2012

infogr.am to darmowe narzędzie do tworzenia wykresów i infografik.
Jest proste w obsłudze, ma czytelny interfejs, a same wykresy prezentują się wyśmienicie. Zresztą zobaczcie sami…

Co najważniejsze, korzystanie z aplikacji jest całkowicie darmowe. Wystarczy się zarejestrować (możemy w tym celu posłużyć się kontem z Facebooka lub Twittera).

Tworzenie infografiki jest bardzo proste. Wybieramy szablon, edytujemy poszczególne elementy i możemy już udostępnić naszą grafikę. Proste prawda? Zobaczcie zresztą sami…

Tagi JsDoc

14 cze 2012

O tym, że należy dokumentować kod, powinien wiedzieć każdy szanujący się programista. W przypadku PHP wiele osób komentuje źródła, a przynajmniej stara się to robić, opisując chociażby klasy i metody. Do tego celu używamy phpdoc.

Za to bardzo rzadko spotykamy (dobrze) opisany kod JavaScript, a przecież JS jest na fali, ma obecnie swoje 5 minut!
W internecie dostępny jest jsdoc-toolkit – A documentation generator for JavaScript.

Sam jsdoc nie różni się wiele od phpdoc, warto więc poświęcić kilka minut, żeby dobrze opisać swoje dzieło (w końcu za rok możesz nie pamiętać za co dany fragment aplikacji jest odpowiedzialny, a na debugowanie kodu stracisz ty albo inny developer mnóstwo czasu).
Lista tagów jsdoc nie jest długa, warto ją przejrzeć ;)

Responsive web design w Chrome

12 kwi 2012

Chrome Canary zostało zaopatrzone w dwa nowe narzędzia:

  1. możliwość zdefiniowania rozmiaru ekranu i skalowania czcionek – umożliwia symulowanie małych ekranów
  2. emulowanie touch events przy użyciu myszki

Opcje te są dostępne w ustawieniach konsoli (konsole otwieramy Ctrl+I, następnie na dole w prawym rogu mamy dostęp do opcji).

Przydatną opcją w takim wypadku jest dokowanie konsoli po prawej stronie.

I jeszcze jedna uwaga: Chrome Canary instaluje się w systemie niezależnie od Chrome, dzięki czemu nie musimy rezygnować z wersji stabilnej.

Jak zablokować Pinterest na naszej stronie

11 kwi 2012

Pinterest to serwis na który przypinamy piny z ciekawymi zdjęciami z sieci.
Dzięki „skryptozakładce” możemy dodawać piny (zdjęcia) z aktualnie oglądanej strony.

Co jeśli jesteśmy autorem strony i nie życzymy sobie udostępniania zdjęć na Pinterest?
Wystarczy w sekcji strony dodać odpowiedni wpis:

<meta name="pinterest" content="nopin">

jQuery – sprawdzamy czy plugin jest dostępny

10 mar 2012

Kiedyś pisałem jak sprawdzić wersję jQuery.

Dziś podobne zagadnienie, ale tym razem sprawdzamy czy plugin X jest dostępny (załadowany). Ma ono na celu uchronienie nas przed wywołaniem kodu na niezdefiniowanym rozszerzeniu, co skutkuje błędem JavaScript.

Aby sprawdzić czy załadowano np. Tipsy należy wywołać:

if (jQuery().tipsy) {
    // nasz kod
}

Lub w wersji skróconej:

if ($().tipsy) {
    // nasz kod
}

Dzieje się tak dlatego, że pluginy są ładowane jako namespace w obrębie jQuery.

Adobe Shadow

08 mar 2012

W Adobe labs znalazł się nowy, bardzo ciekawy, projekt – Adobe Shadow.
Co to właściwie jest?

Adobe Shadow to narzędzie do podglądu i inspekcji, które umożliwia front-end developerom pracować szybciej i efektywniej przez usprawnienie procesu podglądu zmian na stronie www na wielu urządzeniach jednocześnie. Ułatwia dostosowanie stron internetowych do urządzeń mobilnych.

Shadow działa zarówno w sieci lokalnej (ethernet), Internecie, jak i z lokalnymi plikami. Umożliwia podgląd aktualnie otwartej zakładki w Chrome na urządzaniach mobilnych, a także zdalnego debugowania kodu strony. Z poziomu systemu operacyjnego mamy dostęp do konsoli, podobnej do tej w Chrome, ale działającej na urządzeniu mobilnym.

Niesamowicie przydatne!

Więcej dowiecie się z materiału wideo.

PhoneGap (Android) sprawdzamy połączenie

07 mar 2012

PhoneGap w swoim API zawiera komponent Connection. Jak piszą w dokumentacji:

The connection object gives access to the device’s cellular and wifi connection information.

Czyli powinniśmy dzięki niemu wiedzieć jaki typ połączenia online jest aktualnie dostępny w urządzeniu. Do dyspozycji jest kilka predefiniowanych stałych:

  • Connection.UNKNOWN
  • Connection.ETHERNET
  • Connection.WIFI
  • Connection.CELL_2G
  • Connection.CELL_3G
  • Connection.CELL_4G
  • Connection.NONE

Wartość stałej jest przypisana do navigator.network.connection.type.

Nie wiem czy to błąd w samym API czy w telefonie HTC, ale czasami navigator.network.connection.type zwraca null.
Zatem, aby sprawdzić czy użytkownik jest online warto wykonać dodatkowe sprawdzenie na obecność null:

function checkConnection() {
    var networkState = navigator.network.connection.type;
    if (networkState == Connection.UNKNOWN || networkState == Connection.NONE || networkState == null) {
        return false;
    }
    return true;
}

PHP 5.4 – co nowego?

06 mar 2012

Kilka dni temu miała premierę nowa wersja PHP – 5.4.
Doszło kilka ciekawych rozwiązań (traits zwane cechami, skrócony zapis tablic czy wbudowany webserwer developerski).

Najważniejsze jednak, że PHP 5.4 mocno zoptymalizowano pod kątem użycia pamięci i czasu wykonywania skryptów. W różnych benchmarkach różne rezultaty osiągano – w śród nich przyśpieszenie działania skryptu o 50-60%!

Poniżej link do prezentacji autorstwa paulgao, która podsumowuje zmiany.

Jak zaznaczono migracja z PHP 5.3 jest (powinna być) bezbolesna – nie wprowadzono krytycznych zmian do języka, jak było przy przejściu z 5.x na 5.3

Z ciekawostek:

Chat for Google – tylko z włączonym „same-origin policy”

05 mar 2012

Jakiś czas temu pisałem o wyłączeniu ograniczenia „same-origin policy” w Chrome.

Okazuje się, że zdjęcie ograniczenia blokuje przydatne rozszerzenie dla użytkowników Google Talk – Chat for Google.

Rozszerzenie działa bardzo elegancko. Dostęp do kontaktów mamy pod przyciskiem na pasku rozszerzeń a sam chat jest podobny to tego w oknie GMail.

Teraz będę mógł pożegnać się z Psi, najlepszym klientem XMPP jaki używałem. Niestety od kilku lat nie rozwijanym :(