nataraj: (Default)

Goblin Camp — попытка создать опенсорсный клон игры Dwarf Fortress. Смысл игры в управлении поселением Гоблинов (или в оригинале Гномов), при этом управления косвенного, в игре не предусмотрено прямого управления Гоблинами/Гномами, можно лишь ставить задачи в общем виде, а вот как подопечные поведут себя в результате — вопрос мастерства организации...

https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23

Изначально Goblin Camp написал некто Ilkka Halila, в 2010, повозился с ней годик и забросил. Мне как любителю Dwarf Fortress, Rim World и прочих симуляторов колоний с непрямым управлением, постоянно хотелось запустить в них руки, но сильно останавливала закрытость кода. Возможность писать моды есть, но тратить свое время на разбирательство в закрытом коде, я считаю неуважением к человечеству, поэтому стараюсь избегать к этого… И вот я в какой-то момент таки нашел ту программу в которую запустить руки не зазорно.

На тот момент Gobln Camp была давно заброшена и категорически не собиралась на современных дистрибутивах. Пришлось приложить не нулевое количество усилий, чтобы оно заработало и задышало.

Этот релиз закрывает проблему с работой графических тайлов. Оригинальная версия от Ilkka Halila использовала библиотеку SDL версии 1, а сейчас доступна только SDL2. Пришлось разбираться и переделывать.

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

Самый лучший баг был такой: если устроить перетаскивание и перемещать мышь строго влево-вверх, то при отпускании кнопки мыши, оно дополнительно срабатывало как однократное нажатие левой кнопки. Если был хоть раз в процессе вильнул вниз или вправо, эффекта не возникало.

Плюс современная библиотека libtcod (которая лежит в основе движка игры) на этот старый код выдает кучу deprecation-warning’ов. Начал их постепенно зачищать…

Оригинал

nataraj: (Default)

Я не возьмусь определять что мне более отвратительно libboost или python. Но право скажу собранные вместе в boost::python они производят на свет субстанцию непревзойденного свойства.

 #include <boost/python.hpp>
 #include <stdio.h>

int main()
{
  Py_InitializeEx(0);

  boost::python::object modMath = boost::python::import("math");
  boost::python::object cosFunc = modMath.attr("cos");

  Py_Finalize();
}

С 2.7м питоном работает нормально, с третьем падает с невнятной ошибкой при отработке хуков при выходе...

Историю с локализацией места проблемы в портируемой программе с последующим вынесением в приведенный standalone, я опущу из-за малосодержательности и нецензурности... Скажу только, что gdb плюс правильно выбранные места для breakpoint'ов рулят.

Далее в процессе плясок вокруг этого примера вдруг обнаруживаю что вот так не падает:

int main()
{
  Py_InitializeEx(0);
  {
    boost::python::object modMath = boost::python::import("math");
    boost::python::object cosFunc = modMath.attr("cos");
  }
  Py_Finalize();
}

Ага! думаю я. Оно позвало деструктор до финалайза а не после и все перестало падать... Надо сделать так же!

Но вот проблема... аналог переменной cosFunc в портируемой программе глобальная... Создается пустая, а потом после инициалайза заполняется. Можно было бы раскинуть мозгами, как запихнуть туда указатель вместо самого объекта, и сказать ему в нужный момент delete. Но менять весь остальной код очень не хотелось...

А нельзя ли так, чтобы для сложного объекта вызвался деструктор а сам объект опять заполнить пустым значением?

Оказывается можно:

int main()
{
  Py_InitializeEx(0);
  boost::python::object cosFunc;
  {
    boost::python::object modMath  = boost::python::import("math");
    cosFunc = modMath.attr("cos");
  }
  cosFunc = boost::python::object();
  Py_Finalize();
}

оно заменяет сложное значение cosFunc тривиальным, при этом для заменяемого значения вызывается деструктор.

И вот так -- тоже не падает...

P.S. Отдельно доставила рекомендация документации на 1.55 boost::python просто не вызывать Py_Finalize(), типа не надо вам это.

P.P.S. Пришел к мысли что сам питон не падает только потому что и так ползает. And you should not boost it.

P.P.P.S. Честно говоря не верил, что осилю с этим разобраться. Без знания, что буста, что питона... Ан нет, получилось...

nataraj: (Default)
#include <Python.h>

int main()
{
  Py_Initialize();
  Py_Finalize();
}

Собрать с санитайзером ASan, хоть со вторым, хоть с третьим питоном

clang-11 test.c -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lpython2.7

clang-11 test.c -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9

Результат один: кучка мемори ликов. В 2.7 побольше, в 3.9 небольшая...

А если под полезной нагрузкой, так их вообще на много экранов...

И эти люди мне запрещают ковыряться в носу!

Надо позаимствовать у Витуса тег "злые люди"....

nataraj: (Default)

Ну все... [personal profile] beldmit, [personal profile] vitus_wagner, ликуйте!

У меня таки не осталось осмысленных хост-машин с архитектурой i386. Извел последнюю....

Этой зимой благополучно издох Енот, который был аппаратно 32х битный.

Под первые выстрелы спецоперации он был благополучно заменен на 64х битного Вомбата. И на вновь обретенной системе мной была опробована процедура crossgrade'инга, перевода системы с i386 на amd64. Глючная как моя жизнь. Нет. corssgrade'инг глючнее, и это говорит о многом.

Теперь я на своем отпуске-больничном, таки проапгрейдил все контейнеры с домашнего сервера и перекинул их на того самого новообретенного Вомбата. И вот теперь получил возможность безопасно crossgrade'нуть домашний сервер. Который аппаратно был amd64 давно, но когда я его сетапил, 64битный линукс глючил безбожно и не показывал важный тогда для некоторых сайтов флеш...

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

Так что теперь у меня все актуальные хосты 64битные, есть достаточно 32х битных контейнеров, но это исправимо. И все контейнеры обновлены как минимум до buster. Такой свежести моя инфраструктура давно не знала :-)

nataraj: (Default)

TL;TR: это про .git/info/exclude, если знаете, то можно пропускать.

С постгресом у меня была вечная проблема: я пытаюсь таки перейти на разработку в vim'е (с переменным успехом, но последовательно движусь). Для того чтобы в vim'е переходить по имени функции к месту ее определения нужно созать tags-файлы при помощи утилиты ctags. Все хорошо, но потом эти tags файлы в огромном количестве болтаются в выводе git status. А если добаивть их в .gitignore то надо постоянно следить за этой незакоммиченной правкой (в апстрим ее никто не возьмет)

И вот мне это окончательно надоело и я пошел гуглить. Выяснилось, что есть еще локальный гитигнор, который называется .git/info/exclude. Работает абсолютно идентично, но в remote не попадает.

Добавил туда tags, и теперь доволен как слон... :-)

nataraj: (Default)
Читая книжку по внутренностям perl'а открыл для себя оператор `redo` который позволяет повторить выполнение блока кода. В случае если этот блок -- тело цикла, то цикл на следующую итерацию при этом не переходит:

my $i=0;
foreach (1,2,3)
{
  print $_,"\n";
  $i++;
  redo if $i<2;
}

печатает
1
1
2
3


PS так, постойте... В DW был же маркдаун... Куда делася? Не вижу как включить...
nataraj: (Default)
У меня уже достаточно давно была инструкция, следуя который пользователь со средней подготовкой мог бы подключиться к матриксу и найти меня. Инструкция была во Вконтакте, так как именно там обитает большенство интересных мне пользователей со средней подготовкой. Поэтому упомянать ее в каких либо приличных местах было стыдно.

Теперь я эту инструкцию обновил, добавив недостающих скриншотов, и скоировал в место более подобающее:

https://blog.nataraj.ru/~/It/Как%20написать%20мне%20сообщение%20в%20Matrix

По ходу дела отмечу, что ходовые испытания показали, что мало-компьютерные люди вполе осваивают Element, и уверенно им пользуются. Так же в нем в боевом режиме живут чаты разных сообществ, в виде вполне годным к использованию. При не очень великих усилиях в Matrix можно импортировать IRC и прочие чаты. (Да, IRC жив и отдельных местах процеветает).

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


Посему призываю всех кто понимает зачем нужны децентрализованные системы как минимум попробовать, получить личное впечатление.
nataraj: (Default)
Попытался заняться сольфеджио, благо поступило предложение об обучении от которого невозможно отказаться.

Для занятий стал подключать к ноутбуку оказавшуюся под рукой MIDI клавиатуру. Долго разбирался. Особенно с учетом того, что большинство примеров в сети либо про Jack либо про ALSA, а мне менять PulseAudio на что-то еще, совершенно не уперлось. Хочется так, чтобы воткнул – и заработало. Разобрался. Узнал много нового. Вынес мозг народу в рассылке опенсорсного MIDI-синтезатора.

В результате, чтобы труд не пропал зря, да и тупо чтобы не забыть написал статью в Debian Wiki: https://wiki.debian.org/PulseAudioMidi и еще подредактировал Wiki FluidSynth: https://github.com/FluidSynth/fluidsynth/wiki/ExampleCommandLines потому как рабочего примера для работы с драйвером ASLA напрямую не сыскать.

Оригинал: https://blog.nataraj.ru/~/It/Использование%20MIDI%20совместно%20с%20PulseAudio
nataraj: (Default)
Краткое содержание предыдущих серий:

Fuzzing -- метод тестирования когда в программу на вход подаются случайные данные.

Structure Aware Fuzzing -- данные остаются все так же случайные, но все-таки синтаксически или структурно верные. Нужно чтобы проникнуть глубже синтаксического анализатора.

LibBlobStamper -- библиотека которую я пишу, которая позволяет на основании псевдо случайных данных выдаваемых фаззером, воспроизводимо генерировать синтаксически корректные данные. https://github.com/postgrespro/libblobstamper

Вот сегодня у меня новое достижение. Я таки сумел сгенерировать данные под парсер синтаксических деревьев:

((((231 + 108) ^ ((39 - 156) ^ (((116 * 109) - (100 ^ (47 + 78)))... )
Там все пока что еще максимально сыро, много что прибито гвоздями и даже в основной код не затащено t/320-galley-recursion-experiments.cpp. Но работает, блин!
nataraj: (Default)
Опубликовал еще один сервисный скрипт для медиавики:

https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/ban_spam_ip

Скрипт получает список IP адресов с сервиса www.stopforumspam.com, преобразует его в формат пригодный для nginx'ного плагина geo, после чего можно на уровне конфига nginx принимать решене о том как поступать с пользователями пришедшими с этих адресов: блокировать, перенапраяь на read-only версию сайта и т.п.

Более подробно смотри README.md
nataraj: (Default)
Опубликовал скрипт который умеет для истанса mediawiki во-первых присылать дайджест новых изменений со времени последнего запуска, а во-вторых удалять пользователей которые были созданы, но не создали ни одной правки (частый случай для спам-ботов единожды прорвавшихся сквозь каптчу).

https://gitlab.com/dhyannataraj/scriptorium/-/tree/master/web/mediawiki/changes_notifier

Запуск скрипта надо прописать в /etc/crontab с правильно настроенным MAILTO
nataraj: (Default)
Решил я инициализировать std::vector массивом из без малого 40000 слов. Ну захотелось так...
Собираться все это безобразие g++-8 решило аж полторы минуты, или clang-11 за 40 секунд.
nataraj: (Default)
В январе героически переполз с Хромиума на FireFox.

Самым забавным в этой истории было то, что лет, наверное почти 10 назад, я переполз на Хромиум из-за того что только под ним было расширение uMatrix (тогда оно как-то по-другому называлось) позволяющее задавать per-site правила блокировки сторонних скриптов. Сущевтующий тогда для FireFix NoScript меня совсем не устраивал. Разрешив скрипты от яндекса для рабоы яндекс-карт, ты в резульате разрешал их везде.
Так вот сейчас Гугл собирается (и кажется уже сделал) выпилить API которое это uMatrix использует. До дебиана это еще когда доберется, но переползать надо заранее...

Дополнительные аргументы в сторону нафиг были такими:

- Мне изредка бывает надо скачать видео с ю-туба, и я помню что это делалось в том числе посредством расширений. Был удивлен не найдя ни одного котороме может ютуб. В процессе разбирательств выяснилось, что расширения скачивающие с ютуба запрещены правилами магазина расширений. А там было нужно именно расширение, не помню уж почему, остальные средства не пробивались через подверждение того что мне есть 18 лет или что-то подобное. В результате решил через фаерфоксовское расширение. Но затаил. Оченль сильно затаил.

- Веб клиент от matrix.org, зараза, крайне жручий. И вот сколько я этот matrix наблюдаю, столько новые клиенты крешат старые хромиумы. Только дельта релизов расползается, сразу хром начинает падать. Чего-то не выдерживает. А стоящий у меня на сервере старый веб-клиент, который мой хромиум таки держит, не умеет кой-какие новые серверные фичи которые по умолчанию включает новый клиент абонента, в результате нормально общаться становиться невозможно. Это стало последней соломинкой...

В результате пару недель уже как переполз. Испытываю некоторые неудобства от разницы эргономик. Какие-то привычные вещи не работают или работают не так. Но думаю, ничего, привыкну...
nataraj: (Default)
В поисках странного нашел полезное

https://f-droid.org/en/packages/net.typeblog.shelter/

Штуковина которая судя по описанию умеет изолировать андроидный говнософт в отдельные профайлы.

Не пробовал, потому как у меня все андроиды -- старые... А тут аж седьмой нужен.

Но судя по описанию -- архи нужная вещь...
nataraj: (Default)
Или "мы ее не ждали, а она пришла".

В начале недели собственноручно пощупал то, что похоже будет нашим светлым будущем.

Вы наверное знаете, что я категорически не приемлю централизованные сервисы. Для меня это источник великого зла.

С социальными сетями мне сдержаться не удалось. А вот с мессаджерами получилось почти без срывов (пара ситуаций когда надо было сильно по делу, и потом сразу забыто, не считается).

Джаббер, на который были большие надежды, так и не взлетел, по причинам технически-политическим.

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

Альтернатива эта называется Matrix. Это собственно API для организации распределенных чатов. Как общих чатов, так чатов один на один. К нему прилагается эталонная реализация сервера называемая synapse, и эталонный клиент riot.

Synapse писан на питоне, но вроде как ставится и работает. Riot чистое node.js приложение. Умеет запускаться в браузере без единого серверного скрипта (только через API с synapse общается), а так же у него есть какой-то режим работы в виде отдельного приложения который я не пробовал.
Клиент из-за своей node.js'ности сильно жручий, но зато обладает всеми свистелками-перделками которые милы массовому пользователю.

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

Matrix начал постепенно захватывать мир, на него например перешли команды mozilla и KDE. Наверное есть еще много других success stories, я просто не изучал внимательно...

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

Знакомиться можно по адресу https://riot.im/app/ там сервер с публичной регистрацией от разработчиков всего этого дела. Можно найти меня. Я зовусь @nataraj:nataraj.su @dhyan:nataraj.su. Я настроил свой сервер, и можно заодно поиграться с межсерверным взаимодействием.

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

Готов с теперь помочь с этим окружающим.

Тем кто IT-шник рассказать как настроить самому: какие инструкции читать и где расположены грабли. (Речь идет о jisti если что)

Друзьям объявившим себя безденежными донами для развлекательных целей дам доступ за так.

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

Обращайтесь если что...

Думаю что и для школьных занятий оно тоже подойдет... Если получится убедить всех попробовать это использовать...
nataraj: (Default)
Я не знаю как они этого добиваются... Специальных людей набирают... Или обычным людям каким-то извращенным образом голову форматируют...
Бабы, закрой слух )

Я всю жизнь старательно избегал любого явного ПО по вышеозначенным причинам. Но вот сейчас приперло. Надо и другого варианта нету. Нужна понимаешь ли видео конференция... И есть всё из себя свободное по jisti. Которое это умеет. Но сука на яве. Я ее и так и этак крутил. Ну не умеет она за натом, не умеет. Ей отдельный VPS подавай. На отдельном -- работает. За натом -- нет. Диагностика -- крайне не внятная... Я ей и отдельный IP завел и все порты пробросил на нее... Не хотит... Собака... И нигде не написано почему, и никто не знает.

Четыре евро в месяц за эту уродину платить придется... Просто потому что нельзя за натом...
Негодяи, мерзавцы, подонки...

Ява-программисты, я вас и ваш проприетарно-форматированый формат головы ненавижу!
nataraj: (Default)
Этой новости уже пол года, но я добрался до нее только сейчас.

Если коротко, то GitHub стал блокировать пользователей, с территорий на которые распространяются санкции США: https://www.opennet.ru/opennews/art.shtml?num=51180

При этом не красиво так, без предупреждения, и возможности забрать данные.

К чему я. Неизвестно как развернется вектор мировой политики, я не исключаю того, что в какой-то момент под санкции попадет вся Россия целиком, не только Крым. И это ставит под угрозу любые проекты созданные на github гражданами РФ.

В связи с этим, призываю, если у вас есть общественно значимый проект живущий сейчас на github'е, переносите проекты, к чертовой матери, не дожидаясь перитонита... (Самой симпатичной чертовой матерью для меня сейчас является gitlab)

PS. Для тех кто хочет меня агитировать за self-hosted решения, сразу скажу, что я как и Остап Бенрдер не планирую жить вечно, и предпочту общественно-важные вещи держать еще и в тех местах, которые останутся online еще какое-то не нулевое время после того как меня не станет.
nataraj: (Default)
У меня внезапно случился каникулярный проект.

Вместо того чтобы нормально поработать, пока все отдыхают и от меня отстали, меня вставило, и я сделал еще один подход к попытке сборки игрушки Goblin Camp.

Это, говорят, некая подобная Dwarf Fortress игра, которую забросили в 2012 году.

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

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

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

И вот тут вот получилось. Не без проблем, libboost все равно показал себя как крайне не стабильная... мнэ... субстанция, но DuckDuckGo, StackOverfrow, strace и 83 кило упертости таки победили...

Результат экзерсисов сложил в отдельную ветку и снабдил инструкцией.

https://gitlab.com/dhyannataraj/goblin-camp/tree/cmake-build
nataraj: (Default)
Обновлял на одном из старых ноутбуков дебиан с jessie до stretch

В процессе обновления упали практически все процессы которые были запущены, но обновление дошло до конца. После перезагрузки отказался подниматься шифрованный раздел. При этом до состояния что blkid не видет в нем ни UUID ни тип.

В результате выяснил, что:
0. Бэкапы рулят
1. Наверное обновлять систему лучше таки отмонтировав все сложное..
2. У cryptsetup есть полезные команды luksHeaderBackup и luksHeaderRestore которыми следует пользоваться. Не известно помог бы тут бэкап заголовков, но, если храннить его должным образом, то точно бы не повредил бы
4. Я куда-то продевал переходник USB<->sata. (есть версия куда, надо будет изыскивать)
5. Ну и саму команду blkid тоже узнал...

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

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 19th, 2026 10:48 am
Powered by Dreamwidth Studios