LINUX.ORG.RU

Сообщения shaplov

 

vim: tabstop и shiftwidth per project

Продолжаю медленно осваивать vim

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

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

Добавлять в каждый файл комментарий вида vim:ts=4 – запаришься. Хотя задачу решило бы.

Есть плагины которые умеют автодетект indention-стиля и делают tabstop соответсвенно детектируемому, но автодетект это на мой взгляд от лукавого, и его лучше избегать, если избегать его можешь…

Есть ли какие-то еще решения. Вроде лимитированного по функциональности vim:ts=4, но так чтобы работало на весь проект?

Update: Цитирую ответ достопочтенного @lwo, который предлагает, на мой вкус, самое лучшее решение моей задачи.

Для ровно этого изобрели https://editorconfig.org/.

Кладешь в корень проекта файл с настройками поведения редактора, поддерживающие редакторы подхватывают его. В neovim работает из коробки, для vim вроде как плагин есть.

Update 2: vim начиная с версии 9.0.1799 имеет поддержку .editconfig из коробки

 

shaplov
()

Не могу сменить power_role у TypeC пауэрбанка

Привет!

У меня есть некая пауэрбанка, которая умеет power_delivery и ноутбук Lenovo Thinkpad L13 Gen2 и ядро 6.10.11 из бэкпортов дебиана.

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

Это пол беды, проблема в том, что если заставить ее отдавать энергию, то она через время самопроизвольно переключается в режим всасывания энергии. Поэтому единственный доступный вариант принудить разъем TypeC на ноутбуке быть только в режиме приема, но не отдачи.

/sys/class/typec/port0/power_role отображает состояние source/sink правильным образом (когда батарея начинает высасывать энергию состояние в этом файле меняется)

Однако принудить разъем к определенному режиму через echo sink >sys/class/typec/port0/preferred_role не выходит. Система отвечает «Отказано в доступе» Передернуть режим руками через печать в sys/class/typec/port0/power_role также не выходит. Говорит «ошибка записи: Недопустимый аргумент» если банка подключена… Пробовал печатать туда как sink так и полное source [sink]

У кого-то есть опыт управление питанием TypeC? А на Thinkpad’ах? Есть идеи как это дальше траблшутить?

 typec

shaplov
()

C++, undef значение, подобное perl'овому

Для решения одной из задач появилось желание к штатным типам данных добавить еще одно состояние: undefined. Чтобы можно было бы передавать мессадж «Мы еще не определились», или «Используйте значение по умолчанию, нам без разницы какое».

В теории для передачи этого мессаджа можно было бы использовать shared_ptr и ставить его в NULL когда оно не нужно. Но это какой-то оверкил. Память резервировать-освобождать… И главное получается что мысль передается через не предназначенный для этого инструмент, а это плохо для понятности и выразительности кода.

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

 ,

shaplov
()

C++ как правильно наследовать дружбу...

Понятно что дружбу наследовать нельзя и не надо. И если хочется, то значит что-то не так. Но я не вкуриваю что не так.

Есть доставшийся мне проект. В нем есть класс UI который отвечает за интерфейс, его логику. Есть абстрактный класс Renderer который отвечает за то чтобы это рисовать, и есть наследники AaaRenderer и BbbRenderer которые знают как это все рисовать через фреймворки Aaa и Bbb.

Для того чтобы рисовать UI, надо иметь доступ к его кишкам. Перечислять всех наследников Renderer в качестве друзей UI кажется идейно неправильным… Вдруг появиться еще Ccc.

Проложим что в Renderer есть защищенные атрибуты internal1 и internal2. Вот как правильно к ним организовать доступ из AaaRendrer и BbbRender?

 

shaplov
()

Релиз Goblins' Lot (бывший Goblin Camp) v0.24

Новости разработки игры Goblins’ Lot:

  • Ilkka Halila, автор старого Goblin Camp решил запустить новый, уже не свободный, проект под старым именем. Поэтому оригинальный свободный Goblin Camp был переименован в Goblins’ Lot (Можно прочитать как «удел гоблинов», «надел гоблинов», «гоблиново племя»). Дальше свободная версия игры будет развиваться уже под новым именем

  • Исправлена работа девелоперской консоли под python3. На этом процесс переноса игры в современное программное окружение можно считать завершенным

  • Удалена поддержка python2.7

  • Исправлено несколько багов

  • Немного уменьшено количество deprecation warning’ов

  • Внесен ряд изменений необходимых для успешной сборки под windows (однако сама сборка так и не была реализована)

Release Notes

Исходники

 , , goblins-lot, ,

shaplov
()

Форкнуться в другой виртуальный терминал

Здравствуй дорогой all!

Меня давно мучает один вопрос, и вот видимо пришло время его задать:

А можно ли форкнуть текущий процесс так, чтобы его ввод-вывод начал работать через другой виртуальный терминал? Например через другое окно в tmux’е? Я с одной стороны не вижу концептуальных причин почему так нельзя. А с другой стороны не вижу никаких реальных возможностей этого сделать…

Кто-нибудь знает, возможно ли это вообще в принципе, если да, то как?

Update:

Правильный ответ такой:

#!/usr/bin/perl

use strict;
use POSIX;

my $pid = fork();
if ($pid)
{ 
  print "$pid\n";
  sleep 10;
  while (1) {print ".\n"; sleep 1};
} else
{
  my $i=0;
   (setpgid($$,$$) != -1)           || die "Can't create own group: $!";
  sleep 10;
  while (1) {print "$i\n"; sleep 1; $i++};
}

Он напечатает в консоли pid дочернего процесса, и в другой консоли надо дать команду

$ reptyr [это самый pid]

Подробности и полезные ссылки см. в комментариях

 

shaplov
()

Выполнить одну команду в контексте python'овского virtual environment

Есть задача запустить одну(!) команду в контексте python’овского virtual environment, и вернуться обратно в нормальный контекст

(Дислаймеры: Одну команду. Одной башевской командой, запустить одну башевскую команду в том контексте и вернуться обратно. Как sudo ls. Нет, заходить в venv мне не надо, не предлагайте. Писать обертки которая зайдет и выйдет тоже не подходит.)

Пока рабочие варианты у меня

bash -c 'source ~/.venv/bin/activate; export'

или

(cat  ~/.venv/bin/activate ; echo "export" ) | bash

которые по сути те же обертки только в одну строку. Команда export приведена для примера. По ее выводу можно определить что она отработала внутри venv’а.

Есть ли какие-то более прямые способы, или в питоне все так и должно быть через одно место, и с эти надо смириться?

Update: правильный ответ от @firkax

( . ~/.venv/bin/activate ; export )

 ,

shaplov
()

Идентификация строк (hash? не hash?). Не хватает матчасти.

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

Но тут начинаются проблемы, потому что даже если за сам идентификатор принять саму строку, то срока вида

   }

будет встречаться немыслимое количество раз, и ее идентификатор явно должен вычисляться не только из самой строки, но и из ее окружения… Быть каким-то составным, скорее…

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

Нет ли какой-то метрики позволяющий оценить насколько строка «самобытна». Это скобка среди пробелов, или много разных слов. Чтобы можно было

Не решались ли подобные задачи ранее? Вдруг в недрах какого-нибудь git’а все уже придумано?

Где-бы почитать про разные метрики которые можно применить к текстовым объектам, в том числе с целью их идентификации… По каким ключевым словам искать? Мне однозначно не хватает базовой теории, а интернет полон искусственного интеллекта и блокчейна…

 

shaplov
()

Hub для tmux'ов

Очень удобно с коллегами использовать общую сессию tmux’а (через сокет) в удаленной работе… Голос пускаешь через jitsi или matrix, и оба сидите в одной и той же консоли…

Главный недостаток – человека надо явным образом на ту или иную машину пускать, заводить ему пользователя и т.п. Когда людей несколько машин много, а показать надо на пять минут и всё больше этой виртуалки не будет, это все оказыавется весьма заморочно…

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

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

 , удаленная работа

shaplov
()

Поймать переполнение стека в C++

По странным причинам задам простой вопрос:

А можно ли в C++ инструментом try/catch поймать переполнение стека? Если да, то можно пример?

P.S. причины почему не по-дак-дак-гоить простые и крайне смешные: возможный ответ тонет в бесконечном количестве статей ресурса stackoverflow, имя которого совпадает с главным ключевым словом :-)))

 

shaplov
()

«Дефолтная» сетевая карта под Linux

Коллеги, подскажите, а какая нынче «дефолтная» сетевая карточка под линукс. Раньше была Realtek 8139: купил где угодно – воткнул – работает – забыл про нее, без всякой возни с фирмварями. А сейчас пришла эра гигабитных портов…

Сейчас это кто?

 , ,

shaplov
()

Релиз Goblin Camp v0.23

Goblin Camp - игра на подобие Dwarf Fortress но с открытым, свободным кодом.

Изначально написана комрадом Ilkka Halila, который ее в скорости забросил.

Я некоторое время назад эту игру подобрал и неспеша привожу ее в работоспособное состояние.

Основная тема релиза – работоспособность графических тайлов под SDL2. (По ссылке есть скриншот)

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

Так же начата работа по снижению количества warning’ов которые на старый код выдает современная версия библиотеки libtcod.

Ссылка на релиз: https://gitlab.com/dhyannataraj/goblin-camp/-/releases/v0.23

P.S. Сама игра в нынешний момент далека от идеала, сейчас с ней по настоящему можно играть только в программирование игр. Но я надеюсь что в какой-то момент это поменяется… У меня есть много всяких идей…

 , , goblin camp, ,

shaplov
()

Подмонтировать образ btrfs внутри lxc (на самом деле даже pve)

Коллеги. В очередной раз хочу странного…

Есть потребность внутри контейнера LXC (или точнее в рамках есть PVE извода), подмонтировать файл отформатированный в файловую систему… btrfs, но думаю это не принципиально…

Надо чтобы в контейнере отработало вот такое вот:

dd if=/dev/zero of=image.img count=1 bs=114294784
sudo mkfs.btrfs image.img
mkdir mnt
sudo mount image.img mnt/

однако по дефолту такое не работает. Говорит Operation not permitted.

Как бы такое на уровне конфига контейнера такое разрешить. Ведь наверняка можно же…

 , , ,

shaplov
()

Импорт svn в git с сохранением всей истории и всех веток

Понадобилось мне тут для дружественного проекта импортировать старый svn репозиторий в git.

Задача не сложно решается, если в проекте одна ветка – trunk, и не понтяно как решается, если веток несколько, да еще и разработчики постоянно переключают trunk с ветки на ветку, перезаписью файлов (ну ладно, один раз они так сделали)

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

Короче я в результате написал скрипт, который тупо повторяет последовательность коммитов которые были сделаны в svn, во вновь созданный git, создавая нужные ветки и т.п.

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

https://gitlab.com/dhyannataraj/svn-to-git-full-import

Может быть кому-то пригодиться

 , ,

shaplov
()

Goblin Camp is back to live

В далеком 2010м году Ilkka Halila взялся писать опенсорсную DwarfFortress-Like игру Gobin Camp. За год он добился определенных успехов, но потом проект забросил.

Спустя 10 лет эту игру нашел я, и за два года неспешной работы мне удалось вернуть ее к жизни, переделав систему сборки и собрав со всеми современными библиотками:

  • актуальной версией libtcod (движок для rougelike игр);
  • современным boost’ом;
  • SDL2;
  • python 3.x.

Проект доведен состояния когда можно, и нужно делать релиз.

https://gitlab.com/dhyannataraj/goblin-camp/-/tree/v0.221

Никакой новой функциональности не добавлено, по фичам и геймплею игра ровно в том же состоянии как ее оставил Ilkka Halila

P.S. Сразу отвечаю ЛОРовским анонимусам: самостоятельной ценности игра в ее нынешнем состоянии не представляет, но может быть интересна тем кто хочет поупражняться в написании игр подобных Dwarf Fortress.

 , ,

shaplov
()

libboost-python 2.7 -> 3.x Видимость модулей созданных в си-коде

Есть некий проект, использующиий libboost-python, который в си++-рантайме создает питоновский модуль, и потом запускает питоновский скрипт который этот модуль импортирует и использует. Сделано это было на питоне 2.7. Случился принудительный переход на питон 3.* и мне так и не удалось заставить это работать в новых условиях.

Может быть кто-то более опытный в ембеденье питона может подсказать как правильно сделать.

Как было (упрощенный вариант):

test_module.py

import _hello_provider

test_var = 42

def hello_static():
        return "Hello world static"

def hello_provided():
        return _hello_provider.provide_hello()

test27.cpp

#include <boost/python.hpp>
 
std::string provide_hello() {
    return "hello world provided";
}
 
BOOST_PYTHON_MODULE(_hello_provider) {
    using namespace boost::python;
    def("provide_hello", &provide_hello);
}


int main()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    init_hello_provider();


    PyImport_AddModule("test_module");

    modImp.attr("load_source")("test_module", "test_module.py");

    boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
  }
  catch (const boost::python::error_already_set&)
  {
    PyErr_Print();
  }


  Py_Finalize();
}

На Debian Stretch собираем так:

g++  test27.cpp  -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lboost_python -lboost_system -lpython2.7

Все работает последний вывод через питоновский модуль дергает си++ную функцию из добавленного в рантайме модуля _hello_provider.

А вот когда я пытаюсь сделать это по аналогии на современном дебиане:

#include <boost/python.hpp>
 
std::string provide_hello() {
    return "hello world provided";
}

BOOST_PYTHON_MODULE(_hello_provider) {
    using namespace boost::python;
    def("provide_hello", &provide_hello);
}


int main()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    PyInit__hello_provider();

    PyImport_AddModule("test_module");

    modImp.attr("load_source")("test_module", "test_module.py");

    boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
    boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
  }
  catch (const boost::python::error_already_set&)
  {
    PyErr_Print();
  }


  Py_Finalize();
}

С тем же самым питоновским файлом, собирая все на, Debian Bullseye командой

g++ test3x.cpp  -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9  -lboost_python39 -lboost_system

То все собирается, но при запуске ругается:

Traceback (most recent call last):
  File "/usr/lib/python3.9/imp.py", line 169, in load_source
    module = _exec(spec, sys.modules[name])
  File "<frozen importlib._bootstrap>", line 613, in _exec
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "test_module.py", line 1, in <module>
    import _hello_provider
ModuleNotFoundError: No module named '_hello_provider'

Т.е. в таком исполнении оно модуль _hello_provider не видит, и моей квалификации не хватает для того чтобы понять как это сделать чтобы да. Есть кто-то более опытный способный подсказать?

 , ,

shaplov
()

А что у нас нынче заместо ftp?

Привет люди!

А в чем сейчас хорошо в локальной сети хранить файлы?

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

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

WebDav - неоправданно медленно

sshfs - тоже медленно, плюс излишние телодвижения с ключами.

samba - оно дико странное и пахнет виндой.

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

Критична простота и быстрота. Безопасность вторична, поскольку все будет строго в локальном периметре.

Бывает ли на свете такое? Может что-то из олдскульного годного еще есть, о чем я не знаю?

 

shaplov
()

Запуск пачки скриптов, некоторые из которых должны работать из-под рута

Привет!

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

  • Я запускаю пачку скриптов, которые очень долго работают
  • Некоторые из скриптов делают действия требующие root’а
  • Остальные должны работать из-под юзера (в том числе чтобы случайно себе ногу не прострелить)
  • Иерархия запуска сложная из запутанная, например запускается tmux в котором много чего еще в параллеле запускается.
  • То что sudo в Debian’е требует пароль, это хорошо, и не надо это менять.
  • И вообще чем меньше настраивается хост система, тем лучше…

Так вот: есть ли возможность в самом начале запуска этой пачки запросить пароль от sudo, прикопать куда-то получившееся от этого высокие права, и возвращаться к ним только когда в этом есть потребность, а в остальное время жить как обычный пользователь…

Система при этом моя, я могу положить что-то в /etc/sudoers.d в автоматическом режиме… Но конечно этого лучше не делать, а ограничится рабочей директорией…

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

 

shaplov
()

web json storage

Коллеги, приветствую!

Скажите, а существует ли такая штука, которая бы позволяла бы хранить json’чики в режиме on-line?

Чтобы через WebDAV-запросы их можно было бы добавлять, удалять, искать и возможно редактировать, чтобы авторизоваться по http-авторизации и все такое… Если под это есть RFC какое-то, так вообще замечательно.

Платные штуки гугляться, а вот что-то что можно было бы поставить через apt-get install, и оно заработало бы, я не нашел.

Я плохо искал?

 ,

shaplov
()

template<> — а это что за зверь

Коллеги, читая чужой код наткнулся на строки

        template<> inline bool is<float, float>(const float& left, const float& right, const std::string& message) {
        return is(left, right, message, nearly_equal<float>());
  }

https://github.com/cbab/libtappp/blob/master/include/tap%2B%2B/tap%2B%2B.h#L180

Такого использования ключевого слова template я раньше не встречал.

Чисто интуитивно оно задает кастомное поведение шаблона is для случая если его позвали в комбинации float/float.

Просмотрел еще раз документацию, похожего ничего не нашел.

Что это? Как это понимать? Это же должно как-то называться и где-то быть описанным…

Update: Это называется Template Specialization, и по этим ключевым словам ищется любым посковиком…

@ox55ff, спасибо!

 

shaplov
()

RSS подписка на новые темы