Git Product home page Git Product logo

cpp-network-tasks's Introduction

Repository with a code for the Geekbrains students

Это репозиторий, содержащий код для студентов, проходящих курс "Сетевое программирование на C++" в GeekBrains.

Начало работы

Чтобы начать работать:

  • Если Docker не установлен в системе, установите его.
  • Если Git не установлен в системе, установите его.
  • Склонируйте репозиторий: git clone https://github.com/artiomn/cpp-network-tasks.git.
    Внимание: склонируйте репозиторий в каталог, содержащий только латинские символы в пути!
  • Зайдите в каталог cpp-network-tasks.
  • Запустите скрипт ./build_dockerized.sh

Если это первый запуск, пройдёт значительное время перед тем, как вы получите результат.
Возможно, что вам потребуется установить Docker.

Для запуска IDE QtCreator выполните из каталога cpp-network-tasks следующую команду: ./run -q.
Будет запущена IDE, в которой необходимо открыть, как проект, файл CMakeLists.txt в каталоге /home/developer/src или /usr/src/gb/src (первый каталог - ссылка).

FAQ

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

Чтобы ваше задание не получило статус "Не сдано" автоматически, ещё до проверки его преподавателем, выполните несколько правил:

  • Проверьте, что код скомпилируется.
  • Для сборки используйте CMake.
  • Оформите код согласно кодовому стилю.

Подходящий вариант стиля для ClangFormat находится в репозитории: code-style.clang-format.

* Файл стиля был предоставлен Henryk ll Selenya.

Пример оформления вы увидите в примерах к уроку.

Кратко:

  • В качестве отступов используются пробелы.
  • Ширина отступа 4 пробела.
  • Открывающая фигурная скобка на следующей строки после имени.
  • После if, for и подобных операторов - один пробел до скобки.
  • После имён функций и методов нет пробелов.
  • После открывающей и перед закрывающей круглыми скобками нет пробелов.
  • После каждой запятой и точки с запятой - пробел.
  • Названия классов пишутся в CamelCase.
  • Названия функций, методов и переменных - в snake_case.
  • Между реализациями функция и методов ставится две пустые строки.
  • Внутри тела функций и методов не допускается более одной пустой строки.
  • Атрибуты классов оканчиваются на _.
  • Комментарии желательно оставлять на английском языке. В примерах они, местами, на русском. Исключительно потому, что примеры учебные.

Правильный вариант оформления:

int main()
{
    std::cout
        << "Getting name for \"" << host_name << "\"...\n"
        << "Using getaddrinfo() function." << std::endl;

    addrinfo hints =
    {
        .ai_flags= AI_CANONNAME,
        // Неважно, IPv4 или IPv6.
        .ai_family = AF_UNSPEC,
        // TCP stream-sockets.
        .ai_socktype = SOCK_STREAM,
        // Any protocol.
        .ai_protocol = 0
    };

    // Results.
    addrinfo *servinfo = nullptr;
    int status = 0;

    if ((status = getaddrinfo(host_name.c_str(), nullptr, &hints, &servinfo)) != 0)
    {
        std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;
        return EXIT_FAILURE;
    }

    for (auto const *s = servinfo; s != nullptr; s = s->ai_next)
    {
        std::cout << "Canonical name: ";
        if (s->ai_canonname)
             std::cout << s->ai_canonname;
        std::cout << "\n";

        assert(s->ai_family == s->ai_addr->sa_family);
        std::cout << "Address type: ";

        if (AF_INET == s->ai_family)
        {
            char ip[INET_ADDRSTRLEN];
            std::cout << "AF_INET\n";
            sockaddr_in const * const sin = reinterpret_cast<const sockaddr_in* const>(s->ai_addr);
            std::cout << "Address length: " << sizeof(sin->sin_addr) << "\n";
            in_addr addr = { .s_addr = *reinterpret_cast<const in_addr_t*>(&sin->sin_addr) };

            std::cout << "IP Address: " << inet_ntop(AF_INET, &addr, ip, INET_ADDRSTRLEN) << "\n";
        }
        else if (AF_INET6 == s->ai_family)
        {
            char ip6[INET6_ADDRSTRLEN];

            std::cout << "AF_INET6\n";
        }
        else
        {
            std::cout << s->ai_family << "\n";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;

    freeaddrinfo(servinfo);

    return EXIT_SUCCESS;
}

К оглавлению ⮐

Я художник, я так вижу, мне плевать на правила оформления

Ваша работа сразу автоматически отправляется в помойку.

К оглавлению ⮐

Надо ли обновляться и как?

Иногда - надо. Когда в код или образ вносятся изменения, о чём вам должны сообщить. Если вы работаете с Git репозиторием, код обновляется следующим образом:

git pull 

Если вам предоставляется архив, преподаватель обновит его сам.

Docker образы могут быть обновлены следующими командами:

artiomn/gb-build-image
artiomn/gb-qt-creator-image

К оглавлению ⮐

Как собрать примеры?

Сборка производится, используя CMake, поэтому:

  • Вы можете использовать любую современную IDE для сборки.
  • Скрипт ./build.sh.
  • Прямой запуск CMake.

Сборка не подгружает зависимости автоматически. Поэтому, для того, чтобы собрать без необходимости заниматься установкой множества пакетов, используется подготовленная среда. Она представляет собой Docker-контейнер, образ которого лежит на docker.hub. Сборка в ней запускается через скрипт ./build_dockerized.sh.

Под Windows сборка была проверена на MSVS 2019 и собранные артефакты будут находиться в src\out\build\windows-default\bin. Собираться под Windows будет не всё, есть примеры только под Linux.

К оглавлению ⮐

Сборка не проходит, вообще не собирается ничего

Может быть несколько причин из-за которых не проходит сборка. Для начала, убедитесь, что у вас:

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

Не делайте каталог вида: ~/Общедоступные/user/geekbrains/lessons/C++-network/Programming_Lessons & Code/Репозиторий!/cpp-network-tasks.
Для большинства сборок - это верный путь к проблемам, о которых не знали разработчики.

Положите репозиторий в каталог с нормальным именем, например ~/projects/cpp-network-tasks.

Если вы уже собирали проект локально и хотите собрать его в Docker или, наоборот, собирали в Docker и хотите собрать локально, CMake выдаст ошибку, похожую на следующую:

CMake Error: The current CMakeCache.txt directory /home/user/projects/cpp-network-tasks/build/CMakeCache.txt is different than the directory /usr/src/gb/build where CMakeCache.txt was created. This may result in binaries being created in the wrong place. If you are not sure, reedit the CMakeCache.txt
CMake Error: The source "/home/artiom/user/cpp-network-tasks/src/CMakeLists.txt" does not match the source "/usr/src/gb/src/CMakeLists.txt" used to generate cache.  Re-run cmake with a different source directory.

Что говорит о том, что конфигурации CMake различаются, вы запускаете его в разном окружении.

Чтобы исправить это, удалите каталог build и запустите сборку заново:

➭ rm -rf build && ./build_dockerized.sh

К оглавлению ⮐

Почему используется Linux?

  • Потому что, на Linux и BSD системах работают большинство сетевых приложений.
  • На Linux работает автор курсов.
  • Кроме Linux есть множество других ОС, и рассмотреть особенности каждой невозможно.
  • Перевод кода на Windows оговорён.
  • По возможности, код и так кроссплатформенный.

К оглавлению ⮐

Могу ли я собрать код на Windows?

Да, возможно собрать часть кода. Сборка проверялась на MS Visual Studio 2019.
Чтобы собрать код, надо открыть корневой CMakeLists.txt, как CMake проект.

Но есть следующие проблемы:

  • Есть код специфичный для Linux, например перехватчик вызовов, который будет собираться и работать только на этой платформе.
  • Некоторый код просто не был адаптирован для Windows, и его сборка выключена.
  • Есть редкие примеры, которые собираются, но работать корректно не будут (один из таких - асинхронный сервер на select()). Оно не работает, потому что не было достаточно времени и мотивации, чтобы доработать под Windows. Если вы считаете, что можете доделать такой код - You're welcome.
  • В Windows есть не все библиотеки, а CMake не имеет, например модуля для поиска Qt, если Qt не установлен. Это приводит к тому, что пример не просто нельзя собрать, если чего-то не хватает, а падает сборка. Конечно, возможно это исправить, если вы считаете, что нужно, репозиторий открыт для правок.

Также, есть некоторый код, специфичный для Windows, но в уроках он, как правило, не упоминается.

К оглавлению ⮐

А есть что-то про CMake?

Есть:

К оглавлению ⮐

Docker - что это?

Предполагается, что в процессе работы с курсом, вы будете активно использовать поиск.
Соответственно, Google поможет.
Если очень кратко, Docker - это один из вариантов реализации автоматизации инфраструктуры контейнеризации.
Он позволяет изолировать приложения в контейнерах, образы которых скачаны из репозитория. Здесь он нужен для того, чтобы:

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

Напомню, что образ с инструкциями лежит на Docker.hub. У GeekBrains есть поясняющее видео про C++ в Docker.

К оглавлению ⮐

Как использовать Docker?

На Windows только вместе с Linux подсистемой.
На Linux его надо установить, а как, зависит от вашего дистрибутива. Например, в deb-based это делается по следующей инструкции.

К оглавлению ⮐

У меня сборка только под суперпользователем (root) запускается, почему?

Управлять Docker, в том числе и запускать или останавливать контейнеры могут только:

  • Пользователь root.
  • Пользователи в группе docker.

Добавить вашего пользователя в группу Docker возможно по-разному. Один из вариантов, который будет работать для многих дистрибутивов:

$ sudo usermod -a -G docker "${USER}"

После этого надо завершить сессию, например выйти на Login Screen, и снова войти.

К оглавлению ⮐

Могу ли я собирать в IDE?

Это зависит от IDE. Возможно использовать удалённую сборку по SSH (сервер установлен в образе), некоторые IDE, такие как CLion, поддерживают работу с Docker напрямую.

К оглавлению ⮐

CLion

Пример настройки CLion показан здесь.

Настройки конфигурации Docker показаны на скриншоте:

Настройки конфигурации CMake:

К оглавлению ⮐

QtCreator

Раньше QtCreator не поддерживал удалённую сборку по SSH.

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

Возможно самый просто вариант - установить QtCreator в контейнер и запустить оттуда. На данный момент для этого собран образ. Чтобы запустить его, используйте:

./run -q

QtCreator, запущенный в Docker

К оглавлению ⮐

Не могу подключиться к Docker либо IDE его не видит, что делать?

Проверьте:

  • Установлен ли у вас Docker. Если нет - установите.
  • Достаточно ли прав у вашего пользователя, что с Docker взаимодействовать.

В большинстве дистрибутивов, при установке Docker создаёт группу docker, что вы можете проверить, выполнив следующую команду:

$ grep docker /etc/group
docker:x:997:

Видно, что пользователя в этой группе нет. Добавьте его туда:

$ sudo usermod -a -G docker "$USER"
$ grep docker /etc/group
docker:x:997:artiom

После того, как вы перелогинитесь в системе, группа будет видна:

$ groups
sys network power video storage lp input audio wheel artiom docker

К оглавлению ⮐

В образе чего-то не хватает

Возможно, образ устарел. Обновите его:

$ docker pull artiomn/gb-build-image
Using default tag: latest
latest: Pulling from artiomn/gb-build-image
Digest: sha256:be8e76c39543bd03f503a294d96dc578c5ad90b77c1473e6b03ef1feb88c0b0c
Status: Downloaded newer image for artiomn/gb-build-image:latest
docker.io/artiomn/gb-build-image:latest

К оглавлению ⮐

Работая в Docker я не могу испортить систему?

Можете. Контейнер запускается в privileged режиме. Т.е. из него возможно создавать устройства, а значит испортить всё, что угодно. Это требуется для того, чтобы сети, в частности Yggdrasil, могли создать TUN устройство.

К оглавлению ⮐

Как запустить собранное?

Если вы производили сборку, как указано выше, собранные бинарные файлы будут находиться в каталоге build/bin. Запустить вы их можете напрямую, однако из-за отсутствующих в системе зависимостей работать может не всё. Поэтому, запуск также производится в контейнере, используя команду ./run, которой передаются необходимые приложению аргументы и путь к нему.

Пример:

➭ ./run sudo ./build/bin/ping google.com
Pinging "google.com" [64.233.165.113]
Start to sending packets...
Sending packet 0 to "google.com" request with id = 29
Receiving packet 0 from "google.com" response with id = 29, time = 15.5ms

К оглавлению ⮐

Как запустить консоль?

  • ./run
  • docker-compose run --rm gb - для тех, кто пользуется docker-compose.

Обратите внимание: консоль запускается через скрипт ./run в корне репозитория, не через docker run.

К оглавлению ⮐

Где взять Netcat под Windows?

Например, здесь.

Внимание!
Windows Defender может заблокировать Netcat, определив его, как Netcat.Hacktool. В таком случае, просто отключите "защиту реального времени".

К оглавлению ⮐

Всё делаю правильно, но что-то не подключается

Такая проблема была у одного из студентов. Он выяснил, что Netcat подключался на IPv6 адрес, тогда как сервер прослушивал только IPv4. Как исправить? Зависит от приложения. Задайте ему не доменное имя, а IPv4 адрес явно, при возможности. Для Netcat возможно использовать опцию -4 (не все реализации её поддерживают).

К оглавлению ⮐

Я нашёл ошибку в коде, могу ли я её исправить

Да. Следуя обычному процессу Guthub:

  • Сначала делаете форк репозитория.
  • Клонируете его, исправляете ошибку.
  • Делаете Pull request.

Или просто можете просто завести Issue. Но, в этом случае, обещать быстрое исправление я не могу.

К оглавлению ⮐

А у меня вопрос!

Замечательно. Но прежде, чем задавать его преподавателю, вы пробовали найти ответ? Возможно, что его надо лишь поискать? У преподавателя не так много времени для того, чтобы делать это за вас. Если ответа нет - задавайте.

К оглавлению ⮐

cpp-network-tasks's People

Contributors

artiomn avatar f1resh avatar neon1ks avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

cpp-network-tasks's Issues

Change API in jwt-cpp

Take note!

In release v0.7.0-rc.0 from Dec 5, 2022:

  • get_payload_claims() was replaced by get_payload_json()

https://github.com/Thalhammer/jwt-cpp/releases

When updating the library, the following code is affected:

diff --git a/src/l6/jwt-cpp-example/main.cpp b/src/l6/jwt-cpp-example/main.cpp
index a2b6c8c..864499e 100644
--- a/src/l6/jwt-cpp-example/main.cpp
+++ b/src/l6/jwt-cpp-example/main.cpp
@@ -20,6 +20,7 @@ int main()
 
     verifier.verify(decoded);
 
-    for(auto& e : decoded.get_payload_claims())
+    // for(auto& e : decoded.get_payload_claims()) // old api
+    for(auto& e : decoded.get_payload_json())
         std::cout << e.first << " = " << e.second << std::endl;
 }

Could not load the Qt platform plugin "xcb" in "" even though it was found.

Здравствуйте @artiomn, при выполнении ./run -q выводится ошибка:

groupadd: GID '20' already exists
qt.qpa.xcb: could not connect to display :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.

В скрипте ./run аргумент -q ссылается на путь 'usr/bin/qtcreator'. Если через ./run зайти в образ и пройти по этому пути, то такого исполняемого файла там нет. Он появляется при установке qtcreator через "sudo apt install qtcreator", но проблема остается прежней.

По советам с сайта Qt посмотрел вывод дебагера Qt:

root@docker-desktop:/usr/src/gb# qtcreator
QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"eglfs"
]
},
"archreq": 0,
"className": "QEglFSIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("eglfs")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"linuxfb"
]
},
"archreq": 0,
"className": "QLinuxFbIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("linuxfb")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimal"
]
},
"archreq": 0,
"className": "QMinimalIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("minimal")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimalegl"
]
},
"archreq": 0,
"className": "QMinimalEglIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("minimalegl")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"offscreen"
]
},
"archreq": 0,
"className": "QOffscreenIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("offscreen")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"vnc"
]
},
"archreq": 0,
"className": "QVncIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("vnc")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so"
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"xcb"
]
},
"archreq": 0,
"className": "QXcbIntegrationPlugin",
"debug": false,
"version": 331520
}

Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "/usr/bin/platforms" ...
loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so"
qt.qpa.xcb: could not connect to display :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.

Aborted

Решил что может быть проблема в библиотеке "xcb". По советам с того же ресурса переустановил "libxcb-xinerama0" (ситуацию не поменяло). Вывод ldd:

root@docker-desktop:/usr/src/gb# ldd /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so
linux-vdso.so.1 (0x00007fff043f0000)
libQt5XcbQpa.so.5 => /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 (0x00007f8dfbb04000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f8dfb442000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f8dfaef7000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f8dface3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8dfab1e000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f8dfaad8000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f8dfaa13000)
libQt5DBus.so.5 => /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5 (0x00007f8dfa98c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8dfa96a000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f8dfa965000)
libxcb-icccm.so.4 => /usr/lib/x86_64-linux-gnu/libxcb-icccm.so.4 (0x00007f8dfa95e000)
libxcb-image.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-image.so.0 (0x00007f8dfa958000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f8dfa951000)
libxcb-keysyms.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-keysyms.so.1 (0x00007f8dfa74e000)
libxcb-randr.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-randr.so.0 (0x00007f8dfa73c000)
libxcb-render-util.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0 (0x00007f8dfa538000)
libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f8dfa529000)
libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007f8dfa524000)
libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f8dfa518000)
libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007f8dfa50e000)
libxcb-xinerama.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xinerama.so.0 (0x00007f8dfa509000)
libxcb-xkb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-xkb.so.1 (0x00007f8dfa4eb000)
libxcb-xinput.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xinput.so.0 (0x00007f8dfa4c7000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f8dfa49c000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f8dfa290000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f8dfa14d000)
libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f8dfa142000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f8dfa124000)
libxkbcommon-x11.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 (0x00007f8dfa11a000)
libxkbcommon.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f8dfa0d7000)
libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f8df9fa6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8df9e62000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f8df9e47000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f8df9dc0000)
libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f8df9d86000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8df9d67000)
libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f8df9c7f000)
libmd4c.so.0 => /usr/lib/x86_64-linux-gnu/libmd4c.so.0 (0x00007f8df9c6d000)
libdouble-conversion.so.3 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.3 (0x00007f8df9c56000)
libicui18n.so.67 => /usr/lib/x86_64-linux-gnu/libicui18n.so.67 (0x00007f8df9950000)
libicuuc.so.67 => /usr/lib/x86_64-linux-gnu/libicuuc.so.67 (0x00007f8df9767000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8df9761000)
libpcre2-16.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-16.so.0 (0x00007f8df96d5000)
libzstd.so.1 => /usr/lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f8df95fa000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8dfbc7c000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f8df95cb000)
libuuid.so.1 => /usr/lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f8df95c2000)
libbrotlidec.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f8df95b4000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f8df955d000)
libxcb-util.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-util.so.1 (0x00007f8df9555000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f8df9550000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8df934a000)
libbsd.so.0 => /usr/lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f8df9333000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f8df92be000)
libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f8df9206000)
libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f8df91d2000)
libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f8df91a6000)
libicudata.so.67 => /usr/lib/x86_64-linux-gnu/libicudata.so.67 (0x00007f8df768d000)
libbrotlicommon.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f8df7668000)
libsystemd.so.0 => /usr/lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f8df75b3000)
libmd.so.0 => /usr/lib/x86_64-linux-gnu/libmd.so.0 (0x00007f8df75a6000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8df759b000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f8df7573000)
liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f8df754e000)
libgcrypt.so.20 => /usr/lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f8df742e000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f8df7408000)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.