Как стать автором
Обновить
2
0

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

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

Миникомпьютер из роутера с OpenWRT: пишем USB class-driver под Linux

Время на прочтение20 мин
Количество просмотров78K

Добрый день, уважаемые хабровчане. В прошлой статье мы с вами разработали простую USB-видеокарту на базе STM32F103 и китайского дисплейного модуля на контроллере ILI9325.
Проверяли мы его из юзерспейса, при помощи LibUSB. Ну что ж, пришло время нам написать свой собственный драйвер, который позволит делать все то же самое, но из-под Linux и без дополнительных библиотек. Этот драйвер мы внесем в дерево исходников OpenWRT и он поселится там наравне со всеми остальными.
Начнем.
Читать дальше →
Всего голосов 124: ↑121 и ↓3+118
Комментарии32

Миникомпьютер из роутера с OpenWRT: пишем драйвер фреймбуфера

Время на прочтение19 мин
Количество просмотров67K
Добрый день, уважаемые хабровчане. Вот мы и подошли к самой интересной и важной части моего цикла статей про превращение небольшого роутера в миникомпьютер — сейчас мы с вами будем разрабатывать настоящий драйвер фреймбуфера, который позволит запустить на роутере разные графические приложения. Чтобы энтузиазм не угасал, вот видео одного из таких приложений — думаю, большинство узнают это великолепный старый квест:

На случай, если вы пропустили предыдущие части — вот ссылки:
1 — Миникомпьютер из роутера с OpenWRT: разрабатываем USB-видеокарту
2 — Миникомпьютер из роутера с OpenWRT: пишем USB class-driver под Linux
Итак, приступаем к работе.
Читать дальше →
Всего голосов 139: ↑139 и ↓0+139
Комментарии37

Миникомпьютер из роутера с OpenWRT: разрабатываем USB-видеокарту

Время на прочтение25 мин
Количество просмотров184K

Добрый день, уважаемые хабровчане. В этом цикле статей мы с вами пройдем достаточно длинный, но весьма интересный путь по превращению обычного роутера в мини-компьютер с LCD-дисплеем. Для этого мы разработаем сначала USB-видеокарту на базе микроконтроллера STM32F103, потом тестовый драйвер, который позволит нам выводить на него графику, и, наконец – полноценный драйвер фреймбуффера, благодаря которому можно будет запустить настоящие графические приложения, такие как x-сервер. Заодно мы научимся включать наш код в дерево исходников OpenWRT, допиливать его ядро и делать прочие полезные вещи.
Ну а в самом конце мы получим результат, который, я надеюсь, вызовет ностальгическую слезу у многих читателей. Я постараюсь излагать материал таким образом, чтобы в конце каждого этапа мы получали осязаемый результат, не дающий угаснуть энтузиазму. Итак, начнем.
Читать дальше →
Всего голосов 286: ↑279 и ↓7+272
Комментарии44

Поиск замены депозита в облигациях с учетом того, что с 1 января 2021 года все выплаты облагаются налогами

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

Полгода назад, летом 2020 года я написал скрипт поиска ликвидных облигаций на Мосбирже (статья в закладках у 194 человек, рейтинг +45). Скрипт нужен для поиска облигаций, которые можно купить прямо сейчас с доходностью гораздо выше банковского вклада.

Сейчас, в начале 2021 года модифицировал прошлогодний скрипт, потому что проценты по вкладам так и остаются на очень низких уровнях, а с началом 2021 года ещё и изменения в налоговом кодексе РФ подоспели. 

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

Облигации как замена вклада в 2021 году
Всего голосов 46: ↑45 и ↓1+58
Комментарии65

Асинхронность в программировании

Время на прочтение26 мин
Количество просмотров95K

В области разработки высоконагруженных многопоточных или распределенных приложений часто возникают дискуссии об асинхронном программировании. Сегодня мы подробно погрузимся в асинхронность и изучим, что это такое, когда она возникает, как влияет на код и язык программирования, которым мы пользуемся. Разберемся, зачем нужны Futures и Promises и затронем корутины и операционные системы. Это сделает компромиссы, возникающие во время разработки ПО, более явными.


В основе материала — расшифровка доклада Ивана Пузыревского, преподавателя школы анализа данных Яндекса.


Читать дальше →
Всего голосов 71: ↑67 и ↓4+63
Комментарии70

Wolfensteiny 3D — реверс-инжиниринг 251 байтов JavaScript

Время на прочтение5 мин
Количество просмотров17K
При написании кода многие не задумываются ни о чем, кроме логики самой программы. Меньшее число людей думают об оптимизации кода по времени, по памяти. Но лишь единицы доходят до последнего уровня — сжатии программы до рекордно маленького размера.

Посмотрите, например, на результат работы всего 251 байта JavaScript:


Ну, давайте разбираться, как это работает!
Читать дальше →
Всего голосов 49: ↑49 и ↓0+49
Комментарии16

Гадание на нейросетях: отметился ли в комментариях к посту сам автор

Время на прочтение6 мин
Количество просмотров6.8K


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

Свой проект я начинал с минимальными знаниями по машинному обучению и думаю для специалистов тут не будет ничего нового. Этот материал в некотором смысле компиляция разных статей, в нем расскажу, как подходил к задаче, в коде можно найти полезные мелочи и приемы с обработкой естественного языка.
Читать дальше →
Всего голосов 34: ↑34 и ↓0+34
Комментарии2

Audio AI: выделяем вокал из музыки с помощью свёрточных нейросетей

Время на прочтение12 мин
Количество просмотров59K
Взлом музыки для демократизации производного контента

Отказ от ответственности: вся интеллектуальная собственность, проекты и методы, описанные в этой статье, раскрыты в патентах US10014002B2 и US9842609B2.

Вот бы вернуться в 1965 год, постучать в парадную дверь студии «Эбби-Роуд» с пропуском, зайти внутрь — и услышать настоящие голоса Леннона и Маккартни… Что ж, давайте попробуем. Входные данные: MP3 среднего качества песни «Битлз» We Can Work it Out. Верхняя дорожка — входной микс, нижняя дорожка — изолированный вокал, который выделила наша нейросеть.

Читать дальше →
Всего голосов 69: ↑68 и ↓1+67
Комментарии27

Не VPN-ом единым. Шпаргалка о том, как обезопасить себя и свои данные

Время на прочтение8 мин
Количество просмотров52K
Привет, Хабр.

Это мы, VPN-сервис HideMy.name. Сейчас временно работаем на зеркале HideMyna.me. Почему? 20 июля 2018 года Роскомнадзор добавил нас в список запрещенных ресурсов из-за решения Медведевского районного суда в Йошкар-Оле. Суд постановил, что посетители нашего сайта имеют неограниченный доступ к экстремистским материалам #безрегистрацииисмс, а ещё каким-то образом нашёл на нём книгу «Майн Кампф» Адольфа Гитлера. Видимо, для надёжности.

Такое решение нас очень удивило, но мы продолжаем работать на hidemyna.me, hidemyname.org, .one, .biz и др. Затяжное пререкание с Роскомнадзором не привело ни к какому результату. Пока мы с юристами оспариваем блокировку и волшебное решение суда, делимся с вами базовыми советами по сохранению конфиденциальности в интернете и новостями на эту тему.


Эдвард Сноуден любит Агентство национальной безопасности (наверное)
Читать дальше →
Всего голосов 49: ↑47 и ↓2+45
Комментарии73

Алгоритм резервуарной выборки

Время на прочтение3 мин
Количество просмотров13K
Резервуарная выборка (eng. «reservoir sampling») — это простой и эффективный алгоритм случайной выборки некоторого количества элементов из имеющегося вектора большого и/или неизвестного заранее размера. Я не нашел об этом алгоритме ни одной статьи на Хабре и поэтому решил написать её сам.

Итак, о чём же идёт речь. Выбрать один случайный элемент из вектора — это элементарная задача:

// C++
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, vect.size() — 1);

auto result = vect[dis(gen)];

Задача «вернуть K случайных элементов из вектора размером N» уже хитрее. Здесь уже можно ошибиться — например, взять K первых элементов (это нарушит требование случайности) или взять каждый из элементов с вероятностью K/N (это нарушит требование взять ровно K элементов). Кроме того, можно реализовать и формально корректное, но крайне неэффективное решение «перемешать случайно все элементы и взять K первых». И всё становится ещё интереснее, если добавить условие того, что N — число очень большое (нам не хватит памяти сохранить все N элементов) и/или не известно заранее. Для примера представим себе, что у нас есть какой-то внешний сервис, присылающий нам элементы по одному. Мы не знаем сколько их придёт всего и не можем сохранить их все, но хотим в любой момент времени иметь набор из ровно K случайно выбранных элементов из уже полученных.

Алгоритм резервуарной выборки позволяет решить эту задачу за O(N) шагов и O(K) памяти. При этом не требуется знать N заранее, а условие случайности выборки ровно K элементов будет чётко соблюдено.
Читать дальше →
Всего голосов 41: ↑41 и ↓0+41
Комментарии20

(Законы Акина) законы космической инженерии

Время на прочтение3 мин
Количество просмотров39K
1. Инженерная разработка — это цифры. Анализ без цифр — это просто мнение.

2. Создание правильной ракеты занимает бесконечное количество времени. Поэтому следует создавать ракеты, в которых что-то неправильно.
Читать дальше →
Всего голосов 82: ↑76 и ↓6+70
Комментарии29

Datalore: открываем бета-версию приложения для анализа данных на Python

Время на прочтение3 мин
Количество просмотров26K
Привет, Хабр!

В рядах инструментов JetBrains пополнение. Мы запускаем открытую бета-версию Datalore — умной веб-среды для анализа и визуализации данных на языке Python.

Машинное обучение уверенно захватывает мир: алгоритмы интеллектуального анализа данных стоят за современными коммерческими разработками и исследованиями. Мы разработали приложение, с которым решать задачи машинного обучения легко и приятно: все необходимые инструменты data science доступны из коробки, а умный редактор кода на Python облегчает процесс анализа данных.


Читать дальше →
Всего голосов 80: ↑76 и ↓4+72
Комментарии34

Функторы (глава книги «Теория категорий для программистов»)

Время на прочтение17 мин
Количество просмотров31K

Это седьмая статья из цикла «Теория категорий для программистов». Предыдущие статьи уже публиковались на Хабре:



Функторы


За понятием функтора стоит очень простая, но мощная идея (как бы заезжено это ни прозвучало). Просто теория категорий полна простых и мощных идей. Функтор есть отображение между категориями. Пусть даны две категории C и D, а функтор F отображает объекты из C в объекты из D — это функция над объектами. Если a — это объект из C, то будем обозначать его образ из D как F a (без скобок). Но ведь категория — это не только объекты, но еще и соединяющие их морфизмы. Функтор также отображает и морфизмы — это функция над морфизмами. Но морфизмы отображаются не как попало, а так, чтобы сохранять связи. А именно, если морфизм f из C связывает объект a с объектом b,


f :: a -> b

то образ f в D, F f, связывает образ a с образом b:


F f :: F a -> F b

(Надеемся, что такая смесь математических обозначений и синтаксиса Haskell понятна читателю. Мы не будем писать скобки, применяя функторы к объектам или морфизмам.)


Читать дальше →
Всего голосов 33: ↑33 и ↓0+33
Комментарии2

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

Время на прочтение13 мин
Количество просмотров97K


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

Если вы не аудиофил и подбор аппаратуры не является для вас смыслом жизни, то самый простой путь — уверенно ориентироваться в технических характеристиках звукоусилительной аппаратуры и научиться извлекать полезную информацию между строк паспортов и инструкций, критически относясь к щедрым обещаниям. Если вы не ощущаете разницы между dB и dBm, номинальную мощность не отличаете от PMPO и желаете наконец узнать, что такое THD, также сможете найти интересное под катом.


Я надеюсь что материалы данной статьи будут полезны для понимания следующей, которая имеет намного более сложную тему — «Перекрёстные искажения и обратная связь, как один из их источников».
Нашли что-то интересное в содержании? Добро пожаловать под кат
Всего голосов 54: ↑54 и ↓0+54
Комментарии97

Зоопарк AFL фазеров

Время на прочтение12 мин
Количество просмотров17K
image

На Хабре уже пару раз появлялись статьи, поднимающие тему American Fuzzy Lop (AFL) (1,2). Но в данной статье речь пойдет не о классическом AFL, а о вспомогательных утилитах для него и его модификациях, которые, на наш взгляд, могут значительно улучшить качество фаззинга. Если вам интересно узнать, как можно прокачать AFL и искать быстрее и больше уязвимостей, то добро пожаловать под кат!
Читать дальше →
Всего голосов 32: ↑31 и ↓1+30
Комментарии7

Синхронность — это миф

Время на прочтение14 мин
Количество просмотров12K
Привет всем!

Сегодня вас ждет длинный текст без картинок (слегка сокращенный по сравнению с оригиналом), где подробно разобран тезис, вынесенный в заголовок. Ветеран компании Майкрософт Терри Кроули описывает суть асинхронного программирования и объясняет, почему именно этот подход гораздо реалистичнее и целесообразнее синхронного и последовательного.

Желающие или подумывающие написать книгу, затрагивающую подобные темы — пишите в личку.
Читать дальше →
Всего голосов 10: ↑9 и ↓1+8
Комментарии5

Время фрагментарно; немного о сходстве распределенных систем и слабой модели памяти

Время на прочтение9 мин
Количество просмотров5.2K
Привет всем!

Сегодня мы хотели бы в очередной раз затронуть тему одновременного и последовательного выполнения в различных программах, особенно — в распределенных системах. Еще в сентябре мы публиковали статью "Синхронность — это миф" на эту тему, а теперь публикуем перевод более серьезного исследования, которое, надеемся, поможет вам лучше сориентироваться с распределенными системами.
Читать дальше →
Всего голосов 9: ↑7 и ↓2+5
Комментарии10

Профилирование кода с LLVM

Время на прочтение7 мин
Количество просмотров7.1K

Проклятие недетерминизма



Моя первая попытка написать проход LLVM — люблю эти сегфолты

Недавно я столкнулся с интересной задачей — мне понадобился детерминированный и кросплатформенный способ определения времени выполнения кода С++. Под словом «детерминированный» я подразумеваю, что один и тот же код будет выполняться за одно и то же количество единиц времени. Под кроссплатформенностью я понимаю, что один и тот же код под Windows и под Ubuntu будет выполняться за одно и то же количество единиц времени.

Естественно, измерение времени на CPU не удовлетворяет этим условиям. Машинный код меняется в зависимости от архитектуры и операционной системы, и один и тот же код займёт различное количество времени при выполнении. Даже на одной и той же машине, такие факторы, как промахи кэша, будут играть большую роль — достаточную для того, чтобы исказить результаты измерения времени выполнения одного и того же кода. Мне нужно было что-либо более умное…
Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии20

11 лучших шрифтов для программирования

Время на прочтение3 мин
Количество просмотров264K
Много статей и сайтов сравнивают шрифты для программирования — всё это отличные ресурсы. Так зачем я опять поднимаю эту тему? Потому что сам всегда терялся в десятках шрифтов и не мог понять, какой лучше. Так что я опробовал много шрифтов и выбрал следующие для вас. Они довольно популярны и их легко получить. И самое главное, все эти шрифты бесплатны!

Я ранжировал шрифты по следующим показателям:

  • Насколько различимы схожие символы, такие как 0O, 1lI.
  • Легко ли читается шрифт (ширина строк, ширина/высота символов).
  • И мои личные предпочтения!

Все скриншоты сделаны в VSCode на одном фрагменте кода. Если не обозначено иное, то везде установлен размер "editor.fontSize": 14.
Читать дальше →
Всего голосов 56: ↑54 и ↓2+52
Комментарии117

Splay-деревья

Время на прочтение8 мин
Количество просмотров65K
Сбалансированное дерево поиска является фундаментом для многих современных алгоритмов. На страницах книг по Computer Science вы найдете описания красно-черных, AVL-, B- и многих других сбалансированных деревьев. Но является ли перманентная сбалансированность тем Святым Граалем, за которым следует гоняться?

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

Сегодня я расскажу о splay-деревьях. Эти деревья не являются перманентно сбалансированными и на отдельных запросах могут работать даже линейное время. Однако, после каждого запроса они меняют свою структуру, что позволяет очень эффективно обрабатывать часто повторяющиеся запросы. Более того, амортизационная стоимость обработки одного запроса у них , что делает splay-деревья хорошей альтернативой для перманентно сбалансированных собратьев.
Читать дальше...
Всего голосов 88: ↑83 и ↓5+78
Комментарии26
1

Информация

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