О боже, у YouTube появился real-time траспорт в апи для сообщений со стримов, не может быть.
НОО.
Что вы думаете, какой траспорт они выбрали? WS? IRC? Webhooks? SSE? Может быть Long-polling?
Да нифига подобного, чуваки решили выбрать grpc стримы. Пожалуй самый малоудобный транспорт из всех.
Гугл клоуны, я не удивлён.
НОО.
Что вы думаете, какой траспорт они выбрали? WS? IRC? Webhooks? SSE? Может быть Long-polling?
Да нифига подобного, чуваки решили выбрать grpc стримы. Пожалуй самый малоудобный транспорт из всех.
Гугл клоуны, я не удивлён.
🥴5😁1
3min -> 1min
Первым делом я посмотрел, и подумал. А зачем мне билдить 2 билеотеки
types+api, которые являются deprecated. То есть они обе потихоньку выпиливаются, и я могу убрать их из пайплайна, и убрать их из гитигнора. Там ничего не меняется, потому конфликтов не будет в будующдем.Результат: -40 секунд.
Потом я пошёл курить почему у меня каждый раз выкачиваются зависимости при билде, хотя кэшы у меня настроены.
Поправил этот моментик.
Результат: -30 секунд.
Потом я обратил внимание, что почему-то сам
go build приложений не работает. Случилось так, потому что у меня матрица на билд всех моих (микро)сервисов. Оно просто не может конкуретно записать билд кэш из-за параллельных билдов.
Добавил каждому приложению свой уникальный кэш-ключ с хэшом на go.mod, что позволило мне сильно сократить скорость билда.
- name: Compute Go files hash
if: ${{ matrix.folders.runtime == 'go' && env.run-build == 'true' }}
id: go-files-hash
run: |
echo "hash=$(sha256sum go.work go.work.sum ${{ matrix.folders.path }}/go.mod ${{ matrix.folders.path }}/go.sum 2>/dev/null | sha256sum | awk '{print $1}')" >> $GITHUB_ENV
- name: Cache Go build
if: ${{ matrix.folders.runtime == 'go' && env.run-build == 'true' }}
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
key: ${{ runner.os }}-go-${{ matrix.folders.path }}-${{ env.hash }}
restore-keys: |
${{ runner.os }}-go-${{ matrix.folders.path }}-
Итог: -30 секунд.
Далее я увидел, что gha кэш на докер образы почему-то тоже как-то непорядочно медленно распаковывается. Я решил потестить кэш через свой registry:
- name: Build docker image
if: env.run-build == 'true'
uses: docker/build-push-action@v5
with:
context: .
file: ./${{ env.folder }}/${{ env.app }}/Dockerfile
push: true
tags: |
registry.twir.app/twirapp/${{ env.app }}:latest
cache-from: type=registry,ref=registry.twir.app/twirapp/${{ env.app }}:latest
cache-to: type=inline
И билд докер образа теперь занимает 10!!!! секунд.
И того, теперь у меня приложения билдятся не 2.5-3 минуты, а одну.
https://github.com/twirapp/twir/blob/main/.github/workflows/dockerv3.yml
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤1😁1
Сделал вот такой вот виджет валорант статистики.
Стата берётся за стрим текущий.
Дизайн взял у зрителя с проекта https://beta.valory.su
Стата берётся за стрим текущий.
Дизайн взял у зрителя с проекта https://beta.valory.su
❤🔥8🔥2
Вернул https://twir.app за cloudflare, потому те кто из России сообщите доступен ли домен без впн, запретов, и прочего.
Anonymous Poll
41%
Доступен
14%
Не доступен
45%
Посмотреть результат
Satont.
Вернул https://twir.app за cloudflare, потому те кто из России сообщите доступен ли домен без впн, запретов, и прочего.
Проголосуйте те, кто не проголосовал. Кому лень печатать адрес, вот: https://twir.app
❤1
Satont.
Вернул https://twir.app за cloudflare, потому те кто из России сообщите доступен ли домен без впн, запретов, и прочего.
Перевёл реверс прокси на другой хост, теперь проблем с доступом из России быть не должно.
Пути-безопасный i18n на Golang бэкенде в Twir.
Захотелось мне поюзать i18n на бэке твира, и сразу в голове появилась мысль: а почему бы мне не сделать type-safe путь до строк? Например в TypeScript это легко решается декларированием глобального типа в одном месте, с базой от импорта
Я захотел так же в го.
В итоге написал реализацию генератора через AST дерево, смотрит в yaml файлики и ключи внутри, и в итоге генерирует мне вложенные структуры ключей, с типизированными переменными внутри строк перевода. Склееный контент всех файлов тоже выплёвывается в .go файл, потому не нужно эмбедить переводы в бинарь, они уже и так есть в
То есть, если мой генератор видит строку вида
Использование либы максимально простое получилось:
Контекст нужен, чтобы достать из него локаль для последующего использования (с дефолтом внутри), а
Ни и вот пример сгенерированного файла: https://github.com/twirapp/twir/blob/main/apps/parser/locales/locales.go
Осталось только действительно взять и написать переводы. =)
Захотелось мне поюзать i18n на бэке твира, и сразу в голове появилась мысль: а почему бы мне не сделать type-safe путь до строк? Например в TypeScript это легко решается декларированием глобального типа в одном месте, с базой от импорта
.json, с последующей трансформацией в плоскую структуру. Я захотел так же в го.
В итоге написал реализацию генератора через AST дерево, смотрит в yaml файлики и ключи внутри, и в итоге генерирует мне вложенные структуры ключей, с типизированными переменными внутри строк перевода. Склееный контент всех файлов тоже выплёвывается в .go файл, потому не нужно эмбедить переводы в бинарь, они уже и так есть в
map.То есть, если мой генератор видит строку вида
Error happend, {reason}, он автоматом сгенерит структуру с филдом Reason внутри.Использование либы максимально простое получилось:
i18n.GetCtx(
ctx,
locales.Translations.Commands.Seventv.Errors.ProfileNotFound.SetVars(locales.KeysCommandsSeventvErrorsProfileNotFoundVars{Reason: err.Error()}
)
Контекст нужен, чтобы достать из него локаль для последующего использования (с дефолтом внутри), а
SetVars выступает как конструктор по сути, просто мне так удобнее в плане нейминга здесь. Ну и для каждого ключа свой SetVars, с конкретным типом структуры.Ни и вот пример сгенерированного файла: https://github.com/twirapp/twir/blob/main/apps/parser/locales/locales.go
Осталось только действительно взять и написать переводы. =)
😁2👍1
Наконец-то кто-то со скиллами и желанием в продвижении создал дистрибутив основанный на арче, имеющий тайлинг из коробки, и кучу свистоперделок, чтобы людям не сведующим во всём этом было проще.
Я видел уже не первый кейс непроплаченной рекламы, где люди действительно рады и получают удовольствие.
Может следующий год действительно станет годом Линукса на десктопе? Кажется мы сейчас очень сильно приближаемся к этому, ведь кач-во софта на порядок выросло, врождённые болячки уже почти зажили.
Хотя я конечно понимаю, что система не для всего пула задач, но всё же.
Я агитировал и продолжаю агитировать вас хотя бы попробовать. Так вы либо поймёте, что пути назад нет, и продадите ваш мак, либо проникнитесь и купите thinkpad, да пару чулочков.
Даёшь Arch в массы! Даёшь само-контроль за стабильностью и работоспособностью своей системы!
Скажем нет баганым апдейтам максоси!
Именно вы станете собственником вашей системы.
Именно вы будете решать что ей делать, а что не делать.
Именно вы будете выбирать как система выглядит, и как вы хотите её настраивать.
Именно вы получите освободившиеся миллионы утекших на макос калькулятор мегабайт.
Именно вы не просрете все ваши файлы с обновой винды.
Именно вы получите нативный экспириенс.
П.С
DHH кстати руби на рельсах создал, небольшой факт.
И бейзкэмп, тоже небольшой факт.
Я видел уже не первый кейс непроплаченной рекламы, где люди действительно рады и получают удовольствие.
Может следующий год действительно станет годом Линукса на десктопе? Кажется мы сейчас очень сильно приближаемся к этому, ведь кач-во софта на порядок выросло, врождённые болячки уже почти зажили.
Хотя я конечно понимаю, что система не для всего пула задач, но всё же.
Я агитировал и продолжаю агитировать вас хотя бы попробовать. Так вы либо поймёте, что пути назад нет, и продадите ваш мак, либо проникнитесь и купите thinkpad, да пару чулочков.
Даёшь Arch в массы! Даёшь само-контроль за стабильностью и работоспособностью своей системы!
Скажем нет баганым апдейтам максоси!
Именно вы станете собственником вашей системы.
Именно вы будете решать что ей делать, а что не делать.
Именно вы будете выбирать как система выглядит, и как вы хотите её настраивать.
Именно вы получите освободившиеся миллионы утекших на макос калькулятор мегабайт.
Именно вы не просрете все ваши файлы с обновой винды.
Именно вы получите нативный экспириенс.
П.С
DHH кстати руби на рельсах создал, небольшой факт.
И бейзкэмп, тоже небольшой факт.
🔥9😐1🆒1
Ребят, включите BBR на своей системе, скажите мне спасибо.
Если коротко, то это более новый алгоритм контроля над перегрузкой в TCP, от Google.
Уменьшает задержки, увеличивает пропускную способность.
У меня с ним сайты около-моментально грузится стали, даже с vpn.
Поищите как сделать это на вашей системе, его можно и на Windows и на Linux сделать.
- Arch
- Windows / Если у вас 23h2+, то прочтите снонску внимательней, иначе может отвалиться что нибудь. Надо ещё пару команд написать.
- Debian/Ubuntu
Если коротко, то это более новый алгоритм контроля над перегрузкой в TCP, от Google.
Уменьшает задержки, увеличивает пропускную способность.
У меня с ним сайты около-моментально грузится стали, даже с vpn.
Поищите как сделать это на вашей системе, его можно и на Windows и на Linux сделать.
- Arch
- Windows / Если у вас 23h2+, то прочтите снонску внимательней, иначе может отвалиться что нибудь. Надо ещё пару команд написать.
- Debian/Ubuntu
❤14😁1
Тяжёлый год, но в целом успешный.
Ощущаю ли я себя взрослым дядей? Никак нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
27🎉30❤4❤🔥4🎄1
Forwarded from suhodolskiy
Немного запоздалая новость, но вслед за WebStorm теперь и DataGrip от JetBrains можно использовать бесплатно для личных и некоммерческих проектов.
https://blog.jetbrains.com/datagrip/2025/10/01/datagrip-is-now-free-for-non-commercial-use/
Я активно использую плагин для работы с бд прямо в goland, но только для разработки. Для продакшена я использую отдельное приложение TablePlus, чтобы не перепутать и случайно не наделать проблем 😆 Однако подписка закончилась, так что думаю, что это знак, чтобы дать ещё один шанс DataGrip 🤷♂️
https://blog.jetbrains.com/datagrip/2025/10/01/datagrip-is-now-free-for-non-commercial-use/
Я активно использую плагин для работы с бд прямо в goland, но только для разработки. Для продакшена я использую отдельное приложение TablePlus, чтобы не перепутать и случайно не наделать проблем 😆 Однако подписка закончилась, так что думаю, что это знак, чтобы дать ещё один шанс DataGrip 🤷♂️
❤🔥2👍2
