LINUX.ORG.RU

Избранные сообщения Rot1

Добро пожаловать в Сити 17!

Галерея — Рабочие места

Так получилось, что на днях мне наконец доставили Valve Index, предзаказанный ещё в начале марта. Как раз к выходу нативной линуксовой версии Half-Life: Alyx!

Решил тут кратко описать впечатления от железа и софта, на случай если кого-то интересует насколько все эти VRные дела сейчас юзабельны под линуксом. До этого опыта с VR у меня не было вообще.

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

>>> Просмотр (1920x2520, 4327 Kb)

 , , ,

im-0
()

Я просто правил бочку

Галерея — Скриншоты

Привет, ЛОР!

Прошло больше года с моего первого скриншота в галерее. Изменилось мало, всё та же Manjaro с крысой на борту. Привёл иконки к единому благообразному виду, оценил достоинства vala-panel-appmenu, сменил тему на модную нынче matcha-dark. Выбрал вариант aliz из-за тёплого красного оттенка, глазам приятно. ШГ — Roboto Condensed.
Терминал используется только для yay, система отполирована, пережила переезд на новый накопитель, проблем не вызывает, несмотря на testing ветку manjaro.
К чему всё это? Прошло два года с моего первого знакомства с линуксами до полного отказа от винды. Ardour заменил мне Cubase, Tuxguitar — Guitar pro, а Audacity — Goldwave. Барабашки здесь — DrumGizmo, эмуляторы гитарного усилителя и педалей — kpp. Список нативных игр выглядит так

 $ ls /usr/local/games
ioquake3  ut2004
 $ ls /games          
 boohu              Half-Life-2                     LISA            Tropico.5
 CrusaderKings2     hmm3                            quake4          UnrealTournament
'Darkest Dungeon'  'Hotline Miami'                  Terraria       'Vambrace - Cold Soul'
 doom3             'Hotline Miami 2 Wrong Number'   TES3MW
 Half-Life         'Kingdoms and Castles'          'Torchlight 2'

КМК, более чем достаточно

Я просто правил бочку и подумал, что если сильно не выёживаться, то под линуксом очень неплохо живётся. Пустой стол, Sunflower и GNU IceCat, обоина, угнана с рандомной имиджборды

Спасибо за внимание, критикуйте

>>> Просмотр (1600x900, 208 Kb)

 , , ,

Fake
()

Ноутбуки System76 с Coreboot

Новости — Hardware and Drivers
Группа Hardware and Drivers

Тихо и незаметно появились современные ноутбуки с прошивкой Coreboot и отключённым Intel ME от компании System76. Прошивка открыта частично и содержит ряд бинарных компонент. В настоящий момент доступны две модели.

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

>>> Подробности

 , , , ,

ioctl
()

QSettings для кириллицы

Форум — Development

Доброго времени суток. Есть файл в кодировке Windows-1251 следующего содержания:

[bar]
hello=world

[бар]
hello=world

Пытаюсь его прочесть:

QSettings s("/home/vanya/winfolder/foo.txt", QSettings::IniFormat);

QTextCodec* c = QTextCodec::codecForName("CP1251");
s.setIniCodec(c);

qDebug() << s.childGroups();

Получаю ("bar", "áàð") . Если закомментировать строку с указанием кодировки, то вывод тот же. В документации к setIniCodec сказано:

The codec is used for decoding any data that is read from the INI file ... By default, no codec is used, and non-ASCII characters are encoded using standard INI escape sequences.

Чему вообще не соответствует поведение моего кода. Вопрос: как правильно получить значения на русском языке?

Если foo.txt открыть в кодировке latin1, то там будут те же áàð. Тогда для чего я использую функцию setIniCodec? В моем понимании она как раз используется, чтобы правильно конвертировать текст из файла в utf-16. Тогда в чем проблема?

 , , ,

Rot1
()

Есть ли жизнь без Android Studio?

Форум — Development

Нужен простой путь быстро получить простое приложение. Он вообще существует?

Что нужно в итоге: приложение, которое a) рендерит на экран данные из sqlite или json файла, b) редактирует эти данные, с) может стучаться на сервер по http за получением каких-либо данных.

Что нужно в процессе: никакого JB-комбайна, никаких Java/Kotlin, никакого React'a, обычный редактор (максимум QtCreator) и простота конечной сборки.

Как понимаю, есть два варианта:

1) C++ / Qt / NDK
2) Приложение-браузер выполняющий JavaScript (это в сторону Electron и Cordova смотреть нужно? и простой ли это путь?)

Есть ли доступный пошаговый гайд по (быстрой) разработке/сборке/портированию без Java&Android Studio?

 , , , ,

Edward_I
()

c++ и utf-8

Форум — Development

Допустим есть файл сохранённый в UTF8. Читать я его могу исключительно std::ifstream (без std::wifstream).

После прочтения файла, я хочу иметь возможность итерироваться по utf-8 символам, и даже сравнивать их

for (size_t i = 0; i < utf8String.size(); i++) {
    if (utf8String[i] == 'ф') {
        //...
    }
}

Т.е. я хочу чтобы была возможность работать с каждым utf-8 символом, в независимости от того какой он длинны как с одним символом.

Что мне для этого нужно?

Я думал что wchar_t. Но есть такие два источника: 1. https://ru.wikipedia.org/wiki/Широкий_символ 2. https://stackoverflow.com/questions/17871880/should-i-use-wchar-t-when-using-...

Которые вроде как говорят что это не очень хорошо.

Еще я заметил (да на ++ уже пишу и не первый год), но заметил только сейчас, т.к.раньше просто не думал про это ибо не было нужно:

что std::wstring wstr = L"добро"; //да, система дебиан 8, x86-64, исходник сохранен в utf8.

в общем wstr==«добро» в оперативной памяти будет представлено не в utf-8 а в неведомой кодировке. Но по которой можно итерироваться и сравнивать.

Буква 'д' из этой строки будет иметь следующий байт-код 00110100 00000100 00000000 00000000 (wchar_t)

При этом если бы 'д' была в utf8 то она должна была бы иметь такие байты 11010000 10110100 {00000000 00000000} - в скобках хвост который как бы не имеет отношение к коду 'д', но заполняет тип wchar_t.

Вопросы: Можно ли как-то сделать так чтобы компилятор (g++) видя wchar_t c = L'д' или whchar_t c = 'д' - конструировал utf8 букву в wchar_t типе, а не в непонятной кодировке. И кстати в какой кодировке он её кодирует по умолчанию?

Есть ли какой-то способ прочитать преобразовать utf-8 строку, хранимую в std::string в std::wstring так чтобы после такого преобразования содержимое этой wstring можно было бы корректно вывести в std::wcout?

Я нашел такой способ Преобразование std::string в std::wstring

Но во первых он какой-то страншный и не очень понятный, какие-то шаблоны актуализируются...

А самое главное в моём debian8 и gcc4.3 нет такого хедера include <codecvt>

Поэтому у кого поновее пакетная база, и кому не лень, пожалуйста из ссылки выше запустите пример. Сделайте std::string str(«добро») и преобразуйте её в std::wstring Нужно чтобы после преобразования wstring строка корректно выводилась в std::wcout и можно было побуквенно (а не побайтово) итерироваться по ней, и посимвольно сравнивать.

В общем, т.к. у меня нет этого codecvt я сделал преобразование руками (да можно красивее, переносимее (учитывать порядок байт), при вызове из main не выходить за границы строки и т.д. и т.п. - не суть): https://pastebin.com/4E3nuNcM

и вот если приблизительно таким методом конструировать std::wstring которая содержит utf-8 можно будет итерироваться по ней (да, я знаю что utf8 может быть длиннее чем размер wchar_t, но у меня будет набор латиницы и кириллицы из utf8 документа), можно будет сравнивать с символами, но к сожалению не так wstr[0] = 'ы' а только с заранее созданными символами, подобным методом как строка создавалась. wstr[0] == wcharSymbol.

Это не удобно, а еще такая строка не может корректно выводится на std::wcout.

Т.е. заключительный вопрос - можно ли как-то пользуя нативный wchar_t работать посимвольно с utf-8 в c++ в линукс, имея полный ф-л такой как итерации, посимвольное сравнение, корректный вывод в std::wcout.

Если нельзя - есть ли возможно какие-то сторонние (причем легковесные библиотеки, код которых можно включить в проект, и собрать статически, и чтобы места не много тратили) которые предоставляют некий тип wideChar, полностью совместимый и с std::wcout и со всей stl(конейнерами, алгоритмами) и при этом желательно кросплатформенная?

Кстати в презренной винде на этом же наборе символов utf8 (латиница и кириллица) - всё очень хорошо (плохо там будет когда потребуется символ длиннее 2 байт) - т.к. там wchar_t это 2 байта, т.е. он как раз отлично соотвествует, и в wcout тоже выводится :)

Просьба не флудить а по конкретике писать :)

 , , , ,

bonta
()

Динамические библиотеки, конспект

Форум — Development

Привет. Так вышло, что пришлось основательно разобраться в теме и пока память свежа изложил всё в виде небольшой памятки. Удобно по прошествии некоторого времени освежить память прочитав небольшой конспект. Вообще, по-хорошему, блог что ли какой завести )). Просьба - не флудить, ссылки/комментарии/дополнения по теме приветствуются. ЗЫ: подразумевается, что либы -fpic

1. Утилиты readelf, objdump. Читать man elf, man ld.so. N в именах структор
   подразумевает 32 или 64.
2. Структура ELF файла:
   1. заголовок (смещение 0, struct ElfN_Ehdr). Readelf::ELF Header
   2. program header table (массив struct ElfN_Phdr). Содержит информацию о том
      как отображать секции в память процесса. Readelf::Program Headers
   3. section header table (массив struct ElfN_Shdr). Readelf::Section Headers
3. link_map   
3.1. Загруженные в память модули попадают в список (массив) из struct link_map.
     Списков может быть много, каждый список - "пространство имён". Для
     загрузки модулей в неглобальный список (создание нового) используется
     dlmopen().
3.1. Получать link_map модуля через dlinfo() или dladdr1():
     [--code--]
     #define _GNU_SOURCE
     #include <link.h>
     #include <dlfcn.h>
     #include <stdio.h>
     int main()
     {
        static char addr_in_mod;
        Dl_info __info;
        struct link_map *lm;
        if(dladdr1(&addr_in_mod, &__info, (void*)&lm, RTLD_DL_LINKMAP) != 0) {
           printf("link_map:\n");
           struct link_map *i = lm;
           for(; i->l_prev != NULL; i = i->l_prev);
           for (; i != NULL; i = i->l_next)
              printf("addr diff=%p  name=%s%s",(void*)i->l_addr,  i->l_name, i==lm?"  <--cur\n":"\n");
        }
     }
     //output:
     //link_map:
     //addr diff=0x41f000  name=  <--current module
     //addr diff=0xb7fc4000  name=linux-gate.so.1
     //addr diff=0xb7fa3000  name=/lib/libdl.so.2
     //addr diff=0xb7dc5000  name=/lib/libc.so.6
     //addr diff=0xb7fc6000  name=/lib/ld-linux.so.2
     [/--code--]
3.2. Во время переразмещений символ ищется в модулях указанных в link_map
     списке начиная от начала списка т.е. порядок важен, "gcc -ls1 -ls2"
     libs1.so находится в списке раньше, чем libs2.so.
3.3. При добавлении библиотеки через LD_PRELOAD, она попадает перед остальными
     разделяемыми библиотеками в глобальном link_map списке.
3.4. Опция RTLD_DEEPBIND для dlopen - собственные символы модуля приоритетнее
     символов из вышестоящих в link_map списке модулей.
     Собственные символы загружаемой библиотеки содержат:
      1. символы из самой загружаемой библиотеке
      2. символы из библиотек, которые были слинкованы с загружаемой из
         командной строки (у первых приоритет выше).
3.5. При загрузки через dlopen, библиотеки добавленные с флагом RTLD_GLOBAL
     имеют приоритет над RTLD_LOCAL, не смотря на то, что находятся в link_map
     списке позже (не относится к получению void f() через dlsym()). Например:
     [--code--]
     // предоставляет void f(), ссылается на void f().
     dlopen("lib1.so", RTLD_LOCAL);
     // предоставляет void f().
     dlopen("lib2.so", RTLD_GLOBAL);
     // при ленивом переразмещении, lib1.so будет ссылаться на lib2.so::f().
     [/--code--]
4. RTLD_GLOBAL - символы из загруженного модуля будут участвовать в
   переразмещениях для заргуженных в дальнейшем библиотек. RTLD_LOCAL - не будут.
   Если lib2.so линкуется с lib1.so через командную строку
   "gcc -fpic -shared -l2 s.c -o lib1.so", то видимость символов из lib2.so
   наследуется от видимости символов из lib1.so:
   [--code--]
   dlopen("./lib1.so", RTLD_LAZY|RTLD_GLOBAL);    // символы из lib2.so глобальные
   dlopen("./lib1.so", RTLD_LAZY|RTLD_LOCAL);     // символы из lib2.so локальные
   [/--code--]
   Если lib2.so подгружается из lib1.so через dlopen(), то видимость символов
   из lib2.so контролируется флагом dlopen() при загрузке lib2.so. Способ
   загрузки (через командную строку или dlopen) и флаг для dlopen при
   загрузки lib1.so значения не имеет.
5. Переразмещение (relocation).
5.1. Переразмещение - процесс соединения символьной ссылки с символьным
     определением.
     Переразмещение: ленивое - загрузчик вызывается при ссылке на символ, и
     ненеленивое - переразмещение при загрузке. Переразмещение переменных всегда
     неленивое.
5.2. Символы, требующие переразмещения, содержатся в .rel... секциях. В них
     находятся ElfN_Rel структуры.
     [--code--]
     typedef struct {
         Elf32_Addr r_offset;    \\ адрес внесения правки (адрес в GOT, например. readelf::Offset).
         uint32_t   r_info;      \\ содержит тип переразмещения и индекс в таблице символов (массив Elf32_Sym[]).
     } Elf32_Rel;
     typedef struct {
         uint32_t      st_name;   \\ индекс в таблице строк. Т.е. сопостовляет символ с Си строкой.
         Elf32_Addr    st_value;  \\ адрес символа в текущем модуле (readelf::Sym.Value).
         uint32_t      st_size;
         unsigned char st_info;
         unsigned char st_other;
         uint16_t      st_shndx;
     } Elf32_Sym;
     [/--code--]
5.3. Механизм обращения к переменным (требующим переразмещений):
     1. линкер на старте правит .got секцию, она начинает указывать на нужные
        данные.
     2. ссылка на переменную в коде (в .text секции):
          [--code--]
          call   44c <__x86.get_pc_thunk.ax>  # получаем в eax адрес следующей инструкции
          add    $0x1bcb,%eax                 # в eax адрес .got секции
          mov    0x14(%eax),%edx              # отступ от края .got на адрес переменной,
                                              # разыменовываем в edx
          [/--code--]
5.4. Механизм обращения к функциям, для пример - exfn():
     1. ссылка на exfn() в коде (в .text секции)
     2. переход на "трамплин" в .plt секции - plt@exfn()
     3. переход на разыменованный указатель из .got.plt, если переразмещение
        уже было произведено, то попадаем на exfn(), иначе:
        3.1. возврат в plt@exfn(), в стек кладётся смещение в .rel.plt
             секции Elf32_Rel структуры и указатель на link_map список
        3.2. вызов ld.so, правится указатель в .got.plt
        3.3. переход на exfn().
6. .dynamic секция может быть прочитана из программы через массив _DYNAMIC[],
   который содержит struct ElfN_Dyn, автоматически заполняется линкером.
7. Экспортируемые символы из elf модуля указываются в .dynsym секции.
8. -rdynamic опция линкера (для исполняемого ELF) - символы из exe, которые не
   были востребованы библиотеками, указанными в командной строке, не
   экспортируются (не указываются в .dynsym секции) и не участвуют в
   переразмещениях в библиотеках, которые подргружаются через dlopen. Данная
   опция заставляет линкер помещать в таблицу все функции.
9. Управление экспортом из модуля
   * Управление экспортом по умолчанию:
     gcc -fvisibility=default
     -fvisibility=hidden
     -fvisibility=internal
     -fvisibility=protected
   * Управление экспортом посимвольно:
     __attribute__ ((visibility ("hidden")));
     __attribute__ ((visibility ("hidden")))
   * Для группы:
     #pragma GCC visibility push(hidden)
     ...
     #pragma GCC visibility pop
   * static и анонимные namespace
   * Управление эспортом через export map, через опцию --version-script

 , , ,

pavlick
()

Библиотека для архивации каталога с файлами

Форум — Development

Если такая существует, то подскажите название

 ,

Coleas
()

Не определяется SSD.

Форум — Linux-install

Доброго времени суток. Купил SSD с разъемом M.2 (Intel 760p Series [SSDPEKKW128G8XT]), поставил, отображается в /dev, разметил с помощью parted. Установил загрузчик и заметил, что во-первых, диск не видно в интерфейсе прошивки (UEFI), во-вторых, все загрузочные записи на этот диск игнорируются и сбрасываются после перезагрузки. По итогу я имею систему и загрузчик, который не может загрузить EFI. Венда тоже не ставится на этот SSD, история та же: установка системы проходит без ошибок, просьба перезагрузиться, перезагрузка обратно в установщик т.к вендовый загрузчик просто игнорируется и в загрузочном меню кроме флешки ничего нет.

На прошлом HDD такой проблемы нет. Как можно пофиксить?

 , , , ,

Rot1
()