LINUX.ORG.RU

Сообщения shaplov

 

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

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

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

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

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

 

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. Сама игра в нынешний момент далека от идеала, сейчас с ней по настоящему можно играть только в программирование игр. Но я надеюсь что в какой-то момент это поменяется… У меня есть много всяких идей…

 df-like, , 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
()

Телефон дружелюбный к root'у

Дорогие неанонимы!

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

Поэтому вопрос, знаете ли вы телефоны, производитель которых максимально позаботился о том, чтобы пользователь с максимальным удобством мог получить права root, если ему это захотелось. Чтобы это можно было бы сделать за несколько кликов, а не как обычно.

Встречали ли вы такое? Не обязательно в России, но чтобы можно было заказать…

Спасибо!

Update:

Всем спасибо! Действительно, самой лучшей идеей оказалось посмотреть список поддерживаемых устройств LineageOS: https://wiki.lineageos.org/devices/

Открытое HW это конечно очень круто, но оно обосновано стоит как самолет. Сейчас не мой выбор.

 ,

shaplov
()

Использование С-шных стуктур нефиксированной длинны в C++

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

typedef struct
{
        int           size;                
        double           p[];
} my_struct_t;

И дальше

my_struct_t*  my_struct = (my_struct_t*) malloc(sizeof(my_struct_t) + sizeof(double) * my_size);

Полный код примера:

( читать дальше... )

Вопрос, вот как бы такую структуру завернуть во что-то максимально С++’ное, чтобы с этим объектом можно было бы взаимодействовать как с объектом из мира C++, чтобы на него delete срабатывал. Или очистка, когда указатель на него перестал существовать и т.п. Возможно чтобы можно было знать настоящий размер структуры для ее копирования.

А в ключевой момент, когда пришло время звать обработчик этой структуры написанный на Си, получить от этого объекта чистый my_struct_t* и позвать нужную сишную функцию.

Есть auto_ptr, емнип. Но он не решает вопрос с сохранением знания о размере структуры.

Есть ли что-то еще, более подходящее?

 

shaplov
()

C++: наследование с абстрактными классами и шаблонами

Есть базовый абстрактный класс MyBase. Есть его подвариант содержащий функции работающие с типом определяемым в шаблоне. MyBaseT<T>. В обоих классах есть pure-методы.

Далее есть реальный класс MyExtended наследующая MyBase и реализующий все недостающие pure-методы.

И есть класс MyExtendedT<T> наследующий MyExtended и MyBaseT<T> и реализующий pure-методы из MyBaseT<T>.

Нужно это все чтобы можно было наплодить MyExtendedT1<T> MyExtendedT2<T>MyExtendedTN<T> и со всеми ними работать как с MyBaseT<T> в общем случае.

Так же функции возвращающие значение T нужны(да и возможны) далеко не всегда, и тогда можно пользоваться вариантами MyExtended1, MyExtended2 .. MyExtendedN с которыми в общем случае можно работать как с MyBase.

Пытаюсь сделать я это примерно так

#include<stdio.h>

class MyBase
{
  public:
    virtual int SomeFunction() = 0; /*Not implemented at base class*/
};


template<class T> class MyBaseT: public MyBase
{
  public:
    virtual T TypeSpecificFunction() = 0; /*Not implemented at base class*/
};

class MyExtended: public MyBase
{
  public:
  virtual int SomeFunction() override;
};

int
MyExtended::SomeFunction()
{
  printf("MyExtended::SomeFunction\n");
  return 0;
}


template<class T> class MyExtendedT: public MyExtended, public MyBaseT<T>
{
  public:
    virtual T TypeSpecificFunction() override;
};


template<class T> T
MyExtendedT<T>::TypeSpecificFunction()
{
  printf("MyExtendedT<T>::TypeSpecificFunction\n");
  return 0;
}

int main()
{
    MyExtendedT<int> obj;
    obj.SomeFunction();
}

И у меня не получается. Оно почему-то считает, что получившийся MyExtendedT – абстрактный класс, и метод TypeSpecificFunction pure-метод

test.cpp: In function ‘int main()’:
test.cpp:46:22: error: cannot declare variable ‘obj’ to be of abstract type ‘MyExtendedT<int>’
     MyExtendedT<int> obj;
                      ^~~
test.cpp:30:25: note:   because the following virtual functions are pure within ‘MyExtendedT<int>’:
 template<class T> class MyExtendedT: public MyExtended, public MyBaseT<T>
                         ^~~~~~~~~~~
test.cpp:6:17: note:    ‘virtual int MyBase::SomeFunction()’
     virtual int SomeFunction() = 0; /*Not implemented at base class*/
                 ^~~~~~~~~~~~
test.cpp:47:9: error: request for member ‘SomeFunction’ is ambiguous
     obj.SomeFunction();
         ^~~~~~~~~~~~
test.cpp:6:17: note: candidates are: ‘virtual int MyBase::SomeFunction()’
     virtual int SomeFunction() = 0; /*Not implemented at base class*/
                 ^~~~~~~~~~~~
test.cpp:23:1: note:                 ‘virtual int MyExtended::SomeFunction()’
 MyExtended::SomeFunction()
 ^~~~~~~~~~
MyExtended::SomeFunction

Я что-то делаю не так? А как надо?

Или я хочу того что нельзя? Можно ли тогда добиться похожего эффекта другим способом?

 

shaplov
()

Алиас для точки с запятой в bash

В bash можно записать цикл в одну строчку, как-то так

for file in *.csv1 ; do cp "$file" "H_$file"; done

Все круто.

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

А хочется запустить из cmake’а именно цикл, не вынося его во внешний скрипт. (Уж очень простой цикл)

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

 ,

shaplov
()

doxygen и C++, примеры

Коллеги!

Встречали ли вы проекты написанные на C++ и качественно документированные при помощи doxygen?

Можете ли ткнуть пальцем, ежели встречали?

Хочется посмотреть на то, как это делают лучшие из нас.

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

 ,

shaplov
()

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