Обновить
128K+
841,2
Рейтинг
5 750
Подписчики
Сначала показывать

Rust прячет инструменты там, где вы их не ищете. Часть 3

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели8K

Привет, Хабр!

Знакомая история: пишешь код, всё работает, ревью прошло, поехали дальше. А через какое-то время натыкаешься в документации на метод, который делал ровно то же самое — в одну строку, без твоего велосипеда на десять. И остаётся только вздохнуть: ну где ж ты был раньше!

Со стандартной библиотекой Rust так постоянно. Она большая, и половину её мы не используем не потому, что она плохая, а потому, что просто про неё не знаем — и пишем руками то, что давно лежит готовым. В первой части уже разбирали такие штуки: never-тип !, matches!, black_box, прозрачные обёртки repr(transparent) и transmute_copy. Подготовил для вас ещё девять.

Читать далее

Про механический парадокс Фергюсона: могут ли 2 одинаковые шестерни крутиться в разные стороны, а 3-я стоять на месте?

Время на прочтение7 мин
Охват и читатели16K

Техническая наука в любой области изобилует, порой, довольно парадоксальными решениями, которые, тем не менее, если разобраться, вполне себе имеют право на существование и, к тому же, приводят к интересным следствиям — то есть, полезны для современного применения: именно таким и является знаменитый «парадокс Фергюсона», касающийся зубчатых передач, который удивляет впервые ознакомившихся с ним людей людей, уже более 260 лет, и, к тому же, имеет интересное следствие в наши дни, так как зная его принципы, можно успешно проектировать механические суставные передачи роботов, с парадоксальным (на первый взгляд) движением… 

Читать далее

Тип топологии – шина

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели12K

Кажется, что топология «звезда» правит в современном мире. Из-за тотальной популярности технологии Ethernet она окружает нас везде: в квартире, в офисе, в доме все выстроено как центральная точка-коммутатор и множество ответвлений на абонентские устройства.

Но. Смотрите, что произойдет, как только вы выйдете из квартиры.

Вы прикладываете к домофону ключ-«таблетку» — и в этот момент, возможно, пользуетесь шиной 1-Wire, которая по своей топологии буквально шина. 

Садитесь в машину, поворачиваете ключ — и по всему автомобилю идет сигнал на десятки блоков, висящих на общих парах проводов CAN и LIN. Ни один современный автомобиль без шины не поедет вообще. 

Вечером вы идете на концерт — и вся светотехника над сценой, сотни приборов, управляется по DMX512, который бегает поверх шинного интерфейса RS-485. 

Даже показания квартирного теплосчетчика снимаются по M-Bus — специализированной шине для счетчиков.

Звезда победила в офисах и дата-центрах. Но стоит выйти за пределы серверной — на завод, в цех, на подстанцию, в автомобиль, за кулисы концертного зала, квартиру — и выясняется, что там до сих пор правит бал старая добрая шина. Два провода, протянутые через весь объект, и десятки устройств, повисших на них параллельно, как белье на веревке.

Как же так вышло, в наш век современной и быстрой связи?

Читать далее

Подробный обзор модуля FMC ADRV9009

Уровень сложностиСложный
Время на прочтение90 мин
Охват и читатели10K

Ко мне пришла плата для организации SDR-трассивера и я решил сделать технический разбор FMC-модуля на широкополосном трансивере Analog Devices ADRV9009 - того самого «китайского клона» оценочной платы ADRV9009-W/PCBZ, который продаётся на Taobao и AliExpress под именем FMC ADRV9009. Обзор рассчитан на читателя, который в целом понимает, что такое SDR, FPGA и JESD204B, но хочет разобраться в конкретной плате: что на ней стоит, как она устроена схемотехнически, к чему её можно подключить и чего от неё ждать. Если тебя заинтересовала данная тема - добро пожаловать под кат.

Читать далее

Прообраз современного металлоискателя — индукционный баланс Хьюза

Время на прочтение7 мин
Охват и читатели12K

Prof. D.E. Hughes (1879) V. Induction-balance and experimental researches therewith , The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science

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

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

Читать далее

? выглядит как try/catch. Внутри — полная противоположность

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели13K

Привет.

Спросите любого, что делает ?, и услышите примерно одно: «сахар для match, который при ошибке делает ранний return». В целом, тут есть правда. Разворачивается ? и правда в match с return, но прячется за этим match целый трейтовый механизм — он умеет конвертировать типы, работает с вашими собственными типами и не имеет ничего общего с try/catch, хоть и выглядит похоже.

Давайте посмотрим, что компилятор на самом деле пишет вместо вашего вопросика, что такое residual в нынешнем дизайне, почему ошибке нужен отдельный тип, и как прикрутить ? к своему типу. И сразу скажу: пользоваться ? на Result и Option можно давно и на стабильном Rust, а вот реализовать поддержку ? для своего типа — это до сих пор nightly. Дальше будет видно почему.

Читать далее

Механический «диодный мост»?

Время на прочтение10 мин
Охват и читатели16K

До начала нашего рассказа, давайте я загадаю вам загадку: можно ли выпрямить переменный ток, без полупроводниковых элементов (диоды и т.д.)? А можно ли то же самое провернуть, с точностью до наоборот — то есть, постоянный ток превратить в переменный, без сложных схем и полупроводниковых элементов? Можно ли понизить/повысить напряжение электрического тока (и другие его параметры — частоту, количество фаз) — без трансформаторов и электронных схем? 

А теперь, совсем вопрос на засыпку («вот ведь валит!» © — неизвестный студент :-D):
а можно ли теперь всю эту красоту провернуть с помощью одного и того же класса устройств?  

Как ни странно, можно, если это устройство называется «умформер» (но были и более продвинутые варианты, о них тоже будет ниже)…

Читать далее

«lock xadd, и это весь Arc::clone? Не совсем

Уровень сложностиСложный
Время на прочтение10 мин
Охват и читатели8.5K

Ну, привет.

lock xadd. Вот и весь Arc::clone на x86. Одна инструкция. Заглядываешь в дизассемблер и даже немного обидно: столько разговоров про атомарные счётчики ссылок, а внутри обычный атомарный инкремент, который компилятор даже не утруждается оборачивать во что-то крутое.

Вот только эта инструкция вам подыгрывает. На вашем ноуте она бесплатная. А потом тот же код уезжает в прод на пару десятков ядер, и тот же самый инкремент оказывается самым дорогим местом в горячем цикле. Самая подлянка в том, что профайлер на ноуте этого не покажет: чтобы увидеть цену, нужен контеншен, а на одном ядре его нет. Так что вся статья, если честно, про одно. Как научиться смотреть на Arc::clone и видеть не инкремент, а короткий разговор с протоколом кэш-когерентности вашего процессора.

Arc принято звать умным указателем. Мне ближе другая формулировка: это примитив синхронизации, который натянул костюм указателя, чтобы вы его не боялись. Давайте снимем всю эту оболочку и глянем, кто там внутри. По ходу разберёмся, откуда в нём два счётчика, почему clone беспамятный, а drop нет, как живёт Weak, что за толстый указатель прячется в Arc<dyn Trait>, зачем придумали make_mut и где Rc делает Arc по скорости.

Читать далее

Телеграмма во Владивосток. Часть 2

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели14K

Итак, в первой части мы разобрались, как телеграф в России вырос из дворцовой игрушки в государственную инфраструктуру, как Крымская война подстегнула его развитие и как депеша шла эстафетой через сеть станций. Теперь — собственно история про Владивосток.

Читать далее

Резистор, который не пропускает ток

Время на прочтение7 мин
Охват и читатели13K

Не так давно мы рассмотрели такую интересную тему, как переменные резисторы и их потенциальную замену достаточно интересными решениями. 

На мой взгляд, рассмотрение той темы было бы неполным, если бы не рассмотреть ещё и крайне интересный и, в буквальном смысле, «крайний» вариант — когда резистор не пропускает ток вообще! :-)  

Выглядит странновато, и вообще, возникает вопрос — «а зачем же тогда такой резистор и вовсе нужен?!», но, тем не менее, и такие интересные элементы в электронике бывают!  

Читать далее

HashMap в Rust: SwissTable, SIMD по 16 байт за раз и RawTable, который от вас спрятали

Время на прочтение9 мин
Охват и читатели9.5K

Привет, Хабр!

Признавайтесь: вы пользуетесь std::collections::HashMap примерно каждый день и ни разу не задумывались, что под ним. А под ним, если коротко, сидит алгоритм от Google. С Rust 1.36 (это лето 2019-го) стандартный HashMap это порт SwissTable, той самой структуры из абсейловского flat_hash_map. До этого там был Robin Hood hashing, и если вы где-то ещё видите описание std-мапы как «linear probing and Robin Hood bucket stealing», знайте: оно протухло, актуальная документация уже пишет «quadratic probing and SIMD lookup».

И вот «SIMD lookup» это самое интересное. Весь фокус скорости SwissTable держится на одном байте служебных данных на элемент, который сканируется по 16 штук за одну инструкцию процессора.

В статье глянем, как это устроено внутри, почему ваша мапа по умолчанию устойчива к hash DoS и платит за это скоростью, когда в проде стоит переходить на FxHash, и почему низкоуровневый RawTable существует, но в публичном HashMap его спрятали.

Будет много кода и немного ассемблерной романтики.

Читать далее

Про переменные конденсаторы

Время на прочтение7 мин
Охват и читатели15K

Не знаю как для вас, но для меня, с того самого первого момента, когда я стал интересоваться электроникой, существовала одна, скажем так, «загадочная» :-) сущность, разобраться в сути которой мне всегда было интересно — конденсаторы переменной ёмкости! 

Хотя бы даже по той простой причине, что в те далекие (почти уже былинные) времена, когда у меня впервые начали возникать вопросы подобного рода, переменные конденсаторы достать было весьма проблемно (для собственных экспериментов; несмотря на то, что они повсеместно присутствовали в «музыкальных центрах» (радиоприёмник + проигрыватель пластинок) прошлого — «радиола»-х). 

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

Ну и в целом, как выясняется, переменные конденсаторы как класс представляют собой очень интересный объект для рассмотрения, чем мы сегодня и займёмся!

Читать далее

SPI-контроллер на FPGA: от идеи до сигналов на осциллографе

Уровень сложностиСредний
Время на прочтение142 мин
Охват и читатели11K

Откройте любой учебный материал по FPGA. С вероятностью девяносто процентов он закончится мигающим светодиодом, бегущей строкой на семисегментнике или, в лучшем случае, генератором VGA-сигнала с цветными полосами. Это нормальные учебные задачи, но у них есть общее свойство, о котором редко говорят вслух: они работают сразу или не работают совсем. Прошили — мигает. Не мигает — перепроверили три строчки кода, нашли опечатку, мигает.

Реальная инженерная работа с ПЛИС устроена иначе. Реальная задача — это когда ваша микросхема должна разговаривать с другой микросхемой по протоколу, у которого есть спецификация на сорок страниц, четыре режима тактирования и подводные камни в каждом втором абзаце даташита. Когда «вроде работает» — это худший из возможных результатов, потому что «вроде» означает «упадёт у заказчика». И когда между «код написан» и «устройство работает» лежат недели верификации и отладки.

Эта статья - следующий шаг в моем обучении и попытка показать полный путь: от фразы "нам нужен SPI-контроллер" до момента, когда логический анализатор показывает красивые пачки импульсов на ножках кристалла. Здесь будут не только архитектурные решения и листинги, но и все ошибки, которые были сделаны по дороге: testbench, который врал, потому что master и slave-модель содержали один и тот же баг; гонка на один такт, из-за которой тест прерываний падал при исправном железе; и финальный детектив — прошивка, в которой SPI-сигналы честно генерировались... на других ножках, потому что файл назначения пинов на диске оказался не тем, который мы правили. Каждая такая история — это методика: симптом, гипотеза, эксперимент, причина, фикс.

Читать далее

Телеграмма во Владивосток. Часть 1

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели17K

Первого января 1864 года из Иркутска ушла телеграмма. По содержанию — ничего особенного: поздравление императору с Новым годом, дежурный верноподданнический жест. Интересно другое. Ответ из Петербурга пришел через 17 часов.

Семнадцать часов. Вроде много, да? Но вдумайтесь.

Еще лет за десять до этого депеша из Иркутска в столицу ехала с фельдъегерем. Хороший фельдъегерь покрывал шесть тысяч верст недели за три (Транссиба еще не было). Благодаря строгому документированию таких пересылок мы знаем примерные нормативы доставок: три недели считались отличным результатом. Обычная же почта шла месяц-полтора.

А тут — ответ через 17 часов. Вместе с очередями на промежуточных станциях и переписыванием депеши на узлах. Отличный результат.

Власти этой экономией времени были впечатлены настолько, что к 1870 году телеграф Российской империи стал самым протяженным в Европе — 91 тысяча километров.

Давайте проследим его историю и посмотрим, через что ходили депеши в нашей стране в XIX веке. Начнем с того, как провод вообще дополз до Иркутска. А закончим тем, как телеграмма из Лондона стала доходить до Владивостока — и кто по дороге пытался ее читать.

Читать далее

Ближайшие события

Про альтернативы переменным резисторам

Время на прочтение9 мин
Охват и читатели17K

Все, кто так или иначе имел дело с электроникой, например, пытался собирать какие-то свои хобби-схемы, сталкивался с одной весьма простой задачей, которая, как ни странно, может иной раз попортить нервы довольно сильно: обычные резисторы! 

Вроде бы, ну что там может быть сложного? Обычный пассивный элемент, известный всем — подбирай по мощности/сопротивлению/типу монтажа (сквозной/поверхностный) и вуаля… 

Однако, из своего опыта, мне вспоминается, что с резисторами связаны две банальные проблемы: 1) нужного никогда нет под рукой; 2) непонятно, какой нужен (надо подбирать иной раз «на живую»). 

Да, с развитием современных маркетплейсов и онлайн-торговли проблемы в значительной мере ушли, но, тем не менее, думается, что ознакомление с альтернативным путём, будет для многих интересно! ;-) 

В связи с вышесказанным, я тут накопал некоторое количество информации, которое, думается, может быть для некоторых весьма полезным…Итак… 

Читать далее

const fn в 2026: ваш компилятор втихаря исполняет Rust

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели13K

Привет, Хабр!

Когда вы пишете вот такую строчку:

const N: u64 = fib(50);

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

И вот вопрос, на который мало кто может ответить с ходу: а кто конкретно это исполняет? Где живёт тот интерпретатор? Почему 255 + 1 в const падает с ошибкой компиляции, а в рантайме просто паникует? Почему можно посчитать таблицу из тысячи элементов циклом, но нельзя написать if a < b для дженерика? И почему 0.0 / 0.0 в const официально разрешили вести себя недетерминированно?

Погнали разбираться.

Читать далее

Про бритьё

Время на прочтение7 мин
Охват и читатели22K

Какая техническая область развивается практически всю историю человечества, идя с ним рука об руку и, несмотря на все прошедшие века и технические изменения, — до сих пор, в основе своей, находится на том же уровне, что и многие тысячи лет назад? 

И это безусловно — бритьё! :-)

Читать далее

Что внутри #[derive(Serialize)]: TokenStream, syn, quote и почему этот serde так долго компилируется

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.6K

Привет, Хабр!

#[derive(Serialize, Deserialize)] это какая-то одна строка в коде. На холодной сборке за ней прячется двадцать с лишним секунд компиляции, даже если в проекте больше ничего нет. Откройте cargo build --timings на любом не самом маленьком проекте с serde, и serde_derive почти наверняка окажется в первой тройке самых медленных крейтов. При том что в самом serde_derive всего несколько тысяч строк.

Между этой строкой и этими секундами лежит вся инфраструктура процедурных макросов: TokenStream, syn, quote, proc-macro2, watt. Пройдёмся по ней в этой статье.

Читать далее

Zynq 7000. HDMI для платы Zynq Mini и Linux

Уровень сложностиСредний
Время на прочтение88 мин
Охват и читатели14K

Раз уж пошла такая песня, я решил добить вопрос с выводом изображения по HDMI на плате Zynq Mini. В предыдущей статье мы уже разобрали как это сделать в baremetal-сценарии, теперь пришла пора дополнить дизайн для возможности вывода системной консоли Linux, при том, что у Zynq-7000 нет своего видеоконтроллера и весь видеотракт (DMA, генератор таймингов, TDMS-кодер) должен быть построен внутри FPGA, а затем быть проброшен в Linux. 

Всем, кому интересна данная тема - добро пожаловать под кат!

Читать далее

Лазерные спеклы — что это такое и как их применить с пользой?

Время на прочтение9 мин
Охват и читатели15K

Любой кто имел дело с лазерами, например, в самом простом варианте, даже баловался с обычной красной лазерной указкой, замечал, наверное, одно интересное явление: если навести лазерный луч на какую-либо поверхность — поверхность оказывается как бы покрытой ярко сияющими мелкими блёстками, и этот эффект тем более заметен, чем с большего размера лазерный луч светит на поверхность — просто-напросто, из-за обычно неидеальности оптической системы лазера, бытовые недорогие лазерные указки красного цвета имеют достаточно большое* расхождение луча и этот луч освещает достаточно большую площадь, на которой этот эффект становится ещё более заметен. 

В прошлом, я думал, что «ну, просто луч настолько яркий, что подсвечивает малейшие шероховатости, ничего странного» — однако, как выясняется, науке этот эффект давно известен, за ним скрывается очень интересное явление и он может быть применён весьма любопытными способами! 

Читать далее
1
23 ...

Информация

Сайт
beget.com
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия