8 июн. 2011 г.

сортированные массивы/JSON в JavaScript

Недавно мной был обнаружен баг при создании простой страницы: в различных браузерах проход по отсортированному массиву производится по разному( к слову - в FF проход идет нормальный, в Opera и Chrome - все идет не по плану).
Суть заключается в следующем:
на стороне сервера создается массив, сортируется по значениям в алфавитном порядке и передается во view:
$data = array();
 ....
asort($data, SORT_STRING);
$this->view->data = Zend_Json_Encoder::encode($data); // передаем во view наш массив, закодированный в json.

Во view обработка следующая (происходит заполнение тэга select при помощи js):
var data = data ?>;
for(t in data)
{
   el = $("");
   el.attr('label', data[t]);
   el.attr('value', t);
   $('#object_id').append(el);
}

В данном случае, не смотря на то, что массив JS заполнен отсортированными по значениям - не ключам - данными, браузеры проходят по массиву как хотят. Решением данной проблемы стал следующий костыль:
при заполнении массива на стороне сервера необходимо выравнивать длину ключей( в моем случае ключи были целочисленными) при помощи функции vsprintf, в результате чего происходит заполнение недостоющих символов пробелами( при обработке POST запроса - лишние пробелы собственоручно удаляются) :

$data = array();
 ....
asort($data, SORT_STRING);
$result = array();
foreach($data as $k => &$v)
{
$result[vsprintf("%10s", $k)] = $v;
 }
$data = $result;
$this->view->data = Zend_Json_Encoder::encode($data);
В качестве альтернативы ф-ции vsprintf можно использовать ф-цию str_pad.



20 мая 2011 г.

Переключение раскладки клавиатуры в Linux под X window

На своем HTPC возникла проблема с переключением раскладки клавиатуры после того как был отключен оконный менеджер(LXDE) и происходил запуск непосредственно XBMC. Решением дааной проблеммы стала правка файла /etc/X11/xorg.conf и добавлением в секцию Section "InputDevice"(в которой описывается клавиатура) следующих строк:
  Option "XkbRules" "xorg"  
  Option "XkbLayout" "us,ru"  #необходимые языки
  Option "XkbVariant" ",winkeys"  #необходимая вариация раскладки для каждого языка(для us - стандартная, для ru - winkeys
  Option "XkbOptions" "grp:ctrl_shift_toggle" # переключение раскладки при помощи нажатия ctrl+shift

После рестарта X-ов раскладка все равно не переключалась а лог фал показал следующее:
.........
[ 141.694] (==) Using config file: "/etc/X11/xorg.conf"
[ 141.694] (==) Using config directory: "/etc/X11/xorg.conf.d"
..........
[ 141.697] (WW) AllowEmptyInput is on, devices using drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.
...........
[ 150.835] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event2)
[ 150.835] (**) AT Translated Set 2 keyboard: Applying InputClass "evdev keyboard catchall"
[ 150.835] (**) AT Translated Set 2 keyboard: Applying InputClass "LocalKeyboard"
[ 150.835] (**) AT Translated Set 2 keyboard: always reports core events
[ 150.835] (**) AT Translated Set 2 keyboard: Device: "/dev/input/event2"
[ 150.853] (II) AT Translated Set 2 keyboard: Found keys
[ 150.853] (II) AT Translated Set 2 keyboard: Configuring as keyboard
[ 150.853] (II) XINPUT: Adding extended input device "AT Translated Set 2 keyboard" (type: KEYBOARD)
[ 150.853] (**) Option "xkb_rules" "evdev"
[ 150.854] (**) Option "xkb_model" "evdev"
[ 150.854] (**) Option "xkb_layout" "us"
[ 151.018] (II) XKB: reuse xkmfile /tmp/server-A9ACCDF38EB1446AC7992CE0B930842F0AD908B1.xkm
.............
Данный лог навел на мыслль, что правила для клавиатуры не загружаются из xorg.conf, а беруться из других конфигурационных файлов в папке /etc/X11/xorg.conf.d . Просмотрев  данную папку был найден файл 90-keytable.conf , куда и были продублированы необходимые настройки клавиатуры из xorg.conf, в результате чего он обрел следующий вид:
Section "InputClass"
Identifier "LocalKeyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "XkbOptions" "grp:ctrl_shift_toggle"
EndSection

Всевозможные варианты layout, variant, option для клавиатуры можно посмотреть в файле /usr/share/X11/xkb/rules/base.lst

7 мая 2011 г.

Google chrome следит за вами

Разбираясь как то раз с гляками в работе проекта наткнулся в логах apache на записи гугл бота к закрытой части сайта(без аутентификации туда никого не пускает) - на что был дан ответ 302 :
crawl-66-249-71-46.googlebot.com - - [04/May/2011:12:58:33 +0700] "GET /xxxxx HTTP/1.1" 302 20 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Поиск по логам показал - за день до этого был доступ к данной странице из chrome:
inetIP - - [03/May/2011:09:28:37 +0700] "GET /admin/xxxxx HTTP/1.1" 302 20 "http://blabla.ru/admin/yyyyyy" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
Соответственно гугл может получить любую информацию о вас при серфинге по закрытым страницам интернета(соотв может в том же вконтакте снять инфу, которая закрыта от других, прочитать инфу на странице интернет-банкинга ну и т.д.) если вы получаете доступ к ним при помощи google chrome. Будте бдительны!!!!