Бессонный кодер
5.17K subscribers
262 photos
47 videos
4 files
101 links
Канал разработчика и поисковика ДПСО LizaAlert

Связь: @sleeplessfeedbackbot или Direct канала (они бесплатные)
По рекламе: @dpp_ads
Купить рекламу: https://telega.in/c/sleeplesscode
Download Telegram
В нашем пазле, который готовит нас ко второй части, осталась последняя деталька, настало время обсудить и её. Джоэл расправился с врачами и подходит к спящей Элли, берёт её на руки и пытается отнести беспомощное тело в безопасность. Тут сценаристы используют приём «Конец и вновь начало» aka «Bookends», повторяя действия Джоэла и игрока из начала игры, как тогда, с Сарой. Это ещё раз подчёркивает нам что тут Элли уже окончательно прошла барьер между напарником и приёмной дочерью.

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

Есть ещё одна интересная цель, которая достигается подобным эффектом — дежавю у игрока, когда, выходя из лифа Марлин направляет на нас пистолет, ведь мы уже видели подобную сцену 15 (в идеале, но можно, как и я 100+ часов назад). Специально подкрепил для вас видео, просто посмотрите, как похожи эти сцены. Да ладно похожи визуально, если если вы синхронизируете начало этих сцен, то вы обнаружите невероятно интересную вещь, конец экшн части и начало более спокойной части (лесок/лифт) идут ПОЛНОСТЬЮ СИНХРОННО.

Марлин, несмотря на свою любовь к Элли, а как мы узнаем позже, она заботилась о ней с рождения, уже сделала свой выбор, согласившись на жертвоприношение на благо человечества. И тут идёт довольно важный для нас диалог.

Марлин: «Её не спасешь. Допустим, ты выберешься. Рано или поздно её разорвут щелкуны. Или бандиты изнасилуют и убьют»
Джоэл: «Это… Это не тебе решать»
Марлин: «Это её выбор. Ты ведь знаешь… Слушай, ты можешь поступить правильно. Ей не будет больно»

Марлин намекает Джоэлу очень важную мысль, которая станет основополагающей во второй части игры, принимает ли Джоэл решение позарез с желанием Элли? Хотела бы она спастись взамен разрушенных мечт на спасение от кордицепса? Но отце принимает окончательное решение в одностороннем порядке, решая самостоятельно, что будет лучше для его дочери, после чего стреляет в Марлин.
🔥19❤‍🔥5
Вот и закончилась наша небольшая история длинной в 3,5 месяца. История, которая началась с длинного плана и сцены потери любимого заканчивается сейчас. Надеюсь, вам понравилось, и вы открыли для себя много нового. Мне — очень.

За это время почти каждая сцена прошла под нашим зорким глазом, каждый взгляд, каждая нотка «All Gone» была разобрана, да, рубрика про геймдев и сторителлинг в The Last of Us закончилась. Печально? Есть такое.

Но каждый финал — это шаг в новую историю.

Рубрика не останавливается, ведь нас ждут другие сцены, другие герои, другая история, но созданная с помощью таких же приёмов монтажа, сценарных подходов и таких же планов.

А какой именно мир будет следующим, решите именно вы! Пишите в комментариях игры, а может и отдельные сцены разбор которых хотите прочитать, а я уже совсем скоро запущу опрос, который и решит, какая игра будет следующей. Это будет наша рубрика. Наши эмоции. Наш монтажный стол.
Потому что, если одна история окончена — это не значит, что всё прошло.

Это значит, что где-то уже начинается следующая.
❤‍🔥203
Как переписать большой JS-проект на TypeScript и не попасть в дурку?
(никак)
Именно этим вопросом мы задались, когда наконец взялись за задачу, которая висела над нами годами: перенос Имперского Стражника на TypeScript.

Что это нам дало?

🔹 Во-первых — стабильность.
Прощай, магическое “а почему тут строка вместо числа?”, “а почему undefined превратился в пустой массив?”, “а почему всё вообще сломалось?”.
С TypeScript багов после обновлений стало меньше, и появилось то самое чувство уверенности в коде, которого так не хватает в JS.

🔹 Во-вторых — контроль и понимание.
Строгая типизация дала бонусы статического анализа, позволила чётче выстроить архитектуру и выявить уникальные случаи, которые раньше были размазаны по коду.
Мы смогли ввести интерфейсы, сделать код легче и... приятнее.

🔹 В-третьих — головоломки для ума.
В условиях многомодального микросервиса возникали кейсы, в которых даже GPT говорила: "Я не знаю как это сделать"
Но в итоге — всё реализовано. Всего один as unknown каст на весь проект. Почти честно!

🔹 В-четвёртых — побочные апгрейды.
Работа с типами докатилась и до других проектов: появились дженерики в rgcache, улучшены сцены в regraf, типизировано то, на что раньше не хватало мотивации.

📍 Где мы сейчас?
Мы прошли отметку в 50% TypeScript-кода в репозитории.
Пишем утилиты, абстрактные классы, бойлерплейты на все случаи жизни.
Но, пожалуй, главное счастье — утилита для маппинга телеграм-ошибок в enum, которая избавила нас от игры “угадай строку в description” и свела обработку ошибок к одной equals-проверке.

🧩 Что дальше?
Завершить миграцию, привести REST API в порядок (пока там лес, JS и безысходность) и, наконец, поставить в YouTrack статус - готово.
🔥164👨‍💻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
🔥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
🥰287🔥5❤‍🔥2🏆2👏1
Бессонный кодер
Выбираем игру для рубрики
Голосование пока всё-ещё идёт (можете звать друзей и/или подписчиков чтобы ускорить решение), а это значит что мы можем опять поговорить о всяком! А о чём я люблю рассказывать? Конечно, о Стражнике и фейлах 😃

Как многие знают, у меня есть чатик который прикреплён к каналу и в котором я порой публикую мемчики или дополнительные материалы (не такие как в этом чате конечно :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❤‍🔥43👏1👻1
Кстати, я упомянул фейлы, но не пояснил о них, давайте я расскажу интересную притчу об одном небольшом косяке который выдал неожиданные проблемы 😄

У нас в Стражнике сейчас потихоньку идёт полный перенос всей логики отправки сообщений в единую очередь, чтобы не было случаев когда одна команда выжрала весь рейтлимит и очередь ловит 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💋42🫡2❤‍🔥1🔥1