biozz.dev – Telegram
biozz.dev
87 subscribers
38 photos
88 links
Ищу простое в сложном.
Download Telegram
Про двух Иванов. Зачем нам (нужна была) фоновая музыка

Всё просто — делаешь фон чуть громче и косяки записи и редактуры меньше слышно.

Так я думал почти год.

А потом осознал, что то, что я называю косяками, на самом деле слышу только я. Потому что прослушивал запись во время редактирования суммарно несколько часов.

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

Так что не парьтесь по вздохам и словам паразитам на записях. А если паритесь, отдайте на редактуру профессионалам и поберегите свои силы на контент-мейкинг.
🔥3👍2👏1
Чтобы понять искусство, надо про него читать.
Про двух Иванов. Подготовка для слабаков (вредный совет)

Мы никогда не готовимся, да и вам не советуем. Мы не знаем о чём будет выпуск, да и вам не надо.

Мы же понимаем, что мы все крутые подкастеры. Раз уж сели за микрофоны, значит мы точно будем знать о чём говорить.

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

Вы что, думаете, что Лекс Фридман готовится? Или, может быть, Джо Роган? Да-да, рассказывайте. Кому нужны эти продьюсеры? Они же ещё денег за сценарии просят, а потом за пост-обработку. Мы сами лучше знаем, как нам надо.

В общем, подготовка для слабаков. Только экспромт, только безграничная сила неиссякаемой весны творческой энергии.
👾2
Новый эмоджи-пак — True Editors

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

Этакий «I use neovim btw» по-телеграмовски.

P.S.: заявки на тру эдиторы принимаются, пишите в комменты или лс. Сейчас есть такие — 📝📝📝📝📝📝

https://news.1rj.ru/str/addemoji/TrueEditors
Please open Telegram to view this post
VIEW IN TELEGRAM
💅21
Заходят как-то два плохих тимлида в бар…

Продолжите шутку в комментах
Про двух Иванов. Невыпущенное

Если вы давний слушатель двух Иванов, то замечали, что выпуски на Мейв и на сайте начинаются с №7.
https://doubleivan.mave.digital/

Дело в том, что первые 6 выпусков мы выкладывали исключительно в слаке Островка, только на внутреннюю аудиторию. А когда решили выходить на внешнюю аудиторию, то они не прошли мою цензуру по качеству звука.

Есть и ещё невыпущенный материал:
- 2023-08-31, который должен был быть №14. Я хотел попробовать новостной формат, но получилось очень скушно. Мы же не Радио-Т.
- 2024-04-25, который должен был быть №27. С Сашей Гончаровым (@blog_pogromista) про автоматизированный найм разработчиков. Но это тот самый раз, когда Риверсайд запорол нам дорожку Саши. А в лайве было ок!

В комменты выложу первые шесть выпусков. Пишите, если они так-то ок и можно выложить. Тогда я ослаблю градус цензуры и бахну официально. Жаль, что без красивых обложек.
Расположение попапов оповещений в Obsidian

Мне начали мешать уведомления в Обсидиане после того как установил Obsidian Linter — https://github.com/platers/obsidian-linter. Линтер мне нужен, в первую очередь для того, чтобы перед сохранением файла добавлять created и modified во frontmatter. А после сохранения файла я часто использую иконки в верхней строке и оповещения их закрывают. Приходится ждать, когда оповещение уйдёт или кликать по нему, чтобы ушло побыстрее.

Наверное, для этого есть плагин, потому что встроенной фичи точно нет — https://forum.obsidian.md/t/placement-of-notifications/50331.

Но я, как обычно, решил сначала пофиксить сам, как умею.

Открыл DevTools и нашёл нужный стиль:


.notice-container {
// там ещё много свойств, но нам нужно только это
top: 22px;
}


Добавил кастомный CSS сниппет:


.notice-container {
bottom: 22px;
}


Теперь попапы оповещений внизу и не мешают.
💅2
Про двух Иванов. Записывайте интро в конце

Когда-то какой-то умный ютюбер сказал «записывай интро в конце».

Мы начали делать так в нашем подкасте где-то с 10-го выпуска и это очень удобно, потому что нас с Ваней часто уносит от темы.

Для нас важна не тема, а топик-стартер. Нам нравится исследовать какую-то идею и делать разговор максимально свободным и живым. На мой взгляд это добавляет какой-то местечковости и уюта, чего мы и добиваемся.

Самое классное смотреть на реакции гостей, с которыми мы просто начинаем беседу под запись. А когда отведённое время заканчивается, спустя полтора часа разговоров, мы с Ваней говорим «Ну что? Пишем интро?». Все гости удивляются.

Записывайте интро в конце, потому что вы уже разогреты после разговора и этот заряд лучше настраивает на прослушивание.

Не уверен, будет ли заметно отличие в том, как записано интро на фоне всего остального, но вот вам два выпуска для сравнения:

- Два Ивана №10 (Vim vs IDE) — https://doubleivan.mave.digital/ep-4
- Два Ивана №33 (про CTF) — https://doubleivan.mave.digital/ep-27
🌚2
Про двух Иванов. AI инструменты для обработки звука

Пока ещё не дотягивают.

Первые выпуски, записанные на непонятные микрофоны в местах с плохой акустикой, я пропускал через Adobe Podcasts, который в то время был в бете и бесплатным. У записей после обработки были странные артефакты, особенно на звуках-паразитах между фразами «эээ» «иии» — было слышно, как меняется тональность голоса.

Сейчас таких AI инструментов куча. Один из таких встроен в Riverside.fm, где мы записываемся. Но получается плохо.

Ещё одна крутая идея в AI обработке — правишь текст расшировки и вместе с ним меняется и аудио. Вариант такой тулзы в Riverside.fm пока не дотягивает, потому что плохо расшифровывает некоторые фразы.

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

Главное, что у вас есть — это контент. Content is king.
❤‍🔥2
Про ЯП. PHP такой «ну верну хоть чего-нибудь»

Предположим у вас есть вот такой объект:

{
"items": [
{
"id": 1,
"name": "New"
},
{
"id": 2,
"name": "Applied"
}
]
}


И вы пробуете найти элемент с name в значении «Новый» и потом печатаете найденный элемент. Вот так:

$key = array_search("Новый", array_column( $data->items, 'name' ))
echo $data['items'][$key]


Вопрос: что напечатается в echo?

Правильный ответ: первый элемент массива. И в доке это поведение описано:

array_search — Searches the array for a given value and returns the first corresponding key if successful

array_search верёт false. false приведётся к 0 и получится $data['items'][0].

Да, есть параметр strict, но с уточнением про тип данных. Дальше идут примечания, ворнинги и куча комментов, где ребята делятся, как правильно юзать array_search.

Я что, избалован питоном и го? Почему мне это кажется плохим дизайном?
🤡4🤯2
Фильтры для RSS фидов

Иногда хочется получать не все новости ресурса, а только часть. У меня есть два примера, как ограничивать спам в RSS.

В Рыбинске есть «Рыбинские известия» — https://gazeta-rybinsk.ru/, но мне у них инетерсно сейчас только про то, когда надолго закрывают мост через Волгу из-за ремонта. Я использую Miniflux (https://miniflux.app/) и настроил для фида известий регулярку (?i)волжский мост.

И ещё есть HNRSS для Hacker News, в урле которого я указал порог комментов и апвоутов и теперь получаю только самые "обсуждаемые" и "популярные" новости — https://hnrss.org/newest?comments=50&points=250.

А как вы ограничиваете поток входящих новостей?
Чего хотят все дизайнеры

Мне тут сказали, что каждый дизайнер хочет сделать две вещи:

• секретный плакат
• этикетку для пива

Есть тут дизайнеры? Правду говорят?
JSONPatch

Частый спор про изменение объекта по API — это как передавать данные. Я встерчал 3 подхода:

• передавать полностью весь объект
• передавать только поля, которые нужно изменить
• отдельные API для изменения конкретных полей объекта

Кто напишет про GraphQL, gRPC и др., тот хрюшка.

Для варианта передачи только полей, которые изменились, нужна какая-то обвязка. В Python сейчас стандарт — Pydantic. Раньше мы мучались с тем, как обрабаывать None, а сейчас есть foo.model_dump(exclude_unset=True). И вроде как всё ок, но это только Python.

Оказывается, есть стандарт — https://jsonpatch.com/. Но и в нём есть, к чему придраться — это то, как указывается путь до ключа path, который напоминает unix-овые пути. А ведь уже есть несколько других стилей:

• JSONPath (самый очевидный)
• jq (самый хипстерский)
• JSON Path Expressions в SQL (самый занудный)
• JSONata (не то, чтобы стиль, но заслуживает внимания)

Короче, я хочу JSONPatch, который использует JSONPath для путей.

С другой стороны это мелочи по сравнению с тем, что операции в JSONPatch — это по сути история изменений объекта, которую можно хранить, не храня снапшоты объектов. (вспоминаю django-reversion)
Obsidian Publisher United

Запилил плагин для Obsidian — Publisher United. https://github.com/biozz/obsidian-publisher-united

Сделал свой, потому что не понравились flowershow (https://github.com/datopian/flowershow) и enveloppe (https://github.com/Enveloppe/obsidian-enveloppe).

У меня ещё и киллер-фича есть — публикация в Телегу из Обсидиана. Настраивается через front-matter:

telegram_channel: @biozz_dev


После публикации добавляются ещё два поля для редактирования поста и быстрого перехода, если что:

telegram_message_id: 123
telegram_url: https://news.1rj.ru/str/biozz_dev/123


Аналогично и для публикации в GitHub репозиторий:

github_repo: biozz/test
repo_path: content/blog


Последние 5 постов я уже публикую только с помощью плагина. А первый релиз v0.0.1 назван в честь первого менеджера Manchester United F.C. — https://en.wikipedia.org/wiki/A._H._Albut.

Любые идеи и предложения по доработке плагина приветствуются!
🔥1👏1
Про ЯП. Rust такой «— Вам какие скобки? — Да.»

Посмотрите на этот код:

fn example_function<T: Fn(i32) -> i32>(arr: &[i32], func: T) -> Vec<i32> {
let mut result = vec![];
for i in 0..arr.len() {
if arr[i] % 2 == 0 {
result.push(func(arr[i]));
}
}
result
}

В первой строке все виды скобочек! И читать сложновато.

Лично для меня эталон по читаемости — Go, а по экспрессивности — TypeScript. В Rust будто взяли худшие из этих миров.

А вы когда-нибудь задумывались, почему в английском скобки называются brackets, braces и parenthesis? Заходите за ответом к лингвисту-программисту @lingua_programma. (кстати, канал ведёт кое-кто из Островка, угадайте кто)
1👾3
Про двух Иванов. Ещё раз про качество звука в подкастах

Всё максимально просто: дрочево с правильным помещением и обработкой — пустая трата времени. Купите микрофон за 30-50к руб., любительско-полупрофессиональный, типа Shure MV7 и не парьтесь. Хватит на несколько лет точно. Или вообще записывайтесь на студии, которая вам потом и отредачит выпуск.
👾2👌1
Сейчас будем стримить запись нового выпуска подкаста «Два Ивана (название обсуждается)».
С 13:00 до 14:30 (Мск).
Заходите послушать!
p.s.: в следующий раз пораньше заанонсю!

https://riverside.fm/studio/-s-studio-7iNaa
Julia Evans

Я подписан по RSS на Julia Evans. Та простота и дотошность с которой она пишет — неповторимы. Стиль уникальный и, на мой взгляд, похож на то, как учатся дети: наивно, но пытливо и с интересом. А в конце всегда по-взрослому — даже если что-то не получилось, есть какой-то понятный вывод.

И зацените её зины про Git, SQL, CSS и много других.

https://jvns.ca/
https://wizardzines.com/
👍21👾1
Маленький редактор и большие файлы

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

У меня два примера из практики:

- telescope и rg тормозили на Go проекте с большим vendor-ом
- treesitter медленно красит большие файлы

Проблему с rg получилось решить правильно настройкой .rgignore. И дело было, по сути, не в неовиме. https://biozz.dev/blog/neovim-telescope-lag/

А со второй я сталкиваюсь реже, но сейчас есть плагины, которые вырубают часть фичей, если файл большой:

- https://github.com/LunarVim/bigfile.nvim
- https://github.com/pteroctopus/faster.nvim

Или можно написать свою автокоманду, которая делает тоже самое:
local function disable_some_features()
    vim.cmd('TSBufDisable highlight')
    vim.opt.foldmethod = 'manual'
    vim.cmd('syntax off')
    vim.cmd('filetype off')
    vim.opt.undofile = false
    vim.opt.swapfile = false
    vim.opt.loadplugins = false
end

vim.api.nvim_create_autocmd({"BufReadPre", "FileReadPre"}, {
    pattern = "*",
    callback = function()
        local file_size = vim.fn.getfsize(vim.fn.expand("%"))
        if file_size > 512 * 1024 then
            disable_some_features()
        end
    end
})

Или вообще запускать NeoVim без плагинов, но я всегда забываю про это — nvim --clean.
👍2👾1
Need for Speed NeoVim. Переключение между файлами

Тру вимеры не пользуются вкладками и держат в голове список открытых буферов, переключаясь между ними через :bn, :ls, :b <n>.

Нам до тру вимеров далеко и часто бывает так, что нужно сфокусироваться на паре-тройке файлов и не искать их в списке открытых буферов. Есть несколько вариантов, как это сделать.

Как обычно, первый — не париться и замапить TAB на следующий буфер, а S-TAB на предыдущий.

Дальше по уровню нативности — marks. Отметил несколько файлов, потом по ним прыгаешь. Я так и не пристрастился, даже с плагинами, которые делают сами ответки более визуальными, а список — красивым.

Потом пришёл Primagen и придумал Harpoon. А потом переписал его и сделал Harpoon 2. Суть одна — помечаешь файлы, потом хоткеями прыгаешь между ними. Получается как :bn и :bp, но только по отмеченным файлам. Don't worry about it © Primagen.

Кто-то не оценил гарпун и сделал свой вариант — arrow.nvim. А кто-то хотел ещё и красивый интерфейс. Так появились snipe.nvim и tide.nvim. Но олды помнят, что открытые буферы сбоку умел показывать neo-tree.

А вы чем пользуетесь?
👾2
Need for Speed NeoVim. Скорость запуска

Какое время запуска редактора приемлемо?

У меня уже где-то полгода вот так:


Startuptime: 75.59 ms
Plugins: 54 loaded / 69 installed


До этого примерно год не парился, когда было ~150 мс.

А время сократилось вдвое вот почему:

• убрал примерно ~30 плагинов
• добавил lazy loading ко многим оставшимся
• закопался в исходники некоторых плагинов

Оказывается нет какого-то канонического способа посмотреть частоту использования плагина. Только если не добавлять в каждый стандартную телеметрию. Но такое вряд ли поддержат в сообществе. Поэтому я просто перечитывал конфиг и, если не вспомнил, что делает плагин, удалял его.

Интересно, что некоторые плагины перестают работать с переходом на lazy loading. И я уверен, что это чисто моя история. Например, nvim-lspconfig не может, да и зачем ему? Если пользуетесь lazy.nvim, то у вас такие варианты: event, cmd, ft, keys и магический lazy = true. Your mileage may vary ©, поэтому пробуйте.

Самый наглядный пример того, как оптимизировать время запуска плагина в исходниках — xkbswitch.nvim. Это плагин, который использует внешнюю утилиту для запоминания текущей раскладки, а потом переключает раскладку на английскую в normal режиме и обратно в последнюю выбранную в insert режиме. Утилита может "долго" (15-30 мс на моём М1 Pro 16 Gb) отрабатывать, так как при первом запуске пытается понять, какую конкретно утилиту использовать и получает из системы список доступных раскладок. По сути это и есть два изменения, которые я сделал — два новых параметра, которые можно указать в конфиге плагина, и небольшой рефакторинг, чтобы не сломалось старое поведение.

В общем, я считаю, что 70-100 мс для редактора — это приемлемо. А сколько нынче запускаются всякие там пайчармы, голэнды и вскоды?