Standardowo po instalacji linki w ez Publish'u wyglądają jakoś tak:
http://www.jaqb.int.pl/index.php?/pol/Spolecznosc/Blog
ale ten index.php w środku niezbyt ładnie wygląda. Żeby się go pozbyć trzeba zmienić definicję wirtualnego serwera zgodnie z instrukcją na stronie (ja dopisałem tylko sekcję dotyczącą mod_rewrite do istniejących wpisów), zmodyfikować plik
settings/override/site.ini.append.php
dodając w sekcji SiteAccessSettings wiersz:
ForceVirtualHost=true
oraz wyczyścić pamięć tymczasową (cache)
php ./bin/php/ezcache.php --clear-all
od wersji 4.4 trzeba dodać jeszcze --allow-root-user gdy robimy to jako użytkownik root.
Miałem taki problem: jest sobie baza MySQL'a na serwerze do którego nie miałem innego dostępu - jak tu teraz zarządzać bazą? Oczywiście można
mysql --password --user=mojuser --host=jakistam.pl fajnabaza
ale to jest rozwiązanie dla pianistów. Webowy program phpMyAdmin również pozwala na zdalną pracę wystarczy podać mu namiary na sewrer(y) w pliku
/etc/phpmyadmin/config.php
Ja dopisałem:
$i++; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['host'] = 'jakistam.pl'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = true; $cfg['Servers'][$i]['extension'] = 'mysqli'; $cfg['Servers'][$i]['AllowNoPassword'] = false;
jak widać włączyłem kompresję i zmieniłem typ połączenia na mysqli. Można dopisać więcej jak ktoś lubi, tylko trzeba pamiętać o zwiększaniu licznika ($i++;) przed każdą nową konfiguracją.
Jakby komuś jeszcze tego było mało to może uruchomić MySQL Workbench, ale u mnie do zdalnej pracy u mnie brakowało mu pliku
/usr/lib/mysql-workbench/mysqlcppconn.so
którego nie było w pakiecie
libmysqlcppconn1
a gdzie indziej nie miałem czasu szukać.
Po tym jak i naprawiłem tagi (jak się okazało nie do końca) i zaczęło działać archiwum blogów naprawienie wyszukiwania wpisów na blogu po tagach było dość proste. Błąd pojawiający się w var/log/error.log
AND ezkeyword_attribute_link.keyword_id = ezkeyword.id \ ORDER BY a0.sort_key_int DESC LIMIT 10 BŁĄD: dla SELECT DISTINCT, ORDER BY wyrażenia muszą występować \ na liście wyboru
(a w zasadzie końcówka zapytania) oprowadziła mnie do pliku kernel/content/ezcontentfunctioncollection.php w którym zmodyfikowałem zapytanie SQL rozpoczynające się w linii 989 i kończące się jak w błędzie powyżej. Najpierw z listy sortowania wyciągam same nazwy pól i dodaję je do zapytania. Cała zmiana wygląda tak:
--- ezcontentfunctioncollection.php-org 2009-02-16 16:16:49.000000000 +0100 +++ ezcontentfunctioncollection.php-new 2011-02-14 00:01:11.000000000 +0100 @@ -993,8 +993,12 @@ { $sqlMatching = "ezkeyword.keyword = '$alphabet'"; } + if (substr( $sqlTarget, 0, 9) == 'DISTINCT ') { + $sortingFielsdList=", ".str_replace(array("ASC", "DESC"), "", \ $sortingInfo['sortingFields']); + } $query = "SELECT $sqlTarget + {$sortingFielsdList} FROM ezkeyword, ezkeyword_attribute_link,ezcontentobject_tree,ezcontentobject, \ ezcontentclass $sortingInfo[attributeFromSQL] $sqlPermissionChecking[from]
Teraz żadne błędy się już nie pojawiają, ale i tak chyba czas pomyśleć i aktualizacji.
W istniejącej instalacji ezPublish w wersji 4.0.3 miałem problem, o nie wyświetlała się chmura tag'ów (tag cloud). Wskazówka była w pliku var/log/error.log:
Error: error executing query: SELECT ezkeyword.keyword, count(*) as keyword_count FROM ezkeyword, ezkeyword_attribute_link, ezcontentobject, ezcontentobject_attribute, ezcontentobject_tree WHERE ezkeyword.id = ezkeyword_attribute_link.keyword_id AND ezkeyword_attribute_link.objectattribute_id = ezcontentobject_attribute.id AND ezcontentobject_attribute.contentobject_id = ezcontentobject_tree.contentobject_id AND ezcontentobject_attribute.contentobject_id = ezcontentobject.id AND ezcontentobject.status = 1 AND ezcontentobject_attribute.version = ezcontentobject.current_version AND ezcontentobject_tree.main_node_id = ezcontentobject_tree.node_id AND ezcontentobject_tree.path_string like '/1/2/%' AND ezcontentobject_tree.node_id != 2 AND ezcontentobject_tree.is_invisible = 0 AND ezcontentobject.language_mask & 3 > 0 GROUP BY ezkeyword.id ORDER BY ezkeyword.keyword ASC BŁĄD: kolumna "ezkeyword.keyword" musi występować w klauzuli GROUP BY lub być użyta w funkcji agregującej
rozwiązanie jest oczywiste, mniej oczywista jest lokalizacja pliku w którym jest zdefiniowane to zapytanie. Przeszukałem pliki pod kątem frazy ezkeyword.keyword i znalazłem plik
extension/ezwebin/autoloads/eztagcloud.php
w którym zmieniłem GROUP BY'a w linii 120 na:
GROUP BY ezkeyword.id, ezkeyword.keyword
problem został rozwiazany, a efekty było widać nawet bez czyszczenia pamięci podręcznej.
Pojawiał się błąd:
BŁĄD: błąd składni w lub blisko "DESC" LINE 14: ... FROM_UNIXTIME( ezcontentobject_attribute.data_int ) ) DESC
Żeby to poprawić to najpierw trzeba dodać funkcje które udają (emulują) MySQL'a (źródło):
CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP without TIME ZONE) RETURNS INTEGER AS $$ SELECT EXTRACT(MONTH FROM $1)::INTEGER; $$ LANGUAGE SQL IMMUTABLE; CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP WITH TIME ZONE) RETURNS INTEGER AS $$ SELECT EXTRACT(MONTH FROM $1)::INTEGER; $$ LANGUAGE SQL STABLE; CREATE OR REPLACE FUNCTION MONTH(DATE) RETURNS INTEGER AS $$ SELECT EXTRACT(MONTH FROM $1)::INTEGER; $$ LANGUAGE SQL IMMUTABLE;
dodatkowo jeszcze:
CREATE OR REPLACE FUNCTION YEAR(TIMESTAMP without TIME ZONE) RETURNS INTEGER AS $$ SELECT EXTRACT(YEAR FROM $1)::INTEGER; $$ LANGUAGE SQL IMMUTABLE;
oraz konwersji czasu (źródło):
CREATE OR REPLACE FUNCTION from_unixtime(integer) RETURNS timestamp AS ' SELECT $1::abstime::timestamp without time zone AS result ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION unix_timestamp() RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM abstime(now()) ))::int4 AS result; ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION unix_timestamp(timestamp with time zone) RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM ABSTIME($1) ))::int4 AS result; ' LANGUAGE 'SQL';
i na podstawie powyższych:
CREATE OR REPLACE FUNCTION unix_timestamp(text) RETURNS integer AS ' SELECT ROUND(EXTRACT( EPOCH FROM ABSTIME($1) ))::int4 AS result; ' LANGUAGE 'SQL';
i na koniec:
CREATE OR REPLACE FUNCTION "concat"(int, text, int, text, int) RETURNS text AS ' SELECT $1 || $2 || $3 || $4 || $5; ' LANGUAGE 'sql';
specjalnie dla zapytania w pliku extension/ezwebin/autoloads/ezarchive.php które też trzeba poprawić. W zapytaniu SQL w linii 54 jest błąd: GROUP BY nie służy do sortowania a poza tym skoro pola są zdefiniowane i nazwane to wystarczy użyć tej nazwy. Ja zmieniłem końcówkę na taką:
GROUP BY year, month ORDER BY year DESC, month DESC
niestety na tym nie koniec. Pojawiają się kolejne błędy, ale o tym w następnym odcinku ...
Z zasady eAccelerator nie czyści skryptów z dysku. Jeżeli strona się zmienia albo miejsca brakuje można wyczyścić go z skryptem w cron'ie:
#!/bin/sh # żeby nie kasował tylko pliki trzeba uruchamiać osobno #dla każdego katalogu for x in `ls -d /var/cache/httpd/php-eaccelerator/*/*` ; do /usr/sbin/tmpwatch 30d $x done
u mnie uruchamiany jest raz w miesiącu.
Wcześniej opisałem gotowca, ale te magiczne numerki podane do wpisania do pliku 99-permissions.rules nie biorą się znikąd. Teraz podłączyłem interfejs ELM327 i oczywiście widoczny był jako /dev/ttyUSB0 (ale na końcu mógłby być większy numerek). Żeby zawsze widać go było pod tą samą nazwą sprawdziłem co tak naprawdę podpiąłem:
udevadm test --action=add `/sbin/udevadm info --query=path \ --name=ttyUSB0
i ładnie napisało m.in:
udevadm_test: ID_VENDOR=FTDI udevadm_test: ID_VENDOR_ID=0403 udevadm_test: ID_MODEL_ID=6001 udevadm_test: ID_REVISION=0600 udevadm_test: ID_SERIAL_SHORT=A400huOr
pytanie można zadać tez w taki sposób:
/sbin/udevadm info --query=all --name=ttyUSB0
dane są te same, tylko w trochę innej postaci.
Teraz już wiadomo, że do pliku 99-permissions.rules muszę dopisać:
# ELM 327 KERNEL=="ttyUSB*", ENV{ID_VENDOR_ID}=="0403", \ ENV{ID_MODEL_ID}=="6001", MODE="0666", SYMLINK+="elm327"
Add comment