Чем почесать провода

В Челябинске после недавних погодных катаклизмов вот уже несколько дней не работает электротранспорт — обледенела контактная сеть. Сегодня видел необычный способ очистки, без всяких щёток: едут гуськом три троллейбуса с автономным ходом и поднятыми токоприёмниками, в том месте, где льда мало, между проводом и токоприёмником вспыхивает электрическая дуга, которая, наверное, и отогревает провод. Интересно, они дугой контактную сеть не пожгли совсем? Автономный ход, видимо, нужен на случай особо толстого льда, чтоб хоть как-то тронуться. Кстати, троллейбусы на батарейках как-то неважно в гору стартуют.

Октябрьский лёд

Снег, пошедший в октябре, первым уже никак не назвать — были снегопады и в апреле, и в июле. Снег сменился дождём — теперь всё вокруг покрыто льдом. Лёд гнёт и ломает не успевшие избавиться от листвы деревья.

К зиме подготовились

Несколько дней назад уже́ было известно о нынешнем снегопаде — синоптики не соврали. Сейчас народ, поди, опять начнёт бухтеть, что снег, дескать, выпал ну столь неожиданно, что городские службы оказались к нему неподготовленными.

Ну почему же? Готовились, сам вчера видел — электрогирлянды на липы наматывали:

Развешивают гирлянды

Регулировка света фар на Peugeot Partner

Когда в инструкции к нынешнему своему автомобилю я не нашёл описания процедуры регулировки ближнего света фар, особо не удивился: ну зачем писать такое в инструкции к импортному автомобилю. Удивился я, когда не обнаружил такой информации в камасутре руководстве по эксплуатации, техническому обслуживанию и ремонту — в конце концов, это не такая уж сложная операция: уж точно проще, чем разборка двигателя, в той же книге описанная. Но нет — в книгу авторы зачем-то включили отдельный пункт 12.8 «Регулировка фар — общие сведения», где сразу же послали нафиг:

Точная регулировка световых пучков фар возможно только с помощью специального оборудования, предназначенного для этой цели. Поэтому подобная работа должна выполняться дилером Peugeot/Citroën или на станции технического обслуживания, имеющей соответствующее оборудование.

Не думаю, что настройка света фар, допустим, жигуля, принципиально отличается от настройки света пыжика — в книжках про отечественные машины не делают какого-то особого секрета из настройки фар. Да и на пунктах техосмотра я не раз видел плакаты, описывающие, как должны светить фары. Поэтому вопрос остался лишь один — что покрутить для изменения высоты угла места. В крупных фарах, используемых в Peugeot Partner Origin / Citroën Berlingo First (то есть, в машинах, выпущенных с 2002 по 2009 год) регулятор представляет собой белый полиэтиленовый винт с шестигранным отверстием, находящийся с той стороны фары, что ближе к продольной оси автомобиля. Например, на правой фаре он находится слева:

Общий вид

Для регулировки достаточно повернуть этот винт: вращение по часовой стрелке (во всяком случае, на правой фаре) поднимет световой пучок, вращение против часовой — опустит. Винт проворачивается достаточно туго: голыми руками у меня не вышло его провернуть: можно воспользоваться Г-образным шестигранным ключом либо, как я сделал, складной отвёрткой с храповым механизмом. Размер ключа (расстояние между противоположными гранями) — 6 миллиметров либо ⁷∕₃₂ дюйма.

Регулировка

Теперь моя машина светит правильно.

Двадцать шестой троллейбус вернётся на Первое озеро

С понедельника, 13 октября, сообщает Челябинск.ру меняется трасса движения троллейбусного маршрута № 26 — он снова будет ходить из Первоозёрного через центр города, улицы Братьев Кашириных и Чичерина к северо-западной конечной, на углу Комсомольского проспекта и Молдавской.

[map]55.19372,61.30144 55.187,61.2862 55.1735,61.30474 55.17879,61.31654 55.17875,61.3583 55.1709,61.35813 55.17093,61.37053 55.16757,61.38062 55.15975,61.38117 55.16124,61.43374 55.16017,61.4513 55.17022,61.4531 55.18117,61.44602 55.18387,61.45868 55.19298,61.4664 55.19056,61.47552[/map]

На марсрутах.ру уже опубликовано свежее расписание.

Указание языка в 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, но теперь это не страшно), поместить его выше слоя с мостами и написать для железнодорожного слоя свои стилевые правила.

Раскрасим домики

Итак, после предыдущих упражнений здания на нашей карте обзавелись номерами и высотой. Что дальше? Дальше можно, например, раскрасить здания в разные цвета. Можно раскрасить дома в зависимости от основного их предназначения (то есть, в зависимости от содержимого тэгов amenity и building). Можно — в зависимости от принадлежности здания.

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

Достичь подобного результат с картами OpenStreetMap, рисуемыми через библиотеку Leaflet, можно разными путями: можно, взяв какую-либо карту, не трогать её растровый слой, оставить его без изменений, добавив свой векторный слой, куда нанести контуры зданий. Пример — usjeans.ru/map. Другой подход — сделать собственный растровый слой, на котором сразу и отметить необходимое. Так как предыдущие эксперименты касались как раз собственного растрового слоя — продолжим опыты в том же направлении.

Отметить принадлежность зданий в OpenStreetMap можно разными путями: первый, очевидный — задать у каждого нужного нам здания какой-нибудь новый тэг. Тэг может быть практически любым — даже при существующих ограничениях на имена можно придумать что-нибудь. То множество тэгов, что применяется в OSM — результат не жёсткого диктата разработчиков, а договорённости сообщества участников и множество это легко расширяемо. Другой путь, который мне представляется более верным — создать отношение. Для группировки объектов, представляющих собой что-то общее, предназначено отношение с типом site. Как выяснилось, нужное мне отношение уже́ существовало — надо было лишь проверить его корректность и внести необходимые изменения (например, добавить здания, в отношение не попавшие).

На следующем этапе, импорте данных, выяснилось, что в imposm не предусмотрен способ сохранить в базе данных информацию о принадлежности к отношению. Во всяком случае, в документации он не описан. Не беда — эту информацию можно внести и после импорта, напрямую обратившись к базе данных. Для хранения информации о принадлежности нужно создать дополнительное поле. Так как нам нужен только признак принадлежности здания конкретному отношению, достаточно будет типа Bool. После всех изменений описание сопоставления данных для зданий в файле imposm-mapping.py стало выглядеть так:

buildings = Polygons(
    name = 'buildings',
    fields = (
        ('area', PseudoArea()),
        ('addr:housenumber',String()),
        ('building:levels',Integer()),
        ('height',Integer()),
        ('belongs_to_susu',Bool()),
    ),
    mapping = {
        'building': (
            '__any__',
        ),
        'railway': (
            'station',
        ),
        'aeroway': (
            'terminal',
        ),
    }
)

Выставить флаг принадлежности можно выполнением SQL-запроса

UPDATE osm_buildings
SET belongs_to_susu=1
WHERE osm_id IN (список_id, через запятую);

Чтоб не перечислять объекты вручную, был написан перловый скрипт. Попутно выяснилось, что, несмотря на то, что отношение может в себе содержать другие отношения, нет смысла устраивать рекурсивный обход: в поле osm_buildings.osm_id хранится первый попавшийся номер: он может быть как номером линии (для большинства зданий), так и номером отношения.

Задача определения роли здания после всех предыдущих манипуляций кажется не такой уж и сложной: во-первых, тип здания (точнее, его предназначение) может хранится в тэге building — его содержимое при импорте попадает в поле osm_buildings.type. Среди допустимых типов есть и dormitory — общежития (кстати, не надо путать с tourism:hostel — это совсем разные тэги). Тип «учебные корпуса» (например, academic_building) среди часто применяемых не встречается — есть лишь university, который не совсем подходит: университет — это не только учебные корпуса. Можно, конечно, прямо у самих зданий указывать building=academic, но мне более правильным показался вариант указания роли здания внутри отношения — там и поле для роли есть, и оно не используется совсем. Больше шансов, что данные спокойно сохранятся именно тогда, когда они лежат внутри отношения. А вот в базу данных роль вносится в поле osm_buildings.type:

UPDATE osm_buildings
SET type='academic'
WHERE osm_id IN (список_id, через, запятую);

Как и прежде, для упрощения назначения ролей, написан ещё один перловый скрипт.

Стилевые правила для зданий (в OSM Bright он лежат в файле base.mss) начинаются так:

#buildings[zoom>=12] {
  polygon-fill:@building;
  // Our buildings
  [belongs_to_susu=1] {
    polygon-fill: @susu_building;
    [type='dormitory'] {
     polygon-fill: @susu_dormitory;
    }
    [type='academic'] {
     polygon-fill: @susu_academic;
    }
  }

Определение цветов @susu_building, @susu_dormitory, @susu_academic добавлено в файл palette.mss — там для них самое подходящее место.

@susu_building:     saturate(darken(@building, 15%), 10);
@susu_dormitory:    mix(@susu_building, #f60, 95%);
@susu_academic:     mix(@susu_building, #06f, 93%);

Результат:
Карта с разноцветными домами

Из вордпресса в гугл-плюс — всем

WordPress умеет автоматически делать кросспосты посылать копии новых заметок в популярные социальные сети. С недавних пор к таким сетям добавился и Google+ (раньше для отправки заметок в гуглоплюс нужна была платная версия плагина Social Network Auto Poster). По умолчанию создаваемые в гуглоплюсе записи доступны не всем, а только френдам, точнее тем пользователям, кто включен в ваши круги. Я неоднократно пытался найти в вордпрессе способ изменить круг читателей — всё никак не мог. Оказалось, всё описано в документации — настройки публикации скрываются не в вордпрессе, в самом Google+, на странице Settings → Apps & activities.