Kategoria: Muzungu skomputeryzowany

Diigo, lepsza wersja delicious

Mówię to szczerze: naprawdę lepsza.

Diigo.com to serwis pozwalający na przechowywanie naszych zakładek online, tak jak to wielu z nas zapewne zna z serwisu del.icio.us. Fun jednak z Diigo jest według mnie o wiele większy niż z jego pierwowzoru i postaram się wyjaśnić dlaczego. Nie będę opisywał podstawowych funkcji, które są wspólne dla obu serwisów, bo zakładam, że wszyscy, którzy z delicji korzystają, je znają (a jeśli ktoś nie korzysta niech wie, że dzięki gromadzeniu zakładek online, a nie bezpośrednio w przeglądarce, mamy do nich dostęp z każdego miejsca na świecie, możemy je tagować, dzięki czemu łatwo jest zrobić kolekcję stron związanych z jakimś tematem, dzielić się nimi z innymi i przeglądać co nasi znajomi właśnie dodali do zakładek [jeśli nie zachowali tego jako zakładkę prywatną] i co jest teraz top trendy czyli jakie strony na dany tag czy też ogólnie ludzie najczęściej zapisują [czyli coś a’la wykop]). Opiszę tylko te, których w Delicious nie spotkamy (chyba, bo może coś przegapiam).

Pierwszy duży plus to… integracja Diigo z Del.icio.us. I to w obie strony. Po pierwsze możemy sobie do Diigo zaimportować nasze zakładki z delicji (i kilku innych serwisów), zatem nic nie tracimy. Nie ma też ryzyka, że jak nam sie Diigo nie spodoba to zakładki w nim zgromadzone stracimy: w Diigo jest opcja aby każdą zapisaną zakładkę od razu serwis ten zapisywał także w naszych zakładkach w Delicjach, zatem z obu serwisów możemy korzystać cały czas naprzemiennie. Wypróbowując więc Diigo nic nie tracimy, nawet jeśli nam sie nie spodoba.

Drugi plus to coś co nazwę lepszą społecznowością Diigo niż Delicious. Tutaj zakładki są bardziej społeczne. Kiedy otwieramy jakąś zakładkę, otwiera się ona w ramce z dodatkowymi elementami z Diigo na górze i na dole. Można od razu zobaczyć kto dodał tą stronę do swoich zakładek, jaki komentarz do niej dodał i tak dalej. Dodatkowo Diigo pozwala nam tworzyć własne grupy zainteresowań i zapraszać do nich współzakładkowiczów. Czyli jeśli ktoś jest maniakiem kotów może stworzyć taką grupę lub do niej dołączyć i wspólnie z innymi osobami gromadzić informacje na ich temat. Może się przydać.

I na koniec coś co sprawia, że chce się powiedzieć wow (ale tak naprawdę nie korzystałem z tego póki co w sposób praktyczny): możemy sobie (znów wspólnie z innymi osobami) mazać po dowolnej stronie w internecie. Zobaczcie zrzut ekranu:

Możemy niby markerem zaznaczyć interesujące nas fragmenty, możemy w dowolnym miejscu przypiąć do strony notatkę, możemy zobaczyć jakie notatki przypieli inni (jeśli nie oznaczą ich jako private). Wygląda to bardzo fajnie, działa dobrze, ale przyznam, że jeszcze z tego nie korzystałem poza sprawdzeniem jak działa.

Oczywiście Diigo podobnie jak Delicious  oferuje wtyczki do popularnych przeglądarek ułatwiające korzystanie z wyżej wymienionych funkcji. Dodam, że wtyczka Diigo do Chrome jest o wiele lepsza niż ta delicjowa i to chyba było języczkiem u wagi, który sprawił, że przeszedłem na ten nowy serwis.

Diigo ma oczywiście też wady.

Diigo jest tylko po angielsku. Dla mnie nie jest to wada, ale uprzedzam Was, bo może część z Was nie zna tego języka.

Diigo ma mało użytkowników, więc póki co najczęściej dodawane do zakładek strony mają góra kilkadziesiąt punktów, a nie tak jak w Delicious kilkadziesiąt tysięcy. Co więcej chyba Diigo jest bardzo popularne wśród amerykańskich nauczycieli, bo najczęściej dodawane do zakładek strony to różne wpisy na temat oświaty w USA. Na szczęście jednak jak dodałem tam kilka stron odnośnie WordPressa i tworzenia stron, to od razu znalazło sie kilkanaście/kilkadziesiąt ich współzakładkowiczów.

Więcej wad na razie nie stwierdziłem i mam nadzieję, że  nie stwierdzę, a wada w postaci braku użytkowników szybko zacznie się rozpływać. 🙂 Jeśli przekonałem Was do zarejestrowania się w tym serwisie mam prośbę: kliknijcie “follow me” przy moim profilu. Nie żebym zbierał followersów, nie interesuje mnie to (chyba), ale po prostu chce zobaczyć czy przekonać się kogoś mi udało 🙂

0

Wykop.pl ma już pierwszą ofiarę śmiertelną na swoim koncie

Niestety dobrze przeczuwałem. Prawie dobrze, bo podejrzewałem, że zabije się nagrana dziewczynka – zabił się jej chłopak.

Zaraz po pojawieniu się materiału na Wykopie napisałem, krótki tekst. Tekst znajduje się tutaj, ale też go zacytuję:

jesteśmy (nie napiszę jesteście, bo nie chcę w żaden sposób się wyróżniać) hipokrytami większymi, niż Gazeta, która nabiera się na pomylke TVN o blackoucie, a potem sie z TVN smieje.

tydzien temy wykopalismy na glowna link o cybermprzemocy

http://www.wykop.pl/link/283346/cyberbullying-internetowa-przemoc

dzis wykopalismy link do cyberprzemocy

http://www.wykop.pl/link/285793/ach-ta-dzisiejsza-mlodziez

Pomylka Gazet jest smieszna, ale jest jedynie smieszna. Redaktora nie zwolnią, za kilka dni nikt nie bedzie pamietal.

Nasza pomylka byc moze skonczy sie czyjąś tragedią osobistą.

I nie chrzancie mi w komentarzach, ze za glupote sie placi i ze lepiej to wykopac zeby nigdy wiecej juz cos sie takiego nie powtorzylo. Kilka lat temu w Gdansku powiesila sie dziewczynka dreczona filmikiem puszczonym na sieci. Wtedy tez mowiono, ze moze dzieki temu nigdy wiecej sie to nie powtorzy. Prawda jest taka, ze to jedynie pocieszenie dla tych, ktorzy smieją się patrząc na czyjąś tragedię.

I tyle, mozemy to sobie tlumaczyc jeszcze na milion słów. Sumienia ie zagluszymy. Jesli ktos nie widzi problemu, znaczy ze sumienia zwyczajnie nie ma.

Nie chce sobie przypisywać żadnych zasług (tym bardziej, że dziś cała historia nie kończy się happy endem), ale po tym tekście i dodaniu go na wykopalisko wykopów filmiku jakby zaczęło ubywać, a ilość zakopów niemal dorównała wykopom. Zauważyli to na pewno administratorzy strony, bo wykop zwyczajnie usunęli ze strony. Dobrze, ale za późno.

Dziś pojawiła się informacja, że opisywany na filmie chłopak się powiesił.

I tyle. Możemy sobie pogratulować, zwłaszcza Ci, którzy materiał wykopali. Ale oczywiście o wiele łatwiej będzie spychać winę na innych i mówić, że to nie my kręciliśmy film, nie my go umieściliśmy ww internecie więc nie my jesteśmy mordercami. Prawda jest jednak według mnie taka, że niezależnie od tego czy ktoś inny popełnił tu większą głupotę od nas, nie sprawia to, że my jesteśmy zupełnie bez winy. Ale nikogo przekonywać nie będę, bo to nie jest łatwe uwierzyć, że zamiast wykazać się kiedyś w życiu bohaterską postawą, może kiedyś kogoś uratować, póki co na koncie mamy radosne współdoprowadzenie do samobójstwa.

* * *

Adminów Wykopu o nic nie obwiniam, bo nie jest łatwe zapanowanie nad jakąkolwiek chołotą. Mam jednak nadzieję, że problem nie pozostanie bez żadnych wyciągniętych wniosków. Póki co na Wykopie i w wielu innych serwisach jest tak łatwo kogoś zabić, bo wszystko, co pozwala zidentyfikować każdego wykopującego to nic. Totalna anonimowość.

0

Facebook nie zrobi rewolucji

Jeśli zastanawiasz się właśnie nad założeniem sobie na Facebooku, bo chcesz uczestniczyć w najlepszym serwisie społecznościowym, prawdopodobnie już się spóźniłeś. Facebook nie zrobi rewolucji; jeśli myśleć o tej stronie jako o czymś rewolucyjnym, to według mnie już tylko w kategoriach czasu przeszłego.

Najbardziej wpływowe rzeczy w dziedzinie nowych technologii, które mi przychodzą do głowy to wypuszczenie przez Microsoft systemu “dla ludu” czyli Windowsa, stworzenie wyszukiwarki przez Google i sprawienie, że techniczne zabawki mogą być cool przez Apple. Wszystkim tym innowacjom towarzyszył zachwyt użytkowników. Facebook, tego nie miał, przynajmniej nie na taką skalę.

Więcej: obecnie Facebook jest chyba bardziej krytykowany niż chwalony, a właściciel nawet nie ma zamiaru nic z tym zrobić i tylko dolewa oliwy do ognia dziwnymi wypowiedziami, że ochrona danych osobowych to fikcja i nasze dane nie należą do nas. Facebook porównywany jest do hipermarketu, gdzie co prawda wszyscy chodzą, ale nikt tak naprawdę z niego nie jest zadowolony (i mowa tu zarówno o klientach jak i dostawcach towaru). Facebook jest przykry, ale trzeba z niego korzystać bo wszyscy korzystają. I godzić się na warunki, jakie nam narzuca, nawet na to, że wszyscy nasi znajomi na Facebooku tak naprawdę są znajomymi Facebooka.

I co najważniejsze i co różni Facebook od Windows, Google i iPoda: Facebook jest cholernie niewygodny i nieintuicyjny w użyciu. Jest już tak rozrośnięty, że wall przypomina bardziej śmietnik niż miejsce kontaktu ze znajomymi. Można na nim przeczytać, że Marta właśnie nakarmiła rybkę, ja mam kolejny level w Cafe World, ktoś inny zaznaczył mnie na zdjęciu “ludzie, którzy przypominają leśne stworzenia”, a Czarek właśnie wziął udział w teście “jakim kawałkiem zgniłego mięsa jesteś” (i wyszło mu, że jest trzydniowym, spleśniałym udźcem baranim). Nic z tych rzeczy mnie nie interesuje i za bardzo nie wiem gdzie z tej ściany sobie pójść.

0

Zrób sobie własny cache w WordPressie

Pluginów do cache’owania stron stworzonych w WordPress jest wiele. I całe szczęście, bo niestety są sytuacje, w których WordPress ma spore problemy z prędkością. Niestety jak do tej pory nie udało mi się znaleźć rozwiązania idealnego. Dlatego też chcę przedstawić własne rozwiązanie, pomagające przyspieszyć generowanie stron unikając zbytniego mielenia funkcjami php i odpytywania bazy danych.

Podstawowym problemem wszystkich pluginów jest fakt, że cache’owania jest fakt, że strony są przechowywane w całości. Plugin raz na jakiś czas generuje całe strony i dopiero po określonym odstępie czasu generowanie się powtarza. To sprawia sporo problemów z choćby obsługą ciasteczek: nie można rozpoznawać użytkownika po ciasteczku i wysyłać mu spersonalizowanej strony, bo WordPress z takim pluginem do wszystkich wysyła takie same strony.

Oczywiście są metody na obejście tego, jednak każda ma jakieś wady. Można w ustawieniach pluginu zarządać aby nie cache’ował poszczególnych stron, nie działał gdy użytkownik jest zalogowany, można też w WP Super Cache użyć odpowiednich hacków. Jednak zawsze oznacza to całkowite wyłączenie cache’owania. Cała strona jest cache’owana lub niecache’owana.

A co jeśli by podejść do zagadnienia pregenerowania zawartości nieco inaczej? Czy na pewno musimy pregenerować całe strony od <html> do </html> ?

Odpowiedź brzmi: oczywiście nie. Skoro szablony i tak mamy rozbite na najczęściej 5 plików – header.php, index.php, sidebar.php, footer.php i style.css, index.php włącza w siebie pozostałe pliki wcześniej je generując (za wyjątkiem oczywiście pliku stylów, ten jest statyczny), czy na pewno na przykład header.php musi być generowany za każdym razem? Nawet jeśli musi (bo na przykład ma odwołania do plików JS zależnych od zawartości konkretnej strony): czy każdy fragment takiego pliku musi być generowany za każdym razem? Jestem niemal pewien, że obecny w chyba każdym pliku nagłówka kod bloginfo(‘charset’) generuje zawsze to samo od powstania blogu, aż do jego “śmierci”.

Można też znaleźć i dłuższe, bardziej złożone fragmenty kodu php, który tak naprawdę generuje zawsze to samo, a przynajmniej nic nie stoi na przeszkodzie aby wygenerowana zawartość odświeżała się powiedzmy raz na godzinę. Czy masz w sidebarze swojego bloga jakiś widget wstawiający zawsze te same reklamy? Dlaczego więc WP miałby przy każdej odsłonie strony odpytywać bazę danych co ma do tego widgetu wstawić?

Mam nadzieję, że już rozumiecie na czym polega problem. A rozwiązaniem jest: cache’owanie fragmentów strony, a nie całości.

Jak to zrobić?

1.

Do swojego pliku functions.php w katalogu skórki dodaj następujący kod:

function mincache($whatto, $howlong = '15', $work = TRUE) {
if ($whatto == '') {
exit ('Please specify name of cached code');
}

if ($howlong == '') $howlong = '15';

$folder = trim(parse_url(get_bloginfo('template_directory'), PHP_URL_PATH), '/');
$cachefile = $folder.'/mincache/'.$whatto.'-cached.html';
$cachetime = $howlong * 60;

if ($work == TRUE && file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile);
    echo "\n";

}

else {
$includedFile = 'inc.'.$whatto.'.php';
ob_start();

include_once($includedFile);

$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush(); 
}

}

2.

W katalogu skórki utwórz katalog o nazwie mincache i nadaj mu uprawnienia do odczytu i zapisu.

3.

Kod, jaki chcesz aby był cache’owany wytnij z pliku php i wklej do nowego pliku i nazwie stworzonej według struktury inc.nazwa.php. Pod nazwa wpisz co chcesz.

4.

W miejsce skąd wyciąłeś ów kod wklej:

mincache('nazwa')

I to wszystko. Teraz zawartość przeniesionego kodu do pliku inc.*.php będzie generowana tylko raz na 15 minut.

* * *

Nieco więcej o stworzonej właśnie funkcji mincache():

mincache($whatto, $howlong, $work)

Jak widać funkcja może przyjmować trzy parametry:

$whatto – nazwa fragmentu kodu który ma być szukany w pliku inc.*.php. Musi więc istnieć plik inc.{$whatto}.php, parametr ten jest bowiem obowiązkowy (inaczej funkcja nie będzie wiedziała co cache’uje.

$howlong – jak długie powinny być odstępy między kolejnymi generowaniami kodu statycznego, w minutach. Domyślnie: 15 minut.

$work – wartość logiczna true/false czy ma próbować pobrać kod z pliku statycznego (true, domyślnie ustawione) czy też za każdym razem generować go od nowa (false). Parametr ten dodałem abyście mogli w czasie prac nad stroną chwilowo wyłączać działanie cache (wartość FALSE).

* * *

I na koniec jeszcze raz konkretny przykład. Załóżmy, że chcemy aby sidebar generował się jedynie raz na pół godziny.

Wykonaj punkty 1 – 2 opisane powyżej.

Otwórz plik sidebar.php, wytnij jego całą zawartość i zastąp:

<?php mincache('sidebar', '30') ?>

Utwórz plik inc.sidebar.php w katalogu skórki i wklej do niego całą zawartość wyciętą przed chwilą z sidebar.php.

I to wszystko. Od teraz sidebar będzie się generował jedynie raz na pół godziny, co na pewno skróci czas ładowania strony.

0

Umarł WordPress, narodził się Drupal?

Nie, nie 🙂 Na pewno nie umarł 🙂 Nie po to poświęciłem cały rok na dogłębne poznawanie WordPressa abym teraz o nim zapomniał. WordPress znam już bardzo dobrze, tak dobrze, że kilka tygodni temu zacząłem się zastanawiać czy mógłbym go poznać bliżej. Doszedłem do wniosku, że w sferze tworzenia skórek, pisania pluginów wiem lub potrafię wygooglać już wszystko. Kolejny krok to zaangażowanie się w prace nad plikami rdzenia wordpressa, a to mnie z praktycznych powodów nie interesuje. Zatem z zawodowego punktu widzenia “wiem” już wszystko, co jest mi potrzebne do tworzenia strona na WordPressie.

Co więc dalej? Jeśli chodzi o WordPressa, nadal będę wszem i wobec krzyczał, że jeśli ktoś potrzebuje jakiejś z nim związanej pomocy, niech nie waha się do mnie pisać na maila. W wolnych chwilach będę rozwijał WP Sprzedawcę, myślę też nad stworzeniem alternatywnego panelu administracyjnego dla WordPressa. WordPress jest już dość dojrzały, jeśli chodzi o zastosowania jako CMS, ale kuleje jego Kokpit, który dla zwykłego użytkownika jest zwyczajnie trudny. Jeśli klient nigdy dotąd nie używał WP do skończonej pracy muszę dołączać obrazkowy tutorial jak się w nim poruszać.

Dlatego myślę nad stworzeniem czegoś co miałoby zastąpić katalog /wp-admin (a właściwie byłby to kolejny katalog dogrywany do WordPressa) zawierającego w sobie uproszczoną wersję Kokpitu. Fajnie jakby w ogóle to nie przypominało Kokpitu, a było stroną z aktualnie używaną skórką, tyle, że  z jakimś menu na górze, a każdy element strony można by kliknąć i edytować on the fly. Co o tym myślicie?

* * *

Ale nie samym WordPressem człowiek żyje. Postanowiłem też przyjrzeć się bliżej jakiemuś CMSowi z prawdziwego zdarzenia. Obecnie chyba najpopularniejszy to Joomla, jednak tak często widzę w sieci jego krytykę, że nawet nie chcę się za niego brać.

Coraz częściej do moich uszu zaczęła dochodzić nazwa Drupal. A to ktoś gdzieś napisał (chyba na flakerze), że WordPress w końcu ma coś, co Drupal ma od dawna i bardzo tego w WP brakowało. Ostatecznie do mojej wizyty na stronie Drupala przyczyniła się publikacja jakichś wyników konkursu na najbardziej innowacyjne strony zeszłego roku i większość z nich – choć w ogóle do siebie nie były podobne – działała właśnie na Drupalu.

I rzeczywście. Kończę już czytać jego dokumentacje i były momenty gdy szczęka mi opadała. Nie bez powodu Drupala nazywa się nie tylko Content Management System, ale także CM Framework. Jakiż on jest elastyczny i modularny. Zupełnie inna filozofia niż WordPress, dająca możliwość tworzenia stron bardzo interreagujących z użytkownikiem. Nie mogę się doczekać kiedy pierwszy raz użyję Drupala przy pracy 🙂

* * *

Tak więc rok 2009 należał do WordPressa. Rok 2010 będzie należał do… nadal WordPressa, bo na pewno stworzę jeszcze wiele stron opartych o niego i do Drupala, któremu poświęcę cały rok na naukę (tak jak to zrobiłem z WordPressem rok temu).

0

Szybkie sprawozdanie ze spamowania Was

W ostatnich dniach dwa razy jawnie podałem na swoim blogu linki afiliacyjne. Raz prosząc abyście z nich skorzystali, raz tylko dlatego, że link miałem (ale z usług serwisu, do którego prowadził nie byłem zadowolony).

Pierwszy link był do serwisu Vkontakte.ru czyli takiego niby facebooka, ale o rosyjskich korzeniach. Efekt całkiem przyjemny. Zarejestrowało się póki co z mojego polecenia  9 osób, przez co jestem 14. na liście osób, które mogą wygrać iPoda. Niestety moja pozycja spada z dnia na dzień, więc bardzo proszę wszystkich, którzy jeszcze się nie zarejestrowali o zrobienie tego. Oto link ponownie 🙂 Jeśli naprawdę nie chcecie mieć kont w serwisach społecznościowych, nic nie stoi na przeszkodzie by po 10. stycznia takie konto skasować 🙂

Drugi link był do serwisu Shipo.pl, czyli do gry w statki. Jak wspomniałem, nie byłem wtedy zadowolony z tego serwisu, gdyż –  krótko mówiąc – trzeba było wydawać tam realne pieniądze aby ich nie przegrać z innymi. Bez kupowania dodatków do gry, gra stawała się z góry spisana na przegraną.

Na szczęście autorzy serwisu poszli po rozum do głowy i w dzień po moim wpisie (przypadek? 😉 ) obok “wysp” do gry z dodatkami, pojawiły się wyspy, na których dodatków używać nie możemy, czyli gramy w prawdziwą grę w okręty (no… prawie prawdziwą, bo jest jedno spore niedociągnięcie, ale o nim później).

Gra mnie zatem na powrót wciągnęła. Nie jestem ani dobry ani zły (mam obecnie ciut więcej pieniędzy niż wpłaciłem, ale wygrywam mniej więcej tak samo często jak przegrywam) ale fajnie jest sobie pograć. I tu pojawia się problem, z którego powodu jeszcze raz poproszę Was o dołączenie do graczy w Shipo.pl: Tam nie ma z kim grać. W ciągu dnia jeszcze się znajdzie parę osób korzystających z serwisu, ale wieczorem, a zwłaszcza w nocy – serwis  jest pusty. Ja tymczasem dzień staram się poświęcać na pracę, wszelkie rozrywki schodzą na wieczór i noc. Tymczasem wtedy właśnie jest już na Shipo pusto.

Zatem zapraszam innych do gry i rozreklamujcie serwis wśród swoich znajomych 🙂 Wiem, że przynajmniej jedna z czytających mojego bloga osób się wciągnęła, bo grała już ze mną tam i się do tego przyznała na wewnętrznym czacie 🙂

* * *

A jakie jest owo niedociągnięcie w Shipo o którym wyżej wspomniałem i które sprawia, że gra bywa niewyrównana? Chodzi tutaj o sposób liczenia czasu. Ustawiając nową grę ustalamy o ile chcemy grać (od 1zł do 5zł dla początkujących graczy) i ile czasu ma gra trwać (od 5 minut do 25, przy czym każdy z graczy ma zawsze maksymalnie chyba 20 sekund na ruch). Błędem jest tutaj fakt, że obaj graczy korzystają ze wspólnej puli czasu (to znaczy, że powolny gracz zabiera czas nie tylko sobie, ale także przeciwnikowi, bowiem to obaj gracze mają 5 minut na grę, a nie każdy z graczy po 5 minut).

Oczywiście już znaleźli się oszuści wykorzystujący to i zabierający zabawę nieświadomym początkującym graczom. Mechanizm oszustwa jest prosty:

– Oszust zakłada grę 5-minutową, przeważnie o niskie stawki (1-2 złote)

– Jako, że on założył grę, ma prawo do pierwszego ruchu

– Gdy zjawi się nowicjusz i dołączy do gry, oszust strzela. Statystycznie ma spore szanse na trafienie statku przeciwnika, bo osoba początkująca jeszcze nie umie ukrywać statków.

– I teraz wystarczy, że zestrzeli początkującemu kilka statków (lub jeden czteromasztowiec), zaczyna się szopka. Od tej pory oszust już nie strzela tak szybko. Wykorzystuje całe swoje 20 sekund na wykonanie każdego strzału. Nowicjusz oczywiście strzela jak najszybciej i na oślep, bo chce dogonić oszusta (jeśli do końca czasu gry nie zostaną zbite wszystkie statki jednego z graczy, wygrywa ten, kto wykonał więcej strzałów celnych; przypominam, że oszust ma przewagę czterech trafień)

W takiej sytuacji nowicjusz niemal na 100% przegra i straci pieniądze. Załóżmy, że do końca gry nadal pozostają cztery minuty. Oszust zbił cztery maszty, nowicjusz żadnego. Oszust strzela raz na 20 sekund, nowicjusz raz na sekundę. Oznacza to, że do końca gry każdy odda po 11-12 strzałów. Aż co czwarty strzał nowicjusza musi być celny aby dogonić oszusta i także mieć 4 maszty zbite i 100% strzałów oszusta musi być ślepych. Rachunek jest prosty.

Już wysłałem do autorów Shipo.pl maila z unaocznieniem tego problemu, ale na razie nie ma żadnej reakcji. Najlepszym rozwiązaniem byłoby wprowadzenie oddzielnego liczenia czasu dla każdego z zawodników (jak ktoś gra powoli, zabiera sobie czas tylko z własnej puli, a czas na ruchy przeciwnika jest bez zmian). Mam nadzieję, że zreflektują się i wprowadzą także taką zmianę.

A póki co rada jest prosta: nie grajcie z osobami, które ustawiły krótki czas gry (ja sam ustawiam 18 a nawet 25 minut, bo i tak gra kończy się zawsze wcześniej).

0

Coś się zmieniło

Opowiem Wam taką krótką historię:

Na sylwestrze 2009/2010 zjawia się sporo osób, a wśród nich trzy mają ze sobą laptopy. Przypadek, bo nikt się nie umawiał, kto ma wziąć komputer z muzyką, więc tak wyszło.

Ale ja nie o tym. Najciekawsze jest, że na dwóch z trzech laptopów jest Ubuntu 9.10, trzeci to Mac, ale właściciel Maka świetnie sobie radzi na pozostałych laptopach bo jego poprzednim systemem było BSD. Żaden z trzech właścicieli laptopów nie jest informatykiem.

Jeszcze parę lat temu byłoby to nie do pomyślenia. Jak ktoś mnie odwiedzał w domu, musiałem tłumaczyć czym jest ten Linux i dlaczego to nie jest Windows. A teraz…

Coś się naprawdę już chyba zmieniło 🙂

0

Kto chce mi sprawić spóźniony prezent na gwiazdkę? ;)

Wiele nie trzeba 🙂 Co prawda prezentem będzie iPod nano, ale nikt z Was za niego nie zapłaci ani grosza. Wystarczy, że korzystając z tego odnośnika założycie sobie konto w serwisie VKontakte.ru.

Ja mam tam konto już od kilku miesięcy. Nigdy raczej nie  biorę udziału w tego typu zabawach więc średnio chętnie wysłałem wczoraj swoim znajomym link do rejestracji. I aż się zdziwiłem, bo dziś jestem na trzecim miejscu, zatem łapię się na iPoda (wygrywa go 30 osób z Polski, które zaproszą najwięcej znajomych do korzystania z tego serwisu). Dlatego też mobilizuję się teraz jeszcze bardziej i zamieszczam ten wpis na blogu 🙂

A co to takiego te w VKontakte? To taki rosyjski odpowiednik Facebooka, nieco bardziej rozbudowany niż Nasza-Klasa. Pierwotnie był to serwis stworzony dla ludzi z Rosji, ale już całkiem nieźle  rozprzestrzenił się po byłych republikach radzieckich, a obecnie stara się właśnie zaatakować Europę Środkową. Dlatego też przetłumaczono go już na wiele języków, w tym i Polski.

Mi to jest bardzo na rękę, jak pisałem konto mam już od kilku miesięcy. Zarejestrowałem się, bo mam kilku znajomych za wschodnią granicą, ale kontakty do nich już są niestety potracone (znajomi sprzed epoki internetu szybszego niż modemowy). Mam więc nadzieję, że dzięki w VKontakte kontakt między nami znów się nawiąże 🙂

Tak więc zapraszam do rejestracji. To nic nie kosztuje, a ja być może dostanę imperialistyczną zabawkę od rosyjskiego niedźwiedzia 😉

Aby Wasza rejestracja została zaliczona na moje konto musicie przynajmniej:

  • zarejestrować się przed 9 stycznia, godz 21.00 (więc szybciutko, szybciutko…)
  • podać prawdziwe imię i nazwisko, szkołę w jakiej się uczyliście, dodać zdjęcie do profilu i podać nr telefonu zaczynający się na +48.

Chyba nie jest to trudne? 🙂

A znajomym którzy się już zarejestrowali bardzo dziękuję!

0

Gra w statki “na pieniądze”

Na Demotywatorach trafiłem dziś na odnośnik do gry w statki przez przeglądarkę shipo.pl. Fajnie, bo w święta aż się chce byle jak pozabijać czas, a po drugie nie będę może zbyt skromny, ale w statki idzie mi całkiem dobrze 🙂 Wiem jak rozstawić statki aby ryzyko trafienia było mniejsze, wiem jak strzelać by prawdopodobieństwo trafienia było większe.

Co więcej shipo.pl oferuje możliwość grania na pieniądze. Na starcie dostajemy 10 złotych, niestety od razu chce przestrzec, że te 10 złotych nie ma nic wspólnego z prawdziwymi pieniędzmi. Pieniądze są kompletnie wirtualne i służą nam jedynie do spróbowania zabawy. Nie możemy ich wypłacić, a gdy dojdziemy w grach do 20 złotych na koncie, zabawa się kończy. Albo zrezygnujemy z serwisu, albo wpłacimy realną kasę i zaczniemy już grać naprawdę. Od tej pory wszystko co zarobimy jest już nasze (choć przy wypłacie zostanie potrącony procent dla twórców serwisu).

Gra niestety ma bardzo wiele wad, od technicznych po merytoryczne.

Po pierwsze nie działa w Chrome. Musiałem specjalnie dla niech odpalić Firefoksa (co ciekawe przez cały czas grania Firefox zżera 100% procesora).

Po drugie gra ma wady sama  sobie. Czasem coś nie działa, czasem nawet gra sama się przyznaje, że wystąpił błąd i prosi o opuszczenie gry i zaczęcie od nowa. Niestety opuszczenie gry oznacza poddanie się i automatycznie pieniądze o jakie właśnie gramy przegrywamy. Niby jest w rogu znaczek beta, ale serwis, który pobiera od nas pieniądze, powinien też ponosić odpowiedzialność za ich utratę z winy błędnie działającego kodu. Za takie coś autorom strony należy się co najmniej kara chłosty (czy nawiązując do panującej tam terminologii – kara przeciągnięcia pod kilem).

Pomijając błedy techniczne, owa gra w statki… z grą w statki nie ma więcej wspólnego niż wygląd planszy 10 na 10. Każdy za wpłacone na konto shipo.pl pieniądze może dokupić usprawnienia. Można podglądać plansze przeciwnika, można wykonywać 5 strzałów w jednej rundzie, można strzelać pociskami, które za jednym razem trafiają w np w 9 pól lub ustawić, że jeden strzał niszczy cały statek, niezależnie od jego wielkości.

Oczywiście dodatków kupować nie trzeba, ale jak się trafi na innego gracza z dodatkami nie mamy praktycznie szans na zwycięstwo. Szybko wyliczyłem, że za około 2 złote można kupić dodatków, które w pierwszej rundzie strzałów pozwolą nam zaatakować lub podejrzeć co najmniej 28 pól. Czyli już na starcie bombardujemy w ten czy inny sposób aż jedną czwartą planszy przeciwnika. Akurat w płatnej wersji gry nie zdarzyło mi się zagrać z nikim, kto by nie korzystał z tych dodatków, zatem oczywiście przegrałem wszystkie walki (aż do momentu gdy sam kupiłem dodatki).

Kupowanie dodatków z kolei zmusza gracza do grania o wyższe stawki. Nie lubię za bardzo hazardu. Zawsze gram o maksymalnie 1-2 złote, bo bardziej od zarobku liczy mi się zabawa. Jednak jeśli aby wygrać w jedną grę musimy zainwestować 2-3 złote, szybko przy mojej strategii pójdziemy z torbami. 😉

* * *

Wpis ten zawiera linki referencyjne do shipo.pl – podaje je tylko dlatego, że mogę podać, ale nie liczę na wielkie korzyści z tego. Grę raczej nie polecam. Jeśli chcecie, zarejestrujcie i się pograjcie w wersję bezpłatną. Wersję płatną polecam tylko miłośnikom hazardu, a nie miłośnikom gry w statki.

Tak btw, czy ktoś zna inną, ale prawdziwą grę w statki przez przeglądarkę? Na kurniku nie ma, a na wp.pl nie chcę nawet próbować (bo jeśli dobrze pamiętam ichnie gry działają dzięki ActiveX – a może coś się zmieniło?). Nie musi być na pieniądze 🙂

0

Google małpuje moje pomysły na prezenty ;)

Czy ktoś tu jeszcze pamięta akcję sprzed sześciu lat (Jezu, jaki ja jestem stary) pt. “Mozilla na Święta”? Tak, to ja ją wymyśliłem. Polegało to na tym, że przygotowaliśmy obrazy płyt z Mozillą, Firebirdem i Thunderbirdem które można było sobie wypalić z zamiarem wręczenia komuś jako prezent.

Teraz czasy są inne, programy mniejsze  i internet szybszy, więc ludzie już nie wypalają sobie 30MB na płycie, a po prostu ściągają trzy razy mniej i 20 razy szybciej. Dlatego też akcja by już nie miała większego sensu.

Jednak Google właśnie robi coś bardzo podobnego, co wtedy zrobiliśmy my: przygotowano stronę, na której można zapakować Chrome w paczkę z kokardką i wysłać mailem znajomemu. Tutaj jest wszystko na ten temat.

Ciekawe czy ktoś tam w google przypomniał sobie o nas i czy jeśli przypomniał, przyznał się przed przełożonym, że pomysł wziął “z internetu”? 🙂

P.S. Wesołych Świąt 🙂

0

Zaawansowana zabawa z szablonami podstron w WordPressie

Ten wpis jest kolejnym moim chwaleniem się jaką stronę wykonałem na bazie WordPressa, a zarazem chcę tutaj pokazać jak bardzo można zmodyfikować WordPressa (na pierwszy rzut oka nie widać, że to właśnie WordPress) i pokazać praktyczne zastosowanie dziedziczenia szablonów. Powiem szczerze, że jestem dumny z tego, co mi tutaj wyszło 🙂

Tutaj czyli na stronie Młodzi Twórcy wykonanej dla Urzędu Miejskiego w Białymstoku. Białystok ma program stypendialny dla ludzi uzdolnionych w różnych dziedzinach (ma zapewne jak i inne miasta, ale tylko Białystok jak widać chce się tym chwalić). Program działa już od jakiegoś czasu, ale teraz przyszła pora na stworzenie dla niego strony internetowej. I tutaj pojawiam się ja (jako podwykonawca dla  Man With The Plan).

Powyżej obrazek przedstawiający stronę główną. Wszystkie zrzuty ekranu w tym wpisie są klikalne więc jeśli chcecie, śmiało przechodźcie aby zobaczyć jak to wygląda u Was 🙂

Jak widać nie ma tutaj typowo blogowego układu. Mnie to nie dziwi, bo WordPress coraz bardziej staje się zwykłym CMSem zdolnym do tworzenia każdego rodzaju stron (choć blogi się w nim robi najłatwiej). Mechanizm bloga wykorzystałem tutaj w dziale Aktualności. Reszta to coś, co w panelu administracyjnym WordPressa nazywa się po prostu Strony.

Ale jakie strony! Poklikajcie na odnośniki w górnym panelu, a przekonacie się, że praktycznie każda z nich wygląda inaczej. Było to nie lada wyzwaniem ale się udało. Inny układ  kolumn na poszczególnych podstronach, co innego w sidebarach w zależności  od tego na jakiej stronie się właśnie znajdujemy, “podświetlenie” dla pozycji w górnym menu nie tylko gdy jesteśmy na tej właśnie stronie, ale także na stronie potomnej danej podstrony.

Nie było to łatwe, bo musiałem zrobić to jak najbardziej user friendly. Założyliśmy, że osoby w urzędzie nie znają WordPressa, więc sztuczki z Custom Fields, zastosowanie widget logic, custom themes trzeba unikać jak najbardziej. Osoba dodająca treści ma po prostu dodać kolejną stronę, określić, że jest ona “dzieckiem” takiej czy innej strony, a WordPress i jego funkcje same mają rozpoznać jaką właśnie stronę internauta chce wyświetlić i pokazać ją jak na obrazku powyżej (tak, to jest zwykła strona w WordPressie, stworzona we wbudwanym w nim edytorze stron; to ja, a nie osoba wprowadzająca tekst zadbałem by nagłówki miały inny wygląd, by każdy akapit był właściwie oddzielnym divem, a zawarty w nim odnośnik do pliku stał się przyciskiem wyrównanym do prawej) lub na przykład jak ta strona:

Jak widać wyżej mamy trzy sekcje: opis stypendysty, jego (czy w tym wypadku – jej) program stypendium i jego/jej zdjęcia. Tu także całość została zrobiona tak, aby pracownik urzędu nie musiał niczym się martwić: musi jedynie dodać treść, dodać zdjęcia (działa także dodawanie filmów), a to ja musiałem rozpoznać gdzie zaczyna się program stypendium czy właśnie zdjęcia lub filmy (i sprawić by miały inne tło). Co więcej powstały strony grupujące: gdy pracownik urzędu doda stronę konkretnego stypendysty, automatycznie pojawi się ona na stronie ich grupującej rocznikami:

Udało się? Przy “odrobinie” znajomości WordPressa i  umiejętności pisania dla niego funkcji, zabawy w dziedziczenie tematów graficznych, efekt jest chyba całkiem niezły, nie prawda? 😉

* * *

A może Ty też chcesz mieć taką stronę, szukasz kogoś kto zajmie się Twoim blogiem, albo znasz kogoś z takimi potrzebami? Zajrzyj na stronę O mnie i odezwij się do mnie w jeden z podanych tam sposobów, a na pewno uda nam sie razem wyczarować coś fajnego 🙂

0

Gandalf mówi o Firefoksie

Bardzo dobry wywiad ze Zbyszkiem Branieckim (aka Gandalfem) o Firefoksie. Długi, ale polecam przeczytanie całości.

Mi się czytało bardzo przyjemnie. Przypomniały mi się stare dobre czasy i jak widać większość ideałów, pomysłów na Firefoksa nie umarła, choć jakiś czas temu uważałem co innego 😉

…choć ja już i tak zostanę na razie przy Chrome. Przynajmniej do czasu, aż ten będzie szybszy od Firefoksa, a tutaj niestety różnica jest drastyczni widoczna. 🙁

0

Malaria już mi nie grozi (raczej)

Wiecie, że to już ponad rok od kiedy wróciłem w Rwandy? Wiem, że nie wiecie, to znaczy teraz jak to napisałem pewnie  sobie przypomnieliście, że faktycznie rok temu mniej więcej płakałem na poprzednim blogu  jaka to Polska jest zimna, ludzie nieludzcy a problemy zachodniego świata abstrakcyjne.

Ja jednak sobie dokładnie wszystko liczę i wszystko dobrze pamiętam. To 13 listopada rok temu zakończył się mój pobyt w Rwandzie.

To z kolei oznacza, że jestem teoretycznie wolny od malarii. Wspominałem już o tym wiele razy w czasie pobytu w Afryce, ale nie wszyscy wiedzą, że malaria może się objawić jeszcze przez rok po zarażeniu. Tak więc jeśli ktoś z Was w te wakacje odwiedzał Egipt, Indie czy inne kraje tropikalne i jeśli właśnie odczuwa dreszcze, ma poty i wysoką gorączkę (lub któryś z innych objawów, więcej informacji znajdziecie na przykład tutaj), to wcale nie musi oznaczać, że złapał świńską grypę 😉 To może wciąż być pamiątka z wakacji.

No ale dla mnie to już nie grozi. Teoretycznie, bo podejrzewam, że zarodźce malarii raczej luźno podchodzą do naszego ludzkiego kalendarza i wyciągają kopyt (czy może lepiej: nie wyciągają witek) w równe 365 dni po wprowadzeniu się do naszego organizmu. Póki co czuje się jednak dobrze, malarii już się nie boję, grypy zresztą także 🙂

* * *

Co jeszcze u mnie?

Nadal większość czasu spędzam na robieniu stron internetowych. Wpadam niestety w lekką panikę, bo kończą mi się stałe zlecenia i od połowy grudnia prawdopodobnie nie będę miał już co robić. Jeśli ktoś z Was więc szuka pomocy z WordPressem lub ogólnie tworzeniem stron, zapraszam do działu kontakt 😉

W tym tygodniu trochę pozwiedzam. Jutro mam kontrolę pooperacyjną w Zakopanem, ale jako, że już po prostu nie znoszę tego miasta i nie mógłbym tak po prostu przejechać całą Polskę, posiedzieć w szpitalnej poczekalni, dać się obmacać i znów przejechać całą Polskę, jadę (a właściwie jedziemy) na mini urlop. W Zakopanem spędzimy tylko kilka godzin, a zaraz potem jedziemy dalej do Łukasza do Żywca na kilka dni. Na pewno będzie fajnie 😉

0

WWF używa WordPressa, musicie mi wierzyć na słowo

Dziś rano w telewizorni widziałem reklamę społecznej akcji ratowania fok szarych organizowaną przez WWF Polska. Może więc się kolejny raz pochwalę zrobioną już jakiś czas temu stroną. Choć “pochwalę” to za duże słowo, bo nic Wam raczej pokazać nie mogę 🙂 Musicie mi wierzyć na słowo, że to co tu piszę, to prawda.

Blog wolontariuszy WWF, tak wyglądał projekt graficzny

Blog wolontariuszy WWF, tak wyglądał projekt graficzny

Jakoś we wrześniu ktoś szukał kogoś, kto by znał się co nieco na WordPressie, więc się zgłosiłem. Okazało się, że trzeba uruchomić blog towarzyszący społecznej akcji ratowania fok w Polsce. Coś w rodzaju małego serwisu społecznościowego, w której osoby biorące udział w ratowaniu fok będą mogli się zarejestrować, blogować (stąd więc od razu przyszedł pomysł WordPressa), dodać swoje zdjęcia z pracy i wrzucić filmy. Napisać kilka słów o sobie, zaznaczyć swoją pozycję na mapie Google Maps tak aby, gdy ktoś szuka pomocy przy fokach w okolicy Helu mógł szybko odnaleźć patrolowiczów w pobliżu.

Strona jest już wykonana, działa od dawna (i z tego co widzę działa bez zarzutu, bo nikt nie zgłasza mi żadnych problemów). Niestety linka do strony podawać nie będę, bo tylko zalogowani ludzie w WWF mogą ją zobaczyć. Ale i tak się chwalę 😉

Powyżej znajduje się design na bazie jakiego miałem wykonać stronę. Praca na początku była prosta: pociąć wszystko do HTML zgodnego z jak największą ilością przeglądarek, zrobić z tego szablon do WordPressa. Potem zaczęły się schody.

Zleceniodawca wymagał bardzo precyzyjnego dopasowania się do zaleceń. Wskutek tego najpierw sporo czasu spędziłem na poszukiwaniu odpowiednich pluginów, by ostatecznie przegonać się, że każdemu coś brakuje lub robi to w nie taki sposób, jak było to opisane w zleceniu. I wtedy rozpisałem się podczas pisania kodu nowych pluginów, ściśle dopasowanych do wymagań. (Pamiętacie moje wpisy dotyczące publikacji nowych wtyczek i tutoriale jak wtyczki się pisze? To wtedy mniej więcej robiłem tą stronę).

Pluginów napisanych było kilka. Wspomnę o dwóch.

Jeden z nich to Youtube Add Video, który zamieściłem publicznie w internecie, tak by i inni mogli z niego skorzystać i przy okazji opisałem jak powstawał. W dostępnych pluginach brakowało możliwości określenia kto dodał film (nic dziwnego, przeważnie blog prowadzi jedna osoba, a tutaj WordPress działał niemal jako platforma blogowa) i możliwości wyciągnięcia informacji o ostatnio dodanym filmie i umieszczenia jej w sidebarze. Napisanie takiego pluginu okazało się wykonalne 🙂

Drugi plugin aż szkoda, że nie udostępniłem go nigdzie bo jestem z niego dumny (teraz nie mam już niestety dostępu do jego kodu). Plugin bazował na Google Maps API  i pozwałał:

  • wyświetlić mapę w sidebarze
  • pokazać zaznaczonych na niej wszystkich wolontariuszy lub konkretnego (jeśli akurat przeglądaliśmy stronę użytkownika)
  • w panelu administracyjnym pozwalał użytkownikowi dodać swoją pozycję na mapie.

Plugin działa wyśmienicie, a przynajmniej działał w momencie oddawania strony zleceniodawcy 😉 Ale jak wspomniałem, żadnych reklamacji nie dostałem.

* * *

Było jeszcze kilka innych wtyczek, ale zdecydowanie mniejszych i mniej ciekawych. Z projektu jestem dość zadowolony bo rozruszał mnie po długien przerwie, od czasu gdy wykonałem stronę WildPoland. Obecnie  zleceń mam całkiem sporo, w poprzednim tygodniu kilku osobom musiałem odmówić podjęcia się zadania, bo zwyczajnie nie wyrabiałem się w 24 godzinach na dobę 🙂 I teraz gdy to piszę, jestem właśnie w czasie krótkiej przerwy w programowaniu kolejnego wordpressowego wdrożenia.

Nie zmienia to faktu, że jeśli ktoś z Was właśnie potrzebuje uruchomić jakąś stronę i wierzy, że WordPress jako CMS sprawdzi się tutaj bardzo dobrze (w tym tygodniu to właśnie WordPress zwyciężył w konkursie na najlepszy system CMS open source), może śmiało do mnie pisać. Obecnie wykonywane przeze mnie zadania prędzej czy później będą musiały się skończyć i chętnie podejmę się kolejnych wyzwań. 🙂

0

Wróciłem do Afryki!

Takim czymś to aż grzech się nie pochwalić 🙂 Co prawda osobiście, własnym ciałem w Afryce się (jeszcze) nie znalazłem ale z dumą mogę powiedzieć, że stworzyłem świetną (świetną, bo moją) stronę (ba! portal) dla okołoafrykańskiej organizacji.

afrix

Jakoś pod koniec września zapytano mnie, czy podjąłbym się karkołomnego wyzwania stworzenia strony integrującej mniejszości narodowe (głównie Afrykańczyków) zamieszkujące Europę z Europejczykami. Nic wielkiego: strona w kilku wersjach językowych, z opcją logowania, każdy może sobie założyć konto, każdy może na stronie prowadzić swojego bloga, opisać siebie w swoim profilu, może dodać zdjęcia, dodać filmy, ogłoszenia, pisać na forum, ustawić jakby status (gdy byłem o to poproszony śledzik jeszcze nie istniał więc tak tego nie nazwano)… Do tego mechanizm wysyłania wewnętrznych wiadomości, komunikator między użytkownikami (tym bardziej nikt nie słyszał jeszcze o NKtalk, więc i tego tak nie nazwano), możliwość ustawiania poziomu dostępu do danych w profilu (na poziomie całego profilu, jak i na poziomie poszczególnych danych). Możliwość pokazania się na mapie, możliwość dodawania się do znajomych, możliwość wyszukiwania się po kraju zamieszkania, pochodzenia, płci… Możliwość, możliwość, …

Zapytałem: “Czyli chcecie abym zrobił taką jakby kolejną Naszą Klasę, tylko że dla Afrykańczyków i to zrobił to w pojedynke?”

Dostałem odpowiedź: “Tak. I masz na to 30 dni czasu”

Już miałem odmówić, ale pomyślałem o racie za samochód, racie za pralkę i kredycie hipotecznym. Jako, że nie spłacam żadnych rat i tym bardziej hipoteki nie mam, argumenty te do mnie trafiły i nadl nie byłem zdecydowany. Tak naprawdę nie wiem o czym bardziej pomyślałem: o możliwości aby kolejny raz zrobić coś dla Afryki, o niemożliwym wyzwaniu stojącym przede mną (prawdę mówiąc im zadanie które staje przede mną brzmi bardziej niewykonalnie, tym większa jest szansa, że za nie się wezmę), czy o tej kupie szmalu jaką mi za to obiecano 😉

W każdym bądź razie, Proszę Państwa – oto Afrix!

Nie wszystko tam jeszcze działa z rzeczy założonych (ale zdecydowana większość już tak), serwis ma błędy (jeśli ktoś zauważy jakieś niedziałające linki czy inne bugi, napiszcie o tym do mnie w prywatnej wiadomości na Afriksie) ale jeśli uznać przyklejony do logo serwisu napis “beta” stwierdzam, że dzieło jest już zdatne do użytku. Zapraszam do oglądania, testowania i przede wszystkim zakładania tam sobie kont. Celem jest integracja nas – Europejczyków – z Afrykańczykami. Już niedługo serwis będzie poszukiwał wolontariuszy do pracy przy tematach integracyjnych, mam nadzieję, że pozwoli także nawiązać mnóstwo znajomości międzynarodowych 🙂

* * *

A jak się tworzy taki serwis w tak krótkim czasie? Co prawda termin został przekroczony, bo całość miało ruszyć 4 października, a ruszyło w ostatni czwartek, ale udało się dzięki wykorzystaniu już dostepnego oprogramowania.  Pierwsze założenie było, że wszystko ruszy na BuddyPressie czyli społecznościowej wersji WordPressa, jednak niestety ta ma zbyt mało funkcji i po przeczytaniu dziesiątków listów na tamtejszym forum, niektóre rzeczy jak na razie są nie do ruszenia. Zdecydowaliśmy się na płatny SocialEngine. Mateusz Kasprzak zajął się projektowaniem designu, ja natomiast w między czasie wnikał w zawiłości nowego dla mnie silnika i sposobu działania szablonów smarty (które do tej pory znałem tylko w teorii). Czasu tego miałem całkiem sporo, bo projektowanie zeszło do 20. któregoś października 🙂 Po zaprojektowaniu całość przerobiłem na szablon smarty i… przerobiłem jeszcze raz. Pierwszy design nie spodobał się konsultowanym Afrykańczykom. Podobno był “za mało w stylu nigeryjskiego reggae” (jeśli ktoś nie wie co to jest – my też wtedy nie wiedzieliśmy – to niech zajrzy na stronę: to jest podobno nigeryjskie raggae 🙂 ).

Potem była chwila luzu, gdy wydawało mi się, że wszystko jest już dopięte na ostatni guzik, a przynajmniej nikt nie ma żadnych większych zastrzeżeń. Okazało się jednak, że ciężkie testy serwis zaczął przechodzić w przeddzień oficjalnego otwarcia (oficjalnego, bo brali w nim udział ważne osobistości media) i wtedy zostałem zasypany toną listów na skrzynkę 🙂 W ostatnią środę i czwartek pracowałem od 8 rano do północy. Ale udało się.

Teraz pozostało dodać kilka rzeczy których jeszcze nie ma, a fajnie by były i naprawiać na bieżąco wykrywane błędy. Ostatecznie po całej przeprawie z SocialEngine mogę stwierdzić, że fakt iż obecna jego wersja to 3.x jest jedynie zabiegiem marketingowym. 🙁 Mnóstwo błędów, braku konsekwencji w tworzeniu i kompletny brak dokumentacji (społeczność programistów wokoło SE jest nastawiona na pomoc, ale jedynie za opłatą, zatem próżno szukać rozwiązań problemów czy porad po internecie; można je kupić jedynie w postaci pluginów czy usług) . Mimo wszystko, a może właśnie dlatego, jestem dumny, że to ma jakieś ręce i nogi 🙂

0

Książkę będę czytał

Dawno chyba nie wybierałem podręcznika tak dokładnie 🙂 Ale inaczej nie  mogłem: podręcznik jest do nauki Java Script – języka do którego podchodziłem już kilka razy, ale nigdy jakoś mi się nie udało. Tym razem więc postanowiłem nie wtopić ą i dość dokładnie obejrzałem dookoła każdą z książek, aż zdecydowałem się na Head First JavaScript.

Od razu wtręt: nikt mi nie płaci za ten tekst ani za promowanie Heliona, książki czy czegokolwiek. Nawet od razu podpowiem, że nie kupiłem jej na Helion, a na Allegro gdzie nowy egzemplarz kupiłem o 30% taniej (książka tania nie jest, więc 30% to całkiem sporo złotówek).

Do zakupu przekonał mnie przykładowy rozdział zamieszczony na stronie Helionu. Przeczytajcie, a chyba sami zrozumiecie dlaczego 🙂 Świetnie napisane, jak dla debila (którym zapewne jestem, skoro od lat nie mogę zrobić w JS nic więcej niż zastosować gotowy skrypt, ewentualnie go przerobić czy skorzystać z któregoś z frameworków… nie, właśnie tak sobie pomyślałem, że może jednak to wcale nie takie debilne), sporo humoru (wciąż tęsknię za chyba już martwą serią książek “…for dummies”) i  niesztampowe podejście do nauczania. Przykładowy rozdział zrozumiałem, więc mam nadzieję, że i reszta okaże się prosta.

Spodziewajcie się zatem tu na moim blogu nieco skaczących literek, zegarka w rogu i wyskakujących alertów z prośbą o wpisanie imienia 😉 Z przyjemnością wpiszę sobie javascript na listę umiejętności 🙂

p.s. fajnie by było jakby pojawiło się też po polsku coś podobnego do Pythona, bo to kolejny język, który próbowałem ugryźć i mi nie wyszło. A może potraficie coś polecić? Ma być prosto i z humorem.

0

Plugin do WordPressa – dodawanie pustych linii do wpisów

Plugin jest tak mały (plik readme jest dluzszy niż sam kod pluginu), że nie zasługuje na więcej niż kilka zdań.  Zrobiłem go w czasie pracy nad jedną ze stron, a że problem przewija się wiele razy w Google bez rozwiązań, postanowiłem wydać plugin dla wszystkich.

Strona pluginu. Niedługo będzie też na WordPress.org tutaj.

0

Ubuntu 9.10 po 24 godzinach użytkowania

Zawsze sobie powtarzam, że tym razem uda mi się oprzeć chęci zainstalowania nowego wydania linuksa zaraz po jego publikacji. I zawsze przegrywam, bo już po góra kilku dniach wypalam płytkę lub włączam menedżer aktualizacji i… wywalam się wraz z systemem na jakimś jego nowym błędzie, który dopiero przez takie sieroty jak ja zostanie udokumentowany i za kilka tygodni doczeka się poprawki lub opisu w sieci jak z tym problemem sobie poradzić.

Po części było i tym razem tak samo. Identycznie jak w przypadku poprzednich wydań nie wytrzymałem i zaraz ściągnąłem sobie obraz iso dystrybucji. Tyle, że tym razem postanowiłem przechytrzyć bestię i najpierw spróbować instalacji na innym dysku twardym (czego jak czego, ale dysków u mnie ci w domu dostatek, teraz mam ich 5, a bywa więcej).

O dziwo instalacja przebiegła bez najmniejszych problemów. Zdecydowałem się także więc na instalację na dysku, z którego korzystam najczęściej. Chciałem zainstalować na czysto, bo czułem, że obecna instalacja ma w sobie sporo już błędów (między innymi w międzyczasie zmieniłem procesor i płytę główną i choć Ubuntu ruszył po tym zabiegu bez problemu, to czuć było, że nie do końca rozumie się z zastanym sprzętem).

I ta instalacja poszła jak z płatka. Sformatowałem /, zaznaczyłem by nie formatował /home i tyle.

Opisów na sieci nowości w Ubuntu 9.10 jest już mnóstwo, więc ja powtarzać się nie będę (zwłaszcza, że jak zwykle nowość to nowy wygląd graficzny i nowe numerki przy pakietach). Zauważyłem za to dwie ciekawostki:

Podczas drugiej instalacji, tej już na zwykłym dysku tym razem czytałem co mi instalator pisze w czasie kopiowania pakietów. O takie sobie ekrany:

inst

Niby nic niezwykłego, ale zwróciłem uwagę, że podane adresy do stron są podkreślone. A co się stanie jeśli je klikniemy? Przecież to w końcu tylko instalator, czyżby potrafił połączyć się z siecią i jakoś wyświetlić podlinkowaną stronę? W lynx-ie?

Pomyślałem sobie huk: jak coś zwalę zacznę instalację od nowa. I kliknąłem.

I oto po kilkunastosekundowym młuceniu płytą CD ujrzałem okno Firefoksa 🙂

Screenshot

Heh, instalator więc jest już tak naprawdę działającym systemem 🙂 Jak widać można sobie w czasie instalacji poserfować po internecie. Ja wszedłem na flakera, zrobiłem zrzut ekranu (klawisz print screen działa jak się można tego spodziewać), zrzut zapisałem na wirtualnym dysku, jaki instalator tworzy w pamięci RAM, wszedłem na pocztę i wysłałem sobie ten zrzut by móc go Wam właśnie teraz pokazać.

Drugiej ciekawej nowości nie mogę Wam pokazać. Na pewno wiecie, że w Gnome w Ubuntu jak czasem coś klikniemy to system wydaje taki bębenkowy dźwięk. Stuknięcia.

Czy mi się wydaje, a może to już wcześniej było? Otóż dźwięki te są w stereo. Jak klikamy coś po lewej stronie ekranu – słychać to po lewej. Analogicznie po środku i po prawej. Wcześniej albo tak nie było, albo nie zwróciłem uwagi.

Mała rzecz, a cieszy 🙂

Szkoda tylko, że jak zwykle w linuksowym świecie, jeśli ktoś chce rewolucji przychodzących ze zmianą systemu, musi zmienić dystrybucję. Bo nowy Ubuntu to jak dla mnie to samo, co stary Ubuntu (tyle, że działa faktycznie nieco szybciej, ale podejrzewam, że to po prostu poprzedni działał wolno przez problemy ze sprzętem i po drugie teraz na format plików wybrałem nowszy ext4). Żadnych rewolucji nie ma.

A rewolucji mi się chce, więc już się rozglądam za kolejną dystrybucją. Podejrzewam, że kolejne co mnie ucieszy to Google Chrome OS 🙂

0

Tworzenie pluginów do WordPressa – cz. 3 – zabawa z pseudo-cronem i grzebanie w krwistych bebechach

Oook… Powiedzmy, że mam wolną chwilę, więc wrócę do niesłychanie fantastycznego zajęcia, jakim jest uczenie Was jak stać się moją konkurencją i tworzyć bombowe pluginy do WordPressa 😉 Ups, po napisaniu tego zdania nieco przeszła mi ochota na pisanie dalszej części, ale mówi się trudno. Lecimy.

Wszystkim nowicjuszom na naszym kursie przypominam, że jest to już trzecia lekcja. Więc jeśli ktoś wagarował, niech szybko leci najpierw przeczytać notatki z lekcji pierwszej i lekcji drugiej. Niestety znajomość lekcji poprzednich jest raczej bardzo wskazana, gdyż założyłem sobie, że każda kolejna część nie będzie omawiać dokładnie rzeczy już wcześniej omówionych. Założenie chyba logiczne?

Zaczynamy

Co dzisiaj mamy? Może zajmijmy się moim ulubionym darmowym pluginem (bo oczywiście najbardziej ulubiony jest płatny WP Sprzedawca), jakim jest Upgrade Notification by Email. Plugin jest bardzo króciutki ale nie dajcie się zwieść jego mikroskopijnym rozmiarom.

Przede wszystkim jego mikroskopijność to oznaka dość zaawansowanego programowania. W pierwszej wersji plugin był o wiele (wiele) dłuższy. Jednak z biegiem czasu nauczyłem się jak unikać tworzenia funkcji, które robią to samo co już robi jakaś ukryta funkcja WordPressa. I dlatego coś, co wcześniej potrzebowało napisania kilkunastolinijkowej funkcji, teraz zostało zastąpione prze odwołanie się do już istniejących funkcji w silniku tego systemu blogowego.

Założenia

Plugin w założeniach jest bardzo prosty: ma wysyłać na maila informację do administratora strony gdy pojawiła się nowsza wersja WordPressa. Ma tą informację wysyłać tylko i wyłącznie jeśli admin nie dokonał jeszcze aktualizacji. I tyle.

Proste? Proste. Zatem…

Zaczynamy (ponownie)

Czynność jest tutaj tylko jedna: wysłanie maila do administratora, więc i funkcja będzie tylko jedna. Funkcja ta ma się wykonać tylko i wyłącznie, jeśli zainstalowana wersja WordPressa jest starsza niż najnowsza, zatem funkcja na pewno jakoś sprawdzi instrukcją if czy ten warunek jest spełniony.

Pojawia się też kolejna zagadka: kiedy funkcja ma zostać uruchomiona? Do tej pory poznaliśmy dwa sposoby odwoływania się do naszych pluginowych funkcji:

– poprzez hak filtrujący wypluwaną treść
– poprzez hak reagujący na jakąś akcję na blogu

Od razu mówię, że nie zastosujemy tu żadnego z nich. Choć moglibyśmy. Na przykład hakiem filtrującym moglibyśmy w momencie wyświetlania użytkownikowi treści wpisu po kryjomu wywołać naszą funkcję i wysłać adminowi maila z powiadomieniem o konieczności instalacji nowszej wersji. Albo hakiem reagującym na jakąś akcję (na przykład dodanie komentarza do wpisu) zrobić to samo.

Da się, ale ma to w naszym wypadku dość sporą wadę: admin miałby na swojej skrzynce kilkadziesiąt maili (jeśli nie tysiące w przypadku gdy admin administruje popularnym blogiem) z upomnieniem o aktualizacje. Co prawda moglibyśmy dalej się upierać przy taki zastosowaniu, dodając do kodu rodzaj łatki, który by sprawdzał czy admin już dostał maila, ale… ale nie brnijmy w tym kierunku. Po pierwsze, że nie będzie to wydajne (tak czy owak nasza funkcja wywoływała by się setki razy dziennie), a po drugie jest gotowe rozwiązanie w samym wordpressie przygotowane specjalnie na takie okazje, a nazywa się ono

wp-cron

Tak. WordPress ma wbudowany mechanizm pseudo cronu czyli narzędzie do planowania wykonywania funkcji. Dzięki niemu możemy sobie zaplanować by dana funkcja wykonywała się raz na godzinę, raz na dzień itd.

Dobra, koniec z tymi teoretycznymi rozważaniami. Wszystko co chciałem wyjaśnić do tej pory, już wyjaśniłem. Czas zobaczyć kawałek kodu i krok po kroku zobaczyć jak nasz plugin działa.

(tradycyjnie pomijam nagłówek pliku plugina – to już poznaliście dawno)

register_activation_hook(__FILE__, 'wpu_my_activation');

function wpu_my_activation() {
wp_schedule_event(time(), 'daily', 'wpu_my_daily_event');
}

add_action('wpu_my_daily_event', 'wpu_do_this_daily');

Część rzeczy już znacie, część dopiero poznacie.

Linijka 28 jest już Wam znana z poprzedniej lekcji: tworzymy tutaj hak, jaki ma się wykonać w czasie instalacji pluginu. Informujemy tutaj aby w czasie instalacji została wykonana funkcja wpu_my_activation().

Owa funkcja znajduje się w linijce 30 i zawiera w sobie dwie funkcje wbudowane w WordPressa.

Pierwsza funkcja – wp_schedule_event() – służy do zanotowania przez WordPress funkcji, jaka ma się wykonywać cyklicznie (to ten właśnie pseudo-cron). Jako pierwszy argument pobiera czas w postaci uniksowego znacznika kiedy rejestrowana funkcja ma zostać wykonana po raz pierwszy (użyłem tu funkcji time() gdyż chciałem aby pierwsze wykonanie wysłania – lub nie wysłania – maila do admina nastąpiło od razu przy instalacji plugina). Drugi argument informuje wordpressa co ile czasu funkcja ma być powtarzana (niestety na razie może przyjmować tylko dwie wartości: daily i hourly). Trzeci argument to nazwa haka jaki ma zostać zarejestrowany.

W linii 34. widzimy dobrze nam znane już add_action(). Tutaj wiąże ono właśnie zarejestrowanego co dobowego haka wpu_my_daily_event z funkcją właściwą wpu_do_this_daily().

Do funkcji jeszcze dojdziemy, zobaczmy co teraz mamy:

register_deactivation_hook(__FILE__, 'wpu_my_deactivation');

function wpu_my_deactivation() {
wp_clear_scheduled_hook('wpu_my_daily_event');
}

Oho, tego chyba jeszcze nie było. Poznaliśmy już rejestrowanie haka aktywacyjnego, który się wykonuje gdy plugin jest aktywowany przez admina, czasem jednak trzeba też wykonać jakieś funkcje podczas odinstalowywania plugina. Służy do tego hak deaktywacyjny register_deactivation_hook, który podobnie do haka aktywacyjnego ma dwie zmienne: nazwę odinstalowywanego pliku z pluginem oraz nazwę funkcji, która ma się wykonać w czasie odinstalowywania.

Akurat tutaj trzeba coś wykonać w czasie deaktywacji plugina. Musimy wyłączyć codzienne zadanie sprawdzania aktualizacji i wysyłania maila. Służy do tego funkcja wp_clear_scheduled_hook() przyjmująca jako argument nazwę haka, który ma przestać działać.

Co by się stało gdybyśmy nie deaktywowali naszego haka? WordPress nadal by miał w swojej bazie zadań polecenie uruchomienia raz na dobę zadania wpu_my_daily_event. Zadanie to znajduje się w naszym pliku z pluginem, a plugin jest przecież odinstalowany… oj byłby problem.

Wyślij w końcu tego maila!

Ok, wszystko jest już porejestrowane i plugin jest już gotowy na ewentualne odrejestrowanie zadania. Czas napisać naszą ostateczną funkcję czyli wpu_do_this_daily()

function wpu_do_this_daily() {
$taken_transient = get_transient('update_core');
$za = $taken_transient->updates;
$zb = $za[0];
$zm = $zb->response;
if ($zm == "upgrade") {
$wpsender = get_option('admin_email');
$forwhom = get_option('admin_email');
$subject = "Your blog " . wp_specialchars( get_option('blogname') ) . " should be upgraded";
$headers = "From: " . wp_specialchars( get_option('blogname') ) . " <$wpsender>\n";
$headers .= "Content-Type: text/html\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$mailtext = "The plugin Upgrade Notification by Email noticed that at WordPress server is available newer version of blogging software than this, which is installed at " . wp_specialchars( get_option('blogname') ) . ". Please upgrade it in your admin panel. You have ".$taken_transient->version_checked." and newest is " . $zb->current . ". You can download WordPress directly from " . $zb->package;
wp_mail($forwhom, $subject, $mailtext, $headers);
}
}

?>

Długie? Bywało dłuższe. Zobaczmy, może od końca, co ta funkcja robi.

Wysyłanie maila następuje po pozytywnym wykonaniu instrukcji if w linijce 47. Jeśli if zostanie spełniony (o nim za chwilę), to zostaną przygotowane dane do maila i zostanie wysłany ów mail. Dane do maila to:

Linijka 48.: adres email jaki ma się pojawić w polu ‘From:’ maila. Jest on wyciągany jak widać z mechanizmu opcji wordpressa (czy ja już o tym pisałem? Chyba coś było na ten temat w części drugiej).

Linijka 49.: w podobny sposób pobierany jest adres email pod jaki mail ma zostać wysłany (tak, adres jest ten sam).

Linijka 50. to temat listu, linijki 51-53 to niezbędne nagłówki listu, a linijka 54. to jego treść.

I w linijce 51. mamy wordpressową funkcję do wysyłania maili – wp_mail(). Składnia jej jest taka sama jak wbudowanej w PHP funkcji mail().

Wróćmy do naszego if-a, który ma powstrzymać wordpress przed wysłaniem maila lub kazać go wysłać. If musi sprawdzić czy wersja zainstalowana jest starsza niż aktualnie dostępna na serwerze.

Wcześniej w tym celu napisałem własną funkcję, która pobierała z $wp_version informację o zainstalowanej wersji wordpressa, łączyła się za pomocą curl z serwerem wordpressa, sprawdzała jaka jest nazwa najnowszej wersji pliku z wordpressem, wynajdowała w tej nazwie ciąg zawierający w sumie numer wersji i porównywała ze sobą. Działało to dość dobrze, ale coś mi nie grało.

Po pierwsze WordPress przecież sam w panelu admina wyświetla na górze informację o konieczności aktualizacji, zatem musi mieć gdzieś wbudowaną funkcję robiącą to samo co ja właśnie chcę zrobić. Po drugie takie korzystanie z curl i wyciąganie fragmentów urla może być zawodne, jeśli na przykład zmieni się schemat nazywania pliku z instalką wordpressa.

Oczywiście okazało się, że funkcja sprawdzająca wersję wordpressa faktycznie istnieje i nazywa się dość intuicyjnie bo wp_version_check().

Nie możemy się jednak do niej odwołać bezpośrednio, bo funkcja ta nie zwraca żadnej wartości, a jedynie wywołuje funkcje kolejne (tutaj akurat interesuje nas funkcja tworząca wartość ulotną (ang. transient) o nazwie ‘update_core’). Nie wgłębiajmy się za bardzo w te krwiste bebechy, najważniejsze jest, że musimy:

– pobrać do zmiennej obiektowej wartość przelotną ‘update_core’ za pomocą fukcji get_transient() (linijka 43.)

– z owej zmiennej obiektowej wyciągnąć wartość pola ‘updates’ (linijka 44.)

– i w kolejnych linijkach dojść do tego co odpowiedział serwer na pytanie o konieczność aktualizacji.

I teraz jeśli odpowiedział słowem ‘upgrade’, posłuchajmy go i wyślijmy wyżej opisany list do administratora.

Skomplikowane? Przyznaję, że tak. Na tyle skomplikowane, że nie chcę wnikać dokładnie w powyższy kod. Jak dokładnie przebiegło wyłuskiwanie słowa ‘upgrade’, jakie inne słowa zostałyby wysłuskane, może się przekonać każdy z Was po wnikliwej analizie kodu funkcji wp_version_check(). (przy okazji zwróćcie też uwagę, że w samej treści maila są odwołania do obiektu $zb przechowującego nieco informacji o aktualnej weresji WordPressa)

W każdym razie zapewniam Was, że to działa, o czym każdy może się przekonać pobierając opisany wyżej plugin ze strony WordPressa 🙂

0

Windows 7 kontra Ubuntu 9.10 – szybkie porównanie

Porównanie będzie tak szybkie jak to możliwe 🙂 Co więcej wolniejsze być nie może.

Nie może, bo nawet nie mogę wypróbować Windowsa 7. Z dwóch powodów: sprawdziłem jego minimalne wymagania (na stronie Wikipedii, bo strona Microsoftu nie za bardzo chce mnie tam wpuścić jeśli nie korzystam już z ich systemu operacyjnego / lekka paranoja) i według owych minimalnych wymagań mój nowy, miesiąc temu kupiony laptop jest za słaby. Czy oni coś wspominali o tym, że teraz będzie szybciej niż w Viście i system pójdzie nawet na starszych komputerach? Widać kolejny raz marketingowy bełkot.

Drugi powód niemożliwości zrobienia porównania na żywo jest taki, że za Windows 7 trzeba zapłacić, albo go ukraść. Dla samego testu nie będę wywalał kupy kasy.

Zatem owo szybkie porównanie dopiero co wydanego Windowsa 7 z Ubuntu 9.10, który zostanie wydany za kilka dni: wymagania sprzętowe.

  • Windows 7 wymaga procesora minimum 1 GHz, podczas gdy Ubuntu 9.10 wystarczy procesor trzy razy słabszy, bo 300 Mhz. Przypominam, że mówie o systemach nie sprzed lat, a wydanych dopiero co lub które niedugo zostaną wydane. Nówka sztuka Ubuntu spokojnie (no, pewnie nie spokojnie) pójdzie na procesorze, który kupiłem sobie kiedyś w 1999 roku.
  • Windows 7 potrzebuje 1GB ramu (a w przypadku mojego 64-bitowego laptopa o kolejny 1GB więcej) podczas gdy Ubuntu wystarczy cztery razy mniej: 256MB
  • Windows 7 wymaga też cztery razy więcej miejsca na dysku, bo aż 16GB (Ubuntu wystarczy 4GB choć i tak uważam, że to za dużo)

I tyle jeśli chodzi o papkę marketingową pod tytułem Windows 7 jest jeszcze szybszy i ma mniejsze wymagania sprzętowe.

* * *

Podsumujmy premierę:

  • Nie mogę wypróbować Windowsa 7, bo musiałbym za niego zapłacić.
  • Nie mogę wypróbować Windowsa 7, bo mój nowy laptop jest według Microsoft stary
  • Jeśli nie posiadam już jakiegoś Windowsa, Microsoft nie pokaże mi prezentacji na temat Windowsa. Oni się tam już swietnie czują w tym swoim monopolu 😉

* * *

Sorry za tą żółć 🙂 Jak dobrze pamiętacie Ubuntu już się wiele razy ode mnie oberwało. Bo Ubuntu to też masa marketingowego bełkotu, który w zderzeniu z rzeczywistością wypada fatalnie. Tyle, że Ubuntu nie każe mi za wiarę w ten bełkot płacić.

p.s. ów milion razy wymieniony wyżej laptop zdechł i od wczoraj jest gdzieś w Czechach w serwisie 😉 Wiec może faktycznie MS ma rację, że to staroć? 😉

0

GoldenLine wpływa na moje życie

Tekst nie jest w żaden sposób sponsorowany, choć będę się w nim pewnie rozpływał w komplementach nad stroną GoldenLine.pl. Po prostu już od dłuższego czasu chodziły mi po głowie przemyślenia, którymi chcę się z Wami podzielić.

Jest jedna strona internetowa, która znacząco wpłynęła na moje życie (i jak się można domyśleć po tytule, jest to strona GL). Nawet bardzo znacząco. Z wszystkich portali społecznościowych tylko tam faktycznie widzę, że korzystanie z jego usług ma dla mnie jakieś znaczenie także w realnym świecie. Nasza-Klasa to serwis gdzie pokazujesz swoim znajomym zdjęcia z wydarzeń, które już się zdarzyły i przeważnie na tym się kończy. Na Wykop wchodzisz po to aby bezproduktywnie zabić wolny czas. Na GoldenLine zarejestrowałem się lata temu za namową mojego kolegi Adasia. Ot, Adaś (tak naprawdę Adam, ale od  lat mówimy na niego zdrobniale, choć jest ode mnie o co najmniej głowę i szyję wyższy 😉 )  był wtedy nauczycielem i ja  byłem nauczycielem. GoldenLine miało być miejscem, gdzie łatwo znaleźć pracę czy kontakty zawodowe, więc obaj mieliśmy nadzieję, że do czegoś nam się przyda: akurat  ofert pracy dla nauczycieli wiele nie ma, więc każde dodatkowe miejsce do szukania takowych powinno być dobre.

I potem powoli się zaczęło.

#1

Już po kilku tygodniach szwędania się po tym serwisie (co ciekawe na GoldenLine wcale nie trzeba często zaglądać;  szczerze to na pierwszy rzut oka nie  ma tam nic zachęcającego do częstych wizyt) trafiłem na ogłoszenie, że jedna z białostockich organizacji szuka wolontariuszy. Zgłosiłem się i tak wszystko się zaczęło 😉

#2

Kolejny moment kiedy przydał się GL to wyjazd do Afryki. Paweł, szef białostockiego wolontariatu miał wznajomych na GL dziewczyny z CWR, skontaktowałem się z nimi za pośrednictwem GL, pomęczyłem i zgodziły się mnei wysłać.

Także za pośrednictwem GL znalazłem sponsorów wyjazdu. Zamieściłem tam ogłoszenia, że jadę do Rwandy i potrzebuję pożyczyć od kogoś laptopa i aparat fotograficzny. Nie wierzyłem że się uda, a tymczasem zgłosiło się kilka firm, z których wybrałem IMPAQ (byli najszybsi).

#3

Także w moich działaniach wordpressowych GoldenLine miał spory udział. To na forum dotyczącym blogów udzielałem się odpowiadając na wordpressowe pytania, to tam pojawił się pomysł na WP Sprzedawcę, to tam informowałem o innych moich  pluginach.

W efekcie nieskromnie powiem, że zdobyłem jako taką renomę jako wp-hacker co już przełożyło się na korzyści zawodowe.

Zgłosiło się do mnie kilka osób z pytaniem  czy nie  pomógłbym przy tworzeniu stron z użyciem wordpressa. Jako, że postanowiłem sobie nie być za bardzo tani większość po napisaniu ile sobie liczę za dany projekt już nie odpowiedziała. Udało mi się jednak nawiązać kontakt z kilkoma  poważnymi osobami: jedna strona już jest zrobiona, dwie kolejne się robią i mam już ustawione co najmniej dwa – trzy (cztery?) kolejne zlecenia. I obietnicę stałego dopływu zleceń kolejnych od kilku osób, którym ufam, że jest to obietnica pewna.

Tu dodam, że tak Flaker w podobny sposób wpływa na moje “kontakty zawodowe”. Jednej osobie właśnie skończyłem już drugie zlecenie, inna osoba właśnie dziś zleciła mi coś nowego. (przy okazji pozdrawiam owe osoby, nie wymienione z  imienia, ale na pewno to czytają i wiedzą o kogo chodzi 😉 )

#4

I wreszcie 12 października jadę do Sopotu na szkolenie wstępne przed nową pracą (szkolenie  będzie połączone z rozmową kwalifikacyjną więc nie chcę zapeszać, ale jak wiadomo jestem genialny i idealny, więc pracę tą dostanę na 100% 😉 ). To także historia z GoldenLine w roli co najmniej drugoplanowej. Tu znów wspomniany na początku Adaś miał swój udział: na początku tego roku podesłał mi link do ogłoszenia na GoldenLine: praca dla szkoleniowca z podstaw obsługi komputerów, wykształcenie pedagogiczne. Jakby nie było wypisz wymaluj ja. W międzyczasie całość się nieco rozlazła czasowo, szkolenia już mają dotyczyć nieco innych rzeczy, ale jak najbardziej niedługo ruszają.

Lista powyżej jest niepełna: wymieniłem tylko te aspekty GL, które miały jakieś większe znaczenie (bo kogo by interesowało, że np jestem tam moderatorem grupy dyskusyjnej o pomocy międzynarodowej i dzięki tej grupie przynajmniej jedną osobę udało mi się wysłać już do Afryki) lub o których chciałem napisać.

***

A w tym samym czasie w innych serwisach? Na naszej klasie dodałem stu kolejnych znajomych do listy i tyle. Żadnych nowych, bo to osoby które znam od lat. W życiu nic mi to nie zmieniło. Tymczasem na GL mam na liście znajomych chyba niecałe 20 osób (nawet nie wiem), w tym tylko niewielką część znam  (bądź znałem kiedy dodawałem do listy) w realnym świecie, a serwis ten sprawił że zwiedziłem kawał świata i zarobiłem jako takie pieniądze. Na Wykopie obejrzałem milion głupich obrazków i filmików – dzięki GL zrobiłem już jedną i robię drugą stronę, na którą użytkownicy mogą wrzucać głupie obrazki i filmiki 😉

I co ciekawe wszystko to  bez większego wysiłku. Nie szperałem tam godzinami w poszukiwaniu pracy, nie reklamowałem się jako twórca stron, nie grzebałem w poszukiwaniu opcji wyjazdu do Afryki. Wszystko się potoczyło samo z siebie. Być może i bez GL zdarzyło by się wiele w moim życiu, ale tego już się nie dowiem 🙂

0

Ubuntu Linux, klawiatura i podwójne literki

Na stacjonarnym komputerze miałem tak, że czasem po jednym kliknięciu litery, pojawiała się ona dwa razy. Teraz na laptopie mam to chwila. Kilka razy na zdanie.

Stwierdziłem, że coś jest wyraźnie nie  tak. Myślałem, że to problem sprzętowy, ale po googlaniu i pytaniu na grupach dyskusyjnych okazało się, że to problem sterownika klawiatury dla Linuksa. Problem ciągnie się od lat, ale na szczęście  jest rozwiązanie.

Instalujemy pakiet xkbset (jest w repozytoriach Ubuntu).

W konsoli wydajemy polecenie (a lepiej wpisujemy je na końcu pliku ~/.bashrc tak aby polecenie wykonywało się samo po każdym starcie systemu):

xkbset r rate 200 15

Trzeba nieco pokombinować z liczbami. Pierwsza to ilość milisekund w czasie których podwójne kliknięcia powinny być rozumiane jako pojedyncze. Druga to ilość milisekund po ilu przytrzymanie klawisza powinno być mimo wszystko interpretowane jako przytrzymanie klawisza.

* * *

(Ten wpis piszę głównie dla siebie, celem zapamiętania na przyszłość, ale mam nadzieję, że ktoś sobie to wygoogla kiedyś jak będzie miał ten sam problem) 😉

0

Komputer sobie kupiłem

Niechęć do siedzenia  przy biurku i fakt, że stary komputer, którego więszość podzespołów pamięta jeszcze XX wiek zaczął się psuć, sprawiły, że ostatnie dwa tygodnie rozglądałem się za laptopem i od piątku mam już nowy sprzęt 🙂

Szukanie nie było trudne, zwłaszcza, że kryterium jakie sobie wyznaczyłem było proste: nowy, jak najtańszy ale nie netbook. I tak oto wpis ten piszę do Was z lapka, który się nazywa  Acer Extensa.

Jakość laptopa jest adekwatna do jego ceny, ale nie spodziewałem się żadnych wodotrysków 🙂 Wifi działa, więc mogę sobie siedzieć teraz na łóżku i pisać, Sprzęt i tak jest dwa razy lepszy od mojego komputera stacjonarnego.

Muszę się jeszcze przyzwyczaić do nowego rozkładu klawiszy; chwilę po potrwa zanim znów zacznę pisać bezwzrokowo.

Nie  podoba mi się plastik z jakiego lap jest zrobiony. Zdjęcie na Ceneo kłamie: komputer się nie błyszczy. Plastik jest szary, matowy i delikatnie chropowaty.

Wraz z laptopem zainstalowany był egzotyczny Linux Linpus i tak jak się domyślałem, przez wszystkich jest on chyba od razu wywalany 🙂 Raz, że to jakaś chińska dystrybucja, a ja nie jestem pewien czy chciałbym korzystać z dystrybucji powstającej w reżimowym państwie. Dwa, że nie ma ona domyślnie zainstalowanego środowiska graficznego. Oczywiście  ludzie nie kumaci w linuksie od razu przestraszą się tego dziwngo DOSa. Nawet mi nie  chciało się wgłebiać skąd wziąć pakiety Gnome/KDE, czy mają to być deb-y czy rpm-y… I tak dzień wcześniej nagrałem sobie specjalnie płytę z Ubuntu 😉

Ubuntu zainstalowało się gładko, aplecik monitorowania  poziomu bateri działa jak trzeba, aplet WiFi ładnie wyszukuje sieci.

Oczywiście musi być ccoś nie tak:  ręce mi opadają jak pomyślę ile musiałem się nagimanstykować aby przesłać przez sambę pliki ze stacjonarnego Ubuntu na laptopowe Ubuntu. Wszędzie są poradniki Windows – Linux, nigdzie praktycznie nie  ma poradników  Linux –  Linux. Zwłaszcza, że instalacja Samby kończyła się błędami. Ale już jest ok.

* * *

OK, więc mam laptopa  🙂 Dla Was to może i dobra wiadomość: wszystkie wpisy z Rwandy powstawały właśnie na laptopie i jakość ich była na pewno lepsza niż tego co piszę do Was z domu. Może to teraz się zmieni  😉

* P. S. *

Aha, wiedziałem, że coś zapomnę 😉

Laptop kupiłem w sklepie białostockim (traf chciał, że nie dość, że laptop był najtańszy, to na dodatek był najtańszy w bliskim mi sklepie). Zapłaciłem za niego 1377zł.Gdy odbierałem, widziałem, że w sklepie na półce ten sam sprzęt kosztuje o 400zł więcej 😉 Warto kupować w sieci 🙂

0

Była sobie przeglądarka

Dawno, dawno temu, gdy większość ludzi nie potrafiło odróżnić przeglądarkę od wyszukiwarki, była sobie Mozilla. Nawet nie Mozilla Suite, ale Mozilla, bo nie trzeba było do jej nazwy dodawać żadnych rozwinięć celem odróżnienia od Phoeniksa, Firebirda czy Firefoksa. Phoenix, później nazwany z powodu plagiatu nazwy Firebirdem i później znów nazwany z powodu plagiatu nazwy Firefoksem nie istniał.

Z Mozillą zetknąłem się pierwszy raz w wersji 0.9 cośtam i choć była ciężkim kolosem jak na tamte czasy, od razu polubiłem. To był chyba rok 2003 i z internetem łączyłem się jeszcze przez tepsowy modem, więc trzeba było być prawdziwym entuzjastą sieci by ściągać te 11 megabajtów (sic!) przez wdzwaniane połączenie. Co więcej ściągać trzeba było co kilka tygodni, bo co tyle właśnie pojawiały się nowsze wersje i nie było jeszcze znanego z Firefoksa mechanizmu aktualizacji, który by wymagał pobrania tylko zmienionych plików.

Pobierało się więc cały ten pakiet – bo Mozilla to nie była tylko przeglądarka, ale i klient poczty, i edytor stron, i klient IRCa – z pewnym przyzwoleniem na te roztycie Mozilli. Bo wtedy Mozillę używało w Polsce około 30 tysięcy osób i to było coś. I używały jej głównie osoby robiące strony WWW, które miały już dość niekompatybilnego z jakimkolwiek standardem Internet Explorerem.

Mozillę lubiło się z wielu powodów. Między innymi za nowatorskie jak na tamte czasy zakładki, między innymi za fakt, że nie wyświetlała estetycznie stron, które miały ładnie wyglądać, ale ich kod nie trzymał się standardów W3C. Mozilla była buntem przeciw rozejściu się sieci w dwóch kierunkach. W kierunku “Tą stronę najlepiej jest oglądać w IE4 lub nowszym” i w kierunku “Tą stronę najlepiej oglądać w Netscape Navigatorze 4 lub nowszym”. Od teraz miało już być “Tą stronę można oglądać w każdej dobrej przeglądarce”.

I to się stało, a stało się głównie za sprawą Mozilli i jej rosnącej popularności. Webmasterzy – ci od domowych klepaczy po zawodowców – coraz częściej zamiast robic strony we Front Page zaczęli zaglądać do specyfikacji języka HTML i CSS. W między czasie urodził się i wielokrotnie przepoczwarzył Firefox, a oba te elemnty stworzyły sprzężenie zwrotne dodatnie skutkujące sukcesem zarówno standardów jak i sukcesem  przeglądarki. Z 30 tysięcy użytkowników Mozilli mamy teraz kilka milionów użytkowników Firefoksa w samej jednej Polsce.

Niestety proszę Państwa: chcemy tego czy nie, ale jesteśmy właśnie na szczycie popularności tej przeglądarki. Lepiej już nie będzie. Zatem cieszmy się z sukcesu, zanim przeminie.

Rewolucja zjada własne dzieci, Firefox staje się ofiarą własnego sukcesu i nie sądzę by udało mu się wyjść z problemów, jakie go teraz trapią.

Jednym z sukcesów, które stały się problemem jest to, że użytkownicy sieci nauczyli się, że Internet Explorer nie jest jedyną przeglądarką. Jeśli ktoś już raz zmienił IE na Firefoksa, wie już, że równie dobrze może teraz zacząć kozrystać z Chrome, Opery czy innych. I zrobi to tak często, jak często w Firefoksie coś mu nie będzie się podobało.

Czy Chrome zyskałby tak szybko tak dużo użytkowników, gdyby nikt wcześniej nie wymyślił Mozilli/Firefoksa i Firefox nie był obecnie tak popularny?

Drugim sukcesem, który jest już problemem Firefoksa jest liczba jego użytkowników. Twórcy Firefoksa wiedzą jak dużo osób go używa, wiedzą że używają go z uwagi na nowatorstwo i nie mają już odwagi zwolnić z cyklem wydawniczym. W Firefoksie  co chwila musi się pojawić jakaś nowa funkcja – a to inteligentny pasek adresu, a to obsługa HTML5, a to nowy silnik JavaScript, wbudowane filmy wideo bez odtwarzacza Flash czy właśnie ogłoszone renderowanie elementów trójwymiarowych.

Niestety nikt już się nie przejmuje, że wraz z ilością nowych rozwiązań sspada ich jakość. Pasek adresu jest tak niedopracowany, że wpisanie w niego kilku pierwszych liter na starszych komputerach powoduje zawieszenie przeglądarki na około 10 sekund zanim wczyta się baza danych paska. JvaScript może i jest szybki (choć wolny w porównaniu z tym obecnym w Chrome), ale co z tego, skoro uruchomienie Firefoksa zajmuje już tyle samo co uruchomienie całego systemu operacyjnego (mój Ubuntu startuje w 19 sekund, Firefox startuje w 23 sekundy)?

O problemie z niezwalnianiem pamięci przez kolejne otwierane i zamykane zakładki w Firefoksie, problemie istniejącym od samego początku tego programu nikt z jego twórców już nawet nie myśli. Wskutek tego już po pół godzinie pracy Firefox zabiera ~400 MB ramu z 500 dostępnych (pozostałe 100MB zabiera cały system operacyjny).

Ktoś mi kiedyś powiedział, że RAM jest przecież po to, żeby z niego korzystać. Śliczne wytłumaczenie ułomności przeglądarki.  Jeśli czegoś nie potrafimy naprawić, powiedzmy, ze tak właśnie ma być. Kiedyś Bill Gates skrytykowany za to, że Windows startuje o wiele wolniej od pozostałych systemów, powiedział, że rozwiązaniem jest nie wyłączanie komputera z Windows.

Ciekaw jestem jak wielką grudą soli w oku twórców Firefoksa jest obecnie Chrome. Przeglądarka, która powstała jako ostatnia, przeglądarka posiadającą niemal wszystko to, co Firefox posiada, a startująca na moim komputerze w 4 sekundy i po wielu godzinach pracy zużywająca tyle samo pamięci, ile używała na początku (czyli jakieś 40 MB).

Niestety nie ma idealnego programu, ale Firefox diabelnie blisko tego ideału był. Niestety był.  Ten wpis to moje ostateczne pożegnanie się z tą przeglądarką, a właściwie pożegnanie się z fascynacją tą przeglądarką. W Firefoksie nic mnie już nie zachwyca. Nie co prawda też siermiężnie nie zniechęca, ale nie ma już powodu dla, którego miałbym ją używać. Tydzień temu Firefoksa odinstalowałem i niezrobiło to na mnie żadnego wrażenia. Używam sobie Chrome, a jak muszę zobaczyć jakąś stronę zawierającą flash i zależy mi na wyświetleniu tego flasha, szybko klikam na ikonkę przegądarki Midori czy Opera.

W końcu Firefox mnie tego nauczył, że przeglądarki można swobodnie zmieniać.

0

Instalacja WP Sprzedawca 1.0 – The movie ;)

Stosując się do sugestii aby wziąć się też za marketing, a nie tylko programowanie zrobiłem filmik pokazujący jak zainstalować WP Sprzedawcę.

Film dotyczy wersjji 1.0, której jeszcze oficjalnie nie ma 🙂 Niech będzie delikatną zachętą do zakupu jak już się pojawi (przy czym przypominam,  że każdy kto kupi wersje 0.x aktualizacje do 1.0 będzie miał za darmo), przy okazji widać pewne nowości, między innymi forum użytkowników i to, że nie trzeba już będzie ręcznie edytować plików konfiguracyjnych, a wszystko będzie dało się ładnie ustawić w sekcji administracyjnej WordPressa. 🙂

Film jest tutaj. Zatem kubeł pop-cornu w garść i zapraszam na seans 😉

0

Jedna rzecz, o której powinien wiedzieć każdy programista

Jedna rzecz, o której powinien wiedzieć każdy programista

Heh, niedługo moją podstronę WP Sprzedawcy chyba czeka redesign 😉

0

To był mały plugin dla mnie…

…a wielki plugin dla ludzkości.

Oczywiście przesadzam. Ale faktem jest, że mój napisany w pół godziny plugin do powiadamiania na email o konieczności aktualizacji WordPressa do nowszej wersji wywołał nieco dyskusji. Co więcej dyskusje wywołane zostały też na blogach twórców WordPressa i na liście mailingowej ‘wp-hackers’.

Dyskusje opierają się na pytaniu “dlaczego tej funkcji nie ma jeszcze w samym WordPressie” i raczej nikt nie neguje konieczności wbudowania takich powiadomień w silnik, a wszyscy zastanawiają się jak to zrobić. Tzn jak to ma dokładnie funkcjonować: czy ma sprawdzać tylko rdzeń, czy też pluginy. Czy ma być obligatoryjne, czy fakultatywne itp itd. Jest już nawet wątek na trac-u.

No cóż… być może niedługo mój plugin umrze tak samo szybko jak powstał. Ale nie miałbym nic przeciwko temu 😉 Fajnie by było mieć świadomość, że się przyczyniło do rozwoju WordPressa 😉

0

Tworzenie pluginów do WordPressa – cz. 2 – instalator, bazy danych i Custom Fields

To jest druga część mojego nibykursu tworzenia pluginów do WordPressa. Część poprzednia znajduje się tutaj.

W ostatnim tygodniu zrobiłem chyba z cztery pluginy, nie wszystkie opublikowałem, ale jak obiecałem, drugą część kursu oprę na moim małym pluginie do dodawania filmów z YouTube do naszych wpisów. Nawiasem mówić zdziwiłem się, że jest tak popularny. Bo jakby nie było podobnych pluginów jest całkiem sporo. Ale nic, sukces mnie cieszy (prawie 700 pobrań w niecały tydzień) i właśnie wczoraj opublikowałem jego drugą wersję.

* * *

Wtrącenie reklamowe: być może na ten wpis trafią osoby, które potrzebują jakiegoś plugina, chcą go zrobić, ale się poddadzą, bo uznają, że jest to dla nich za trudne. W takim wypadku uprzejmie zawiadamiam, że za opłatą chętnie zrobię taki plugin 😉 Jak się ze mną można skontaktować opisane jest tutaj.

* * *

No to lecimy. Najpierw założęnia:

  • Plugin ma umożliwiać dodanie filmu z YT do wpisu. W tym celu osoba pisząca wpis będzie musiała dodać pod wpisem Custem Field (Pole Własne) o nazwie video i w pole wartości mające wpisane odnośnik do filmu na YouTube
  • Plugin ma wyświetlać pod wpisem film, jeśli w pole Custom Field wpisane są powyższe wartości.
  • Plugin ma umożliwiać wyświetlenie w dowolnym miejscu ostatnio dodany film. Ma też umożliwiać wyświetlenie ostatnio dodany film konkretnego użytkownika WordPressa. W tym celu stworzymy odpowiednią funkcję ( u mnie będzie się nazywać show_LastYT() ) która jako parametr może przyjąć ID użytkownika, którego film chcemy zobaczyć.
  • Plugin ma do wpisów zawierających film dodawać automatycznie tag video.

I tyle. Informację o filmie będziemy trzymać w polu Custom Field. Dzięki temu silnik WordPressa w odpowiednim momencie sam włoży i sam wyjmie z bazy danych potrzebne nam informacje.

Natomiast aby przyspieszyć działanie, sami stworzymy tabelę w bazie MySQL przechowującą informację o ostatnim filmie. Można to oczywiście zrobić inaczej: wystarczy tak stworzyć funkcje show_LastYT(), że przy jej wywołaniu będzie przeglądać wszystkie wpisy, szukać tych zawierających odpowiednie Custom Field, sortować by najnowsze były na górze, wybierać ID usera… Uh, będzie to pewnie trwało długo, jeśli wpisów będziemy mieli setki lub tysiące. Lepiej jednak faktycznie stwórzmy osobną tabelę zawierającą tylko dwie kolumny: ID pozycji w tabeli (po tym będziemy sortować) i ciąg składający się z ID usera, który dodał film do bazy, dwukropka (jako rozdzielnika) i kodu filmu po nim. (przykładowo: 6:vxsz0fgds).

Co musimy umieścić w naszym pluginie?

  • Nagłówek opisujący plugin – nie będę tego już opisywał, bo opisałem w poprzedniej części.
  • Funkcję instalującą plugin (i odpowiedni do niej hook), która zostanie wywołana tylko raz, jak plugin będzie instalowany i stworzy odpowiednią tabelę w bazie danych.
  • Funkcję dodającą pozycję do bazy danych i tag video do wpisu, w momencie gdy user publikuje lub aktualizuje wpis zawierający odnośnik do filmu (tu zatem też będzie potrzebny odpowiedni hook)
  • Wreszcie funkcję wyświetlającą film na końcu wpisu, jeśli film jest w Custom Field (i znowu będzie potrzebny odpowiedni hook).
  • Na końcu funkcję show_LastYT() bez hooka wyświetlającą kod ostatnio dodanego filmu. Hook nie jest potrzebny bo to autor bloga sam w skórce graficznej zdecyduje gdzie ta funkcja ma być wywołana (np w sidebarze).

Kod będzie wyglądał następująco (pomijając nagłówek).

Funkcja instalująca:

function yt_install () {
	global $wpdb;
	$prefix = $wpdb->prefix;
	$yt_tablename = $prefix."yt_videos";
	
	$yt_db_version = "1.0";
	
	if ($wpdb->get_var("SHOW TABLES LIKE '".$yt_tablename."'") != $yt_tablename) {
		$zapytanie = "CREATE TABLE ".$yt_tablename." (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		video_id varchar(120) NOT NULL,
		PRIMARY KEY  (id)
		);";
		
		$wpdb->query($zapytanie);
		
		add_option("yt_db_version", $yt_db_version);
		
		}
	}

Co się stało się? Najpierw globalizujemy zmienną klasową $wpdb. Klasa ta dostarcza bardzo wiele funkcji służących do obsługi bazy danych.

W kolejnej linijce widzimy sposób jej wykorzystania: $wpdb->prefix pobiera przedrostek jakim są poprzedzone nazwy tabel w bazie danych. Domyślnie przedrostek ten to “wp_”, ale każdy może sobie go przecież zmienić (ja na przykład tak robię, dzięki czemu w jednej bazie danych mogę trzymać kilka instalacji WordPressa), więc odwołujmy się do niego właśnie w ten sposób jak powyżej.

Następnie tworzymy nazwę naszej tabeli, w której będziemy trzymać informacje o ostatnio dodanym filmie. Nazwa ta to ma być przedrostek_yt_videos zatem tworzymy ją jako $prefix.”yt_videos”.

Dalej definiujemy numer wersji naszej tabeli. Nie jest to konieczne, ale wyobraź sobie sytuację, gdy w przyszłych wersjach pluginu będziesz chciał przekonstruować tabelę, by zawierała więcej informacji (np nowe kolumny). Dlatego warto teraz podać informację, że obecna tabela została przez Ciebie oznaczona jako wersja 1.0, a jeśli w przyszłości będziesz zmieniać strukturę tej tabeli, nadamy jej kolejny numer i odpowiednio to obsłużymy (na razie nie będę pisał jak to się robi).

Okej, teraz przyszła kolej na dodanie tabeli do bazy danych. Ale uwaga, najpierw musimy sprawdzić czy tabela już nie istnieje. Bo co jeśli ktoś poużywa naszego pluginu, odinstaluje go i zainstaluje jeszcze raz? Ponowne tworzenie tabeli o tej samej nazwie na pewno nie skończy się niczym dobrym.

Dlatego tworzenie tabeli zaczynamy od sprawdzenia (warunek if) czy nie ma już takiej tabeli. W tym celu wykorzystujemy kolejną metodę $wpdb->get_var(). get_var() pobiera z bazy jedną konkretną wartość i jako parametr przyjmuj zapytanie. Pytamy więc bazę czy potrafi nam pokazać tabelę, której nazwa jest taka sama jak nasza tabela, którą chcemy utworzyć. Jeśli jest już, get_var() zwróci nam w tym przypadku nazwę naszej tabeli, jeśli nie ma, zwróci pusty string (albo NULL, dokładnie nie wiem). Porównujemy zwróconą wartość ze zdefiniowaną nazwą tabeli i jeśli są różne, możemy dodać naszą tabelę bez obaw.

Konstruujemy więc zapytanie (jako $zapytanie) i w metodzie $wpdb->query() przekazujemy je do bazy danych. Zapytanie utworzy nam tabelę.

Nie zapomnijmy też przy instalacji pluginu poinformować WordPressa co mamy w zmiennej $yt_db_version. W tym celu korzystamy z mechanizmu opcji, konkretnie z funkcji dodającej opcję do bazy danych add_option(), która jako pierwszy parametr przyjmuje nazwę opcji pod jaką nasza dodana wartość ma się znaleźć w mechanizmie WordPressa, a jako drugi ową wartość. Krócej można więc to było zapisać add_option(“yt_db_version”, “1.0”).

Funkcja jest już gotowa. Musimy teraz nauczyć WordPressa kiedy jej ma używać. Użyć ma jej tylko raz, tylko przy instalacji pluginu. W tym celu wpisujemy hooka:

register_activation_hook(__FILE__, 'yt_install');

Na ludzki język hak ten mówi: “zarejestruj hak aktywacyjny, który przy instalacji pliku z tym pluginem (__FILE__) wywoła funkcję “yt_install”. Zwróć uwagę na podwójne znaki podkreślenia przed i po FILE.

OK, tabelę w bazie mamy już stworzoną, możemy więc zająć się napisaniem funkcji dodającej odpowiedni wpis do bazy, gdy ktoś zamieści nowy wpis z Custom Field. Funkcję taką nazwijmy yt_database() i będzie ona wyglądała tak:

function yt_database ($post_id) {
	global $post;
	$czy_maVideo = get_post_meta($post_id, "video", true);
	
	if ($czy_maVideo != "") {
		global $wpdb;
		$prefix = $wpdb->prefix;
		$yt_tablename = $prefix."yt_videos";
		
		/* $url = explode("?", $czy_maVideo);
		$url = $url[1];
		$url = explode("&", $url);
		$url = $url[0];
		$url = explode("=", $url);
		$video_id = $url[1]; */
		
		$url = parse_url($czy_maVideo, PHP_URL_QUERY);
		$url = explode("&", $url);
		foreach ($url as $parka) {
			if (substr($parka, 0, 2) == "v=") {
				$konkretnaParka = explode("=", $parka);
				$video_id = $konkretnaParka[1];
				break;
				}
			}
		
		
		$poscik = get_post($post_id);
		
		$ktododal = $poscik->post_author;
		
		$wstawka = $ktododal.":".$video_id;
		
		$zapisz_video = "INSERT INTO ".$yt_tablename." (video_id) VALUES ('".$wstawka."');";
		
		$rezultat = $wpdb->query($zapisz_video);
		
		wp_add_post_tags($post_id, 'video');
		
		}
	
	}

Całkiem długa, więc zobaczmy co takiego robi. Jak widać funkcja pobiera argument, którym jest ID wpisu, na którym ma być wykonana. Zglobalizujmy więc najpierw zmienną $post, którą poznaliśmy już w poprzedniej części kursu, by móc do niej się odnieść.

W następnej linijce sprawdzamy czy wpis, który jest właśnie publikowany zawiera pole Custom Field o wartości “video”. Odpowiada za to funkcja $get_post_meta(), która jako pierwszy argument pobiera ID wpisu, który ma sprawdzić, w drugim argumencie wpisujemy jak ma się nazywać pole Custom Field, którego szukamy i trzeci argument ustawiamy na TRUE jeśli chcemy aby funkcja zwróciła nam zawartość tego pola Custom Field. Może i skomplikowane, ale teraz mamy już w zmiennej $czy_maVideo zapamiętany URL do YouTube jaki autor wpisu wpisał w pole Custom Field. Zaraz będziemy go obrabiać.

O właśnie teraz. Sprawdźmy czy zmienna z URLem nie jest przypadkiem pusta i jeśli nie jest wyciągnijmy z niej identyfikator filmu w serwisie youtube. Pierwsze trzy linijki if-a już znamy – ponownie dobieramy się do $wpdb i ustawiamy nazwę tabeli, bo przecież w naszej tabeli będziemy chcieli zapisać wartość “id_usera:_id_filmu”.

Następnie musimy wyciągnąć z wpisanego URL-a fragment zawierający identyfikator filmu. Przypominam, że cały url do filmu w YT wygląda mniej więcej tak:

http://www.youtube.com/?v=id_filmu&kolejny=parametr&…

Czyli musimy wygrzebać co jest po “v=”

Specjalnie w kodzie zostawiłem zakomentowaną sekcję. Zawiera ona fragment kodu, którym wyciągałem id filmu na początku. Działało, pod warunkiem, że parametr v pojawiał się jako pierwszy parametr w URLu. Tak jest chyba zawsze, no ale właśnie: “chyba”. Jakby ktoś wkleił jakiś przekonstruowany URL, mogłoby to nie zadziałać.

Zatem napisałem całość od nowa, oparte o funkcje parse_url i dwie eksplozje. Mam nadzieję, że jest to dla Was zrozumiałe, bo to zwykły kod produkujący zmienną $video_id korzystając z podstawowych funkcji języka PHP. A zakładam, że kurs czytają osoby, które przynajmniej podstawy PHP znają 🙂

OK, mamy już identyfikator filmu, potrzeba nam jeszcze ID autora, który właśnie dodał ten film. W tym celu pobieramy zaczep do postu, który właśnie obrabiamy (funkcja get_post() przyjmująca jako parametr id owego postu). Mając już utworzony obiekt postu możemy dobrać się do jego zawartości. Zawiera on między innymi ID autora zapisany pod zmienną $post_author.

No i wyciągania danych już koniec. Mamy id filmu i mamy id autora wpisu. Sklejamy to w zmiennej $wstawka i następnie wstawiamy do naszej tabeli. Tu oczywiście korzystamy z $wpdb i jego poznanej już metody query().

Ostatnia linijka to automatyczne dodawanie tagu “video” do wpisu. Odpowiada za to kolejna wordpressowa funkcja wp_add_post_tags() pobierająca jako argumenty id postu, do którego ma dokleić tag oraz tagi (można wpisać kilka rozdzielonych przecinkami) jakie mają do posta zostać dodane. Warto tu nadmienić, że jak większość funkcji wordpressa i ta jest w miarę inteligentna: jeśli wpis już zawiera dany tag, funkcja go nie doda ponownie.

Koniec funkcji. Teraz musimy powiedzieć wordpressowi kiedy funkcja ma zostać wykonana. Oczywiście funkcja musi zostać wykonana gdy WordPress będzie wykonywał akcję polegającą na publikacji nowo utworzonego wpisu. Odpowiada za to hook add_action o następującej treści:

add_action('publish_post', 'yt_database');

Mówi on: WordPressie – gdy wykonujesz akcję polegającą na publikacji wpisu, wykonaj funkcję yt_database(). Warto tu nadmienić, że akcja “publish_post” oznacza nie tylko publikację posta, ale także jego aktualizację.

(Tu od razu wychodzi niedociągnięcie mojego pluginu, polegające na tym, że jak ktoś zaktualizuje wpis, to plugin ponownie zapisze w bazie danych id_usera:id_filmu. Ale uznałem, że skoro to wersja 0.2, poprawię to w przyszłości dodając funkcje sprawdzające czy już dany wpis w bazie nie istnieje)

OK, co nam jeszcze zostało? Dwie rzeczy: wyświetlanie filmu we wpisie (do tej pory nie poinformowaliśmy wordpressa, że ma to robić, a sam z siebie nie jest na tyle inteligentny by wiedzieć, że jak post ma Custom Field wpisany url do YT to na pewno ten film trzeba wyświetlić) oraz wyświetlanie ostatnio dodanego filmu.

Niepotrzebnie rozbiłem to na dwie funkcje, ale skoro już tak jest, to na razie o zostawmy. Lecimy z pierwszą funkcją, czyli doklejaniem filmu na końcu wpisu.

function add_ytVideo ($content) {
	global $post;
	$czy_maVideo = get_post_meta($post->ID, "video", true);
	
	if ($czy_maVideo != "") {
		
		/* $url = explode("?", $czy_maVideo);
		$url = $url[1];
		$url = explode("&", $url);
		$url = $url[0];
		$url = explode("=", $url);
		$video_id = $url[1]; */
		
		$url = parse_url($czy_maVideo, PHP_URL_QUERY);
		$url = explode("&", $url);
		foreach ($url as $parka) {
			if (substr($parka, 0, 2) == "v=") {
				$konkretnaParka = explode("=", $parka);
				$video_id = $konkretnaParka[1];
				break;
				}
			}

	
			return $content.'
			<object width="425" height="344">
			 <param name="movie" 
			  value="http://www.youtube.com/v/'.$video_id.'&hl=pl&fs=1&">
			 </param>
			 <param name="allowFullScreen" 
			  value="true"></param>
			 <param name="allowscriptaccess" value="always"></param>
			 <embed 
			  src="https://www.youtube.com/v/'.$video_id.'&hl=pl&fs=1&" 
			  type="application/x-shockwave-flash" 
			  allowscriptaccess="always" allowfullscreen="true" 
			  width="425" height="344"></embed>
			</object>';
		
		}
	
	
	else return $content;
	
	}

Funkcja ta jest bardzo podobna do poprzedniej. Szczerze, to aż za podobna. Różni się tylko tym, że jako parametr pobiera $content w którym będzie przekazana standardowa zawartość wpisu, a na końcu zwróci albo samą zawartość wpisu (jeśli wpis nie zawiera odpowiedniego Custom Field) albo zawartość wpisu z doklejonym kodem youtubowej flashki, wcześniej w odpowiednie miejsca podstawiając $video_id filmu.

Jak widać reszta jest bardzo podobna, a nawet – jak się spojrzy na powtórne parsowanie URLa – od razu przychodzi na myśl, że nigdy nie słyszałem o osuszaniu kodu 😉 Oj słyszalem, tyle, że jestem bardziej guerilla developerem niż kimś poukładanym 🙂 Najpierw tworzę kod, a potem biorę się za jego optymalizację i czyszczenie.

OK, dość tego filozofowania. Powiedzmy wordpressowi by naszą funkcję wykonał w momencie wyświetlania wpisu. Za to odpowiada znany już nam z poprzedniej części hook polegający na przefiltrowaniu wypluwanej zawartości wpisu:

add_filter('the_content', 'add_ytVideo');

No i końcówka: tworzymy funkcję show_LastYT() pokazującą ostatni film dodany do bazy.

function show_LastYT ($user='')  {
	
	// shows last YT video added to post
	global $wpdb;
	$prefix = $wpdb->prefix;
	$yt_tablename = $prefix."yt_videos";
	
	if ($user == '') {
	
	$zapytanie = "SELECT video_id FROM  ".$yt_tablename." ORDER BY id DESC LIMIT 0, 1;";
	
	$wynik = $wpdb->get_var($zapytanie);
	
	if ($wynik != "") {
		
	$wynik = explode(":", $wynik);
	
	$wynik = $wynik[1];
	
	}
	}
	
	else {
		$zapytanie = "SELECT video_id FROM  ".$yt_tablename." ORDER BY id DESC;";
		$wyniki = $wpdb->get_results($zapytanie, ARRAY_A);
		
		foreach ($wyniki as $wynik) {
			$wynik = explode(":", $wynik['video_id']);
			$czyTenUser = $wynik[0];
			$wynik = $wynik[1];
			if ($czyTenUser == $user) {
				break;
				}
			}
		
		}
	
	
	
	echo '
	<object width="378" height="305">
	 <param name="movie" value="http://www.youtube.com/v/'.$wynik.'&hl=pl&fs=1&">
	 </param>
	 <param name="allowFullScreen" value="true">
	 </param>
	 <param name="allowscriptaccess" value="always">
	 </param>
	 <embed src="https://www.youtube.com/v/'.$wynik.'&hl=pl&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="378" height="305">
	 </embed>
	</object>
	';
	
		}

Funkcji tej nie będę tłumaczył, bo nie zawiera nic nowego odnośnie API wordpressa. W skrócie: pobiera parametr w postaci ID usera, którego chcemy przeszukać (domyślnie szuka we wszystkich filmach) i wypluwa kod odpowiedzialny za wyświetlenie flashki ze znalezionym ostatnim filmem.

Funkcji nie hookujemy, bo to autor bloga ma sam zdecydować gdzie chce aby była wykonana. Np jeśli chce aby filmik pokazywał się w sidebarze, musi w temacie graficznym w pliku sidebar.php wpisać:

<?php show_LastYT(); ?>

Ewentualnie podając jako parametr ID usera, którego chce wyświetlić.

No i tyle. Plugin już powinien działać. A jeśli ktoś nie wierzy, zapraszam do pobierania 🙂

Ciąg dalszy

Zobacz trzecią część kursu

0

Ubuntu – zmiana częstotliwości sprawdzania dysku przy starcie systemu

Jeśli ktoś podobnie jak ja ma Ubuntu i włącza i wyłącza swój komputer po kilka razy na dzień, na pewno co chwila jest nieźle wkurzony. Mianowicie co 25 uruchomień Ubuntu sprawdza czy dysk, na którym stoi system jest OK. Trwa to kilka ładnych minut, zatem w przypadku gdy często uruchomiamy system, co kilka dni zaliczamy zonka.

Jest to na szczęście konfigurowalne za pomocą narzędzia tune2fs standardowo zainstalowanego w systemie. Można za jego pośrednictwem ustawić co ile uruchomień ma być sprawdzany dysk (parametr -c) lub co jaki czas (parametr -i).

Postanowiłem sobie przestawić aby dysk z systemem był sprawdzany nie co daną ilość uruchomień, a po prostu raz na miesiąc. Polecenie jakie musiałem wydać to:

sudo tune2fs -c 0 -i 1m /dev/sda1

Co oznacza: sprawdzaj dysk sda1 nie co określoną ilość startów (-c 0), a co jeden miesiąc. m oznacza miesiąc, ale czas można określać też w dniach (doklejka d) lub tygodniach (doklejka w).

Oczywiście u was to nie musi być dysk sda1. Musicie sami sprawdzić na którym dysku macie partycję z systemem, a najłatwiej chyba to zrobić przez uruchomienie Monitora systemu i zajrzenie na zakładkę Systemy plików.

systemy-plikowDyskiem z partycją domową się nie przejmujcie, bo w ogóle nie jest sprawdzany w czasie startu systemu (oczywiście jak chcecie, możecie to zmienić za pomocą tune2fs)

* * *

I jeszcze na boku, podobne narzędzie o nazwie dumpe2fs. Uruchomione z prawami super użytkownika (i parametrem -h, bo inaczej zasypie nas mnóstwem informacji) powie nam wszystko co wie o naszym systemie plików. Ilość uruchomień pomiędzy sprawdzeniami dysku zapisana jest w wierszu Maximum mount count (wartość ujemna oznacza, że jest to wyłączone), a odstęp czasowy zapisany jest w Check interval. Oczywiście na końcu podajemy nazwę dysku do sprawdzenia, czyli na przykład:

dumpe2fs -h /dev/sda1

I tyle. Do widzenia 😉

0

Cholercia, kolejny plugin

Mam wolną chwilę to wrzucam kolejny plugin. Strona jego jest tutaj:

https://www.muzungu.pl/moje-pluginy-do-wordpressa/youtube-add-video-plugin/

Gdy to piszę pluginu jeszcze nie ma na serwerze, ale czekam właśnie na odpowiedź od WordPress (formalność mająca na celu sprawdzenie czy plugin spełnia wymogi).

Update: już jest

Plugin nazywa się idiotycznie Youtube Add Video i jak nazwa wskazuje pozwala dodać do posta film z YT. Dodatkowo ma fajną funkcję pokazującą jaki film został dodany jako ostatni. I tyle.

* * *

Klepie te pluginy jeden za drugim nie bez powodu i nie bez konsekwencji.

Poprzedni zrobiłem żeby sobie ułatwić życie. Ten zrobiłem, bo własnie robię sporą stronę na WordPressie. Wada umiejętności robienia pluginów jest taka, że człowiek przestaje iść na kompromisy tworząc wordpressowe strony.

Szukałem wtyczek do WordPressa i przeważnie nie robiły do końca tego co chciałem. Albo za dużo, albo za mało. W efekcie ta wtyczką, którą teraz publikuję powstała zanim poszukałem czy jakakolwiek inna to potrafi. Pewnie potrafi, ale doszedłem do wniosku, że znalezienie takiej zajmie mi co najmniej tyle samo czasu jeśli nie więcej niż napisanie gotowej, robiącej dokładnie to, o co mi chodzi. A szukałem właśnie wtyczki do dodawania filmu z YT przez wklejenie adresu do niego i – co ważniejsze – do pokazywania w sidebarze ostatnio dodanego filmu. Banał więc napisałem w kilka chwil. Planuję na bazie tej wtyczki napisać kolejny odcinek tutorialu tworzenia pluginów do WordPressa, bo tutaj wykorzystałem kilka nowych rzeczy: dodałem funkcję instalacyjną, wtyczka korzysta z mechanizmu opcji WordPressa i bazy danych.

* * *

Inną konsekwencją pisania pluginów jest nagły brak czasu na wszystko. Poważnie. Samo napisanie pluginu to kilka chwil, ale jakie to ma konsekwencje!

Po pierwsze pluginy trzeba aktualizować. Mój WP Sprzedawca po cichu doczekał się wersji 0.4, bo zgłaszaliście mi błędy w nim i już je poprawiłem.

Po drugie od razu mam mnóstwo pytań, czy da się zrobić to, czy da się zrobić tamto, a jeśli nie, to czy kiedyś planuję taką funkcję. Oczywiście planuję, ale kiedyś to bardzo elastyczne słowo.

Po trzecie nagle posypały się zlecenia. Jak pisałem robię teraz sporą stronę. W między czasie chyba z siedmiu osobom musiałem napisać, że jeśli chcą abym im zrobił stronę / plugin / skórkę to muszą poczekać co najmniej tydzień. Trochę szkoda, bo większość nie chce czekać, ale zwyczajnie się nie wyrobię.

Z tego trzeciego oczywiście się cieszę. 🙂 Trochę uderza we mnie kontrast: przez rok siedziałem i prawie nic nie robiłem, a teraz siedzę po 8-10 godzin dziennie i pracuję. Ale dobrze, czas ruszyć tyłek 🙂

Jak ktoś jeszcze potrzebuje coś odnośnie WordPressa (strona na nim, plugin do niego, pomoc w instalacji, konfiguracji itp itd) to zapraszam do kontaktu. Przy czym jak wyżej napisałem, jest wielce prawdopodobne, że nie zajmę się zleceniem od razu. Chyba, że to będzie jakiś banał.

0