Search
Write a publication
Pull to refresh
4
0.1
Илья @Sulerad

User

Send message

Не понял аналогии, возможно вы что-то путаете. В языке есть 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», то как ее назвать, чтобы идентификатор отображал всю функциональность?

Псевдокод:


enum RejectionType {
    UserBannedFromCountry = 1,
    PastApprovalDate = 2
    EligibleMonth = 3
}

RejectionType? check_rejected(...) {
    if (not rejected) return null;
    ...
}

По вкусу можно переместить Ok в enum (и не забыть его переименовать), либо же возвращать Option/Maybe, если язык это позволяет. Но суть в том, что сигнатура функции (тип возврата) содержит информацию о том, какие именно проверки делаются внутри. При добавлении новой надо будет обязательно обновить перечисление, а при удалении старого статический анализатор заругается, что вариант никогда не создаётся. Плюс если его таки удалить, то придется пересмотреть все места использования, иначе не скомпилируется.

В случае с hCaptcha это уже не помогает, к сожалению. Раньше почти никогда не приходилось разгадывать картинки.

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.

Ещё можно заменить


flag_okay = False
if width == _SIZE_WIDTH and height == _SIZE_HEIGHT:
    flag_okay = True

if not flag_okay:

На просто


if  width != _SIZE_WIDTH or height != _SIZE_HEIGHT:

У нас в городе (Троицк, новая Москва) та же история была. Разве что про ОГЭ ничего не говорили. Лично я сделал вот приложение для просмотра расписания школы: http://mgk.olimpiada.ru/work/2918/city/

В словаре есть такое значение:
"I wouldn’t mind (doing) something" used to say that you would like something.
То есть как раз "я был бы не против сделать что-то"

Information

Rating
3,056-th
Location
Москва, Москва и Московская обл., Россия
Registered
Activity