Home / Community / Blog

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"

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28