Читать в телеге. Когда-то там были посты не только от меня.
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-код, чтобы разобрать его содержимое.