Конфлюенция 60N 30E

  Туризм

Начну с того, что впервые узнал о DCP только в 2016 году и идея сразу показалась прекрасной. И вот только сейчас, в 2018-м, наконец-то посетил первую для меня точку. Как для жителя Петербурга, выбор точки был очевиден. Конфлюенция N60° E30° – это ближайшая к городу, легкодоступная (особенно зимой), с красивыми координатами (её еще называют точкой гиперконфлюенции или питерским Гринвичем). Даже немного удивлён, что зарегистрировано всего 8 посещений за последние 16 лет.

Теперь ближе к делу, в путь мы отправились на лыжах с детьми 6 лет, конечно же не планируя ограничиться только посещением точки, но логичным образом продолжить маршрут через остров Верперлуда и далее прокатиться по льду залива до Ольгино. Дорога на электричке заняла всего полчаса и уже в 10:13 мы прибыли на ст. Лисий Нос. В 11:24 вышли на пустой пляж, пройдя по посёлку 1,8 км и зайдя по пути в магазин. На пляже переобулись, расчехлили лыжи и в 11:39 вышли на лёд, а в 11:54 достигли заветной точки. Расстояние от берега до точки по прямой 325 м, у нас же по факту (петляя по кривой) вышло 460 м. Для сравнения и большей точности сфотографировал показания сразу двух навигаторов, сделал обзорные фото и в 12:00 взяли курс на остров Верперлуда.

От точки до острова 1 км, мы прошли его за 28 мин. На острове, условно укрывшись в кустах от ветра, устроили привал с чаем и шоколадкой по такому случаю взятия первой точки:) Остров является частью заказника «Северное побережье Невской губы», о чём там есть стенд с информацией. В 13:14 выходим с острова и идём прямо по курсу на Лахта-Тауэр. Погода прекрасная (около –10°C), на заливе красивые виды, народ катается на кайтах, голого льда почти нет, всё покрыто 8–10 см слоем снега. В 16:24 вышли на берег у радиоцентра в Ольгино, пройдя 6,5 км по прямой от острова, посмотрели вблизи на антенну-мачту (187 м высотой), и направились к ст. Ольгино на электричку в 17:48. Всего за день прошли около 12 км.

Ссылки

  View Comments    DCP

AUR+GitHub

  Линукс

Как известно в AUR у многих пакетов есть клон с суффиксом -git (-hg и др.) в имени. То есть такой пакет собирается на основе самой свежей версии исходников в репозитории. В общем случае это потенциально нестабильная сборка, тем не менее во многих случаях очень удобно. У меня например установлено меньше десятка таких пакетов, в основном это что-то активно используемое, где я в курсе последних изменений и зачем они мне нужны. Но есть такая проблема, что клонирование всего репозитория может занимать очень много времени (напр. для QGIS до 20 минут). Учитывая, что такие пакеты обновляются часто, то возникает желание как-то ускорить процесс.

Далее речь пойдёт только о GitHub репозиториях, возьмем для примера OpenOrienteering Mapper. Первое, что приходит в голову – а зачем клонировать весь репозиторий, если можно просто скачать master.tar.gz архив по прямой ссылке? С этим нет проблемы, но как тогда определить pkgver? Напомню как она обычно вычисляется:

  • определяем последний релиз по тегу
> RELEASE=$(git describe --tags $(git rev-list --tags --max-count=1))
> echo $RELEASE
v0.6.7
  • sha-хеш последнего коммита
> HEAD=$(git rev-parse --short HEAD)
> echo $HEAD
d77941c9
  • и количество коммитов на master бранче
> COUNT=$(git rev-list --count HEAD)
> echo $COUNT
3204

Итого получаем:

> printf "%s.r%s.%s" "${RELEASE#?}" "${COUNT}" "${HEAD}"
0.6.7.r3204.d77941c9

Cпособ получить то же самое без клонирования оказывается есть — это воспользоваться GitHub API v3. Распарсить JSON ответ можно многими способами, например с помощью jq:

> API_ROOT="https://api.github.com/repos/OpenOrienteering/mapper"
> RELEASE=$(curl -s "$API_ROOT/releases/latest" | \
  jq '.tag_name' | sed 's/"//g'
> HEAD=$(curl -s "$API_ROOT/git/refs/heads/master" | \
  jq '.object.sha' | sed 's/"//g' | cut -c1-8

Или используя python, чтобы не вводит новые зависимости:

> RELEASE=$(curl -s "$API_ROOT/releases/latest" | \
  python -c "import sys, json; print(json.load(sys.stdin)['tag_name'])")
> HEAD=$(curl -s "$API_ROOT/git/refs/heads/master" | \
  python -c "import sys, json; print(json.load(sys.stdin)['object']['sha'][:8])")

К сожалению нет "прямого" способа получить количество коммитов через API. Так что используем не столь очевидный. Тут предполагается, что мы знаем хеш первого коммита (8a8986ec) и он не изменится:

> git rev-list --format="%h %ci %s" --max-parents=0 HEAD
commit c0076c87a1d7dd1181be708cc61cae6c221c5c7b
c0076c87 2015-11-28 21:02:29 +0100 Squashed 'doc/manual/pages/' content from commit 66225bf
commit 8a8986ec690a48e8edc4d3794dbb9d93cc67437b
8a8986ec 2011-10-04 15:56:33 +0000 Initial import
> COUNT=$(curl -s "$API_ROOT/compare/8a8986ec...${HEAD}" | \
  python -c "import sys, json; print(json.load(sys.stdin)['total_commits'] + 1)")

В ответе на StackOverflow можно найти еще один способ получить количество коммитов на master бранче — просуммировать вклад всех контрибьюторов:

> COUNT=$(curl -s "$API_ROOT/contributors?per_page=50" | \
  python -c "import sys, json; from functools import reduce; print(reduce(lambda x, y: {'contributions': x['contributions'] + y['contributions']}, json.load(sys.stdin))['contributions'])")

Но это дает результат 2540 коммитов вместо 3204, немного поэкспериментировал с этим, но так и не понял, что же возвращается в поле contributions.

Ещё такой момент, /releases/latest не возвращает пререлизы. Поэтому как вариант можно заменить

> RELEASE=$(curl -s "$API_ROOT/releases/latest" | \
  python -c "import sys, json; print(json.load(sys.stdin)['tag_name'])")

на

> RELEASE=$(curl -s "$API_ROOT/releases" | \
  python -c "import sys, json; print(json.load(sys.stdin)[0]['tag_name'])")

Теперь можно также добавить суффикс pre к пререлизам:

> RELEASE=$(curl -s "$API_ROOT/releases" | \
  python -c "import sys, json; r = json.load(sys.stdin)[0]; print(r['tag_name'] + 'pre' if r['prerelease'] else '')")

Или, тоже самое с помощью jq:

> RELEASE=$(curl -s "$API_ROOT/releases" | \
  jq '.[0]|.tag_name + if .prerelease then "pre" else "" end' | sed 's/"//g')

Ссылки

  View Comments    AUR GitHub ArchLinux

Категории

Все теги