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

Связь: @sleeplessfeedbackbot
По рекламе: @dpp_ads
Download Telegram
Media is too big
VIEW IN TELEGRAM
Вы когда-нибудь ловили себя на мысли, что персонаж говорит вслух то, что люди обычно прячут глубоко внутри?

«Я боюсь, потому что не умею любить».
«Ты для меня всё. Я просто боюсь тебя потерять».
«Я ненавижу себя за то, кем стал».

Звучит честно. Почти как на исповеди.
Но в какой-то момент вы в любом случае замечаете: это не работает. Это не разговор живого человека. Это — зачитанная под диктовку подводка к эмоции. Слишком прямо. Слишком откровенно. И потому — фальшиво.

🎭 По-настоящему сильные диалоги устроены иначе.
Они не вываливают всё наружу. Они намекают.

Ты слышишь фразу — а понимаешь не только её.
Ты чувствуешь, что внутри персонажа происходит нечто большее:
- он говорит одно,
- скрывает другое,
- а глубоко внутри бушует то, что даже он сам до конца не осознаёт.

📌 Так работает трёхслойный диалог:

Высказанное — прямой текст.
Невысказанное — подтекст.
Невыразимое — подсознание.

Примером такого диалога можно взять... конечно же TLoU :D
Элли: "Чего разлёгся?"
Джоэл: "Убиваю время".
Элли: "А мне что прикажешь делать?"
Джоэл: "Уверен, ты сама придумаешь".
Элли: "[вздох] Часы разбились".

А вы поняли подсознательный элемент этого диалога?
Фан факт, как-то так получилось, что я неформальный SMM в ST. Что я имею в виду? Ну… 75% ответов в сообществе ВК, по почте и в некоторых других способах связи идут от меня :D
И есть один частый вопрос, который нам задают: «Что нужно прочитать, чтобы стать сценаристом?» или его вторая формулировка: «Что нужно знать, чтобы попасть в команду сценаристом?». И зачастую – точно сформулировать ответ на вопрос довольно трудно, но я попытался.

Что нужно прочитать, чтобы стать сценаристом?

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

Пока вы не прошли через Шекспира, Толстого, Достоевского — вы не узнаете, насколько глубоко может быть слово. Пока ты не пережил что-то тяжёлое — утрату, предательство, аварию — ты не поймёшь, как живёт человек в момент, когда его мир рушится. Пока ты не столкнулся с травмой, не осознал её, ты не сможешь по-настоящему передать её другому.

Всё, что ты пережил, укладывается в твоих героях. В том, как они говорят, как молчат, как преодолевают себя.
А книги, фильмы и музыка становятся твоими спутниками в пути. Они учат слышать то, что не говорят, видеть то, что прячут.

Банально на своём опыте – пока я не попал в свою первую аварию, я представлял как я буду действовать, работать с аптечкой, которая рядом, применю средства из рюкзака. Но стоило мне попасть – минуты 3 я банально оглушённый лежал на дороге не в состоянии банально встать. Мысли перемешаны, непонятно что делать и это всё окружено страхом.
Воспользуемся админ-ресурсом :D

Как некоторые из вас знают (особенно те, кто ловил меня на просмотре каждую среду), я очень люблю Jet Lag: The Game.
Кстати, как вам последний сезон по Европе? И что думаете о следующем в NYC?

Так вот — спустя долгое ожидание, ко мне наконец-то прилетела невероятная вещица!

К чему я это?
Я ищу ребят из Москвы, кто хотел бы попробовать сыграть!
Любите общественный транспорт и прогулки по городу? Тогда вам точно понравится!

Что планируем:
Сначала — игра для себя, чтобы повеселиться и попробовать механику.
Может, заснимем пару кружков или коротких видео для воспоминаний.
А если зайдёт — подумаем над полноценной съёмкой!

Есть несколько условий:
- Строго 18+ (я не готов брать ответственность за несовершеннолетних).
- Готовность выделить целый день на увлекательные "прятки" (день выберем вместе, скорее всего выходной).
- Не бояться камеры, если вдруг захотим снять что-то серьёзнее.

Если интересно — пишите в @sleeplessfeedbackbot! :D
Media is too big
VIEW IN TELEGRAM
Почему метро в первом акте The Last of Us — один из самых напряжённых уровней?

Ты уже освоился. Был экшен, стрельба, бег. А потом — тишина. Вы спускаетесь в метро, и напряжение становится почти физическим.
Но почему оно так работает?

🎧 Звук — главный инструмент страха.
Щелкуны ориентируются по слуху, и именно звук становится игровой механикой. Треск в темноте — не просто атмосферная штука и способ ориентации щелкунов, а сигнал: ты на чужой территории.
Ты сам должен стать тише. Ты замолкаешь вместе с игрой.

🌑 Теснота как ограничение информации.
Ты почти ничего не видишь. Уровень не даёт тебе чёткого дальнего визуального контроля, только куски — комната, тоннель, лестница.
Это заставляет полагаться на слух и интуицию, а не на зрение — и делает ситуацию куда менее предсказуемой.

🎮 Игровой риск — оружие есть, но использовать его страшно.
У тебя есть патроны. Теоретически, ты можешь отбиться. Но выстрел привлечёт других.
Так игра вводит социальную цену за силу: применить силу — значит, навлечь ещё большую опасность, с которой ты наверняка уже не сможешь справиться.

В этот раз прикрепил вам не кинематографическую пробежку игры, а свой же геймплей с этого уровня, дорожку с микрофоном пришлось отключить, слишком уж меня напугал этот уровень :D
Это не совсем рубрика "что посмотреть во время миграции", скорее моя рекомендация :D

Gakuen Babysitters
начинается с трагедии — герой теряет родителей и оказывается не просто старшим братом, а фактически опекуном. Вместе с этим на него ложится забота о других детях в детском саду. Но это не драма, а тёплая история о том, как ребёнок заботится о ребёнке. О том, как любовь, даже неуверенная и уставшая, может держать мир.

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

Какое-то лето брат боится моря, в другое — его не вытащить из воды (и никогда не понятно откуда эта зависимость). Один год ты с ним, пока его рвёт, а через два — он уже бежит к тебе в слезах, потому что упал. И каждый раз ты держишься, потому что ты старший. Потому что для него ты — точка устойчивости.

Я сам - старший брат с разницей в 11 лет, пока смотрел это аниме, постоянно ловил себя на чувстве - а ведь реально так было... В целом, если вам предстоит стать старшим, то очень советую посмотреть, это аниме не даст вам полного представления, каково быть старшим. Но оно передаёт главное — ритм любви, усталости, заботы и бессловесной привязанности. Той, от которой иногда хочется выть, но которую не променяешь ни на что.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как многие замечают, я делаю много разных вещей почти одновременно. Работаю в ST, поддерживаю и развиваю Имперского стражника, делаю для вас и не только контент, поддерживаю других ботов... Но как я умудряюсь всё это делать?

В целом — это развившийся у меня навык, который можно сравнить с тем, что умеют тимлиды (меня, кстати, даже недавно приглашали на роль тимлида в одну компанию, но я отказался) D:

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

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

А если вы не такой трудоголик, как я, то и для вас есть очень важные слова — к примеру, о важности финансовой подушки.

В целом, ребят, мне очень самому понравился автор и контент канала, так что рекомендую и вам подписаться на Тимлида на удалёнке :3

Реклама. Нечаев А.А. ИНН 343605128044.
Media is too big
VIEW IN TELEGRAM
Когда мы встречаем Билла, мы видим не просто одиночку. Мы видим человека, который довёл до предела философию: "никому не доверяй, ни к кому не привязывайся".

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

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

Когда мы находим тело его единственного близкого человека, становится ясно:
Изоляция не спасает. Она медленно убивает.

Билл — это не просто персонаж. Это образ того, кем стал бы Джоэл без Элли.

И важный ответ игры:
В мире, где всё рухнуло, тебя спасут не стены и оружие. Тебя спасёт только связь с другим.
The Last of Us отказывается от мистики: никакой радиации, проклятий или зомби-вирусов.

В центре — реальный паразит, известный науке: Ophiocordyceps unilateralis, гриб, способный управлять муравьями.

Игра делает всего один допуск: этот гриб мутировал и стал поражать людей.
Но всё остальное — построено с пугающей правдоподобностью.

🍞 Вспышка по всей стране из-за заражения пищи.
🔬 Заражение через споры и укусы.
🧠 Поражение мозга — как у бешенства.
🦠 Рост мицелия внутри тканей — как при грибковых инфекциях.
👣 Поведение заражённых — меняется по стадиям, как при заражения паразитами.

Каждая стадия — логична:
Бегуны: паразит контролирует двигательную систему, ещё сохранились рефлексы, паника.
Сталкеры: паразит начинает работать с нервной системой, агрессия и скрытность.
Щелкуны: паразит почти полностью овладевает телом, слепота, с ориентацией по эхолокации.
Топляки: тело больше не функционирует — но гриб жив.

Кордицепс не пугает потому, что он фантастичен.
Он пугает, потому что слишком возможен.

Ты смотришь на заражённого — и понимаешь: это не чудовище. Это просто тело, которым уже управляет не твой мозг.
Сегодня с утра в Москве наблюдались масштабные перебои мобильной связи.
Сначала — сообщения от доверенного источника о DDoS-атаке на одного из крупных операторов, с происхождением вне РФ. А затем — почти полное исчезновение мобильного интернета с 11:00 до 12:00.

Я оказался в эпицентре. Что происходило технически:
- Пинг до dns.google — был, но с задержками до 2000 мс и потерей 30% пакетов.
- Traceroute обрывался на уровне базовой станции оператора.
- HTTPS/HTTP-соединения «умирали» на стадии TLS handshake.
- Кабельный интернет оставался рабочим.
- MTR фиксировал полный обрыв после внутренних маршрутов оператора.
- ping ya.ru — 100% потерь.

В 12:00 связь внезапно вернулась.

Что это было?
Скорее всего, из-за мероприятий ко Дню Победы и массовых скоплений людей (особенно у площадок проведения репетиций и парадов), операторам дали команду ограничить исходящий трафик. DDoS-атака могла стать катализатором или просто совпала по времени.

DNS-запросы к 8.8.8.8 были исключением — возможно, по технической необходимости или косяку.

И судя по сообщениям, ограничения могут продлиться до 9–10 мая.

Что делать если вы оказались в зоне отключений? Несколько советов:
0️⃣ Не паникуйте. Это временно, паника ещё никому не помогала, а вот навредить успела.
1️⃣ Осторожнее с арендой транспорта: электросамокаты, велосипеды и каршеринг могут зависнуть — вы можете подключиться к WiFi, а транспорт — нет.
2️⃣ Оффлайн-карты: если планируете поездки — скачайте GuruMaps или аналог, загрузите карту Москвы и нужных районов.
3️⃣ Наличные: часть терминалов оплаты работает по мобильной сети. При отключении связи оплата не пройдёт, так что лучше иметь запас наличных на экстренные расходы.

К сожалению, длительности сбоя не хватило чтобы я протестировал все гипотезы и методы которые могли бы помочь выйти на связь в таких условиях, но если шатдаун повторится, я обязательно протестирую и напишу тут что и как. И главное, будьте в безопасности и не теряйтесь. 🦊
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Подвал отеля — один из пугающих эпизодов в игре. Но по-настоящему важный момент происходит уже после, в вестибюле.

Джоэла внезапно атакует мародёр. Он тонет. Безоружный.
И его спасает Элли. Девочка стреляет в голову нападавшему.
Она не просто выживает — убивает, чтобы спасти.

Это не просто красивая экшен катсцена. Это психологический рубеж:
🎯 Для Элли — первое убийство человека, первый акт насилия, приведший к смерти ради другого.
🧱 Для Джоэла — первый пробой его эмоциональной стены.

До этого Элли была "девочкой, которую нужно тащить".
После — она становится партнёром.

Игра меняется:
Джоэл отдаёт ей винтовку — не просто оружие, а доверие.
Позже — пистолет: "на крайний случай".
В геймплее Элли чаще не стоит в стороне: а помогает в бою, отвлекает, спасает.

Это сцена, где встречаются взросление и принятие, нарратив и механика.
Naughty Dog показывает: настоящее сближение не в словах, а в действиях.
А вы знали, что долгое время во время разработки Элли вообще не должна была участвовать в боях?
Она оставалась в тени как неигровой персонаж, даже Эшли (актриса, сыгравшая Элли) была разочарованна этому. И с процессом разработки это стало расхождением геймплея и историю, которую хотели рассказать.
Тогда Нил Дакман решил что Элли должна быть таким же соучастником как Джоэл.

Когда Naughty Dog впервые ввели Элли в геймплей, всё выглядело логично.
Она была ребёнком рядом с Джоэлом, значит, должна была:
повторять действия игрока
получать ранения
просить лечиться
мешать в перестрелке — иначе не реалистично

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

Разработчики стояли перед дилеммой:
реализм — или привязанность?

И приняли нестандартное решение:
Элли стала «призраком».
Она незаметна для врагов. Не мешает. Почти бессмертна.

С точки зрения геймдизайна это — компромисс.
С точки зрения психологии — гениальный ход:
Игрок перестаёт злиться, а значит может эмоционально привязаться.
И тогда, в нужный момент, доверит ей жизнь — и винтовку.

Так была создана легендарная снайперская сцена, где Элли становится настоящим напарником.
Никто не раздражён. Все — вовлечены.

Идеальный союз механики и драмы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Порой меня спрашивают, какие баги в разработке максимально бывают мемные и глупые. Именно с таким багом я столкнулся и решил вам рассказать.

Для того чтобы отвечать вам за 30 миллисекунд, Имперский стражник кеширует некоторые данные в своей памяти, среди таких: базовые данные о пользователях и настройки чатов. И вот именно с кешированием чатов началась проблема. В последние пару дней вы могли заметить что после того как поменяли настройку чата, она применялась далеко не сразу.

Я начал искать почему это происходит. Для этого надо окунуться в логику настроек:
/**
* Обновляет значение параметра
*/
async updateSetting(ctx, param, value) {
const chat = await Database.instance.getChat(ctx.scene.state.chat);
const transformedValue = param.transform(value);

await Database.instance.updateChat(ctx.scene.state.chat, {
[param.id]: transformedValue
});
await this.saveAudit(ctx, param.id, transformedValue);
}

Вроде всё верно... А что в базе?
async updateChat(chat, data) {
const client = await this._pool.connect();
/** логика SQL запроса */
client.release();
await this._chatsCache.delete(chat);
}

И тут всё верно, в базе обновляется значение, после чего удаляется из кеша.
Я провёл эксперимент, обновил параметр и посмотрел в базу, значение новое и верное.

Убедившись в том что эта часть кода верна, я решил проверить генерацию сообщений настроек, вдруг там была ошибка, но нет, и там всё было верно, на этот момент баг был в процессе поиска уже второй день.

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

А кто в Стражнике отвечает за кэш? Правильно, я, вернее мой модуль rgcache. Давайте изучать проблему...
В библиотеке на текущий момент есть 3 вида кэша.
MemoryCache - хранит данные в оперативной памяти, работает полностью локально.
RedisCache - хранит данные в Redis, локально ничего не хранит и при каждом запросе делает запрос в Redis.
И их комбинация RedisSyncedMemoryCache - хранит данные в оперативной памяти, но если идёт инвалидация значения (оно обновилось), то через Redis посылает всем другим рабочим кешам задачу удалить у себя это значение.

Для хранения чатов как раз использовался RedisSyncedMemoryCache
Давайте посмотрим как он удаляет значения (для вас расписал построчно комментарии):
async delete(key) {
let entry = this._data.get(key); // Ищем значение локально
if (entry) { // Если значение найдено, то...
await this._options.preDestroy(key, entry.value); // Вызываем хук на удаление значения
this._data.delete(key); // Удаляем его
}
await this._pub.publish(this._name + ":invalidate", key); // Отправляет через Redis команду для всех остальных кешей инвалидировать это значение.
}

Хорошо, а как идёт инвалидация?
async _handleInvalidation(key) {
let entry = this._data.get(key); // Ищем значение локально
if (entry) { // Если значение найдено, то...
await this._options.preDestroy(key, entry.value); // Вызываем хук на удаление значения
this._data.delete(key); // Удаляем его
}
}

Вроде всё правильно, ошибок нет... А ПОТОМ СПУСТЯ 5 МИНУТ ПОДУМАТЬ Я ОСОЗНАЛ.

В качестве ключа чата я использую id чата, это отрицательное 64-битное число, число, ЧИСЛО. Так что происходило? Число становилось строкой! Ведь Redis при передаче данных через себя всё кастит в строку. И получалось что другие инстансы получали запрос на удаление строки... храня только числа. Вот так один тайпкаст в библиотеке заставил меня 2 дня перекапывать исходники стражника.

А увидеть код библиотеки и фикс вы можете даже сами, вот так, раз ошибся и ты ошибся.
https://github.com/RedGuys/rgcache/commit/ef610d4e6436a6b492e49b2c61a2cd8222ab2885