Dervish

exceptions vs error codes

simultaneously throwing AND returning error codes is a really shitty policy.
if a function routinely throws operational exceptions (which are expected and handled immediately on the upper level), it should never return error codes to indicate success/failure. Completion of normal execution path is assumed as successful.

if it returns error codes, it should never throw for operational flow control.

in general, exceptions + result return is preferable but ONLY IN THE PRESENCE OF ERROR HANDLING POLICY
most universal and applicable for service code is "catch only if absolutely necessary, the rest is caught and logged in main before abort"
Dervish

Unsong by Alexander Scott

https://www.goodreads.com/book/show/28589297-unsong

увидел эту книжку в треде в твиттере который был в стиле «вот щаз бы средневековую Матрицу с Алхимиками, пытающимися выбраться из божественного сна, преследуемыми разъярёнными ангелами». разумеется, сам тред я уже никогда не найду.

what I expected: Kabbalah-punk
what I got: Jew-wank

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

вроде и цитаты можно постить бесконечно (чего стоит Уриил, пытающийся починить континентальный дрейф и восстановить континенты из бекапа потому что кто-то ОПЯТЬ СВАРИЛ КОЗЛЁНКА В МОЛОКЕ, СКОЛЬКО РАЗ ГОВОРИТЬ), местами очень забавно и фантасмагорично, но в конечном итоге понимаешь, что вся эта фантастическая история относится к себе предельно серьёзно, и становится как-то не смешно. особенно буквальный ад с буквальными демонами и буквальными мучениями грешников сильно сбивает очарование. И ведь по сути на теодицею никак не работает, а служит исключительно формальным антагонистом.

очень странное аниме.
Dervish

Qt + MSBuild не видит инсталл

когда студия отказывается находить файлы Qt, это означает что плагин Qt VS Tools не создал правильно файл .vcxproj.user где он должен выставить переменную QTDIR в соответствии с настройками в Qt VS Tools → Qt Options / Qt Project Settings.

почему он этого не делает ,я не знаю
помогает сконвертировать проект в custom build steps а затем обратно, но если такой возможности нет, то спасёт добавление руками вот такую строчку в .vcxproj.user в каждую конфигурацию

<QTDIR>C:\Qt\Qt5.8.0\5.8\msvc2015</QTDIR>


при этом на билд сервере это не нужно, на дженкинсе эту роль выполняет переменная среды окружения
environment { 
 QTDIR = "C:\\Qt\\Qt5.8.0\\5.8\\msvc2015"
}
plot

Ruiner - игра про ВСЁ КРАСНОЕ

Очень атмосферный классический киберпанк. безумно крутой world-building и стиль. очень зло и кинематографично.
К сожалению сам игровой процесс состоит исключительно из боёвки. уровни очень пустые и примитивные.


история: 1/4. плохо. история на одну серию GitS SAC, и то мутновато и с натяжкой.
механика: 3/4. хорошо но мало. ебошь, стреляй, стрейфься, get up puppy. жирный + за вариант прокачки для медленных людей.
UX: 3/4. хорошо. драйвово, стильно.
самое лучшее: ебошить людей железной трубой всмятку
Dervish

SOMA - игра про лечебный фистинг анусов

очень крутая атмосфера и история, исключительно благодаря тому что называют environemntal storytelling. тонны воды над подводной базой «Пафос-2» и масса реалистичных деталей вокруг буквально давят тебе на голову.

определённо одна из сильнейших игр в истории на тему аплоада, хотя и подходит к этому с немного наивного фреймворка фантастики середины XX века, а технологический уровень не очень-то отличается от современности.
как будто не было «Блейма» или Райаниеми, а только-только вышли Дик и Азимов.

местами попдаются потрясающие вещи. когда ты обыденно, вручную, молча выкидываешь из симуляции не влезающие в память модули, отвечающие за разные аспекты VR (солнышко не влезает? нахер! а вот физику воды придётся оставить!), это в контексте безумно круто.

а вот когда начинается ебанина с нытьём про две копии «кто из них оригинал», это старо и неинтересно.
мне кажется любая история про аплоад должна смириться с Фон Нейманом и просто принять, что единственность и уникальность обечспечивается на уровне протокола, а не субстрата.
без этого допущения любые «серьёзные экзистенциальные вопросы» на тему искусственного субстрата для разума звучат одновременно очень по-детски и старомодно :(

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

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

полная беспомощность - идея охуенно плохая. System Shock 2 был очень вполне себе страшный, хотя твой персонаж далеко не беспомощен.
Soma местами очень напоминает System Shock 2, ну ровно до того момента, когда оказывается что ружья-то у тебя нет.
ближе к концу игры даже прятаться особо теряет смысл - проще и быстрее несколько раз попробовать, чем корчитьcя часами выглядывая из-за угла.
с проксями в лабораториях Теты ползать ещё реально (иногда отключал звук), но вот Йошида как раз именно при попытке играть «как надо» просто не оставляет тебе шансов.
я не знаю, как в это предполагалось играть, я почти дропнул.

графоний плохой, переходящий в очень плохой.
он был полностью сделан с упором на LDR - очень большие куски игры отрисовываются только светом на фоне тьмы, а мне это в динамике в 3D очень неприятно.
не «страшно», а на уровне как будто прям вестибулярных ощущений неприятно бегать по кускам сплошной черноты.
при попытке добавить гаммы и яркости всё предсказуемо выглядит омерзительно плоско, как будто-то какой-то хай-поли римейк half-life

подводные пешие секции очень хороши. пожалуй, это настолько же хорошо как когда-то впервые сделали космос в Dead Space 1.

монстры по дизайну хорошие, но тот факт что нарратив почти полностью обходит их стороной всё время звучит очень странно. «просто не смотри на него, ну и норм», говорит Катя. Ну подумаешь, чудище.
телепортирующийся диско-монстр так и вовсе выглядит глюком, пока ты не натыкаешься на него патрулирющего тесные коридоры затонувшего корабля. Вот нафига глюку ходить по коридорам, а?

модели людей омерзительные. авторы понимают это и стараются их нам всячески не показывать.

история: 3/4. хорошая фантастическая драма с твёрдыми корнями в реальности. философски немного в прошлом веке, ну да ладно.
механика: 1/4. обыски шкафчиков и нажимание кнопок. кидание стула в окно. выглядывание из-за угла.
UX: 2/4. судя по отзывам в интернете, это чуть ли не воплощение идеала хоррора. видимо, я не люблю хоррор.
самое лучшее: разговоры Саймона и Кати. очень люблю это решение, когда есть персонаж поддержки, с которым как будто идёт диалог.
Dervish

добил Rain World

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

циклопических масштабов пиксельный постапокалиптический эксплор/экологический сюрвайвал хоррор.
реалтаймовый физический движок с инверсной кинематикой (все персонажи и особенно твой слизнекотик очень мило обминаются об препятствия, раскидывают щупальца, потрясающе реалистично шлёпаются в воду)
тебя пытаются съесть хищники, ты пытаешься противопоставить этому хитрость/юркость/заострённую арматуру/личную армию кобольдов с заострённой арматурой, ну или кинуть хищнику другую еду/натравить хищников друг на друга.

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

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

я совершенно серьёзно ожидал потратить на это несколько лет
но внезапно мне удалось отнестись к игре и её неудачам очень спокойно, без разочарований - что иронично, учитывая лор игры 50% жёсткая фантастика и 50% поиск выхода из сансары в планетарных масштабах.
этот имеющийся лор, кстати, можно получить только после серии чудовищно трудных и неочевидных фетч-квестов. и кстати не то чтобы основной квест был очевидным, хаха!

конечно, во многом это спокойствие от сейв-скама (позволяет отменить механику наказания за смерть)

это гигантский открытый мир, но не метроидвания - ты не получаешь никакой прокачки, вся прокачка приходит от умения управлять (физический движок не прощает шапкозакидательства и делает каждый момент уникальным... часто в плохом смысле).
оно однозначно стоит того, но нужно сразу привыкнуть к идее gotta go slow, быстро пробежать парочку уровней не выйдет. По сути дела, твоё основное оружие против хищников - знание географии. Не зная карты, ты беспомощен.

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

В целом очень атмосферно, изысканный и утончённый саунд-дизайн

история: 3/4. фантастическая часть отличная. спиритуальная - ну ээээээ.... такое...
механика: 5/4. уникально И при этом охрененно.
UX: 4/4. очень круто, но только для очень терпеливых

и никто и никогда в это играть не будет, пототму что просто песец как жестоко и трудно. тру хардкор.

Dervish

про стекло

https://wordpress.lensrentals.com/blog/2011/12/reflections-on-reflections-the-most-important-part-of-your-lens/
хорошо про просветления


https://www.lensrentals.com/blog/2017/10/the-8k-conundrum-when-bad-lenses-mount-good-sensors/
отлично про системную и линзовую передаточную функцию, и про механизм алиасинга как как присутствия значимых величин MTF за частотой Найквиста (OLPF подавляет MTF именно за Найквистом, и именно повышением значения пространственной частоты Найквиста математически описывается тот факт что современные сенсоры высокого разрешения не дают алиасинга)

https://www.lensrentals.com/blog/2015/09/a-clear-history-of-glass/
просто очень мило про историю стекла
Dervish

Высокоуровневые интерфейсы для работы с базами данных из С++

Высокоуровневые интерфейсы для работы с базами данных
в основном делятся на два вида:

API Wrapper - решают задачу унификации, прячут клиентские библиотеки различных БД за единым высокоуровневым С++-интерфейсом). У библиотек первого типа обычно широкая поддержка различных баз данных
EDSL (Embedded Domain Specific Language) - пытаются избавиться от SQL, заменив его на нативные типобезопасные выражения. Библиотеки этого типа как правило поддерживают очень скромный набор баз данных, можно реально рассчитывать только на Postgre и Sqlite

QSqlDatabase
API Wrapper http://doc.qt.io/qt-5/qsqldatabase.html

легко доступная, простая в использовании библиотека, — если ты уже используешь Qt
странноватые архитектурные решения - единый синглетон-реестр подключений, зачем-то прячущий от тебя уникальные объекты сессий к БД, но никак не избавляющий от необходимости работы с ними
обширный набор бэкендов DB2, Interbase, MySQL, Oracle, ODBC, PostgreSQL 7.3+, SQLite 3 & 2

SOCI
API Wrapper https://github.com/SOCI/soci http://soci.sourceforge.net/doc/3.2/

живой
имитирует Embedded SQL и биндинг в достаточно простом, удобном и интуитивно понятном виде.
достаточно старая, но вроде бы до сих пор поддерживаемая библиотека.
зависит от буста, предоставляет некоторые интеграции (boost::optional, tuple, vector)
подлкючение только в своём потоке / пул подключений
бэкенды Oracle PostgreSQL MySQL SQLite3 Firebird ODBC DB2
не тестировал

SQLAPI++
API Wrapper http://sqlapi.com/

примитивный, многословный и типонебезопасный интерфейс
странно, но живой
очень обширный набор бэкендов Oracle, SQL Server, DB2, Sybase, Informix, InterBase, SQLBase, MySQL, PostgreSQL, SQLite, SQL Anywhere and ODBC
не тестировал

ODB
API Wrapper + кривоватый EDSL
https://www.codesynthesis.com/products/odb/ документация и подробное объяснение

Вероятно, единственный контестант, более-менее подходящий под роль «ORM»
Фокусируется на перзистентности С++-объектов, синтаксис выполнения запросов функциональный, но не супер-красивый
полуавтоматический генератор бойлерплейта: декларативная часть (объявления структур С++) делается вручную, специальный генератор генерирует функциональную часть (реализацию сериализации)
Рабочая интеграция с типами Boost и Qt
бэкенды MySQL, SQLite, PostgreSQL, Oracle, and Microsoft SQL Server
ODB ставит в прямое соответствие 1 relation = 1 объект. Все атрибуты объекта доступные для обращения в С++ должны возвращать что-то. Исключением являются ссылки на другие relations, которые по умолчанию представляются в виде атрибутов объекта shared_ptr/weak_ptr, и могут быть загружены лениво, если использовать odb::lazy_shared_ptr/lazy_weak_ptr
то есть (внимание!) гранулировать запросы нужно не на уровне select полей в строке (relation), а на уровне таблиц
также при большом желании объекты могут быть разделены на секции с ленивой подгрузкой, но это скорее анти-паттерн
- работает очень хорошо и удобно, но развернуть билд не очень просто по сравнению с «бесплатной» QSqlDatabase
- потрясающее качество документации

[Redacted]
API Wrapper / рудиментарный и очень конкретно-предметный EDSL

некоторая интеграция с типами Qt (QDateTime, QString)
уникальная фича: предоставляет доступ к blob-полям в виде к QIODevice, реализуя ленивый random access
плата за это - сложные платформозависимые ритуалы доступа к blob-полям
документация отсутствует
весь функциональный бойлерплейт генерируется человеками
бэкенды Linter и Oracle

sqlpp11
EDSL https://github.com/rbock/sqlpp11 примеры использования и документация

очень красивый, современный EDSL на с++11 с сильным фокусом на типобезопасности
бэкенды PostgreSQL, MySQL, sqlite3, бета-ODBC и необычная опция STL Container
болерплейт (статические C++-типы записей) генерируется питоновским скриптом из DDL
маленький минус: ничего не работает (билд глючный, бэкенды не собираются, неясно как подключить бэкенды)

Quince
EDSL http://quince-lib.com/ (QUeries IN C++ Expressions)

современный EDSL на С++11 с сильным фокусом на компонуемости сложных запросов
поддерживает частичный select, использует boost::optional
полностью изолирует пользователя от работы SQL, даже на этапе создания базы данных. весь код, включая создание таблиц — это высокоуровневый клиентский код.
при работе с таблицами поддерживается инвариант - если вызов open() для таблицы выполнился, значит она есть и именно такая, какую ожидает наш код.
бэкенды PostgreSQL, Sqlite
не тестировал
Dervish

о разнице между State и Status

State это строго технический термин, используемый много где в технике для обозначения всего, что не может быть описано чистой функцией, то есть, грубо говоря, всего может изменяться во времени.
Например, когда физики говорят что «энергия это функция состояния», это означает что энергия зависит только от ТЕКУЩЕГО состояния, но не от истории его изменения.
В кодинге мы «состоянием» называем по сути дела любые переменные.

Status это более человеческий термин, обозначающий не «истинное состояние», а «характеристику». Необязательно даже строго объективную. Статус может не соответствовать действительности (например, индикаторная лампочка может врать)