Обновить
4
0

Пользователь

Отправить сообщение

Важнейшая модель теории вероятностей

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

Что объединяет частицу в воде, биржевой курс и кота Барсика, бродящего по району в поисках ларька с рыбой?


Всё это — примеры случайного блуждания. Эта простая модель из теории вероятностей помогает описывать самые разные явления: от диффузии молекул до принятия решений и работы алгоритмов. Она кажется интуитивной — но за ней скрывается множество нетривиальных и красивых свойств.

Мы начнём с истории открытия броуновского движения — от наблюдений Роберта Броуна до формулы Альберта Эйнштейна, которая связала наблюдаемое явление с атомной гипотезой. Покажем, как идея случайного движения превратилась из гипотезы в надёжный инструмент научного анализа.

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

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

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

Читать далее

Возможное расширение языка C++ операцией скалярного произведения

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

У меня возникла идея, как можно расширить синтаксис C++ операцией скалярного произведения. Если кратко, то произведение двух матриц в новых обозначениях будет выглядеть так:

C[>i][>j] = A[i][>k] * B[>k][j];

Насколько мне известно, сочетания операторов [> и [< вроде бы нигде не используются. Их можно применить для декларации индексов, которые существуют только в пределах данного выражения. Сочетание [> используется для декларации индекса, который пробегает от начала до конца массива в прямом направлении, а сочетание [< для декларации индекса, который пробегает в обратном направлении. Для повторяющихся индексов в произведении подразумевается суммирование - они аналогичны немым индексам в тензорных обозначениях.

Разберём на примерах, как это будет работать.

Читать далее

Как запустить свой стартап, протестировать идеи за месяц, а уже через три убедиться в их жизнеспособности

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

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

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

Читать далее

Может, если бы у C++ было больше времени, он стал бы лучше?

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

В своей предыдущей статье [перевод на Хабре] я говорил о множестве недостатков C++, которые, по сути, устранил Rust. Благодаря этому код теперь легко использовать правильно и сложно использовать неверно. Я не говорил о безопасности по памяти, просто привёл пример того, что пользователь функции не может случайно поменять местами аргументы количества и цены.

На написание статьи меня вдохновил доклад Мэтта Годболта о том, как можно сделать интерфейсы C++ более надёжными: Correct by Construction: APIs That Are Easy to Use and Hard to Misuse. Вам стоит его посмотреть!

В той статье я сказал, что Rust гораздо лучше помогает разработчику, возможно, благодаря тому, что у него были десятки лет, чтобы учиться. В конце концов, первая версия C++ была выпущена в начале 80-х, а Rust — в начале 2010-х. Если дать C++ несколько десятков лет для обучения, то, разумеется, появятся новые структуры, которые будут обладать высоким качеством и которые сложно использовать неправильно.

Но так ли это?

Читать далее

Пишем на C самоизменяющуюся программу x86_64

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


«Зачем вообще писать программу, меняющую код в процессе выполнения? Это же ужасная идея!»


Да, всё так и есть. Но это и хороший опыт. Такое делают только тогда, когда хотят что-то исследовать, или из любопытства.


Самоизменяемые/самомодифицируемые программы не обладают особой полезностью. Они усложняют отладку, программа становится зависимой от оборудования, а изучение кода превращается в очень утомительный и запутанный процесс, если только вы не опытный разработчик на ассемблере. Единственный разумный сценарий применения самоизменяемых программа в реальном мире — это механизм маскировки зловредного ПО от антивирусов. Моя цель исключительно научна, поэтому ничем подобным я заниматься не буду.


Предупреждение: в этом посте активно используется язык ассемблера x86_64, в котором я ни в коем случае не являюсь специалистом. Для написания статьи мне пришлось изучать приличный объём материалов, и, возможно (почти наверняка), в ней есть ошибки.
Читать дальше →

Простой программатор для атмеловских 8051

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

В этой заметке речь больше про принцип — программатор можно сделать так, чтобы на стороне компьютера не требовался дополнительный софт. Будем прямо лить HEX‑файл в последовательный порт. Идея не новая, но не лишне напомнить (в том числе об одном‑двух подводных камнях рассказать).

Собственно программатор — голый Arduino с прошивкой, разбирающей HEX‑файл построчно и реализующий программирование целевого чипа по SPI. Прошивка и инструкции сложены в репозитории на гитхабе: At89s‑prog.

Конкретные чипы (At89s...) здесь скорее для примера. Мы не будем воспевать достоинства 8051-й архитектуры (конечно, они архаичны но у них есть плюсы, благодаря которым они до сих пор сохраняют популярность). У меня в какой‑то момент оказалась их горстка а программатора под рукой не нашлось. Они (те что с индексом S) программируются через SPI, а не стандартным «многоногим» интерфейсом что делает удобным их применение в любительских поделках.

Читать далее

Преступный ИИ уже существует, и он доступен любому

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

В апреле этого года в блогах, посвящённых кибербезопасности, начали появляться отчёты о новой сложной платформе искусственного интеллекта, созданной исключительно для совершения преступлений. Но несмотря на своё происхождение и пугающее название, Xanthorox не так уж загадочна. У разработчика этого ИИ есть страница на GitHub, а также публичный YouTube-канал с видеозаписями интерфейса и описанием «Этот канал был создан для развлечений и ничего иного». У Xanthorox есть и почтовый адрес Gmail, Telegram-канал, на котором ведётся хроника разработки платформы, а также Discord-сервер, на котором пользователи могут платить за доступ криптовалютой. Не требуется никакой регистрации на криминальных форумах дарк-веба, достаточно лишь одного сообщения предпринимателю, который обслуживает потенциальных преступников с большей прозрачностью, чем многие онлайн-магазины, рекламирующие омолаживающие кремы в Instagram.

Читать далее

Что не так? Три парадокса теории вероятностей

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

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

Казалось бы, детская задачка, где нужно просто “вспомнить формулу”, но всё не так однозначно. Если задать этот вопрос прохожему, он, скорее всего, скажет ½. Преподаватель математики, возможно, ответит ⅓. Кто из них прав?

В каком-то смысле, правы оба. Просто каждый представляют себе свой способ, как была получена информация о ребёнке. На самом деле это и есть условие задачи. Только скрытое. 

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

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

В этой статье — три таких истории. В первой один и тот же факт даёт разные вероятности, если по-разному устроено наблюдение. Во второй один и тот же объект может быть “случайным” множеством способов. А в третьей невозможно придумать, как сделать задачу математически строгой.

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

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

Читать далее

Молекулярное шифрование: полимерный пароль

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


Неустанно растущий объем информации требует создания новых носителей. Данная потребность уже давно привела к тому, что ученые с особым интересом рассматривают ДНК в качестве идеального (по мнению многих) носителя информации. Проблема в том, что доступ к данным на молекулах является крайне сложным, дорогим и длительным процессом. Ученые из Техасского университета в Остине (США) разработали новый метод кодирования информации в синтетических молекулах, который может сталь более выгодной и эффективной альтернативой биомолекул. Как именно работает данный метод, что лежит в его основе, и что удалось с его помощью сделать? Ответы на эти вопросы мы найдем в докладе ученых.
Читать дальше →

Obsidian: исчерпывающее руководство по Templater

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

В этой статье я расскажу о том, как плагин Templater может упростить ежедневное взаимодействие с заметками в вашем хранилище Obsidian, постараюсь рассмотреть большинство его возможностей, а также поделюсь собственными шаблонами, которые могут оказаться для вас полезными.

Читать далее

Яйцо, которое не должно было выжить

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

Почему всё, что мы знали о прочности яйца — оказалось ошибкой

Если вы когда-то участвовали в «яичном челлендже» — где нужно сбросить яйцо с высоты так, чтобы оно не разбилось — скорее всего, вы держали его вертикально. За острый конец. Почти все так делают. Почему? Потому что считается, что в этой ориентации яйцо прочнее. Так говорят учителя, блогеры, популярные научные журналы. Мол, купольная форма, как у соборов или арок, отлично держит вертикальные нагрузки. Звучит логично.

Но оказалось, что это неправда. И не просто немного — а принципиально.

Читать далее

Решето дельт — простой способ раскладывать числа на множители, о котором вам не рассказывали

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

Что вы скажете, если я расскажу вам, что знаю метод разложения чисел на множители, который не так сложен, как алгоритмы QS и GNFS, основывается не на магии, а на логике и простых арифметических принципах, легко реализуется, его легко распараллелить для ускорения вычислений, он не требует много памяти и при этом зачастую в разы эффективнее метода Ферма́? Заинтересовало?

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

Примеры, объяснения, таблицы — всё на месте. Даже если вы забыли, что такое \bmod, вы всё равно поймёте, как это работает.

Читать далее

Создание объектов без конструктора по умолчанию в C++: искусство владения памятью

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

В данной статье рассматриваются метод создания объектов без использования конструктора по умолчанию с использованием возможностей стандарта C++17 , который предоставляет гибкие инструменты управления памятью и типобезопасностью. Мы рассмотрим техники, которые позволяют работать с такими объектами напрямую, сохраняя контроль над процессом инициализации и временем жизни объектов.

Читать далее

Процессор на коленке ч.1

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


Предыстория


Захотелось мне как-то перевести управление станком на ПЛИС, а для этого понадобилось ядро процессора. Поиск на opencores не особо помог, x86 лицензированный, ARM лицензированный, NIOS… ну, вы поняли. Если выдумывать свою систему команд, может получиться криво, и главное, где брать компилятор. В общем, всё было сложно, так что на время идею пришлось отложить.
С недавних пор ситуация изменилась, архитектура RISC-V пошла в массы.

Читать дальше →

Любителям x86-64 assembler посвящается: DIY волокна в C++

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

Нас ждёт мозговыносящая смесь 64/32-битного ассемблера и старого-доброго C++. Мы сделаем собственную реализацию... Волокон (fibers) без вызова Win API и звонков в службу спасения.

Читать далее

Первый http сервер на С++, заметки для новичков

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

Решил написать простенькую статейку по следам реализации небольшой программки на С++ под Виндоус, которая содержит в себе TCP сервер. Мы получаем от клиента http запрос. Соединение не защищенное.

На чем реализован клиент нам неизвестно: может на php (curl,socket,stream_contex_create,...), может на js (ajax), вообще может быть на чем угодно.

Надо задача реализовать http парсинг запроса и контента, выполнить задание (на каком-то подключенном к серверу оборудовании) и ответить клиенту о результате.

Примечание: автор реализует http сервер на устаревшем Qt4, используем QTcpServer. Но для http сервера это не принципиально.

Читать далее

Основы по GNU Make

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

GNU Make - это консольная утилита, которая запускает другие консольные утилиты в желаемой последовательности согласно скрипту. Только и всего.

В этом тексте я показал, как можно организовать самостоятельно написанные make скрипты для микроконтроллерных проектов.

Читать далее

Математическое решение царской игры Ура

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

Мы потратили семь лет на эксперименты с ИИ для царской игры Ура, и, наконец, пришли к сильному решению по правилам Финкеля, Блица и Мастерса! В конечном итоге, для этого понадобилась пара красивых уравнений, которые я объясню в статье.

На самом деле, мы не «просто» нашли сильное решение игры. Для сильного решения необходимо находить наилучший ход из каждой позиции. Мы сделали это, плюс вычислили точную вероятность победы каждого игрока при оптимальной игре из каждой позиции. Для этого мы воспользовались нашей опенсорсной библиотекой RoyalUr-Java.

Ниже мы опишем, как это работает. Также мы написали технический отчёт.

Читать далее

Два подхода к интерпретации видимости в Rust

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

В прошлом году, просматривая пул-реквесты по поводу компилятора Rust, я обратил внимание на #126013. В нём к некоторым пакетам компилятора добавлялась проверка unreachable_pub. Естественно, меня это заинтересовало, так как на тот момент я о такой проверке не знал. Но, разобравшись с её описанием, я тем более удивился, так как эта проверка показалась мне абсолютным нонсенсом! Поговорив об этом с авторами пул-реквеста, я осознал, что, пожалуй, достаточно странно представляю себе, как устроена видимость в Rust. Как минимум, я воспринимал её не «так, как она была задумана».

Эта тема показалась мне достаточно интересной, чтобы раскрыть её в блоге. В этой статье я коротко объясню, как именно работает видимость в Rust, а потом опишу два достаточно разных способа её использовать. Если вы знаете, как в Rust устроена видимость, можете смело пропускать введение и переходить к главной теме. Оговорюсь, что в этом посте я просто вывалил различные мысли на данную тему, скопившиеся у меня, так что не ожидайте найти здесь каких-либо супер-откровений :).

Читать далее

Доступ к приватным методам класса в С++

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

В C++ инкапсуляция — один из ключевых принципов ООП, и приватные (private) члены класса защищены от прямого доступа извне. Однако иногда возникают ситуации, когда такой доступ необходим (например, при тестировании, сериализации или отладке). Обычно для этого используют friend-функции или геттеры/сеттеры, но есть и более экзотический способ — использование шаблонов и указателей на члены класса.

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

Читать далее

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность