Архив рубрики: software

А воз и ныне там

В Open Journal Systems данные людей — пользователей и авторов — могут быть только на одном языке. В багтрекере уже шесть лет висит bug 5598 — allow for author names in multiple languages. В последнем комментарии разработчик честно сообщает:

This hasn’t yet been prioritized for a specific release, but I’d say it’s very unlikely to be implemented for OJS 2.x; it’ll become a higher priority after OJS 3.0 is released.

Итак, OJS 3.0.0 вышла — и действительно, ничего не поменялось: раз эта задача не была приоритетной, то и многоязычности нет.

SQL-запрос

Значит, придётся и дальше поддерживать свой хак, пытаясь всё-таки сделать из него нормальный плагин.

Нормальные герои всегда идут в обход

После всей суеты с обновлением операционной системы на окружающих меня компьютерах наконец-то везде, где надо, установил свежий нотный редактор MuseScore. Как и было обещано разработчиками MuseScore, экспорт в LilyPond оттуда убран, но зато экспорт в MusicXML исправлен: если этот XML-файл при помощи musicxml2ly преобразовать в формат Лилипонда, то на получившийся файл Лилипонд не ругается, как это было в 2013 году. Тексты в XML- и ly-файлах — в правильной кодировке и не теряются (так было в 2009). Единственный сразу заметный недостаток — гадкая кириллица, но это легко чинится заменой гарнитуры на какую-нибудь другую: Обыкновенную новую либо Журнальную.

Ноты

Справился с ошибкой svn E155010

Решил как-то добавить древние файлы в систему контроля версий, да не смог:

$ svn st | grep -e '^\?' | cut -c9-999 | xargs svn add
A         noframe.html.en
svn: E000013: Can't create temporary file from template '/usr/local/www/path/to/svn-XXXXXX': Permission denied

Оказалось, не имел права писать во временный каталог Subversion .svn/tmp где-то выше. Изменил права, повторяю попытку добавления — фиг:

$ svn st | grep -e '^\?' | cut -c9-999 | xargs svn add
svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted

Команда svn cleanup тоже не помогла

$ svn cleanup
svn: E155010: The node '/usr/local/www/path/to/af_0011.html.ru' was not found.

Гугление с чтением форумов не особо помогло — пришлось ковырять базу данных, где Subversion хранит состояние рабочей копии — это файл .svn/wc.db, для работы с которым нужен SQLite. Будете ковырять — не забудьте сделать резервную копию!

$ sqlite3 wc.db

sqlite> SELECT * FROM LOCK;
sqlite> SELECT * FROM WC_LOCK;
1|path/to|-1
sqlite> DELETE FROM WC_LOCK;
sqlite> SELECT * FROM WORK_QUEUE;
26|(sync-file-flags path/to/af_0011.html.ru)
sqlite> DELETE FROM WORK_QUEUE;

В моём случае сработало.

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

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

ls ~/bin/komodo/lib/mozilla

Красим школы и стоянки

В прошлых сериях экспериментов с ТайлМиллом доводилось раскрашивать находящиеся в университетском городке здания и добавлять номера домов. Теперь попробуем раскрасить какую-нибудь территорию, да и здания можно перекрасить как-нибудь иначе. Заодно и повод подвернулся: авторы сайта mapstr.ru решили поменять самодельную карту Стерлитамака на OpenStreetMap — там город неплохо отрисован (хотя, конечно, есть ещё, что улучшать), им в целом нравится стиль, которым отрисована карта окрестностей нашего университета, но им хочется, чтоб было как в ДубльГИСе — чтоб стоянки, дворы и частный сектор были залиты разными цветами. Ну и школы с детсадами хочется выделить цветом.

Делаем так:

1. Перед импортом данных OSM в PostGIS в файле imposm-mapping.py указываем, что нам нужно предназначение здания, а относится ли оно к университету, нас не интересует:

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

там же указываем, что у территорий нас интересует тэг residential — его значение rural можно использовать для обозначения деревенских жилых территорий.

landusages = Polygons(
    name = 'landusages',
    fields = (
        ('area', PseudoArea()),
        ('residential', String()),
        ('z_order', ZOrder([
            'pedestrian',
             ...

2. Импортируем данные.

3. Запускаем TileMill, выбираем нужный проект, идём в свойства слоёв, путём редактирования фрагмента SQL-запроса добавляем поля:

  • amenity — к слою #buildings
  • residential — к слоям #landuse, #landuse_gen0, #landuse_gen1

4. Исправляем стилевые правила:

В базовом файле base.mss указываем необходимость особенной заливки частного сектора

#landuse[zoom>12] {
  [type='allotments']    { polygon-fill: @agriculture; }
  // ...
  [type='residential']   {
    polygon-fill: @residential;

    [residential='rural']   {
      polygon-fill: @rural;
    }
  }
}

а также зданий образовательных учреждений: детских садов, школ, ПТУ/техникумов/колледжей и институтов/академий/университетов:

// At the highest zoom levels, render buildings in fancy pseudo-3D.
// Ordering polygons by their Y-position is necessary for this effect
// so we use a separate layer that does this for us.
    [type != 'hedge'] {
     building-fill: @building;
     building-height: 2 + [building:levels] * 2;
     [height>0] {
       building-height: 2 + [height] / 1.5;
     }

      // Our buildings
      [amenity = 'kindergarten'] {
        building-fill: @kindergarten_building;
        line-color:darken(@kindergarten_building,10%);
      }

      [amenity = 'school'] {
        building-fill: @school_building;
        line-color:darken(@school_building,10%);
      }

      [amenity = 'college'] {
        building-fill: @college_building;
        line-color:darken(@college_building,10%);
      }
      [amenity = 'university'] {
        building-fill: @university_building;
        line-color:darken(@university_building,10%);
      }
    }

    [type = 'hedge'] {
      building-fill:@wooded;
      building-height:1.25;
    }
  }
}

добавляем цвета в палитру palette.mss

@residential:       #e9e1cd;
@rural:             #ece2b5;
@commercial:        #e7e0f4;
@industrial:        #eeeeee;
@parking:           #e5eaf0;

/* Buildings */
@building:          #bbaa99;
@educational_mix:   #0099ff;

@kindergarten_building: mix(@building, @educational_mix, 90%);
@school_building:       mix(@building, @educational_mix, 85%);
@college_building:      mix(@building, @educational_mix, 80%);
@university_building:   mix(@building, @educational_mix, 75%);

Результат — на http://mapstr.ru/map/

Фрагмент карты Стерлитамака

Рельеф и дороги

Недавняя запись в ЖЖ-сообществе «Челябинский Челябинск» напомнила, что хотел я как-то собрать рельеф с дорогами на одной карте. Хотел — сделал.

Рельеф и дороги Челябинска

Сделано при помощи Maperitive — он кроссплатформенный (хоть и выглядит по-виндовому), написан на питоне, падает часто. Делаем так:

1. Масштабируем карту, чтоб захватить нужную область.

2. Генерируем фон, с цветом, зависящим от высоты. Если запустить генерацию без дополнительных параметров, то всё зальёт зелёным без заметного контраста, поэтому надо указать свои цвета:

generate-hypsometric ramps=-200:#003399;200:#33cc66;250:#eeee99;350:#993300

Что даст шкалу, где наиболее заметный контраст приходится на высоты от 200 до 350 метров над уровнем моря
Шкала рельефа

3. Для красоты добавляем отмывку: Tools → Generate Hillshading. В меню три подобных пункта — можно выбрать тот, чьи результаты больше нравятся. Если хочется большего контраста, добавлени слоя с отмывкой можно повторить.

4. Скачиваем данные OpenStreetMap для выбранной области: Map → Download Data (Overpass API) Ctrl+Shift+D

5. Создаём стилевой файл с дорогами и границами, но без всего остального, например, такой:

// rendering rules for Maperitive - roads and boundaries
// http://maperitive.net

// Created by Alexander Sapozhnikov, based on style by Igor Brejc
// Released under the Creative Commons Attribution-ShareAlike 3.0 License (http://creativecommons.org/licenses/by-sa/3.0/)

features
	lines
		road major : highway=motorway OR highway=trunk OR highway=primary
		road minor : highway=motorway_link OR highway=trunk_link OR highway=primary_link OR highway=secondary
		boundary country   : relation[type=boundary AND boundary=administrative AND admin_level=2]
		boundary region    : relation[type=boundary AND boundary=administrative AND admin_level=4]
		boundary province  : relation[type=boundary AND boundary=administrative AND admin_level=6]
		boundary municipal : relation[type=boundary AND boundary=administrative AND admin_level=7]

properties
	map-background-color	: #F1EEE8
	map-background-opacity	: 1
	map-sea-color : #B5D0D0
	map.rendering.lflp.min-buffer-space : 5
	map.rendering.lflp.max-allowed-corner-angle : 40

rules

	target : road*
		if : road major
			define
				line-color : #ff9900
				line-width : 2
				border-width : 10%
				border-color : #000000
				border-style : solid
		elseif : road minor
			define
				line-color : #cc6600
				line-width : 1
		draw : line

	target : boundary*
		define
			line-color : #cc3399
			line-style : dash
		if : boundary country
			define
				line-width : 5
		elseif : boundary region
			define
				line-width : 4
		elseif : boundary province
			define
				line-width : 2
		elseif : boundary municipal
			define
				line-width : 1
		draw : line

6. Выбираем этот стиль:

use-ruleset location="/home/as/map/osm/maperitive/rules/road.mrules"

7. Получившуюся карту экспортируем в желаемый формат — см. меню Tools.

И слово было — два байта

Когда-то давно мельком заметил я, что счётчик кадров в фотоаппарате Nikon D70s какой-то странный: номер не всегда возрастает. Порывшись в фотоархиве, нашёл я пачку кадров, где номер сбрасывается, проверил:

#!/bin/sh
for file in `ls 442*jpg`
do
    echo  -n $file
    exiftool $file | grep 'Shutter Count' | cut -c33-44
done

Так и есть!

4420.jpg: 65534
4421.jpg: 65535
4422.jpg: 0
4423.jpg: 1
4424.jpg: 2
4425.jpg: 3
4426.jpg: 4
4427.jpg: 5
4428.jpg: 6
4429.jpg: 7

Выходит, счётчик всего-навсего двухбайтовый. Что же, предполагалось, что камера не может сделать больше, чем 65535 кадров? И ведь ме́ста-то в EXIF для нормального счётчика хватает — поле имеет тип LONG (32-битное беззнаковое целое), но используется лишь наполовину.

Кстати, geeqie показывает некоторые тэги, которые exiftool не отображает и среди них есть Shutter Count 1 (Exif.NikonSi01xx.ShutterCount1), в котором хранятся целые числа со значениями около 869×10⁶ (хотя есть и другие, сильно отличающиеся значения), а также поле Shutter Count 2 (Exif.NikonSi01xx.ShutterCount2), где лежат па́ры небольших целых чисел. Что это за числа — не вышло ни понять, ни нагуглить.

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

Как и ожидалось, 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 для этого плохо подходят (хотя можно и с ними — я так делал) — хочется всё-таки использовать специализированное решение, избежав при этом танцев по граблям.

Атомный редактор

Пробую очередной текстовый редактор — Atom. Поначалу не удавалось его запустить — на сайте выложена версия для архитектуры amd64, а собрать из исходников не получилось (не очень-то и хотелось), однако нашёлся вариант для ленивых — PPA с поддержкой 32-битных версий убунты.

Проверка синтаксиса в редакторе Atom

Хоть, конечно, и требует напильника, но пока нравится: работает шустро, клавиатурные сочетания для основных операций с текстом по умолчанию вполне подходящие плюс можно легко скачиватьи ставить модули для функций, которых по умолчанию нет. Вот, например, модуль linter-perl позволяет проверить синтаксис перловых файлов, а svn подсвечивает изменённые строки и файлы при использовании Subversion — до полноценного клиента, правда, ещё далеко.