Не понял аналогии, возможно вы что-то путаете. В языке есть let mut/let и есть &mut/ & (ссылки). Если планируется менять переменную, то let mut нужно обязательно указывать, хотя компилятор и так мог бы разобраться. Эта пометка лишь помогает понять человеку, меняется ли значение. При желании, можно всем переменным ставить mut и ничего не сломается. С ссылками дела обстоят немного интереснее, потому что язык требуют от программиста соблюдать некоторые правила.
Они формулируются как-то так: на каждый объект может существовать либо единственная &mut ссылка, либо сколько угодно не-mut. Либо то, либо другое — одновременно нельзя.
Зачем это нужно? В основном, чтобы обеспечивать спокойствие программиста в многопоточных приложениях. С одной стороны, в программе ни один объект не изменяется одновременно из двух мест, а значит не бывает гонок. Вдобавок никто не может наблюдать промежуточное состояние, когда объект изменился только частично и находится в некорректном состоянии.
Эти ограничения могут казаться излишне жёсткими, но на самом деле всё не так плохо. Во-первых, очень часто не нужно менять существующие объекты, достаточно их только читать. Во-вторых, некоторые вещи, например подкючение к БД, можно использовать и по обычной ссылке, несмотря что происходят всякие INSERT INTO и состояние "меняется" — базы данных сами умеют разруливать гонки и им не нужна помощь от компилятора. В-третьих, всегда можно перенести проверки в runtime, используя Arc+Mutex. Они не позволят нарушить правила и сделать гонку данных, но при этом позволяют (плохо) писать практически как на обычных языках.
Простой пример без многопоточности: человек начал итерировать по стандартному списку (vector), для чего взял на него не-mut ссылку. В большинстве других языков, если вдруг кто-то добавит элемент в список, то произойдет либо UB, либо исключение, либо какая-то другая неожиданность. Но чтобы добавлять элементы в список необходимо иметь &mut ссылку на вектор, а компилятор этого не позволит, совсем. Вот таким нехитрым образом потенциальная ошибка нашлась сразу же.
Константы ≠ иммутабельные переменные. Константное значение может быть (и будет) вычислено в compile-time и жёстко зашито в бинарник. Если мы спрашиваем число у пользователя и кладём в переменную, то она не может быть const. Даже если никогда не собираемся её обновлять. Невозможно захардкодить значение, которого мы не знаем.
Так что кодеру приходится думать о том, что и где у нас мутирует и почему
Весь язык построен на borrowing rules, которые требуют, чтобы на один объект не было больше одной мутабельной ссылки в каждый момент времени. Это довольно строгое ограничение, которое компилятор должен суметь доказать в compile-time. Соответственно думать и помнить об этом приходится, таков язык. Он вообще не позиционируется как простой.
Должна быть поддержка utf8/utf16 с определением длины таких строк в символах.
Обычный вопрос для юникода — а что именно считать одним символом? Не все знакомы с особенностями юникода, поэтому в corner-cases ожидания людей частенько не совпадают с реальным поведением. Соответственно вылезают неожиданные баги, которые язык стремится предотвратить. Явное лучше неявного и всё такое. Однако для простых случев в стандартной библиотеки есть s.chars(), но у него в документации явно сказано, что он может возвращать не совсем что хотелось. Плюс в Книге целая глава посвящена аккуратной работе со строками.
Следующий момент — Rust позиционируется как производительный язык с zero-cost абстракциями. Вычислить длину UTF8 строки невозможно за O(1). Это совсем не совпадает с ожиданием, что длина любой коллекции вычисляется быстро. Поэтому предлагается писать s.chars().count() — явно создать итератор по символам, полностью его перебрать и вычислить длину.
Цена скачивания складывается из числа запросов и трафика. Но трафик в пределах одного региона бесплатный, так что в целом всё не так уж и страшно: GET идут по 0,4$ за миллион запросов, а PUT по 5$ за миллион.
Трейт GlobalAlloc находится в alloc, причем там же лежат паникующие реализации стандартных коллекций. Получается, чтобы убрать плохие коллекции, нужно делать свой alloc. А это может оказаться совсем не просто, поскольку Rust не очень здорово поддерживает такие вещи (вспоминается xargo)
Конкретно ВШЭ описывала ситуацию здесь: https://it.hse.ru/news/458263369.html
Если кратко, то "переговоры ведём, но с 6 апреля зум не будет работать, будем переходить к альтернативам"
Но если нужна функция, которая вернет 0, если ok; 1, если «user_from_banned_country»; 2, если " past_approval_date"; 3, если «eligible_month», то как ее назвать, чтобы идентификатор отображал всю функциональность?
По вкусу можно переместить Ok в enum (и не забыть его переименовать), либо же возвращать Option/Maybe, если язык это позволяет. Но суть в том, что сигнатура функции (тип возврата) содержит информацию о том, какие именно проверки делаются внутри. При добавлении новой надо будет обязательно обновить перечисление, а при удалении старого статический анализатор заругается, что вариант никогда не создаётся. Плюс если его таки удалить, то придется пересмотреть все места использования, иначе не скомпилируется.
GoodbyeDPI — программа для обхода DPI, которая в т.ч. умеет фрагментировать пакеты специальным образом. Провайдеры используют свою какую-то систему DPI, которая неправильно обрабатывает такие разбитые пакеты и поэтому блокировка не срабатывает (зависит от провайдера, конечно).
DPI, который использовался некоторыми провайдерами, не умел собирать фрагментированные TCP сегменты — блокировка не сработала.
Если соль будет у каждого пароля своя, то даже зная её, злоумышленнику придется для каждого пользователя начинать брутфорс с нуля. Вместо того, чтобы просто один раз рассчитать солёные хеши сразу для всех записей, придется заново перебирать весь словарь для каждой.
Как писал Кнут в TeXBook, "TEX (pronounced tecks) is the admirable Text EXecutive processor developed by Honeywell Information Systems", т.е. совсем другая штука.
Разумеется, сейчас мало кто перепутает, но всё-таки стоит учитывать рекомендации создателя TeX, особенно когда этому посвящена вся первая глава.
Небольшой отрывок
English words like ‘technology’ stem from a Greek root beginning with the letters τεχ...; and this same Greek word means art as well as technology. Hence the name TeX, which is an uppercase form of τεχ.
Insiders pronounce the χ of TeX as a Greek chi, not as an ‘x’, so that TeX rhymes with the word blecchhh. It’s the ‘ch’ sound in Scottish words like loch or German words like ach; it’s a Spanish ‘j’ and a Russian ‘kh’. When you say it correctly to your computer, the terminal may become slightly moist.
Не смотрели в сторону OpenCorpora для словаря (http://opencorpora.org/dict.php)? Там очень большое количество слов уже размечены и указаны их всевозможные формы.
Около полугода ещё будет From April 13, 2018 only existing users will be able to create short links <...> until March 30, 2019, when we will discontinue goo.gl.
У нас в городе (Троицк, новая Москва) та же история была. Разве что про ОГЭ ничего не говорили. Лично я сделал вот приложение для просмотра расписания школы: http://mgk.olimpiada.ru/work/2918/city/
В словаре есть такое значение:
"I wouldn’t mind (doing) something" used to say that you would like something.
То есть как раз "я был бы не против сделать что-то"
Это сокращение от "Симпл Сторадж Сервис", видимо.
Не понял аналогии, возможно вы что-то путаете. В языке есть
let mut
/let
и есть&mut
/&
(ссылки). Если планируется менять переменную, тоlet mut
нужно обязательно указывать, хотя компилятор и так мог бы разобраться. Эта пометка лишь помогает понять человеку, меняется ли значение. При желании, можно всем переменным ставить mut и ничего не сломается. С ссылками дела обстоят немного интереснее, потому что язык требуют от программиста соблюдать некоторые правила.Они формулируются как-то так: на каждый объект может существовать либо единственная &mut ссылка, либо сколько угодно не-mut. Либо то, либо другое — одновременно нельзя.
Зачем это нужно? В основном, чтобы обеспечивать спокойствие программиста в многопоточных приложениях. С одной стороны, в программе ни один объект не изменяется одновременно из двух мест, а значит не бывает гонок. Вдобавок никто не может наблюдать промежуточное состояние, когда объект изменился только частично и находится в некорректном состоянии.
Эти ограничения могут казаться излишне жёсткими, но на самом деле всё не так плохо. Во-первых, очень часто не нужно менять существующие объекты, достаточно их только читать. Во-вторых, некоторые вещи, например подкючение к БД, можно использовать и по обычной ссылке, несмотря что происходят всякие INSERT INTO и состояние "меняется" — базы данных сами умеют разруливать гонки и им не нужна помощь от компилятора. В-третьих, всегда можно перенести проверки в runtime, используя Arc+Mutex. Они не позволят нарушить правила и сделать гонку данных, но при этом позволяют (плохо) писать практически как на обычных языках.
Простой пример без многопоточности: человек начал итерировать по стандартному списку (vector), для чего взял на него не-mut ссылку. В большинстве других языков, если вдруг кто-то добавит элемент в список, то произойдет либо UB, либо исключение, либо какая-то другая неожиданность. Но чтобы добавлять элементы в список необходимо иметь &mut ссылку на вектор, а компилятор этого не позволит, совсем. Вот таким нехитрым образом потенциальная ошибка нашлась сразу же.
Константы ≠ иммутабельные переменные. Константное значение может быть (и будет) вычислено в compile-time и жёстко зашито в бинарник. Если мы спрашиваем число у пользователя и кладём в переменную, то она не может быть const. Даже если никогда не собираемся её обновлять. Невозможно захардкодить значение, которого мы не знаем.
Весь язык построен на borrowing rules, которые требуют, чтобы на один объект не было больше одной мутабельной ссылки в каждый момент времени. Это довольно строгое ограничение, которое компилятор должен суметь доказать в compile-time. Соответственно думать и помнить об этом приходится, таков язык. Он вообще не позиционируется как простой.
Обычный вопрос для юникода — а что именно считать одним символом? Не все знакомы с особенностями юникода, поэтому в corner-cases ожидания людей частенько не совпадают с реальным поведением. Соответственно вылезают неожиданные баги, которые язык стремится предотвратить. Явное лучше неявного и всё такое. Однако для простых случев в стандартной библиотеки есть
s.chars()
, но у него в документации явно сказано, что он может возвращать не совсем что хотелось. Плюс в Книге целая глава посвящена аккуратной работе со строками.Следующий момент — Rust позиционируется как производительный язык с zero-cost абстракциями. Вычислить длину UTF8 строки невозможно за O(1). Это совсем не совпадает с ожиданием, что длина любой коллекции вычисляется быстро. Поэтому предлагается писать
s.chars().count()
— явно создать итератор по символам, полностью его перебрать и вычислить длину.Цена скачивания складывается из числа запросов и трафика. Но трафик в пределах одного региона бесплатный, так что в целом всё не так уж и страшно: GET идут по 0,4$ за миллион запросов, а PUT по 5$ за миллион.
Трейт GlobalAlloc находится в alloc, причем там же лежат паникующие реализации стандартных коллекций. Получается, чтобы убрать плохие коллекции, нужно делать свой alloc. А это может оказаться совсем не просто, поскольку Rust не очень здорово поддерживает такие вещи (вспоминается xargo)
Конкретно ВШЭ описывала ситуацию здесь: https://it.hse.ru/news/458263369.html
Если кратко, то "переговоры ведём, но с 6 апреля зум не будет работать, будем переходить к альтернативам"
Псевдокод:
По вкусу можно переместить Ok в enum (и не забыть его переименовать), либо же возвращать Option/Maybe, если язык это позволяет. Но суть в том, что сигнатура функции (тип возврата) содержит информацию о том, какие именно проверки делаются внутри. При добавлении новой надо будет обязательно обновить перечисление, а при удалении старого статический анализатор заругается, что вариант никогда не создаётся. Плюс если его таки удалить, то придется пересмотреть все места использования, иначе не скомпилируется.
В случае с hCaptcha это уже не помогает, к сожалению. Раньше почти никогда не приходилось разгадывать картинки.
GoodbyeDPI — программа для обхода DPI, которая в т.ч. умеет фрагментировать пакеты специальным образом. Провайдеры используют свою какую-то систему DPI, которая неправильно обрабатывает такие разбитые пакеты и поэтому блокировка не срабатывает (зависит от провайдера, конечно).
Так будет правильнее
Если соль будет у каждого пароля своя, то даже зная её, злоумышленнику придется для каждого пользователя начинать брутфорс с нуля. Вместо того, чтобы просто один раз рассчитать солёные хеши сразу для всех записей, придется заново перебирать весь словарь для каждой.
Это не докапывание. Просто указали на небольшую ошибку, а после объяснили, что разница всё-таки есть.
И спасибо за статью, буду ждать следующих постов. Довольно интересная для меня серия получается.
Как писал Кнут в TeXBook, "TEX (pronounced tecks) is the admirable Text EXecutive processor developed by Honeywell Information Systems", т.е. совсем другая штука.
Разумеется, сейчас мало кто перепутает, но всё-таки стоит учитывать рекомендации создателя TeX, особенно когда этому посвящена вся первая глава.
English words like ‘technology’ stem from a Greek root beginning with the letters τεχ...; and this same Greek word means art as well as technology. Hence the name TeX, which is an uppercase form of τεχ.
Insiders pronounce the χ of TeX as a Greek chi, not as an ‘x’, so that TeX rhymes with the word blecchhh. It’s the ‘ch’ sound in Scottish words like loch or German words like ach; it’s a Spanish ‘j’ and a Russian ‘kh’. When you say it correctly to your computer, the terminal may become slightly moist.
Не смотрели в сторону OpenCorpora для словаря (http://opencorpora.org/dict.php)? Там очень большое количество слов уже размечены и указаны их всевозможные формы.
Предположу, что это moonwalk.
http://docs.moonwalk.cc, http://moonwalk.co/the_api
Около полугода ещё будет
From April 13, 2018 only existing users will be able to create short links <...> until March 30, 2019, when we will discontinue goo.gl.
В данном случае это что-то подобное Cipher Block Chaining (CBC): https://ru.wikipedia.org/wiki/Режим_шифрования#Cipher_Block_Chaining_(CBC)
Ещё можно заменить
На просто
У нас в городе (Троицк, новая Москва) та же история была. Разве что про ОГЭ ничего не говорили. Лично я сделал вот приложение для просмотра расписания школы: http://mgk.olimpiada.ru/work/2918/city/
del
В словаре есть такое значение:
"I wouldn’t mind (doing) something" used to say that you would like something.
То есть как раз "я был бы не против сделать что-то"