yurikhan: (Default)

Какие есть хорошие инструменты для ревью кода?

Критерии хорошести, в нулевом приближении, следующие:

  • Установка on-premise.
  • Одно ревью может включать несколько коммитов из разных (но заранее известных) Git-репозиториев. Коммиты каждого репозитория линейно упорядочены. Для каждого файла в ревью ревьюер может смотреть дифф любого подинтервала по своему выбору. (Как в Crucible, если бы он порядок брал из графа, а не выводил из временных меток.)
  • Коммент, не являющийся ответом на другой коммент, привязывается к произвольному, в общем случае не непрерывному, подмножеству строк файла. (Как в Crucible.)
  • Работает подсветка синтаксиса как минимум для C++, Python’а, Go, шелла, XML, JSON и YAML. Распознавание того, какой синтаксис применять к файлу, работает более умно, чем просто по расширению (в частности, #!/usr/bin/python3 или #!/usr/bin/env python3 для файлов без расширения однозначно указывают на Python).
  • Невозможна ситуация, когда отображается строка файла N (типично документационный комментарий) с комментом к ней и при этом существует и не отображается строка N+1 (типично заголовок или прототип функции с аргументами). (То есть не как в GitLab’е.)
  • Работает скроллинг средней кнопкой в Firefox’е. (А не как в Crucible — {overflow-y: hidden; overflow-x: auto} и привет, средней кнопкой скроллится только в стороны.)

Большая зелёная кнопка «вмёржить это в master прямо сейчас не думая» категорически нафиг не нужна.

yurikhan: (Default)

Бритва Постела наоборот:

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

Софт, который в этих условиях выживет, — будет супернадёжен и при этом корректен.

yurikhan: (Default)

Заметка для себя, чтоб не потерять.

Типичная задача: добавить сабмодуль в git-репозиторий.

Решение человека, только что читавшего мануал: $ git submodule add git@host:path/repo.git. Клонирует удалённый репозиторий в подкаталог текущего, регистрирует его в .gitmodules и .git/config.

Как обычно получается у меня: $ git clone git@host:path/repo.git. Клонирует удалённый репозиторий в подкаталог текущего и больше ничего не делает. Обнаруживается это где-то ближе к тому моменту, когда добавление сабмодуля нужно закоммитить.

Соответственно, задача: На входе есть суперпроект (в терминах git-submodule(1)) и внутри него локальная копия репозитория, который нужно сделать сабмодулем. Считаем, что текущий каталог находится внутри суперпроекта, а корень будущего сабмодуля является непосредственным подкаталогом текущего. Решение методом выливания воды из чайника заранее отметаем как неизящное.

Из инструментов у нас есть git submodule add [-b <branch>] <repository> <path>. Ветку указывать нужно в редких случаях и можно руками. Путь легко вводится по M-RET в Midnight Commander’е. А вот URL репозитория хочется достать и подставить автоматически.

Достать путь можно так: $ git -C <submodule> config --get remote.origin.url.

Однако писать $ git submodule add $(<строчка выше>) каждый раз утомительно, поэтому добавляем алиас:

$ git config --global --edit

[alias]
    subinit = !sh -c 'sub="$1" && shift && git submodule add "$@" $(git -C "$sub" config --get remote.origin.url)' -

$ git subinit repo
Adding existing repo at 'repo' to the index

$ git subinit repo2 -b master
Adding existing repo at 'repo' to the index
yurikhan: (Default)

Мало кто знает, что Википедия — это форма множественного числа. Вместе — википедия, а каждое в отдельности — википедие.

It is a little-known fact that Wikipedia is a plural noun. Collectively they are wikipedia; each one separately is a wikipedium.

yurikhan: (Default)

Если при наведении мышью в какую-то точку кнопки или пункта меню ты эту кнопку или пункт подсветил или поменял курсор мыши на «палец» — ты обязан реагировать на клик в этой конкретной точке.

Типичная схема нарушения: на клики реагирует ссылка с текстом, а подсветка по :hover’у и вообще всё оформление кнопки висит на контейнере-обёртке с margin’ом в пол-эма. Попадаешь в margin — подсветка есть, реакции на клик нет.

Лучи поноса в общем направлении Tiny Tiny RSS и Atlassian Crucible.

yurikhan: (Default)

В языках программирования категорически не хватает типов id32_t и id64_t. Внутреннее представление — целое соответствующей битности, набор операций — только сравнение на равенство и неравенство. Ну, может, ещё линейный порядок, для использования в качестве ключей в упорядоченных контейнерах. Но точно без арифметики.

Навеяно очередным ворнингом о неявном преобразовании из знакового в беззнаковое или обратно.

yurikhan: (Default)

Dashing through the snow
In a one horse open sleigh
I went for a walk
On a winter day.
Bells on bob tails ring
Making spirits bright
California dreaming
On such a winter… night? 😮

yurikhan: (Default)

Окей, оно готово. За этот отпуск я сделал себе клавиатуру.

Клавиши — Matias Quiet Click. Реально стучат тише, а тактильный фидбек ярче, чем у Cherry MX Brown.

Корпус конструкции «бутерброд»: дно — нержавеющая сталь 1 мм, стенки — оргстекло 10 мм, монтажная пластина — снова нержавеющая сталь 1 мм, сверху рамка опять из оргстекла.

Электроника собрана методом бесплатного монтажа (то есть без печатной платы).

Подставки под ладони — от клавиатуры Matias Ergo Pro. Мягкие, гелевые, прикольные.

Внутри — микроконтроллер Freaduino Micro (аналог Arduino Micro), на чипе Atmel ATMega32U4. Его пинов ввода-вывода как раз хватает на матрицу из 12 полурядов по 8 клавиш и на три светодиода.

Прошивка — TMK Keyboard Firmware by Jun «hasu» Wako. Скомпилировалась, прошилась и заработала буквально с полпинка.

Раскладка по мотивам Truly Ergonomic и Keyboardio. Примерная логическая раскладка тут.

Потратил на всё это около 215 долларов США, вместе со всеми пересылками, лазерной резкой прототипа и деталей корпуса. То есть сравнимо со стоимостью массово производимых клавиатур такого класса. И ещё осталось полкоробки клавиш на второй экземпляр.

Со временем выложу все исходники как open source hardware.

yurikhan: (Default)

Тестируем ранний прототип.

yurikhan: (Default)

В предыдущих сериях: иконочные шрифты, отсутствие хинтинга в SVG-иконках.

Новый идиотский тренд: мало того, что иконки запихивают в шрифт, так ещё и задают как лигатуры. То есть слово search, набранное шрифтом Material Icons, превращается в иконку лупы.

При отсутствии соответствующего шрифта всё это выглядит как ужас:

yurikhan: (Default)

А вот довелось мне намедни написать емейлом некий запрос (пока не важно) в одну организацию. И сегодня я получил оттуда ответ. С ответом ниже цитаты.

Так приятно, чёрт возьми.

yurikhan: (Default)

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

yurikhan: (Default)

Спецификация JSON’а вмещается в пять страниц и её может читать пятиклассник. Однажды прочитанная, она укладывается в голову навсегда.

Спецификация YAML — это 84 страницы мелкого умного текста. Попробуйте запомнить, чем отличается unquoted, 'single-quoted', "double-quoted", | literal и > folded скаляры, и как в них работает удаление ведущих пробелов.

И ещё вот эта грабля с массивами и отображениями, эта дурацкая неоднородность в окрестности нуля:

# Массив из двух элементов
array2:
  - foo
  - bar

# Убираем один, получаем массив из одного элемента
array1:
  - foo
  #- bar

# Убираем один, получаем пустой массив?
array0:
  #- foo
  #- bar

# Отображение из двух ключей
map2:
  foo: bar
  baz: quux

# Убираем один, получаем отображение из одного ключа
map1:
  foo: bar
  #baz: quux

# Убираем один, получаем пустое отображение?
map0:
  #foo: bar
  #baz: quux

А вот фиг. Значения array0 и map0null.

Сейчас начнутся возражения, что если тебе нужен пустой массив или пустое отображение, то напиши [] или {} соответственно. Ну так продемонстрируйте, как это будет выглядеть в вышеприведённых примерах. Чтоб раскомментирование элемента немедленно приводило обратно к одноэлементной коллекции.

Опять-таки, если мы согласны писать скобки и запятые, почему мы не пишем JSON?

yurikhan: (Default)

А вот с каких пор и хрено́в ЖЖ стал заменять юникодные символы на иконки? И как это отключить?

↔ ← здесь должен быть символ стрелки влево-вправо

Upd. Это скрипт Twitter Emoji. Блокировать для начала twemoji.min.js$script, а там дальше видно будет.

yurikhan: (Default)

Пьеса в трёх действиях, пяти картинах, PG-13 (демонстрация обнажённых сетевых коннекторов, возможно грубая лексика).

Действие первое

Картина первая

Среда, 2016-09-07, 12:30 UTC+7. Я сижу на работе. Входит Мониторинг.

Мониторинг (красным жирным Ариалом 24pt): PROBLEM Alert! (Спокойно:) Connection to host […] timed out after 10 seconds.

Я: А! Что! Кого? (Захожу по ssh через IP-адрес от запасного провайдера.) Доложить обстановку!

Маршрутизатор: Докладываю: Дом.ru — исправен, МТС — исправен, внутренняя сеть — исправна, Электронный город — нет линка. Работаем через МТС.

Я: Так держать.

Занавес.

Read more... )
yurikhan: (Default)
while not done():
    task = pop(queue)
    try:
        do(task)
    except Exception as e:
        log("Cannot do %s: %s", task, e)
        # possibly sleep(5)
        # possibly push(queue, task)

Что не так на этой картинке?

Read more... )
yurikhan: (Default)

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

Название бинарника может быть глаголом в повелительном наклонении (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). Жутко бесит. Очевидно же, что это должно быть прямое дополнение.

yurikhan: (Default)

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

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

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

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

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

Read more... )
yurikhan: (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.

yurikhan: (Default)
ар‧хи‧ва́ж, сущ., неод., м., 2-е скл.
Действие по гл. архивировать.
ар‧хи‧ва́ж‧ный, прил.
Относящийся к архиважу. Я к вам по архиважному вопросу.

Profile

yurikhan: (Default)
Yuri Khan

June 2017

S M T W T F S
    123
45678910
1112 1314151617
18192021222324
252627282930 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2017-08-18 18:12
Powered by Dreamwidth Studios