shoorick: (Рыжий)
CMS Drupal — штука мощная и потому имеет несколько интерфейсов, мне известны два: веб-интерфейс (это наглядно) и командная строка (это быстро) — командой drush. Драш умеет, например, чистить кэш, но при запуске задаёт вопрос, какой же кэш почистить:
Enter a number to choose which cache to clear.
 [0]   :  Cancel         
 [1]   :  all            
 [2]   :  drush          
 [3]   :  theme-registry 
 [4]   :  menu           
 [5]   :  css-js         
 [6]   :  block          
 [7]   :  module-list    
 [8]   :  theme-list     
 [9]   :  registry       
 [10]  :  token          
 [11]  :  views

Чтобы каждый раз не вводить нужный номер, я запускал его так:
echo 1 | drush cc

Однако нашёлся более простой и наглядный способ:
drush cc all


http://shoorick.ru/2015/05/22/drush-simpler/
shoorick: (Рыжий)
После нескольких неудачных попыток прилогиниться к сайту, сделанному на друпале 7.15, пользователь натыкается на сообщение:
Sorry, there have been more than 5 failed login attempts for this account. It is temporarily blocked. Try again later or request a new password.
Насколько позже стóит повторить попытку — непонятно.

Полез в БД — в таблице `users` никакой информации об активности пользователей. А вот в таблице `flood` — есть: в поле `event` — название события, `identifier` — идентификатор: IP либо строка вида UID-IP для попыток залогиниться, если логин существует, `timestamp` и `expiration` — время попытки входа и истечения бана (в секундах с начала эпохи). Продолжительность бана — 3600 секунд (час) для случаев, когда UID не указан и 21600 секунд (6 часов) — для пары UID-IP.

Если удалить из таблицы `flood` лишние записи — вход открывается.

P. S. Узнать текущее время в секундах с начала эпохи в юниксоподобных операционных системах можно командой
date +%s
в MySQL для этого есть функция UNIX_TIMESTAMP.
shoorick: (Default)
Два дня гугления, помноженные на эксперименты с бубном, показали: если в своей теме многоязычного сайта на Drupal 7 надо вывести меню, то надо писать не так, как советует подавляющее большинство источников:
<?php print render( menu_tree('menu-info-about') ); ?>
а по-другому:
<?php print render( i18n_menu_translated_tree('menu-info-about') ); ?>
Если же пойти первым путём, то в выводимое меню попадут пункты на ненужных языках.
shoorick: (Default)
В модуле Calendar для друпала шаблоны страниц с календарями какие-то странные, а точнее, в них странные URL по умолчанию: smth/year/YYYY, smth/month/YYYY-MM, smth/day/YYYY-MM-DD, хотя было бы правильнее давать страницам с выборками по году, месяцу и дню такие адреса: smth/YYYY, smth/YYYY/MM, smth/YYYY/MM/DD. Если при этим отдельным страницам давать адреса smth/YYYY/MM/DD/title — всё было б красиво и логично.

Неоднократно пробовал ковыряться в настройках представлений (Views) — не помогает. Решил загуглить — нашёл схожую ситуацию: народ безуспешно пытается внедрить в сделанный на друпале блог подобную адресацию. Автор модуля отвечает народу:
closed (works as designed)
Can't be done. To Views, the '/' is a separator between arguments. If you do 2010/02 Views will treat that as two different arguments, one with the value '2010' and one with the value '02'. If there is any way to get that to work right (which I'm not sure there is) it would take nothing less than a complete rewrite of the module.
И чё делать? Хотя это было написано год назад и с тех пор календарный модуль поменялся.

Ну и традиционная двухминутка ненависти — документация в друпале плохая, в его модулях — ужасная.
shoorick: (Default)
Погуглив, нашёл работоспособный модуль, позволяющий прикрутить к седьмому друпалу поиск Sphinx — это заметно лучше встроенного убожества. Модуль написан русским человеком, но русского перевода не имеет. Пришлось слепить самому. Результат — https://gist.github.com/2318590
shoorick: (Default)
Странности творятся. Почитав мануал, обращаюсь к друпаловой БД, ищу дубликаты адресов в таблице с 7500 строками:
SELECT `alias`
FROM `PREFIX_url_alias`
GROUP BY `language`, `alias`
HAVING COUNT(*)>1;
MySQL достаточно резво выдаёт ответ из почти семи десятков строк. Делаю запрос с подзапросом, чтоб выбрать номера узлов с найденными на предыдущем шаге дублями:
SELECT `source`
FROM `PREFIX_url_alias`
WHERE `alias` IN (
    SELECT `alias`
    FROM `PREFIX_url_alias`
    GROUP BY `language`, `alias`
    HAVING COUNT(*)>1
);
В итоге MySQL тяжко задумывается — вот уж 20 минут непонятно, что делает. Посмотрел SHOW CREATE TABLE — по полю `alias` строится индекс. Чё ему ещё надо-то?

P. S. Понятно, что я могу найденное на первом шаге тупо перебрать в цикле, написав какой-нибудь перлоскрипт, однако хочется сделать как-то изящнее.
shoorick: (Default)
Похоже, в друпале придётся применять тот же способ, как и в одном из предшествующих сайтов — отказаться от всяческих абстракций в пользу чистого SQL. Если, конечно, он предусмотрен.

Поглядев статистику потраченного друпалом времени и количества запросов к СУБД, офигел весь был неприятно удивлён: на формирование страницы со списком подмножества опубликованных статей друпал потратил от 100 до 11 тысяч запросов, что заняло от 2 секунд до более чем полутора минут. Это как так?

Я, конечно, понимаю, что время программиста сейчас ценится выше машинного времени плюс друпалу на отрисовку страницы ещё нужны кое-какие ресурсы, но это не может служить оправданием того безобразия, что я наблюдаю: сидя дома, не имея под рукой эпического полотна со структурой хотя бы части БД, я минут за 10 написал и отладил SQL-запрос, который формирует тот же самый список статей и при этом выполнение запроса укладывается в десятки миллисекунд. На то, чтобы понять, как работают Views, и поэкспериментировать с ними, я потратил часы и дни. И всё равно толком не понял.
shoorick: (Default)
В этом вашем друпале, как показал метод научного тыка, вывести нужное меню можно командой
<?php print render( menu_tree('menu-info-for-root') ); ?>
Но найти информацию об этом на drupal.org с его миллионом страниц или, что ещё хуже, на drupal.ru, который представляет из себя форум, где одни чайники спрашивают совета у других — нереально.

Тот, кто ругает Mojolicious за корявую документацию — не видел, наверное, тот ужас, который творится в друпале.

Я негодую.
shoorick: (Default)
Понадобилось перенести сайт с малоизвестной CMS на Drupal. Две недели гуглил и читал крохи найденной документации. Понял, что общедрупальный бардак с документацией в полной мере относится и к модулям: например, в рекомендуемом для переездов модуле Migrate я так и не смог за эти две недели разобраться: вместо внятного руководства — какие-то блоги да презентации, целевой аудиторией имеющие телепатов. Человеку, даже знающему PHP и умеющему слегка настраивать Drupal, но не писавшему под него модулей, что-либо понять в таком мануале, а тем более, сделать работающий пример — нереально.

Плюс к тому меня вот уже который год удивляет адресация на друпальных сайтах: их авторы вместо того, чтобы сделать правильные адреса, оставляют всё как есть. Даже на drupal.org полно страниц с адресами типа /node/шестизначный_номер.

Дело кончилось тем, что за день я написал перловый скрипт, который и перегнал мне данные (хотя как-то не совсем правильно), выдав в итоге кучу SQL-запросов. Сами данные также были предварительно обработаны перлоскриптами.
shoorick: (Default)
Понадобилось вчера распечатать большую картинку (схему БД из Drupal 7). Размер картинки — более 2K×2K, на листе формата A4 смотрится совершенно нечитаемо.

Что делать? Разбивать на кусочки. Вариант простой и тупой (но неправильный) — использовать Inkscape: открыть картинку, увеличить, поместить её на лист нужного размера, ( двигать и печатать ) × n.

Погуглив, нашёл другой метод: использовать команду poster. Попробовал — работает. Увеличить исходную картинку (Encapsulated PostScript формата A4) и разрезать на кусочки того же размера можно, например, так:
poster -v -pA2 drupal7_model_0.eps > many-pages.ps
Правда, результат вышел даже крупнее, чем A2 — картинка растянулась на 6 листов A4 (судя по мануалу, это не баг — это фича), но в моём случае это не страшно.

Получившийся многостраничный PostScript-файл можно спокойно печатать и потом склеивать листы.

Драйверы некоторых принтеров умеют делать то же самое без всякой командной строки (я такое как-то видел), но в моём случае я такой возможности не нашёл.
shoorick: (Default)
Ковыряю шестой Drupal, а точнее — сделанный на нём OpenPublish. В его установщике нашёл чудесное: он ищет файлы, обходя дерево каталогов. Вместо того, чтобы один раз обойти дерево, записать его в память и потом обращаться сразу к памяти, это $%#$@# чудо каждый раз, для каждого файла, вызывает функцию поиска, которая рекурсивно вызывает саму себя и, за счёт большого количества файлов в дереве, помирает, не уложившись в допустимое время. Попробовал увеличить время жизни до рекомендованных двух минут (даже до четырёх пробовал) — всё равно не успевает. Попробую увеличить до десяти...

upd/17:25: Проработал 5 минут и молча сдох, даже не сказав в лог, почему. За это время функция file_scan_directory была вызвана почти 60 тысяч раз.

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 7th, 2025 12:03 am
Powered by Dreamwidth Studios