Вот и закончилась наша небольшая история длинной в 3,5 месяца. История, которая началась с длинного плана и сцены потери любимого заканчивается сейчас. Надеюсь, вам понравилось, и вы открыли для себя много нового. Мне — очень.
За это время почти каждая сцена прошла под нашим зорким глазом, каждый взгляд, каждая нотка «All Gone» была разобрана, да, рубрика про геймдев и сторителлинг в The Last of Us закончилась. Печально? Есть такое.
Но каждый финал — это шаг в новую историю.
Рубрика не останавливается, ведь нас ждут другие сцены, другие герои, другая история, но созданная с помощью таких же приёмов монтажа, сценарных подходов и таких же планов.
А какой именно мир будет следующим, решите именно вы! Пишите в комментариях игры, а может и отдельные сцены разбор которых хотите прочитать, а я уже совсем скоро запущу опрос, который и решит, какая игра будет следующей. Это будет наша рубрика. Наши эмоции. Наш монтажный стол.
Потому что, если одна история окончена — это не значит, что всё прошло.
Это значит, что где-то уже начинается следующая.
За это время почти каждая сцена прошла под нашим зорким глазом, каждый взгляд, каждая нотка «All Gone» была разобрана, да, рубрика про геймдев и сторителлинг в The Last of Us закончилась. Печально? Есть такое.
Но каждый финал — это шаг в новую историю.
Рубрика не останавливается, ведь нас ждут другие сцены, другие герои, другая история, но созданная с помощью таких же приёмов монтажа, сценарных подходов и таких же планов.
А какой именно мир будет следующим, решите именно вы! Пишите в комментариях игры, а может и отдельные сцены разбор которых хотите прочитать, а я уже совсем скоро запущу опрос, который и решит, какая игра будет следующей. Это будет наша рубрика. Наши эмоции. Наш монтажный стол.
Потому что, если одна история окончена — это не значит, что всё прошло.
Это значит, что где-то уже начинается следующая.
❤🔥20❤3
Как переписать большой JS-проект на TypeScript и не попасть в дурку?
(никак)
Именно этим вопросом мы задались, когда наконец взялись за задачу, которая висела над нами годами: перенос Имперского Стражника на TypeScript.
Что это нам дало?
🔹 Во-первых — стабильность.
Прощай, магическое “а почему тут строка вместо числа?”, “а почему undefined превратился в пустой массив?”, “а почему всё вообще сломалось?”.
С TypeScript багов после обновлений стало меньше, и появилось то самое чувство уверенности в коде, которого так не хватает в JS.
🔹 Во-вторых — контроль и понимание.
Строгая типизация дала бонусы статического анализа, позволила чётче выстроить архитектуру и выявить уникальные случаи, которые раньше были размазаны по коду.
Мы смогли ввести интерфейсы, сделать код легче и... приятнее.
🔹 В-третьих — головоломки для ума.
В условиях многомодального микросервиса возникали кейсы, в которых даже GPT говорила: "Я не знаю как это сделать"
Но в итоге — всё реализовано. Всего один as unknown каст на весь проект. Почти честно!
🔹 В-четвёртых — побочные апгрейды.
Работа с типами докатилась и до других проектов: появились дженерики в rgcache, улучшены сцены в regraf, типизировано то, на что раньше не хватало мотивации.
📍 Где мы сейчас?
Мы прошли отметку в 50% TypeScript-кода в репозитории.
Пишем утилиты, абстрактные классы, бойлерплейты на все случаи жизни.
Но, пожалуй, главное счастье — утилита для маппинга телеграм-ошибок в enum, которая избавила нас от игры “угадай строку в description” и свела обработку ошибок к одной equals-проверке.
🧩 Что дальше?
Завершить миграцию, привести REST API в порядок (пока там лес, JS и безысходность) и, наконец, поставить в YouTrack статус - готово.
(никак)
Именно этим вопросом мы задались, когда наконец взялись за задачу, которая висела над нами годами: перенос Имперского Стражника на TypeScript.
Что это нам дало?
🔹 Во-первых — стабильность.
Прощай, магическое “а почему тут строка вместо числа?”, “а почему undefined превратился в пустой массив?”, “а почему всё вообще сломалось?”.
С TypeScript багов после обновлений стало меньше, и появилось то самое чувство уверенности в коде, которого так не хватает в JS.
🔹 Во-вторых — контроль и понимание.
Строгая типизация дала бонусы статического анализа, позволила чётче выстроить архитектуру и выявить уникальные случаи, которые раньше были размазаны по коду.
Мы смогли ввести интерфейсы, сделать код легче и... приятнее.
🔹 В-третьих — головоломки для ума.
В условиях многомодального микросервиса возникали кейсы, в которых даже GPT говорила: "Я не знаю как это сделать"
Но в итоге — всё реализовано. Всего один as unknown каст на весь проект. Почти честно!
🔹 В-четвёртых — побочные апгрейды.
Работа с типами докатилась и до других проектов: появились дженерики в rgcache, улучшены сцены в regraf, типизировано то, на что раньше не хватало мотивации.
📍 Где мы сейчас?
Мы прошли отметку в 50% TypeScript-кода в репозитории.
Пишем утилиты, абстрактные классы, бойлерплейты на все случаи жизни.
Но, пожалуй, главное счастье — утилита для маппинга телеграм-ошибок в enum, которая избавила нас от игры “угадай строку в description” и свела обработку ошибок к одной equals-проверке.
🧩 Что дальше?
Завершить миграцию, привести REST API в порядок (пока там лес, JS и безысходность) и, наконец, поставить в YouTrack статус - готово.
🔥16❤4👨💻1
🤔32🔥8😭5❤🔥2💊2❤1
Мы активно дорабатываем систему статистики и мониторинга, чтобы не просто чувствовать как живёт проект, но видеть это буквально на графиках.
Что умеем сейчас:
— отслеживать, когда и какие команды наиболее популярны
— понимать, насколько активен Лолофд (и не только, ведь стражник стал использоваться уже много где)
— реагировать заранее на сбои (или их попытки начаться) благодаря алертам
— и просто... залипать в красивые столбики и линии. У меня они теперь вместо скринсейвера
🔧 Появились и алерты — чтобы заранее ловить проблемы и не молиться, когда уже всё упало. Теперь мы получаем сигналы раньше и можем исправить до того, как станет больно.
📊 И да, вы тоже можете залипнуть в метрики (без алертов, но всё же) вот тут:
https://gf.redguy.ru/public-dashboards/e0e799d208844820bd772fdee8b136ca?orgId=1&refresh=5s
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26🔥3❤🔥2
А пока голосов в опросе всё ещё не хватает… давайте вспомним про нейронку, которую мы обучаем для Стражника.
Я уже не раз о ней рассказывал, показывал графики, а некоторые из вас даже видели её в действии в официальных чатах.
Но ведь хочется не просто смотреть. Хочется ПОТЫКАТЬ!
Сейчас мы тестируем обновлённое ядро, которое позволяет системе:
— запускать несколько инстансов бота одновременно
— роутить трафик между ними
— и, что важно, делать это без потери сообщений или производительности.
В качестве теста мы открыли публичный инстанс, через который можно проверить статус файла в системе или попросить нейронку проверить его, если раньше она его не встречала (пока только стикеры, но в скором времени будет больше форматов).
🔍 Потыкать руками можно здесь: @ImMediaGuardBot
Я уже не раз о ней рассказывал, показывал графики, а некоторые из вас даже видели её в действии в официальных чатах.
Но ведь хочется не просто смотреть. Хочется ПОТЫКАТЬ!
Сейчас мы тестируем обновлённое ядро, которое позволяет системе:
— запускать несколько инстансов бота одновременно
— роутить трафик между ними
— и, что важно, делать это без потери сообщений или производительности.
В качестве теста мы открыли публичный инстанс, через который можно проверить статус файла в системе или попросить нейронку проверить его, если раньше она его не встречала (пока только стикеры, но в скором времени будет больше форматов).
🔍 Потыкать руками можно здесь: @ImMediaGuardBot
🔥17🤗3🙉1😘1
Здесь не будет эпичных сражений, блекджека, кошкодевочек или всего того что вы привыкли видеть в больших тайтлах.Зато будет теплая история об отцовстве, дружбе и еде.
Главные герои — школьный учитель и его маленькая дочь Цумуги, пережившие смерть жены/матери. На протяжении 12 серий они учатся жить заново — в том числе через приготовление еды.
Каждое блюдо — это не просто рецепт, а повод вспомнить, почувствовать и сблизиться. От простых яичниц до сложных традиционных обедов, напоминающих о тех временах, когда мама была жива.
И да — еда там показана просто великолепно. Всё объясняется пошагово, и у меня теперь есть личная цель: повторить хотя бы одно блюдо в реальной жизни.
Мне — зашло сильно, надеюсь, вам тоже понравится.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰28❤7🔥5❤🔥2🏆2👏1
Бессонный кодер
Выбираем игру для рубрики
Голосование пока всё-ещё идёт (можете звать друзей и/или подписчиков чтобы ускорить решение), а это значит что мы можем опять поговорить о всяком! А о чём я люблю рассказывать? Конечно, о Стражнике и фейлах 😃
Как многие знают, у меня есть чатик который прикреплён к каналу и в котором я порой публикую мемчики или дополнительные материалы (не такие как в этом чате конечно :D)
И вот, вчера мы решили провести эксперимент, вместе с чатиком смотрели аниме "Форма Голоса", а вместе с нами его смотрела нейронная сеть которую мы тренируем и используем в стражнике.
И что получилось? Ну, как минимум я прослезился с сюжета😢
А если к техническим деталям, то аниме длится 2 часа 10 минут, за это время было 7803 ключевых кадра, на 403 ключевых кадра нейронка дала пометку о наличии NSFW, 13 кадров действительно содержали NSFW, погрешность модели составила 4,99% ложных срабатываний (причём чаще всего на ножки).
А если хотите не пропустить очередной холивар на тему дистрибутива линукса, языка или вот таких интерактивов, добро пожаловать в наш чатик :3
Как многие знают, у меня есть чатик который прикреплён к каналу и в котором я порой публикую мемчики или дополнительные материалы (не такие как в этом чате конечно :D)
И вот, вчера мы решили провести эксперимент, вместе с чатиком смотрели аниме "Форма Голоса", а вместе с нами его смотрела нейронная сеть которую мы тренируем и используем в стражнике.
И что получилось? Ну, как минимум я прослезился с сюжета
А если к техническим деталям, то аниме длится 2 часа 10 минут, за это время было 7803 ключевых кадра, на 403 ключевых кадра нейронка дала пометку о наличии NSFW, 13 кадров действительно содержали NSFW, погрешность модели составила 4,99% ложных срабатываний (причём чаще всего на ножки).
А если хотите не пропустить очередной холивар на тему дистрибутива линукса, языка или вот таких интерактивов, добро пожаловать в наш чатик :3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤🔥4❤3👏1👻1
Кстати, я упомянул фейлы, но не пояснил о них, давайте я расскажу интересную притчу об одном небольшом косяке который выдал неожиданные проблемы 😄
У нас в Стражнике сейчас потихоньку идёт полный перенос всей логики отправки сообщений в единую очередь, чтобы не было случаев когда одна команда выжрала весь рейтлимит и очередь ловит 429 на попытку отправить в нормальных пределах. Чтобы отправить задачу в очередь у нас используется несколько конструкций
Отправка через контекст:
Ответ через контекст (для случаев когда мы отвечаем на что-то в тот же чат и тот же тред):
Отправка вне контекста (ей к примеру пользуется отправка сообщений через API, когда у нас нет контекста обновления от ТГ):
А как под каптом работает этот метод?
Увидели проблему? Если нет, то не бойтесь, я тоже её не замечал пока она не воспроизвелась. await - корень нашего зла. Когда куча воркеров и ещё большая куча потоков внутри них начинают отправлять сообщения одновременно, согласно рейтлимитам очередь начинает троллить отправку, А НАШИ ПОТОКИ ЖДУТ ОТВЕТ ТЕЛЕГИ. В итоге у нас получается боттлнек когда из-за количества отправляемых сообщений, мы теряем в скорости обработке входящих. И это кстати случилось, но к счастью и удивлению - ночью.
Подкрепил в пост графики которые позволили нам обнаружить этот косяк. Вот так вот, порой ошибок от сервиса нет, но если глянуть график - понимаешь что ошибка есть, и это ты😢
У нас в Стражнике сейчас потихоньку идёт полный перенос всей логики отправки сообщений в единую очередь, чтобы не было случаев когда одна команда выжрала весь рейтлимит и очередь ловит 429 на попытку отправить в нормальных пределах. Чтобы отправить задачу в очередь у нас используется несколько конструкций
Отправка через контекст:
await ctx.sendMessage("command:admins", ctx.chat.id, await ctx.lang.t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});
Ответ через контекст (для случаев когда мы отвечаем на что-то в тот же чат и тот же тред):
await ctx.replyQueued(await ctx.lang.t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});
Отправка вне контекста (ей к примеру пользуется отправка сообщений через API, когда у нас нет контекста обновления от ТГ):
await Queues.getInstance().sendMessage("main", "command:admins", await Language.getFallback().t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});
А как под каптом работает этот метод?
let job = await this._sendQueue.add(name, {id, text, extra, target}, {priority});
job = await job.waitUntilFinished(this._sendQueueListener);
return job.returnvalue;
Увидели проблему? Если нет, то не бойтесь, я тоже её не замечал пока она не воспроизвелась. await - корень нашего зла. Когда куча воркеров и ещё большая куча потоков внутри них начинают отправлять сообщения одновременно, согласно рейтлимитам очередь начинает троллить отправку, А НАШИ ПОТОКИ ЖДУТ ОТВЕТ ТЕЛЕГИ. В итоге у нас получается боттлнек когда из-за количества отправляемых сообщений, мы теряем в скорости обработке входящих. И это кстати случилось, но к счастью и удивлению - ночью.
Подкрепил в пост графики которые позволили нам обнаружить этот косяк. Вот так вот, порой ошибок от сервиса нет, но если глянуть график - понимаешь что ошибка есть, и это ты
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔19💋4❤2🫡2❤🔥1🔥1