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-е скл.
Действие по гл. архивировать.
ар‧хи‧ва́ж‧ный, прил.
Относящийся к архиважу. Я к вам по архиважному вопросу.
yurikhan: (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.

yurikhan: (Default)

Где-то в параллельной вселенной магнаты и магниты — это соли магниевой и магнистой кислот, соответственно.

yurikhan: (Default)

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

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

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

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

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

yurikhan: (Default)

Четыре года назад я жаловался на тенденцию запихивать векторные иконки в кастомные шрифты и стучал ногами, что надо использовать 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 }

}
yurikhan: (Default)

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

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

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

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

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

Ответы )

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

yurikhan: (Default)

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

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

Пуськи бятые

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

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

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

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

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

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

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

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

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

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

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

yurikhan: (Default)

Когда я пришёл в веб, считалось дурным тоном делать сайты, не помещающиеся в 800×600.

Потом распространились разрешения 1024×768, 1152×864, 1280×1024 и, наконец, 1600×1200. В какой-то момент вебостроители решили, что 1024 пикселя в ширину есть у всех. А у кого нет, тот лох.

Потом пошла мода на 16:10 и 16:9 и разрешения типа 1920×1080. И вот про это разрешение поговорим подробнее.

Дело в том, что при 24 дюймах диагонали, формате 16:9 и разрешении 1920×1080 CSS-пикселей (тех, которые 1/96 дюйма, а не обязательно один минимальный элемент изображения) уже начинает быть удобно работать не с одним развёрнутым на весь экран окном, а с двумя неперекрывающимися половинками. И в такой конфигурации сайту в браузере остаётся 960px ширины, с поправкой на скроллбар — ≈940px.

Сто́ит вспомнить правила приличия девяностых и двухтысячных. Сайт не должен вызывать горизонтального скроллинга при ширине окна в 940px.

(Персональные лучи поноса — Альфа-Клику, Гитхабу, Гуглу, Джире, Пейпэлу, библиотеке Сафари Букс Онлайн, всей сети Стек Эксчендж и Яндекс-Погоде.)

Profile

yurikhan: (Default)
Yuri Khan

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2016-12-11 11:45
Powered by Dreamwidth Studios