default

CLI как язык

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

Название бинарника может быть глаголом в повелительном наклонении (reboot) или существительным в роли обращения (firefox, git). В последнем случае отсутствие аргументов соответствует запуску приложения с пользовательским интерфейсом; если аргументы есть, то первый — это опять глагол в повелительном наклонении (git fetch).

Ключ без аргумента соответствует наречию, обычно в роли обстоятельства образа действия (--quietly, --verbosely; по истерическим перчинам устоялось написание без суффикса -ly).

Ключ с аргументом — это косвенное дополнение, где имя ключа играет роль предлога (install -t /usr/bin fooустановить в /usr/bin foo); или уточняющее родовое слово в составе прямого дополнения (install -d /var/lib/fooустановить каталог /var/lib/foo).

Позиционный аргумент — это прямое дополнение (git clone git://github.com/git/git.git).

Это, конечно, не все паттерны — что-то я наверняка упустил.

Базовый язык для команднострочного интерфейса — разумеется, английский. (Если бы командную строку изобрёл японец, глагол ставился бы последним, а sudo записывалось бы как 下さい [kudasai] после глагола.)

Собственно, я это всё к чему? У системы виртуализации/контейнеризации LXC есть команды lxc-start, lxc-stop и несколько других. И все они принимают название контейнера, над которым работать, именованным аргументом (lxc-start -n foo). Жутко бесит. Очевидно же, что это должно быть прямое дополнение.

This entry was originally posted at http://yurikhan.dreamwidth.org/66551.html.
Tags: , , ,
default

[bpi] Диагностика загрузки сервера

Недавно я поменял домашний сервер. Раньше на антресоли лежал обычный десктоп, жужжал вентиляторами и жрал электричество. А теперь стоит Banana Pi R1.

Что хорошо: электричества потребляет всего ничего. На борту двухъядерный гигагерцовый ARM, гигабайт памяти и встроенный свитч о пяти портах наружу и одном на матплату. И 2.5-дюймовый жёсткий диск.

Что плохо: подсистема питания сделана не очень надёжно, и от этого иногда винчестеру перестаёт хватать питания. Он останавливается, потом пытается снова раскрутиться, потом снова останавливается. И так пока не придёшь и не передёрнешь ему питание.

Ещё может не повезти и при включении он пойдёт проверять файловые системы. По умолчанию проверка запускается в режиме «проверять, но не чинить». Чтобы чинилось автоматически, нужно прописать в /etc/default/rcS строчку FSCKFIX=yes.

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

Read more...Collapse ) This entry was originally posted at http://yurikhan.dreamwidth.org/66195.html.
Tags: ,
default

Омонимическое

Из обсуждения, как людям объяснять Git:

X: Do not mention DAG to people who do not have a formal computer science background. […] The word “graph” has a completely different meaning to laypeople.

Me: You mean the graph plot? Well, in Russian the word for graph-as-in-graph-theory is an homonym of the word for count-as-in-count-Dracula.

This entry was originally posted at http://yurikhan.dreamwidth.org/65925.html.
Tags:
default

Язык для описания графов

Хочу человеческий синтаксис для описания графов.

Что у нас сейчас есть: Graph description languages.

  • Половина из них основана на XML, что хорошо для инструментов, но плохо для написания руками.

  • DOT спроектирован математиками и из-за этого тоже излишне многословен. Мы можем определить в графе дефолтные свойства вершин и рёбер, и это позволяет немного экономить. Но если у нас в графе два типа рёбер, то один можно сделать дефолтным, а второй приходится выписывать каждый раз:

    digraph G {
      edge [arrowhead=empty] # inheritance
    
      Derived -> Base
    
      Aggregate -> Part [arrowtail=odiamond, arrowhead=open] # aggregation
    }

    Или можно определить подграф и рёбра второго типа определять в нём, что плохо для локальности (часто хочется описывать рёбра, относящиеся к одной вершине, рядом):

    digraph G {
      subgraph {
        edge [arrowhead=empty] # inheritance
        Derived -> Base
      }
      subgraph {
        edge [arrowtail=odiamond, arrowhead=open] # aggregation
        Aggregate -> Part
      }
    }

Как надо:

  • Есть классы вершин и рёбер. Все общие свойства вершин или рёбер одного класса описываются в определении класса. Важно, что определения классов можно вынести в библиотеки и подключать их, когда надо.

  • Минимальное определение вершины состоит из имени класса вершины и имени вершины, на отдельной строке, через пробел. Далее опционально индивидуальные свойства вершины. (Тут решить между синтаксисом со скобками и разделителями или просто indentation-based.) Имя может быть одним словом или произвольной строкой в кавычках.

  • Минимальное определение ребра состоит из имени начальной вершины, имени класса ребра и имени конечной вершины, также на отдельной строке через пробел, также с опциональным блоком свойств.

Пример:

node.class [shape=box]
node.interface [shape=circle]
edge.is-a [arrowhead=empty]
edge.implements [arrowhead=empty, style=dashed]
edge.has-a [arrowtail=odiamond, arrowhead=open]
edge.owns-a [arrowtail=diamond, arrowhead=open]

interface IThing

class Base

class Derived
Derived is-a Base
Derived implements IThing

class Part

class Aggregate
Aggregate has-a Part

Буду в отпуске, сяду и напишу парсер этого и конвертор в DOT.

Stretch goal: какой-нибудь способ указать, что одни «node1 relation node2» отображать рёбрами, а другие — вложением в кластер-подграф. Типа nginx deployed-on cache-server.

This entry was originally posted at http://yurikhan.dreamwidth.org/65344.html.
default

Электрический свет продолжает наш день

Берём таблицу времён восхода/заката за последний год. Видим такую фигню: зимой восход в девять, закат в четыре. Летом восход в четыре, закат в девять. Астрономический полдень плавает в районе 12:30. Что как бы указывает на примерное соответствие поясного и астрономического времени, но ни фига не соотносится с реальными надобностями.

Если у меня рабочий день начинается скрам-митингом в 11:00 и кончается в 19:30, то просыпаюсь я в 9–9:30. Значит, летом первые пять часов светового дня я тупо просыпаю. А вечером темнеет раньше, чем хочется спать.

Зимой с утром как-то получше, но вся вторая половина рабочего дня приходится на световую ночь.

Впрочем, в этом году новосибирские чиновники внезапно взялись за ум (или что у них есть… ещё там), провели опрос и с 24 июля зона Asia/Novosibirsk переходит из UTC+6 в UTC+7. Соответственно, световой день летом — с пяти до десяти, зимой — с десяти до пяти, полдень ≈13:30.

Как по мне, направление правильное, но мало. Будь моя воля, я б токийское время установил, UTC+9.

This entry was originally posted at http://yurikhan.dreamwidth.org/64906.html.
default

О граблях SVG-иконок

Четыре года назад я жаловался на тенденцию запихивать векторные иконки в кастомные шрифты и стучал ногами, что надо использовать SVG. В этом году ГитХаб это сделал.

Ну и что же мы теперь имеем: мыло.

Потому что в шрифтах есть хинтинг, привязывающий тонкие линии к пиксельной сетке. А в SVG его ещё нет.

Поэтому вот они нарисовали иконки, выровняли их так, чтоб при дефолтных стилях было чётко, ну и всё. А я предпочитаю шрифт достаточного размера и интерлиньяж посвободнее, и у меня на рабочем месте они съезжают на полпикселя. Причём не все. (На домашней машине у меня HiDPI, поэтому SVG-иконки выглядят просто отлично.)

По-правильному, надо в SVG для тех линий, которые важно привязать к сетке, указывать атрибут shape-rendering="crispEdges". Но в качестве костыля можно накладывать его сверху при помощи юзерстиля. Только для тех иконок, где есть тонкие вертикальные или горизонтальные линии.

@namespace svg url(http://www.w3.org/2000/svg);

@-moz-document domain("github.com") {
  
  .octicon-plus, .octicon-file-directory, .octicon-file-text,
  .octicon-graph, .octicon-book, .octicon-trashcan, .octicon-repo,
  .octicon-comment
  { shape-rendering: crispEdges !important; position: relative; left: 0.1px }

}
This entry was originally posted at http://yurikhan.dreamwidth.org/64693.html.
Tags: , , ,
default

Задачка проектировщику протоколов

Раздаточный материал: Описание протокола WialonRetranslator 1.0 (PDF, 156K, 3 не очень плотных страницы)

Задача 1: Перечислите ошибки, допущенные при документировании этого протокола.

Задача 2*: Перечислите ошибки, допущенные при проектировании этого протокола.

Комменты не скринятся. Ответы выложу через пару-тройку дней.

Upd: kgeorgiy нашёл практически все ошибки документирования.

ОтветыCollapse )

Вот с такой фигнёй иногда приходится работать.

This entry was originally posted at http://yurikhan.dreamwidth.org/64444.html.
Tags: , ,
default

Кроссоверное

На столе лежала какая-то книга; Алиса взяла её и стала листать, поглядывая время от времени на Белого Короля. (Она всё ещё волновалась за него и держала чернила наготове — на случай, если ему снова станет плохо.) Она надеялась, что сумеет прочитать в книге хоть одну страничку, но всё было написано на каком-то непонятном языке.

Вот как это выглядело.8

Пуськи бятые

Сяпала Калуша с Калушатами по напушке. И увазила Бутявку, и волит:

— Калушата! Калушаточки! Бутявка!

Калушата присяпали и Бутявку стрямкали. И подудонились.

А Калуша волит:

— Оёё! Оёё! Бутявка-то некузявая!

Калушата Бутявку вычучили.

Бутявка вздребезнулась, сопритюкнулась и усяпала с напушки.

А Калуша волит калушатам:

— Калушаточки! Не трямкайте бутявок, бутявки дюбые и зюмо-зюмо некузявые. От бутявок дудонятся.

А Бутявка волит за напушкой:

— Калушата подудонились! Зюмо некузявые! Пуськи бятые!

This entry was originally posted at http://yurikhan.dreamwidth.org/64012.html.