LINUX.ORG.RU

Сообщения shaplov

 

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

Форум — Development

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

        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'у

Форум — Mobile

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

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

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

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

Спасибо!

Update:

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

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

 ,

shaplov
()

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

Форум — Development

В 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++: наследование с абстрактными классами и шаблонами

Форум — Development

Есть базовый абстрактный класс 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

Форум — Admin

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

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

Все круто.

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

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

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

 ,

shaplov
()

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

Форум — Development

Коллеги!

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

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

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

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

 ,

shaplov
()

C++, порядок вызова инициализации переменной и вызова конструктора

Форум — Development

Привет!

Наткнулся на проблему которую не могу решить.

Есть класс Class2Enh. При его инициализации надо сначала инциализировать свойство acltual_cl, а потом с объектом actual_cl вызвать конструктор базового класса. Если я пытаюсь сделать так:

#include<stdio.h>

class Class1
{
  protected:
    int some_property;
  public:
    Class1()  { some_property = 1;};
    virtual int getSomeProperty() {return some_property;};
};

class Class2Base
{
  protected:
    Class1 &cl;
  public:
//    Class2Base(Class1 & cl_to_use): cl(cl_to_use) {printf("Class2Base constructor\n"); };
    Class2Base(Class1 & cl_to_use): cl(cl_to_use) { printf("DEBUG2: class1's SomeProperty = %i\n", cl_to_use.getSomeProperty()); };

    virtual void Debug() {printf("DEBUG: class1's SomeProperty = %i\n",cl.getSomeProperty());};
};


class Class2Enh: public Class2Base
{
  protected:
    Class1 actual_cl;
  public:
    Class2Enh(): actual_cl (), Class2Base(actual_cl) {};
};


int main()
{
  Class2Enh tue;
  tue.Debug();
}

То получаю Segmentation Fault в конструкторе Class2Base при попытке обратиться к еще не инициализированному экземпляру actual_cl.

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

 

shaplov
()

C++ override методов.

Форум — Development

Вот что-то я не смог осилить такую простую вещь как переопределение методов при наследовании.

#include <iostream>

class foo
{
  public:
    virtual void print() { std::cout << "foo\n";}
};


class bar : public foo
{
  public:
    void print() override { std::cout << "bar\n";} 
};


void fun(foo f)
{
  f.print();
}

int main()
{
  foo f;
  bar b;

  f.print();
  b.print();

std::cout << "===========\n";
  fun(b);

  return 0;
}

Вот по всем моим понятиям он после горизонтальной черты должен написать bar, a пишет foo :-(

Почему он так со мной, и что я делаю не так?

Мне то как раз надо чтобы позвали метод наследника, раз его передали в качестве параметров…

 

shaplov
()

Субботний C++ (как правильно сообщать о не успехе)

Форум — Development

Продолжаю осваивать С++. И возник вопрос как сделать правильно следующую вещь…

Есть некий метод некоего объекта. Метод в случае успеха создает некий другой объект. Ну и естественно хочется возвращать его через return.

Но возможен другой ход развития событий, когда успеха не было. Это штатная ситуация. В си я бы похожую задачу решал бы посредством возвращения указателя на структуру. Либо указатель на созданную, либо null. Снаружи типа анализируем, и решаем что делать дальше.

А вот как такое правильно делать in cpp-way?

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

 

shaplov
()

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

Форум — Desktop

Коллеги, а не подскажете а существуют ли программы упрощающие ручное транскрибирование диктофонных записей?

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

Естественно интересуют в первую очередь опенсорсные, но проприетарные тоже пойдут, чтобы ознакомится с тем, что вообще бывает на свете…

 , , , transcribe, transcription

shaplov
()

Многомерный issue-трекер

Форум — Development

Коллеги, нужна подсказка.

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

Я не настоящий сварщик тестер, я мимо проходил и засосоало, но мне видится что для этого нужен какой-то многомерный issue-трэкер, в котором во-первых записи можно выстраивать вокруг разных осей: версия продукта, тип тестов, тип срабабатывания, если тест не прошел и т.п. Возможно выборки по пересечению множеств. А так же в котором можно было бы хранить иерархическую информацию. Напремер категории «Тестирование 2021» -> «Тестирование в рамках такого-то релиза» -> «Тестирование такой-то подсистемы». Чтобы по этим категориям можно было бы нормально перемещаться, и иметь нормальное визуальное представление (а не по одному уровню на страницу например)

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

Спасибо!

Update:

summary ответов:

https://testlink.org/ (via @pon4ik)

Redmine с Luxury Buttons(https://www.redmine.org/plugins/luxury_buttons) (via @byko3y)

https://www.openproject.org/ (via @XMs)

https://www.dolibarr.org/ (via @XMs)

Редмайн и багзилу как очевидные в список не включал

 

shaplov
()

Как узнать, что делает udev

Форум — General

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

Имеется устройство, Midi-Клавиатура.

Bus 008 Device 004: ID 0763:1015 M-Audio M-Audio Keystation

Внимательно смотрим на ID: 0763:1015

Нормально видется Midi-софтом она начинает, если поставить пакет midisport-firmware (речь идет о Debian)

Типа в эту клавиатуру перед тем как она сможет работать, надо прошивку залить, и в пакет входят прошивки и udev правила.

Так вот, в файле /lib/udev/rules.d/42-midisport-firmware.rules правила на устройство с 0763:1015 не прописано. Только на 0763:1014.

# KeyStation
ACTION=="add", SUBSYSTEM=="usb", DEVPATH=="/*.0", ENV{PRODUCT}=="763/1014/*", RUN+="/sbin/fxload -s /usr/share/usb/maudio/MidiSportLoader.ihx -I /usr/share/usb/maudio/MidiSportKS.ihx -D /dev/%P"

При этом без midisport-firmware клавиатура не работает.

Вопрос: а как посмотреть что собственно говоря происходит внутри этого самого udev? Что оно такого делает, что клавиатура начинает видится? И че вообще происходит?

 

shaplov
()

Goblin Camp: а нука собери!

Форум — Games

Мне таки удалось довести Goblib Camp до собираемости на современных дистрибутивах

https://gitlab.com/dhyannataraj/goblin-camp/-/tree/cmake-build

Перед тем как фиксировать это как релиз, предлагаю заинтересованным лицам попробовать это собрать на дистрибутивах отличных от Debian Buster/Stretch amd64, поделится результатами и предложить патчи, если не собирается, но знаете как починить.

Собирать следует ветку cmake-build, инструкция для сборки там под старые chroot контейнеры. Ее следует игнорировать и пользоваться схемой cmake .; make; sudo make install

Предполагаемый список зависимостей

    # apt-get install git build-essential cmake libsdl1.2-dev libsdl-image1.2-dev libsdl-image1.2-dev libboost-system1.55.0 \
    libboost-iostreams1.55-dev libboost-filesystem1.55-dev libboost-python1.55-dev libboost-thread1.55-dev locales

Циферку для boost’а нужно указать актуальную для вашего дистрибутива.

О встреченных проблемах просьба сообщать. Хочется чтобы процесс сборки был максимально простым.

Не заинтересованных лиц, прошу не беспокоится, и проходить мимо ;-)

 ,

shaplov
()

http-post'илка изображений под андроид

Форум — General

Коллеги, а не подскажите, не существует ли под андроид универсальной программы для http-пощенья изображений…

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

На серверной стороне у меня скрипт который делает то что мне надо. Скажем выкладывает фото в блог, или просто на сайт, не важно…

А на клиенте я делаю фотку и просто выбираю «поделиться».

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

Эта идея кажется настолько очевидной, когда к ней пришел, что сразу возникает вопрос: а не придумал ли, и главное, не сделал ли это кто-то до меня?

Никто с таким не сталкивался?

 , ,

shaplov
()

Собираем Goblin Camp

Форум — Games

Когда-то я вот тут спрашивал про Dwarf Fortress-подобные игры и мне насоветовали Goblin Camp.

Ух и намучился я сего сборкой. libboost который там взят за основу оказался штукой чувствительной к версиям практически всего…

Но ценой невероятных усилий мне собрать игру все-таки удалось… В chroot’е с Debian Wheezy, сменив систему сборки с bjam на cmake (разобраться почему не работает bjam оказалось сложнее чем перейти на cmake) но все-таки удалось…

Полученные результаты зафиксированы в ветке в гитлабе

https://gitlab.com/dhyannataraj/goblin-camp/tree/cmake-build

там же инструкция по сборке…

Вдруг кто-то тоже поиграть захочет ;-)

Update:

Пока разбирался с тем куда бы об этом еще написать, чтобы народ заинтересованный оказался в теме, обнаружил Goblin Camp NG. https://bitbucket.org/veox/goblincamp-ng/src (Копия на gitlab).

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

 ,

shaplov
()

Есть ли опенсорсный аналог Dwarf Fortress или Rim World'а

Форум — Games

Друзья играющие, а не подскажите ли существует ли в природе опенсорсные аналоги Dwarf Fortress или Rim World’а?

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

 ,

shaplov
()

fuse и umount

Форум — Development

Если взять предлагаемый разработчиками fuse hello world http://fuse.sourceforge.net/helloworld.html собрать и запустить, то все будет работать, но отмонтировать файловую систему можно будет либо umount'ом из-под рута, или при помощи fusermount -u от имени пользователя...

Если делать umount от юзера, то сообщает «umount: mnt: Permission denied»

А вот если примонтировать удаленную файловую систему при помощи sshfs, то на отмонтирование обычный umount срабатывает.

Вопрос: как авторы sshfs этого добились? В чем вообще грабли...

 

shaplov
()

Автологин для Wi-Fi в Москосвком метро

Форум — Desktop

Написал скрипт для автоматического логина в Wi-Fi в москоском метро. Делюсь, ибо пользователи линукса должны иметь преимущество перед остальными ;-)

Скрипт расчитан на применение как в сочетании с wicd так и для ручного запуска. Для автоконекта с помощью wicd положите скрипт в директорию /etc/wicd/scripts/postconnect (верно как минимум для debian).

Для network-manager – модифицируйте его сами.

#!/usr/bin/perl

use strict;
use WWW::Mechanize;


if (! $ARGV[1])
{
  print "Working in console mode";
} elsif ($ARGV[1] ne 'MosMetro_Free')
{
  exit(0); # wrong network
}

my $mech = WWW::Mechanize->new(autocheck => 0);

my $url = 'http://8.8.8.8';

$mech->get($url );

my $content = $mech->content();

$content=~/URL=(.*)\"/;

$url = $1;

$mech->get($url);

$mech->submit_form( form_number => 0 );
$mech->submit_form( form_number => 0 );

Для работы скрипта понадобиться установить перловый модуль WWW::Mechanize. Думаю, если вы пользуетесь wicd то вы знаете как это сделать ;-)

PS: Следите за обновлениями на http://dhyannataraj.github.io/blog/2015/08/11/vmetro-auto-login/ именно туда я буду выкладывать новую версию скрипта, когда vmet.ro изменит схему авторизации

 ,

shaplov
()

Помогите в LDAP найти пользователей в гурппе

Форум — Admin

У меня есть LDAP сервер, а именно slapd. К нему подключена JIRA, она там насоздавала пользователей и группы.

Вот такие группы

dn: cn=jira-users,dc=my-domain,dc=ru
objectClass: groupOfUniqueNames
uniqueMember:
uniqueMember: cn=user1,dc=my-domain,dc=ru
uniqueMember: cn=user2,dc=my-domain,dc=ru
uniqueMember: cn=user3,dc=my-domain,dc=ru
cn: jira-users

и вот таких пользователей:

dn: cn=user1,dc=my-domain,dc=ru
mail: n.shaplov@my-domain.ru
userPassword:: exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx89
givenName: Nikolay
objectClass: inetOrgPerson
cn: user1
sn: Shaplov
displayName: Nikolay Shaplov

Соответсвенно пытаюсь искать пользователей в гуппе:

(&(objectcategory=inetOrgPerson)(memberof=cn=jira-users,dc=my-domain,dc=ru))

Но ничего не получается...

В большинстве примеров которые есть в сети, в строке поиска еще присутвует ou=:

(&(objectcategory=inetOrgPerson)(memberof=cn=jira-users,ou=Groups,dc=my-domain,dc=ru))

Но jira никаких ou объектов не создала, и естественно ничего не находится...

Вопрос: возможно ли с имеющейся схемой таки написать фильтр ищущий пользователя в группе? Как этот запрос должен выглядеть? Или надо как-то доконфигурировать JIRA чтобы там еще и Organization Unit создавалиь? Или вообще как? Не очень с этими ou понимаю тему...

Update: Благодоря коменту Ivan_qrt выяснил, что для того чтобы все это работало, надо подгрузить определенный оверлей, и правильно его настроить... Что-то вроде этого https://tech.cbjck.de/2012/05/08/enabling-the-memberof-overlay-for-openldap/

Соберусь с духом, попробую...

 ,

shaplov
()

nginx + webdav «домашние папки»

Форум — Admin

Коллеги!

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

Казалось бы, что лучше всего это сделать через webdav (встроенный клиент есть в каждой ОС). И казалось что для этого дела должен подойти nginx. (Да и вообще люблю я его).

Но вот столкнулся с проблемой: не нашел в сети ни одного примера как прописать разрешения доступа в зависимости от логина.

Сгенерировать конфиг по каталогу пользователей скриптом я вполне смогу... Но вот как написать что-то вроде

location /shaplov/ {
   if ($login = 'shaplov')
   {
     dav_access user:rw;
   } else

   {
      dav_access user:r;
   }
}
я не понимаю. В сети не нашел, а языком nginx'ного конфига не владею достаточно свободно...

Кто-нибудь что-нибудь подобное проделывал?

Update:

Так, я понял... Логин пользователя хранится в $remote_user. А права доступа видимо надо реализовывать через перечень методов... Что-то вроде:

location /shaplov/ {
   if ($remote_user = 'shaplov')
   {
      dav_methods PUT DELETE MKCOL COPY MOVE;
   } else

   {
      dav_methods off
   }
}
Завтра буду пробовать...

 ,

shaplov
()

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