PHP, Gearman i MySQL…
25 sty 2012
W projekcie, w którym aktualnie biorę udział, mamy miejsca gdzie są wykonywane skomplikowane i czasochłonne operacje. Żeby nie blokować UI użytkownikowi, część z prac można odpalić w tle, w tym właśnie celu korzystamy (od niedawna) z Gearmana (do którego jest dostępne rozszerzenie PHP PECL).
Problem pojawił się z połączeniem do MySQL. Skrypt pracownika (worker) działający w tle rozłączał się z bazą. Co ciekawe – wymuszenie ponownego połączenia działało bez zarzutów. Problem za to był z wyborem bazy danych (mysql_select_db).
Po dwóch i pół dnia, walki i kombinowania „co by tu jeszcze dałoby się zrobić”, podrzucono mi (project manager) pomysł na wypróbowania GearmanManagera.
Okazało się to strzałem w dziesiątkę, gdyż narzędzie autorstwa Briana Moona, ma jedną rewelacyjną możliwość – ustawienie czasu życia skryptu pracownika (workera) – max_worker_lifetime. Po przekroczeniu czasu, skrypt jest ubijany, a w jego miejsce tworzona jest nowa instancja pracownika.
Do innych ciekawych opcji GearmanManagera można zaliczyć m.in. auto_update (skrypt pracownika po zmianie kodu będzie automatycznie ubity i na nowo odpalony) – bardzo wygodne rozwiązanie w czasie developingu.
Dodatkowo odpalając demona możemy ustawić dowolny tryb logowania zdarzeń – od informacji tylko o starcie i końcu pracy, po pełny tryb logowania, gdzie wszystkie zdarzenia zachodzące w klasach pracowników są wyświetlane.
Jeśli ktoś pracuje z PHP i Gearmanem – polecam sprawdzić GearmanManagera.
Można wspierać tylko Chrome i Safari? Można!
24 sty 2012
Taka oto informacja wita nas, gdy chcemy użyć TweetDecka w Firefox.
Osobiście używam rozszerzenia do Chrome, chciałem sprawdzić jedynie wersję webową tej usługi…
Zamykają Picnik!
21 sty 2012
Picnic, edytor zdjęć który opisałem kilka lat temu, zostanie zamknięty z dniem 19 kwietnia 2012. Tak głosi oficjalny komunikat. Przypomnę tylko, że Picnik został kupiony przez Google 1. marca 2010.
Aktualnie aplikacja do edycji zdjęć, która jest minimalnie zmodyfikowaną wersją Picnika, wykorzystywana jest między innymi w Picassie i Google+.
Najważniejsze informacje dotyczące zamknięcia serwisu:
- jeśli miałeś płatne konto (24.95 USD/rok) – zostanie ci zwrócona cała(!) roczna opłata w ciągu tygodnia od dziś (ogłoszenia zamknięcia serwisu)
- do końca swoich dni, Picnik, będzie całkowicie darmowy – wszystkie premium features do 19 kwietnia są dostępne za darmo!
- została uruchomiona usługa/aplikacja Picnik Takeout, dzięki której możemy zgrać swoje zdjęcia na dysk (w formacie zip), możemy także wyeksportować zdjęcia do Google+
Łamanie tekstu w atrybutach title i alt
20 sty 2012
Jak złamać tekst w atrybutach title="..." i alt="..."? Nie działa <br> ani znak nowej linii: \n …
Extensible Markup Language (XML) 1.1 w pierwszym punkcie podaje:
All line breaks must have been normalized on input to #xA as described in 2.11 End-of-Line Handling, so the rest of this algorithm operates on text normalized in this way.
Zatem rozwiązaniem zagadki (i zwycięzcą dzisiejszego plebiscytu
jest 

Działa poprawnie z: Chrome, Safari, Opera i IE. Co zaskakujące, Firefox nic sobie nie robi z 
!
I na koniec przykład działania – najedź myszką na logo bloga ![]()
Kolejne małe odświeżenie na blogu…
15 sty 2012

Nowy rok zaczynam w stylu minimalistycznym. Najpierw portfolio dostało zaślepkę (nowa wersja w przygotowaniu).
W międzyczasie blog zyskał bardziej czytelny motyw autorstwa Rodrigo Galindez‘a.
Planuję też bardziej regularne postowanie – ot jako freelancer mam styczność z wieloma nowymi-ciekawymi tematami ![]()
Enjoy!
(zdjęcie autorstwa ChicagoSage)
Linkujące strony w WordPress
14 sty 2012
Page Links To to plugin do WordPress pozwalający na stworzenie strony, która będzie linkować do dowolnego miejsca w sieci. Jak piszą autorzy:
Lets you make a WordPress page (or other content type) link to an external URL of your choosing, instead of its WordPress URL.
Na przykład możemy podpiąć pod stronę link do naszego profilu społecznościowego na Facebook czy Twitter. Efekt – po kliknięciu na link, użytkownik zostanie przeniesiony pod wskazany adres. Ale na tym nie koniec.
Możemy użyć linka w obrębie naszej strony/bloga. Na przykład w menu głównym mojego bloga link do Howto… kieruje prosto do taga howto zamiast do strony z kontentem.
Android Design
13 sty 2012
Tym razem szybko i na temat.
Android User Experience Team opublikował wczoraj Android Design. Jest to zbiór (pomocnych) informacji dotyczących tworzenia UI w aplikacjach z Androidem.
Przydatne.
Opera Turbo tylko dla wybranych stron
13 sty 2012
Aktualnie pracuję w projekcie, w którym VPN wykorzystywany jest w celu uzyskania dostępu do sieci wewnętrznej (w tym deweloperskiego serwera webowego).
Okazało się jednak, że coś blokuje mi dostęp do PhoneGap wiki. Strona po prostu nie działa w żadnej przeglądarce (brak odpowiedzi serwera) – Chrome, Firefox, Opera.
Szybko przypomniałem sobie, że Opera ma wbudowaną obsługę proxy – Opera Turbo.
Niestety okazuje się, że Turbo możne być tylko włączone lub wyłączone – nie ma konfiguracji white/black list…
Przeszukałem forum Opery i natrafiłem na post, w którym podano rozwiązanie problemu:
There is a setting in opera:config called „Opera Turbo bypass URLs”. Simply enter the URL for the site and save the settings. Seems to work smoothly. See http://www.opera.com/support/usingopera/operaini/ for details.
Otwarłem zatem about:config i poszukałem odpowiedniej zmiennej, po czym dodałem taki oto wpis:
Zapisałem i mogę korzystać z Opery Turbo używając VPN ![]()
PS można też otworzyć od razu w pasku adresu opera:config#Proxy|OperaTurbobypassURLs, co od razu przeniesie nas do odpowiedniej konfiguracji.
Chrome i wyłączenie „same-origin policy”
11 sty 2012
Jako użytkownik Google Chrome, a także jako programista spotkałem, się z problemem debugowania lokalnej aplikacji webowej. Problem polegał na tym, że trzeba było wykonać połączenie do API. Chrome zasłaniając się „same-origin policy” nie wykonywał owych połączeń i zwracał błąd, a aplikacja nie działała poprawnie:
Rozwiązanie problemu polega na uruchomieniu przeglądarki z opcją/argumentem --disable-web-security.
Dla Windows będzie to np:
chrome.exe –disable-web-security
Ważna uwaga, na początku są dwa minusy koło siebie!
HTC i robienie zrzutu ekranu
02 sty 2012
Od ponad roku jestem posiadaczem HTC Desire HD. Telefon super, ale od zawsze Android miał blokadę uniemożliwiającą robienie screenshotów…
Są obejścia, ale trzeba rootować telefon. Z tego co wiem, Samsung jako jedyny producent urządzeń z Androidem udostępniał do niedawna możliwość robienia screenshotów.
Po ostatniej aktualizacji Androida do wersji 2.3.5, wraz z którą dostaliśmy uaktualnioną nadkładkę HTC Sense 3.0, jest w końcu możliwość zrzucania ekranów do plików JPEG. Działa też z HTC Sensation.
A zatem, aby zrobić zrzut ekranowy musimy przytrzymać przycisk zasilania (nad ekranem) i nacisnąć na ikonkę Home. Usłyszymy dźwięk migawki, a nasz screen wpadnie do katalogu ze zdjęciami z telefonu.
PS wszystkiego dobrego w 2012 ![]()
Jak sprawdzić wersję jQuery?
29 lis 2011
Dziś szybki wpis, a raczej notatka pewnie głownie dla siebie na przyszłość…
Czasami zdarza się, w dużych projektach, że równe moduły mogą (a nie powinny!) ładować swoje wersje jQuery. Zdarza się, że rozjadą się wersje jQuery (nie pytajcie jak to możliwe, jeśli ktoś starannie pilnuje kodu i nanosi zmiany wszędzie równocześnie). Niemniej z takim przypadkiem miałem teraz styczność.
Potrzebowałem sprawdzić wersję jQuery. Otwarłem w tym celu konsolę i wpisałem:
$().jquery;
W odpowiedzi dostaniemy aktualnie używaną wersję (np. „1.7″).
Alternatywnie możemy użyć:
jQuery.fn.jquery;
w tym przypadku rezultat będzie identyczny.
jQuery UI dialog i „niedziałające” checkboxy
14 paź 2011
jQuery UI Dialog ma przykrą przypadłość, a raczej bug nierozwiązany od 11 m-cy…
Tworząc okienko (np. formularz logowania) możemy chcieć w dialogu umieścić checkbox. Bug polega na tym, że nie ma możliwości zaznaczyć tego checkboxa w Firefox, Operze i IE (w Chrome działa).
Problem okazuje się polegać na ustawieniu opcji modal:
Jeśli chcemy mieć okienko modalne (nieklikalne nic poza okienkiem), to checkboxy nie działają:
$( ".selector" ).dialog({ modal: true })zadziałają za to jeśli ustawimy:
$( ".selector" ).dialog({ modal: false})Trochę trzeba będzie pewnie poczekać na rozwiązanie tego błędu… lub wykorzystać rozwiązanie dodane do opisu błędu.
MongoDB i odpowiednik auto_increment z MySQL
21 wrz 2011
MongoDB jest niesamowity.
Odkąd zacząłem go używać, nie wyobrażam sobie budowania projektu bez wykorzystania tego silnika składującego dane. Jest szybki, skalowalny i elastyczny – są to tylko niektóre zalety NoSQL, czyli podejścia do składowani danych bez narzuconej odgórnie struktury i bez relacji. Oczywiście jakieś tam relacje miedzy obiektami można stworzyć, ale nie ma takiego przymusu.
Jedną z pierwszych rzeczy o jakich pomyślałem zaczynając przygodę z MongoDB był auto_increment znany m.in. z MySQL.
MongoDB ma swój własny system identyfikacji obiektów w bazach i kolekcjach [kolekcja to odpowiednik tabeli w RDBMS] – więcej informacji dla dociekliwych w dokumentacji.
Identyfikatory MongoDB są 12 bajtowymi wartościami, mają zatem np. postać „4e789603b8f3f4ca2d000001″. Trochę ciężko byłoby operować takimi IDkami (np. w URL), więc numeryczny identyfikator jest jak najbardziej na miejscu.
Aby w MongoDB posiadać unikalny, kolejny numer (odpowiednik MySQLowego auto_increment) należy założyć nową kolekcję (nazwijmy ją „seq”):
db.seq.insert({"_id":"users", "seq":new NumberLong(1)});Rozwiązanie ma być skalowalne, więc w przykładzie identyfikator Mongo został zastąpiony wartością „users” (możemy użyć dowolny inny teraz i w przyszłości).
Inkrementacja odbywa się poprzez wywołanie komemdy :
db.seq.findAndModify({
query: {"_id":"users"},
update: {$inc: {"seq":1}},
new: true
});Czyli dla identyfikatora „users” zwiększamy wartość pola „seq” o jeden. Następnie zwracamy nową wartość, w miejsce oryginalnej.
No dobrze, ale jak to obsłużyć w PHP?
$connection = new Mongo(); // połączenie
$seq = $mongoConn->command(array(
'findandmodify' => 'seq',
'query' => array('_id' => 'users'),
'update' => array('$inc' => array('seq' => 1)),
'new' => true,
)); // inkrementacja pola "seq"
// pobieramy kolejne ID ($seq == array('value' => array('_id' => 'users', 'seq' => 2), 'ok' => 1);
$id = $seq['value']['seq'];
Więcej o sekwencjach w Mongo: http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-SequenceNumbers
Menu główne w WordPress
16 wrz 2011
Zdarzyło się, że znajomemu przygotowuję prostą stronę opartą o WordPress.
Będzie to docelowo prosta strona z kilkoma podstronami, bez systemu newsów. Zatem wykorzystane zostaną w tym celu „Strony”, czyli pojedyncze bloki treści.
Utworzyłem pożądaną ilość stron. Następnie zmieniłem stronę startową na Ofertę, bo tak chciał kolega:
Otworzyłem stronę główną i ku mojemu zaskoczeniu, menu było niekompletne. Brakowało Oferty, w miejsce której pojawiła się Strona główna, linkująca do tejże Oferty.
Jak się okazało, jest to zupełnie normalne zachowanie WordPress’a.
Aby zmienić Stronę główną na Ofertę musiałem utworzyć nowe menu:
a następnie dodać do menu dostępne Strony:
W tym momencie możemy dowolnie zmienić kolejność pozycji w menu. Dobrze, że twórcy o takiej możliwości pomyśleli ![]()
Po zapisaniu zmian i wybraniu z listy Menu główne naszego nowego menu (i ponownym zapisie) idziemy na stronę główną witryny.
Voila!
PS w kolejnym wpisie opiszę jak włączyć wielojęzyczność…
Ciekawostka
30 sie 2011
Dziś luźno związany temat z informatyką…

During a behavior test 98% of the participants clicked on ‘yes’ when this popped up on their screen.
via sober.soup.io













