LINUX.ORG.RU

Сообщения snizovtsev

 

Перепись владельцев ноутбучных M2 NVMe SSD

Года 3 назад, когда впервые поставил себе NVMe диск, узнал про такую штуку как NVMe namespaces: по сути спецификация аппаратного LVM (на уровне контроллера SSD), позволяющего разбить диск на партиции произвольного размера и вроде бы даже с поддержкой overprovisioning. Сразу возникла идея, что так можно было бы сделать продвинутый кросс платформенный дуалбут: NTFS и Linux разделы без необходимости решать заранее сколько кому места положено.

Проблема в том, что большинство домашних SSD не поддерживают более 1 namespace. Собственно, вопрос – существует ли в 2023 году в розничной продаже M2 SSD с поддержкой namespaces.

Проверить можно так:

nvme id-ctrl /dev/nvme0 -H | grep nn
nn        : 1 (если больше -- победа)
nvme list
Model: PC SN730 NVMe WDC 512GB 

 , ,

snizovtsev
()

Что полезного можно сделать за 6 месяцев до смерти

Предположим, что есть ресурсов на 6 месяцев, после которых вы решили умереть. В какой open source проект можно успеть разобраться и законтрибьютить что-нибудь полезное и не слишком тривиальное, не забросив на полпути?

 

snizovtsev
()

Наркоманский Pimpl

Те, кто хоть сколько-нибудь программировал на C++ знают, как бесит ситуация, когда приватные детали класса тянут за собой кучу ненужного для пользователя класса барахла:

#include <junk1.h>
#include <junk2.h>
class Foo {
 public:
  static std::unique_ptr<Foo> Make();
  void DoWork();
 private:
  Foo();
  Junk1 left_hand;
  Junk2 right_hand;
};

Пользователь работает с классом только через Make и DoWork, но из-за того, что нельзя сделать forward declaration отдельно для методов – приходится ребилдить свой код при каждом изменении junk1 и junk2.

Классические способ решения проблемы:

  1. Популярный Pimpl – спрятать Junk1 и Junk2 в другой класс, а в хедере оставить указатель на forward declaration. Минусы: ручной this, двойное разыменование;
  2. Сделать DoWork виртуальным, а в фабрике возвращать наследника. Минусы: неявный вызов, много boilerplate.
  3. Аналогично виртуальным методам, но кастить Foo* на FooImpl*. Опять boilerplate, но быстро.

Но упарываясь очередной ночью без сна мне пришла иная мысль. Ведь по сути мы хотим сделать forward declaration функции с неявным this, но синтаксис нам этого не позволяет. Но что если взять расширение компилятора, и разрешить проблему на уровне линковщика? Вуаля:

#include <stdio.h>

struct Foo {
    int add(int a, int b) asm("_ZN7FooImpl3addEii");
protected:
    Foo() noexcept = default;
};

struct FooImpl : Foo {
    using Foo::Foo;
    int add(int a, int b);
    int x;
};

int FooImpl::add(int a, int b) {
    printf("%s: Adding %d with %d:\t Result:%d\n", 
            __PRETTY_FUNCTION__, a, b, a+b+x);
    return a+b+x;
}

int main()
{
    FooImpl obj;
    obj.x = 10;
    obj.add(3, 6);

    Foo &erased = obj;
    erased.add(3, 5);
    return 0;
}

Код работает на всех версиях gcc, clang, icc. Для GCC также работает __attribute__ ((alias ("_ZN7FooImpl3addEii"))).

Как думаете, был бы полезен плагин gcc/clang, реализующий атрибут на уровне класса, чтобы для undefined symbols автоматически делать переименования символа?

 ,

snizovtsev
()

Ограничение RSS памяти, с учётом SHR

Тестирую код, жрущий много памяти. Память жрётся по 2м направлениям: анонимные аллокации и shared через mmap 17GB файла с MADV_WILLNEED.

Хочу протестировать скорость, как если бы памяти на хосте было 10GB. На машине реально 32GB + 11GB swap.

Беру systemd-run, пробую:

$ systemd-run --user --scope -p MemoryMax=1G -p MemoryHigh=1G -p MemorySwapMax=0 ./memory_hungry_app
...
Killed

Ок, значит какое-то ограничение отрабатывает. Пробую 10G:

$ systemd-run --user --scope -p MemoryMax=10G -p MemoryHigh=10G -p MemorySwapMax=0 env time -v ./memory_hungry_app

...
Maximum resident set size (kbytes): 18529480 (18GB)

Может prlimit?

$ prlimit -m=1073741824 prlimit
...
RSS        max resident set size              SOFT:1073741824 HARD:1073741824 bytes
$ prlimit -m=1073741824 env time -v ./memory_hungry_app
...
 Maximum resident set size (kbytes): 20522316

Т.е. эти утилиты не учитывают SHR в своих ограничениях. А хочется, чтобы системный кеш шаренных страниц этого процесса освобождался до пределов в 10GB.

Прочитанные мануалы:

  • man 5 systemd.resource-control – вроде нет других Memory;
  • man 2 getrlimit – RLIMIT_RSS: This limit has effect only in Linux 2.4.x, x < 30, and there affects only calls to madvise(2) specifying MADV_WILLNEED";

Какую ещё тулзу к cgroups попробовать? Хочется, чтобы без редактирования конфигов и контейнеров.

 , ,

snizovtsev
()

Эффективная по кешу случайная перестановка элементов массива

Задача из реальной жизни:

Есть массив uint64_t F[N] на 17GB, где N ~= 10^9. Лежит на диске, можно mmap-ить.

Есть условно случайная перестановка элементов этого массива, т.е. последовательность indices из N различных чисел 1..N.

Перестановка определяется неявно умной хеш-функцией (MPHF), т.е. (условно) не хранится в памяти, а вычисляется как indices(i) = MPHF(F[i]).

Собственно требуется переставить элементы F по этой перестановке, но:

  1. Используя до 10GB памяти, лучше меньше (ограничение AWS Lambda),
  2. Не насилуя диск мелкими рандомными IOPS шириной 8 байт.

Очевидно, можно, условно, разделить 17GB на блоки по 1GB, формируя F’ в 17 проходов. 1GB в памяти, писать в обход кеша, всё что мимо блока – отбрасываем. Тут тоже вопрос – как бы сгруппировать записи, чтобы писать не по 8 байт в рандомной позиции, а по 64 (кеш линию).

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

 ,

snizovtsev
()

Не работает DisplayPort на Arch, работает на Ubuntu

Есть монитор 2560x1440 с выходом в Dual-DVI и активным переходником на DisplayPort. У монитора (или переходника) всегда был битый EDID, но проблем это не вызывало.

Есть ноут Dell c archlinux c LTS или stable ядрами. Та же конфигурация всегда работала по HDMI с другим монитором и проблем не было.

Проблема в том, что Arch со всем моим хозяйством (i915, gnome, wayland) не видит монитора, а Ubuntu Live (последняя LTS вроде) без проблем подключается ещё с этапа splash screen.

Куда копать? Разные опции модуля i915 попереключал - не помогает.

В логах dmesg никакого криминала кроме EDID:

 , ,

snizovtsev
()

Посоветуйте облако для домашней лабы

Хочется странного, а именно личный «девелоперский» сервак, подобно тому что работодатели покупают на команду, но под личные игрушки за разумные деньги.

А именно:
- Один виртуальный инстанс с SSH в Европе (до США высок пинг);
- 99,9% времени он находится в «холодном» состоянии и не просит денег (до 10$ в месяц), но не обязательно выключен - я могу допиливать конфигурацию в виме, например;
- По нажатию кнопки инстанс вживую мигрирует с дешманского 1 shared vcpu 1gb ram на 24 dedicated vcpu 128gb ram с почасовой оплатой и обратно (т.е. нужна поддержка лайв миграции и cpu/memory hotplug);
- Подмонтировать/отмонтировать супербыстрый nvme;
- Совсем хорошо бы ещё видеокарту on demand (CUDA), но могу пережить;
- Предсказуемая тарификация (желательно возможность установить лимит расходов);
- Желательно хорошая сеть между инстансами (10G), с поддержкой DPDK (подобно AWS ENA);
- Регистрация как физлицо;

Use cases: разово покомпилять ядро/yocto/openwrt, бенчмаркнуть lock-free синхронизацию как взрослый дядя, пофаззить код, обучить модель, запустить qemu-riscv в режиме tcg, поиграться с avx-512, etc.

 , ,

snizovtsev
()

Mailing lists: чем читать, писать и искать

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

Вот хочется чего-то подобного и для опенсорсных рассылок на личной почте (Gmail), которые не на Google Groups, а на Mailman, например. Т.е. после подписки сразу искать втч и по _архиву_ почтовым клиентом (а не гуглом).

Как бы подобное можно было настроить? В перспективе хочу использовать gmi (gmail api sync) + notmuch + emacs, но интересно и в целом как принято пользоваться рассылками.

 ,

snizovtsev
()

РКН начал шейпить HTTPS трафик от AWS до 50-200 кбит?

Сабж, хочу скачать 200мб релизной сборки с гитхаба [1] - скорость стабильно не больше 200 кбит/с. Трафик идёт с S3 бакета AWS.

Думаю - что то тут нечисто. Логинюсь по ssh на VPS - и вуаля, 3.5 мегабайта/с. Скачиваю по scp, тоже все норм.

Проверил на других файлах (читай бакетах) - аналогичная картина. У меня у одного так?

ISP: Онлайм, Москва
User-agent: Firefox, Wget
OS: Arch 5.2.11-zen

[1] https://github.com/tlaplus/tlaplus/releases/tag/v1.6.0

 , ,

snizovtsev
()

Major Linux Problems on the Desktop, 2018 edition

Вышла новая редакция простыни, почему Linux не готов для десктопа: https://itvision.altervista.org/why.linux.is.not.ready.for.the.desktop.curren...
Список проблем был написан автором ещё в 2012 году перед уходом на macos, и с тех пор большая часть пунктов не потеряла актуальности.
TLDR:

  • NVIDIA Optimus и ATI dynamic GPU не работают из коробки;
  • С NVIDIA всё совсем плохо, а тиринг есть у всех;
  • Нет подавления эха в микрофоне из коробки, как в windows/mac;
  • В ядре постоянно что нибудь ломают;
  • В X.org куча старых багов и проблем, висящих десятилетиями;
  • В Wayland невозможен эффективный RDP, а также полная вакханалия между тулкитами;
  • ШГ ещё актуально, но тут есть подвижки;
  • Коммерческого софта нет, как и условий для его рождения;
  • LTS дистрибутивы непригодны для использования, т.к. не поддерживают актуальное железо;
  • Ошибки в systemd, графических и аудио драйверах накрывают всю систему целиком, тогда как винда уже научилась перезагружать их бесшовно;
  • Разработчики ядра любят замалчивать новости об уязвимостях, и в 2017 году в одном только ядре было найдено 453 уязвимости против 286 во всем стеке Windows 10;
  • Большинство дистрибутивов не проводят аудит кода пакетов, поэтому ничто не мешает включить туда бэкдор;

 ,

snizovtsev
()

Обратный индекс HTTP заколовков веба

Например, чтобы быстро посмотреть по Server популярные edge proxy.
Или по известной/найденной уязвимости в опенсорс продукте, опознающимся по заколовкам, быстро найти все bug bounty программы, которые он может аффектить.
Или найти все (популярные) хосты, которые ставят определённую куку.

Ведь наверняка такой сервис уже придумали, да?

 ,

snizovtsev
()

История интерактивных команд в Emacs

Переезжаю потихоньку с Vim на Emacs (+evil), в целом доволен - фич больше и работают они лучше, хотя конфигурировать его кратно сложнее для меня пока. В качестве starter kit взял Doom (develop branch) и доволен - он намного понятнее и легче Spacemacs.

Но появилась заноза. В emacs часто работа с интерактивной командой выглядит как M-x набор команды с Helm <RET> параметр в Helm <RET>, например:

M-x man <RET> bash <RET>
M-x customize-variable <RET> fill-column <RET>
M-x cd <RET> path <RET>

И это неудобно. Хочется иметь возможность:
1. Вернуться из второго интерактивного уровня в первый, т.е. отредатировать команду man, cd, etc.
2. «Перемещаться по истории команд» как в виме с ":<c-p>" - вернёт старую команду и даст мне её отредактировать. В случае с emacs я вижу это так:
M-x cd <RET> /some/long/path/to/dir <C-g>
M-x "жму волшебный хоткей" - емакс переключает меня в "cd" и подставляет /some/long/path/to/dir в Helm. 

Желательно чтобы работало в общем случае, а не отдельно для каждой интерактивной команды. Есть такое в природе?

UPD: в doom/evil есть какая-то эмуляция ":" в minibuffer, но аргументы там не работают. ":man bash" открывает просто «M-x man <RET>» и даже bash туда не подставляет.

 ,

snizovtsev
()

Почему конторы вроде outreachy не поддерживают левшей?

[Ночной тред-упорин]

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

Берём Microsoft - все ассиметричные мышки исключительно для правшей.
Берём Ikea - все ножницы для правшей.
Берём Apple - iPad держит негр правой рукой.
Берём любую клавиатуру - стрелки всегда справа.

Я не левша, но считаю что левшей дискриминируют и обижают.
Дискасс.

 ,

snizovtsev
()

ООО «Элтекс» и нарушения GPL. Куда сообщать?

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

https://habr.com/ru/post/435990/#comment_19615796

В компании работает около 200 программистов, которые пишут софт для оборудования. Все исходные коды принадлежат ЭЛТЕКС.

По факту на сайте лежит образ ФС их промышленного роутера с Linux, Busybox, GDB, OpenJDK и ещё кучи всего. Исходников, конечно, нет и, видимо, не предоставят - на их форуме гуглится много таких вопросов, всех послали.

Куда писать об GPL Violation, чтобы они на них натравили свору юристов? FSF/EFF, они же деньги от всяких handshake получали на это? Есть у кого подобный опыт?

 ,

snizovtsev
()

Перевод выделенного слова в тултипе

На macos с незапамятных времен есть встроенная фича, когда можно навести курсор на слово в любом приложении (умеющем копипасту), нажать глобальный хоткей и получить красивый тултип со значением слова из словаря. Помню совсем давно такое было в Lingvo.

Выглядит так: https://media.giphy.com/media/oHxWcCPfrlUjY8gRmx/giphy.gif

Возможно ли такое настроить или написать самому в Gnome/Wayland? Т.е. понятно, что можно заскриптовать отправку clipboard selection в окно словаря или уведомление, но хочется именно чтобы создавалось такое временное окно, спозиционированное рядом с выделенным текстом.

Возможно ли вообще, в теории, вычислить абсолютные координаты выделенного текста в X11/Wayland?

P.S. Подумал, что как костыль можно было бы эмулировать двойной клик (выделить слово), получить selection и показать тултип под курсором. Не будет работать с гиперссылками, ну и хрен с ними. Может уже кто написал такое?

 , ,

snizovtsev
()

Не работайте в Oracle

Наткнулся тут на интересный тред HackerNews, странно что на ЛОР ещё не приносили:

Q: What's the largest amount of bad code you have ever seen work?
A: Oracle Database 12.2.

Here is how the life of an Oracle Database developer is:

  • Start working on a new bug.
  • Spend two weeks trying to understand the 20 different flags that interact in mysterious ways to cause this bag.
  • Add one more flag to handle the new special scenario. Add a few more lines of code that checks this flag and works around the problematic situation and avoids the bug.
  • Submit the changes to a test farm consisting of about 100 to 200 servers that would compile the code, build a new Oracle DB, and run the millions of tests in a distributed fashion.
  • Go home. Come the next day and work on something else. The tests can take 20 hours to 30 hours to complete.
  • Go home. Come the next day and check your farm test results. On a good day, there would be about 100 failing tests. On a bad day, there would be about 1000 failing tests. Pick some of these tests randomly and try to understand what went wrong with your assumptions. Maybe there are some 10 more flags to consider to truly understand the nature of the bug.
  • Add a few more flags in an attempt to fix the issue. Submit the changes again for testing. Wait another 20 to 30 hours.
  • Rinse and repeat for another two weeks until you get the mysterious incantation of the combination of flags right.
  • Finally one fine day you would succeed with 0 tests failing.
  • Add a hundred more tests for your new change to ensure that the next developer who has the misfortune of touching this new piece of code never ends up breaking your fix.
  • Submit the work for one final round of testing. Then submit it for review. The review itself may take another 2 weeks to 2 months. So now move on to the next bug to work on.
  • After 2 weeks to 2 months, when everything is complete, the code would be finally merged into the main branch.


А с каким говнокодом приходилось работать вам?

 ,

snizovtsev
()

Криптовалютные стартапы

В последнее время лезут со своими вакансиями со всех утюгов. В среднем предлагают ЗП выше рынка, нескучный стек из всяких Rust и Go и хайлоад.

Понятно, что пузырь - но, по идее, на наёмного работника это должно не сильно волновать. В чём ещё подвох таких контор? Платят опционами в биткоинах своих фантиках? Запирают в подвалах с дошираком на 14 часов?

Кто сталкивался?

 ,

snizovtsev
()

Возможно ли поставить 100HD на WAN порт OpenWrt @ Xiaomi R3G

Ситуация такая. Подключаюсь к интернету через 4-жильную пару провайдера (Москва Ростелеком Онлайм), но примерно полгода назад линк стал нестабильным. Опытным путём выяснилось, что:

  • На старом роутере Linksys EA2700 родной прошивки полная тыква: вечный бесконечный цикл link up/link down, настроек link layer нет;
  • При прямом соединении к ноутбуку линк прекрасно работает в 100FD;
  • Если накатить на EA2700 DD-WRT и выставить 100HD вручную через procfs, то линк стабильно работает и на роутере, но там глючит Wi-Fi;
  • Наконец руки добрались до установки OpenWrt на легендарный Xiaomi R3G. Он выбрал 100FD, даже подсеть IPv6-PD подхватил. Работает, но линк стабильно падает через ~10 секунд под нагрузкой вроде speedtest. Просто с фоновым использованием не падает;
  • Если воткнуть Xiaomi через Linksys, а на последнем порт выставить в 100HD - всё работает (т.е. винован не openwrt).

    Вопрос, собственно, возможно ли на Xiaomi и OpenWrt выставить 100 Half Duplex? Пробовал:
  • Luci - ничего на нашёл;
  • /proc/switch как на DD-WRT нет;
  • swconfig dev switch0 port 1 set link "duplex full" выдаёт Failed to set attribute: Operation not supported

    Ещё варианты:
  • Пнуть саппорт - попробую, но сложно будет добиться от них адекватной реакции на технические детали, особенно когда с ноутбуком напрямую всё работает;
  • Переобжать - не помогает, хотя у меня руки кривые. Как проверить качество обжимки?
  • Cable tester стоит космических денег, у меня есть только мультиметр;
  • Перейти к другому провайдеру - техсуппорт Билайн написал, что IPv6 не предоставляют.

 , ,

snizovtsev
()

Трактор без корочки

3 года назад я должен был закончить один известный всем московский вуз по своей специальности (говнокодер), но так получилось, что диплом у меня не пошёл и я просто забил болт на защиту и выпуск на 5м курсе. Забрал аттестат из канцелярии и ушёл. В РФ мне это не мешает, работодателям пофиг - его спрашивают только в HR на правах анкетирования.

Но вопрос по трактору. Для большинства стран, насколько я понимаю, для легального получения разрешение на работу требуется формальная корочка. В ЕС это общее условие для получения Blue Card, хотя страны могут на своё усмотрение сделать исключение кандидатам с 5 лет опыта по специальности (у меня есть в трудовой). Но, например, как я проверил - Чехия такое исключение не делает. И однозначный ответ на этот вопрос достаточно трудно найти на гос. сайтах стран.

Есть ли кого такой опыт (легального) переезда неучем в IT? Понятно, что США и западная европа в пролёте, но как к этому относится восточная европа (Польша, Венгрия, Эстония, Латвия, Словения)? Есть ли смысл отвечать на предложения рекрутеров с релокейтом?

P.S. О себе: белый гетеросексуальный мужчина, женат, 1 кот.

 , ,

snizovtsev
()

Как осуществить мягкий переход с vim на emacs/evil

После очередного dotfiles bankcruptcy (когда решил перенастроить всё как надо с нуля) кинул взгляд в стан Emacs. Посмотрел гифки, скриншоты, плагины и возникло ощущение, что я многое недополучаю в (neo)vim:

  • Emacs as daemon или «буферы отдельно, окна отдельно» - очень нужно для мультимониторной конфигурации и внешнего тайлинга;
  • Semantic и его производные произвели вау-эффект: stickyfunc, semantic-refactor;
  • Кажется TRAMP удобнее vim+tmux over ssh для разработки в больших долголинкующихся проектах на толстых разработческих серверах, плюс не нужно синхронизировать конфиг на несколко хостов;
  • В целом поддержка языков выглядит вкуснее аналогов vim даже в диапазоне одного проекта (cquery);
  • Интересная идея использовать dired для массового редактирования и (условно) атомарного коммита изменений метаданных ФС;
  • Интересная идея с minor-mode вроде follow-mode и disaster.

    Но на деле всё вышло не так просто. Сначала хотел настроить всё своими руками, чтобы лучше понимать происходящее под капотом. Столкнулся с недопониманием Emacs Lisp. В vim хоть и свой недоязычок, но можно быстро проверить однострочник в minibuffer с автодополнением, а затем прописать его в vimrc. Попутно почитать документацию в :help. В Emacs так не получилось, да и Lisp это не про однострочники. Вообщем - не пошло.

    Забил, поставил Spacemacs по рекоммендациям «как vim только лучше», прописал нужные layers - и вроде всё относительно сразу завелось с полпинка, но криво/непонятно/не-так-как-я-хочу и совсем неясно как научиться его кастомизировать. В Emacs Manual всё примеры основаны на key chords, а я принципиально считаю модальный режим лучше и не хочу тратить мышечную память на ещё один набор хоткеев. Возникла жуткая ломка по vim:

  • dired-mode и evil-mode пересекаются, поведение непредсказуемо как выход из vim для новичка;
  • регулярки всё равно не как в vim, например неполучилось использовать «context \zsXXX\ze context» в substitute;
  • :cd ~/some/dir, man something игнорируют параметр, заставляя меня вводить отдельно каждый уровень иерархии в Helm, когда мне проще ~/src/project набрать в стиле readline с tab и C-W;
  • FZF мне нравился больше Helm, опять же - нигде не работают привычные байндинги readline;
  • логично было бы заменить имаксом tmux и эмулятор терминала для удобной копипасты, но опять проблема с привычными хоткеями и интеграцией в evil. Ещё их 3 вида, все написаны на лиспе и есть проблема с тормознутостью и неправильной обработкой escape кодов и цветов;
  • Тут, похоже, не практикуется хорошо структурированный :help plugin-name как в vim. Авторы плагинов, видимо, предлагают мне сразу изучать их код на emacs lisp;
  • taskwarrior + vimwiki + taskwiki для меня понятнее и прощё чем монстр org-mode. У последнего нет API к списку задач, непонятно как их создавать/изменять из хуков мониторинга, например? Нормальной интеграции taskwarrior в заметки org-mode как делает taskwiki я не нашёл.

    Получилась простыня. Вопрос - как всё же правильно готовить Emacs? Как вы пересели с Vim на Evil Mode, как перестали бояться Emacs Lisp? Используете отдельный эмулятор и мультиплексор терминала или встроенные в Emacs? Или консольный Emacs внутрь tmux проинтегрировали аля kakoune?

 , ,

snizovtsev
()

RSS подписка на новые темы