Проголосовал «свой вариант», поскольку конкретно эта статья не содержит ничего, кроме непонятного предупреждения о предстоящих изменениях, и изменения, которое надо будет внести в реестр для совместимости с legacy-клиентами. А вот как не быть legacy-клиентом, не написано. Не помешал бы пример кода на PHP, который сломается, и еще пример, как правильно.
Оригинал: This suggests the Fermat test for a prime: pick a random a∈{1,...,n-1} and see if an-1=1 (mod n). If not, then n must be composite.
Перевод: Отсюда мы можем вывести правило теста Ферма на проверку простоты числа: возьмем случайное a ∈ {1, ..., n-1} и проверим будет ли соблюдаться равенство an-1=1 (mod n). Если равенство не соблюдается, значит скорее всего n – составное.
Еще пример:
Оригинал: It turns out for any composite n, including Carmichael numbers, the probability
n passes the Miller-Rabin test is at most 1/4.
Перевод: Оказывается, что для любого составного n, включая числа Кармайкла, вероятность пройти тест Миллера-Рабина равна примерно 1/4.
Смысл искажен.
Ну и еще: не надо переводить статью из середины цикла статей как нечто изолированное. Как минимум, надо перетаскивать из предыдущих статей обозначения, не являющиеся общепринятыми или общеизвестными. В данном случае: Zk (множество целых чисел от 0 до k-1 включительно) и Zk* (множество целых чисел от 1 до k-1 включительно, взаимно простых с k).
Один важный шаг, отличающий конечную картинку от начальной, вообще не упомянут в тексте. Я говорю про детализацию фона: добавление гор, замену «плоского» неба неким подобием градиента.
Согласен насчет несуществования универсальных переводчиков. Считаю это частным случаем проблемы несуществования универсальных IT-специалистов. Но в контексте хабра никто не заставляет конкретного человека переводить конкретную статью. Пусть выбирает и переводит то, в чем на 100% разбирается, т.е. такую статью, где он мог бы (будь она академической) выступить в роли рецензента или оппонента. Тогда и перевод (а точнее — уже пересказ) будет близок к идеальному.
Термин «Пул блокировки» действительно существует, но в данном контексте неуместен (и, таким образом, является ошибочным переводом), поскольку относится совсем к другому объекту. А именно, в приведенном вами курсе он относится к теме блокировки одновременного доступа различных потоков или процессов к одному и тому же объекту. Из такого пула (в котором хранятся блокировки) процесс может взять блокировку, попользоваться и вернуть. Пул, таким образом, отслеживает, сколько блокировок осталось. См. habr.com/ru/company/postgrespro/blog/462877.
В данном же тексте «пул» относится не к блокировкам, а к энтропии, и пул ее накапливает. В пул энтропия примешивается извне, и из пула извлекаются биты. До недавнего времени таких пулов было два: блокирующий (который не дает извлекать биты, а зависает, т.е. блокирует исполнение, если их попытаться извлечь больше, чем поступило энтропии), и неблокирующий (который позволяет извлекать биты до бесконечности, перемешивая свое внутреннее состояние).
Тыкните мейнтейнеров ядра в Gentoo вот в этот коммит, он реализует логику, подобную haveged, в самом ядре. Входит в ядро 5.4, по идее должен быть бекпортирован в более ранние ядра.
1. Тег «Tutorial» абсолютно неуместен для перевода новостной статьи.
2. Качество перевода оставляет желать лучшего, даже начиная с заголовка. Искажен смысл.
Например, фраза «blocking pool» несколько раз (в том числе в заголовке) переведена как «пул блокировок». Правильный перевод — блокирующий пул.
А для DeepCode специально приложен скриншот срабатывания с неправильной рекомендацией? Ошибка тут не про escape, а про неправильный Content-Type для JSON. Или про ручной вызов json.dumps вместо использования JsonResponse. Если специально — почему на этом не акцентировано внимание?
А пусть достаются. На ворованных материалах ничего у них заработать не получится. Как минимум, у них будет три проблемы:
1. Устаревание учебных материалов.
2. Несогласие их преподавателя с методикой преподавания.
3. Привязка к заранее подготовленным нестандартным учебным стендам.
Если все еще не веришь — попробуй сам что-нибудь нестандартное своровать и посмотри, сколько раз скажешь «какой идиот это писал».
Так я уже попался при работе в NobleProg Ltd (фирма специализируется на IT-курсах, как онлайн, так и в офисе заказчика). CEO предложил мне прочитать курс по MySQL и дал свои слайды. Я согласился, но потом обнаружил кучу фактических ошибок и был вынужден отстаивать свое право проводить курс вообще без слайдов, так как на исправление не хватало времени.
6. Создайте заранее и поддерживайте (или по крайней мере не выбрасывайте) какой-нибудь не связанный ни с какой компанией проект, с гарантией попадающий в «серую» зону закона по причинам, не связанным с авторскими правами.
Тогда всяким иностранным работодателям, особо жадным до моих разработок в нерабочее время, этим проектом удается заткнуть рот. «Вы, скорее всего, не понимаете, что только что попросили. Вы же не хотите, чтобы вас там в США засудили за ЭТО?»
Разговоры о кеш-линиях и массивах prev и next не нужны. Хотя бы потому, что с массивами prev и next, как уже было отмечено выше, структура не имеет права называться двусвязным списком.
Есть более «чистое» решение. Вместо указателей prev и next хранить в каждом элементе списка указатели link1 и link2. Глобально на весь список (т.е. вместе с указателями end1 и end2 на голову и хвост) хранить один битовый флаг, который отвечает за интерпретацию, какой из указателей link1 и link2 играет роль prev, а какой — next. Он же определяет, какой из двух концов считать головой, а какой — хвостом. Тогда переворот будет состоять в перевороте этого флага.
Ну или как уже заметили, если у вас C++, то итераторы std::rbegin и std::rend уже делают что-то подобное.
Ну и стандартная задача на интервью — это все-таки разворот односвязного, а не двусвязного списка.
Зависит от автора на самом деле. В том виде СТО, что я слышал в универе, постулатом была независимость скорости света от выбора инерциальной системы отсчета. Тахионы обсуждались на полном серьезе как нечто не запрещенное, точнее, как то, что запрещено чем-то другим, что мы будем проходить позже, но не СТО.
И никогда не будет лишним проверить наличие set pfs в своих crypto-map. Чтобы смело сдать все известные ключи в компетентные органы и с чистой совестью сесть в аэроэкспресс.
Не поможет. Заставят пропатчить софт, чтобы сессионные ключи писались в файлик или отправлялись по UDP прямиком товарищу майору.
STUN дает только ответ на вопрос «какой у меня IP и порт», но от этого нет толку, если эта информация останется только у меня. Внешний сервер (ну или TOR hidden service, как уже предложили) нужен (в том числе при использовании WebRTC) как централизованная точка встречи для передачи этой информации другой стороне.
Один из примеров, где линейный поиск в отсортированном массиве оказался по факту в среднем быстрее бинарного, мне встретился в APE-кодеке, а именно, в диапазонном декодере (комментарий в строке 447 неверен). Фишка в том, что оценка «N/2 просмотренных элементов» для среднего времени выполнения линейного поиска основана на предположении, что входные данные таковы, что каждый из элементов массива имеет одинаковую вероятность быть найденным. В APE-кодеке это не так. Там массив из 22 элементов, но начальный нужен с вероятностью более 30%, а один из шести начальных — с вероятностью более 80%, поэтому замена линейного поиска на двоичный замедляет кодек.
Поскольку ничего цензурного сказать по делу не могу.
Оригинал: This suggests the Fermat test for a prime: pick a random a∈{1,...,n-1} and see if an-1=1 (mod n). If not, then n must be composite.
Перевод: Отсюда мы можем вывести правило теста Ферма на проверку простоты числа: возьмем случайное a ∈ {1, ..., n-1} и проверим будет ли соблюдаться равенство an-1=1 (mod n). Если равенство не соблюдается, значит скорее всего n – составное.
Еще пример:
Оригинал: It turns out for any composite n, including Carmichael numbers, the probability
n passes the Miller-Rabin test is at most 1/4.
Перевод: Оказывается, что для любого составного n, включая числа Кармайкла, вероятность пройти тест Миллера-Рабина равна примерно 1/4.
Смысл искажен.
Ну и еще: не надо переводить статью из середины цикла статей как нечто изолированное. Как минимум, надо перетаскивать из предыдущих статей обозначения, не являющиеся общепринятыми или общеизвестными. В данном случае: Zk (множество целых чисел от 0 до k-1 включительно) и Zk* (множество целых чисел от 1 до k-1 включительно, взаимно простых с k).
В данном же тексте «пул» относится не к блокировкам, а к энтропии, и пул ее накапливает. В пул энтропия примешивается извне, и из пула извлекаются биты. До недавнего времени таких пулов было два: блокирующий (который не дает извлекать биты, а зависает, т.е. блокирует исполнение, если их попытаться извлечь больше, чем поступило энтропии), и неблокирующий (который позволяет извлекать биты до бесконечности, перемешивая свое внутреннее состояние).
1. Тег «Tutorial» абсолютно неуместен для перевода новостной статьи.
2. Качество перевода оставляет желать лучшего, даже начиная с заголовка. Искажен смысл.
Например, фраза «blocking pool» несколько раз (в том числе в заголовке) переведена как «пул блокировок». Правильный перевод — блокирующий пул.
1. Устаревание учебных материалов.
2. Несогласие их преподавателя с методикой преподавания.
3. Привязка к заранее подготовленным нестандартным учебным стендам.
Если все еще не веришь — попробуй сам что-нибудь нестандартное своровать и посмотри, сколько раз скажешь «какой идиот это писал».
Так я уже попался при работе в NobleProg Ltd (фирма специализируется на IT-курсах, как онлайн, так и в офисе заказчика). CEO предложил мне прочитать курс по MySQL и дал свои слайды. Я согласился, но потом обнаружил кучу фактических ошибок и был вынужден отстаивать свое право проводить курс вообще без слайдов, так как на исправление не хватало времени.
Тогда всяким иностранным работодателям, особо жадным до моих разработок в нерабочее время, этим проектом удается заткнуть рот. «Вы, скорее всего, не понимаете, что только что попросили. Вы же не хотите, чтобы вас там в США засудили за ЭТО?»
Есть более «чистое» решение. Вместо указателей prev и next хранить в каждом элементе списка указатели link1 и link2. Глобально на весь список (т.е. вместе с указателями end1 и end2 на голову и хвост) хранить один битовый флаг, который отвечает за интерпретацию, какой из указателей link1 и link2 играет роль prev, а какой — next. Он же определяет, какой из двух концов считать головой, а какой — хвостом. Тогда переворот будет состоять в перевороте этого флага.
Ну или как уже заметили, если у вас C++, то итераторы std::rbegin и std::rend уже делают что-то подобное.
Ну и стандартная задача на интервью — это все-таки разворот односвязного, а не двусвязного списка.
Не поможет. Заставят пропатчить софт, чтобы сессионные ключи писались в файлик или отправлялись по UDP прямиком товарищу майору.