❌

Normal view

История одной IT-разработки: как мы создали софт по рассылке деловых писем

Всем привет! Я Дмитрий Шихаев, маркетолог для IT-компаний. Сейчас работаю с крупными IT-заказчиками, помогаю выводить технологические продукты на рынок и развиваю направление ABM-маркетинга в России.

Но путь к этому был далеко не сладким. Когда-то мы с товарищем Гошей, у которого за плечами были базовые знания BASIC и опыт работы с конструктором BAS, решили практически без денег и опыта создать собственный софт для массовой отправки качественных персонализированных деловых писем.

Сегодня разработчику стыдно вспоминать эту историю, поэтому его лицо скрыто в контенте, а имя изменено. Он вырос в сильного специалиста и мы работаем вместе до сих пор.

А тогда бюджет у нас был как у студента за неделю до стипендии, техническая команда состояла из двух калек - маркетолога без знаний IT-внутрянки и начинающего автоматизатора, зато амбиции были как у всего состава Кремниевой долины.

Читать далее

Фотосессия стоматологов без фотосессии за $3: FLUX.3 klein + ComfyUI + RunPod = 290 кадров

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

Читать далее

Старый софт на свежем Linux: свой GCC, свой OpenSSL и честный RPATH

А что если… нужен старый софт, но при этом хост Linux свежий?

Как вариант, можно взять, да хоть на примере питона, нужный официальный образ в докере. Да и пользоваться.

Казалось бы, проблема решена. Но есть нюанс (с). Добро пожаловать под кат.

Читать далее

Пайпы OpenWebUI: зачем писать код там, где «всё уже есть в настройках»

Настроить кастомную модель с инструментами и RAG в OpenWebUI — легко. Заставить её работать предсказуемо в бою — сложнее. Наш бот техподдержки на Gemma 4 сначала отвечал правдоподобно, но без данных из систем. Мы разобрались, почему это происходит, и превратили «одну модель в интерфейсе» в детерминированный конвейер с помощью пайпов.

Читать далее

В логе было «не удалось получить данные:» и дальше пустота. Это и была вся ошибка

В логе моего сборщика данных годами появлялась строка «не удалось получить данные:» и дальше ничего. Я считал это багом форматирования, пока не посмотрел: код написан правильно, просто у asyncio.TimeoutError пустой str(). Дальше выяснилось интереснее. Рядом лежит хелпер с тремя попытками и паузой в пять секунд, написанный ровно под сетевые сбои, а ловит он except aiohttp.ClientError. Начиная с Python 3.11 asyncio.TimeoutError это встроенный TimeoutError, наследник OSError, и к иерархии aiohttp он отношения не имеет. То есть единственная ошибка, ради которой ретраи существовали, пролетала мимо них. Причём у aiohttp есть и свои таймаутные исключения, которые как раз ClientError, и именно это сбивает с толку. Заодно разбираю, как я на основе этих пустых ошибок записал в заметки несуществующее «сетевое ограничение VPS» и построил вокруг него архитектурное решение.

Читать далее

Бэкап SQLite прошёл проверку. Второй заказ в него не попал

Копия SQLite открывается, контрольная сумма совпадает, integrity_check отвечает ok. А подтверждённого заказа в ней нет. Разбираю результат десяти локальных прогонов: где осталась запись, почему проверки её не заметили и как принять резервную копию по содержимому. Полный проверенный скрипт — внутри.

Читать далее

Сколько миллисекунд без читателей нужно SQLite, чтобы файл -wal перестал расти

Документация SQLite говорит, что -wal перестаёт расти, только если у читателей, которые видят кадры из -wal, бывают общие паузы, но не говорит, какой длины. Я замерил в контейнере на SQLite 3.46.1: на моём стенде хватало единиц миллисекунд — 2 мс при 50 коммитах/с, 5 мс при 1000/с, и быстрой записи понадобилась пауза шире. Без паузы три читателя по 50 мс раздувают -wal так же, как один на 20 секунд, а случайные запросы по 5 мс почти не мешали, пока база была свободна хотя бы 13% времени.

Читать далее

Глобус в терминале: Земля из символов Брайля и реальная смена дня и ночи

Представьте, что в уголке вашего терминала висит глобус Земли, и ночь на нём наступает там же, где за окном. Я написал такую программу за два дня. Она загружает карту мира, обтягивает ею сферу и отображает её символами: точками шрифта Брайля, значками Юникода либо буквами. Шар вращается мышью и раскрашивается одной из десяти палитр. Помимо Земли утилита показывает Солнце, Луну, все планеты и Цереру. Ставится одной командой, без Python и зависимостей.

Читать далее
❌