Обновить
4
0.1

Пользователь

Отправить сообщение

Слово "читаю" предполагает, что это было написано. Если у меня не написано того, что Вы якобы читаете, то Вы не читаете, а выдумываете.

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

Вот такой выбор есть. А выбора "строгие рассуждения" нет.

Строгий ответ, тем не менее, существует. Да, он вполне может оказаться невычислим доступными ресурсами. Именно поэтому мы полагаемся на эвристики. Но тогда критично понимать, что если эвристика говорит Б, то ответ не обязательно Б, и если он на самом деле не Б, то прислушаться к эвристике будет вашей ошибкой. И иллюстрации этого в примере с нулём я не вижу, более того, считывается (субъективно, как моя частная точка в статистике чтения) отношение "неважно какой строгий ответ, важно что сказали мои любимые эвристики".

Но если вы запустите ракету по эвристикам, и выданная ими программа запуска на самом деле неправильная - извините, в реальности ракета сегодня на Луну не полетит. Если ваши эвристики сказали "х.з. хозяин, мы понятия не имеем, чётное ли число ноль", и вы на этом основании обзавелись убеждением "0 - может чётное, может нечётное, может и то и другое одновременно, смотри "0 - неотрицательное"", то вы впустили себе в голову ложное убеждение. В модельном примере это выглядит как too clever for their own good - что вы запутали сами себя на ровном месте.

Потому что у меня чётко и однозначно сказано, что речь не про теоретическую математику, а про практическую перепроверку выводов/расчётов.

Вы решили проиллюстрировать это математикой - я отвечаю на уровне математики.

На уровне практических задач, что характерно, будет то же самое. Валидно ли писать *reinterpret_cast<std::atomic<int>*>(&val) = 42;? Если идти от правил языка, то ответ "конечно же нет, точка". А если считать что "практическая перепроверка" может быть использована вместо строгих рассуждений, то с одной стороны так нельзя, но с другой у Пети всё правильно работает, проверка не доказала невалидности, так что идея Васи "давайте срочно перепишем этот код" имеет "меньшую степень обоснованности"©.

Если вы хотели показать что-де существуют ситуации, когда правильный ответ по-прежнему совершенно недвусмысленный, но вот ваши эвристики проверки этого ответа могут дать сбой, то даю обратную связь: эту идею из текста лично я не считываю. Вместо этого я читаю нечто вроде "есть правила "для ЕГЭ", а вот если разбираться как на самом деле и делать разные проверки, то уже не так и бесспорно что 0 - чётное".

Неотнесение нуля к нечётным, не делает его чётным.

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

Если первое, то (∀n∈N (∃ k∈N n=2k → ¬A(n))) → ¬A(0). (N - множество конечных кардиналов, включающее Card(∅) = 0.)

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

Есть целые числа, Z. (Можно ограничится только натуральными, N.)

Мы договорились для a,b ∈ Z, b≠0 под фразой "a делится на b" понимать "∃ k ∈ Z : a = k*b". Мы договорились под фразой "a - чётное" понимать "a делится на 2". Мы договорились под фразой "a - нечётное" понимать "неверно что a делится на 2"

Из этого определения следуют свойства, вроде того что x*y делится на b если и только если x делится на b либо y делится на b. Или что a делится на 5 если его десятичная запись заканчивается на 5. Или что сумма двух равных друг другу чисел всегда чётная.

Если у вас на руках число n, и вы хотите понять, чётное ли оно, вам необходимо и достаточно показать соответствие определению. В данном случае n=0 это тривиально: "∃ k=0 ∈ Z : n = k*2". Всё.

Вы можете вместо прямого определения использовать какие-то ранее доказанные свойства (к примеру, заметить что 0 = 0+0), но следует соблюдать минимальную аккуратность - скажем, десятичная запись числа 30 не заканчивается на 5, но 30, тем не менее, делится на 5: "∃ k=6 ∈ Z : 30 = k*5". То что конкретное свойство не помогло вам ответить на вопрос о соответствии определению - не признак какой-то глубокой истины, это просто означает что вы выбрали неудачное для вашей задачи свойство.

какой смысл ничего делить на 2 или любое другое число

Например для отслеживания инвариантов. Если я могу доказать что в некоторой ситуации утверждение A(n) верно только если n нечётное, то я автоматом знаю что A(0) неверно.

Здесь, конечно, существенно что "чётность" - эмпирически полезное понятие, которое умеет возникать в самых разных задачах. Никто не мешает мне изобрести свойство "ц-чётность", такое что 2, 4, 6, ... - ц-чётные, а 0 - нет, но засада в том, что на практике я намного чаще смогу получить результат вроде "A(n) верно только если n нечётное", чем "A(n) верно только если n не-ц-чётное".

Что значит правильное определение?

Значит "та расшифровка слова, которую использующая этот язык группа людей считывает по умолчанию". Да, это звучит размыто. Но практически, в отношении "чётного"/"нечётного" консенсус вполне определён, если кто-то честно не знает и хочет узнать, его узнать не так сложно (можно начать с Вики).

'0' - это символ. '1' - тоже символ. Мы можем договориться, что эти символы что-то выражают. Скажем, мы можем заметить за собой некоторую интуицию - что наборы из "трёх коров", "трёх карандашей" и "трёх камней" имеют что-то общее. Это что-то мы можем попытаться записать символом '3'.

После этого мы можем заметить, что (при некоторых условиях) возникают изоморфизмы между символами и внешними событиями. Например, если у меня было восемь кубиков, которые раскатились по полу, то я могу держать в голове "осталось 8", собирать кубики и изменять удерживаемое в голове: "осталось 7", "осталось 3", "остался 1". В этих правилах манипуляции символами практически полезно иметь символ '0' (в нашем сценарии, мысль "осталось 0" - это эмпирическое предсказание "теперь можно выдохнуть и заняться другими делами, не опасаясь наступить на кубик").

Символом '0' я при этом манипулирую по тем же правилам, что и символами '1', '3', '8'. Поэтому в той мере в которой какие-то наборы символов вообще полезно называть словами, полезно называть весь этот набор символов, включая '0', каким-то общим словом. Это может быть слово "числа", это может быть "неотрицательные целые", это может быть "мумзики" (хотя в последнем случае окружающие вас вряд ли поймут правильно).

Если пытаться построить стройную общую систему в том, как мы манипулируем этими символами, можно прийти к концепциям "множества" и "мощности". В этом случае есть набор мощностей множеств (кардинальных чисел), который включает "0" как мощность пустого множества.

А вот мне интересно, с современными выч.мощностями и всякими ИИ можно сделать какой-нибудь метод обфускации шифротекста?

Это называется "стеганография" и сколько-то таких приёмов уже придумано. Один из самых тупых - зашифрованное сообщение пишем в наименее значимые биты всех пикселей PNG с котиком, эффективность больше 12%. Мизер ловится частотным анализом.

Аналогично, для текста можно предварительно согласовать порождающую грамматику (в духе Reply -> "а он чё?" DialogueElement | "ну нифига себе" DialogueElement) и реконструировать применённые правила, превращая их в биты.

Есть и более тонкие моменты, связанные с тем что ключ короче инфы им с позволения сказать зашифрованной(а именно на этом хакнули Энигму, пользуясь компом слабее Ардуины)

Предлагаете всё шифровать одноразовым блокнотом?

Очевидная проверка (вполне возможно вы её уже учли): это с включением опции Settings -> Privacy -> Advanced -> Censorship Circumvention?

конечно Телега еще работает, но это вопрос времени.

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

Я думаю, что в основном люди спрашивают "что не анализируется ТСПУ", которое к СОРМ имеет мало отношения.

То есть, это два разных вопроса: что не может быть нарушено в автоматическом режиме и что не может быть прочитано post factum. Первое проще, из общий соображений ТСПУ не умеет в любой достаточно экзотический здесь и сейчас протокол.

Для текста вроде мессенджеров вагон и тележка, нетривиально как раз аудио/видео.

Signal определённо работает (по крайней мере у четырёх разных стационарных операторов, ожидаю что и у мобильных). Jami вроде работает, нужно больше тестов.

Я как раз тестирую Jami, он умеет в установку одного профиля на несколько устройств. (Пока не знаю насколько хорошо, просто знаю что это есть.)

Подразумеваемая полная форма этой фразы "все разумные люди же понимают... [а если вы не, то вы сами расписались что вы не разумный человек и вас можно игнорировать]".

Я непосредственно смотрел для 2-НДФЛ, но сильно ожидаю что с трудовой то же самое: вы можете получить PDF с приложенным отдельно файлом подписи .p7s. После чего его надо проверить. Adobe Acrobat этого, судя по всему, "из коробки" не умеет (может, можно научить). openssl умеет (openssl smime -verify -in doc_name_PDF.p7s -inform DER -content doc_name.pdf), только для этого а) HR должен уметь этим пользоваться и б) нужно добавить поддержку ГОСТ, ибо из дистрибутива по умолчанию её сколько-то лет назад выкинули.

Моё замечание к словоупотреблению: "противодействие" скорее подразумевает что вот было равновесие, было воздействие в сторону от этого равновесия, и как результат возникла сила, тянущая обратно (cf. "принцип Ле Шателье").

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

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

Вот статья, на мой взгляд хорошо суммирующая эту интуицию:

There’s a narrative I find kind of troubling, but that unfortunately seems to be growing more common in science. The core idea is that the mere existence of perverse incentives is a valid and sufficient reason to knowingly behave in an antisocial way, just as long as one first acknowledges the existence of those perverse incentives.

Я бы не использовал слова "противодействие" для таких мероприятий - оба усилия направлены на ухудшение ситуации по моей шкале. Eye for an eye leaves the world blind и всё такое.

Значит, оно должно возвращать не double, а что-то в духе Meters или Unit<Meters, double>.

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

Length переименовываем в ComputeLength, и затратность уже понятна по имени.

Не согласен. Вы решили одну проблему, но создали другую: теперь у объекта нет просто метода Length(), который в 90% случаев можно и нужно использовать как простой аксессор. Оговорка сделана оговоркой для оставшихся 10%.

А вообще что такое «затратный вызов»?

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

И, кстати, в LengthUnits такого комментария нет. Я так понимаю, оно не затратное? Или забыли написать?

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

Ничего не понял. Где этот случай торчит в API?

У данного типа - нигде (и нет, его индикатор в данном классе не является уместным), отсюда и предупреждение. Я расшифровываю "не понял" как "комментариев всё ещё недостаточно" (в данном случае недостающая часть отчасти покрывается комментарием к самому типу, а отчасти ожидается в голове программиста, как часть знания предметной области).

В плюсах лучше возвращать std::variant<Meters, ProjUnits>, например, и комментарий снова не нужен

Не очевидно что лучше. Потому что объектов прорва, а опция variant у них будет одна и та же. Её можно понять заранее во внешнем коде. (И это нелокальное условие, которое я не знаю как выразить типами.)

Вообще, кажется, заметная часть моего убеждения что комментарии нужны - что в проекте существуют нелокальные условия, которые влияют на локальные решения, поэтому их приходится выражать (напоминать) текстом. На это можно возразить, что одна из задач архитектора - превратить нелокальные условия в локальные. Но я сомневаюсь что даже в идеальном случае в сколько-нибудь сложной задаче это можно сделать на 100%.

Комментарии могут размечать логические блоки в пределах функции (а вынести их в отдельные именованные функции может быть плохой идеей из-за большого количества совместно используемых переменных). Более того, один из способов дизайна методов - вначале записать комментариями предполагаемую логику работы, а затем реализующий её код (приём взят из "Совершенного кода" Макконнелла).

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

class GeoLine {
public:
  //! \brief возвращает длину линии в _метрах_, потенциально затратный вызов
  //! \warning в случае местной системы координат длина будет в единицах проекции
  double Length(void) const;
  //! \brief возвращает длину линии в _единицах проекции_
  double LengthUnits(void) const;
}

Или содержат примеры использования:

// \example LOG_TIME(Info) foo(); //выведет в лог время выполнения foo()
#define LOG_TIME(Lv) if(log::impl::timer<Lv> t; t)

Комментарии могут содержать напоминания - знание, которое надо не забыть учесть при изменении кода (даже если прямо сейчас это знание не порождает какого-то решения, про которое надо объяснять "почему"):

int foo(double* xBegin, double* xEnd, const double* yBegin){
  // yBegin имеет право совпадать с xBegin
  //...
}

Наконец, исключение "чтобы объяснить почему сделано именно так, а не иначе" - очень резиновое. Ведь такие объяснения возможны в любой сколько-то нетривиальной функции:

/// Какой из этих трёх комментариев здесь уместнее? Или никакой?
// определяем, с какой стороны луча находится точка
// подставляем точку в уравнение прямой
// наша прямая aX+bY+c=0, подстановка (p.x,p.y) даёт знаковое расстояние
double dist = a*p.x + b*p.y + c;
if(dist > 0) { //справа по направлению обхода
  //...
} else {
  //...
}

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

Прагматически, решения всё равно надо принимать, и я считаю, что их качество в среднем всё ещё важно. Эмоционально, я хочу знать. Не "чтобы было легче", а потому что мне любопытно.

Информация

В рейтинге
3 486-й
Зарегистрирован
Активность