All streams
Search
Write a publication
Pull to refresh
50
0.1
Send message

Ну нужно научить systemd-networkd дёргать Netlink-вызовы Амнезии, а не обычного WireGuard'а. Он же не использует для конфигурации команду wg, а напрямую обращается к netlink-сокету.

Осталось systemd-networkd подружить с amneziawg также как он дружит с обычным wg. И будет счастье )

Если бы автор кода скормил бы в isalnum число из диапазона "значение которого должно помещаться в unsigned char, или же равняться значению макроса EOF", то никакой проблемы бы не было. А segfault случился из-за того, что в int залетело число, не попадающее в этот диапазон. А как оно могло туда попасть? Очень просто - до этого были операции с wide char'ами, в результате которых родился wchar_t, который под линуксом представляет собой UCS-32 - его-то и скормили в isalnum.

Это какой-то некропостинг, и я не буду заново читать пост и въезжать в тему, но на сколько я бегло посмотрел - у автора там linux, а на linux там UCS-32. Стало быть, я ответил, имея ввиду то, с чем он реально имеет дело.

И чтобы там в стандарте не было написано, полагаю, что вы не станете спорить с тем, что для wide char'ов надо юзать iswalnum, а не isalnum?

такое в конце СССР начинали строить в Волгодонске и только распад СССР не позволил достроить проект

И на Луну могли слетать, только внезапно стало не интересно. И реактор точно такой же, но другой, и не построили. Советы всему голова.

Книга как фикшн, норм, но назвать её настольной книгой хакера - бред. "Полный root", ИМХО, больше в эту сторону.

Статья своим заголовком подразумевает раскрытие вот этого тезиса:

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


Вместо этого куча обзорной исторической болтовни о том, что ВИЭ известны человечеству с древнейших времен, и бездоказетльный тезис.

Выглядит как попытка спеть песенку "Нам нестрашен серый волк".

Кстати, как мне сделать свой собственный оператор? Хочу <$> , чтобы было удобнее

А что, в расте можно создавать собственные операторы? Или вы про другие языки? Я не думаю, что это хорошая идея в принципе, так как это сильно усложняет как минимум ту часть парсера кода, которая нарезает на токены. Что-то смутно вспоминаю, что подобная возможность была в Haskell'е, но с точки зрения читабельности кода - это примерно на уровне perl =) Сразу говорю, что IMHO, и вопрос вкуса фломастеров =)

Что за вторичная семантика такая?

Ну вот вы можете создать у класса метод abcd() - вокруг него не будет завязана какая-то иная функциональность, кроме собственно возможности вызывать этот метод. А вот, например, как я уже упоминал выше, методы begin()//end() помимо того, что их можно вызывать, участвуют в обеспечении работы синтаксиса range based for. Выглядит это криво. Как если бы метод new() у класса служил бы, скажем, конструктором. Но для конструкторов сделан специальный синтаксис - по нему сразу видно, что речь не об обычном методе класса, а об особенном. А по begin()/end() не видно, что за ними стоит какая-то дополнительная семантика. Но в плюсах такие костыли встречаются редко. В rust же на это натыкаешь почти сразу.

В плюсах я могу написать a + b, а могу написать a.operator+(b).

Это всего лишь альтернативный синтаксис вызова оператора +. В расте же операторы замешаны с методами.

В плюсах я могу написать a < b, а могу написать заклинание с std::less.

Не надо сюда примешивать std::less! std::less это не более чем шаблон, который реализован грамматикой языка, и неспециализированная версия которого просто вызывает всё то же  a < b,

Я попытаюсь сформулировать следующим образом. Если из плюсов выкинуть стандартную библиотеку, то ну, скажем, 95% функциональности языка останется. И в рамках этой функциональности вы можете написать полностью свою обвязку, и использовать в ней совершенно любые идентификаторы, не предопределенные каким-то святым писанием. А если научится пользоваться builin'ами, то и вообще все 100%. С растом, похоже, что так нельзя - вам придется описывать свою обвязку по весьма определенным лекалам. Если вы любите аналогии, то выглядит это так, что если бы для машин на бензине было бы жестко определено, что руль должен быть слева, мотор спереди и привод только передний.

Но вы почему-то считаете себя достаточно опытным чтобы писать недостоверную информацию про Rust.

То, что трейт есть только в nightly builds, не говорит о том, что информация, о которой я пишу, недостоверна. Как и то, что на практике нет греха в применении proposal в C++. Так получилось, что просто я читал про этот трейт в тот момент, когда завязалась эта дискуссия, и я его привёл. Мог бы привести трейт Add, но мне показалось это слишком банальным.

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

Операторы арифметических и логических действий, оператор индексации, вызова, взятия адреса, разыменования, приведения типов и ещё несколько.

Операторы, которые влияют на flow кода, перегружать нельзя.

Ещё раз, для тех, кто в танке. Функция main не является ключевым словом. Не является частью грамматики языка. Это особая функция с точки зрения runtime. Это не особая функция с точки зрения грамматики. Это не особая функция с точки зрения её имплементации. В сущности, вы её даже можете вызывать сами - хотя это, конечно, довольно странно, но принципиально возможно.

Я же пишут о том, что во многих языках (rust я только в качестве примера привел, в других каментах есть и java, и pascal). Есть особенные сущности более высокого уровня, которые имеют специальный смысл.


Использование main, тернарного оператора, типа int, оператора & (кстати, этот перегружается) и *, а также лямбд не приводит к тому, что вам нужно создавать какую-то вторичную семантику. Условно говоря, если я перегрузил оператор +, то я могу вызвать эту перегрузку только используя оператор +. В расте же я могу использовать +, а могу тогда вызывать метод add, который получается неразрывно связан с оператором +.

В плюсах тоже такая тема начала по-тихоньку появляться начиная с 11-го стандарта в разных местах. Это немножко портит математическую чистоту языка.

Тернарная условная операция - обычная операция?

Обычная не перегружаемая операция. Но там где операция перегружаема, например, operator + вы перегружаете именно operator +, а не имплементите trait Add с методом add().

А в С++ есть исключения, и магические операторы try/catch, ваша мысль понятна.

try/catch являются не перегружаемыми операторами. А кидать в качестве исключения можно хоть int.

Но базовые знания по Rust у вас отсутствуют.

Оу! Кажется, я понял, что имел ввиду один из комментаторов в недавнем посте, про токсичность растеров.

Никакого трейта Try не существует!

https://doc.rust-lang.org/std/ops/trait.Try.html
"Давай, до свидания" (с)

Err(err) => return err.into(),

И тут внезапно натыкаемся на код, где функция, внутри которой дёргается ? возвращает Option.

Но я так и не понял, зачем вам может понадобиться свой аналог оператора ?.

Написать свой Result с блекджеком и дамами с низкой социальной ответственностью, в котором enum будет не с вариантами Ok и Err, например.

функция с именем main - обычная функция. Подменив лодер стандартного runtime на свой, можете использовать функцию vadimr().

Типа того, да.

Я не совсем это имел ввиду. std::launder с точки зрения синтаксиса ничем необычным не является. Шаблон с одним параметров функции с одним аргументом и всё. Это не часть грамматики, это часть библиотеки. Пусть она требует некоторой поддержки со стороны компилятора, но это как раз нормальный способ абстрагироваться от implementation defined. Я же имею ввиду кейсы в другую сторону, вот как у range based for loop - с одной стороны методы begin()/end() - это обычные методы, с другой стороны от их наличия или отсутствия ломается синтаксис for(auto& x : some_collection). То есть грамматика языка (а for в данном случае это грамматическая конструкция) связана с неграмматической его частью - нельзя "настроить" range based for loop таким образом, чтобы он требовал не begin()/end(), а, например, start()/finish() - связь эта жестко зафиксирована. Таких мест в C++ чрезвычайно мало.

Ну, например, трейт Try. С точки зрения синтаксиса - это ничем не отличающийся от других трейтов трейт. Но именно он отвечает за возможность пользоваться оператором ?. То есть это magic trait. В Яве, например, чтобы бросить Exception необходимо наследоваться от класса Exception - хотя вроде бы это класс, как класс, но выкинуть его и написать свой нельзя. Это magic class. В паскале println - вроде бы обычная функция, а на самом деле нет, так как calling convension не позволяет делать функции с переменным количеством аргументов, и написать свою такую функцию нельзя. Это magic function.

При этом, уверен, некоторые type trait классы все-таки реализованы на уровне компилятора.

Нет, в отличие от других языков, как, например, rust, в c++ практически нет никаких магических типов, трейтов и прочих вещей, которые делают то, что ты не можешь сделать сам. Единственное исключение, которое приходит на ум - это range based for loop, который требует наличия begin()/end() у объекта - на мой вкус весьма уродливо вкорячили это в язык.

Именно поэтому весь ваш батхерт на тему строк и умных указателей - это не фича языка, это фича библиотеки, которую можно выкинуть и взять свою.

Именно поэтому, ИМХО, язык такой многословный, как вы пишете.

Information

Rating
3,166-th
Registered
Activity