LINUX.ORG.RU

Сообщения shaplov

 

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

Привет!

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

Есть класс 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 методов.

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

#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++ (как правильно сообщать о не успехе)

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

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

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

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

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

 

shaplov
()

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

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

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

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

 , , , transcribe, transcription

shaplov
()

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

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

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

Я не настоящий сварщик тестер, я мимо проходил и засосоало, но мне видится что для этого нужен какой-то многомерный 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

Дорогой 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: а нука собери!

Мне таки удалось довести 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'илка изображений под андроид

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

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

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

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

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

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

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

 , ,

shaplov
()

Собираем Goblin Camp

Когда-то я вот тут спрашивал про 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'а

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

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

 ,

shaplov
()

fuse и umount

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

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

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

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

 

shaplov
()

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

Написал скрипт для автоматического логина в 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 найти пользователей в гурппе

У меня есть 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 «домашние папки»

Коллеги!

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

Казалось бы, что лучше всего это сделать через 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
()

Не работает ссылка на язык разметки LORCODE

Ссылка под окном ввода новой записи «прочитайте описание разметки LORCODE» -> www.linux.org.ru/wiki/en/Lorcode ведет на страницу с ошибкой «Произошла неизвестная системная ошибка. Сообщение об ошибке: java.lang.NullPointerException.»

У меня одного такая проблема? Как-то не аккуратненько получается...

 

shaplov
()

unattended-upgrades в debian wheezy после релиза jessie

Друзья, а расскажите мне что надо сделать с unattednded-upgrades в debian wheezy, чтобы после случившегося выхода jessie продолжили проходить апдейты?

С момента релиза ни на одну из виртуалок апдейты не приходили. В одной из них при ручном апдейте в качестве кандидата приходит как минимум tzdata.

В /etc/apt/apt.conf.d/50unattended-upgrades написано

Unattended-Upgrade::Origins-Pattern {
        // Archive or Suite based matching:
        // Note that this will silently match a different release after
        // migration to the specified archive (e.g. testing becomes the
        // new stable).
      "o=Debian,a=stable";
      "o=Debian,a=stable-updates";
//      "o=Debian,a=proposed-updates";
        "origin=Debian,archive=stable,label=Debian-Security";
        "origin=Debian,archive=oldstable,label=Debian-Security";
};

Все остальное по умолчанию как пришло из пакета. До релиза апдейты стабильно приходили.

Что делать?

 

shaplov
()

Нужен ли ntp внутри lxc контейнера

Не очень хорошо понимаю матчасть в этой области: нужно ли ставить ntp внутрь каждого lxc контейнера, или достаточно поставить его на физический хост, а контейнеры будут использовать общесистемную дату?

 ,

shaplov
()

Теги

Поскольку мне сказали что я сам не могу добвалять теги, прошу добавить тег «sympa», ибо его нет, а программа есть, и удалить тег «apach» ибо тег есть, а программа apache...

 

shaplov
()

Что именно кладет apache2 в SERVER_NAME?

Гугление не помогло. Беру помощь зала:

Друзья, скажите, а что фактически в апаче попадает в переменную окружения SERVER_NAME?

Потому как в nginx туда попадает все то что написали в конфиге в параметре server_name

А вот sympa похоже ожидает что из SERVER_NAME прочитается актуальный хостнейм по которому открыли сайт...

При этом в инстансе который запущен на апаче в конфиге апача вообще отсутствует ServerName как таковой. Он для всех хостов открывается одинаково (что мне и надо). И все равботает.

Так что же туда все-таки пишет апач?

 , , sympa

shaplov
()

Работа над двумя патчами одновременно...

Друзья-разработчики, скажите, а как правильно вести работу сразу над двумя патчами? Типа есть patch1 который добавляет функциональность1, и есть patch2 который ее надстраивает... И вот в процессе работы над patch2 (когда patch1 уже наложен) вдруг возникает желание по-мелочи поправить patch1. Есть ли какой-то человеческий способ это сделать? Предположим что у нас есть локальный git и мы можем там творить все что угодно...

Или я что-то делаю не правильно, и мне такого хотеться не должно?

 

shaplov
()

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