Ресурсы для подготовки к сертификациям
С наступающим!
Посоветуйте годные сайты на которых можно брать инфу для подготовки к разного рода сертификациям - CCNA, ITIL, Red Hat и т. п.
С наступающим!
Посоветуйте годные сайты на которых можно брать инфу для подготовки к разного рода сертификациям - CCNA, ITIL, Red Hat и т. п.
Привет, ЛОР!
При выходе KDE 5.13 повсюду писали, что теперь-то глобальное меню для программ на GTK будет поддерживаться, но у меня почему-то при обновлении этого не случилось. Расскажи, как именно это делается?
У меня сейчас NixOS Unstable с KDE 5.14. Для программ на Qt, а так же для Libreoffice глобальное меню выводится как надо. Проблема только с программами на GTK3.
Небольшой вопрос к C++-волшебникам.
Мне хочется на функции навесить что-то вроде аттрибутов (compile-time аннотаций из C#/Java), чтобы потом в момент компиляции/сборки их проанализировать и что-то сделать.
Например так: `int [[static_boundary(«immutable»)]] foo()`
В момент компиляции оно должно будет увидеть этот аттрибут и обернуть foo в небольшую функцию-обёртку (например, сгенерив слегка видоизмененный файл, или напрямую запатчив AST в компиляторе)
Зачем это нужно. Например этот аттрибут в примере будет говорить, что мы считаем всё внутри foo немутабельным, даже если по синтаксису кажется , что это не так, и на основании этого выполняется несколько дополнительных однократных глобальных инициализаций. Не спрашивайте, зачем.
Эта фича нужна скорей не по виду, а по смыслу. Другие формы записи того же самого тоже подойдут (если они кроссплатформенно работают с clang).
Проблема в том, что если просто так навесить мою [[static_boundary]], то в AST (по крайней мере в clang) её не будет. Нужно пересобирать комплиятор, запатчив список аттрибутов в Attr.td. Ну и потом вообще придётся напрямую эксплуатировать clang, пусть даже он и умеет работать как библиотека. Все это как-то мерзко и анально.
Есть ли какие-нибудь более красивые решения?
Привет. Так вышло, что пришлось основательно разобраться в теме и пока память свежа изложил всё в виде небольшой памятки. Удобно по прошествии некоторого времени освежить память прочитав небольшой конспект. Вообще, по-хорошему, блог что ли какой завести )). Просьба - не флудить, ссылки/комментарии/дополнения по теме приветствуются. ЗЫ: подразумевается, что либы -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
Не догоняю синтаксис в 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"
Командный режим не работает в русской раскладке. Какие есть способы заставить его работать?
Ну и вообще - какие есть способы подружить Vim с двуязычным набором?
Объясните, пожалста, что означает настройка 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 я конечно читал, но не понял.
Получил в подарок (выменял на выпивку) китайский 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)
Вот вся инфа, которую догадался предоставить.
# 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. Если это не так, то я вообще не в ту сторону думаю, тогда проясните мне ситуацию.
Здравствуйте, в общем проблема такая: Решил поставить Генту с live usb, сделал все по хэндбуку (rufus, syslinux, Universal-USB-Installer), ничего не срабатывает, а именно BIOS не видит флешку, пробовал три разных накопителя - результат тот-же. Тем-же руфусом заливаю венду и бац - биос видит USB-HDD и успешно грузится с него. В чем может быть дело?
Прошлой осенью стало понятно, что так хочется поиграть в разные игры, что мочи нет и надо что-то с этим делать — покупать игровой десктоп, например. Тогда же это рабочее место и приобрело свой окончательный вид.
После увольнения с работы пару лет назад остро встала задача оборудовать кабинет дома. Немедленно были куплены стол и стул, которые вы видите. Со стулом угадал великолепно — дырчатый Бюрократ прекрасен: качалка присутствует, спина и окрестности не потеют, я очень доволен.
Стол из икеи тоже прекрасен, регулируемая высота, много места, пространство для ног на обратной стороне, но на момент покупки в наличии не было крышки светло-серого цвета, пришлось брать черную, что крайне непрактично в случае стола. А так — места хватает для комфортной работы двух человек, когда жена решает поработать из дому, ну или на одного человека и свалки бумаг и барахла, когда нет энтузиазма разгребать.
Рабочий ноутбук TP X1 4th gen на Убунте — идеален для работы. Работаешь на нем дома по стопицот часов в неделю, потом подрываешься и едешь или летишь куда-нибудь — ноутбук одинаково прекрасен во всех сценариях.
Десктоп в основном собран вот из этого, работает на десяточке. Первый месяц я просто за голову хватался, ну как так может быть, что в убунте и андройде мой сетевой принтер подключается по «найти принтер» -> «далее» -> «далее», а в десяточке его не установить без соединения шнуром. Или, например, почему какому-нибудь несчастному обновлятелю какой-нибудь не нужной программы позволено свернуть мою игру, чтоб спросить не хочу ли я обновиться. Сейчас уже привык, но было трудно после почти десяти лет исключительно на линуксе.
Сначала хотел купить ультраширокий монитор — чтоб и для работы было хорошо и для игр, но планы изменились. Пока думал-выбирал, был подключен простенький временный экран, и я обратил внимание что не пользуюсь им при работе. Никогда не любил двухмониторные системы — мне гораздо проще нажать хоткей и переключать виртульный экран, чем размахивать мышкой и крутить головой, чтоб перевести фокус на второй физический.
Понял что и широким тоже пользоваться не буду, купил вместо него чисто игровой ASUS XG32V. Шревты на нем очень страшные из-за задранной четкости, но для игр — самое то. Смонтировал его на сторонней веса руке, что позволяет развернуть и вытянуть его налево, в сторону дивана, и оттуда комфортно смотреть всякое. На ультрашироком стандартное видео издалека смотреть было бы не так комфортно.
Такие дела, провел тут последние несколько лет жизни, с небольшими перерывами.
Освещение в комнате такое, что на телефон получить фотку без косяков невозможно — или слишком ярко для него (засветы), или слишком темно (шум). Это, наверное, единственный минус — а так, работать я люблю в темноте.
>>> Просмотр (3772x2747, 2246 Kb)
Я очень добрый и спокойный человек...но это мать его уже мне мозг выносит, все без исключения автокоплитеры которые я использовал унылое говно постоянно отваливающееся, тупое как пробка, уродливо архитектурно и требует что бы сходилась луна над созвездием водолея при восходе солнца над фудзиямой и лёгкий ветерок должен колыхать третий леписток цветка сакуры. А где он третий один лишь рак знает что взобравшись на гору ждёт голоса с выше о конца и готовый свистнуть знаменуя успешность комплита мать его за ногу.
Я не буду перечислять все комплитеры вроде ycm / deoplete и прочие, все они унылые и тупые создания. Я скорее про то что бы узнать может появились ещё какие плагины автокомплита, которые сами способны без конфигов на каждый чих и тысячи let:g сожрать /usr/include и корневой каталог проекта и текущий файл и банально автодополнять.
Я пишу на 98м стандарте, из 11 только... да ничего кроме возможности не ставить пробел между угловыми скобками при описании вложенных контейнеров не использую.
Есть какое-то исчерпывающее, но краткое чтиво? Стандарт читать грустно и долго.
Как объявить две специализации шаблонного класса от одного типа, и что бы компилятор считал их разными типами? Для примера:
typedef MyTmpl<int> MyTp1;
typedef MyTmpl<int> MyTp2;
MyTp1 tp1 = 0;
MyTp2 tp2 = tp1; // что бы это не компилировалось...
Если делать наследование вместо typedef то оно не компилируется, но не работают все определения операторов и прочие ссылки типа MyTmpl в самом классе.
Суть вопроса в том, что мне нужен тип типа идентификатор. Несколько разных идентификаторов, например идентификатор файла FileId, идентификатор объектов Obj1_Id и Obj2_Id, и т.д. Что бы все они поддерживали математические операторы, но что бы между собой их нельзя было напутать присвоить один тип в другой.
Всем привет. Есть папка, с примерно 20 тысячами изображений типо «wallpapers». Так вот, какие-то обделенные женским вниманием накидали туда вагон и маленькую телегу тяночек в разных позах.
Может кто-то встречал инструмент, который позволит отсортировать все картинки с людьми в отдельную папку?
Интересно посмотреть исходники, поэтому лучше, если это будет что-то открытое.
Поиск по форуму и поверхностное гугление приводят меня к openBiometry, что не совсем то, что мне нужно, или OpenCV. Последний я пока не осилил, но смотрю в его сторону.
Вопрос задаю потому что, возможно, кто-то видел/знает/пользовал альтернативы и может подсказать как оно работает :)
В декабре отмечает свой первый день рождения альтернативная операционная система LineageOS для Android-смартфонов, основанная на CyanogenMod. В честь этого руководители проекта опубликовали статистику использования системы в виде инфографики. Первые 4 места среди пользователей занимают страны BRICS (Индия, Китай, Бразилия, Россия), замыкает пятерку Германия. Всего поддерживается более 180 устройств от 23 производителей, зарегистрировано 1.7 млн активных установок и более 700 разработчиков.
>>> Подробности
Задача сделать констаный асоциативный массив строка -> число для С++. Т.е. после создания он изменяться не будет.
Далее
using обьект = "констаный асоциативный массив строка -> число";
Условия:
f(x) != f(y) для (x != y), (x, y) на всем множестве ключей f(x) == f(x) для x на всем множестве ключей
Желательно (но не обязательно):
Чем можно пренебречь:
Сейчас, чтоб сильно не заморачиватся, используется
using namespace std::string_view_literals;
const std::unordered_map<std::string_view, int> map{
{ "key"sv, 42 },
// ...
};
Однако появилось время покопаться, по этому прошу подсказать, как можно улучшить?
Т.е. было бы прикольно даже иметь хеш-функцию f(str) -> int
которая бы гарантировала отсутствие коллизий и не слишком разбросанные значения.
работая с терминалом в ubuntu, используя cd для перехода по директориям, не хватает возможности перебора папок без указания начальных символов. то есть нажал комбинацию и тебе поставляет папку в путь, еще раз нажал сменило на другую папку и тд. просто иногда директории на кириллице и очень влом менять раскладку каждый раз. посоветуйте пакет или скрипт для решения сей проблемы. спасибо.
Допустим, есть какие-то единообразные инструкции над несколькими переменными
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;
}
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)...);
}
Допустим есть такой случай
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бит) мы не можем залезть в память другого приложения (или ядра) и получить неприятные последствия от этого.
Разговор тут идет только о чтение, о записи само собой в этот «хвост» и речи быть не может.
← предыдущие | следующие → |