• +1
    Действительно, спутал. Спасибо за исправление.
    Исследование асинхронной схемы в ModelSim
  • +2
    Я упорно не понимаю, почему вы называете себя первым, если тема асинхронной логики исследуется с 60х годов? И в Союзе и за рубежом. Одни работы Варшавского чего стоят. Одно время, в университете Чибы в Японии работала группа наших ученых, которая занималась именно вопросами асинхронной логики.
    Исследование асинхронной схемы в ModelSim
  • 0
    Да, если есть желание разобраться подробнее именно с точки зрения системы типов, могу посоветовать научную работу по формальному доказательству корректности языка и его стандартной библиотеки: RustBelt: Securing the Foundations of the Rust Programming Language.
    Специально для Хабра: интервью с Аланом Кеем
  • 0
    Не забывайте, что язык позиционируется как системный. Соответственно, требования к контролю и управлению памятью совершенно другие, чем в эрланге или хаскеле.

    В целом не совсем понятно, почему не ограничиться lexical scope (со всеми традиционными батарейками в виде HOF и так далее) и агентами (как в Oz, например, ну или даже как в эрланге), или вообще пойти по пути хаскеля (раз уж и так что-то типа GADT и pattern matching уже есть). Видимо, крестовые корни не дают возможности делать просто (для программиста), а не сложно.

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

    С точки зрения теории типов, система типов раста — это что-то вроде системы F, расширенной понятиями лайфтаймов. Операторы над типами, насколько я знаю, сейчас не поддерживаются (хотя сейчас идет активная работа над специализацией и полиморфизмом высших порядков).

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

    Это требование налагает определенные ограничения и на программиста и на реализацию языка.

    Наконец, все это является довеском к основным задачам языка: memory safety и fearless concurrency. Вы утверждаете, что в этом ничего особенного. Назовите мне пожалуйста еще один императивный язык программирования, который статически на этапе компиляции контролирует отсутствие в программе состояния гонок и не допускает существования тухлых указателей. Притом, чтобы все это происходило без GC и VM.
    Специально для Хабра: интервью с Аланом Кеем
  • 0
    На эти вопросы хорошо отвечает пост одного из идеологов языка: Fearless Concurrency.
    Специально для Хабра: интервью с Аланом Кеем
  • 0
    Кому интересна ZFS могу посоветовать разрабатываемую в рамках проекта Redox файловую систему TFS.

    Набор заявленных фич очень впечатляет. Хотя, конечно, до релиза еще далеко.
    ZFS — лучшая файловая система (пока)
  • +1
    В контексте сравнения динамических и статических языков Алан как-то говорил, что все известные ему системы типов невообразимо отвратительны. Если я правильно помню, он не против самой концепции системы типов, но ему не нравятся имеющиеся реализации.

    Интересно услышать его мнение относительно системы типов языка Rust. Именно в контексте проблем с «плохими» языками и многопоточными системами. С моей точки зрения, это единственный на данный момент язык, который пытается решать проблему параллельного программирования на фундаментальном уровне.
    Специально для Хабра: интервью с Аланом Кеем
  • +1
    Например вот таквот так).

    А видя все это, люди сами подтягиваются.
    Выпуск Rust 1.19
  • +1
    Я последнее время использую плагин от Калиты. В чем отличия и имеет ли смысл перелезать на официальный вариант?
    Выпуск Rust 1.19
  • +4
    Интересно, а на возврат НДС таким образом подать можно будет? В идеале вообще автоматом.
    Три дня как все кассы в стране должны стать онлайн (на самом деле нет)
  • 0
    Maidsafe? Да нет, буквально на той неделе с разработчиками общался.
    Блокчейн + распределённое хранилище = Sia
  • 0
    Просто из описания у меня сложилось впечатление, чтобы начать работу нужно сначала закинуть средства, потом еще шуровать кошельками и т.д.
    Блокчейн + распределённое хранилище = Sia
  • +1
    Скажите, а в чем принципиальное отличие от других аналогов, например maidsafe? Ну кроме того, что Sia гораздо менее удобна и понятна конечному пользователю.

    Особенно в плане «запустил — работает».
    Блокчейн + распределённое хранилище = Sia
  • 0
    А еще мы нарисуем картинку с шестеренкой, которая не сможет крутиться, но этого тоже никто не заметит :)
    Генетический советник для торговли опционами
  • +2
    Так там наоборот из 30 получится 3. Реализация трейтов преобразования поможет автоматически захватывать ошибки разных типов вообще без map_err(). Просто пишете ?, а оно само разберется.
    Выпуск Rust 1.17
  • +4
    Добавлю еще немного про обработку ошибок. В книге хорошо описано, как правильно работать с ошибками. Там разобраны все типичные ситуации: как создавать собственный тип ошибок, как пробрасывать ошибки наверх и т.д.

    При чтении можно мысленно заменять try!() на ?, смысл будет тот же.
    Выпуск Rust 1.17
  • +1
    О господи, ну давайте напишу 192КГц. Неужели вы не видите, что суть того комментария не в цифрах?
    MP3 окончательно переходит в общественное достояние
  • +2
    Спасибо за ГОСТ, теперь понятно. А на товарища выше не обращайте внимания, у него все комментарии как на подбор, один лучше другого. Потрясающе осмысленная деятельность, в общем.
    MP3 окончательно переходит в общественное достояние
  • 0
    Вы что-то все в кучу смешали.

    Любой аудиокодек оптимизирован в соответствии с, как вы это называете, особенностями звуковых волн, на то он и аудио. Переменный битрейт не имеет никакого отношения к lossless, это всего лишь способ оптимизации потока.

    FLAC в отличие от MP3, Vorbis, Speex и прочих кодеков с потерями, параллельно с коэффициентами модели записывает и текущую ошибку декодирования по сравнению с оригиналом. При декодировании эта дельта используется для восстановления исходной формы сигнала.

    Разумеется, для сохранения дельты нужно место, поэтому FLAC будет весить больше. Но это плата за lossless.
    MP3 окончательно переходит в общественное достояние
  • 0
    Кстати, раз тут заговорили о ванили. Всегда хотел узнать, что по факту означает эта «идентичность натуральному»?

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

    Я правильно понимаю, что «идентичный натуральному» подразумевает именно полную химическую идентичность или все совсем не так?
    MP3 окончательно переходит в общественное достояние
  • 0
    Я не говорю что он должен быть лучше или хуже. Вопрос был в том, теряется что-то или не теряется. Я и написал, что да, в случае MP3 потеря информации есть, даже при большом битрейте.
    MP3 окончательно переходит в общественное достояние
  • +1
    Потери бывают разные. Можно потерять на дискретизации/квантовании, можно в процессе компрессии. Частота дискретизации в 48К намного превышает физические возможности уха примерно так же, как 200Гц для изображения.

    Так вот, FLAC производит компрессию обратимым образом. То есть, при декомпрессии вы получите ровно те же отсчеты, что были изначало сняты с АЦП.

    Напротив, MP3 «теряет» информацию на основе психоакустической модели, поэтому после декомпрессии мы будем слышать резольтат «со вкусом» оригинала.
    MP3 окончательно переходит в общественное достояние
  • +2
    А как же Serde?
    Выпуск Rust 1.17
  • +1
    Посмотрите на фрагмент, приведенный ниже или на полный вариант в окрестности строки 152.

    impl ServerState {
        pub fn parse(&mut self, message: &str) -> Result<(), &'static str> {
            for (k, v) in parse_table(&message) {
                match k {
                    "frame" => self.frame = Rc::new(Frame::parse_from(v)?),
    
                    "deaths" => self.deaths = v[1 .. v.len()-1] // strip quotes
                        .split(',')
                        .filter(|e| e.len() > 0) // a,,b
                        .map(|x| x.parse().map_err(|_| "parse error"))
                        .collect::<Result<_,_>>()?,
    
                    // TODO
                    _ => unimplemented!()
                }
    
            }
    
            Ok(())
        }
    
        // ...
    }
    


    Из функции я выбрасываю колхозную ошибку &'static str, ибо лень и прототип. Фукнции парсинга возвращают нормальные ошибки, которые надо привести к строке.

    Самое интересное происходит в обработке «deaths»: с помощью функциональной магии и трансформации монад мы преобразуем Collection<Result<T, E>> в Result<Collection, E>>, который потом разворачиваем с помощью ?.
    Выпуск Rust 1.17
  • +3
    Если опустить детали реализации, то `?` просто выбрасывает ошибку из функции. Нормальное же значение «проглатывается» на текущем лексическом уровне. Подробнее можно посмотреть в документации.

    Если у вас есть операция, которая возвращает к примеру io::Result, а ваша функция определяет свой тип ошибки, то к вашим услугам метод map_err().
    Выпуск Rust 1.17
  • +4
    Могу посоветовать поглядывать в регулярно обновляющийся milestone predictions, дабы быть в курсе относительно планируемого времени интеграции фич.

    Очень жаль, что impl Trait находится в неопределенном состоянии (на то имеются веские причины). А остальное вполне движется. Я уже несколько месяцев пользуюсь VSCode + RLS и оно «просто работает».

    Не уверен что я прав, но похоже RLS используюет инкрементальную компиляцию, что в последнее время здорово ускорило анализ изменений. Это помимо того, что они запилили специальный режим работы компилятора, который выполняет только проходы, необходимые для сбора информации о коде (без лишней кодогенерации).

    А с учетом того что все это теперь распространяется через rustup, то начать пользоваться можно в пару команд.
    Выпуск Rust 1.17
  • +3
    И еще 15 на специализированном сайте вакансий.
    Выпуск Rust 1.17
  • 0
    Не путайте подтверждения и блоки. Насколько я понимаю, повесить свое подтверждение (подпись) можно на уже существующий блок. Для этого не требуется считать PoW. Количество таких подтверждений определяет ценность именно этой версии блока для сети.

    Если ничего не путаю, потребуется 10 минут на то, чтобы кто-то нашел очередной блок и внес в него вашу транзакцию (если его устроит комиссия) и еще сколько-то от узлов аудиторов на его подтверждение.
    «Алгоритмы консенсуса»: Подтверждение доли и доказательство работы
  • +1
    Выше уже написали, что расчет сложности опирается не на время, а на сами блоки и их количество. Каждый следующий блок должен содержать хеш предыдущего (блокчейн же).

    Сложность определяется не для каждого блока, а для серии из 2016 блоков, то есть имеется некий гистерезис, который позволяет прогнозировать условия, выставляемые сетью для новых блоков.

    Любые конфликты в блокчейне регулируются по извечному принципу «у кого длиннее, тот и круче». Ну да, некоторые блоки могли быть одновременно найдены несколькими участниками (или блоки с недостаточной сложностью были ошибочно пущены в оборот), но рано или поздно консенсус сойдется на одном из вариантов.

    Именно поэтому, прежде чем считать транзакцию валидной и принять оплату, надо дождаться нескольких независимых подтверждений, но это уже вопрос гарантий.
    «Алгоритмы консенсуса»: Подтверждение доли и доказательство работы
  • 0
    Спасибо за статью! Довольно интересно описано.

    Консенсус Накамото решает главный бич анонимных сетей — атаки Сибиллы, в которых злоумышленник создает кучу фейковых узлов, чтобы «задавить» получившимся большинством мнение честных пользователей.

    Справедливости ради стоит отметить, что подобные механизмы применялись задолго до биткоина. В частности, в сети Netsukuku, о которой я писал миллион лет назад, похожая схема применялась при слиянии двух подсетей.

    Дело в том, что сетевые адреса в Netsukuku назначаются произвольным образом. Поскольку в распределенной сети по определению нет единого центра, который раздавал бы адреса и следил за отсутствием коллизий, нужно было механизм разрешения коллизий, когда они все-таки возникают.

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

    Чтобы разрешить подобную коллизию, был разработан механизм, который позволил решить, какая из подсетей должна поменять свои адреса.

    В основе алгоритма лежала идея, очень похожая на PoW. Каждый узел сети генерировал PoW который использовался как голос в поддержку своей подсети. По результатам голосования, проигравшая подсеть перестраивала свои адреса.

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

    Не будь этого механизма, всю сеть можно было бы положить одним узлом, постоянно меняющим свои адреса.
    «Алгоритмы консенсуса»: Подтверждение доли и доказательство работы
  • +1
    Насколько я понимаю, вопрос тут не в часах, а в самом факте появления очередного блока.

    Новые блоки регулярно появляются в сети. Каждая нода, так или иначе знает, как часто ей присылают очередной блок. Соответственно, у нее могут быть ожидания относительно того, какого размера PoW должен быть у следующего блока с учетом этой частоты.

    Короче говоря, получается та же самая схема с «честным большинством». Если бо́льшая часть узлов считает, что PoW должен быть X, то злонамеренному меньшинству нет смысла пытаться генерировать фальшивую PoW Y < X, поскольку:

    1. Все равно нужно тратить энергию на вычисление даже PoW меньшего размера
    2. Рано или поздно эта ветвь будет проигнорирована как фальшивая и по определению более короткая (ведь честных майнеров больше)

    При таком подходе, фактический алгоритм вычисления уже не особо важен, главное чтобы его придерживалось большинство, сам он не имел логических дыр и хорошо работал независимо от количества узлов сети.
    «Алгоритмы консенсуса»: Подтверждение доли и доказательство работы
  • 0
    Ну вот это вы зря. Они неоднократно заявляли, что специально проектировали интерфейс пот VR и я могу с этим согласиться — все сделано очень на уровне.

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

    Поэтому все внимание уходит именно на игровой процесс. И здесь как нельзя кстати подходит возможность независимого управления кораблем и головой пилота. Возможность смотреть не по курсу движения корабля — одно из самых больших преимуществ VR, особенно в бою.
    Игры для Oculus Rift в которые уже можно поиграть
  • 0
    Ваша точка зрения понятна, но это же не значит, что игра не подходит для использования с VR.
    Игры для Oculus Rift в которые уже можно поиграть
  • +1
    И традиционно не упомянули Elite: Dangerous. Или потому что не отваливают обозревателям, или потому что нацелены на HTC (хотя и под окулусом вполне работает).
    Игры для Oculus Rift в которые уже можно поиграть
  • +4
    Ну а мне оно нужно, сжатие это? Если я готовлю в первый раз, мне интересно узнать замысел автора. В последующие разы — я уже или сам запомню или буду читать рецепт по диагонали. Зачем тут экономить на «байтах» — в упор не пойму.

    А то получится хрестоматийное: «…вместо риса взяла гречку, вместо свинины говядину, жарила не на подсолнечном, а на оливковом — такая гадость получилась! В общем, не рекомендую этот рецепт».
    Интерфейс рецептов
  • +3
    А может уже прямо в рецепте указывать, какие параметры критичны, а какие можно «сколько не жадно/влезет»?

    «Возьмите два куриных яйца любого размера» vs «отмерьте 200г муки; больше не надо — не будет кататься, меньше — будет жидко».

    Во-первых, мне как экспериментатору интересно, что будет, если (недо|пере)ложить. Во-вторых, это дает эмпирические оценки и подтверждение того, что положил ровно столько, сколько нужно.
    Интерфейс рецептов
  • 0
    Smacker применялся в Starcraft для cut сцен и выглядел весьма неплохо для того времени.
    Архаичные алгоритмы сжатия видео эпохи FMV-игр