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

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

Frame pointer

Интересная статья про frame pointer — указатель на верхушку стека вызовов. Недавно как раз обсуждал с коллегами, надо ли или не надо его использовать (в итоге положились на то, что в gcc по умолчанию он не добавляется), и нате.

Оказывается, наличие этого указателя довольно критично для многих профилировщиков. Занятно, что даже в java протекает. При этом какое-то влияние на производительность экономия одного регистра все-таки имеет, но оно меньше 1%, а если больше, то, скорее всего, вызвано проблемами с кэшем и расположением в памяти.

При этом в нормальных обстоятельствах указатель не нужен, а для профилирования есть другие подходы, которым он не нужен.

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

Diff в IntelliJ

На маке страдаю от того, что нет нормальной программы для сравнения рандомных кусков текста или папок. На Linux использую Meld, он классный и в нем есть все что нужно, но его порт на Mac M2 работает отстойно: багает с копипастом и крашится. Чисто маковские альтернативы попробовал, одна мразотнее другой (если знаете что-то хорошее, посоветуйте, пожалуйста).

Коллеги подкинули фичу Intellij, о которой не знала даже автор книги про нее (sic!): “Open Blank Diff Window”. Самый быстрый способ, как до нее добраться, это нажать два шифта для меню действий + “OBD” или “ODW”. При этом если надо сравнить что-то с файлом или папкой проекта, то так извращаться не нужно: в контекстом меню файла есть “Compare With…” (Ctrl+D).

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

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

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

В 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-код, чтобы разобрать его содержимое.

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