1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
😁37🤔4👌1🤡1
😁22👌3👍2💯1🍌1
#prog #rust #rustasync #article

How big is your future?

О способах отслеживания больших футур, и в рантайме, и на этапе компиляции. Кстати, вы знали, что tokio::spawn автоматически боксит большие футуры, и через tokio-console можно получить информацию об этом?
👍3
#prog #rust #csharp #article

A comparison of Rust’s borrow checker to the one in C#

В C# есть явно ссылочные аргументы функций, переменные и поля, которые объявляются с префиксом ref. Помимо всего прочего, это позволяет передавать ссылки на размещённые на стеке данные. Разумеется, при отсутствии каких-либо проверок это небезопасно и позволяет получить висячую ссылку.

Для того, чтобы не допустить подобного, в C# есть свой статический анализатор. В данной статье автор сравнивает этот анализатор с borrow checker из Rust и разбирает, в чём этот анализатор слабее (и в чём неожиданно сильнее).

Лично мне напомнило немного про Oxidizing Ocaml, но в C# способов управления ссылками поменьше.
👍4🌚2
this implies the existence of cringe pointers
#ойти #vercheniye
👏20
Как общаются программисты

Source
👍4🤣31🍌1
Оригинальный нейминг
4
#game

Как обычно выглядит квест? Персонаж под нашим управлением ходит по локациям, собирает предметы в разных местах и использует их в других местах. Иногда для получения предметов нужно говорить с другими персонажами и выяснять, что им нужно.

А что, если вы... Не понимаете, что вам говорят?

Именно от этого отталкивается игра Chants of Sennaar, вышедшая в сентябре 2023 года.
11🤔2
Сенаар (или Шинар) в библейской мифологии — земля, в которой жили люди, начавшие строить Вавилонскую башню. Это название не случайно: всё действие игры происходит внутри исполинской башни, возвышающейся к небесам. Эту башню на разных уровнях населяют несколько различных народов, каждый со своей культурой и, что важно, своим языком.

Каждый язык поначалу абсолютно непонятен. Раскрывать смысл языков приходится косвенным путём — через вывески, фрески, наблюдения за чужими разговорами... Для облегчения этой задачи у главного героя есть при себе тетрадь, в которую он записывает каждое новое слово. К ним можно приписать догадки о возможных значениях слов, и тогда каждый раз при наведении курсора они будут подсвечиваться под соответствующими символами.

К счастью, гадать всю игру о смыслах не обязательно — тут есть помогающая механика (похожая на аналогичную из Return of the Obra Dinn). Каждый раз, когда игрок собирает пачку символов из одного языка, главный герой зарисовывает в тетради страницу, иллюстрирующую различные понятия. Если перетащить в слоты рядом с ними корректные символы из словаря, верно обозначающие понятия, то игра закрепляет их на месте и выдаёт напрямую истинные значения. После этого для предложений, которые состоят полностью из известных символов, будут в подсказках корректно переведены на язык, на котором вы играете (русскоязычная локализация тоже есть). Почивать на лаврах, впрочем, не придётся — у каждого народа полностью свой язык, отличающийся и лексикой, и грамматикой. При этом некоторые слова есть не во всех языках.

Ощущения от того, что ты смог только что сложить смыслы, о которых ты имеешь лишь смутное подозрение, и получить корректный ответ — невероятны. Да, номинально это в основном пазл, но они обычно не дают столь глубокого чувства удовлетворения. Разработчикам удалось достаточно хорошо выдержать баланс сложности — всю игру вполне реально пройти, полагаясь исключительно на свои мозги. Судя по ачивкам в Steam, игру прошли 55% купивших её игроков — и это, если что, прям дохрена.

Выглядит игра прекрасно — в картинке используются чистые тона, местами градиенты и полоски вместо затенения, а сами объекты на локациях имеют обводку. У каждого яруса башни своя собственная палитра, позволяющая на глаз прикинуть, где расположена локация.

Более подробно об игре рассказывается в этом видео от Game maker's toolkit, но там немного больше спойлеров. В частности, там для иллюстрации показывается решение самой первой загадки в игре.

Разумеется, обзор был бы неполным без упоминания недостатков.

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

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

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

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

Ну и, разумеется, как и все квесты и пазлы, игра одноразовая: проходить заново имеет смысл разве что для сбора ачивок.

Существенны ли эти недостатки? Я бы сказал, что нет (кроме первого), так что всячески рекомендую Chants of Sennaar. Благо, она достаточно небольшая, чтобы её при желании можно было пройти за пару-тройку вечеров.
❤‍🔥1👍1
А ещё, как я уже говорил, Chants of Sennaar просто прекрасно выглядит.
🤩63
Игнорируйте всё, что я сказал выше, в Chants of Sennaar можно погладить кошку, всё, это игра десятилетия.

fxtwitter.com/CanYouPetTheDog/status/1704198156940943558
🥰97
Forwarded from Pragmatic Programmer (Nikita Bishōnen)
Итак друзья, вопрос к вам (но только тем, кто не пишет на Rust), как вы в своём языке напишите код, аналогичный следующему?


if let Ok(collection) = Collection::try_from((collection_metadata, traits)) {
result.push(collection);
}


Разъясню что он делает. В случае, если у нас не получилось сконвертировать метаданные коллекции и её типажи, мы не делаем ничего. Если же оперция прошла успешно, мы добавляем её результат в коллекцию.
🤔3
Forwarded from Pragmatic Programmer (Nikita Bishōnen)
Я противник того, чтобы доходить до максимума в вопросах копирования кода. Неверная абстракция обычно намного дороже чем копи паста. Однако есть моменты, которые хочется оптимизировать. Например трассировка вызовов методов и их инструментация.

Для этого я пользуюсь instrument атрибутом от tracing библиотеки. Каждая важная функция имеет плашечку инагента :


#[instrument(err(Debug), skip(executor), ret, level = "trace")]
fn insert(...) -> Result<...> { ...


Но есть проблема, каждый раз писать схожие аннотации, вспоминая точный синтаксис, это бывает утомительно и точно непродуктивно. Как же я был сегодня рад найти молодую утилиту для моего #toolkitattr_alias.

Как же её готовить? Создавайте файл src/attr-aliases.txt (даже если у вас workspace — я думаю скоро я или автор поправим это) и пишите в нём алиас, я написал: *db_instrument=instrument(err(Debug), skip(executor), ret, level = "trace")

Далее — идём в код и используем его:

#[attr_alias(db_instrument)]
pub async fn select_...<'a, E>(...: &str, executor: E) -> Result<...>


Вуаля, теперь я могу использовать маленький алиас вместо грузного объявления всего, что мне нужно.

А ещё у этой утилиты нет зависимостей, кроме стандартной библиотеки Rust. Очень котирую и всем советую. Дай бог поменьше зависимостей, да будут мои билды быстрыми, аминь 🧎🤲
🔥5🤔5🤮1