LINUX.ORG.RU

Сообщения cvprog

 

Postgres запрет на редактирование архивной строки

Имеется табличка со столбцом isArchive и по умолчанию в нем False. Можно ли сделать так (для одного и того же пользователя), чтобы после установки значения True в столбце isArchive строку нельзя было исправить (заапдейтить)? Как это сделать, если можно?

 ,

cvprog
()

неубиваемый сервис С++

как бы вот такое в цикле сделать?

try {
   MyService myservice;
   myservice.run()
} catch (...) {
   log(CRITICAL) << "myservice failed";
   try {
     MyService myservice;
     myservice.run()
   } catch (...) {
       log(CRITICAL) << "myservice failed";
       try {
          MyService myservice;
          myservice.run()
       } // ...
}

 ,

cvprog
()

ссылка на статическое поле класса

А вот что то такое я могу провернуть?

class Log {
public:
    static int & level();
};
// ...
Log::level() = 3;

 , ,

cvprog
()

protobuf одинаковое поле для разных протоколов

Нужно передать сообщение полученое по одному протоколу в виде похожего сообщения по другому протоколу.

один протокол, пусть p1

message A { X x; ...}
другой протокол, пусть p2
message B {X x; ...}
message X совпадают в протоколах и я слежу за этим (макросы как порекомендовали).

Пытаюсь заполнить сообщение для передачи вот так, через строку

p1:A a1 = someProcedure();
p2::X *x2 = new p2::X();
std::string tmp;
a.x().SerializeToString(&tmp);
x2->ParseFromString(tmp);
a1->set_allocated_x(x2); // a1 типа p1:A

Все работает конечно. Но, блин, чем то напрягает это решение ... как то коряво )

P.S. я правильно понимаю, что утечки тут нет (x2 = new), т.к. протобуф сам освободит память?

 ,

cvprog
()

C++ самый базовый exception

Имеет ли смысл ветка catch(...)? Можно ли там что-то отловить?

try {
    // bla bla
} catch (const std::exception &e) {
        Log << e.what();
        return FAILED;
} catch (...) {
        return FAILED;
}
return OK;

 ,

cvprog
()

маппинг енумов в С++

Имеется некоторый класс работяга, который о своей работе сообщает через константы

enum class SomeWorkingStatus: int {
    INITIAL = 0,
    ITS_OK = 1, 
    ERROR = 3, 
    STATE_1 = 4, 
    // ...
    STATE_N = 121,
    // ... 
};

Отдавать эти состояния нужно через протобуфные соообщения

enum SomeWokringStatus {
    INIT = 0;
    ITS_OK = 1; 
    ERROR = 3; 
    STATE_1 = 4; 
    // ...
    STATE_N = 121;
    // ... 
};

Для этого приходится писать мэппер ... , который можно сделать со switch или std::map взять, или еще что-то. Но как-то написание мэппера не красиво выглядит, т.к. константы одни и те же. Можно как-то эти константы из enum class SomeWorkingStatus запихнуть в протобуферные перечисления без написания всяких преобразователей (мэпперов)?

 , ,

cvprog
()

cmake предусмотреть доступную библиотеку статическую или динамическую

Я не знаю - будет доступна статическая или динамическая библиотека. Как указать именно на ту библиотеку, которая будет обнаружена?

Т.е. учесть или такой вариант

target_link_libraries(${PROJECT} jsoncpp_static ...

или такой

target_link_libraries(${PROJECT} jsoncpp_lib ...

 

cvprog
()

vcpkg установить библиотеку статически

Не могу понять, почему пакетный менеджер на виртуалке, почти с нуля, делает то статическаю, то динамическую библиотеку ))) Как добится установки статической либы?

$ ./vcpkg install jsoncpp
Computing installation plan...
The following packages are already installed:
    jsoncpp[core]:x64-linux
Package jsoncpp:x64-linux is already installed

Total elapsed time: 60.66 us

The package jsoncpp:x64-linux provides CMake targets:

    find_package(jsoncpp CONFIG REQUIRED)
    target_link_libraries(main PRIVATE jsoncpp_lib)

нужно, так, но не знаю как это стабильно получать

 ./vcpkg install jsoncpp
Computing installation plan...
The following packages are already installed:
    jsoncpp[core]:x64-linux -> 1.9.4
Package jsoncpp:x64-linux is already installed

Total elapsed time: 123.8 us

The package jsoncpp:x64-linux provides CMake targets:

    find_package(jsoncpp CONFIG REQUIRED)
    target_link_libraries(main PRIVATE jsoncpp_object jsoncpp_static)

наивная попытка

$ ./vcpkg install jsoncpp:x64-linux-static
Error: invalid triplet: x64-linux-static
Available architecture triplets
VCPKG built-in triplets:
  x64-uwp
  x64-windows-static
  x64-windows
  x86-windows
  arm-uwp
  x64-linux
  x64-osx
  arm64-windows

VCPKG community triplets:
  s390x-linux
  x86-mingw-dynamic
  arm-ios
  arm-mingw-dynamic
  arm64-ios
  x64-osx-dynamic
  x64-mingw-dynamic
  x64-windows-static-md
  arm64-osx
  arm-windows
  x86-windows-static-md
  x86-uwp
  arm64-mingw-static
  wasm32-emscripten
  x86-ios
  x64-openbsd
  x64-mingw-static
  arm64-uwp
  arm64-linux
  x86-windows-v120
  arm64-windows-static
  x64-ios
  arm-linux
  x86-mingw-static
  x86-windows-static
  arm64-mingw-dynamic
  arm-mingw-static

 ,

cvprog
()

переместить протобуфные сообщения в C++

Имеется протобуфное сообщение (message) X, представляющее собой повторяющееся (repeated) поле другого протобуфного сообщения A. В вектор vectorX типа std::vector<X> из БД был зачитанн массив сообщений X. Во время создания и отправки сообщения А вектор vectorX доступен и существует в программе.

Как наиболее эффективно переместить элементы вектора vectorX (или переставить ссылки на элементы вектора vectorX) в сообщение А.

Собственно работает, но что-то мне кажется это не самое эффективное решение

for(auto iter = vectorX.begin(); iter != vectorX.end(); ++iter) {
  X *x = A.add_x();
  *x = *iter;
}

 ,

cvprog
()

C++ что значит префикс m в начале приватного члена класса?

Частенько, в примерах на C++, приватные члены класса начинаются префиксом m или m_. Понятно, что это удобно при использовании IDE, например, на предпросмотре увидеть приватные члены класса …

Но, как расшифровывается это m? Или просто взяли букву с потолка (private, hidden, invisible … ничего не подходит)?

P.S. например кутишники https://code.qt.io/cgit/qt/qtbase.git/tree/examples/corelib/serialization/savegame/game.h?h=5.15

ps2 хмм … masked?

 ,

cvprog
()

присвоить одинаковые message из разных протоколов protobuf в C++

Есть протокол 1

package ru.cow.moo;
message Message1 {
    string Id = 1;
    int32 code = 2;
    # очень много полей далее
}

и другой протокол 2, использующий Message1 точно такое же как в протоколе 1

package ru.dog.woof;
message Message1 {
    string Id = 1;
    int32 code = 2;
    # очень много полей далее
}

Прилетело сообщение из первого протокола типа Message1

ru::cow::moo::Message1 cow_mess1;
cow_mess1.set_id("123");
cow_mess1.set_code(1);
// туча полей

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

ru::dog::woof::Message1 gav_mess1;
gav_mess1 = protobuf_cast<ru::dog::woof::Message1>(cow_mess1); // ???

 ,

cvprog
()

Общая функция для парсинга всех сообщений protobuf

имеется протокол

package ru.cow.moo;

message Message1 {
    string Id = 1;
    int32 code = 2;
}

message Message2 { ...

Каким-то образом получены строки foo и bar, например отсылающая сторона из запаковала и прислала

std::string foo, bar;
int foo_id = 1, bar_id = 2;
moo::Message1 m1;
m1.set_id("123");
m1.set_code(1);
m1.SerializeToString(&foo);
...

Как написать единую функцию ParseMessage, которая распарсит строку и вернет сообщение в соответсвии с его id

moo::Message1 m1 = ParseMessage(foo, foo_id);
moo::Message2 m2 = ParseMessage(bar, bar_id);
???

P.S. далее вот этого, что не вытянул

void ParseMessage(const std::string & data, int i, google::protobuf::Message* mess) {
    switch (i) {
        case 1:
            mess->ParseFromString(data);
            mess->PrintDebugString();
            // other actions
        // case 2:
    }
}


google::protobuf::Message *m = new moo::Message1;
ParseMessage(foo, 1, m);
std::cout << "id = " << static_cast<moo::Message1*>(m)->id() << std::endl;
delete m;

 ,

cvprog
()

Выбор архитектуры

Привет всем, Помогите с выбором архитектуры. Использовать исключения или нет, какие есть аргументы за 1 решиение и за 2-е. Скажеться ли использование исключений на производительности?

Решение 1, с пробросом и обработкой исключений. Кажется код проще поддерживать, при этом:

class A {
public:
    std::mutex statusMutex;
    int status;
    std::string error;
    int getStatus() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return status;
    }
    std::string getError() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return error;
    }
    bool doX() {
	try {
		step1();
		// step2(); 
                // step3(); ...
		return true;
	} catch (const std::exception & e) {
	    std::unique_lock<std::mutex> lock(statusMutex);
            status = -1;
	    error = e.what();	
	    return false;
	}
    }
    void step1(){ 
	// ...
	// There has been a breakdown
	throw std::runtime_error ("step1 err");
    }
};

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

class A {
public:
    std::mutex statusMutex;
    int status;
    std::string error;
    int getStatus() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return status;
    }
    std::string getError() {
        std::unique_lock<std::mutex> lock(statusMutex);
        return error;
    }
    bool doX() {
	step1();
	if (status == -1) return false;
	// step2(); 
	// if (status == -1) return false;
	// step3(); 
	// if (status == -1) return false;
	// ...
	return true;
    }
    void step1(){ 
	// ...
	// There has been a breakdown
	std::unique_lock<std::mutex> lock(statusMutex);
        status = -1;
	error = "step1 err";	
    }
};

int main() {
	A a;
        std::future<bool> the_a_result = std::async(&A::doX, &a);
	std::cout << "the_a_result = " << the_a_result.get() 
	          << ", a.status = " << a.getStatus() 
		  << ", a.error = '" << a.getError() << "'"
		  << std::endl;
	return 0;
}

 

cvprog
()

cmake добавить путь для команды protobuf_generate_cpp

Имеется правило cmake:

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS my-protocol.proto)
которое падает с ошибкой
Import "google/protobuf/empty.proto" was not found or had errors.

В файловой системе empty.proto имеется. Ошибка устраняется в bash, если к команде, которую генерирует cmake для этого правила добавить

-I path_to_google_protobuf_empty_proto

Как заставить protobuf_generate_cpp использовать путь path_to_google_protobuf_empty_proto внутри cmake? include_directories не помогает.

P.S. c add_custom_command эта проблема решается путем написания bash команды, но хотелось бы победить с protobuf_generate_cpp.

 ,

cvprog
()

vcpkg и opencv с поддержой окон

Решил поюзать диспечер пакетов vcpkg и установил в нем opencv (vcpkg install grpc). При этом консольные проекты, выполняющие просто обработку изображений нормально собираются и запускаются.

При попытке запустить приложение с «окошком» (визуальное отображение рисунка imshow) возникает ошибка:

OpenCV(4.3.0) Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvWaitKey, file /home/cvprog/vcpkg/buildtrees/opencv4/src/4.3.0-0c6047baf6.clean/modules/highgui/src/window.cpp, line 717

Предполажил, что в vcpkg нужно поставить gtk:

./vcpkg update
./vcpkg install gtk
...
CMake Error at scripts/cmake/vcpkg_execute_required_process.cmake:85 (message):
    Command failed: autoreconf -v --install
    Working Directory: /home/cvprog/vcpkg/buildtrees/libepoxy/src/1.5.4-337c486045.clean
    Error code: 1
...
Error: Building package libepoxy:x64-linux failed with: BUILD_FAILED

$ cat /home/cvprog/vcpkg/buildtrees/libepoxy/autoreconf-x64-linux-err.log
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I m4
configure.ac:36: error: must install xorg-macros 1.8 or later before running autoconf/autogen.
  Hint: either install from source, git://anongit.freedesktop.org/xorg/util/macros or,
  depending on you distribution, try package 'xutils-dev' or 'xorg-x11-util-macros'
configure.ac:36: the top level
autom4te: /usr/bin/m4 failed with exit status: 1
aclocal: error: echo failed with exit status: 1
autoreconf: aclocal failed with exit status: 1
$ ./vcpkg install xorg-macros
Computing installation plan...
Error: Cannot find definition for package `xorg-macros`.

Подскажите что можно сделать?

 

cvprog
()

cmake -D опцию перенести в CmakeLists.txt

А можно ли в CMakeLists.txt указать вот эту опцию, чтобы не вспоминать и не набирать ее каждый раз в командной строке:

-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake

 

cvprog
()

ip.len из tshark

tshark -e ip.len

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

 

cvprog
()

unresolved exteral symbol

Добрый вечер! не ругайте сильно, пришлось вот собирать под винду приложение. Создал модель проблемы:

Вот такой код и правила сборки.

#include <iostream>
#include <opencv2/opencv.hpp>
int main(){
    std::cout << "OpenCV Version: " << CV_VERSION << std::endl;
    return 0;
}

cmake_minimum_required(VERSION 3.17)
project(cvtest)
set (CMAKE_CXX_STANDARD 11)
file(GLOB SRCS main.cpp)
set (OpenCV_DIR C:\\Users\\user\\openccv3_build\\bbb)
find_package(OpenCV REQUIRED opencv_core)
message("OpenCV_INCLUDE_DIRS = " ${OpenCV_INCLUDE_DIRS}
        "OpenCV_LIBS = " ${OpenCV_LIBS})
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} ${SRCS} )
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
echo %PATH%
... C:\Users\user\openccv3_build\bbb\lib\Release; ...
cmake ..
CMake Error: The source directory "C:/Users/user" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
C:\Users\user\test>
C:\Users\user\test>
C:\Users\user\test>
C:\Users\user\test>
C:\Users\user\test>cmake .
-- Building for: Visual Studio 16 2019
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19041.
-- The C compiler identification is MSVC 19.27.29111.0
-- The CXX compiler identification is MSVC 19.27.29111.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: C:/Users/user/openccv3_build/bbb (found version "3.4.11") found components: opencv_core
OpenCV_INCLUDE_DIRS = C:/Users/user/openccv3_build/bbbC:/Users/user/openccv3_build/opencv-3.4.11/includeC:/Users/user/openccv3_build/opencv-3.4.11/include/opencvC:/Users/user/openccv3_build/opencv-3.4.11/modules/core/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/flann/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/imgproc/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/ml/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/photo/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/video/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/dnn/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/features2d/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/imgcodecs/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/shape/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/videoio/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/calib3d/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/highgui/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/objdetect/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/stitching/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/superres/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/ts/includeC:/Users/user/openccv3_build/opencv-3.4.11/modules/videostab/includeC:/Users/user/openccv3_build/opencv_contrib-3.4.11/modules/bioinspired/includeOpenCV_LIBS = opencv_core
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/user/test

Ну и проблема

C:\Users\user\test>cmake --build .
Microsoft (R) Build Engine version 16.7.0+b89cb5fde for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
  Checking Build System
  Building Custom Rule C:/Users/user/test/CMakeLists.txt
  main.cpp
main.obj : error LNK2019: unresolved external symbol "private: void __cdecl cv::String::deallocate(void)" (?dealloc
ate@String@cv@@AEAAXXZ) referenced in function "public: __cdecl cv::String::~String(void)" (??1String@cv@@QEAA@XZ)
[C:\Users\user\test\cvtest.vcxproj]
C:\Users\user\test\Debug\cvtest.exe : fatal error LNK1120: 1 unresolved externals [C:\Users\user\test\cvtes
t.vcxproj]

 ,

cvprog
()

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