LINUX.ORG.RU

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

Нюансы запуска процессов через system/exec

Форум — Development

Случай #1:

Как известно, при вызове exec происходит завершение всех нитей вызывающего кроме той, что вызвала system. При этом открытые дескрипторы клонируются в новый процесс (если у них не указан флаг FD/SOCK_CLOEXEC).

Представим следующую гипотетическую ситуацию:

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

Положим, что так как эта строка может содержать переменные среды, какие-то выражения подстановки и shell-related команды и синтаксис программист, написавший эту программу посчитал, что самым оптимальным образом будет запускать эту строку с помощью команды system, которая не требует списка аргументов, как семейство exec*. Плюс, так как system «под капотом» вызывает sh -c ..., то автоматически подставятся переменные, а shell-related команды и синтаксис будут работать как нужно. Так вот, глянем исходник system, например, для glibc:

<Сначала хотел показать исходник glibc, но тут слишком дофига получается кода, поэтому сжато: clone + exec + waitpid, кстати ман говорит про fork + exec + waitpid, что не совсем то же самое>

При вызове clone/fork происходит копирование открытых дескрипторов, которые наследует процесс, который запустил system. Предположим, что кто-то передал для запуска строку, содержащую запуск программы (назовем ее evil), выполняющей следующие действия:

if (fork() != 0)
    exit(0);

Что превращает ее в отвязанного от родителя демона. Однако этот fork тоже наследует все открытые хэндлеры, что приводит нас к тому, что этот демонутый процесс evil получил копию всех открытых хендлеров супервизора, однако стал от него отвязан (system вернул 0, супервизор считает, что работа выполнена).

Теперь предположим, что это супервизор с управлением по сети. То есть супервизор открывает серверный сокет и слушает команды, которые ему приходят извне. Не будем обсуждать защищенность передачи или канала связи, всё можно сломать, суть сейчас не в этом. Суть в том, что на момент запуска system супервизор владел открытым серверным сокетом (!). Да, по совести и по правилам при его создании ему нужно было выставить SOCK_CLOEXEC, но скажем честно, кто своим серверным сокетам выставляет флаг, о котором даже в мануалах на socket из 153 строк отдано 2 (!), т.е. всего 1.3%?

Таким образом, пройдя через всю цепочку форков копия серверного сокета оказывается у демонутого evil:

super      9053 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)
super      9053 alex    4u  IPv4 11464960      0t0  TCP localhost:34002->localhost:41308 (ESTABLISHED)
evil       9257 alex    3u  IPv4 11458560      0t0  TCP *:34002 (LISTEN)

Положим, что процесс супервизора по какой-то причине завершился. Ну, например, выполнив свою работу или по ошибке. И теперь начинается самая мякотка. Ведь в системе уже открыт слушающий на порту 34002 сокет! И принадлежит он программе evil! Таким образом она может прикинуться сервером, а супервизор, в свою очередь, не сможет вернуть свой сокет, поэтому система не даст ему открыть второй сокет на том же порту без REUSEPORT:

SO_REUSEPORT (since Linux 3.9)
              Permits multiple AF_INET or AF_INET6 sockets to be bound to an identical socket address.  This option must be set on each socket (including the first socket) prior to calling bind(2) on the socket.  To prevent port hijacking, all of  the  pro‐
              cesses binding to the same address must have the same effective UID.  This option can be employed with both TCP and UDP sockets.

В общем случае, когда какая-то программа-сервер запускается и получает ALREADYINUSE то надо бы сказать мол, «не не могу работать, наверное другая копия меня уже запущена» и выключиться (ну или ожидать его освобождения).

Мы же не хотим port hijacking, верно? А вот все равно профукали. Ну и теперь evil может делать что угодно. Может получать данные от клиентов, может им даже что-то отвечать,может получать список команд для запуска и запускать вместо них что угодно, сообщая наверх что всё хорошо.

Собственно, вопрос #1: почему на серверный сокет автоматически при создании не вешается FD_CLOEXEC?

Случай #2:

Мы - супервизор, запускающий программы, забудем про сетевое взаимодействие, мы сами знаем, что нам запускать. Запускают нас от root, для того, чтобы мы могли делать какую-то очень важную вещь, ну, например, читать какой-то root-owned файл:

-rw-------  1 root root        7 июн  5 23:51 rootonly

Изобразим супервизор упрощенно:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <errno.h>       
#include <pwd.h>


static void dowork(void) {
    int pid = fork();
    int status;
    switch (pid) {
        case -1 : exit(EXIT_FAILURE);
        case 0  :
            if (setuid(1000) == -1) {
                printf("u:%u\n", errno);
            }
            if (seteuid(1000) == -1) {
                printf("e:%u\n", errno);
            }
            execl("./hijack_evil.elf", "./hijack_evil.elf", NULL);
            printf("cannot run\n");
            exit(EXIT_FAILURE);
        default :
            wait(&status);
    }
}

int main(void) {
    FILE * fileroot = fopen("/tmp/rootonly", "r");
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    
    dowork();
    
    fclose(fileroot);
    return 0;
}
gcc hijack_root.c -o hijack_root.elf

И программу, которой нельзя давать рутовые права:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <pwd.h>

int main(void) {
    printf("I am %s, #%u/%u\n", getpwuid(getuid())->pw_name, geteuid(), getuid());
    // my stdin is 0, stdout is 1, stderr is 2, therefore...
    char buf[1024];
    read(3, buf, 1024);
    printf("%s\n", buf);
    return 0;
}
gcc hijack_evil.c -o hijack_evil.elf

Проверяем, что просто так файл прочитать нельзя:

alex@ThinkPad-L560:~$ cat /tmp/rootonly 
cat: /tmp/rootonly: Отказано в доступе
alex@ThinkPad-L560:~$ echo $USER/$UID
alex/1000

И запускаем супервизор:

$ sudo ./hijack_root.elf 
I am root, #0/0
I am alex, #1000/1000
SECRET

При этом мы не можем ставить FD_CLOEXEC на каждый хендлер, открываемый в супервизоре, потому что он может понадобиться для целей супервизора в его форках. Соответственно вопрос #2: почему внешние программы, запускаемые через exec наследуют хендлеры? Ведь очевидно, что это может быть использовано только для «угона» файлов

 ,

PPP328
()

раздать инет с порта eth0 при условии, что по wlan0 интернет на комп приходит

Форум — General

Чёт потыкал ip и не получилось, даже пинга нет, там маршруты ещё надо прописывать? Может кто рассказать кто знает как это наиправильнейше делается?

 , ,

burato
()

Диссернету нужна помощь со скачиванием диссертаций для проверки

Форум — Science & Engineering

Update: К сожалению НЭБ ужесточила слежку, так что бан выдаётся через два часа активности. Пока не найдено какое-то другое решение отбой.

P.S. Поставьте тег диссернет в избранное, чтобы быть в курсе если возникнет какая-либо полезная информация. ☺

Нужна помощь сообществу Диссернет в выкачивании диссертаций из НЭБ (Национальная Электронная Библиотека).

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

Что необходимо:

  • Умение и возможность запускать скрипт python на долгое (несколько суток) время на десктопе/ноутубке/через что-нибудь вроде x2go, так как используется API firefox для симуляции человека.
  • Регистрация на сервисе Госуслуги. Это необходимо для авторизации, которая делается вручную один раз на запуск скрипта.

Последствия:

  • У вас забанят просмотр текстов на сайте НЭБ. Вы больше не сможете просматривать имеющиеся там доступные для граждан РФ и оцифрованные на их налоги текстовые ресурсы.

Меня забанили после выкачивания примерно 500 диссертаций. Забанили всех, кто использовал скрипт в течении недели от начала кампании по выкачиванию. Сейчас интервал забана от момента запуска скрипта уменьшился до пары суток. Это порядка 100-150 выкаченных диссертаций. Банят и по IP, и по логину. На мой запрос в службу поддержки стоит внезапно ожидаемая тишина.

Что можно сделать:

  • Написать мне по e-mail упомянутом в моём тутошнем профиле и я по запросу вышлю скрипт и инструкцию (работоспособность проверялась на ноутбуке с Ubuntu 18.04), а также договоримся как будет передан результат.

P.S. IMHO мошенникам должно икаться. Сами они это за нас не сделают.

 ,

Evgueni
()

Выбор почтового сервера

Форум — Admin

Приветствую! Довольно долго использовали корпоративный почтовый сервер на sendmail. Сейчас пришло время обновить OS и встал вопрос, а не обновить ли сам почтовик?

Сейчас используется sendmail + dovecot, антивирус - clamav + amavis, антиспам - spamassasin.

В принципе все работает стабильно, но есть несколько неудобств:

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

2. отсутствие веб интерфейса для пользователей, чтобы могли из дома или с мобильных устройств почту проверять не занимаясь настройкой почтового клиента.

Вопрос, какой софт сейчас считается хорошим стандартом для почтового сервера? Какие антиспам и антивирус решения применяются? Реально ли приблизиться к качеству фильтрации спама как у крупных облачных провайдеров? Есть ли хорошие решения почтовиков с веб интерфейсом?

Поделитесь вашим опытом.

Перемещено alpha из general

 

samson_b
()

Глупый 4к телевизор с хорошей матрицей

Форум — Talks

Если не брать в расчёт дисплеи - такие вообще есть? Что бы без smart-tv но при этом с адекатной матрицей? Интересует 43" размер матрицы.

 

pon4ik
()

Что-то новенькое

Форум — Talks

Жаль сдвигать тему про собачку, прости, DELIRIUM. В общем, почти всю жизнь я пишу на крестах, иногда тыкал C# и Java, но без особого рвения - прикольно, но как-то нагромождённо местами. Сейчас вот захотелось чего-то нового, попробовать поработать с другим языком, может, даже с дальнейшим переходом на фултайм. Что можете порекомендовать, исходя из собственного опыта и рынка? Я немного отстал от вакансий, неожиданно для себя увидел, к примеру, что активно хайрят голангеров, да и за страшные деньги. Неужто Go так хорош?

 , , , ,

john_snake
()

Я с утра чёт сломался. Я правильно понимаю кэши?

Форум — Development

Я правильно понимаю что…

$lscpu
$...
L1d cache:    384 KiB
L1i cache:    384 KiB
$cat /proc/cpuinfo
cache_alignment	: 64
  • L1d - кэш данных 384 KiB *2^10 == 393216 байт
  • L1i - кэш инструкций 384 KiB *2^10 == 393216 байт
  • L1 - общий объём 768 KiB *2^10 == 786432 байт

Меня интересовать должно только L1d

  • Итого ((384 * 2^10)/64) == 6144 кэш линии в L1 кеше

Если я теперь в цикле буду крутить многократно эти два массива и они будут друг в друга что-то вычислять и писать

тут оба займут 50% L1d кеша?

uint64_t A[1536]; //  6144÷4
uint64_t B[1536]; //  6144÷4

То как бы я могу надеяться что они оба на втором полном проходе окажутся целиком в L1? Или я вообще сейчас херню спорол как ебобо?


P.S. Кто у нас вандалит теги? ECS стёрли, cpu cashe стёрли и кучу всего другого. Ничего точно указать нельзя. Одну банальщину в тегах оставили. Теги на то и теги что-бы точечно указывать. Вот я указал «память» и чё? Толи про оперативную пишу то ли про склероз свой.

 , , ,

LINUX-ORG-RU
()

Новенький thinkpad x220

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

Ну точнее как новенький... восстановленный!

Я очень долго выбирал себе ноутбук для поездок и для того чтобы брать с собой на работу и в институт - большой ноутбук выглядел слишком хрупким - жалко было брать с собой. Выбирал месяца с ноября. Пересмотрел практически всё, что было в магазинах и инете, но безрезультатно - слишком грустные машинки за печальные цены.

Купил acer travelmate b117. Там хороший корпус был, отличные шарниры и клава неплохая для своей цены. НОО производительность... бррр вспоминаю тот селерон... мурашки по спине. Проект компиллировался минут 5, хотя на рабочем ноуте - меньше минутки. О приятном просмотре ютуба и фуллхд видео и речи идти не могло. Но зарядку держал обещанные 10 часов без проблем и пассивное охлаждение. Сдал обратно в магазин.

Очень хотелось купить синкпад, но не хотелось рисковать и заказывать кота в мешке с ебая. НО один анон, спасибо ему огромное! Посоветовал одну прекрасную московскую фирму, восстанавливающую синкпады и продающую их: smartbooks.org (не сочтите за рекламу). Я очень долго сомневался, но всё же договорился с продавцом(по почте он действительно показал себя прошаренным в своей теме и вообще) и заказал x220 с i5. Встретился у них в офисе(как вошёл туда - прям в рай попал - все вокруг в этих прекрасных ноутбуках =D). Там произошла интересная история и в итоге я вышел оттуда с практически новым синкпадом с отличной батарейкой и в идеальном корпусе и с прекрасным настроением.

Хар-ки:

  • i7-2620 (который оказался даже шустрее моего i5-4200 и потребляет без нагрузки практически ничего)
  • TN матрица
  • 4гига оперативы
  • 320гб 7200рпм
  • сканер отпечатков пальцев и USB3.0
  • 58Ватт реальная ёмкость батареи. 46 циклов отработано.

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

Внутри тоже красота - вентилятор и платы чистейшие. Прямо магия какая-то.

Как-то так. Пользуюсь им уже 5 дней. Кайфую. Смог на арчике снизить потребление в идле в консольке до 4.9ватт. При работ же в i3wm + фирефоксе + emacs примерно 6.5 - 8 ватт. Вчера проработал честные 7 часов на заряде 90%.

Как-то так. До сих пор не могу поверить, что удалось таки его купить.

ещё фоты

 , ,

SL_RU
()

Rust и типобезопасность

Форум — Development

Решил я тут немного изучить Rust, чтобы не состариться, так и не вкусив плодов современной цивилизации.

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

Почитав документацию:

The as keyword does safe casting

Набросал такой примерчик:

fn main() {
        let a: f64 = std::f64::MAX;  // данное значение просто пример "большого числа"
        let b = a as i64;
        println!("{}", b);
}

Вопросы:

1) С какой стати это вообще компилируется?

2) Да, f64 и i64 нужно одно и то же количество битов для хранения значения, ну и что?

3) Почему результат меняет знак?

Представьте, что какой-то тех. процесс идет, и определенный параметр нельзя изменять скачкообразно, иначе физически система (по крайней мере, один из компонентов) выйдет из строя (встанет в раскоряку, взорвется, выпустит токсичный газ, убивающий 100тыс. населения; нужное подчеркнуть). И вот значение в f64 положительное и увеличивается постепенно, с i64 все вроде в порядке (и тестирование проходит на тестовых значениях), и вдруг хренак! и уже -9223372036854775808

Как так?

 ,

seiken
()

Как пользоваться Whatsapp, но не дать ему доступа куда не надо

Форум — Mobile

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

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

Но ужасно не хочется давать доступа к микрофонам, контактам, диску (кроме может его папки и т.д.), хочется обломать его, но пользоваться. Это как-то можно сделать?

Нашел, что есть неподдерживаемое приложение «Open In WhatsApp»

This app uses WhatsApp public api 'click to chat' feature to open a chat with any number without saving to your phone book.

You can create an url link that will open WhatsApp on the specified number. This is a WhatsApp feature, you don't need this app to open the link, only to create it.

Но это вроде не совсем то. Само приложение вацапа надо будет все-равно поставить и надавать ему прав :( Как все же избежать? вацапом до сих пор не пользовался.

Телефон рутован, прошит Lineage OS 16 (на базе Android 9.0)

Может его вообще как-нибудь на PC можно поставить прямо или в эмуляторе для андроида и юзать так?

 , ,

praseodim
()

Assembler. (eip). lea.

Форум — Development

здрасьте, здрасьте люди добрые.

объясните синтаксис вот этого.


lea point(%rip), %rax
lea point, %rax

пожалуйста объясните в чем отличие между этими двумя инструкциями?

можно ли lea заменить mov?

 

Assembler
()

Как найти репетитора по мат. анализу?

Форум — Talks

В свое время я недостаточно внимания уделял матану, о чем сейчас жалею. Какие-то знания у меня есть, но, думаю, что их не достаточно. Сейчас работаю, поэтому возможности/желания поступать в универ нет, но с другой стороны и жестких дедлайнов тоже нет, поэтому есть возможность потихоньку двигаться и учить матчасть. Хочется найти репетитора, который будет давать регулярные задания и проверять результат, говорить что нужно прочитать и задавать вопросы на понимание. Пока что вижу для себя следующие интересные предметы:

  • анализ
  • линейная алгебра
  • теория вероятности
  • математическая статистика

Предполагаю, что наилучшим вариантом будет удаленное взаимодействие, например, через Skype. Как сейчас ищут репетиторов по математике?

 

Goganchic
()

Подскажите нормальную БД для которой существует неблокирующий сишный API

Форум — Development

Суть — доступ к базе в event-loop при большом количестве входящих http соединений — over 30k.

event-loop подразумевается на базе libuv.

 , ,

cvv
()

Как соискателей продавливают вниз по зарплате: Москва

Форум — Talks

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

Вижу вакансию в которой объявлено скажем, 130к, отправляю отклик и меня вызывают. Приезжаю, встечает меня кадровичка, с ней мы минут 20 общаемся, заполняю какте-то анткеты, рассказываю про предыдущие работы ну и так далее. Затем она уходит, приходит начальник отдела с виндузовым админом, с ними повторяется тоже самое, они меня гоняют по почтовикам, доменам и прочему. Так продолжается ещу минут 30. Потом эти уходят, вместо них приходят линукc админы и все повторяется по-новой, они меня уже гоняют по астерискам, всяким func_odbc и прочим заббиксам. Сильно расстроились что не работал с ансбиль, он часто требуется на хорошие зарплаты но в подавляющем большистве контор он и не требуется. Собственно за 15 лет стажа кандидат его знать и не обязан: у вас сломается мозг от попытки освоить все что требуется на рынке труда, начиная с попытки подтянуть английский и дальше вские пайтоны. Идёт второй час собеседования, я от них уже устал и немного начинаю «плыть» в разговоре ибо мозг подзасрался. Потом говорят что мы посовещаемся, подождите 10 минут, прийдет кадровичка и вам расскажет что дальше.

Маринуюсь я ещё минут 10 в переговорке, приходит эта прЫнцесса и неспеша рассказывает примерно следующее: мы пообщались с коллегами, они говорят: вот с этим вы не работали, вот это вы не знаете, то вы не помните, тут отвечали невнятно неуверенно. Сказать по-правде для рынка кандидат вы слабенький и просите много. Но у вас хорошее резюме и мы готовы взять вас «на вырост». Если вы снизите свои зарплатные ожидания скажем, до 100к.

Я от такого обмяк на стуле как куль с говном, не каждый раз слышишь вот такое. В такие моменты думаешь что вот, более опытные коллеги видят тебя именно таким. У меня окончательно упало настроение, я вяло ответил что у меня тоже вопросов не осталось, давайте недельку на подумать, мы попрощались. Я вышел из офиса и шёл к лифту, разговор закончился и мне стало полегче, начало отпускать. Повернул, иду дальше и вспоминаю как учился пользовать func_odbc астериска, как учился читать диалпланы и пытался понять диаграммы работы sip протокола. Как лет пять назад в период безработицы осваивал LPIC. Как разбирался с заббикс прокси и кастомными пользовательскими параметрами туда же. Как готовясь к цискиным экзаменам силился понять разницу в нате: Inside global, Inside local, Outside local, Outside global. Туда же вывод debug ip ospf и прочую срань. Как трахался с захватом ролей КД в упавшем домене, как трахался с рухнувшим после апдейта эксченджом. Как осваивал постгрес, как разбирался с аутентификацией и методами передачи пароля в связке postfix и dovecot. Как силился понять как же настраивается этот гадский racoon и остальное для ipsec туннеллей.

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

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

Этот психологический ход который не надо терять из виду. Вот так вот «вжик» - и минус 30к от зарплаты. За первый год работы кандидат им дарит 360к ну и так далее, а кадровичке можно подарить пирожок за то что сэкономила руководству на очередном кандидате денег на багамы, шлюх и кокаин.

Коллеги: те кто понимает хотя бы вывод вывод debug ip ospf и работают при этом за 80..100к. Вы, соглашаясь на подобные условия вы давите рынок труда вниз, давая слабину и малодушничая вы демпингуете зарплаты и тянете на дно друг друга. Уже только это - это два тома циски по 600 листов плюс куча времени убитого на лабораторные работы. Дебаги всего этого отнимают у вас бесценную молодость, кто, кто вам вернёт потерянные на этом диоптрии посаженых глаз? Кто вам вернет бесценное время когда вы вместо того чтобы радоваться жизни терпеливо кропели над кучей параметров вывода, копаясь в руководствах и гугле над каждым из них? Это профессиональный рост, за который вы платите здоровьем, самым гадким - малоподвижным образом жизни, когда организм хиреет, обрастает жиром и начинает накапливать болячки, лечение которых в общем-то затратные в деньгах и унизительные процедуры?

Да вы чё, шныри, ваще страх потеряли? Шучу Very Happy

Расслабьте булки: я вам не враг. Записывайте на диктофон собеседования и потом слушайте и делайте выводы что пошло не так. Скачайте видеокурсы проведения жёстких переговоров при закупках для менеждеров по продажам. Посидите, подумайте.

Рассмотрим случай когда в объявлении зарплата договорная. Тут работодатели делятся на две категории: -нормальные, которые в ходе собеседования задают вопрос типа «какие у вас зарплатные ожидания» либо так же, спокойно и адекватно «на какую зарплату вы рассчитываете»; -гнилые, которые спрашивают тоже самое но с неприятной, вызывающей отторжение формулировкой «вот сколько ты стоишь как специалист» и смакуя, с издевкой наблюдают как в кандидате начинают бороться жадность и осторожность.

Тут рецепт только один. Ответить: мне категорически невыгодно первым вскрывать позицию. Я свои ожидания могу подстроить под ваш бюджет. Лучше вы скажите на какой бюджет вы ищете сотрудника. Не обращайте внимания что вам после этого ответят, не сдавайтесь. Гните дальше в плане: вам же сказали: вот тебе вот такой вот бюджет - найди сотрудника который может это и это. У вас получается позиция негибкая, у вас как бы связаны руки, вы находитесь в рамках на которые почти не можете повлиять. Я же - свои ожидания могу и принизить, не умру.

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

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

Навряд ли вы разойдётесь так и не узнав сумму работодателя, всё таки он вас позвал на собеседование чтобы взять вас на работу. В каждой компании есть адово количество работы которую кто-то всё-таки должен сделать и на данный момент она у него стоит и из-за этого остальные сотрудники перегружены, в цейтноте и с этим надо что-то делать. И он прекрасно понимает что соискателя к себе надо ЗАМАНИТЬ а не отпугнуть. И вы один из лучших кандитатов которые есть у него в наличии сейчас. И вы это должны всегда помнить, даже если вам сказали что вы «кандидат слабенький и для рынка просите много» и не вешать нос.

Стек технологий, знания, которые накопились в голове у кандидата за время его трудового стажа и стек технологий, требующихся работодателю ВСЕГДА не совпадают и это - абсолютно нормальная ситуация. И вопрос насколько работодатель на это согласен пойти - он уже решен перед вызовом вас на собеседование. Без необходимого приемлемого минимума знаний вас просто не позовут. Собеседование это не развлекательная прогулка, они реально напрягают. Я сам собеседовал voip-инженеров на вилку 130..180к, опыт которых намного больше чем мой и прекрасно знаю как не хочется чтобы собеседования заканчивалсь ничем. Это люди с сединами, они знают своё положение на рынке труда, это люди тёртые и непростые.

Вы конечно скажете что в москве около 100 фирм занимающихся настройкой телефонии, обратитесь к ним - да вот только ребятки у них расценки от 2500 рублей в час, и они могут вкатить вам счет за 10 часов работы а реально там работы на два часа и вы это воровство никак не докажете ибо не хватает квалификации проверить. Так что если прикинуть сколько обойдется сторонняя фирма то и эта зарплата приемлема если вы аутсорсер и у вас много задач по телефонии. Но я отвлёкся.

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

Я буду рад если я вам этой статьёй хоть чем-то помог. Борьба с работодателем это непростой вопрос: ит специалист имеет плохо прокачаный скилл переговоров, они не закупёры и не продажники у которых это основа их деятельности, которые торгуются и не стесняются при этом. Напишите что думаете на эту тему, какой у вас был опыт. Передайте ссылку на неё друзьям, если, прочитав это за год, хотя бы 10000-15000 сисадминов перестанут пасовать и соглашаться на нижнюю планку зарплаты мы в итоге поможем друг другу. Каждый из вас в этом кровно заинтересован. Запомните: в этой жизни вы имеете не то, чего заслуживаете, а то - на что договорились.

P.S. В комментах обсуждаем тему а не автора. Всем безработным - удачи в полях.

Перемещено leave из job

 ,

sumare
()

Gas, stack, Ассемблерная вставка

Форум — Development

здрасте, здрасте люди добрые!

есть процедура

.global proc
proc:

push %rbp
mov %rsp, %rbp

sub 64, %rbp

mov $777, -24(%rbp)




pop %rbp
mov %rbp, %rsp



ret

подскажите, как данные из стека, теперь выудить в программе на С++?


#include <iostream>

int main()
{

asm(

"call proc\n"

// в каждой новой программе под стек выделяется новая область в оперативной памяти, я так понимаю.  подскажите пожалуйста, как теперь можно обратиться к тому стеку, что в процедуре  proc? 

через ss?  как достать от туда 777? 
очень надеюсь, что поможете
);


}

 

Assembler
()

Интересная книга для изучающих C.

Форум — Development

Мне, как делающему первые шаги в C (Си), показалась эта книга интересной и захватывающей - не тривиальными примерами.

Однако хотелось бы услышать компетентного мнения от профи.

«Используя серию примеров веб-разработки, эта книга «C Programming in Linux» даст вам интересный взгляд на мощный мир низкоуровневого языка программирования.» (художественный перевод)

;-)

http://bookboon.com/en/c-programming-in-linux-ebook

 , ,

le_legioner
()

Производительность; илитный запил оптимальных реализаций и основы матчасти.

Форум — Development

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

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

Изначально я хотел написать про то: что такое бесплатные вычисления на примере is_range() + сумма елементов массива, но тут выявилась смешная особенность, поэтому пока без is_range().

Начнём с простого - сумма елементов(float) массива. Как написать её быстро? Обычный крестопоц сделает так:

auto summ = accumulate(begin(vec), end(vec), 0.)

Этот код выдаёт 5.6GB/s(мы всё бенчим в л1д 32килобайта массив). Казалось бы, если бы мы слушали всяких «гуру», которые нам говорят: accumulate() - оптимизирован, «ты что умнее создатели stl"а?», «конпелятор умнее тебе - сам всё делает оптимально», «руками что-то делать слишком сложно и не нужно» - то мы бы там и остались с этими 5.6ГБ, но мы пойдём дальше и поймём почему так, и является ли это тем, что намн ужно.

Но посмотрев на код - он не векторизован:

	addq	$4, %rdx
	vcvtss2sd	-4(%rdx), %xmm2, %xmm2
	vaddsd	%xmm2, %xmm1, %xmm1

Почему? Патамучто это основная флоатпроблема: Он не ассоциативен - флоат не имеет в себе точных представлений всех чисел входящих в диапазон его «представления» т.е. порядкопроблемы.

Поэтому конпелятор НЕ ВЕКТОРИЗУЕТ флоат по умолчанию, ну никак. Даже такую банальщину.

Для решения этих проблем - есть ключик -funsafe-math-optimizations, который входит в -ffast-math, который кладёт на точность при вычислениях. Добавив его мы получаем уже 44.9GB/s.

Но теперь мы получаем ещё одну проблему - надо думать: «как бэ сунуть эту ключик не повредив там, где этот ключик не нужен».

Поэтому ноцанам, которые хотят быстро и не хоятт рандомных жоп из-за тупости конпелятора - пишут всё руками. Допустим на той же сишке это пишется так:

double memadd_autovec(buf_t buf) { //5.609465GB/s, либо 44.969652GB/s с ffast-math
  float * it = buf_begin(buf), * end = buf_end(buf), summ = 0.;
  do {
    summ += *it++;
  } while(it != end);
  return summ;
}

double hsumf(__v8sf v) {
  return (v[0] + v[1] + v[2] + v[3] + v[4] + v[5] + v[6] + v[7]);
}

double memadd_vec(buf_t buf) { //45.652002GB/s и класть на ffast-math
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Т.е. разницы никакой нет, кроме нужной нам реализации горизантального сложение вектора. Когда я говорил пацану: «векторную сишку для написания быстрого кода юзать намного проще, чем плюсы» - поцан нипонимэ, да и любые пацаны скажут - ну дак с -ffast-math оба выдают по 45гигов - нахрен эта сишка нужна?

А вот зачем:

double memadd(buf_t buf) { //132.878440GB/s
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;summ += *it++;summ += *it++;summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Это называется пацанский анролл копипастой, а вот заставить конпелятор нормально что-то разанролить очень сложно.

Если бы мы слушали всяких «гуру», которые нам вещают: «анрол говно и не нужен» - мы бы так и седели с 45-ю гигами, а так мы сидим с 132.878440GB/s. Т.е. анролл нам дал немного не мало ~300%.

Но основная мысль, которую толкают всякие «гуру» - это не надо следить за тактами/считать такты и прочее. Но мы о5 сделаем наоборот и посмотрим что будет.

Т.к. наш юзкейс упирается на 99% в throughput и дёргается одна инструкция, то нам достаточно просто считать теоретическую производительность для моего камня. 4.5(частота камня)*8(т.е. у нас камень с avx, то там вектор 32байта, либо 8флоатов.)*1(throughput нашей инструкции - в данном случае vpaddps из интел мануала). Т.е. 36гигафлопс, либо ~144гига. Т.е. мы сняли овер 90% теоретической производительности - остальные 10% у нас ушли в наши циклы, всякие горизонтальные суммы вектора и прочее, ну и конечно же чтение данных из кеша.

Но самое смешное - на моём хасвеле умножение имеет throughput 0.5 - т.е. на хасвеле умножение быстрее сложения. Это новая забористая трава у интела.

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

Поэтому очень смешно слушать, когда какие-то пацаны говорят: «float point имеет такую же производительность как и инты» - нет, оно имеет такоу же производительность лишь по причине того, что на штеуде инты тормазят так же, как и float.

И чтобы окончательно в этом убедится - мы взглянем на fma(вариации умножения со сложением/вычитанем), которые имеют throughput 0.5 - да, да - на хасвеле умножение+сложение в 2раза быстрее просто сложения. Это уже не просто трава - это что-то принципиально новое.

У целочисленного сложения же throughput 0.5 и казалось бы, если мы поменяем в нашей функции float на int - у нас будет сложение работать в 2раза быстрее, но это не так. Оно выдаёт те же 130гигов, а почему?

Вообще у камня есть такая фича, допустим у нас:

add $1, %reg0//вот тут инструкция add залочит регистр reg0
add $1, %reg0//а эта инструкция уйдёт в лок до особождения предыдущей инструкцией регистра reg0

Чтобы такой жопы небыло - есть специальная фича:

add $1, %reg0//lock reg0
add $1, %reg0//И тут вместо того, чтобы уйти в лок - камень вместо reg0 даёт инструкции любой свободный регистр.

Эта фича называется прееименование регистров, либо как-то так - мне лень гуглить.

Дак вот штука в том, что фича работает через жопу. Мне лень читать мануал и искать почему так, но штука в том, что она ограничивает throughput. На умножении и целочисленном сложении она огранивает throughput c 0.5 до 1.

И вот я решил заюзать сложении через fma:

__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);// a + b * 1. == a + b.
}

double memadd_fma(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ = fmaadd(summ, *it++);
  } while(it != end);
  return hsumf(summ);
}

Но меня ждала жопа: 27.347290GB/s, причем не анролл и ничего не помогал. Я уж подумал, что мануал наврал, но позже до меня допёрло: у неё latency 5тактов и ((4.5×8)÷5)×4 ~= 29гигов - т.е. я получаю производительность с её latency, но какой жопой оно так?

Потом я вспомнил, что гцц гинерит анрольный код вида:

add $1, %reg0
add $1, %reg0
//а не
add $1, %reg0
add $1, %reg1

Т.е. на неё вообще не работает переименовывание регистров - и инструкции постоянно в локе. Я это проверил и оказался прав. Ну и я написал такой мемадд:


__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
}

inline void fma_10way_finality(__v8sf * cache, __v8sf * it, __v8sf * end) {
  switch(end - it) {
    case 8:
      *(cache + 7) = fmaadd(*(cache + 7), *(it + 7));
      *(cache + 6) = fmaadd(*(cache + 6), *(it + 6));
    case 6:
      *(cache + 5) = fmaadd(*(cache + 5), *(it + 5));
      *(cache + 4) = fmaadd(*(cache + 4), *(it + 4));
    case 4:
      *(cache + 3) = fmaadd(*(cache + 3), *(it + 3));
      *(cache + 2) = fmaadd(*(cache + 2), *(it + 2));
    case 2:
      *(cache + 1) = fmaadd(*(cache + 1), *(it + 1));
      *(cache + 0) = fmaadd(*(cache + 0), *(it + 0));
    case 0:
      break;
    default: error_at_line(-1, 0, __FILE__, __LINE__, "bad_aligned");
  }
}

double memaddfma_10way(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = (__v8sf){};
  __v8sf * cache = (__v8sf[10]){{}};
  uint64_t i = 0;
  while((it += 10) <= end) {
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    i = 0;
  }
  fma_10way_finality(cache, (it - 10), end);
  summ = (*(cache + 0) + *(cache + 1) + *(cache + 2) + *(cache + 3) +
	  *(cache + 4) + *(cache + 5) + *(cache + 6) + *(cache + 7) +
	  *(cache + 8) + *(cache + 9));
  return hsumf(summ);
}

Пришлось хреначить финалити, ибо тут «анролл» на 10, а почему на 10 - для максимального throughput"а - надо, чтобы каждый каждый регистр юзался через 5тактов - т.е. 10регистров.

И вся эта порятнка нужна для борьбы с тупостью конпелятора.

Это уже: 214.167252GB/s(раельно там в районе 250 - просто мой бенч говно). 107 гигафлопс на ведро. Из теоретических 144, но тут уже влияние кеша. Причем 50+ из которых выкидываются и просто бесплатные.

Теперь вопрос к пацанам - что нам дадут эти гагфлопсы, когда у нас будет массив не 32килобайта, а 32мегабайта? Зачем нужно выживать максимум, когда скорость памяти отсилы 20-30гигабайт и нам хватит даже С++ кода с ffast-math?

Ну и призываются упомянутые мною пацаны: mv - этот тот експерт, что вещал про «руками переименовывать регистры не надо» и «анрол ваще ненужен», emulek вещал про ненужность счёта тактов, и не понимал что такое «беслпатно», AIv - не понимал в чем проблема плюсов, ck114 - так же не понимал в чем проблема плюсов.

Бенчи: https://gist.github.com/superhackkiller1997/606be26fa158ef75501d - вроде я там ничего не напутал.

P.S. - не выпиливайте пж, пусть пацаны «нужно» или «не нужно». Мне интеерсно. Ну и там рекомендации пацанов.

 , , ,

Carb_blog
()

C2x

Форум — Development

Что нужно добавить в новый стандарт языка Си, чтобы он был удобным, дружественным и мог конкурировать с современным Go? И почему язык Си по сути не развивается? Все эти C17 ничего толкового не привнесли, никакой тебе нормальной и удобной многопоточности, ни удобных новых структур данных, во многом Си остался в 98 и ничего не поменялось в лучшую сторону. Да и на поприще стандартных библиотек Си все как-то уныло, в большинстве дистрибутивов пихают старушку Glibc от GNU, не пора бы её “переписать” заменой, выкинув или оптимизировав лишнее с оглядкой на musl и всякие dietc? И при этом всё под MIT лицензией? И всё это с учётом LLVM и ARM, мобилок и 64 ядер в каждый дом 🏠

 , , , ,

menangen
()

Годный PCIe Wi-Fi адаптер

Форум — Linux-hardware

Нашёл достаточно годный Wi-Fi адаптер ASUS PCE-AC88. С уверенностью могу сказать, что старые драмы с работоспособностью и необходимостью вытаскивать firmware из прошивки роутера на таком же чипе остались в прошлом.

По состоянию на 2020 год в linux-firmware уже присутствует вся необходимая для работы фирмварь. Внутри чип BCM4366, подхватывается brcmfmac, работает как N, так и AC, проприентарный драйвер НЕ НУЖЕН.

Замерил скорость по локалке при подключении через AC с помощью iperf'а, почти дотягивает до гигабита.

Единственное, что пока не проверял - совместимость с aircrack. Если есть у кого информация - поделитесь.

 , ,

Meyer
()

Если вы решили разрабатывать ПО для картографирования ума (майндмаппинга, mind mapping), то даю совет как сделать юзабельное ПО

Форум — Development

Общеизвестно, что всё без исключения ПО под линукс и макос для майндмаппинга — неюзабельный треш, хотя всего-то, что требуется от такого ПО, это удобное, а не зубодробительное неудобоваримое создание, редактирование и перемещение мозгонод (mind nodes). Всё остальное, как-то шрифты, манипулирование картинками, взаимодействие с буфером обмена — вторично и не так важно, если главное, что было сказано в начале — реализовано так, как это реализовано во всём без исключения ПО для майндмаппинга под линукс и макос.

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

В чём еще привлекательность этого варианта? Да в том, что просто возьмите уже готовую реализацию этого с сорса блендера да и всё, подогнать, подмазать, подпереть — всё. Лучше ПО для майндмаппинга готово, причем под все платформы, под которые работает блендер — винду, линукс и макос.

Это реальная тема. Лучшего гуя не придумать.

 , , ,

kep
()