Архив рубрики: Веб

Всюду яваскрипт

Что-то стало модно всё подряд писать на яваскрипте. Куда ни глянь — всюду JavaScript, даже за пределами веба. Генератор карт TileMill — на яваскрипте. Текстовые редаторы и IDE теперь тоже на нём же пишут. Потому-то современные редакторы, наверное и тормозят — у них ведь помимо редактора ещё целый браузер внутри! У Komodo Edit и Komodo IDE — Mozilla Firefox, у Атома и Visual Studio Code — Chromium.

ls ~/bin/komodo/lib/mozilla

Из одной бочки разливали

Как и ожидалось, Open Conference Systems, якобы не имеющая русской локализации, при должном применении напильника вполне способна использовать великий и могучий. В каталоге lib/pkp даже можно найти русские локализационные XML-файлы. Вообще весь этот каталог lib/pkp — общий и для OCS, и для OJS, что видно по гитхабу. Правда, в свежей версии Open Journal Systems переводов всё-таки побольше. Похоже, OCS, как не особо активно развиваемый продукт, содержит в себе копию lib/php трёхлетней давности, во всяком случае файлы lib/php/locale/ru_RU/*.xml — как раз 2012 года. Надо провести эксперимент — подсунуть в древнюю OCS 2.3 переводы из свежей OJS 2.4.7-1 — скорее всего, хуже не будет. Я пока заметил только один недостаток, мешающий тупо скопировать локализационные файлы: “User Home” переведено как «Мои журналы» — как-то неправильно показывать такое на сайте конференции.

Кстати, коллеги, кто-нибудь пробовал использовать Open Conference Systems для создания сайтов конференций? WordPress и mojowka для этого плохо подходят (хотя можно и с ними — я так делал) — хочется всё-таки использовать специализированное решение, избежав при этом танцев по граблям.

Косой левый край

Задача — сделать на веб-странице косой левый край у текстового блока, то есть, нужна лесенка из строк. Ширина страницы произвольная, текст должен переноситься автоматически.

Решение — накидать слева плавающих элементов с одинаковой шириной, но разной высотой, отличающейся у соседних элементов на расстояние между базовыми линиями соседних строк. Пусть текст и обтекает эту лесенку:

Косой край

Готовый пример — http://codepen.io/shoorick/pen/MaEdPN

Внедрение лилипондовых нот в википедию

Случайно обнаружил, что в википедию можно вставлять ноты в виде лилипондового исходного текста и оно само преобразуется в картинку и, если надо, плеер. Для этого достаточно обернуть исходный текст в тэг <score>. Пример — ноты в статье про Атикву.

Ноты

Преимущество такого подхода — простота вставки и отсутствие необходимости держать лилипонд у себя.

Недостатки — неаккуратный внешний вид (это настраивается?) и, видимо, невозможность использовать свои шрифты (кириллица в лилипонде по умолчанию ужасна).

Re: в третий раз ходил за ёлкой

Улучшенный Ильменский сайт вчера наконец-то переехал на ilmeny.org — там теперь и шустрый FastCGI-бэкенд, и HTML5/CSS3/SVG, и нормальный внешний вид на мобильных устройствах. Точнее, не сайт переехал, а адрес стал указывать на новый сайт вместо старого. Так что процесс разработки и тестирования можно считать завершённым — пора начинать собираться на фестиваль.

В течение суток по инерции может ещё показываться старый белый сайт, но это не страшно — содержимое у них совпадает, старые адреса работоспособны.

test.ilmeny.org

Он и в третий раз ходил за ёлкой… И добыл её!

Давно хотел улучшить ильменский сайт, да всё руки не доходили. Уж подумывал и переписать совсем. Что только не пробовал — и тяжёлый перловый фреймворк Catalyst, и написанные на PHP системы управления сайтами — Друпал да ВордПресс. И всё никак не получалось дойти за какого-то осмысленного результата. В итоге всё свелось к переписыванию на Mojolicious::Lite — это всяко веселее, чем набор древних CGI-скриптов.

Начал в мае 2011 года — бросил. Подобрал в мае тринадцатого — снова бросил. Пришёл май пятнадцатого — снова взялся и как-то всё-таки дошёл до завершения первого этапа: воссоздал на моджо всю функциональность прошлого сайта, который был запущен ещё в 2003 году. Ну и перекрасил попутно. Свежий сайт да ещё и на новом железе с другими ОС и веб-сервером работает гораздо шустрее старого: отдаёт 50 разных страниц в секунду, а не две. Кстати, Друпал с ВордПрессом (правда, без нормального кэширования) работают ещё медленнее, чем старый сайт.

Новый сайт лежит на test.ilmeny.org, в выходные потестирую, в понедельник, наверное, запущу его вместо старого.

test.ilmeny.org

Если увидите на свежем сайте что-то неправильное — сообщите, пожалуйста.

P. S. Попутно выяснил: боевой режим в Mojolicious называется не production, как я почему-то думал, а deployment всё-таки production, но при запуске через Starman выставляется переменная окружения PLACK_ENV=deployment, которая с попадает в app->mode.

Ещё проще

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

Карта с рельефом

Пару лет назад я пробовал рисовать карты из данных OpenStreetMap при помощи Maperitive — и даже что-то говорил об этом в докладе на UWDC-2013. Что понравилось ещё тогда — возможность «из коробки» отображать рельеф: Маперитив умеет сам ходить в сеть за открытыми данными о рельефе (SRTM) и потом строить из них контуры горизонтали и рисовать отмывку.

В воскресенье, когда гулять не было возможности, а делать что-то полезное не было желания, вспомнил я прошлые свои упражнения и решил сделать хоть что-то полезное — например, позиционную карту для википедии. Позиционными картами там называют такие карты, на которые потом легко можно нанести метки, указав координаты в виде широты и долготы. Подобные карты, как выяснилось, создать достаточно просто: надо лишь взять изображение, и указать для него необходимые данные, чтоб понятен был способ пересчёта координат. Поддерживаются несколько типов проекций карт, по умолчанию используется равноугольная цилиндрическая проекция — как раз такая, как в OpenStreetMap, для карт в этой проекции достаточно указать лишь широту верхнего и нижнего краёв и долготу левого и правого.

У меня не получилось сразу в Маперитиве получить карту такого вида как мне надо: реки текли поверх водохранилищ и водоёмы никак не хотели с административными границами сочетаться. Потратив немного времени на чтение документации и безуспешные эксперименты, пошёл другим путём: сделать пару отдельных карт — с границами и водами — да и собрал их воедино в Inkscape. Маперитив умеет экспортировать карты в SVG. Вот уменьшенный фрагмент того, что вышло:

Север Нязепетровского района

Шаблон с картой лучше делать не по инструкции — там образец неправильный. Лучше взять за образец какой-нибудь существующий шаблон и слегка его поменять: надо изменить координаты границ карты, её названия и имена используемых файлов. Если речь идёт об изготовлении карты актуального состояния существующей местности (то есть, мы рисуем не историческую карту и не карту вымышленного мира), то имеет смысл нарисовать несколько карт одной и той же области, хотя бы две: физическую и политическую/административную — википедия позволяет выбрать нужную карту из шаблона как вручную, так и автоматически: например, в географических статьях (о реках, озёрах, горах) автоматически отображается физическая карта, если она есть.

Пример статьи с этой картой — Шемаха (приток Уфы). В статье Шемаха (Челябинская область) используется тот же самый шаблон, но карта там уже другая — административная.

Указание языка в URL страниц в Open Journal Systems

Open Journal Systems — система управления электронными научными журналами — имеет одинаковые адреса страниц, написанных на разных языках. Посетитель, зашедший на сайт научного журнала, работающего на OJS, либо увидит страницу на языке по умолчанию либо, если раньше уже заходил и менял язык, на том, что выбрал. Кому-то такой подход нравится, кому-то — нет. На самом деле — вполне нормальная ситуация.

Тем не менее, возникла задача всё-таки получить возможность явно указать язык в адресе страниц. Переключение выбранного языка делается средствами самой OJS — достаточно зайти (то есть, выполнить GET-запрос) по адресу вида адрес-журнала/user/setLocale/локаль?source=путь/куда/идти/дальше, например, http://vestnik.susu.ru/cmi/user/setLocale/ru_RU?source=/cmi/issue/current — переход по этой ссылке приведёт к выведенному на русском языке оглавлению текущего выпуска серии «Вычислительная математика и информатика» Вестника Южно-Уральского государственного университета.

С одной стороны, всё украдено до нас ничего делать не надо — URL с указанием языка уже доступен. Но какой-то он длинный, неаккуратный. Хочется сделать покороче. Чтоб не лезть во внутренности OJS, можно исправить настройки сервера. Для случая, когда используется Apache, а адрес журнала имеет вид http://hostname/journal, достаточно добавить пару правил для mod_rewrite:

RewriteRule ^en(glish)?/(\w+)(/?.*)$ /$2/user/setLocale/en_US?source=/$2$3 [L]
RewriteRule ^ru(ssian)?/(\w+)(/?.*)$ /$2/user/setLocale/ru_RU?source=/$2$3 [L]

Это даст возможность использовать URL вида http://hostname/язык/journal/путь, где язык может быть как названием нужного языка, так и его двухбуквенным кодом. Для уже рассмотренной серии «Вестника ЮУрГУ» теперь можно применять такие ссылки:

Трамвайная схема — можно и в TileMill

В марте я рисовал для википедии челябинскую трамвайную схему при помощи TileMill, однако как выделить трамвайные пути самим тайлмиллом, я не знал. Пришлось тогда экспортировать схему в SVG и затем редактировать полученный SVG-файл в Inkscape, вручную выделяя нужные рельсы и меняя им внешний вид.

На самом деле в том, чтоб TileMill нарисовал трамвайные пути, нет особо хитрой магии. Более того, даже не надо, пугаясь питона, ковырять imposm-mapping.py — трамвайные пути можно выделить при помощи CartoCSS, потому что для железных дорог сохраняется их тип:

SELECT DISTINCT type FROM osm_railways;
type
--------------
preserved
narrow_gauge
light_rail
subway
tram
rail

Стиль трамвайных путей можно задать в файле roads.mss. В OSM Bright все доро́ги: и железные, и обычные — слиты в один слой. Правила рисования дорог весьма витиеваты, поэтому, чтоб не тратить на эксперименты лишние усилия, мы не будем пытаться переопределить стиль трамвайных путей — вместо этого добавим новое правило, рисующее широкие красные линии поверх трамвайных путей, не трогая более ничего. Правило это надо поместить после правил, описывающих слой #roads_high:

#roads_high::tram_highlight [type='tram'] {
  line-width: 5;
  line-color: @tram_line;
  line-comp-op: darken;
}

Результат:

Схема трамвайных путей

Для того, чтоб убедиться в работоспособности метода, этого вполне достаточно.

Бросается в глаза отсутствие подсветки на мостах — связано это с тем, что слой #bridge находится выше, чем #roads_high. Возможный способ решения — завести свой слой железных дорог (а для этого надо уже́ лезть в imposm-mapping.py, но теперь это не страшно), поместить его выше слоя с мостами и написать для железнодорожного слоя свои стилевые правила.