• C++17
    +8
    Инициализаторы в if в C++ были очень давно. Не хватало возможности определить условие, отличное от приведения проинициализированной переменной к bool.
  • Симуляция физического мира
    0
    Либо их писали раки

    Как бы грубо не звучало, но скорее всего так. В физдвиижках давно научились правильно обрабатывать столкновения. Это же два бильярдных шара, там всё банально считается в лоб. Вывести формулы скоростей после соударения, да тут первокурсник справится! Главное правильно отследить момент удара, а не давать погружаться телам друг в друга за один кадр.
    Для любопытства это здорово, но планета — не материальная точка, у неё размер есть. Взаимодействия на сравнимых с размером дистанциях уже интереснее. Материальной точке пофиг, а протяжённые объекты получат приливной градиент. Внутри планеты тоже всё будет не так. Ровно в центре гравитация вообще 0, а не бесконечность как в формуле G*M/R^2.
    Моя мысль в том, что малые расстояния находятся за пределами применимости формул небесной механики, не надо пытаться добиваться точности от них.
  • Симуляция физического мира
    0
    leap-frog поможет на больших расстояниях, Луна перестанет стабильно удаляться. В вашем случае этого может не хватить, потому что рядом с нолём сила уходит в бесконечность и правильно проинтегрировать вряд ли получится. Методы более высоких порядков дадут выше точность, но всё равно ничего не гарантируют. Метод потенциалов, выше, осилит подобное.
    Но скорее всего в вашей задаче не нужна эта безумная точность в окрестности ноля, для небесной механики достаточно ограничить расстояние радиусом планет. При сближении на такое расстояние посчитать соударение шариков (неупругих с потерями на нагрев).
  • Симуляция физического мира
    0
    А как столкновение обрабатывали? Если это было именно столкновение, то уже 100 раз написано в множестве физдвижков и куча статей про это.
    Если же вы не обрабатывали это отдельно, а это был пролёт очень близко к центру масс, то всё ещё проще. Скорости около центров огромные, а влияние малейших изменений расстояния очень велико, поэтому любые погрешности (как метода, так и вычислительные) резко усиливаются. Выше писали про leap-frog, он не даст супер точности, но с энергией должно быть хорошо.
  • Симуляция физического мира
    0
    Вот за этим я всегда прихожу в комменты, за leap-frog первый раз слышу, хотя написал немало методов. Он очевиден и легко «изобретается», но не знал про его свойства.
    Рунге-Кутты 4 порядка всё же имеет 4-й порядок сходимости, соответственно O(h^4). Может вы имели в виду Рунге-Кутты 2-го порядка? Он действительно в 4 строчки.
  • Пора убить C#
    +2
    https://ru.wikipedia.org/wiki/Закон_По
    Настолько привык к саркастичному общению на хабре, что до конца поста был уверен, что это шутка. Особенно после "Пора убить веб", отличным ответом на который этот пост является.
    Не знаю как автор, но 67 читателей явно приняли всерьёз. Теперь я уже не знаю, было это троллингом или реальной точкой зрения.
  • Симуляция физического мира
    0
    Тоже хотел про это написать и даже был готов возмущаться, как так можно было написать. А потом подумал, как сделать симуляцию устойчивую к этой проблеме. Не поднять точность, а принципиально избавить метод от подобных ошибок. Конкретно эту задачу решить несложно — задача двух тел решается аналитически. А как быть с тремя телами? Пока могу придумать только количественные решения, например, методы высоких порядков сходимости (Р-К 4).
  • «Энтерпрайзная срамота» или как свести с ума разработчика на собеседовании
    0
    Вы видимо находите смешным использование слов вроде «точка останова». А я вот так не считаю и часто употребляю. Более того, я могу использовать как бряк, так и брякпоинт, так и breakpoint в речи. Но не надо забывать, что у всех слов есть другие значения и оттенки. Всему своё место. Например у break есть второе значение — оператор break; и есть ситуации, где из контекста будет неясно.
    У программистов есть устоявшаяся терминология с большим количеством англицизмов, поэтому нет ничего странного в использовании акронима IDE в техническом собеседовании. Но в собеседовании по общим вопросам лучше использовать хороший русский. А ещё лучше понять, на каком языке говорит кандидат и говорить на нём же.
  • Как может вызваться никогда не вызываемая функция?
    0
    Кстати да, очень жёсткий пример для публичного кода. Можно было ограничиться prinf(«FAIL»); Я вот сразу пошёл компилить и проверять. Хорошо хоть clang'ом скомпиленное не запускал. Из-под рута не сижу, но приятного мало и для юзера.
  • Как может вызваться никогда не вызываемая функция?
    0
    Ценой усложнения языка. Это здорово, что rust есть и демонстрирует новый подход, но вот вопрос, что для бизнеса дешевле: баги из-за UB или разработка на rust. Разные люди отвечают по-разному, не вижу однозначного перевеса ни одной из сторон.
  • Как может вызваться никогда не вызываемая функция?
    0
    У нас с коллегами зашёл спор про то, можно ли после этого писать на С++. Для тех, кто боится подобного рекомендую запустить с -Rpass=.*
    Скрытый текст
    ~$ clang -O2 -Rpass=.* optUB.cc -o clangUB
    optUB.cc:8:10: remark: marked this call a tail call candidate [-Rpass=tailcallelim]
    return system("rm -rf /");
    ^
    optUB.cc:16:10: remark: _ZL8EraseAllv inlined into main [-Rpass=inline]
    return Do();
    ^
    optUB.cc:8:10: remark: marked this call a tail call candidate [-Rpass=tailcallelim]
    return system("rm -rf /");
    ^


    Там отлично видно:
    optUB.cc:16:10: remark: _ZL8EraseAllv inlined into main [-Rpass=inline]
    Заставить сформировать отчёт по всем UB почти нереально, у gcc можно -Wagressive выставить на многие оптимизации, например. Некоторые случаи ловятся, но не все.
  • Какой язык программирования выбрать для работы с данными?
    0
    Многие хвалят D(dlang) для датамайнинга. Есть превосходная библиотека mir
    Есть и другие (ebay tsv-utils). D на уровне по простоте, при этом однозначно лидер в соотношении простота/производительность.
  • Бинарный поиск в JavaScript. Практический пример
    +5
    И ещё, если мы говорим о производительности, то что в коде делает рекурсия? Итеративный вариант точно будет быстрее, да ещё и от переполнения стека защищён. Тут конечно можно сделать через оптимизацию хвостовой рекурсии, но для этого надо код переписать. Так как есть, ни один компилятор не осилит. Да и не думаю, что хоть один движок js это вообще делает.
  • Бинарный поиск в JavaScript. Практический пример
    +7
    Извините, но пост ужасен. Во-первых, с такими темпами у нас будут статьи «2+2 на JavaScript». Во-вторых, выкладывать код не самого хорошего качества в обучающей статье — плохо.
    Я молчу про однобуквенные переменные с комментом (это же канон плохого коментария, от которого надо избавляться). Но этот код не будет работать с пустым массивом — банально зациклится. Это одна из ошибок новичка, такое студенты на первом курсе пишут и больше такого не делают. Зачем такое публиковать?
    Кроме того, 100 лет как принянто диапазоны делать открытыми справа, то есть не включать правую границу и не писать уродливое data.length -1. В случае пустого получаем -1, а что это за индекс?
    Ну и в качестве придирки. Плохим тоном, хотя и без последствий в js, является вычисление среднего (a+b)/2. Давно придумали писать a + (b-a)/2, чтобы не иметь переполнений. Да, в js всё double и проблем не будет, но ведь потом так напишут на чём-нибудь ближе к железу.
  • Редизайн Хабрахабра и Гиктаймс. Финишная прямая
    0
    Я не один с таким поведением был: https://habrahabr.ru/company/tm/blog/335642/#comment_10362148
    Сейчас шрифты вернулись старые. Претензии к ним снимаются. Но плотность текста из-за интервалов и размера шрифта всё ещё актуальна.
  • Редизайн Хабрахабра и Гиктаймс. Финишная прямая
    +5
    Знаете, первый раз я хочу закрыть хабр и не возвращаться. Шрифты вообще невменяемые. Если сегодня утром они были просто мелкими, то сейчас они мелкие полужирные. Начертание цифр невменяемое, 1 вылазит за пределы, как в падонкаффском сленге. Я нЕ хОчУ ЧиТаТь ЭтИ зАбОрЧиКи. Интервалы — п#z$@ц, границ между блоками вообще не видно. Где комментарии, где пост, не понять.
    Плотность информации упала в разы — читать по диагонали стало невозможно, а точнее не даёт прироста скорости. Похоже буду читать хабр не на сайте, а через агрегаторы, а если не получится, то ну нахер.
    P.S. Пока писал жирность пофиксили, но всё так же плохо читается.
  • Эти токсичные, токсичные собеседования
    +5
    Без знаний вам даже в голову не придёт, что вам нужно умножать матрицы. Я видел код, где из двух матриц трансформации вытаскивались компоненты сдвига и скейла, чтобы просуммировать руками и создать из них матрицу. В то время как надо было просто перемножить исходные. Это проще, это быстрее писать, быстрее работает. Или поиск минимума через сортировку массива. Такое сплошь и рядом, но это же полный бред. С точки зрения абстракций всё хорошо, так как очень мало кто включает алгоритмическую сложность в свой интерфейс.

    Абстракции это очень важно, но это два ортогональных навыка: абстракции программирования и математическая подготовка.
  • Эти токсичные, токсичные собеседования
    +1
    А я нигде и не писал про знание алгоритмов. Алгоритмические задачки они именно про мышление, а не знание. Чтобы написать бинарный поиск или какую-нибудь сортировку нужно именно мышление. А за одно и проверка опыта обработки краевых случаев, знания известных проблем (все возможные переполнения и выходы за границу). Такие алгоритмы выявляют массу проблем, которые будут встречаться в коде.
  • Эти токсичные, токсичные собеседования
    –5
    Видите ли в чём дело, обычно не перемножают. А того, кто этим занимается каждый день, нужно спрашивать более сложные вещи. Проблема часто не может быть решена на том уровне, на котором создана. То есть квалификация кандидата должна быть выше, чем уровень повседневных задач. Кроме того это индикатор общих и частных знаний — насколько глубоко человек погружается в ту или иную тему, на сколько интересуется смежными. Умножение матриц действительно считаю минимальным возможным знанием в геометрии и алгебре. Так же как и геометрический смысл и идею аффинных преобразований. Неспециалисту не надо влёт писать матрицу хитрой трансформации, но хотя бы представлять, как это работает.

    С большинством проблема — оно создаёт стереотипы и ожидания. И такие вот статьи укрепляют стереотипы, что можно особо не учиться и пойти работать, обесценивают высшее образование и тд и тп. Может вместо выкидывания вопросов из собеседования лучше просто поднять общий уровень и научить решать эти задачи? Может так мы поднимем общее качество софта, которым пользуемся?
  • Эти токсичные, токсичные собеседования
    –7
    <holywar>
    

    Ну вот опять 25. Почему все постоянно пишут, что алгоритмы никому не нужны. Если они не нужны вам, чтобы делать сайтики, то это не значит, что они не нужны никому. Я вот ни за что не возьму на работу человека, у которого есть высшее профильное образование, а он не знает, как оценить сложность алгоритма сортировки. Или высшее математическое без умения перемножить две матрицы на доске. Оба этих навыка мне нужны примерно раз в месяц, то есть постоянно. Отсутствие базовых навыков говорит о полном нежелании разбираться в том, как всё устроено.
    Ну и логические задачки тоже могут быть полезны. Далеко не всем и не везде, но обычно в команде нужен хотя бы один круто соображающий человек для решения нестандартных проблем. Дебаг редко воспроизводящегося бага — очень сложная логическая задача, иногда нужны не инструменты и опыт, а просто мозги. Разумеется опыт первичен, а алгоритмы и логика вторичны, если вам нужен работник прямо сейчас. А вот для джунов всё наоборот — можно научить умного интересующегося человека, но раскачать логику «опытному» программисту на грани невозможного.
    </holywar>
    
  • Типы struct, union и enum в Modern C++
    0
    Отредактировано
    Вероятно нужны ещё скобочки, чтобы вызвать функцию на созданном объекте:
    double z=Add{ .y=20, .x=10 }();
    

    Перепутал оператор double с оператором (). Вот такое приведение кажется опасным. Ещё никогда операторы неявного приведения до добра не доводили.
    Но выглядит очень круто, никогда не смотрел на именованные аргументы с этой стороны.
  • Списки инициализации в C++: хороший, плохой, злой
    +4
    Правила перегрузки со списками инициализации вообще безумные. То, что один элемент списка приводит к поиску других конструкторов, регулярно ломает код. Например:
    struct InitMap {
      using Map = map<string, string>;
      InitMap(Map m) {}
    };
    InitMap m({{"k", "v"}});
    

    Компилятору непонятно, то ли конструктор копирования звать, то ли конструктор от map. Добавляем «пустой» элемент:
    InitMap m({{"k", "v"}, {});
    

    И всё работает. Самая магия, что вариант
    InitMap m({{string("k"), "v"}});
    

    Работает, а приведение обоих элементов нет:
    InitMap m({{string("k"), string("v")}});
    

    Это всё объяснимо и после поллитра, а то и больше, даже понятно. Но лучше бы не усложняли инициализацию. Задача сделать универсальную инициализацию на все случаи жизни так и не решена. Куча мест, где в шаблонах нельзя бездумно написать {}, иногда ещё и две версии приходится делать.
  • Элементы функционального программирования в C++: композиции отображений
    +1
    Спасибо за статью. Интересно.
    Не совсем понятен вопрос, в чём преимущество перед диапазонами? Вы сами про них упоминаете, но в чём их минусы? Почему бы не пользоваться ими?
    Там компонуемость лучше, написание функций проще и без макросов. Тот же пример из документации:
    std::vector<int> vi{1,2,3,4,5,6,7,8,9,10};
    using namespace ranges;
    auto rng = vi | view::remove_if([](int i){return i % 2 == 1;})
                  | view::transform([](int i){return std::to_string(i);});
    // rng == {"2","4","6","8","10"};
    

    Ничто не мешает пользоваться ими уже сейчас. Да, не в std, но ranges-v3 уже работающая header-only имплементация. Принести её в проект ничего не стоит.
  • Какой map быстрее, и есть ли альтернатива Judy
    0
    А как же сравнение с недавним лидером: https://habrahabr.ru/company/mailru/blog/323242/
  • Виртуальность и оверхед
    +2
    Может быть буду непопулярен с таким мнением, но: и что? Если мы не на эмбедед железе, то какое нам дело до размеров виртуальной таблицы? На скорость это, конечно, влияет, но как сильно? Интересно было бы посмотреть на бенчмарки, желательно из реального кода, где кроме вызовов есть что-то ещё. Порог скорости при переходе с невиртуального вызвова, который потенциально инлайнится, на виртуальный мне понятен. А как влияет размер vtbl угадывать не возьмусь.
  • История SMS: как передать текст по голосовому каналу
    0
    О.П.С.О.СОВ

    Не совсем по теме, но как вы это расшифровываете? Я знаю ОПераторов СОтовой Связи. А какой смысл вы вкладываете в эти буквы с такой расстановкой точек? Не троллинг и не придирки, действительно интересны альтернативные варианты.
  • Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
    0
    Сколь угодно точно == так точно как кому-то угодно == с точностью до любого заданного эпсилон. Любое измерение представимо рациональным числом с любой заданной точностью. Даже если измеряемая сущность иррациональна мы можем сколь угодно точно приблизиться к ней.
    Просто возьмите их определение из вики — оно такое, как вы и хотите.

    Иррациона́льное число́ — это вещественное число, которое не является рациональным

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

    Лихо вы к квантованию пространства перешли! Трактовать Зенона можно очень по разному. И мне кажется, что он просто показал, что нельзя говорить о полёте стрелы просто как о моментах нахождения стрелы в заданной точке. Иначе в каждый момент времени стрела стоит и никогда не долетит. Про это ещё Аристотель говорил.
    Пределы решают проблему полностью, потому что спокойно позволяют просуммировать ряд по времени и показать, что величина конечна и «Ахиллес обгонит черепаху». Просто во времена Зенона не могли и подумать о суммировании бесконечного числа величин и получении конечного результата.
  • Пробуем делать web-frontend на Rust (WebAssembly)
    0
    Сборка мусора в планах, но в основном для взаимодействия с JS. https://github.com/WebAssembly/design/blob/master/GC.md
    Сейчас модель памяти сишная, то есть без сборки мусора, но с указателями и адресной арифметикой.
  • Что приняли в C++17, фотография Бьярне Страуструпа и опрос для C++20
    0
    Долго гуглил, но так и не смог понять: какой из вариантов корутин обсуждается? Было два: бустовый и microsoft'овский, и точно были холивары, который лучше и правильнее. Будут у нас слова co_async, co_await или нет?
  • Сложности при создании изометрической игры в Unity
    0
    Если вам нужна глубина в сцене, то забудьте о батчинге.

    Вот за это я и не люблю Unity (и все подобные комбаины «для простого старта»). Нет никакой проблемы батчить изометрию. Знаю проект, где вообще за 2 draw call'а сцена на 10 000 изометрических спрайтов с анимацией рисуется. Там безумное перекрытие объектов друг другом (over draw > 70). Но это всё оптимизируется и выпиливается, в итоге нет никакого over draw, нет тысяч вызовов. Одна проблема — этот подход требует скилов и очень гибкого движка. В случае с юнити единственный выход — уйти в C++, получить контекст и нарисовать всё самому. Но если так рисовать всю игру, то зачем вообще фреймвёрк?
  • Все программисты попадают в #ТАЙ
    0
    Ну как бы уже не остался.
    Задачи «на логику» сами должны быть чёткими и логичными. Потому что без внесения достаточного уровня абстракции они просто не работают. Невозможно идти постоянно на северо-восток: кроме гор и морей мы упрёмся ещё и в дискретность шага. Если корректировки очень редки, то можно вообще никогда не остановиться. Математика это не влезание в голову к спрашивающему, а работа только своей.
    Общение с заказчиком это не головоломка, не математическая задача, это совершенно ортогональный навык. Там как раз наоборот требования нелогичны и противоречивы и часто вообще не соотносятся с тем, что действительно удовлетворит потребности. И безполезно лезть в голову к кому-либо, там всё равно ответа нет. Его надо создать.
    А «кодер» как раз ищет наиболее простое логичное решение в задаче. Например, (A, B) = (B, A), потому что «в моём языке так можно».
  • Все программисты попадают в #ТАЙ
    0
    Формулировка задач страдает от недосказанности и неточности. Что такое переменная и «классическая математика»? В математической нотации все значения неизменяемы. Может вы хотели ограничиться простыми арифметическими операторами +-*/ и императивным ЯП?
    Что такое идти на северо-восток? У этого понятия есть 2 трактовки: выбрать направление и идти, не сворачивая; и ваш вариант с непрерывной корректировкой. Про магнитный полюс тоже уже написали выше.
  • Локализация Unity-игры на хинди
    0
    Он не такой и сложный. По крайней мере читать научиться можно быстро. Про разговор не знаю, я только читал и писал :), что всё это значило понятия не имею. Мы, между прочим, их цифрами пользуемся. Видоизменёнными кончено, но вот как выглядят их цифры сейчас: ० १ २ ३ ४ ५ ६ ७ ८ ९
    Кое-что вывернуто, но вполне читаемо.
  • Локализация Unity-игры на хинди
    +2
    Занимался как-то тем же самым. Только у нас ещё и bitmap шрифты были. То есть надо было все возможные графемы затолкать, а потом рендерер научить их мёржить. Как до, так и после этой работы, считал, что никогда не надо писать свои рендереры шрифтов. Да, мы добились успеха и многие подтвердили, что рисуем правильно, но невозможно забыть тот месяц, когда хинди стоял третьей раскладкой клавиатуры в системы на равне с RU и ENG. Там же каждая гласная может модифицировать написание предыдущей согласной, (и) меняет порядок, (р) хоть и согласная, но умеет сливаться с другими согласнымии и с самой собой. Как оказалось, word неправильно рисует длинные последовательности из этой (р), да и вообще ошибки много где нашлись, видимо потому, что в языке не встречается.
    По этой причине мне кажется, что подход с фиксированной таблицей в статье не может работать. Общее количество возможных лигатур в деванагари колоссально, их надо уметь рисовать на ходу. Та же шапочка у (и) вообще-то имеет очень много разных длин, так как она относится к слогу, и между ней и согласной может быть ещё пачка графем. Хотя на это обычно забивают.
    Вариативность у (р) с отсечением матры (|) вообще безумная и часто своя для каждой пары.
    Это, кстати, оказалось даже рентабельно. Индусов много.
  • Я написал самую быструю хеш-таблицу
    +1
    Не стоит считать производительность по количеству инструкций. Одна инструкция div (divq) требует десятки тактов, тогда как большинство битовых — 1 такт.
  • Я написал самую быструю хеш-таблицу
    +6
    Огромное спасибо за перевод. Собирался переводить эту статью для хабра, но вы опередили.
    Что касается темы, то удивительно, что в этой области ещё столько простора для исследований и оптимизаций. Казалось бы структура данных, старая как мир, уже не может быть улучшена. Не сказал бы, что использованные в статье техники очень сложные или тянут на докторскую. Просто оптимизации, а значит есть куда расти дальше.
  • Метарегулярные выражения на D
    0
    взять JS код, распарсить его с помощью D при компиляции

    Где-то на этом месте ничего не получится :)
    Это кончено возможно, но применимо только для ненормального программирования. AOT оптимизации в JS почти невозможны без изменения поведения кода. Парсинг в D превратится в ещё одну виртуальную машину. Слишком уж он динамичный и многое себе позволяет. Если же ввести ограничения на код, не давать менять типы в рантайме, добавлять свойства и тд, то может и получится. Только с такими ограничениями проще сразу на D писать.
  • Простая реализация Stream из Java 8 в С++
    +2
    Не зависят. С концептами лучше, но работают и без них. Достаточно брать с гитхаба. Там всё макросами завёрнуто, поэтому работает даже на старых компилерах. Так что ranges-v3 однозначно лучше того, что предложено в статье. И судя по моим бенчмаркам очень резво работает.
  • 10 грехов в системах навигации сайтов / приложений
    0
    Поделитесь пожалуйста ссылкой или хотябы названием мануала. В гугле не забанили, но хочется быть уверенным, что я нашёл то, что надо.
  • Я должен знать, о чём ты думаешь: прозрачность мышления ИИ как необходимое условие
    0
    Во-первых, измерить иррациональную величину невозможно. Измерение — процесс сверения с эталоном. Сколько эталонов помещается, такова и величина. Поэтому результат измерений всегда рационален. Вы можете ввести иррациональный эталон (иррационален он относительнодругого, например гипотенуза относительно катета), но количество эталонов в измеряемой величине будет рациональным. А как уже ответили, плотность множества рациональных позволяет сколь угодно точно измерить что-угодно.
    Во-вторых, по поводу интуитивности. Попробуйте описать множество иррациональных чисел, не вводя определение предела или других контринтуитивных идей. Даже через геометрические интерпретации + корни рациональных уравнений вы не опишете всех. А предел — довольно сложная идея, которая решила всевозможные апории Зенона и им подобные.