Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Повторение команды до посинения

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

В bash есть механизм подстановки истории, с помощью которого можно заменить, например, !3 на третью команду из истории. Когда есть Ctrl+r (поиск по истории) и банальные стрелочки — это довольно бесполезно, однако есть шаблон !!, который заменяется предыдущей командой.

!! очень удобен, например, для sudo !! (*блеать.jpg*). И пригодится для повтора:

while [ $? -ne 0 ]; do !!; done

Эта команда будет выполнять предыдущую, пока не будет успешный ответ. Можно завернуть в альяс.

СсылкаКомментировать

Копирование файлов из другой ветки

Git — тот еще комбайн, про это полно мемчиков.

Я вообще редко из GUI интерфейса (в IDE) выхожу, потому что консольный — тот еще мрак с точки зрения UX. Но некоторые вещи даже через GUI делать неудобно, поэтому приходится использовать заклинания.

Одно из недавних, которое пригодилось — копирование файлов из другой ветки:

git checkout another_branch -- file_name_or_pattern

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

СсылкаКомментировать

Улучшение процессов в компании

Занятное исследование про улучшение процессов. Оно довольно старое (2001 год), но актуально до сих пор.

Обсуждаются классические проблемы: “у нас нет на это времени, мы очень заняты” и награждения за тушение пожаров, а не их предотвращение. Довольно подробно рассмотрены причины возникновения подобной “культуры” и ловушки низкой эффективности (спойлер: положительная обратная связь). При этом отмечается, что существует множество методологий повышения эффективности труда с доказанной эффективностью, которые открываются снова и снова под новым именем, но мало кому приносят пользу из-за хренового внедрения.

Что делать, кроме как повышать осознанность разными способами, особо не раскрывается. В одном примере помогло обучение в игровом формате, а в другом — изменение ментальной модели и просто выделение времени на вещи, давно требующие внимания. Очевидно, снизу так менеджмент не переубедишь :(

СсылкаКомментировать

Как работает светодиод

Я плохо понимаю электронику на уровне физических процессов. И об истории разработки транзисторов я имел очень смутные представления: вот где-то там в 50-е появился транзистор, потом на основе полупроводников в течение лет десяти появились все основные элементы “рассыпухи”.

Но, оказывается, хотя первые светодиоды появились в 60-е, нормальные синие и белые светодиоды — это уже 90-е.

Красивую историю я узнал из этого видоса. Там еще и рассказано, как вообще светодиоды работают — с движущимися картинками.

СсылкаКомментировать

Data Structures for Data-Intensive Applications: Tradeoffs and Design Guidelines

Одна из лучших книжек по алгоритмам, которые я когда-то либо читал. Избранные моменты:

  • В во второй главе разобраны основные противоречия построения СД: чтение, обновление, компактность в памяти, а также точечные/интервальные запросы, вставка и удаление.
  • Далее идет теория и практика, которые позволяют по характеру и последовательности операций выбрать СД. Например, когда нужно использовать B+-дерево, а когда префиксное? Полезен ли фильтр Блума для LSM-деревьев?
  • В главе 4.11 приведены примеры продуктов, в которых используются “сложные” деревья — это не какая-то экзотика, а вполне популярные вещи.
  • В главе 6.1 — чем отличаются традиционные от колоночных СУБД, и для каких сценариев какие лучше?
  • В 6.2 — какие СД используются внутри файловых систем.
  • В 6.3 — что там у ML?
  • Новому времени — новые типы запросов: “глубокое” удаление для GDPR и какие это несет последствия для СД.
  • Ну и железо не отстает, оно разумеется влияет на построение СД (правда тут скорее обзор статей на тему).

В конце сделан вывод, что создание СД — это искусство. Возможных структур данных — больше чем 10^100.

Рекомендую к прочтению тем, кто работает с большими данными/СУБД. Но вообще довольно познавательно для всех разработчиков.

СсылкаКомментировать

CrypTool

Сайтик с немного рандомным и местами экзотическим набором утилит, связанных с криптографией: перестановочный шифр из Камасутры, разложение числа на множители, SHA256 (который почему-то в шифрах), штрихкод и т.п. Есть неплохая анимация AES с описанием. Может подойти тем, кто мало знает про криптографию: представлено много “простейших” шифров.

СсылкаКомментировать

Региcтрация собственного протокола для ссылок

В продолжение темы про маршутизатор для браузеров.

Вот допустим я хочу из браузера открывать ссылки во внешнем приложении. Как это сделать? Нужно расширение. Но есть проблемка: нельзя просто так взять и запустить какое-то там приложение из браузера. Даже по команде 300 раз одобренного расширения. Нужно использовать обмен сообщениями, и специальное приложение-клиент, которое принимает эти самые сообщения в простом формате (бинарная длина + само сообщение) через стандартный поток данных. Регистрация всего этого — гемор, вдобавок, для Firefox и Chrome есть отличия.

Есть обходной путь: использовать протоколы типа tg:// или zoommtg://, которые открывают ссылку в другом приложении. Например, если на маке набрать в Chrome firefox:https://example.com, то откроется Firefox с указанным адресом. Chrome так уже не умеет, но не очень-то и хотелось: можно зарегистрировать протокол для своей утилитки.

Как зарегистрировать протокол в Linux? Добавить немного метаданных в ярлык и добавить 2 команды. Увы, браузеры отслеживают этот список отдельно, и чтобы ссылка работала еще и в браузере, надо хоть раз по ней внутри браузера кликнуть (иначе будет перенаправление в поиск). Ну еще и утилиту надо обновить парой строчек, чтобы отрезала “лишний” префикс.

Как зарегистрировать протокол на маке? Тоже добавить пару строчек метаданных в ярлык и… страдать, потому что передача ссылки опять идет через Apple Events, а не через аргументы командной строки.

СсылкаКомментировать

Cтруктура QR-кода

Да-да, там код Рида-Соломона для исправления ошибок. Но это чисто данные. А что есть кроме них? Версия QR, тип данных и т.п.? Вот про это есть страничка. Она чуть-чуть интерактивная, т.к. можно использовать любой QR-код, чтобы разобрать его содержимое.

СсылкаКомментировать

Асинхронная коммуникация вместо встреч

Довольно неплохая статья про организацию асинхронного общения.

Базовый посыл достаточно очевидный: много встреч — это плохо, асинхронные обсуждения — это хорошо. У оффлайн обсуждений масса плюсов: каждый читает в своем темпе, можно подумать о чем-то поглубже, автоматом сохраняются обсуждения и решения для будущих поколений и т.д. Но в статье есть еще и адекватный обзор случаев, когда команды/компании недостаточно зрелые и асинхронные обсуждения не будут эффективны. Да и сам процесс стоит задокументировать. В общем, есть нюансики.

На мой взгляд, культура компании очень сильно на это влияет. У многих большие трудности с тем, чтобы сделать повестку встречи и понять, что вообще от встречи требуется. Заметки по итогам встречи (да и вообще какие-то артефакты) оставляют единицы. Готовиться ко встрече, на которую тебя пригласили? “Да ну, зачем” или “я очень занят, мне некогда”. Плюс встреча это практически набор голосовух со всеми минусами. В итоге встреча превращается в какое-то коллективное бессознательное: собрались, поговорили, а вот зачем, с каким итогом и что вообще обсуждали ­— пес его знает.

Даже если перевести обсуждение в асинхронный формат, то можно ждать неделю хоть какой-то реакции (я очень занят, много встреч), даже когда вопрос на 10 минут и нужен формальный аппрув. Еще кто-то может прочитать, но никак не отреагировать (и сказать потом устно). В общем, асинхронь не асинхронь, все равно получишь хтонь, если культура такая.

Безусловно, некоторые встречи можно оставить для того, чтобы работать с людьми, а не пикселями в компуктере. И встречи хороши для устранения недопонимания (подобно тому как вы делаете код-ревью: сначала комменты, потом после пары итераций можно и созвониться по-быстренькому, чтобы обсудить варианты).

СсылкаКомментировать

Markdown в Google Docs

В гугл-доках можно включить распознавание (автозамену) Markdown. Забавно, что это в русской версии указано как “автоматически распознавать разметку”, как будто других видов разметок нет. Поддержка довольно урезанная:

  • Всякие преобразования текста (жирно, курсивом, моноширинно и т.п.) поддерживаются.
  • Блоки кода с ``` — только в платной версии (потому что блоки кода в принципе только в ней и доступны). Но они не очень полезны в любом случае (и там только 4 языка: C++, Java, JS и Python).
  • Заголовки работают.
  • Ссылки [ty](http://id.or) не работают, так что только выделение + Ctrl+K в помощь. Картинки тоже не работают.
  • Цитаты > не работают.
  • Списки — вроде как да, но у меня иногда багает.
  • Разделители --- — не поддерживаются, но с другой стороны в документах они и не нужны особо.
  • Таблицы — мимо.
  • Сраные смайлики — выпрыгивают после :. К счастью, можно это отключить там же, где и Markdown включается.
  • Подстрочный или надстрочный текст — тоже не работает (поставьте LaTeX уже наконец).

Еще можно поставлять всякой дичи при автодополнении @, например, даты, людей, эмодзи для голосования (sic!) и т.п.

СсылкаКомментировать