LINUX.ORG.RU

Сообщения firkax

 

Ваше отношение к конструкциям вида if (a=f) в Си и C++

Голосования — Голосования

В очередной раз столкнулся с этой темой на форуме, решил провести опрос.

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

Существует, в целом, три варианта отношения к конструкциям вида if (a=f). Первый — конструкция полностью нормальная, нет причин на неё гнать. Второй — опасения спутать = и == и на этом основании объявление данной конструкции вредной. Третий (почему-то про него вспоминают реже чем про первые два) — заявления о том, что не-булевы выражения (речь тут не конкретно про присваивание) в качестве условия if вообще так или иначе не совсем нормальная ситуация.

Часто сторонники второго варианта начинают потом писать про опечатки «которые у всех бывают», но я считаю нужным данную ситуацию прояснить: следует чётко отличать спутывание = и == по причине забывания как в Си пишется сравнение (в этом случае проблемой будет только =/== и ни что другое, и происходит такое, в первую очередь, у сильно неопытных программистов), и опечатки по причине, условно, нажимания не тех кнопок на клавиатуре — такое действительно случается у всех, но в этом случае конкретно присваивание никакой особенной роли не играет, речь идёт вообще о разных «способах» написать в скобках после if что-то неправильное и не заметить это. При этом, поскольку if по смыслу означает проверку условия, логично ожидать в скобках что-то булевое, а все остальные варианты объявить симптомами опечаток, подлежащими как минимум пристальному рассмотрению.

Те, кто так или иначе считает такую конструкцию проблемной (и включают соответствующий варнинг компилятора), дальше делятся ещё на два варианта: одни призывают вообще её избегать в любом виде, вторые же допускают её применение, но с явной подсказкой компилятору/программисту в виде дополнительных круглых скобок вокруг: if((a=f)).

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

>>> Результаты

 ,

firkax
()

В каком расположении тела предпочитаете кодить?

Форум — Talks

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

1) сидя за нормальным столом

2) сидя, но нормальный стол не участвует

3) стоя за столом

4) стоя без стола

5) лёжа на спине

6) лёжа на животе

Для опросов в левую колонку думаю не тянет, поэтому в толксы.

 ,

firkax
()

Улучшение кнопки «показать ответы на сообщение»

Форум — Linux-org-ru

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

 

firkax
()

Вывод бредогенераторов хотят обязать маркировать

Форум — Talks

источник

«Правительство обещает включить в законопроект описание требований по маркировке ИИ-контента, поставив точку в спорах о том, нужно ли маркировать нейрогенерацию или же, наоборот, что создано без участия ИИ. Как вы знаете, я придерживаюсь „органического подхода“, ведь нейрослоп плодится в интернете не просто быстро, а лавинообразно», - подчеркнул Горелкин.

 

firkax
()

smartctl для бинарного дампа смарта

Форум — Admin

Можно ли подсунуть smartctl-у бинарный дамп смарта (блоб 512 байт), снятый ранее отдельно (+ указать модель диска), чтобы он его распарсил и показал в удобном текстовом виде?

 

firkax
()

Автоматический мерж пересекающихся коммитов

Форум — Talks

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

Пример, исходное состояние:

echo greet
./prog1
./prog2
./prog3

первая ветка от него с таким коммитом:

echo greet
echo test
./prog1
./test
./prog2
./prog3

вторая - с таким

echo greet
echo test
./prog1
./prog2
./test
./prog3

Мержим эти две ветки, что должно в итоге получиться?

Вариант [1] - конфликт

Вариант [2]

echo greet
echo test
./prog1
./test
./prog2
./test
./prog3

Вариант [3]

echo greet
echo test
echo test
./prog1
./test
./prog2
./test
./prog3

Или ещё что-то?

 ,

firkax
()

Ссылки из трекера в конец темы

Форум — Linux-org-ru

В трекере перечисляются недавние (последние) сообщения во всех темах, но ссылки почему-то ведут не на эти самые указанные сообщения, а на начала тем. По-моему это нелогично.

 

firkax
()

Сколько максимум компьютеров, подключаемых к одному дисплею (не обязательно одновременно), вы регулярно используете?

Голосования — Голосования(не подтверждено)

Навеяно этим опросом: Сколько максимум дисплеев, одновременно подключенных к одному компьютеру, вы регулярно используете?

Речь про личную технику, т.е. которая в собственности, а не выдана/отдана под присмотр работодателем.

 , компьютеры,

firkax
()

Математическая задача

Форум — Science & Engineering

Я не знаю, какой раздел лучше подойдёт - этот или games, если что переместите.

----- введение, если знаете эту игру и её механику можно пропустить -------

И так, есть такая игра - cookie clicker, её суть (если опустить несущественные для задачи аспекты - их там много, но давайте их не обсуждать тут) такова: есть некий счёт, и он автоматически растёт каждую секунду на величину cps, которая зависит от того, какой набор «построек» куплен (покупка построек делается как раз с оплатой из этого счёта). Постройки есть разных типов, для удобства представим что их всего два (постройка типа A и постройка типа B). У каждого типа постройки есть:

- цена, стартовая за первый экземпляр, и дальше каждый следующий в k=1.15 раз дороже - геометрическая прогрессия

- прибавка к cps, которая даётся при покупке очередного экземпляра: если купить 10 построек, они дадут в 10 раз больше cps чем если купить одну, то есть каждое следующее добавление одного и того же cps получается дороже

Итого, текущее состояние описывается текущим счётом, количеством построек типа A и количеством построек типа B.

---------- собственно задача ------------

Текущий счёт у нас нулевой (только что всё потратили), и имеется некоторое cps = x0. Для покупки доступны две постройки:

Первая (A), с текущей ценой за штуку y1 и дающая прибавку x1 за ту же штуку.

Вторая (B), с текущей ценой за штуку y2 и дающая прибавку x2 за ту же штуку.

Первая дешевле (y1<y2), даёт меньше cps (x1<x2) и имеет худшее отношение цена/качество (y1/x1>y2/x2). Очевидно, если захотеть купить хоть что-то, то её мы сможем купить раньше - она дешевле. Вопроса два, простой и сложный.

Первый: мы хотим купить одну штуку A и одну штуку B, покупаем как только накопим. В каком порядке их надо купить чтобы быстрее добиться цели?

Второй: мы хотим максимально быстро поднять cps до некоторой неуказанной величины. Сколько раз надо купить постройку A перед первой покупкой постройки B? (формулировка не идеальная но надеюсь понятно о чём речь)

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

Найти удовлетворяющий требованиям ответ на второй вопрос мне найти пока не удалось, думаю будет интересно и недоделанные решения посмотреть.

 ,

firkax
()

Рассинхронизация нажимаемых кнопок от ситуации на экране, синхронный клавиатурный ввод

Форум — Desktop

Заголовок покороче придумать не смог.

При работе в консоли, обычно (но, к сожалению, не всегда), можно набирать заранее весь нужный клавиатурный ввод, а софт его сам, когда надо, прочитает и обработает. К слову, в ДОСе это работало ещё чаще чем в консоли современных юниксов, но там был маленький буфер ввода всего на 16 (или 32, не помню) нажатий.

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

1) нажать хоткей (или у кого-то кнопку) запуска терминала

2) подождать пока он запустится

3) набрать в нём команду и энтер

4) подождать пока запустится фф

5) набрать в нём адрес и энтер

Если не уделить должного внимания пунктам 2 и 4, ничего хорошего не получится. Хуже того, начавшее появляться окно фф не означает что 4 пункт сделан, надо ждать пока появится курсор в адресной строке.

Я понимаю, конкретно указанное действие можно реализовать иначе, вообще без терминала и с передачей урла в аргументе, но речь не про это, а про саму концепцию взаимодействия с гуи. И ещё, речь не про скорость работы компа (на достаточно быстром компе пункты 2 и 4 станут незаметно быстрыми, но проблема не в том, что они долгие, а в том что они вообще существуют).

Неужели никто не пытался это исправить? Есть ли какие-то общеупотребительные подходы?

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

 , ,

firkax
()

Список локалхостовых роутов

Форум — Admin

Я что-то раньше не обращал внимания, а в линуксе локалхостовые роуты где-то списком можно посмотреть (ну кроме ifconfig чтобы узнать оттуда айпишники всех интерфейсов)? В фрибсд они в таблице роутинга наравне с остальными присутствуют. Имеется ввиду что вот допустим у компа есть локальный адрес 192.168.1.77 и в таблице будет что адрес 192.168.1.77 доступен через lo. Ну и 127.0.0.1 аналогично.

 ,

firkax
()

readdir vs readdir_r на древних системах

Форум — Development

Насколько у меня отложилось в памяти, на каких-то древних системах readdir() возвращал данные в статическом буфере, общем на весь процесс, то есть код вида

{
  DIR *dp1, *dp2;
  struct dirent *a, *b;
  //....
  a = readdir(dp1);
  printf("name1 = %s\n", a->de_name);
  b = readdir(dp2);
  printf("name2 = %s\n", b->de_name);
  printf("name1 = %s\n", a->de_name);
  //....
Мог запороть a->de_name после второго вызова. Это сказывается на возможности рекурсивно обходить файловые деревья (надо сохранять de_name директории куда-то в другое место если оно нужно после старта её вложенного обхода). Функция readdir_r предлагалась как удобное решение этой проблемы.

Кто-нить помнит о каких системах речь и где об этом почитать? Или это всё чисто теория и в реальности таких систем не было? Или я вообще всё это выдумал и нигде такого не упоминалось?

 ,

firkax
()

Атрибуты в /dev

Форум — Talks

Наберите от рута lsattr -al /dev/ только на всякий случай на некритичном компе - что произойдёт?

Добавлю что получилось у меня, по /var/log/messages

Nov 28 02:38:39 nb2 kernel: [4438721.540616] NET: Registered protocol family 40
Nov 28 02:38:39 nb2 kernel: [4438721.613867] tun: Universal TUN/TAP device driver, 1.6
Nov 28 02:38:39 nb2 kernel: [4438721.683373] Non-volatile memory driver v1.3
Nov 28 02:38:39 nb2 kernel: [4438721.877780] Btrfs loaded, crc32c=crc32c-intel
Nov 28 02:38:39 nb2 kernel: [4438721.935117] serial 00:02: LSR safety check engaged!
Nov 28 02:42:14 nb2 kernel: [    0.000000] Linux version 5.10.0-26-amd64 (debian-kernel@lists.debian.org) (gcc-10 (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP Debian 5.10.197-1 (2023-09-29)
Nov 28 02:42:14 nb2 kernel: [    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.10.0-26-amd64 root=UUID=b595a138-37e4-4775-8edd-27e7455d14a1 ro acpi_backlight=vendor "acpi_osi=!Windows 2012" module_blacklist=echi_pci,ehci_hcd quiet

Как видно, lsattr подгрузил пачку каких-то ненужных модулей. А через некоторое время (секунд 15?) ноут молча ребутнулся, похоронив открытые окна за полтора месяца :(.

Корень причины понятен: в отличие от нормальных людей, у которых файловые флаги отдаются через stat(2), в линуксе чтоб их получить надо делать какое-то ioctl на открытый файловый дескриптор (и открывание с O_PATH не годится). Отсюда последствия: 1) на симлинках не работает, 2) попытка чтения их из chr/blkdev или pipe может иметь побочные эффекты т.к. открывание таких файлов их имеет (но в итоге всё равно фейлится, по крайней мере для файлов устройств). Тут кстати, неустранимый race получается - невозможно пытаться прочитать флаги, будучи уверенным что не откроешь случайно файл какого-нить устройства. Хорошо хоть следовать по симлинкам можно запретить через O_NOFOLLOW, а то было бы совсем печально.

Механизм конкретно моего сценария - точно не пойму, но есть два предположения: 1) грузится какой-то забагованный модуль (не обязательно из тех четырёх, ведь они могут и молча грузиться не отправляя ничего в dmesg) который спустя недолгое время роняет ядро 2) активируется какой-то hw watchdog, который допустим надо после этого оповещать раз в 10 секунд для избежания аварийных ребутов

 lsattr

firkax
()

freebsd размер i/o чанка в сисколле read() и в gstat

Форум — General

Раньше я делал read() на 1048576 байт, в gstat он показывался как 8 чтений по 131072 байт, которые отправлялись очередью. После обновления 12 -> 13 в gstat оно стало видно как 1 чтение 1048576 байт, и ухудшилась скорость работы. Такая зависимость скорости от размера блока - будем считать, особенности железа, речь не про неё.

Вопрос вот какой - почему оно раньше нарезало мегабайт на части а теперь перестало, как вернуть старое поведение? Вручную делать 8 read-ов вместо одного не годится, тогда каждый следующий ждёт ответа от предыдущего и не работает hw очередь запросов.

Это всё с O_DIRECT если что, а диски multipath.

Уточнения:

1) от multipath не зависит.

2) несмотря на O_DIRECT он походу делает read-ahead, потому что см. ниже

проверял dd iflag=direct с разными bs

размер в read()     размер в geom было - стало
1K                  32K            32K
2K                  33K            33-34K
4K                  35K            36K
8K                  39K           42K
16K                 50-51K         62K
32K+                128K           1M
Начало тоже отличается, но резкая смена поведения на 32к+ блоках выглядит странно.

Если кто захочет у себя потестить, код для узнавания размера geom-чанка

while true; do X=`gstat | grep -F тут_шаблон_для_грепа_строки_с_нужным_диском` ; rs=`echo $X | awk '{print $3}'` ; kbs=`echo $X | awk '{print $4}'` ; bs=`expr $kbs / $rs` ; echo "$rs $kbs $bs"; done
выводит чтения в секунду, килобайты в секунду и деление второго на первое (т.е. килобайты на 1 чтение)

Само чтение:

dd iflag=direct if=путь_к_большому_файлу_на_нужном_диске of=/dev/null bs=1024
запускаем с разными bs, смотрим в другом окне вывод первой команды в это время, проверять с не степенями двойки смысла наверно нет. Если на диске в это время параллельно есть небольшая активность - пофиг, а вот большая испортит статистику наверно.

 , gstat,

firkax
()

После долго запущеного xfce4-terminal терминала пропадают буквы из этой вкладки

Форум — Talks

Спустя долгое время (месяц? разное наверно, не засекал) работы вкладки куда каждую секунду обновляется дашборд текущих http-коннектов браузера она становится целиком чёрной (нет букв, нет разноцветного фона). Пробовал ввести там вслепую reset в командной строке - оно не починилось. А вот если там запустить mc то вроде он виден, правда при выходе опять всё исчезает (отличие mc в том что он использует фулскрин режим терминала, а остальные, которые не видны - обычный поточный с прокруткой). Помогает просто открыть новую вкладку а эту закрыть.

Если что, я не настаиваю на фиксе, просто решил пофлудить в толксы.

 , ,

firkax
()

usb-кабель из витой пары

Форум — Linux-hardware

Насколько жизнеспособная идея? Для модема. Короткий (сантиметров 30) я уже сделал и использую, вроде проблем не вызывает. Использовал хорошую 8-жильную витую пару, без алюминия и с 0.52 проводами, по 2 провода на каждый из 4 usb-контактов (всмысле не пару спаял в 1 точку а 2 провода из разных пар). Используется как последние 30 см проводки перед модемом, встроенные в палку на которой он закреплен, дальше идёт обычный usb-кабель, шедший в комплекте с 3g-антенной (антенна оказалась бесполезной, но usb-удлинитель от неё пригодился).

Длины кабеля не совсем хватает (он метра 2), купил активный usb-хаб со своим удлинителем (ещё метра 2) - через него модем стал регулярно терять usb-соединение (при этом он не ребутается, т.е. после пропажи-восстановления /dev/ttyUSB0 по его логам и поведению видно что он продолжает держать ту же регистрацию в сети что у него была, но ppp-коннект разумеется слетает и надо его назад включать). Попробовал взять удлинитель от хаба без самого хаба - то же самое. Вероятно, там плохой провод и я не знаю где взять нормальный. Вот собственно и подумалось что витая пара уж точно качественная, можно просто спаять удлинитель самому, но может я чего-то не знаю и будут проблемы?

upd 2025-11-08

Кабель сделал - одна пара на данные (зелёная, вроде бы с самым коротким периодом плетения), остальные три параллельно на питание. 5 метров - всё работает. В sysfs показывается speed=480

upd ещё

Нет, проблема всё-таки имеется. USB-соединение иногда (редко) стало зависать. Причём зависает странно: приём данных ведётся, отправка прекращается. Спустя какое-то время прекращается и приём (подозреваю из-за того что модем видит отсутствие данных от компа и решает подождать пока комп оживёт). На компе пинг начинает писать про переполненные буферы отправки. В dmesg ничего в связи с этим не пишется. Зависают так одновременно и ttyUSB0 и ttyUSB1. Исправляется перетыкиванием разъёма, само не исправляется.

 , витая пара,

firkax
()

Убрать парсинг обратного слеша в шелл-функции read

Форум — General
( echo "q\\"; echo "w" ) | ( read x; echo "$x" )

Выводит qw. Как сделать чтобы обратный слэш прочитался как просто символ, а следующий за ним перевод строки - как конец ввода (как было бы если б не слэш)?

В sh и в bash одинаково съедает слэш, вероятно это posix-поведение.

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

 , ,

firkax
()

K&R C депрекейтят

Форум — Talks

Ченджлог сендмейла из 2021 года

8.17.1/8.17.1   2021/08/17
        Deprecation notice: due to compatibility problems with some
                third party code, we plan to finally switch from K&R
                to ANSI C. If you are using sendmail on a system
                which does not have a compiler for ANSI C contact us
                with details as soon as possible so we can determine
                how to proceed.

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

И zlib:

Changes in 1.3 (18 Aug 2023)
- Remove K&R function definitions and zlib2ansi

 , ,

firkax
()

Тяжёлый выбор в трате лишних байт структуры

Форум — Talks

И так, есть структура

{
  u8
  u8
  u16  x;
  u16
  u16
  i64
  u64
  u8 [128]
  ...
}

Поле x получилось так что в нём младшие 12 бит и старшие 4 бита используются почти отдельно и приходится везде расставлять &0xFFF. Тянет отделить старшие 4 бита в отдельное u8 поле, но посмотрите насколько фатально это повлияет на дыры из-за выравнивания :( Как быть?

 align, , , ,

firkax
()

FreeBSD buildworld clang очень долго

Форум — Admin

При сборке FreeBSD, с тех пор как в неё всунули шланг (в 9 релизе больше 10 лет назад), этот самый шланг занимает больше половины времени всей компиляции (gcc при этом собирался за какое-то в целом незаметное время). С новыми версиями ситуация усугубляется, если в freebsd-9 он компилировался несколько часов, то в freebsd-13 он сожрал целые сутки уже (в 1 поток). С другой стороны, кто-то мне тут показывал что у него шланг (отдельной прогой и наверно в линуксе) компилировался за умеренное время и примерно столько же как и gcc.

Может кто-нить знает в чём дело (ну кроме того факта что он бутстрапится и таким образом компилируется 2 раза)?

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

 ,

firkax
()

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