LINUX.ORG.RU

Сообщения lesopilorama

 

А объясните про шифрование в HDMI.

Форум — Talks

Трафик в HDMI кабеле вроде как шифрован, но это не точно. Шифрован какой-то малобитной хернёй, но не суть, вопрос не про расшифровку. Затем шифрован, чтобы из провода сосед с жучком не воровал контент. Ну и там какая-то история про отчисления со стороны производителей HDMI-устройств куда-то там.

А можно объяснить техническими словами, что мешает любой китайской конторе в подворотне начать клепать аппаратные HDMI-mp4 енкодеры, в которые ты втыкаешь HDMI кабель и которое на выходе выдаёт mp4 файлик с видосом и никуда никому не платить никакие отчисления? Или что мешает сделать работающий китайский телек под названием «Ссы Собака На Свинину», в который можно воткнуть HDMI кабель и опять же физически никуда не платить? Эти HDMI-чипы-приёмники производятся где-то в одном охраняемом автоматами месте на тайване, откуда никак физически не украсть и не скопировать какие-то там ключи или что?

На aliexpress например навалом всяких коробочек вида HDMI -> mp4 -> microsd, чтобы геймеры экран записывали или транслировали. Правильно ли утверждать, что каждая такая коробочка проходит государственную комиссию КГЧП РСФСР КГБ ЕВРОСОЮЗА прежде чем начать работать? Бред же.

 

lesopilorama
()

webassembly - пара теоретических вопросов.

Форум — Development

Заранее прошу простить, но конкретный исходник по вопросу к посту подготовить не успеваю, но в конце пара ссылок на суть дела от других производителей…

Пытался сделать максимально компактную .wasm хрень на C с помощью emcc, задача которой просто байтики молотить - картинку обработать. Исходник оставил на другом компе, но дело не столько в нём, сколько в понимании модели памяти вебасма. Сделать-то компактно ополучилось: ноль инклудов, пара функций, пара глобальных переменных, экспорт всего наружу, всего 50 строк, ~400 байт на выходе.

Компилируется, в JS инициализируется, как надо не работает, но и не падает.

Вопросы:

  1. А правда, что wasm-инстанс (ну, «запущенная wasm программа») имеет модель памяти вида «плоский шмат» и любой указатель - это оффсет в этом шмате? То есть, если я хочу выделить память без планов её освобождать, я могу просто отступить куда-нибудь вперёд килобайт на 100 (при наличии Memory достаточного размера) и спокойно туда записывать? То есть, правда ли то, что в wasm-инстансе нет ничего подобного вызовам mmap/brk в линуксе, когда тебе могут надавать вообще разных адресов? В wasm у тебя только один шмат, просто можно как-то нарастить размер.

  2. А во что превратится глобальный static int[1024 * 1024]; написанный в сишном коде в webassembly? А можно я буду выделять себе свой единственно нужный буфер именно так? Пробовал взять на него указатель - дают некое число небольшое число типа 1050 - ну типа прямо как offset в пункте (1). Попробовал туда записывать - причём циклом по всему массиву - нормально, ничего не упало.

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

Про исходник: в принципе все технические детали сп***ны отсюда: https://github.com/quin2/fast-paint

На что обратить внимание:

  1. Шмат памяти, в котором вся сишная часть этого проекта ковыряется, была «выделена» вот тут: https://github.com/quin2/fast-paint/blob/main/buffer.c#L63 - но, как мы знаем, в webassembly модель памяти - просто один шмат, поэтому этот malloc был скомпилён скорее всего в итоге во что-то, что вернуло uint32 с оффсетом на память.

  2. Далее со значением этого указателя screen имеют дело уже вот тут https://github.com/quin2/fast-paint/blob/main/script.js#L35 в виде обычного числа.

  3. Ну и основной цимес: как чуваки апдейтят canvas context: https://github.com/quin2/fast-paint/blob/main/script.js#L421 - вот просто хоба и скопировали прямо из буфера, в который инстанцировали webassembly с оффсетом pointer шмат памяти и закинули на ctx. Тащемта всё! В этой простоте и вся трагедия - попытка это повторить БЕЗ ВЫЗОВА malloc в сишной части, а просто отступив сколько-то памяти - это какой-то провал и непонятно почему, хоть и незаконно.

 

lesopilorama
()

C++: а чё оно не компилируется?

Форум — Development

https://godbolt.org/z/n3YWGMYfn

Хочу 4 конструктора для всех комбинаций (const, sign). Чё оно хочет?

Дадно, пример короче: https://godbolt.org/z/vn3TEn6s3 Тоже не хочет. Почему оно так себя ведёт?

В принципе понятно почему: на такой постановке задачи, сформулированной таким кодом, шаблонный движок не осилил подобрать T = char. Оно пыталось подобрать T = char[6], у него не взлетело и оно бросило попытки. Чё-то такое. Оно дуро?

 

lesopilorama
()

А посоветуйте девайс или софтину под android для 360 фоток

Форум — Talks
  1. Сейчас юзаю samsung S22 ultra + «Google Camera» приложеньку, в которой есть функция Photo Sphere, которая даёт пока наилучший результат из всех приложенек, которые пробовал вместо этого решения. Бывает куча ошибок склейки и кривые фонари даже днём, но порой выдаёт шедевры и генерит 6000*N картинку - достаточно большое разрешение, чтобы это принималось яндекс-картами например. Пример съёмки этим решением: https://yandex.ru/maps/2/saint-petersburg/?l=stv%2Csta&ll=30.329850%2C59.944130&panorama%5Bdirection%5D=151.685075%2C-9.381176&panorama%5Bfull%5D=true&panorama%5Bpoint%5D=30.329595%2C59.944309&panorama%5Bspan%5D=117.141850%2C60.000000&z=18.86 (как я убираю фотку ног - «земельная» последняя нижняя центральная фотка делается вытянутой рукой отойдя на метр максимально из кадра)

version 8.7.250.494829638.44

  1. Есть всякие аппаратные штуки типа insta360, но стоит конско и непонятно что брать. В идеале хочется «нажал кнопку и готово» - то есть вские аппаратные комбинации из 2 fisheye-объективов, развёрнутых на 180 градусов. Но там недостаток в том, что надо редактировать фотку, вырезая из её низа фотку своей головы. Вроде вот есть обзорчик https://www.youtube.com/watch?v=52dHImsgOY0 но я пока времени вдумчиво посмотреть не нашёл…

Короче, интересно послушать советов по получению 360 фоток улицы с целью аплоада на яндекс-панорамы или аналогичный сервис минимальным количеством усилий. Ясно, что лучшее качество - это зеркалка + настольный комп с софтиной, но хочется обойтись без этого, нужно карманное портативное решение. Самое потенциально крутое решение - это тот же смартфон, плюс какое-то более волшебное приложение, чем в пункте (1).

 360,

lesopilorama
()

Посоветуйте android-мобилу за 5 тыр БУ с авито в качестве резервной.

Форум — Talks

Из критериев: максимум RAM, производительности и батарейки за эти деньги. Наличие LTE, usb-c. Камера важна не очень. Всё.

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

 

lesopilorama
()

Видеонаблюдение на вебкамерах - насколько это тупо?

Форум — Talks

Вот есть старые USB веб-камеры с хорошей картинкой типа logitech 9000 pro. Причём, картинка там конкурирует до сих пор с текущими имеющимися на рынке, правда 4K за 8 косарей эту штуку уже уделывает. Их можно втыкать в дешёвые одноплатники и стримить картинку куда-то, где её хранить. Вот так из буханки хлеба можно сделать троллейбус почти бесплатно.

Насколько это маразматически тупо в сравнении с современными IP-камерами типа hiwatch ds-i214? Правда ли, что во втором случае картинка будет даже лучше, да ещё тебе и аппаратно в нормальный кодек пожмут и не надо мутить ссаные одноплатники? Или первый способ ещё для чего-то годен в этой индустрии? Пробовал первым способом делать фото-наблюдение за котом на лежанке, оно с помощью софтины motion отправляла джипег раз в секунду на сервер - было годно тащемта. Но со вторым способом серьёзно в жизни дел не имел.

Главный трейдофф между этими вариантами - экономический. Хорошая IP-камера стоит 5-10К, а эти вебки можно насобирать по 500 руб и одноплатники, которые это потянут я тоже знаю где брать по 700 руб.

 ,

lesopilorama
()

Пояснения по математике для дебилов: а чем вообще так замечательны многочлены в алгебре и нафига они фундаментальны?

Форум — Talks
f(x) = c0 + c1 * x^1 + c2 * x^2 ... cn * x^n

Чем это вообще кому-то интересно, полезно и замечательно? Зачем это изучать и делать фундаментальным в алгебре? В чём прикол?

Для обычного программиста это выглядит просто рандомной функцией. Почему, например, не взяли функцию вида

f(x,y,z) = c0 * x + sqrt(y) + c2 * (x * y * z * 3)

и не начали усиленно изучать именно это? В чём особый цимес первой функции? Ну типа, зачем что-то возводить именно в какую-то степень? В чём такой большой прикол умножения на самого себя какое-то целое число раз, постоянно возрастающее именно на 1 в каждом следующем члене суммы? А чё если мне надо возводить в степени из массива [1, 1.2, 1.4, 1.5]? Почему степени именно [1,2,3,4,5,6]? Чё за натуральный счёт, кто-то кого-то считает или чо.

 

lesopilorama
()

C++ vs Rust - проблемы этих языков на примерах кода.

Форум — Development

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

  1. Rust фанат кидает пример C++ говнокода.
  2. C++ енджоер объясняет, что данный код в 2024 все C++ разрабы пишут не так (и показывает как) и никаких проблем не может быть.

И наоборот.

Например мне Rust-фанаты кинули такое:

#include <iostream>

struct Data {
   const int &ref_;

   explicit Data(const int &_r)
   : ref_(_r) {

   }

   void print() {
      std::cout << ref_ << "\n";
   }
};

int main() {
  Data t(42);

  // Тут ты умер - попытка напечатать 42
  // по ссылке на него, тогда как 42 давно
  // не существует (оно существовало только
  //во время вызова конструктора Data())
  t.print();

  return 0;
}

Но выяснилось, что Rust-фанаты наврали, потому что C++ такое тупо не скомпилирует, если вызывать компилятор с нормальными пацанскими опциями «просто не пропускай херню»:

g++ test.cpp -O3 -Wall -Werror

 ,

lesopilorama
()

C++: как сделать, чтобы это не компилировалось?

Форум — Development

Берём ссылку на временный объект, который непонятно сколько времени существует. Потом пытаемся печатать содержимое объекта по ссылке, которая хрен знает куда ведёт.

-Wall -Werror – достаточно по-пацански так жить?


struct Data {
   const int &ref_;
   explicit Data(const int &_r)
   : ref_(_r) {

   }

   void print() {
      std::cout << ref_ << "\n";
   }
};

int main() {
   
   Data t(42);
   t.print(); // развал жопы на куски
   return 0;
}

 

lesopilorama
()

Нужны пояснения по формулам из статьи.

Форум — Talks

http://www.dsplib.ru/content/filters/ch9/ch9.html

Посмотрим на формулу (1) и пару графиков ниже.

обозначения:

x(t) – оригинальный сигнал, который дискретизуют.

xb(t) – видимо это дискретизующий дискретный сигнал, генератор выборок, ну то есть шарашит импульсы равные 1 через интервалы T, в остальное время имеет значение 0? Или я не так понял?

Что непонятно:

Зачем сумма в формуле и что такое б(t). Если б(t) - это сигнал дескретизатора, который показан на первом же графике ниже, то зачем сумма-то?

Сигнал дескретизатора (первый график ниже) изображён ну вроде-бы понятно почему так: там нарисовано, что в каждый момент времени через T этот сигнал равен одному и тому же = б(t). То есть, в момент времени, например, 4T значение этого сигнала = б(t - 4T). Почему не написали б(0 - 4T), нафига сюда засунули t?

Вообще первый график я не понимаю. Он в момент времени 0 равен б(t). А чему равно б(t) - то?

Дальше: зачем в формуле (1) сумма? Значение дискретного сигнала в точке t равно просто x(t) * б(t) без всяких там сумм. Просто б(t) имеет значение 0 на всех промежутках между отсчётами 0, T, 2T, 3T. Зачем что-то с чем-то суммировать-то? Я бы понял там какую-то попытку что-то с чем-то интегрировать, но там сумма по n = 0,1,2,3. Это же то же самое, что я напишу цикл:

// обозначим б(t) функцией BEE(t).
int calc_discrete_value(double *signal, int t) {
   int value = 0;
   for(int i = 0; i < INFINITY; ++i) {
      value += signal[t] * BEE(t - T * n); // вот это чо за бред?
   }
   return value;
}

Чё за бредовая сумма-то? Спасибо.

 

lesopilorama
()

C++ vs Rust: правда ли, что Rust тупо сложнее крестов в базовых сценариях применения?

Форум — Development

Если C++ разраба заставить писать код на определённом подмножестве C++ (в первом приближении: не выделять память руками, не юзать указатели, не кастовать типы), то в принципе течь и падать там будет негде. На деле чуть тоньше и проще: указатели можно, но если тебе его передали в конструктор. Есть циклические ссылки, но тоже можно чё-то придумать. В общем, чёткого набора рецептов нет, опытный разраб в конкретном проекте выработает свои достаточно рабочие, плюс статический анализ и прочие там sanity-check тулзы и valgrind-ы скажут где насрано автоматически.

А есть просто Rust, где достаточно запретить писать unsafe и всё будет гарантированно блестяще и даже думать не надо.

Но говорят, Rust сложнее. Думать там надо уже просто чтобы базово взлететь, тогда как для базового взлёта на C++ достаточно быть тупорылым сишником, которому запретили выделять память. Гонят?

! ! ! ААААА ПРОСЬБА ПЕРЕНЕСТИ В TALKS ОШИБСЯ ФОРУМОМ ! ! !

Дополнение к уже написанному в треде.

  1. Тяжёлое наследие плюсов: его нет, если его не юзать. Я же не пишу в Rust ассемблерные вставки везде. Возможность их написать же не говорит о том, что у Rust тяжёлое наследие всей x86/ARM аппаратной платформы. Нормальный C++ код не содержит никаких макросов, например и передач указателей в пределе. Передай ты std::span, std::string_view и т.п. вместо (char* ptr, uint32_t size).

  2. Никогда не понимал тезис, что синтаксис обычного Си - сложный. Он может быть сложный во всех ВОЗМОЖНОСТЯХ, но в базовых сценариях он кажется примитивным: int function_name(int a, int b) { return a * b;} - это же предельно тупейшая идея синтаксиса, которую придумает любой школьник при наличии задачи изобретения ЯП. Даже конфиги хочется писать в таком стиле - см nginx. Так вот, если сознательно не усложнять себе жизнь, то C++ так же прост.

  3. Посмотрим на такие конструкции Rust, выдернутые из контекста:

languages.get_statistics(&input, &cli.ignored_directories(), &config);

Имеются какие-то &. Не знаю что это, но почему не написано input вместо &input? То есть, юзера заставляют думать про разные виды передачи аргумнетов чтоли? Ссылочно/указательно? Чем это отличается от необходимости в крестах думать про rvalue, lvalue, reference, pointer? То есть, от этого момента язык тоже не ушёл: нельзя как в JS/Python херануть объект в аргумент и зашибись - надо думать как херануть.

(0..10).map(|_| "#").collect::<String>()

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

fn main() -> Result<(), Box<dyn Error>> {

В С++ проще. Не надо писать fn, чтобы сказать, что это функция, достаточно привычных миру () и тип возвращаемого значения в C++ необязательно предварять -> чтобы сообщить компилятору, какое оно. Ту же мы видим некие генерики/шаблоны - в плюсах они выглядят так же.

let mut is_sorted = false;

В Rust это выглядит НАДЁЖНЕЕ чем в С++, потому что заставили написать mut, чтобы сообщить, что это можно менять. В C++ это выглядит так же коротко в принципе: auto is_sorted = false;. Но в крестах ты пишешь const auto is_sorted = false; если надо конст и всё.

Посмотрим как пилятся сруктуры в расте:

pub struct CodeStats {
    /// The blank lines in the blob.
    pub blanks: usize,
    /// The lines of code in the blob.
    pub code: usize,
    /// The lines of comments in the blob.
    pub comments: usize,

Блин, в C++ же проще:

struct CodeStats {
  // The blank lines in the blob.
  usize blanks;
  // The lines of code in the blob.
  usize code;
  // The lines of comments in the blob.
  usize comments;

Я потратил меньше кода в крестах. Мне не надо писать pub напротив каждого поля, я могу его вынести в начало. Плюс, struct в крестах - это по-дефолту всё pub, а class - по-дефолту всё private - можно регулировать приватовость всех полей сразу просто выбором слова, которым объявлять структуру.

Что бесит в Rust: тип в конце. Но в языках, где важна производительность, люди любят подумать про memory layout - «как всё лежит в памяти» и посмотреть в первую очередь на типы всего, что лежит в структуре: какой тип рядом с каким, как это выровняется, например. Понятно, что в структуру в таких случаях данные пихают не по выравниванию, а «что рядом с чем потребляется процом», чтобы «нужное вместе» в одну кеш-линию, поэтому важнее будут имена полей, чем типы. Но всё-таки хочется «от общего к частному»: сначала видеть ЧТО ЭТО В ПРИНЦИПЕ (какой у этого тип), а уже потом как оно называется. Условно, мне хочется в «семантике общения» ситуацию «это собака, её зовут Вася и это тоже собака, и гоша», а не наоборот: «это Вася, а ещё он собака, а это петя и он собака». Я не хочу думать про имена, я хочу сначала схватывать суть уровня «так, тут у нас две псины, что они тут делают», а как они называются я потом разберусь)

pub fn summarise(&self) -> Self {

Об этом уже говорилось, в C++ тут будет меньше кода. А где тип аргумента, статически типизированные вы наши, йопт? В целом понятно, почему они заставили писать pub перед каждой функцией - чтобы тупорылый разраб сразу видел точно публичное оно или нет. А то в C++ напишут слово public: а дальше ряд функций и могут случайно написать функцию не в той секции и она случайно будет public – лучше пусть явно пишут! Но хз, это вкусовщина: мне приятнее организовывать всё именно как в плюсах: написать public и дальше у нас красиво пошёл публичный интерфейс. Нафиг мне pub в глаза пихать на каждый чих. Та же конструкция в C++: Self summarise(T &self) {. Опять же, уже говорилось: наличие & - раст оказался не таким уж простым, юзеру надо думать ссылка там или не ссылка? Где такая же простота, как в ссаном JS, что просто self написал и всё?

Давайте просто сюда посмотрим: https://github.com/sharkdp/fd/blob/master/src/filesystem.rs – в принципе да, всё читаемо, красиво, выразительно. map всякие там. Отсутствие скобок у if бесит конечно, ну ладно, в питонячке так же. Но в целом код на современных крестах выглядит абсолютно так же, может чуть меньше символов напечатать придётся. А где-то вместо map().blabla().bubu() будет несколько процедурных строк, потому что в именно стандартную библиотеку C++ не подвезли именно такой семантики, но она достижима в самом языке.

Посмотрим сюда: https://github.com/XAMPPRocky/tokei/blob/master/src/input.rs

Спецсимвольный perl-адок какой-то немного. Зачем так жить. Степень жести в районе строк 16-26 вообще ничем не способна привлечь юзера в сравнении с самыми мерзкими местами C++. Ясно, что это всё можно как-то объяснить. Точно так же «как-то» можно объяснить вот такой C++ код: https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/src/c++11/thread.cc#L235 - синтаксис обычный такой «сишный», просто вперемешку с макросами и большим количеством ___ в названиях переменных: в общем, оба фаната «как-то» объяснят ад в своих языках, простой мане, которая хотела «простой язык» оба этих места одинаково жопные.

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

 

lesopilorama
()

Цикл статей «для дебилов»: в чём смысл борьбы X11 vs Wayland?

Форум — Talks

Бывает, программируешь на C++ серверные приложения под линукс, шаришь в алгоритмах и файловых системах, а про другие части линукса знаешь мало: как стартует ядро или в чём разница между убунтой и дебианом или как пиксели на экране рисуются. Вот для этого нужна серия статей для дебилов, поясняющая чо происходит в линуксе. Как работают видеодрайверы и как физически рисуются пиксели я может быть знал во времена DOS, но не теперь.

Первый вопрос в этом цикле: а нафига нужен Wayland и почему недостаточно X11? Почему разрабы Wayland просто не форкнули X11, например или не кикнули старых разрабов X11 с баркаса на мороз и не стали паханами в X11 и не сделали всё как надо? Короче нужен исторический экскурс в причины появления Wayland, смысл его существования, перспективы, проблемы и нерешаемые проблемы. В чём X11 всё ещё крут, в чём X11 уже никогда не будет крут.

Может кто-нибудь на пальцах раскидать положняк по этой теме так, чтобы любой алкаш понял?

Спасибо.

 ,

lesopilorama
()

Про аудио-кодеки и OPUS: а есть что-то лучше, чем OPUS в построении интернет-телефонии в настоящее время?

Форум — Talks

Про Codec2 и прочие там AMBE+, P25, DMR и т.п. в курсе. Речь не про такие экстремальные приколы, речь про интернетик с «нормальными» полосами пропускания, где конечно тоже экономят.

Вопрос такой: каким кодеком сейчас пытаются кодировать голос создатели всяких там интернет-звонилок? Телеграм, зум, VK-звонки, гугл-hangouts и прочие созвоны? Правда ли, что ничего лучше OPUS кодека для этих целей сейчас особо нет? «особо» - значит, что он достаточно хорош, учитывая открытость, проработанность, низкозадержечность и звукожмучесть, чтобы не соскакивать на какой-то другой.

Да, есть всякие «стандартные» во «взрослой телефонии», типа там G.722. Но они достаточно «древние». OPUS пожмёт речь с тем же качеством на полосе в 2-3 раза меньше. Например OPUS 23 килобита - это прям HD качество речи, а G.722 на 48 килобитах только начинает работать.

В западных интернетах вроде бы мнение такое:

  1. G.722 – для HD-звонков внутри офиса (7 кгц звука, 48-64 кбпс)
  2. G.711 – для звонков за пределы офиса (300-3400 звук, полоса как у G.722?)
  3. OPUS – для всего новомодного

P.S. Кстати зацените прикол: если в андроид-клиенте телеги отправить голосовуху, то она кодируется OPUS, но зачем-то занимает конское число байт и кодируется с каким-то шедевральным симфоническим аудиофильским битрейтом вроде 165 кбпс! Жесть там Дуров диски не экономит.

 

lesopilorama
()

А расскажите про Торвальдса? Он правда сам мёржит руками и читает код до сих пор?

Форум — Talks

Вот он прямо реально сам сидит за компом целыми днями, вычитывает какие-то патчи, смотрит чо как? Или есть назначенные бояре на нужные участки ядра, а он особо не вникает?

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

(мем про киану: «а что если TOR - образовано от Torvalds»)

 

lesopilorama
()

Тяжёлые рациональные препятствия использования Rust вместо C++

Форум — Talks
  1. Язык, ограничивающий работу с сырой памятью, сырыми аллокациями, сырым владением - уже есть внутри C++: это такое его подмножество, где аллокации заменены на make_shared-подобное, сырая память/ресурсы - на всякие там контейнеры/инкапсуляции/RAII, владение - на смартпоинтеры и подобное. Если я как-то «нормально» знаю C++, включая и «сырое» и «хорошее», то получается мне не надо осваивать никакой другой язык, чтобы начать пейсать не-говно. Зачем вводить в инструментарий что-то ещё, если такое уже есть? Отказаться от C++ в пользу Rust - это какой-то сложный манёвр, совершаемый гораздо проще не уходя от C++ и не ДОБАВЛЯЯ ничего нового, а только УБИРАЯ что-то: достаточно отказаться от ЧАСТИ C++, не изучая ничего нового вообще. Не пиши на C++ и пиши на Rust - это строго сложнее и страннее, чем «пиши на С++, но без сырых указателей и сырых аллокаций». Rust уже есть внутри C++, что моментально заненужнивает какой-то отдельный Rust. Более того, для начала можно даже не ходить так далеко как отказ от куска C++, а взять свежайший C++ компилятор, врубить последний стандарт, врубить все параноидальные warning по максимуму, приравнять их к ошибкам компиляции (-Werror) и компилятор подробно расскажет тебе, какая ты дура, пока не перепишешь нормально.

  2. Ясно, что Rust нужен, чтобы набрать много макак с рынка, которые ПРИ ЖЕЛАНИИ не смогут сломать память. Теоретически, вредное подмножество Rust (unsafe) в разы меньше, чем вредное подмножество C++. По задумке, ревьюить Rust - проще, ведь надо просто отследить наличие unsafe, а ревьюить C++ макака не может. Ну ХЗ - в статический анализатор кода запихнул правила забраковки кода с сырыми указателями в С++ и готово. Ну и последний совет из пункта (1) даст 100 лет строгача с конфискацией за малейшую попытку побега - всё как в Rust: небезопасненько: не соберётся.

  3. Но Rust не простой, под него макака не подходит изначально. Rust варится в такой же задротской атмосфере, как и C++. Для макак инструмент надо ещё более тупой - что-то типа JS, где «что ни написал - всё работает», а к памяти доступа ВООБЩЕ нет ни через какое волшебное слово (unsafe). Если надо, чтобы быстро исполнялось, то в бинарный код мы уж как-нибудь скомпилируем/оттранслируем любой кал - в пределе (в прекрасной России будущего) волшебные оптимизаторы LLVM разрулят всё неоптимальное, что макака написала. Транслируем любой макачий кал в строго корректный машинногенерируемый С++ и его скомпиляем.

  4. Даже из принципа нужности управления битиками в крайне узкоспециальной части проекта мне не нужно много гениев. А это «мало гениев» я наберу с рынка вообще без проблем - и по зарплате там не сильно важно в чём он там гений - C++, Rust. Rust-задроты даже больше просят из-за модности.

  5. Супер железное правило, которое не перебивается вообще ничем логически: если вы затеяли лабать что-то уровня собственной СУБД с транзакциями и запутались в циклических ссылках, то вы уже давно перешли порог гениальности, после которого вам уже вообще насрать на чём это пишется. Эпичный баг, который вы будете искать дольше суток, с утечками/циклическими ссылками/порчей памяти вы в этом большом проекте поймаете за жизнь 2 раза от силы, остальное проблемное какой угодно сложности вы в дебаггере отловите за пару часов и это будет случаться раз в полгода - вообще экономически не повод менять инструмент. Да и то, затрачиваемое время на поиск багов растянется только потому, что на вашем уровне развития вы не могли пройти мимо очередного срача «C++ vs Rust» и отвлеклись на 4 часа от дебаггера.

UPDATE

Мне накидали в панаму разумных куёв, поэтому давайте выведем топик на новый уровень. Напишите не суперсложный кусок кода на C++, который потенциально вызывает проблемы и тот же кусок кода на расте, который никак не бомбанёт.

 

lesopilorama
()

Посоветуйте ThinkPad с авито тыщ за 20-30 более-менее современный по железу.

Форум — Talks

Ну типа i5-8XXXXU серия проца, 16 гигов памяти, IPS матрица. Чо смотреть? T480, E14, X1? Мобильность слабо важна, всю жизнь будет на столе в основном, иногда на диване.

 

lesopilorama
()

Научите пользоваться GPG, что я делаю не так.

Форум — Talks
  1. Создал ключ на BLABLA@BLABLA.COM, пройдя этапы –full-generate-key.
  2. Тестирую echo "HELLO WORLD" | gpg -r BLABLA@BLABLA.COM --encrypt --armor Выдаётся годнейший ASCII блок.
  3. Тестирую расшифровку: echo "HELLO WORLD" | gpg -r BLABLA@BLABLA.COM --encrypt --armor | gpg. Провал:
gpg: encrypted with 1024-bit RSA key, ID 1234524526262626, created 2024-08-06
      "POLUSUKA (PIDAR) <BLABLA@BLABLA.COM>"
gpg: public key decryption failed: Operation cancelled
gpg: decryption failed: No secret key

Чо делать-то.

 

lesopilorama
()

А какая бизнес-модель у Яндекс Браузера и перспективы?

Форум — Talks

Иногда происходит попытка завлечь некого C++ разраба на собес в Яндекс-Браузер и этот разраб думает: «а оно ещё живое? А зачем оно на планете есть»?

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

В общем, нафига ещё жив яндекс-браузер и каковы перспективы?

Тексты от HR монут выглядеть так:

Из интересного: Яндекс браузер – самый большой проект на С++ в мире. 
Есть несколько команд: 
те, кто делают ядро; 
рендеринг-движок; 
те, кто реализуют бизнес-логику; 
те, кто делают UI 
Стек: С++ ( минимум 11, кодовая база в проекте обновлена до 20 стандарта)
Браузер кроссплатформенный - это надо учитывать при разработке фичей

Там прям какие-то команды. Ядро, рендеринг и т.п. Зачем? Разве это не просто клон хрома?

 

lesopilorama
()

Ubuntu 20.04: запретить менять вывод звука на воткнутые USB-наушники.

Форум — Desktop

Слушаю музон в браузере через встроенный в ноут jack 3.5. Втыкаю USB-наушники с микрофоном ради того, чтобы в ffmpeg позаписывать звук с этого микрофона явно выбирая hw:1,0. Музон в старых наушниках пропадает, поток перенаправляется в USB-наушники. Падла! Хочется запретить это жопное поведение.

В файле /etc/pulse/default.pa закомментил вот это:

# load-module module-switch-on-port-available
# load-module module-switch-on-connect

Сделал pulseaudio -k – но всё по-старому! Что делать? Самозарубиться топором по темени?

P.S.

Блеат, pulseaudio -k - для бомжей. Помогло только

killall -9 -r pulse
pulseaudio -k
pulseaudio --check

Жесть треш угар содомия. Заработало: USB звуковуха перестала воровать звук при втыкании.

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

P.P.S.

Нет, не помогло нифига. На самом деле у меня просто умер pulseaudio навсегда и спокойно работает ALSA. Всё что связано с pulseaudio отказало катастрофически навечно. Поэтому-то ничего и не переключилось, бугагагагага.

 ,

lesopilorama
()

Цифровая обработка сигналов: фильтр Баттерворта, вопрос по амплитуде

Форум — Development

Вопрос крайне туп. Если взять рандомную хорошую и правильную реализацию фильтра баттерворта рандомного порядка (или запилить самостоятельно) и загонять на вход фильтра семплы нашего сигнала, то на выходе мы получаем семплы правильно отфильтрованного сигнала, НО с какой-то дикой амплитудой. Вопрос в том, что я не понимаю связи размерности семплов входа и семплов выхода. Например, имея на входе нормализованный сигнал (со значениями между 0 и 1), в выходных float-значениях семплов я получаю какие-то адовые миллионы. При этом эти значения не являются бредом: если найти на рандомном участке максимум и нормализовать выходные семплы по этому максимуму, то мы имеем вполне себе адекватный выходной сигнал, отфильтрованный как ожидается. Хочется понять почему так происходит: значения выходных семплов никак не связаны по размерности со значениями входных. На входе может быть и не нормализованный сигнал, а прямо сырые PCM-значения: фильтр тоже исправно работает, просто на выходе уже «сотни миллионов» )

 ,

lesopilorama
()

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