Все записи автора Shoorick

Под крылом самолёта о чём-то поёт зелёное море тайги

Из аэропорта Челябинск самолёты обычно взлетают на запад и высоту набирают над Каштакским бором. Помимо леса сидящие слева пассажиры успевают увидеть, как дымит ЧМК, а рядом с ним ещё и садоводы что-то выращивают. После леса — село Долгодеревенское, а чуть дальше — Новое Поле, за которым — Казанцево. Ну а потом — как повезёт: можно и до Волги долететь при ясном небе, увидев знакомые озёра и горы, а можно и сразу в облака нырнуть.

Хочется улететь из местного «Игоря» в далёкий Oro Uostas, но туда не то, что прямых рейсов нет — вообще из России ничего не летает: скайсканер с авиасэйлзом предлагают какие-то безумные маршруты за бешеные деньги длиной в сутки с пересадками в Хельсинки, Стамбуле и Лондоне. Ну ладно, иногда предлагают лететь через Ригу (а там карантин и комендантский час), но тоже долго и дорого.

Цветной вывод в отладочную консоль браузера

Метод console.log достаточно популярен у пишущих на JavaScript — он позволяет выводить отладочную информацию, справляясь как со скалярными данными, так и с объектами.

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

console.log('%d', 77/64)

выведет целое число 1, а

console.log('%f', 77/64)

выдаст 1.203125, что получилось бы и без '%f'. При этом бо́льшая часть знакомых по Си или Перлу форматов вообще не работает — встретив такое, console.log посчитает первый аргумент обычной строкой, которую надо вывести — так

console.log('%x', 48879)

выведет %x 48879 вместо ожидаемого слова beef.

Но зато у console.log нашёлся формат %c, позволяющий применить к выводимому тексту стили, заданные вторым параметром — так можно раскрашивать вывод

Пример использования — codepen.io/jscottsmith/pen/VLzMLo

44, 33, 22… Полетели!

44 года живу, из них 33 года ходил по институту, а позже университету, учась чему-нибудь и как-нибудь, а последние 22 — ещё и работал full time в нём же. Но надо всё-таки что-то менять — вчера ещё я был в отпуске, а с сегодняшнего для покинул alma mater.

Пока ещё гуляю по Вильнюсу, но и новую работу потихоньку ищу. Как и в прошлый раз — в области IT. Место — Вильнюс, Москва или Челябинск, но лучше удалённо. Резюме — shoorick.ru/cv

oo⚑o⚑⚑oo

0. КДПВ — некоторое количество флажков. Рисовать все сорок четыре (101100₂) как-то лень.

1. Пятнадцатое марта пришлось на понедельник — отметим в ближайшую субботу двадцатого на традиционном месте в карьере.

Карта

Мясо, чай и гитара будут. Дрова есть. Сегодня на солце было вполне по-весеннему, хотя сне́га ещё полно и на бубликах с гор ездить можно. Прогноз — слегка отрицательная температура с переменной облачностью и снегом — за неделю не растает.

P.S. Вишлиста традиционно не существует. Но можно исходить из того, что я по-прежнему могуч и гитарист. Ну и турист, велосипедист, автомобилист, бас-гитарист, вокалист, программист и даже сисадмин.

Синхронизация часов в десятом Дебиане

В свежем Debian GNU/Linux (вроде, и в Ubuntu 16.04 LTS четырёхлетней давности аналогично) для синхронизации часов используют не ntp, а timesyncd. Только оно по умолчанию не работает — ни на рабочем компьютере, ни на домашнем ноутбуке.

Начал разбираться — выяснил:

  1. Настройки хранятся в /etc/systemd/timesyncd.conf: там есть адрес основного сервера для синхронизации и список запасных — и оба этих списка закомментированы. Понятно, что надо раскомментировать плюс можно в качестве основного адреса указать тайм-сервер своего провайдера.
  2. VirtualBox препятствует синхронизации — его можно запустить (sudo VBoxService --timesync-set-start — мне не помогло) или совсем проигнорировать, если используется редко, как я и сделал.

После этого останется лишь перезапустить демонов и время наконец-то станет точным.

Re: Как сдвинуть одинокую вершину

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

digraph G {
    graph [ rankdir=LR ]
    node [ shape=box, fontname="PT Mono", fontsize=32 ]

    subgraph cluster_values {
        color=blue
        style="rounded,dashed"

        "'value'" [ fontcolor=grey, color=grey ]
        42
    }

    name [ shape=cds, style=filled, fillcolor=wheat ]
    name -> 42
}

Попутно обнаружился ряд интересных моментов:

  1. Имя субграфа должно начинаться со слова cluster для того, чтобы можно было его раскрасить и подписать. Если не будет, то параметры style, color, fillcolor, label и аналогичные будут проигнорированы.
  2. Если субграф используется только для группировки вершин, а отображать его совсем не надо, можно дать ему любое имя, но в таком случае надо добавить параметр rank=same для того, чтобы вершины выстроились рядом.

Концы строк в LibreOffice

Writer — текстовая часть пакета LibreOffice — аналог Microsoft Word — имеет странную особенность: если поставить в диалоге замены галочку «Регулярные выражения», то выражение \n будет иметь разное значение в зависимости от того, где его написать: в строке поиска оно соответствует переводу строки ↲, вставляемому сочетанием клавиш Shift+Enter, но в строке замены это же самое будет уже концом абзаца ¶, который вставляется одиночным нажатием клавиши Enter.

Как же заменить концы абзацев на переводы строк?

На форуме по LibreOffice нашёлся рецепт:

  • Вводим где-нибудь перевод строки (Shift+Enter), копируем его в буфер обмена
  • Вызываем диалог поиска и замены клавишами Ctrl+H либо через меню: Edit → Find & Replace
  • В поле Search for пишем $
  • Раскрываем при необходимости группу параметров Other options и отмечаем там Regular expressions
  • Нажимаем кнопку Find All — выделятся концы абзацев, закрываем диалоговое окно
  • Вставляем из буфера переводы строк
диалог поиска и замены

Я проверил в LibreOffice 6.1.5.2 — работает.

Добавление существующего git-хранилища на GitHub

Иногда код, хранимый локально, дорастает до состояния, что его уже можно выложить на GitHub. Конечно же, с сохранением уже накопленной истории изменений. Если установлен gh — клиент для Гитхаба с интерфейсом командной строки, то решить такую задачу будет просто: достаточно зайти в каталог с существующим кодом, создать командой gh repo create новое GitHub-хранилище — оно автоматически будет указано в качестве удалённой ветки (remote branch) — после этого останется отправить всё наружу командой git push origin master (да, git всё-таки ещё главную ветвь называет мастером, а не main). То есть, достаточно всего двух команд.

path/to/code$ gh repo create slide-python --public -d 'Slides for Python classes'
? This will create 'slide-python' in your current directory. Continue? Yes
✓ Created repository shoorick/slide-python on GitHub
✓ Added remote git@github.com:shoorick/slide-python.git
path/to/code$ git remote -v
origin git@github.com:shoorick/slide-python.git (fetch)
origin git@github.com:shoorick/slide-python.git (push)
path/to/code$ git push origin master
Enumerating objects: 370, done.
Counting objects: 100% (370/370), done.
Delta compression using up to 4 threads
Compressing objects: 100% (368/368), done.
Writing objects: 100% (370/370), 832.24 KiB | 13.87 MiB/s, done.
Total 370 (delta 249), reused 0 (delta 0)
remote: Resolving deltas: 100% (249/249), done.
To github.com:shoorick/slide-python.git
[new branch] master -> master

Как сдвинуть одинокую вершину

Рисую ориентированный граф с помощью GraphViz, понадобилось нарисовать одинокую вершину, ни с чем не связанную.

digraph G {
    graph [ rankdir=LR ]
    node [ shape=box, fontname="PT Mono", fontsize=32 ]

    name [ shape=cds, style=filled, fillcolor=wheat ]
    name -> 42

    "'value'" [ fontcolor=grey, color=grey ]
}
Вершина value находится слева

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

none -> "'value'"

Сделаем невидимым ненужное ребро:

none -> "'value'" [ style=invis ]
Невидимое ребро

и ненужную вершину — тоже. После этого получится именно то, что надо:

none [ style=invis ]
Вершина value сдвинута вправо