ASCII-Nova 🇺🇦
92 subscribers
1K photos
42 videos
9 files
440 links
предложка: @ascii_nova_suggest_bot

Гиковство && занудство, инди-музыка, геймдев и непрошенные советы

Чат, где мы обсуждаем код и всё около него: @ascii_nova_chat
Download Telegram
Обычно, Rogue-like игры имеют поле квадратное, но я решил ради интереса попробовать сделать из шестиграников (хексагонов)

В поисках описаний алгоритмов для поиска пути (A*) для сеток из хексов, наткнулся на статью https://www.redblobgames.com/grids/hexagons/ от Amit Patel.

Просто потрясающая статья да и сам блог с прекраснейшими объяснениями разных алгоритмов, нужных для геймдева, и их интерактивной визуализацией
🔥3🫡1
ASCII-Nova 🇺🇦 pinned «Йоу-йоу! Меня зовут Дима и я программист из Киева Не умею начинать и заканчивать общение, поэтому сразу к делу — завёл этот канал, чтобы делиться и обсуждать с вами: - разные глубокие и не очень аспекты программирования - интересную инди-музыку, которую…»
2023-06-08 15-28-46.webm
79.4 MB
Записал небольшое видел на тему git, по просьбе

Скину еще и сюда, кому-то может оказаться полезным + будет как архив

Что в видео:
- Как изменить существующий коммит в ветке
- Почему это бывает нужно
- Какие есть способы это сделать
- Как сделать через GUI (на примере Jetbrains IDE)
- Как сделать через терминал

Для миддлов+ рассказы про interactive git rebase это известные вещи, а тем кто знакомиться и учиться может быть оч полезно

PS. Я не часто пишу скринкасты, поэтому советую смотреть на х1.5-2, т.к. кажется что медленно говорю
👍2🫡211
Небольшие весточки с полей

Закончил более-менее начальный вариант обёртки над js-движком (v8). Теперь можно создавать много разных сред параллельно существующих сред выполнения, которые не влияют друг на друга. Примерно также работают вкладки в браузере, только менее изолировано, исходя из v8 API (на удивление!).

На 1-3 скринах видно, как выполняется код, запоминает прошлое выполнение и не падает от внутренних ошибок (что особенно важно, т.к. что живёт в песочнице, ни в коем образе не должно влиять на сам сервер/приложение).
🏆3🔥1
ASCII-Nova 🇺🇦
Небольшие весточки с полей Закончил более-менее начальный вариант обёртки над js-движком (v8). Теперь можно создавать много разных сред параллельно существующих сред выполнения, которые не влияют друг на друга. Примерно также работают вкладки в браузере,…
Конечно знатно местами взрывался мозг от v8 API (4 скрин), где всё нужно оборачивать в разные scope: HandleScope, TryCatchScope, ContextScope, etc. Оно вроде бы логично, т.к. в JS есть сборщик мусора, который всё чистит внутри себя и у себя, но вообще беспомощен, когда его просят убрать за его пределами.

Это правильно и очевидно, т.к. на то среда JS и называется управляемой (managed), а нативный код неуправляемым (unmanaged). Благо всё же управлять им получается после чтения документации и пережитой боли от 100ни неудачных компиляций и 1000 запросов в гугл, чтобы понять, что нужно просто читать документацию внимательно. Ладно, это всё шутки. Нужно было читать еще исходники deno и прочих проектов, чтобы понять, как это использовать :)

Если пару слов про v8 API и почему так всё обстоит: к каждому scope привязываются JS объекты. Как только мы "отдаляемся" от нашего конкретного scope'а (выходим за пределы области видимости, например выходим из функции где он располагается), то происходит маркировка созданных JS объектов как готовых к очистке при помощи сборщика мусора.

Но чтобы привыкнуть к этому, что scope на scope, который закрепляется еще сверху scope, нужно было постараться, т.к. в результате очень бьёт по рукам, когда пытаешься передать в Rust коде JS значение куда-то дальше от места, где оно было получено.

В этом кстати, плюс Rust — если бы я писал на С++, то вместо ошибок компиляции, ловил бы креши и вспоминал, почему я не люблю и перестал на них писать после долгой работы
🤯1😱1🥴1
ASCII-Nova 🇺🇦
Небольшие весточки с полей Закончил более-менее начальный вариант обёртки над js-движком (v8). Теперь можно создавать много разных сред параллельно существующих сред выполнения, которые не влияют друг на друга. Примерно также работают вкладки в браузере,…
Кстати, вопрос пишущим на JS:

Мне необходимо ограничить всячески любое асинхронное взаимодействие. Я выпилил setInterval, setTimeout, частично Promise*. Но на этом моя фантазия сегодня закончилась

Как еще можно порождать асинхронный/отложенный код в JS? Напишите в комментариях идеи/мысли пж

* Частично, т.к. асинхронные функции в результате вызова дают Promise. Пока не придумал что с этим делать :(

UPD: перепроверил, спасибо за советы!
🤔2👍1
Очередная подтверждение для меня, почему я с уважением отношусь к сони (да, я сонибой, если вы забыли).

Каждый месяц, они оплачивают мне подписку на сетевые сервисы (причём не самую дешевую, а с огромным каталогом игр)

Сони ван лав
🕊6
ASCII-Nova 🇺🇦
Кстати, вопрос пишущим на JS: Мне необходимо ограничить всячески любое асинхронное взаимодействие. Я выпилил setInterval, setTimeout, частично Promise*. Но на этом моя фантазия сегодня закончилась Как еще можно порождать асинхронный/отложенный код в JS?…
Пишу сейчас асинхронный рантайм сервера (+ пуллпотоков для тяжёлых задач) и подумал, а сколько времени все "тесты" выполняются

Ожидал конечно, миллисекунды, но когда увидел (!) микросекунды (а это напомню 0.000_001 секунды!) вообще удивился

Вау *-*

UPD: это еще дебаг билд, в релизе на 150-300µs быстрее — ~400-500µs
👏3😱1
Сегодня планировал написать небольшой пост про асинхронные рантаймы в Rust, но пока что не срослось

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

Ryo Fukui, джазовый пианист, который очень круто наваливает. Если хочется сложной по звучанию музыки, которая щекочет нервные окончания, это самое оно

Трек Early Summer из альбома Scenery (シーナリィ) просто невероятный!
2❤‍🔥1👍1
Начиная с этой пятницы, будет новая рубрика: веб-комикс, который меня тронул. может даже, дважды в неделю
👍1🤗1
(с) PBFcomics
👍2🤔1
(с) PBFcomics / Ellis Rosen
🤯1😢1💔1
сегодня с психоаналитическим уклоном :)
### Небольшая история про Rust-каналы и асинхронные функции

Предыстория: когда-то обсуждая* горутины из Golang с позиции их взаимодействия с друг другом, мне показалось неудобным, что всё взаимодействие идёт исключительно** через каналы. Видимо, я тогда был разбалован долгой работой на Nodejs и в целом JS Promise'ами, которые позволяли просто возвращать результат.

В чём проблема передавать канал как аргумент? Конечно ни в чём на самом деле, но хотелось бы иметь возможность получать результат как через обычную функцию, через возврат. Иными словами, вопрос эстетики/эргономики + небольшого снобизма.

Почему я вспомнил эту историю?

Мне, уже на Rust, потребовалось запускать отдельные OS-потоки*** в detached (отвязанном) для каждого отдельного JS runtime. Т.к. я не могу дожидаться завершения потоков (они работают, пока их не попросят остановиться), то чтобы получить результат мне приходится использовать каналы (прямо как в Golang).

Но чем хорош Rust, при желании могу сделать функцию — см. скиншот. И как пользователь этой функции буду использовать просто результат, не думая как он вообще получается — из канала, из другого потока, из другого асинхр... в общем, не думая как этот black box работает.

В общем удобно и мой внутренний задротский педант рад :)

Расскажите в комментариях, как радовали недавно своего внутреннего кодового педанта :)



* Разговор был давно, могу что-то упускать, т.к. Golang я только читаю, но не пишу
** Если нет, расскажите в комментариях
*** К сожалению, специфика работы Rust-обвязки вокруг JS-движка.

С одной стороны очень расточительно иметь целый поток, с другой стороны, они стартуют только в самом начале.
К тому же, планировщик Linux супер-круто раскидывает работу по ним (потокам процесса).

Или Linux стал лучше, или у меня железо мощнее стало, или всё вместе — что в итоге не создаёт проблемы.

Раньше, когда я был С++-бекендером, меня таким можно было пугать как скримером :)
🔥4👍1