Piwik 2.6.0 i problemy z upgrade

Od jakiegoś czasu korzystam ze statystyk Piwik na większości moich stron ii generalnie jestem zadowolony. Do tej pory aktualizacje wersji były totalnie bezproblemowe (klikalne), ale aktualizacja wersji do 2.6.0 zakończyła się niepowodzeniem.

Od początku wyglądało dziwnie, bo kliknięcie w changelog w mojej instalacji Piwika nie pokazywało listy zmian dla wersji 2.6.0, a w dziale download najnowsza wersja opisana była jako 2.5.0 (choć faktycznie archiwum zawierało 2.6.0).

Automatyczny upgrade zakończył się klęską i pokazywaniem białej strony, postanowiłem zrobić aktualizację ręcznie, jak opisano na stronie. Okazało się, że pobrany plik piwik.zip rozpakowuje się w ślimaczym tempie (ok. 20kB/s). Także na innej, szybszej maszynie, z nowszym Debianem (unstable). Ostatecznie rozpakowałem na tej szybszej, przepakowałem do tar.gz. Przy okazji rozmiar spadł do 8MB w porównaniu z 11MB oryginalnego zip, a rozpakowanie odbyło się w normalnym tempie, czyli parę MB/s. Następnie przeprowadziłem aktualizację ręcznie.

Niewiele to pomogło, bo nadal była biała strona. Ręczne wywołanie pliku piwik.php dało więcej informacji:

PHP Warning:  require(/var/www/piwik/vendor/facebook/xhprof/xhprof_lib/utils/xhprof_lib.php): failed to open stream: No such file or directory in /var/www/piwik/vendor/composer/autoload_real.php on line 58
PHP Fatal error:  require(): Failed opening required '/var/www/piwik/vendor/facebook/xhprof/xhprof_lib/utils/xhprof_lib.php' (include_path='/var/www/piwik/vendor/phpunit/php-text-template:/var/www/piwik/vendor/phpunit/phpunit-mock-objects:/var/www/piwik/vendor/phpunit/php-timer:/var/www/piwik/vendor/phpunit/php-file-iterator:/var/www/piwik/vendor/phpunit/php-code-coverage:/var/www/piwik/vendor/phpunit/phpunit:/var/www/piwik/vendor/symfony/yaml:.:/usr/share/php:/usr/share/pear') in /var/www/piwik/vendor/composer/autoload_real.php on line 58

Szybki debug i znalazł się winny. W pliku /var/www/piwik/vendor/composer/autoload_files.php należy zakomentować odwołania do nieistniejących plików:

#    $vendorDir . '/facebook/xhprof/xhprof_lib/utils/xhprof_lib.php',
#    $vendorDir . '/facebook/xhprof/xhprof_lib/utils/xhprof_runs.php'

Po tej operacji wszystko działa poprawnie. HTH

http://pastebin.com/S4Hxjw6B

UPDATE: Szybcy są i czytają Twittera, już (podobno) poprawili wydając 2.6.1. 🙂

Wyszukiwarka na blogu

Z jakichś powodów szukałem niedawno możliwości podpięcia pod bloga innej wyszukiwarki, niż ta przychodząca z Blox. Pierwsze co przyszło mi do głowy, to Google i któraś z ich usług. Wiem, zewnętrzny serwis, w dodatku Google. Pewnie bym nie użył i tak, ale nie każdemu to przeszkadza… Jednak to co znalazłem u Google miało wadę – nie dawało się zawęzić do danej witryny, szukało także na podlinkowanych stronach.

Dziś u Boniego w komentarzach zeszło na dyskusję nt. wyszukiwarki na blogu i… postanowiłem poszukać, czy DuckDuckGo się dorobiło. TIL:

  • Mają stronkę z pomysłami i całkiem przyzwoitą wyszukiwarką wśród nich. Na dodatek zintegrowaną z forum.
  • Mają też możliwość podpięcia wyszukiwarki do bloga dokładnie w taki sposób, o który mi chodziło. Oczywiście o ile ktoś się nie brzydzi iframe i zewnętrznym serwisem. Ja się nie brzydzę.
  • Obsługują parametr site: dla wyszukiwania w danej domenie. Albo nowe, albo ślepy jestem, bo brakowało mi tego i korzystałem do tego celu z Google.

Dla Google pewnie też zadziała, w analogiczny sposób, ale w trosce o prywatność, anonimowość itd. itp. zostaje DuckDuckGo. Wyszukiwarki z Blox póki co nie zdejmuję, ale zachęcam do korzystania z nowej.

UPDATE Strona opisująca umieszczenie wyszukiwarki DuckDuckGo na stronie.

Własna namiastka dyndns

Po ostatniej akcji Microsoftu z przejęciem i zablokowaniem domen należących do No-IP miałem przez moment umiarkowany problem z dostępem do jednej z moich maszyn, bo nie znałem IP. Nic krytycznego i szybko rozwiązałem, ale stwierdziłem, że warto by się zabezpieczyć na przyszłość. Początkowo chciałem uruchomić po prostu innego dostawcę dyndns, z inną domeną, co dałoby całkiem niezłą – jak mi się wydaje – redundancję w tym względzie, ale prowizorycznie uruchomiłem coś innego, własnego i znacznie prostszego. W komentarzu do poprzedniego wpisu padło pytanie co dokładnie zrobiłem, więc opisuję.

Tak się składa, że mam serwer dedykowany ze stałym IP (nie jest konieczne zamiast tego można skorzystać z domeny), na którym stoi serwer WWW (lighttpd). Na wszystkich maszynkach potrzebujących dyndns mam dostęp do crona (zresztą, korzystałem z crona już przy zwykłym koncie dyndns, patrz update wpisu). Rozwiązanie jest proste: klient wywołuje okresowo unikatowy URL na moim serwerze, serwer okresowo parsuje log w poszukiwaniu tego unikatowego ciągu znaków i zapisuje IP z którego nastąpiło odwołanie w określonym pliku.

Poniżej wklejki ze wszystkimi onelinerami (gotowiec dla lighttpd, w przypadku innego serwera WWW trzeba dostosować):

# po stronie klienta*/5 * * * * /usr/bin/wget -4 -q -O /dev/null http://mojadomena.com/losowyciagznakow4346456543324645 > /dev/null
 # po stronie serwera*/5 * * * * /usr/bin/awk '/losowyciagznakow4346456543324645/ {ip=$1} END {print ip}' /var/log/lighttpd/access.log > /var/www/dyndns_host1.txt
 # pobranie IPwget -O - http://mojadomena.com/dyndns_host1.txt

Po namyśle, rozwiązanie nawet lepsze niż drugi dostawca dyndns. Mniej kont, prostsza konfiguracja, mając stałe IP na upartego można całkowicie uniezależnić się od DNSów, jeśli ktoś odczuwa potrzebę.

Oczywiście nie od razu tak to wyglądało, w szczególności po stronie serwera był grep, awk, tail w użyciu. Ale skoro da się wszystko załatwić awk (a nie tylko wyświetlanie określonej kolumny, chyba najczęstsze zastosowanie awk…), to czemu nie? Tu polecam zbiór przydatnych onelinerów w awk.

UPDATE: IPv6 się popularyzuje. Okazało się, że mój skrypt nie działa poprawnie, bo łączenie między maszynami następuje po IPv6. Dodany parametr -4 do wget w celu naprawy tego problemu.