LINUX.ORG.RU

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

Ресурсы для подготовки к сертификациям

Форум — Talks

С наступающим!

Посоветуйте годные сайты на которых можно брать инфу для подготовки к разного рода сертификациям - CCNA, ITIL, Red Hat и т. п.

 , , , ,

Kroz
()

Глобальное меню для GTK в KDE

Форум — Desktop

Привет, ЛОР!

При выходе KDE 5.13 повсюду писали, что теперь-то глобальное меню для программ на GTK будет поддерживаться, но у меня почему-то при обновлении этого не случилось. Расскажи, как именно это делается?

У меня сейчас NixOS Unstable с KDE 5.14. Для программ на Qt, а так же для Libreoffice глобальное меню выводится как надо. Проблема только с программами на GTK3.

 ,

hateyoufeel
()

Генерация кода по кастомным compile-time аттрибутам в C++

Форум — Development

Небольшой вопрос к C++-волшебникам.

Мне хочется на функции навесить что-то вроде аттрибутов (compile-time аннотаций из C#/Java), чтобы потом в момент компиляции/сборки их проанализировать и что-то сделать.

Например так: `int [[static_boundary(«immutable»)]] foo()`

В момент компиляции оно должно будет увидеть этот аттрибут и обернуть foo в небольшую функцию-обёртку (например, сгенерив слегка видоизмененный файл, или напрямую запатчив AST в компиляторе)

Зачем это нужно. Например этот аттрибут в примере будет говорить, что мы считаем всё внутри foo немутабельным, даже если по синтаксису кажется , что это не так, и на основании этого выполняется несколько дополнительных однократных глобальных инициализаций. Не спрашивайте, зачем.

Эта фича нужна скорей не по виду, а по смыслу. Другие формы записи того же самого тоже подойдут (если они кроссплатформенно работают с clang).

Проблема в том, что если просто так навесить мою [[static_boundary]], то в AST (по крайней мере в clang) её не будет. Нужно пересобирать комплиятор, запатчив список аттрибутов в Attr.td. Ну и потом вообще придётся напрямую эксплуатировать clang, пусть даже он и умеет работать как библиотека. Все это как-то мерзко и анально.

Есть ли какие-нибудь более красивые решения?

 

stevejobs
()

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

Форум — 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
()

How to LDFLAGS?

Форум — General

Не догоняю синтаксис в LDFLAGS.
Например, чем отличаются следующие записи и какие из них правильные.

LDFLAGS="-Wl,-O2 -Wl,--as-needed,--sort-common,--strip-debug"
LDFLAGS="-Wl,-O2 -Wl,--as-needed -Wl,--sort-common -Wl,--strip-debug"
LDFLAGS="-Wl,-O2 -Wl,--as-needed -Wl,--sort-common -Wl,--strip-debug -fuse-ld=lld"

 , , , ,

Deleted
()

Vim и русские буквы

Форум — Development

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

Ну и вообще - какие есть способы подружить Vim с двуязычным набором?

 ,

Deleted
()

Vim: Объяснение настройки nowritebackup

Форум — Development

Объясните, пожалста, что означает настройка set nowritebackup. По дефолту, Vim создает в рабочей директории всякие разные служебные файлы. Если они не нравятся, от них можно избавиться через настройки nobackup, noswapfile и noundofile. Но что делает nowritebackup?

" Настройки        " За какой файл каждая из них отвечает
" ---------------- " ------------------------------------------------
set nobackup       " Foo.ext~, создаваемый при сохранении Foo.ext
set nowritebackup  " ?
set noswapfile     " .Foo.ext.swp, создаваемый при открытии Foo.ext
set noundofile     " .Foo.ext.un~, создаваемый при сохранении Foo.ext

:help writebackup я конечно читал, но не понял.

 

Deleted
()

Gentoo + bspwm

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

Получил в подарок (выменял на выпивку) китайский SSD GLOWAY FER120GS3-S7 всего лишь с парой битых секторов, поставил в личный Thinkpad X220.

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

WM - bspwm. Панель - polybar. Композитный менеджер - compton. За уведомления отвечает dunst.

Терминал - urxvt, текстовый редактор - Geany, файловый менеджер - PCmanFM.

Для музыки - DeadBeef, для видео - SMPlayer. Браузер - Firefox 60.

GTK Theme - Ultimate-Maia-Azul, иконки - Blue-Maia.

Шрифты: в системе и в панели - Sans 9 и 10, для значков в панели - Font Awesome 11, в терминале - SauceCodePro Nerd Font 11.

Еще скриншоты: PCmanFM+DeadBeef+SMPlayer, Firefox c ЛОР'ом+Geany, терминалы, обои в jpg.

>>> Просмотр (1366x768, 962 Kb)

 , , ,

mad_austronaut
()

Помогите с настройкой гибернации в генте (своп на LVM on LUKS)

Форум — General

Вот вся инфа, которую догадался предоставить.

# zcat /proc/config.gz | grep HIBER
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y

# zcat /proc/config.gz | grep SUSP
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_OLD_SIGSUSPEND3=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
# CONFIG_SUSPEND_SKIP_SYNC is not set
# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set

# cat /proc/cmdline
BOOT_IMAGE=/kernel-genkernel-x86_64-4.16.2-gentoo root=/dev/mapper/lvm-root ro crypt_root=UUID=74f4955f-b422-4abe-8bcf-8329919222aa dolvm real_root=UUID=bbd59fba-ed35-4289-86a1-5c16106f2317 real_resume=UUID=a6401d1c-1769-45b0-b582-8b16e238f6bf

# lsblk -o name,type,mountpoint
NAME           TYPE  MOUNTPOINT
sda            disk 
├─sda1         part  /boot/efi
├─sda2         part 
│ └─cboot      crypt /boot
└─sda3         part 
  └─root       crypt
    ├─lvm-swap lvm   [SWAP]
    ├─lvm-root lvm   /
    └─lvm-home lvm   /home
sr0            rom 

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

Что я понял из процесса загрузки: сначала грубом грузится ядро, чё-то там своё делает, потом передаёт руль initramfs, который просит у меня пароль от рута, разблокирует его и получает-таки доступ к заветному свопу, на который s2disk в прошлый раз уложил (кстати, вроде бы вполне успешно) систему спать.

Судя по всему, initramfs свою функцию выполняет, т.к. после ввода пароля я замечаю в летящем вверх логе что-то про real_resume, обнаруженный на /dev/dm-1, а ещё убеждаюсь, что initramfs успел записать этот самый /dev/dm-1 в /sys/power/resume (в чём я убеждаюсь чуть позже, после провала resume):

# cat /sys/power/resume
253:1
# file /dev/dm-1
/dev/dm-1: block special (253/1) 
Тем не менее, лог продолжает лететь вверх, а мне всучивают новую систему, нагло игнорируя содержимое свопа и ломая мне неотмонтированные при уходе баиньки файловые системы.

Я точно не знаю, что здесь не так и почему лыжи не едут, но у меня есть несколько гипотез:

1) «253:1» - не совсем тот формат, который нужен в новых модных ядрах линя (у меня 4.16.2, если что)

2) запись в /sys/power/resume происходит невовремя (например, когда примонтирован настоящий рут, или, наоборот, не примонтирован)

3) просто кривые конфиги ядра

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

Я ещё слышал, что существуют разные виды саспенда, типа TuxOnIce и swsusp, нифига не понял, чем они отличаются, и пришёл к выводу, что у меня swsusp, исходя из структуры каталогов на /sys. Если это не так, то я вообще не в ту сторону думаю, тогда проясните мне ситуацию.

 , , ,

tsmx
()

Gentoo live usb

Форум — Linux-install

Здравствуйте, в общем проблема такая: Решил поставить Генту с live usb, сделал все по хэндбуку (rufus, syslinux, Universal-USB-Installer), ничего не срабатывает, а именно BIOS не видит флешку, пробовал три разных накопителя - результат тот-же. Тем-же руфусом заливаю венду и бац - биос видит USB-HDD и успешно грузится с него. В чем может быть дело?

 , ,

Banzai
()

Черный кабинет

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

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

После увольнения с работы пару лет назад остро встала задача оборудовать кабинет дома. Немедленно были куплены стол и стул, которые вы видите. Со стулом угадал великолепно — дырчатый Бюрократ прекрасен: качалка присутствует, спина и окрестности не потеют, я очень доволен.

Стол из икеи тоже прекрасен, регулируемая высота, много места, пространство для ног на обратной стороне, но на момент покупки в наличии не было крышки светло-серого цвета, пришлось брать черную, что крайне непрактично в случае стола. А так — места хватает для комфортной работы двух человек, когда жена решает поработать из дому, ну или на одного человека и свалки бумаг и барахла, когда нет энтузиазма разгребать.

Рабочий ноутбук TP X1 4th gen на Убунте — идеален для работы. Работаешь на нем дома по стопицот часов в неделю, потом подрываешься и едешь или летишь куда-нибудь — ноутбук одинаково прекрасен во всех сценариях.

Десктоп в основном собран вот из этого, работает на десяточке. Первый месяц я просто за голову хватался, ну как так может быть, что в убунте и андройде мой сетевой принтер подключается по «найти принтер» -> «далее» -> «далее», а в десяточке его не установить без соединения шнуром. Или, например, почему какому-нибудь несчастному обновлятелю какой-нибудь не нужной программы позволено свернуть мою игру, чтоб спросить не хочу ли я обновиться. Сейчас уже привык, но было трудно после почти десяти лет исключительно на линуксе.

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

Понял что и широким тоже пользоваться не буду, купил вместо него чисто игровой ASUS XG32V. Шревты на нем очень страшные из-за задранной четкости, но для игр — самое то. Смонтировал его на сторонней веса руке, что позволяет развернуть и вытянуть его налево, в сторону дивана, и оттуда комфортно смотреть всякое. На ультрашироком стандартное видео издалека смотреть было бы не так комфортно.

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

Освещение в комнате такое, что на телефон получить фотку без косяков невозможно — или слишком ярко для него (засветы), или слишком темно (шум). Это, наверное, единственный минус — а так, работать я люблю в темноте.

Раз

Два

Три

>>> Просмотр (3772x2747, 2246 Kb)

 

gistart
()

Нормальный автокоплит vim8. Ярости тред

Форум — General

Я очень добрый и спокойный человек...но это мать его уже мне мозг выносит, все без исключения автокоплитеры которые я использовал унылое говно постоянно отваливающееся, тупое как пробка, уродливо архитектурно и требует что бы сходилась луна над созвездием водолея при восходе солнца над фудзиямой и лёгкий ветерок должен колыхать третий леписток цветка сакуры. А где он третий один лишь рак знает что взобравшись на гору ждёт голоса с выше о конца и готовый свистнуть знаменуя успешность комплита мать его за ногу.

Я не буду перечислять все комплитеры вроде ycm / deoplete и прочие, все они унылые и тупые создания. Я скорее про то что бы узнать может появились ещё какие плагины автокомплита, которые сами способны без конфигов на каждый чих и тысячи let:g сожрать /usr/include и корневой каталог проекта и текущий файл и банально автодополнять.

 , ,

Deleted
()

А бросьте в меня краткой но ёмкой докой по С++ новинкам из стандартов [11-17]

Форум — Development

Я пишу на 98м стандарте, из 11 только... да ничего кроме возможности не ставить пробел между угловыми скобками при описании вложенных контейнеров не использую.

Есть какое-то исчерпывающее, но краткое чтиво? Стандарт читать грустно и долго.

 

Deleted
()

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

Форум — General

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

typedef MyTmpl<int> MyTp1;
typedef MyTmpl<int> MyTp2;

MyTp1 tp1 = 0;
MyTp2 tp2 = tp1; // что бы это не компилировалось...

Если делать наследование вместо typedef то оно не компилируется, но не работают все определения операторов и прочие ссылки типа MyTmpl в самом классе.

Суть вопроса в том, что мне нужен тип типа идентификатор. Несколько разных идентификаторов, например идентификатор файла FileId, идентификатор объектов Obj1_Id и Obj2_Id, и т.д. Что бы все они поддерживали математические операторы, но что бы между собой их нельзя было напутать присвоить один тип в другой.

 

victor79
()

Автоматическая сортировка изображений по содержимому

Форум — General

Всем привет. Есть папка, с примерно 20 тысячами изображений типо «wallpapers». Так вот, какие-то обделенные женским вниманием накидали туда вагон и маленькую телегу тяночек в разных позах.

Может кто-то встречал инструмент, который позволит отсортировать все картинки с людьми в отдельную папку?

Интересно посмотреть исходники, поэтому лучше, если это будет что-то открытое.

Поиск по форуму и поверхностное гугление приводят меня к openBiometry, что не совсем то, что мне нужно, или OpenCV. Последний я пока не осилил, но смотрю в его сторону.

Вопрос задаю потому что, возможно, кто-то видел/знает/пользовал альтернативы и может подсказать как оно работает :)

 ,

Crystal_HMR
()

Итоги первого года развития LineageOS

Новости — Android
Группа Android

В декабре отмечает свой первый день рождения альтернативная операционная система LineageOS для Android-смартфонов, основанная на CyanogenMod. В честь этого руководители проекта опубликовали статистику использования системы в виде инфографики. Первые 4 места среди пользователей занимают страны BRICS (Индия, Китай, Бразилия, Россия), замыкает пятерку Германия. Всего поддерживается более 180 устройств от 23 производителей, зарегистрировано 1.7 млн активных установок и более 700 разработчиков.

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

 , ,

linuks
()

Быстрый ассоциативный массив для чтения

Форум — Development

Задача сделать констаный асоциативный массив строка -> число для С++. Т.е. после создания он изменяться не будет.

Далее

using обьект = "констаный асоциативный массив строка -> число";

Условия:

  • Обьект создается только один раз
  • Можно чтоб обьект был инициализирован до вызова main
  • Ключи (строки) и значения (числа) известны уже на этапе компиляции и не изменяются с этого момента.
  • Ключи как и значения уникальны (т.е. значения не повторяются, а одному ключу соответствует только одно значение)
  • На 90% ключей состоят ровно из 3 символов: большие буквы A-Z и/или цифры 0-9. Остальные 10% ключей не превышают в длинне 15 символов (однако могут иметь также и маленькие буквы a-z).
  • Ключи можно вычислять из строки, главное чтоб выполнялось:
    f(x) != f(y) для (x != y), (x, y) на всем множестве ключей
    f(x) == f(x) для x на всем множестве ключей
    
  • Приоритетом является быстрый доступ к значению по точному ключу
  • Требуется механизм проверки присутствует ли ключ (т.е. входные данные не всегда валидны)
  • Необходима возможность добавления новых пар ключ-значение в последующих компиляциях (ну, чтоб по крайней мере это не было адски сложно)
  • Стандарт C++14 (и можно использовать фичи из C++17)

Желательно (но не обязательно):

  • Сборка обьекта в compile-time (напр. constexpr)
  • Возможность итерации по всем ключам обьекта
  • Чтоб значения не были слишком сильно разбросаны

Чем можно пренебречь:

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

Сейчас, чтоб сильно не заморачиватся, используется

using namespace std::string_view_literals;

const std::unordered_map<std::string_view, int> map{
    { "key"sv, 42 },
    // ...
};

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

Т.е. было бы прикольно даже иметь хеш-функцию f(str) -> int которая бы гарантировала отсутствие коллизий и не слишком разбросанные значения.

 ,

KennyMinigun
()

cd автоперебор

Форум — General

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

 ,

q3ta
()

Избежать повторения кода с помощью C++11 range-based for

Форум — Development

Допустим, есть какие-то единообразные инструкции над несколькими переменными

if(x % 2 == 0) ++x;
if(y % 2 == 0) ++y;
if(z % 2 == 0) ++z;

Как такое делается в современном c++? Я попробовал range-based for, но заработал только вариант с указателями.

for(auto t: {&x, &y, &z})
    if((*t) % 2 == 0) ++(*t);

Reference/dereference тут выглядит явно неуместно. Можно как-то по-другому?

Update

С помощью анонимусов получилось вот такое решение

#include <cstdio>
#include <initializer_list>
#include <functional>

#define rlist(x, ...) (std::initializer_list<std::reference_wrapper<decltype(x)>>({x, __VA_ARGS__}))

int main()
{
    int x = 2, y = 3, z = 4;
    for(auto t : rlist(x, y, z)) if(t % 2 == 0) ++t;
    printf("%d %d %d\n", x, y, z);
    return 0;
}

При использовнии выглядит достаточно прилично (а на макрос можно не смотреть). Требует стандарта C++11. Что с производительностью - пока не знаю.

Update 2

Решение на шаблонах от eao197

#include <iostream>
using namespace std;

template<typename F> void apply_to_all(F &&) {}

template<typename F, typename T, typename... O>
void apply_to_all(F && f, T && x, O && ...other) {
	f(forward<T>(x));
	apply_to_all(forward<F>(f), forward<O>(other)...);
}

int main() {
	int x = 2, y = 3, z = 4, v = 5, w = 6;
        apply_to_all([](int & v) { if(v % 2 == 0) ++v; },
		     x, y, z, v, w);
        apply_to_all([](int v) { cout << v << " "; },
		     x, y, z, v, w);
        cout << endl;
        return 0;
}
На c++14 можно писать auto вместо int в лямбде.

В С++17 за счет if constexpr не нужно будет делать пустую заглушку для прекращения рекурсии вызовов:

template<typename F, typename T, typename... O>
void apply_to_all(F && f, T && x, O && ...other) {
	f(forward<T>(x));
	if constexpr(0 != sizeof...(other))
		apply_to_all(forward<F>(f), forward<O>(other)...);
}

 ,

Crocodoom
()

безопасно ли читать в avx регистр концы массивов

Форум — Development

Допустим есть такой случай

uint8_t arr[33] __attribute__((aligned(64)));
....

__m256i v = _mm256_load_si256((__m256i*) arr);
...
v = _mm256_load_si256((__m256i*) arr+32);

Безопасен ли такой код? Насколько я понимаю память на x86 выделяется страницами с минимальным размером в 4кб. А то в свою очердь означает, что читая 32 байта (256 бит) по выравненому указателю (по 64 байта - 512бит) мы не можем залезть в память другого приложения (или ядра) и получить неприятные последствия от этого.

Разговор тут идет только о чтение, о записи само собой в этот «хвост» и речи быть не может.

 , , ,

Dudraug
()