tag:dreamwidth.org,2011-04-07:750757Swami Dhyan NatarajSwami Dhyan NatarajSwami Dhyan Nataraj2023-07-09T11:50:58Ztag:dreamwidth.org,2011-04-07:750757:994659Выпустил релиз игры Goblin Camp v0.232023-07-09T11:50:58Z2023-07-09T11:50:58Zpublic0<p>Goblin Camp — попытка создать опенсорсный клон игры Dwarf Fortress. Смысл игры в управлении поселением Гоблинов (или в оригинале Гномов), при этом управления косвенного, в игре не предусмотрено прямого управления Гоблинами/Гномами, можно лишь ставить задачи в общем виде, а вот как подопечные поведут себя в результате — вопрос мастерства организации...</p>
<p><a href="https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23">https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23</a></p>
<p>Изначально Goblin Camp написал некто Ilkka Halila, в 2010, повозился с ней годик и забросил. Мне как любителю Dwarf Fortress, Rim World и прочих симуляторов колоний с непрямым управлением, постоянно хотелось запустить в них руки, но сильно останавливала закрытость кода. Возможность писать моды есть, но тратить свое время на разбирательство в закрытом коде, я считаю неуважением к человечеству, поэтому стараюсь избегать к этого… И вот я в какой-то момент таки нашел ту программу в которую запустить руки не зазорно.</p>
<p>На тот момент Gobln Camp была давно заброшена и категорически не собиралась на современных дистрибутивах. Пришлось приложить не нулевое количество усилий, чтобы оно заработало и задышало.</p>
<p>Этот релиз закрывает проблему с работой графических тайлов. Оригинальная версия от Ilkka Halila использовала библиотеку SDL версии 1, а сейчас доступна только SDL2. Пришлось разбираться и переделывать.</p>
<p>Кроме того, есть у меня подозрение, что графические тайлы там вообще никогда толком не работали: они не целиком загружались. Там были существенные проблемы с вычислением координат мышки и смещения при перетаскивании.</p>
<p>Самый лучший баг был такой: если устроить перетаскивание и перемещать мышь строго влево-вверх, то при отпускании кнопки мыши, оно дополнительно срабатывало как однократное нажатие левой кнопки. Если был хоть раз в процессе вильнул вниз или вправо, эффекта не возникало.</p>
<p>Плюс современная библиотека libtcod (которая лежит в основе движка игры) на этот старый код выдает кучу deprecation-warning’ов. Начал их постепенно зачищать…</p>
<p><img src="https://blog.nataraj.ru/static/media/C7881498-B8BD-96DE-B468-557D7F6C2039.png" alt="" /></p>
<p><a href="https://blog.nataraj.ru/~/It/%D0%92%D1%8B%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BB%20%D1%80%D0%B5%D0%BB%D0%B8%D0%B7%20%D0%B8%D0%B3%D1%80%D1%8B%20Goblin%20Camp%20v0.23">Оригинал</a></p>
<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=994659" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:994413Еще один веселый способ выстрелить себе в ногу2023-04-01T11:35:50Z2023-04-01T12:01:42Zpublic3<p>Сижу, переделываю код. Есть необходимость отучить постгрес запускать разные сервисные процессы. Решил по случаю переделать это по уму...</p>
<p>Переделываю кусок, запускаю, проверяю, переделываю, проверяю и тут падает оконная система... Вся.</p>
<p>Логинюсь обратно, восстанавливаю рабочий контекст, перехожу к проверке и оконная система падает снова.</p>
<p>Я, матерсь, выключаю компьютер, включаю компьютер, возвращаюсь к прерванной мысли, и оконная система падает снова.</p>
<p>Понимая, что дальше работать несудьба, прикидывая чего такое в компе должно сдохнуть чтобы было вот так вот, в ужасе понимая, что если это проблема в железе, то вообще трындец, мне в понедельник надо выходить в онлайн, другого компа у меня нет, и на работе замену выдать не успеют, все будут на конференции, я сворачиваю работу и начинаю двигаться к следующей точке сегодняшнего дня.</p>
<p>Пока еду, до меня начинает доходить...</p>
<p>Там для порождения сервисных процессов есть спец. фабрика, которая в качестве результата возвращает pid нового процесса. Для оторванных процессов я стал возвращать -1.</p>
<p>Видимо по какой-то своей внутренней логике, она после запуска сразу посылала одному из процессов какой-то сигнал (имеет право).
А в линуксе процесс с номером -1 — это корневой процесс (скажите sudo pkill -9 -1, только не на подакшене, плиз)</p>
<p>Что это был за сигнал, и почему он будучи посланным от юзера (я постгрес запускал под собой) таки доходил до системного процесса — я не знаю, и наверное не буду разбираться, просто оторву посыл сигналов задезейбленным воркерам, благо там это тоже централизовано). Но эпичность допущенной ошибки меня восхитила. Можно мерить в сатиФаустах...</p>
<p>PS: и да, оконная система падала по нажатию Ctrl+C. Нажимаешь Ctrl+С в консоле и исчезает всё включая консоль!</p>
<p>Оно при принужительном завершении основного процесса кидало сигнал завершения детям, а он вместо этого уходил корневому процессу системы</p>
<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=994413" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:994285Призовая игра с встраиванием питона2022-07-28T20:16:26Z2022-07-29T04:21:02Zpublic5<p>Я не возьмусь определять что мне более отвратительно libboost или python. Но право скажу собранные вместе в boost::python они производят на свет субстанцию непревзойденного свойства.</p>
<pre>
#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();
}
</pre>
<p>С 2.7м питоном работает нормально, с третьем падает с невнятной ошибкой при отработке хуков при выходе...</p>
<p>Историю с локализацией места проблемы в портируемой программе с последующим вынесением в приведенный standalone, я опущу из-за малосодержательности и нецензурности... Скажу только, что gdb плюс правильно выбранные места для breakpoint'ов рулят.</p>
<p>Далее в процессе плясок вокруг этого примера вдруг обнаруживаю что вот так не падает:</p>
<pre>
int main()
{
Py_InitializeEx(0);
{
boost::python::object modMath = boost::python::import("math");
boost::python::object cosFunc = modMath.attr("cos");
}
Py_Finalize();
}
</pre>
<p>Ага! думаю я. Оно позвало деструктор до финалайза а не после и все перестало падать... Надо сделать так же!</p>
<p>Но вот проблема... аналог переменной cosFunc в портируемой программе глобальная... Создается пустая, а потом после инициалайза заполняется. Можно было бы раскинуть мозгами, как запихнуть туда указатель вместо самого объекта, и сказать ему в нужный момент delete. Но менять весь остальной код очень не хотелось...</p>
<p>А нельзя ли так, чтобы для сложного объекта вызвался деструктор а сам объект опять заполнить пустым значением?</p>
<p>Оказывается можно:</p>
<pre>
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();
}
</pre>
<p>оно заменяет сложное значение <code>cosFunc</code> тривиальным, при этом для заменяемого значения вызывается деструктор.</p>
<p>И вот так -- тоже не падает...</p>
<p>P.S. Отдельно доставила рекомендация документации на 1.55 boost::python просто не вызывать <code>Py_Finalize()</code>, типа не надо вам это.</p>
<p>P.P.S. Пришел к мысли что сам питон не падает только потому что и так ползает. And you should not boost it.</p>
<p>P.P.P.S. Честно говоря не верил, что осилю с этим разобраться. Без знания, что буста, что питона... Ан нет, получилось...</p>
<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=994285" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:993763Этот ваш python течет...2022-07-24T14:37:56Z2022-07-24T14:39:02Zpublic0<pre>#include <Python.h>
int main()
{
Py_Initialize();
Py_Finalize();
}</pre>
<p>Собрать с санитайзером ASan, хоть со вторым, хоть с третьим питоном</p>
<p><code>clang-11 test.c -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lpython2.7</code></p>
<p><code>clang-11 test.c -fsanitize=address -g -O0 -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9</code></p>
<p>Результат один: кучка мемори ликов. В 2.7 побольше, в 3.9 небольшая...</p>
<p>А если под полезной нагрузкой, так их вообще на много экранов...</p>
<p>И эти люди мне запрещают ковыряться в носу!</p>
<p>Надо позаимствовать у Витуса тег "злые люди"....</p>
<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=993763" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:992927СЯУ How to git ignore2022-07-06T13:44:32Z2022-07-06T13:47:06Zpublic1<p><strong>TL;TR:</strong> это про <code>.git/info/exclude</code>, если знаете, то можно пропускать. </p>
<p>С постгресом у меня была вечная проблема: я пытаюсь таки перейти на разработку в vim'е (с переменным успехом, но последовательно движусь). Для того чтобы в vim'е переходить по имени функции к месту ее определения нужно созать tags-файлы при помощи утилиты ctags. Все хорошо, но потом эти tags файлы в огромном количестве болтаются в выводе <code>git status</code>. А если добаивть их в <code>.gitignore</code> то надо постоянно следить за этой незакоммиченной правкой (в апстрим ее никто не возьмет)</p>
<p>И вот мне это окончательно надоело и я пошел гуглить. Выяснилось, что есть еще локальный гитигнор, который называется <code>.git/info/exclude</code>. Работает абсолютно идентично, но в remote не попадает.</p>
<p>Добавил туда <code>tags</code>, и теперь доволен как слон... :-)</p>
<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=992927" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:992328perl redo: Век живы, век учись2022-07-03T19:34:27Z2022-07-03T19:38:26Zpublic6Читая книжку по внутренностям perl'а открыл для себя оператор `redo` который позволяет повторить выполнение блока кода. В случае если этот блок -- тело цикла, то цикл на следующую итерацию при этом не переходит:<br /><br /><pre>
my $i=0;
foreach (1,2,3)
{
print $_,"\n";
$i++;
redo if $i<2;
}
</pre><br />печатает <br /><pre>
1
1
2
3
</pre><br /><br />PS так, постойте... В DW был же маркдаун... Куда делася? Не вижу как включить...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=992328" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:991085Structure Aware Fuzzing: синтаксическое дерево2021-09-14T21:10:53Z2021-09-14T21:15:14Zpublic0Краткое содержание предыдущих серий:<br /><br />Fuzzing -- метод тестирования когда в программу на вход подаются случайные данные.<br /><br />Structure Aware Fuzzing -- данные остаются все так же случайные, но все-таки синтаксически или структурно верные. Нужно чтобы проникнуть глубже синтаксического анализатора.<br /><br />LibBlobStamper -- библиотека которую я пишу, которая позволяет на основании псевдо случайных данных выдаваемых фаззером, воспроизводимо генерировать синтаксически корректные данные. <a href="https://github.com/postgrespro/libblobstamper">https://github.com/postgrespro/libblobstamper</a><br /><br />Вот сегодня у меня новое достижение. Я таки сумел сгенерировать данные под парсер синтаксических деревьев:<br /><br /><a name="cutid1"></a><br /><pre>
((((231 + 108) ^ ((39 - 156) ^ (((116 * 109) - (100 ^ (47 + 78))) / (206 / 166)))) ^ ((((253 - 125) + (171 * 215)) + (183 - (((162 / 178) - 23) - (199 + 10)))) - (192 * 61))) + (((((1 / 161) ^ 167) / (189 / 52)) * ((178 + 110) / ((((225 / 16) * 237) - 95) - 28))) * (((84 - 88) * (226 + 29)) - 180)))
</pre><br /><br />Там все пока что еще максимально сыро, много что прибито гвоздями и даже в основной код не затащено t/320-galley-recursion-experiments.cpp. Но работает, блин!<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=991085" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:990194Рабочие заметки тестера по-жизни2021-05-02T20:05:12Z2021-05-02T20:05:12Zpublic0Решил я инициализировать std::vector<std::string> массивом из без малого 40000 слов. Ну захотелось так...<br />Собираться все это безобразие g++-8 решило аж полторы минуты, или clang-11 за 40 секунд.</std::string><br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=990194" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:983408Собираем Goblin Camp2020-01-08T22:48:08Z2020-01-08T22:48:08Zpublic5У меня внезапно случился каникулярный проект.<br /><br />Вместо того чтобы нормально поработать, пока все отдыхают и от меня отстали, меня вставило, и я сделал еще один подход к попытке сборки игрушки Goblin Camp.<br /><br />Это, говорят, некая подобная Dwarf Fortress игра, которую забросили в 2012 году.<br /><br />Проблема с ней в том, что автор в качестве структуро-образующего фреймворка выбрал libboost, который в свою очередь оказался очень капризным и чувствительным к версиям практически всего...<br /><br />Сначала я пытался подобрать дистрибутив дебиана, собрав его в chroot'е так чтобы нужная комбинация таки совпала... Я старательно пытался его ставить в разные позы с разными компиляторами, но не осилил. При этом часть проблем вылезала именно с внутренностями boost'а который был приложен к исходникам программы. Это еще в прошлый подход.<br /><br />В этот подход я пришел к идее, что надо исключить из уравнения одну из переменных, или даже две. Попробовать собрать все это дело с бустом который идет в дебиане (благо к нему приложены все патчи необходимые для работы с идущим с дистрибутивом компиляторе) и выкинуть нафиг систему сборки bjam которая отдельно доставляет проблемы, и в которой вообще непонятно что происходит и собрать все нормальным cmake'ом (на который, если продолжать возиться с проектом все равно переходить)<br /><br />И вот тут вот получилось. Не без проблем, libboost все равно показал себя как крайне не стабильная... мнэ... субстанция, но DuckDuckGo, StackOverfrow, strace и 83 кило упертости таки победили...<br /><br />Результат экзерсисов сложил в отдельную ветку и снабдил инструкцией.<br /><br /><a href="https://gitlab.com/dhyannataraj/goblin-camp/tree/cmake-build">https://gitlab.com/dhyannataraj/goblin-camp/tree/cmake-build</a><br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=983408" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:982626Патчи в постргес2019-10-05T13:00:44Z2019-10-05T13:00:44Zpublic1Меня можно поздравить с тем, что у меня таки приняли мелко-патчи в постгрес.<br />До самого основного патча еще далеко, но уже хоть что-то. <br /><br /><a href="https://gitlab.com/postgres/postgres/commit/773df883e8f7543958d0d719c025b5f47c5a67f0">773df883</a> - Support reloptions of enum type. В постгресе строковый тип опций таблиц использовался фактически как enum, всякий раз писать функцию валидации походу не правильно, лучше прямо сделать его enum'ом.<br /><a href="https://gitlab.com/postgres/postgres/commit/640c19869f8c4b5c34d3982b5e1cd40e62abbb85">640c1986</a> - Add dummy_index_am to src/test/modules/ so it can be used for test purposes and as an access method example<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=982626" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:978672Программстское портфолио (опенсорсное)2019-04-18T10:57:22Z2021-04-17T14:05:06Zpublic4Многое из того что я когда-то делал по программистской работе или не доступно окружающим, или уже более не используется, по независящим от меня причинам. Но еще есть опенсорс, и вот из него уж точно слова не выкинешь. В этом месте предполагается поместить сводный список моих опенсорсных достижений.<br /><br /><b>Postgres</b><br /><a href="https://gitlab.com/postgres/postgres/commit/4cb658af70027c3544fb843d77b2e84028762747">4cb658af</a> - Refactor reloption handling for index AMs in-core - Не надо использовать StdRdOptions для хранения опций индексов, таская за собой не используемые для дела опции heap'а<br /><a href="https://gitlab.com/postgres/postgres/commit/1bbd608fdae7af314d8e2229e369a45a3da83cd8">1bbd608f</a> - Split handling of reloptions for partitioned tables - Партиционированные таблицы все равно не используют ни одной опции. Поэтому завязывать их хранение на StdRdOptions совершенно ни к чему.<br /><a href="https://gitlab.com/postgres/postgres/commit/396773762425126a85243fc85a267d401496beb8">39677376</a> - Add some assertions to view reloption macros - Дополнительная проверка перед преобразованием типа <br /><a href="https://gitlab.com/postgres/postgres/commit/773df883e8f7543958d0d719c025b5f47c5a67f0">773df883</a> - Support reloptions of enum type. В постгресе строковый тип опций таблиц использовался фактически как enum, всякий раз писать функцию валидации походу не правильно, лучше прямо сделать его enum'ом.<br /><a href="https://gitlab.com/postgres/postgres/commit/640c19869f8c4b5c34d3982b5e1cd40e62abbb85">640c1986</a> - Add dummy_index_am to src/test/modules/ so it can be used for test purposes and as an access method example<br /><a href="https://gitlab.com/postgres/postgres/commit/4b95cc1dc36c9d1971f757e9b519fcc442833f0e">4b95cc1d</a> - Add more tests for reloptions - Опции таблиц как выяснилось не тестировались ранее. Перед тем как их ломать, было решено для начала научиться тестировать то что есть. Правда с поламыванием воз и ныне там...<br /><a href="https://gitlab.com/postgres/postgres/commit/d6061f83a166b015657fda8623c704fcb86930e9">d6061f83</a> - Improve pageinspect module - Модуль pageinspect позволяющий изучать страницы хранилища postgres, с помощью этого патча научился разбирать на части содержимое записи, и показывать их в человеко-читаемом виде.<br /><br /><br /><b>xmlsec</b><br /><a href="https://github.com/lsh123/xmlsec/commit/0606b7421d17b36600f27e338f82dd473d753ec9">0606b742</a> - Поддержка подписи GOST2012.<br /><br /><b>perl</b><br /><i>authored modules</i><br /><a href="https://metacpan.org/pod/Lingua::StarDict::Writer"><b>Lingua::StarDict::Writer</b></a> – модуль для создания StarDict словарей<br /><br /><i>patches</i><br /><code>Lingua::StarDict::Gen</code> — <a href="https://metacpan.org/changes/distribution/Lingua-StarDict-Gen">версия 0.09</a>: исправил серьезную проблему с сортировкой из-за которой пропадали слова.<br /><br /><b>Misc</b><br /><i>subtutleeditor</i> - <a hferf="https://github.com/kitone/subtitleeditor/commit/1dd00d036344f72ab8d647d3f5614940c95e2384">1dd00d03</a> - Fix building with older version of enchant - у кого-то в системе был уже enchant-2 и он послал фикс для сборки. А в дебиане до сих пор enchant без двойки, в результате собираться перестало. Сделал так чтобы собиралось в обоих случаях.<br /><br /><i>KDE networkmanagement</i> - <a href="https://cgit.kde.org/networkmanagement.git/commit/?id=99d3dbe854029cd3df593e6398ff73921ce7ea15">99d3dbe8</a> - Show APN string for the APN selected by the user in Mobile Connection - чего-то оно там неправильно показывало при настройке USB-модема. Давно это было.<br /><i>KDE networkmanagement</i> - <a href="https://cgit.kde.org/networkmanagement.git/commit/?id=d395cfe7037ae7abd7d10c6b742657771d4c61a0">d395cfe7</a> - Hide non-Internet APNs in Mobile Connection Wizard.- В serviceproviders.xml начали разделять APN'ы по типам назначения (internet|mms|wap) а KDE'шный network manager об этом не знал, и показывал все в кучу.<br /><br /><i>preeny</i> – <a href="https://github.com/zardus/preeny/commit/e317826b59f177b57207d0d85e3fb03262559b61">e317826</a>: добавил библиотеку <code>setstdin</code> позволяющая, через подмену системных вызовов подавать программе требуемые данные на стандартный вход. Нужен этот инструмент например при фаззинге, например AFL++'ом, когда другого способа передать какую-либо константную строку на вход исследуемой программе просто нету.<br /><br />*будет пополняться*<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=978672" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:977593pg-dev: Налаживаемость патчей из коммитфеста2019-03-31T20:07:44Z2019-03-31T20:07:44Zpublic0и не только налаживаемость. Но еще и компилируемость...<br /><br />Для тех кто занимается разработкой постгреса. В рассылке товарищи показали интересный сервис:<br /><br /><a href="http://commitfest.cputube.org/">http://commitfest.cputube.org/</a><br /><br />Там для патчей текущего и предстоящего комитфеста приведена статистика того как эти патчи накладываются на текущей мастер, и собираются ли после этого. В том числе и виндой. Что чертовски полезно для нашей безвиндовой ситуации...<br /><br />Чего этому сервису не хватает, так это системы оповещений. Я по всей видимости буду писать скриптик который из моих статусов (ну и не только моих, пусть в параметрах указывается) будет делать RSS-feed.<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=977593" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:976586Недостаточно магии...2019-03-08T13:32:35Z2019-03-08T13:43:09Zpublic0<pre>ERROR: incompatible library "/home/nataraj/.../lib/postgresql/dummy_index.so": missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.</pre><br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=976586" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:975289Вопрос суровым vim'ерам про git2019-02-17T19:09:51Z2019-02-17T19:09:51Zpublic0А кто-нибудь знает, можно ли обучить vim подсвечивать строки которые появились после коммита N?<br /><br />Вот чтобы типа создал ветку, наложил патч, закоммитил, и далее видишь, какие строки приехали из мастера, какие с патчем, а какие ты сам нарисовал после и еще не закоммитил...<br /><br />Было бы очень удобно... Бывает ли такое? мне чего-то не нагуглилось...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=975289" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:973161Слава извращенцам2019-01-01T18:18:23Z2019-01-01T18:19:07Zpublic2Понадобилось мне собрать пострес под винду (там какая-то MSVS-специфичная ошибка). Надо. А трогать эту субстанцию больше необходимого ну очень не хочется.<br />Коллега поделился образом вируталки в которой все окружение для сборки уже подготовлено, только клонируй и запусти. Спасибо коллеге...<br /><br />Преодолевая трудности (нельзя просто так взять и сделать бридж для вайфайной карты) пытаюсь ее запустить у себя на ноутбуке. Ноут не тянет... Он и фейсбук в браузере не очень тянет, какая виртуалка...<br /><br />Хорошо, обращаюсь к знакомому, у которого на рабочих станциях лиукс, типа дай погонять... Он говорит, что погонять не даст, но выдаст свой старый виндовый комп, который мощнее всех его линуксовых, за одно и линукс на него типа поставишь...<br /><br />Преодолевая трудности (нет драйверов для сиди-рома, дебиановский лайв-сиди почему-то не видит сетевуху), перекидываю данные с самого маленького диска на остальные (их там много было) и ставлю на малый диск линукс...<br /><br />Тут выясняется что на этот маленький диск образ виртуалки просто не помещается... Диск совсем маленький. Ну я в результате кладу его на диски с данными которые от винды остались, ntfs'ные...<br /><br />Итого. Для того чтобы собрать постгрес под винду, я снес винду, чтобы поставить линукс, положить виртуалку на ntfs'ный диск запустить винду в виртуалке и таки собрать постгрес...<br /><br />И вы еще удивляетесь что я медленно программирую...<br /><br />PS поставил бы еще тег "слабоумие и отвага", но он про другое...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=973161" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:972908Using vim for postgres development2019-01-01T16:07:32Z2019-01-01T16:07:32Zpublic4I've written a wiki article about configuring vim for postgres development.<br /><br /><a href="https://wiki.postgresql.org/wiki/Configuring_vim_for_postgres_development">https://wiki.postgresql.org/wiki/Configuring_vim_for_postgres_development</a><br /><br />I actually started to restore my vim configuration (I've lost it some time ago) and found out that these information is scattered along the web. And it is better to keep it in one place.<br /><br />I've described in the article all options and plugins that I used for pg development.<br /><br />If you have your own vim experience and know some tools that can be used to make development and following codestyle more easy, please add them there.<br /><br />PS. I've already written about it to the mailing list. Just want to write about it in the blog too...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=972908" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:971488вопрос по git2018-11-25T13:44:05Z2018-11-25T13:45:01Zpublic10Вот например некто ведет разработку, и в процессе ведения шел патчи. И каждая новая версия патча -- улучшенная версия предыдущего.<br />И если для первого патча, я создаю ветку от master'а и накладываю патч, то как быть для второй версии этого патча, мне не понятно.<br />Накладывать второй патч так же надо на мастер. Но должен он оказаться в той же ветке что и первый патч, просто следующим коммитом. Как быть. Какой workfwolw правильный?<br /><br />git checkout master<br />git branch patch_v1<br />git checkout patch_v1<br />pathc -p1 <patch_vi.diff<br />git commit -a<br /><br />git checkout master<br />git branch patch_v2<br />git checkout patch_v2<br />pathc -p2 <patch_vi.diff<br />git commit -a<br /><br />git rebase patch_v1<br /><br />(Я так не пробовал. Боюсь ;-) )<br /><br />Как вы решаете такие задачи?<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=971488" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:966391Таки похоже GitLab2018-09-07T10:33:15Z2018-09-07T10:34:04Zpublic4После некоторых размышлений, пришел к выводу что Git-проекты следует таки переносить на GitLab. Он как никак опенсорсный (хотя ставил я его, это долбанный набор скриптов неустановленного качества непонятно чем повязанный). Отдельно на bitbucket'е меня отвратила atlassian-авторизация... Не хочу корпораций. Даже среднего размера...<br /><br />Хотя конечно гитлаб -- тот еще гугл, судя по историям поглащений. Но пока маленький и не супер опасный. И внятной альтернативы не вижу...<br /><br />В остальном меня на github'е ничего не держит, кроме pull-реквестов к gost-engine'у... Ну это мы как-то переживем... Буду по ходу дела мигрировать... <a href="https://gitlab.com/dhyannataraj/">https://gitlab.com/dhyannataraj/</a><br /><br />PS и да, если кто-то знает лучшую альтернативу -- сообщайте...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=966391" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:958117Программистский дыбр2018-04-16T20:59:09Z2018-04-16T20:59:09Zpublic0Мои фрагментарные патчи постгресса перенесли на следующий коммит-фест, который будет уже в сентябре, после релиза. Наверное надо будет что-то ревьюйнуть. Видимо посмотреть предложенный Глуховский патч, раз уж он по моей теме топчится... Но это когда цикл задач снова до постгресса дойдет. А вообще все это оч. сильно фрустрирует. Че-то я все меньше и меньше уверен в том, что хочу на таких условиях в постгресе ковыряться.<br /><br />Стоящую на повестке дня документацию для gost engine'а ковырять откровенно лень и не хочется. Но видимо надо будет в какой-то момент себя заставить.<br /><br />Вместо этого я занялся другим знатным извращением. Похоже что Opticbook 3800 сам себя в SANE не добавит, и с этим надо что-то делать... При том что там известный чип под который есть бэкенд. С вероятностью удастся обойтись малой кровью. Но для этого все равно надо начать понимать код и USB-шную мать его специфику. Для этого я по дешевке прикупил поддерживаемый сканер с аналогичным чипом, и собираюсь ставить эксперименты сначала над ним. Я собираюсь статически прилинковать бэкенд к испоняемому бинарнику и научиться из него мануально ставить сканер в требуемую мне позу: моргать лампой, ездить головой.<br /><br />Пока у меня получилось прилинковать бэкенд и опросить сканеры (и получить почему-то пустой список). Все осложняется тем, что оно желает automake'а более старого чем тот, что у меня на ноутбуке, и разработку приходится вести в двух точках: в lxc-контейнере запускать automake, если поправить Makefile.am, и результат перекидывать на ноут, где есть физический usb.<br /><br />Короче, это должна получиться славная охота, если удастся это провернуть до конца...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=958117" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:953404Вопрос по Си2018-03-04T18:50:53Z2018-03-04T18:50:53Zpublic19<span style='white-space: nowrap;'><a href='https://vitus-wagner.dreamwidth.org/profile'><img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /></a><a href='https://vitus-wagner.dreamwidth.org/'><b>vitus_wagner</b></a></span>, <span style='white-space: nowrap;'><a href='https://beldmit.dreamwidth.org/profile'><img src='https://www.dreamwidth.org/img/silk/identity/user.png' alt='[personal profile] ' width='17' height='17' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /></a><a href='https://beldmit.dreamwidth.org/'><b>beldmit</b></a></span>, ну и кто еще в теме разбирается...<br /><br />Расскажите, насколько легальна в Си вот такая штука:<br /><br />Есть некий массив сопоставляющий имя и значение, и есть еще возможность значения по умолчанию, которое имени не имеет.<br /><br />Чувак предлагает делать так: <br /><br /><pre>#define NAME_DEFAULT ((const char *) -1) /* pseudo-name for default value */</pre><br /><br />А потом проверять <br /><br /><pre>if(Chto_to->name == NAME_DEFAULT)</pre><br /><br />Где name -- это char*<br /><br />Для меня это какое-то страшное сишное конлдунство, я не могу оценить насколько оно корректно и переносимо между компиляторами.<br /><br />Потому как я бы право слово скорее #define NAME_DEFAULT "" сделал бы. Ибо пустого имени все равно не бывает. И потом при помощи сравнения строк его проверял бы. Но может это у меня просто нету правильной сишной закалки.<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=953404" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:953113postgres_commitfest_feed окупился2018-02-28T15:12:47Z2018-02-28T15:12:47Zpublic2<span style='white-space: nowrap;'><a href='https://postgres-commitfest-feed.dreamwidth.org/profile'><img src='https://www.dreamwidth.org/img/silk/identity/feed.png' alt='[syndicated profile] ' width='16' height='16' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /></a><a href='https://postgres-commitfest-feed.dreamwidth.org/'><b>postgres_commitfest_feed</b></a></span> уже окупился. Отловил желающего потоптаться по той части кода, которую я сейчас ковыряю. Прямо на ранних подступах отловил.<br />Польза.<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=953113" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:952975perl: Ловим утечки памяти2018-02-27T10:44:08Z2018-02-27T10:44:08Zpublic2Заметка скорее для себя, чем...<br /><br />Если быть более точным, то не ловим, а убеждаемся что они есть, и по возможности локализуем.<br />Значит есть такой модуль Memory::Usage <a name="cutid1"></a>, он по факту лазиет в /proc и запоминает информацию о памяти потребляемой процессом. Его после инициальизации дергаешь время от времени. После чего получаешь от него сводку, че было с памятью. <br /><br />Я делал это так:<br /><pre>use Memory::Usage;
use IO::Socket::SSL;
my $mu = Memory::Usage->new();
foreach my $i(1..5)
{
print $i,"\n";
$mu->record($i);
foreach (1..100)
{
# то что как мы предполагаем течет памятью
my $cl = IO::Socket::SSL->new('ru.wikipedia.org:443');
close $cl;
}
}
$mu->dump();</pre><br /><br />И получал вот такой вот вывод:<br /><br /><pre> time vsz ( diff) rss ( diff) shared ( diff) code ( diff) data ( diff)
0 14460 ( 14460) 10576 ( 10576) 5012 ( 5012) 1840 ( 1840) 5660 ( 5660) 1
17 16788 ( 2328) 14136 ( 3560) 6416 ( 1404) 1840 ( 0) 7852 ( 2192) 2
34 17844 ( 1056) 15244 ( 1108) 6416 ( 0) 1840 ( 0) 8908 ( 1056) 3
50 18900 ( 1056) 16356 ( 1112) 6416 ( 0) 1840 ( 0) 9964 ( 1056) 4
67 20088 ( 1188) 17464 ( 1108) 6416 ( 0) 1840 ( 0) 11152 ( 1188) 5</pre><br /><br />По которому видно, что расход памяти постоянно растет, несмотря на то что мы только и делаем, что открываем сокет и закрываем его.<br /><br />Помимо этого модуля есть еще Test::LeakTrace который вроде как умеет следить за тем, какие скаляры появились в памяти пока исполнялся заданный участок кода, но я так и не разобрался как им пользоваться, мне в него попадает всякая внутренняя перловая кухня, из серии подключение новых package'ей и т.п. Может когда-то в будущем...<br /><br /><br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=952975" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:952348Постгресодыбр2018-02-22T18:05:20Z2018-02-22T18:05:20Zpublic7Медленно но верно движусь в направлении закрытия своих опесорсных долгов.<br />А то патчи понимаешь, написаны, но не зкаоммичены. Безобразие.<br />Мой мега патч полностью переделывающий работу с опциятми таблиц был в результате мучительно медленного взаимодействия с комьюнити порезан на части и отправлен на коммитфест.<br /><br /><a href="https://commitfest.postgresql.org/15/1314/">https://commitfest.postgresql.org/15/1314/</a> (уже закомимчен) - тесты на работу опций таблицы. (Таковых раньше не было)<br /><a href="https://commitfest.postgresql.org/17/1489/">https://commitfest.postgresql.org/17/1489/</a> - добавляет тип опции Enum (а то раньше его по сути эмулировали строковой опцией, с рукописной функции валидации)<br /><a href="https://commitfest.postgresql.org/17/1536/">https://commitfest.postgresql.org/17/1536/</a> - вместо единого бинарного преставления опций для более половины типов relation'ов, вводит индивидуальные представления на каждый тип. Иначе получалось, что задаешь ты индексу fillfactor а память под него резервируется на все опции которые возможны для heap'а. Потому что универсально.<br /><br />Последнее вот только что доковырял.<br />Как последние два закоммитят, можно будет финальный патч коммитить. Который старый механизм работы опций разрушает до основания, а затем...<br /><br />Еще есть странный <a href="https://commitfest.postgresql.org/17/1486/">https://commitfest.postgresql.org/17/1486/</a> который тоже к теме опций отношения имеет.<br />Там история в том, что если задать опции работы TOAST'а для таблицы в которой TOAST'а нет, то постгрес это молча съест, а значения опций просто потеряются. Я в этом патче предлагаю непущать, но в рассылке меня убедили что так нельзя. Поэтому наверное вместо этого надо будет пренудительно создавать TOAST-таблицу ставить туда опции и предупреждать, что "чувак, ты что-то странное делаешь". Но пока какой-то финальной отмашки я в рассылке не получил, и непонятно, получу ли...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=952348" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:952294An RSS feed with new Commitfest patches2018-01-30T14:21:04Z2018-01-30T14:49:23Zpublic0Hi!<br /><br />I'd like to tell everybody that I've created an RSS feed that streams notification about new patches posted to Postgres Commitfest.<br /><br /><a href="http://perl.nataraj.su/commitfest-rss/commitfest-rss.pl">http://perl.nataraj.su/commitfest-rss/commitfest-rss.pl</a><br /><br />Now it just parses the site and make a feed from that data. If you also use RSS feeds and like to watch for new commits, feel free to use it.<br /><br />May be once this feature will be implemented in commitfest.postgresql.org. But I am not able to implement it there myself as I do not write python.<br /><br />Source code of the script can be found at <a href="https://www.postgresql.org/message-id/3411074.go5RRV3d10%40x200m">my message to psql-www mailing list</a>.<br /><br />Feel free to write comments in that mail-list, personal email, or in the blog (you will need OpenID to authorize there)<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=952294" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> commentstag:dreamwidth.org,2011-04-07:750757:951988Postgres commitfest watch2018-01-28T14:26:05Z2018-01-28T14:28:01Zpublic4Сделал парсилку постргессового коммитфеста, с заворачиванием новых патчей в RSS-поток. Чтобы не отвлекаясь от чтения DW узнавать о новых патчах и ловить те, которые мне по силам и интересам ревьюить.<br /><br />В DW доступно как <span style='white-space: nowrap;'><a href='https://postgres-commitfest-feed.dreamwidth.org/profile'><img src='https://www.dreamwidth.org/img/silk/identity/feed.png' alt='[syndicated profile] ' width='16' height='16' style='vertical-align: text-bottom; border: 0; padding-right: 1px;' /></a><a href='https://postgres-commitfest-feed.dreamwidth.org/'><b>postgres_commitfest_feed</b></a></span>, для остальных -- <a href="http://perl.nataraj.su/commitfest-rss/commitfest-rss.pl">http://perl.nataraj.su/commitfest-rss/commitfest-rss.pl</a><br />Немного потестю, и наверное надо будет написать в соответствующую рассылку, с предложением сделать такое-же, но уже напрямую из базы. Тогда же и исходник опубликую...<br /><br /><img src="https://www.dreamwidth.org/tools/commentcount?user=nataraj&ditemid=951988" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/> comments